diff --git a/jOOQ-tools/.classpath b/jOOQ-tools/.classpath deleted file mode 100644 index 56307d52c7..0000000000 --- a/jOOQ-tools/.classpath +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/jOOQ-tools/.gitignore b/jOOQ-tools/.gitignore deleted file mode 100644 index b49acfe491..0000000000 --- a/jOOQ-tools/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/xtend-gen -/bin diff --git a/jOOQ-tools/.project b/jOOQ-tools/.project deleted file mode 100644 index 2a44f1e7ce..0000000000 --- a/jOOQ-tools/.project +++ /dev/null @@ -1,40 +0,0 @@ - - - jOOQ-tools - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.pde.ManifestBuilder - - - - - org.eclipse.pde.SchemaBuilder - - - - - org.eclipse.xtext.ui.shared.xtextBuilder - - - - - org.eclipse.xtend.shared.ui.xtendBuilder - - - - - - org.eclipse.pde.PluginNature - org.eclipse.jdt.core.javanature - org.eclipse.xtext.ui.shared.xtextNature - org.eclipse.xtend.shared.ui.xtendXPandNature - - diff --git a/jOOQ-tools/.settings/org.eclipse.core.resources.prefs b/jOOQ-tools/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 365bbd6097..0000000000 --- a/jOOQ-tools/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,5 +0,0 @@ -eclipse.preferences.version=1 -encoding//src/main/java=UTF-8 -encoding//src/main/resources=UTF-8 -encoding//src/test/java=UTF-8 -encoding/=UTF-8 diff --git a/jOOQ-tools/.settings/org.eclipse.core.runtime.prefs b/jOOQ-tools/.settings/org.eclipse.core.runtime.prefs deleted file mode 100644 index c522e1f4ae..0000000000 --- a/jOOQ-tools/.settings/org.eclipse.core.runtime.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -line.separator=\n diff --git a/jOOQ-tools/.settings/org.eclipse.jdt.core.prefs b/jOOQ-tools/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 1d48cf419d..0000000000 --- a/jOOQ-tools/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,382 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore -org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull -org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault -org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable -org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.6 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.doc.comment.support=enabled -org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.autoboxing=ignore -org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning -org.eclipse.jdt.core.compiler.problem.deadCode=warning -org.eclipse.jdt.core.compiler.problem.deprecation=warning -org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled -org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled -org.eclipse.jdt.core.compiler.problem.discouragedReference=warning -org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore -org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore -org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled -org.eclipse.jdt.core.compiler.problem.fieldHiding=warning -org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning -org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning -org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning -org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning -org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled -org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning -org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore -org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore -org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning -org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled -org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled -org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled -org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected -org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning -org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning -org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore -org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning -org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled -org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore -org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore -org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled -org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public -org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=all_standard_tags -org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore -org.eclipse.jdt.core.compiler.problem.missingJavadocTagsMethodTypeParameters=disabled -org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled -org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled -org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning -org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning -org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning -org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning -org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore -org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error -org.eclipse.jdt.core.compiler.problem.nullReference=error -org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error -org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning -org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning -org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore -org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning -org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning -org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore -org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning -org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning -org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning -org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore -org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning -org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore -org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore -org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled -org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning -org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled -org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled -org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore -org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning -org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled -org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning -org.eclipse.jdt.core.compiler.problem.unclosedCloseable=ignore -org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore -org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning -org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore -org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning -org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled -org.eclipse.jdt.core.compiler.problem.unusedImport=warning -org.eclipse.jdt.core.compiler.problem.unusedLabel=warning -org.eclipse.jdt.core.compiler.problem.unusedLocal=warning -org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore -org.eclipse.jdt.core.compiler.problem.unusedParameter=warning -org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled -org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled -org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled -org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning -org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning -org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning -org.eclipse.jdt.core.compiler.source=1.6 -org.eclipse.jdt.core.formatter.align_type_members_on_columns=true -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 -org.eclipse.jdt.core.formatter.alignment_for_assignment=0 -org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16 -org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 -org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 -org.eclipse.jdt.core.formatter.alignment_for_enum_constants=49 -org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 -org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 -org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 -org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 -org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 -org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 -org.eclipse.jdt.core.formatter.blank_lines_after_package=1 -org.eclipse.jdt.core.formatter.blank_lines_before_field=0 -org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 -org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 -org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 -org.eclipse.jdt.core.formatter.blank_lines_before_method=1 -org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 -org.eclipse.jdt.core.formatter.blank_lines_before_package=0 -org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 -org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 -org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line -org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=true -org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true -org.eclipse.jdt.core.formatter.comment.format_block_comments=true -org.eclipse.jdt.core.formatter.comment.format_header=false -org.eclipse.jdt.core.formatter.comment.format_html=true -org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true -org.eclipse.jdt.core.formatter.comment.format_line_comments=true -org.eclipse.jdt.core.formatter.comment.format_source_code=true -org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true -org.eclipse.jdt.core.formatter.comment.indent_root_tags=true -org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert -org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert -org.eclipse.jdt.core.formatter.comment.line_length=80 -org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true -org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true -org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false -org.eclipse.jdt.core.formatter.compact_else_if=true -org.eclipse.jdt.core.formatter.continuation_indentation=1 -org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=1 -org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off -org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on -org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false -org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true -org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true -org.eclipse.jdt.core.formatter.indent_empty_lines=false -org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true -org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true -org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true -org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true -org.eclipse.jdt.core.formatter.indentation.size=4 -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=insert -org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert -org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=insert -org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert -org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert -org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert -org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert -org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert -org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert -org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.join_lines_in_comments=true -org.eclipse.jdt.core.formatter.join_wrapped_lines=true -org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false -org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false -org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false -org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false -org.eclipse.jdt.core.formatter.lineSplit=120 -org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false -org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false -org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 -org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 -org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true -org.eclipse.jdt.core.formatter.tabulation.char=space -org.eclipse.jdt.core.formatter.tabulation.size=4 -org.eclipse.jdt.core.formatter.use_on_off_tags=false -org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false -org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true -org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true diff --git a/jOOQ-tools/.settings/org.eclipse.jdt.ui.prefs b/jOOQ-tools/.settings/org.eclipse.jdt.ui.prefs deleted file mode 100644 index e0c272bb40..0000000000 --- a/jOOQ-tools/.settings/org.eclipse.jdt.ui.prefs +++ /dev/null @@ -1,115 +0,0 @@ -cleanup.add_default_serial_version_id=false -cleanup.add_generated_serial_version_id=true -cleanup.add_missing_annotations=true -cleanup.add_missing_deprecated_annotations=true -cleanup.add_missing_methods=false -cleanup.add_missing_nls_tags=false -cleanup.add_missing_override_annotations=true -cleanup.add_missing_override_annotations_interface_methods=true -cleanup.add_serial_version_id=true -cleanup.always_use_blocks=true -cleanup.always_use_parentheses_in_expressions=false -cleanup.always_use_this_for_non_static_field_access=true -cleanup.always_use_this_for_non_static_method_access=false -cleanup.convert_to_enhanced_for_loop=false -cleanup.correct_indentation=true -cleanup.format_source_code=false -cleanup.format_source_code_changes_only=false -cleanup.make_local_variable_final=true -cleanup.make_parameters_final=false -cleanup.make_private_fields_final=true -cleanup.make_type_abstract_if_missing_method=false -cleanup.make_variable_declarations_final=false -cleanup.never_use_blocks=false -cleanup.never_use_parentheses_in_expressions=true -cleanup.organize_imports=true -cleanup.qualify_static_field_accesses_with_declaring_class=false -cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true -cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true -cleanup.qualify_static_member_accesses_with_declaring_class=true -cleanup.qualify_static_method_accesses_with_declaring_class=false -cleanup.remove_private_constructors=true -cleanup.remove_trailing_whitespaces=true -cleanup.remove_trailing_whitespaces_all=true -cleanup.remove_trailing_whitespaces_ignore_empty=false -cleanup.remove_unnecessary_casts=true -cleanup.remove_unnecessary_nls_tags=true -cleanup.remove_unused_imports=true -cleanup.remove_unused_local_variables=false -cleanup.remove_unused_private_fields=true -cleanup.remove_unused_private_members=false -cleanup.remove_unused_private_methods=true -cleanup.remove_unused_private_types=true -cleanup.sort_members=false -cleanup.sort_members_all=false -cleanup.use_blocks=true -cleanup.use_blocks_only_for_return_and_throw=false -cleanup.use_parentheses_in_expressions=false -cleanup.use_this_for_non_static_field_access=false -cleanup.use_this_for_non_static_field_access_only_if_necessary=false -cleanup.use_this_for_non_static_method_access=false -cleanup.use_this_for_non_static_method_access_only_if_necessary=true -cleanup_profile=_jOOQ -cleanup_settings_version=2 -eclipse.preferences.version=1 -editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true -formatter_profile=_jOOQ -formatter_settings_version=12 -org.eclipse.jdt.ui.ignorelowercasenames=true -org.eclipse.jdt.ui.importorder=java;javax;org.jooq;org;com; -org.eclipse.jdt.ui.javadoc=false -org.eclipse.jdt.ui.ondemandthreshold=99999 -org.eclipse.jdt.ui.staticondemandthreshold=99999 -org.eclipse.jdt.ui.text.custom_code_templates= -sp_cleanup.add_default_serial_version_id=true -sp_cleanup.add_generated_serial_version_id=false -sp_cleanup.add_missing_annotations=true -sp_cleanup.add_missing_deprecated_annotations=true -sp_cleanup.add_missing_methods=false -sp_cleanup.add_missing_nls_tags=false -sp_cleanup.add_missing_override_annotations=true -sp_cleanup.add_missing_override_annotations_interface_methods=true -sp_cleanup.add_serial_version_id=false -sp_cleanup.always_use_blocks=true -sp_cleanup.always_use_parentheses_in_expressions=false -sp_cleanup.always_use_this_for_non_static_field_access=false -sp_cleanup.always_use_this_for_non_static_method_access=false -sp_cleanup.convert_to_enhanced_for_loop=false -sp_cleanup.correct_indentation=false -sp_cleanup.format_source_code=false -sp_cleanup.format_source_code_changes_only=false -sp_cleanup.make_local_variable_final=false -sp_cleanup.make_parameters_final=false -sp_cleanup.make_private_fields_final=true -sp_cleanup.make_type_abstract_if_missing_method=false -sp_cleanup.make_variable_declarations_final=false -sp_cleanup.never_use_blocks=false -sp_cleanup.never_use_parentheses_in_expressions=true -sp_cleanup.on_save_use_additional_actions=true -sp_cleanup.organize_imports=true -sp_cleanup.qualify_static_field_accesses_with_declaring_class=false -sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true -sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true -sp_cleanup.qualify_static_member_accesses_with_declaring_class=false -sp_cleanup.qualify_static_method_accesses_with_declaring_class=false -sp_cleanup.remove_private_constructors=true -sp_cleanup.remove_trailing_whitespaces=true -sp_cleanup.remove_trailing_whitespaces_all=true -sp_cleanup.remove_trailing_whitespaces_ignore_empty=false -sp_cleanup.remove_unnecessary_casts=true -sp_cleanup.remove_unnecessary_nls_tags=false -sp_cleanup.remove_unused_imports=true -sp_cleanup.remove_unused_local_variables=false -sp_cleanup.remove_unused_private_fields=true -sp_cleanup.remove_unused_private_members=false -sp_cleanup.remove_unused_private_methods=true -sp_cleanup.remove_unused_private_types=true -sp_cleanup.sort_members=false -sp_cleanup.sort_members_all=false -sp_cleanup.use_blocks=false -sp_cleanup.use_blocks_only_for_return_and_throw=false -sp_cleanup.use_parentheses_in_expressions=false -sp_cleanup.use_this_for_non_static_field_access=false -sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true -sp_cleanup.use_this_for_non_static_method_access=false -sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true diff --git a/jOOQ-tools/.settings/org.eclipse.m2e.core.prefs b/jOOQ-tools/.settings/org.eclipse.m2e.core.prefs deleted file mode 100644 index 14b697b7bb..0000000000 --- a/jOOQ-tools/.settings/org.eclipse.m2e.core.prefs +++ /dev/null @@ -1,4 +0,0 @@ -activeProfiles= -eclipse.preferences.version=1 -resolveWorkspaceProjects=true -version=1 diff --git a/jOOQ-tools/.settings/org.maven.ide.eclipse.prefs b/jOOQ-tools/.settings/org.maven.ide.eclipse.prefs deleted file mode 100644 index c5172a20ac..0000000000 --- a/jOOQ-tools/.settings/org.maven.ide.eclipse.prefs +++ /dev/null @@ -1,8 +0,0 @@ -#Sun Apr 10 10:03:42 CEST 2011 -activeProfiles= -eclipse.preferences.version=1 -fullBuildGoals=process-test-resources -resolveWorkspaceProjects=true -resourceFilterGoals=process-resources resources\:testResources -skipCompilerPlugin=true -version=1 diff --git a/jOOQ-tools/LICENSE.txt b/jOOQ-tools/LICENSE.txt deleted file mode 100644 index 03b0953bc3..0000000000 --- a/jOOQ-tools/LICENSE.txt +++ /dev/null @@ -1,38 +0,0 @@ -Copyright (c) 2009-2013, Data Geekery GmbH (http://www.datageekery.com) -All rights reserved. - -This work is dual-licensed -- under the Apache Software License 2.0 (the "ASL") -- under the jOOQ License and Maintenance Agreement (the "jOOQ License") -============================================================================= -You may choose which license applies to you: - -- If you're using this work with Open Source databases, you may choose - either ASL or jOOQ License. -- If you're using this work with at least one commercial database, you must - choose jOOQ License - -For more information, please visit http://www.jooq.org/licenses - -Apache Software License 2.0: ------------------------------------------------------------------------------ -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -jOOQ License and Maintenance Agreement: ------------------------------------------------------------------------------ -Data Geekery grants the Customer the non-exclusive, timely limited and -non-transferable license to install and use the Software under the terms of -the jOOQ License and Maintenance Agreement. - -This library is distributed with a LIMITED WARRANTY. See the jOOQ License -and Maintenance Agreement for more details: http://www.jooq.org/licensing diff --git a/jOOQ-tools/META-INF/MANIFEST.MF b/jOOQ-tools/META-INF/MANIFEST.MF deleted file mode 100644 index e72557888b..0000000000 --- a/jOOQ-tools/META-INF/MANIFEST.MF +++ /dev/null @@ -1,10 +0,0 @@ -Manifest-Version: 1.0 -Bundle-ManifestVersion: 2 -Bundle-Name: Xtend Tutorial -Bundle-SymbolicName: jOOQ-tools -Bundle-Version: 2.3.0.qualifier -Bundle-Vendor: Eclipse Tools Project -Require-Bundle: org.eclipse.xtext.xbase.lib;bundle-version="2.3.0", - org.eclipse.xtend.lib;bundle-version="2.3.0", - org.junit4 -Bundle-RequiredExecutionEnvironment: J2SE-1.5 diff --git a/jOOQ-tools/build.properties b/jOOQ-tools/build.properties deleted file mode 100644 index d6c49e5cf1..0000000000 --- a/jOOQ-tools/build.properties +++ /dev/null @@ -1,5 +0,0 @@ -source.. = src/,\ - xtend-gen/ -output.. = bin/ -bin.includes = META-INF/,\ - . diff --git a/jOOQ-tools/src/org/jooq/api/rr/BNFGenerator.java b/jOOQ-tools/src/org/jooq/api/rr/BNFGenerator.java deleted file mode 100644 index 9e457d0b1d..0000000000 --- a/jOOQ-tools/src/org/jooq/api/rr/BNFGenerator.java +++ /dev/null @@ -1,763 +0,0 @@ -/** - * Copyright (c) 2009-2013, Data Geekery GmbH (http://www.datageekery.com) - * All rights reserved. - * - * This work is dual-licensed - * - under the Apache Software License 2.0 (the "ASL") - * - under the jOOQ License and Maintenance Agreement (the "jOOQ License") - * ============================================================================= - * You may choose which license applies to you: - * - * - If you're using this work with Open Source databases, you may choose - * either ASL or jOOQ License. - * - If you're using this work with at least one commercial database, you must - * choose jOOQ License - * - * For more information, please visit http://www.jooq.org/licenses - * - * Apache Software License 2.0: - * ----------------------------------------------------------------------------- - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * jOOQ License and Maintenance Agreement: - * ----------------------------------------------------------------------------- - * Data Geekery grants the Customer the non-exclusive, timely limited and - * non-transferable license to install and use the Software under the terms of - * the jOOQ License and Maintenance Agreement. - * - * This library is distributed with a LIMITED WARRANTY. See the jOOQ License - * and Maintenance Agreement for more details: http://www.jooq.org/licensing - */ -package org.jooq.api.rr; - -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import java.util.TreeSet; - -import org.jooq.api.annotation.State; -import org.jooq.api.annotation.Transition; -import org.jooq.impl.DSL; -import org.jooq.tools.StringUtils; - - -/** - * A parser for org.jooq.api.annotation annotations, generating a - * BNF notation of the jOOQ API. - * - * @author Lukas Eder - */ -public class BNFGenerator { - - static Map> edgesFrom = new LinkedHashMap>(); - static Map> edgesTo = new LinkedHashMap>(); - static Map> edges = new LinkedHashMap>(); - static Set> visited = new LinkedHashSet>(); - static Set terminals = new LinkedHashSet(); - - public static void main(String[] args) throws Exception { - resolve(DSL.class); - resolveStates(); - - grammar("before substituting"); - substitute(); - grammar("after substituting"); - - System.out.println(); - System.out.println(); - - for (String terminal : terminals) { - if (!edgesTo.containsKey(terminal)) { - System.err.println("Terminal is not contained in grammar: " + terminal); - } - } - - for (String name : edgesTo.keySet()) { - if (!terminals.contains(name)) { - System.err.println("Rule for a non-terminal in grammar: " + name); - } - } - } - - private static void grammar(String comment) { - System.out.println(); - System.out.println(); - System.out.println(); - - String s = "Grammar: (" + comment + ")"; - System.out.println(s); - System.out.println(StringUtils.rightPad("", s.length(), "-")); - - for (Entry> entry : edgesTo.entrySet()) { - System.out.println(string(entry.getValue())); - } - } - - private static String string(Edge... e) { - return string(Arrays.asList(e)); - } - - private static String string(Collection e) { - return string(e, true); - } - - private static String string(Collection e, boolean collect) { - StringBuilder sb = new StringBuilder(); - String previous = ""; - String separator = ""; - - for (Edge edge : e) { - if (!edge.path.to.equals(previous) || !collect) { - if (sb.length() > 0) { - sb.append(";\n"); - } - - sb.append(edge.path.to); - sb.append(" ::= "); - - previous = edge.path.to; - separator = ""; - } - - sb.append(separator); - sb.append(edge); - - separator = " | "; - } - - sb.append(";"); - return sb.toString(); - } - - private static void substitute() { - // Remove all states that appear exactly once as from and once as to - - pruneLoop: - while (true) { - - // Some debugging.... - String check = "WindowPartitionByStep"; - Set e = edgesTo.get(check); - if (e != null) { - System.err.println(); - System.err.println(); - System.err.println(); - System.err.println(string(e, false)); - System.err.println(string(edgesFrom.get(check), false)); - System.err.println(); - System.err.println(); - System.err.println(); - } - - // Alternatives with equal paths are substituted - // A ::= B x | B y; => A ::= B ( x | y ); - // ----------------------------------------------------------------- - for (Path path : new ArrayList(edges.keySet())) { - Set set = edges.get(path); - - if (set.size() > 1) { - List list = new ArrayList(set); - List expr = new ArrayList(); - - for (Edge edge : list) { - expr.add(edge.expr); - } - - Edge substitute = new Edge( - list.get(0).path, - new Choice(expr.toArray(new Expr[0])) - ); - - for (Edge edge : list) { - remove(edge); - } - - edge(substitute); - - System.out.println(); - System.out.println("Substituted Choice: ( A ::= B x | B y; => A ::= B ( x | y ); )"); - System.out.println("--------------------------------------------------------------"); - System.out.println(string(list, false)); - System.out.println(" -> "); - System.out.println(string(substitute)); - continue pruneLoop; - } - } - - // Alternatives with equal expressions are substituted - // A ::= X a | Y a; B ::= A b; => A ::= X | Y; B ::= A a b; - // ----------------------------------------------------------------- - factoringLoop: - for (String name : new ArrayList(edgesTo.keySet())) { - if (terminals.contains(name)) { - continue factoringLoop; - } - - Set set = edgesTo.get(name); - Set expressions = new HashSet(); - - if (set.size() > 1) { - for (Edge edge : set) { - expressions.add(edge.expr); - } - - if (expressions.size() == 1) { - Expr expr = expressions.iterator().next(); - - if (expr.toString().length() > 0) { - List list = new ArrayList(set); - List before = new ArrayList(edgesFrom.get(name)); - - for (Edge edge : list) { - remove(edge); - edge(new Edge(edge.path)); - } - - for (Edge edge : before) { - remove(edge); - edge(new Edge(edge.path, new Sequence(expr, edge.expr))); - } - - System.out.println(); - System.out.println("Factored out Expression: ( A ::= X a | Y a; B ::= A b; => A ::= X | Y; B ::= A a b; )"); - System.out.println("-------------------------------------------------------------------------------------"); - System.out.println(string(list, false)); - System.out.println(string(before, false)); - System.out.println(" -> "); - System.out.println(string(edgesTo.get(name), false)); - System.out.println(string(edgesFrom.get(name), false)); - } - } - } - } - - // Sequences are substituted (only if B consumed exactly once) - // A ::= B x; B ::= C y; => A ::= C y x; - // ----------------------------------------------------------------- - for (int maxSize : new int[] { 1, Integer.MAX_VALUE }) - substitutionLoop: - for (String name : new ArrayList(edgesFrom.keySet())) { - if (terminals.contains(name)) { - continue substitutionLoop; - } - - if (edgesFrom.get(name).size() == 1) { - Edge from = edgesFrom.get(name).iterator().next(); - Set set = edgesTo.get(name); - - if (set != null) { - if (set.size() > maxSize) { - continue substitutionLoop; - } - - if (set.size() > 1) { - if (!"".equals(from.expr.toString())) { - continue substitutionLoop; - } - else { - System.out.println(); - System.out.println(); - System.out.println("Substituting multi-sequence"); - System.out.println(string(from)); - System.out.println("..."); - System.out.println(string(set)); - } - } - - List list = new ArrayList(set); - List substitutes = new ArrayList(); - - remove(from); - - for (Edge to : list) { - remove(to); - - Edge substitute = new Edge( - new Path(to.path.from, from.path.to), - new Sequence(to.expr, from.expr) - ); - - edge(substitute); - substitutes.add(substitute); - } - - System.out.println(); - System.out.println("Substituted Sequence: ( A ::= B x; B ::= C y; => A ::= C y x; )"); - System.out.println("---------------------------------------------------------------"); - System.out.println(string(list, false)); - System.out.println(string(from)); - System.out.println(" -> "); - System.out.println(string(substitutes, false)); - continue pruneLoop; - } - } - } - - break pruneLoop; - } - } - - private static void resolveStates() { - for (Class type : visited) { - State state = type.getAnnotation(State.class); - - if (state != null) { - String stateName = state.name(); - if ("".equals(stateName)) { - stateName = type.getSimpleName(); - } - - // Collect terminals and add edges from states to their aliases - // ------------------------------------------------------------- - if (notEmpty(state.aliases())) { - for (String alias : state.aliases()) { - edge(new Edge(new Path(alias, stateName))); - - if (state.terminal()) { - terminals.add(alias); - } - } - } - - if (state.terminal()) { - terminals.add(stateName); - } - - // Add edges from states to their super states - // ------------------------------------------------------------- - for (Class superType : type.getInterfaces()) { - State superState = superType.getAnnotation(State.class); - - if (superState != null) { - String superStateName = superState.name(); - if ("".equals(superStateName)) { - superStateName = superType.getSimpleName(); - } - - edge(new Edge(new Path(stateName, superStateName))); - } - } - } - } - } - - private static boolean notEmpty(String[] array) { - return array != null - && array.length > 0 - && array[0] != null - && array[0].length() > 0; - } - - private static void resolve(Class type) { - if (!visited.contains(type)) { - visited.add(type); - - for (Class i : type.getInterfaces()) { - resolve(i); - } - - resolve(type.getDeclaredMethods()); - } - } - - private static void resolve(Method[] methods) { - for (Method method : methods) { - Transition transition = method.getAnnotation(Transition.class); - - if (transition != null) { - Class declaringClass = method.getDeclaringClass(); - Class returnType = method.getReturnType(); - - // From state - // ------------------------------------------------------------- - String from = transition.from(); - if ("".equals(from)) { - State fromState = declaringClass.getAnnotation(State.class); - - if (fromState == null) { - System.err.println("No State defined on " + declaringClass.getName()); - } - else { - from = fromState.name(); - } - } - - if ("".equals(from)) { - from = declaringClass.getSimpleName(); - } - - // To state - // ------------------------------------------------------------- - String to = transition.to(); - if ("".equals(to)) { - State toState = returnType.getAnnotation(State.class); - - if (toState == null) { - System.err.println("No State defined on " + returnType.getName()); - } - else { - to = toState.name(); - } - } - - if ("".equals(to)) { - to = returnType.getSimpleName(); - } - - // Transition name - // ------------------------------------------------------------- - String name = transition.name(); - if ("".equals(name)) { - name = method.getName(); - } - - // Transition arguments - // ------------------------------------------------------------- - String[] args = transition.args(); - - // Calculation - // ------------------------------------------------------------- - edge(new Edge(new Path(from, to), new Args(name, args))); - resolve(returnType); - } - } - } - - private static void remove(Edge edge) { - remove(edge, edges, edge.path); - remove(edge, edgesFrom, edge.path.from); - remove(edge, edgesTo, edge.path.to); - } - - private static void remove(Edge edge, Map> map, K key) { - Set set = map.get(key); - - if (set != null) { - set.remove(edge); - - if (set.isEmpty()) { - map.remove(key); - } - } - } - - private static void edge(Edge edge) { - edge(edge, edges, edge.path); - edge(edge, edgesFrom, edge.path.from); - edge(edge, edgesTo, edge.path.to); - } - - private static void edge(Edge edge, Map> map, K key) { - Set set = map.get(key); - - if (set == null) { - set = new TreeSet(); - map.put(key, set); - } - - set.add(edge); - } - - private static class Path implements Comparable { - final String from; - final String to; - - Path(String from, String to) { - this.from = from; - this.to = to; - } - - @Override - public int compareTo(Path o) { - int result = 0; - - if (to != null) { - result = to.compareTo(o.to); - if (result != 0) - return result; - } - - if (from != null) { - result = from.compareTo(o.from); - if (result != 0) - return result; - } - - return result; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((from == null) ? 0 : from.hashCode()); - result = prime * result + ((to == null) ? 0 : to.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - Path other = (Path) obj; - if (from == null) { - if (other.from != null) - return false; - } else if (!from.equals(other.from)) - return false; - if (to == null) { - if (other.to != null) - return false; - } else if (!to.equals(other.to)) - return false; - return true; - } - - @Override - public String toString() { - return from + " -> " + to; - } - } - - private static class Args extends Expr { - final String name; - final String[] args; - - Args(String name, String[] args) { - this.name = name; - this.args = args; - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - - if (!"".equals(name)) { - sb.append("'"); - sb.append(name); - sb.append("'"); - } - - if (notEmpty(args)) { - sb.append(" "); - - String separator = ""; - for (String arg : args) { - sb.append(separator); - - if (arg.endsWith("+")) { - String sub = arg.substring(0, arg.length() - 1); - sb.append(sub); - sb.append(" { ',' "); - sb.append(sub); - sb.append(" }"); - } - else { - sb.append(arg); - } - - separator = " ',' "; - } - } - - return sb.toString(); - } - } - - private static class Choice extends Expr { - final Expr[] expr; - - Choice(Expr... expr) { - this.expr = expr; - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - - boolean optional = false; - boolean any = false; - - if (expr.length > 1) - sb.append("( "); - - String separator = ""; - for (Expr e : expr) { - String s = e.toString(); - - if ("".equals(s)) { - optional = true; - continue; - } - - any = true; - - sb.append(separator); - sb.append(e); - - separator = " | "; - } - - if (expr.length > 1) - sb.append(" )"); - - if (optional) - sb.append(" ?"); - - return any ? sb.toString() : ""; - } - } - - private static class Sequence extends Expr { - final Expr[] expr; - - Sequence(Expr... expr) { - this.expr = expr; - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - - String separator = ""; - for (Expr e : expr) { - String s = e.toString(); - - if (s.length() > 0) { - sb.append(separator); - sb.append(e); - - separator = " "; - } - } - - return sb.toString(); - } - } - - private static abstract class Expr implements Comparable { - - @Override - public final int compareTo(Expr o) { - return toString().compareTo(o.toString()); - } - - @Override - public final int hashCode() { - return toString().hashCode(); - } - - @Override - public final boolean equals(Object obj) { - return toString().equals(obj.toString()); - } - } - - private static class Edge implements Comparable { - - final Path path; - final Expr expr; - - Edge(Path path) { - this(path, new Sequence()); - } - - Edge(Path path, Expr expr) { - this.path = path; - this.expr = expr; - } - - @Override - public int compareTo(Edge o) { - int result = 0; - - if (path != null) { - result = path.compareTo(o.path); - if (result != 0) - return result; - } - - if (expr != null) { - result = expr.compareTo(o.expr); - if (result != 0) - return result; - } - - return result; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((expr == null) ? 0 : expr.hashCode()); - result = prime * result + ((path == null) ? 0 : path.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - Edge other = (Edge) obj; - if (expr == null) { - if (other.expr != null) - return false; - } else if (!expr.equals(other.expr)) - return false; - if (path == null) { - if (other.path != null) - return false; - } else if (!path.equals(other.path)) - return false; - return true; - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - - String s1 = ""; - String s2 = ""; - - if (path.from != null && !"DSL".equals(path.from)) { - s1 = path.from; - } - - s2 = expr.toString(); - - sb.append(s1); - if (!s1.isEmpty() && !s2.isEmpty()) - sb.append(" "); - sb.append(s2); - - return sb.toString(); - } - } -} diff --git a/jOOQ-tools/src/org/jooq/docs/Functions.xtend b/jOOQ-tools/src/org/jooq/docs/Functions.xtend deleted file mode 100644 index e183d50d28..0000000000 --- a/jOOQ-tools/src/org/jooq/docs/Functions.xtend +++ /dev/null @@ -1,216 +0,0 @@ -/** - * Copyright (c) 2009-2013, Data Geekery GmbH (http://www.datageekery.com) - * All rights reserved. - * - * This work is dual-licensed - * - under the Apache Software License 2.0 (the "ASL") - * - under the jOOQ License and Maintenance Agreement (the "jOOQ License") - * ============================================================================= - * You may choose which license applies to you: - * - * - If you're using this work with Open Source databases, you may choose - * either ASL or jOOQ License. - * - If you're using this work with at least one commercial database, you must - * choose jOOQ License - * - * For more information, please visit http://www.jooq.org/licenses - * - * Apache Software License 2.0: - * ----------------------------------------------------------------------------- - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * jOOQ License and Maintenance Agreement: - * ----------------------------------------------------------------------------- - * Data Geekery grants the Customer the non-exclusive, timely limited and - * non-transferable license to install and use the Software under the terms of - * the jOOQ License and Maintenance Agreement. - * - * This library is distributed with a LIMITED WARRANTY. See the jOOQ License - * and Maintenance Agreement for more details: http://www.jooq.org/licensing - */ -package org.jooq.docs - -import java.lang.reflect.Method -import java.util.EnumSet -import org.jooq.Field -import org.jooq.QueryPart -import org.jooq.SQLDialect -import org.jooq.Support -import org.jooq.conf.RenderNameStyle -import org.jooq.conf.Settings -import org.jooq.impl.DSL - -import org.jooq.conf.StatementType -import java.sql.Date -import java.sql.Timestamp - -class Functions { - static Field numberB = DSL::fieldByName(typeof(Byte), "number"); - static Field number = DSL::fieldByName(typeof(Integer), "number"); - static Field start = DSL::fieldByName(typeof(Integer), "start"); - static Field length = DSL::fieldByName(typeof(Integer), "length"); - static Field string = DSL::fieldByName(typeof(String), "string"); - static Field search = DSL::fieldByName(typeof(String), "search"); - static Field replace = DSL::fieldByName(typeof(String), "replace"); - static Field date = DSL::fieldByName(typeof(Date), "date"); - static Field timestamp = DSL::fieldByName(typeof(Timestamp), "timestamp"); - static Field expression = DSL::fieldByName(typeof(String), "expression"); - static Field e1 = DSL::fieldByName(typeof(String), "expr1"); - static Field e2 = DSL::fieldByName(typeof(String), "expr2"); - static Field e3 = DSL::fieldByName(typeof(String), "expr3"); - static Field e4 = DSL::fieldByName(typeof(String), "expr4"); - - - - def static EnumSet families() { - return families(SQLDialect::values()); - } - - def static EnumSet families(SQLDialect[] dialects) { - if (dialects == null || dialects.length == 0) - return families; - - val result = EnumSet::noneOf(typeof(SQLDialect)); - - for (SQLDialect d : dialects) { - if (d != SQLDialect.SQL99) - result.add(d.family()); - } - - return result; - } - - def static void main(String[] args) { - System::out.println(''' - - «heading("Math functions")» - «expr("Arc sine function", DSL::asin(number), typeof(DSL).getMethod("asin", typeof(Field)))» - «expr("Arc cosine function", DSL::acos(number), typeof(DSL).getMethod("acos", typeof(Field)))» - «expr("Arc tangent function", DSL::atan(number), typeof(DSL).getMethod("atan", typeof(Field)))» - «expr("Arc tangent 2 function", DSL::atan2(number, number), typeof(DSL).getMethod("atan2", typeof(Field), typeof(Field)))» - «expr("Sine function", DSL::sin(number), typeof(DSL).getMethod("sin", typeof(Field)))» - «expr("Cosine function", DSL::cos(number), typeof(DSL).getMethod("cos", typeof(Field)))» - «expr("Tangent function", DSL::tan(number), typeof(DSL).getMethod("tan", typeof(Field)))» - «expr("Cotangent function", DSL::cot(number), typeof(DSL).getMethod("cot", typeof(Field)))» - «expr("Hyperbolic sine function", DSL::sinh(number), typeof(DSL).getMethod("sinh", typeof(Field)))» - «expr("Hyperbolic cosine function", DSL::cosh(number), typeof(DSL).getMethod("cosh", typeof(Field)))» - «expr("Hyperbolic tangent function", DSL::tanh(number), typeof(DSL).getMethod("tanh", typeof(Field)))» - «expr("Hyperbolic cotangent function", DSL::coth(number), typeof(DSL).getMethod("coth", typeof(Field)))» - - «expr("Absolute function", DSL::abs(number), typeof(DSL).getMethod("abs", typeof(Field)))» - «expr("Round function", DSL::round(number, 2), typeof(DSL).getMethod("round", typeof(Field), typeof(int)))» - «expr("Trunc function", DSL::trunc(number, 2), typeof(DSL).getMethod("trunc", typeof(Field), typeof(int)))» - «expr("Floor function", DSL::floor(number), typeof(DSL).getMethod("floor", typeof(Field)))» - «expr("Ceiling function", DSL::ceil(number), typeof(DSL).getMethod("ceil", typeof(Field)))» - «expr("Sign function", DSL::sign(number), typeof(DSL).getMethod("sign", typeof(Field)))» - - «expr("Exponential function", DSL::exp(number), typeof(DSL).getMethod("exp", typeof(Field)))» - «expr("Ln function", DSL::ln(number), typeof(DSL).getMethod("ln", typeof(Field)))» - «expr("Log function", DSL::log(number, 2), typeof(DSL).getMethod("log", typeof(Field), typeof(int)))» - «expr("Power function", DSL::power(number, number), typeof(DSL).getMethod("power", typeof(Field), typeof(Field)))» - «expr("Square root function", DSL::sqrt(number), typeof(DSL).getMethod("sqrt", typeof(Field)))» - - «expr("Random function", DSL::rand(), typeof(DSL).getMethod("rand"))» - «expr("Radians to degrees conversion", DSL::deg(number), typeof(DSL).getMethod("deg", typeof(Field)))» - «expr("Degrees to radians conversion", DSL::rad(number), typeof(DSL).getMethod("rad", typeof(Field)))» - «expr("Euler constant", DSL::e(), typeof(DSL).getMethod("e"))» - «expr("Pi constant", DSL::pi(), typeof(DSL).getMethod("pi"))» - - «heading("Bit functions")» - «expr("Bit count function", DSL::bitCount(numberB), typeof(DSL).getMethod("bitCount", typeof(Field)))» - «expr("Bit length function", DSL::bitLength(string), typeof(DSL).getMethod("bitLength", typeof(Field)))» - «expr("Bit AND operation", DSL::bitAnd(number, number), typeof(DSL).getMethod("bitAnd", typeof(Field), typeof(Field)))» - «expr("Bit NAND operation", DSL::bitNand(number, number), typeof(DSL).getMethod("bitNand", typeof(Field), typeof(Field)))» - «expr("Bit NOR operation", DSL::bitNor(number, number), typeof(DSL).getMethod("bitNor", typeof(Field), typeof(Field)))» - «expr("Bit NOT a value", DSL::bitNot(number), typeof(DSL).getMethod("bitNot", typeof(Field)))» - «expr("Bit OR operation", DSL::bitOr(number, number), typeof(DSL).getMethod("bitOr", typeof(Field), typeof(Field)))» - «expr("Bit XNOR operation", DSL::bitXNor(number, number), typeof(DSL).getMethod("bitXNor", typeof(Field), typeof(Field)))» - «expr("Bit XOR operation", DSL::bitXor(number, number), typeof(DSL).getMethod("bitXor", typeof(Field), typeof(Field)))» - «expr("Bitwise left shift", DSL::shl(number, number), typeof(DSL).getMethod("shl", typeof(Field), typeof(Field)))» - «expr("Bitwise right shift", DSL::shr(number, number), typeof(DSL).getMethod("shr", typeof(Field), typeof(Field)))» - - «heading("String functions")» - «expr("Char length function", DSL::charLength(string), typeof(DSL).getMethod("charLength", typeof(Field)))» - «expr("Length function", DSL::length(string), typeof(DSL).getMethod("length", typeof(Field)))» - «expr("Octet length function", DSL::octetLength(string), typeof(DSL).getMethod("octetLength", typeof(Field)))» - «expr("Ascii function", DSL::ascii(string), typeof(DSL).getMethod("ascii", typeof(Field)))» - «expr("Concat function", DSL::concat(string, string), typeof(DSL).getMethod("concat", typeof(Field[])))» - «expr("Lower function", DSL::lower(string), typeof(DSL).getMethod("lower", typeof(Field)))» - «expr("Upper function", DSL::upper(string), typeof(DSL).getMethod("upper", typeof(Field)))» - «expr("Lpad function", DSL::lpad(string, number, string), typeof(DSL).getMethod("lpad", typeof(Field), typeof(Field), typeof(Field)))» - «expr("Rpad function", DSL::rpad(string, number, string), typeof(DSL).getMethod("rpad", typeof(Field), typeof(Field), typeof(Field)))» - «expr("Trim function", DSL::trim(string), typeof(DSL).getMethod("trim", typeof(Field)))» - «expr("Ltrim function", DSL::ltrim(string), typeof(DSL).getMethod("ltrim", typeof(Field)))» - «expr("Rtrim function", DSL::rtrim(string), typeof(DSL).getMethod("rtrim", typeof(Field)))» - «expr("Position function", DSL::position(string, search), typeof(DSL).getMethod("position", typeof(Field), typeof(Field)))» - «expr("Repeat function", DSL::repeat(string, number), typeof(DSL).getMethod("repeat", typeof(Field), typeof(Field)))» - «expr("Replace function", DSL::replace(string, search, replace), typeof(DSL).getMethod("replace", typeof(Field), typeof(Field), typeof(Field)))» - «expr("Substring function", DSL::substring(string, start, length), typeof(DSL).getMethod("substring", typeof(Field), typeof(Field), typeof(Field)))» - - «heading("Date and time functions")» - «expr("Date add function", DSL::dateAdd(date, number), typeof(DSL).getMethod("dateAdd", typeof(Field), typeof(Field)))» - «expr("Date diff function", DSL::dateDiff(date, date), typeof(DSL).getMethod("dateDiff", typeof(Field), typeof(Field)))» - «expr("Timestamp add function", DSL::timestampAdd(timestamp, number), typeof(DSL).getMethod("timestampAdd", typeof(Field), typeof(Field)))» - «expr("Timestamp diff function", DSL::timestampDiff(timestamp, timestamp), typeof(DSL).getMethod("timestampDiff", typeof(Field), typeof(Field)))» - «expr("Extract the year from a date", DSL::year(date), typeof(DSL).getMethod("year", typeof(Field)))» - «expr("Extract the month from a date", DSL::month(date), typeof(DSL).getMethod("month", typeof(Field)))» - «expr("Extract the day from a date", DSL::day(date), typeof(DSL).getMethod("day", typeof(Field)))» - «expr("Extract the hour from a date", DSL::hour(date), typeof(DSL).getMethod("hour", typeof(Field)))» - «expr("Extract the minute from a date", DSL::minute(date), typeof(DSL).getMethod("minute", typeof(Field)))» - «expr("Extract the second from a date", DSL::second(date), typeof(DSL).getMethod("second", typeof(Field)))» - - «heading("Other functions")» - «expr("Coalesce function", DSL::coalesce(e1, e2), typeof(DSL).getMethod("coalesce", typeof(Field), typeof(Field[])))» - «expr("Decode function", DSL::decode(e1, e2, e3, e4), typeof(DSL).getMethod("decode", typeof(Field), typeof(Field), typeof(Field), typeof(Field[])))» - «expr("Greatest function", DSL::greatest(e1, e2, e3), typeof(DSL).getMethod("greatest", typeof(Field), typeof(Field[])))» - «expr("Least function", DSL::least(e1, e2, e3), typeof(DSL).getMethod("least", typeof(Field), typeof(Field[])))» - «expr("Null if function", DSL::nullif(e1, e2), typeof(DSL).getMethod("nullif", typeof(Field), typeof(Field)))» - «expr("Nvl function", DSL::nvl(e1, e2), typeof(DSL).getMethod("nvl", typeof(Field), typeof(Field)))» - «expr("Nvl2 function", DSL::nvl2(e1, e2, e3), typeof(DSL).getMethod("nvl2", typeof(Field), typeof(Field), typeof(Field)))» -
- '''); - } - - def static heading(String description) { - return ''' - - -

«description»

- - - - Function description - «FOR d : families» - «d.name» - «ENDFOR» - - ''' - } - - def static expr(String description, QueryPart p, Method method) { - val support = method.getAnnotation(typeof(Support)); - return ''' - - «description» - «FOR d : families» - «IF families(support.value).contains(d)»
«DSL::using(d, new Settings()
-                    .withRenderSchema(false)
-                    .withRenderNameStyle(RenderNameStyle.AS_IS)
-                    .withStatementType(StatementType.STATIC_STATEMENT)
-                ).render(p)»
«ELSE» Â«ENDIF» - «ENDFOR» - - ''' - } -} - diff --git a/jOOQ-tools/src/org/jooq/oss/Splitter.xtend b/jOOQ-tools/src/org/jooq/oss/Splitter.xtend deleted file mode 100644 index 3fb904bfeb..0000000000 --- a/jOOQ-tools/src/org/jooq/oss/Splitter.xtend +++ /dev/null @@ -1,251 +0,0 @@ -/** - * Copyright (c) 2009-2013, Data Geekery GmbH (http://www.datageekery.com) - * All rights reserved. - * - * This work is dual-licensed - * - under the Apache Software License 2.0 (the "ASL") - * - under the jOOQ License and Maintenance Agreement (the "jOOQ License") - * ============================================================================= - * You may choose which license applies to you: - * - * - If you're using this work with Open Source databases, you may choose - * either ASL or jOOQ License. - * - If you're using this work with at least one commercial database, you must - * choose jOOQ License - * - * For more information, please visit http://www.jooq.org/licenses - * - * Apache Software License 2.0: - * ----------------------------------------------------------------------------- - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * jOOQ License and Maintenance Agreement: - * ----------------------------------------------------------------------------- - * Data Geekery grants the Customer the non-exclusive, timely limited and - * non-transferable license to install and use the Software under the terms of - * the jOOQ License and Maintenance Agreement. - * - * This library is distributed with a LIMITED WARRANTY. See the jOOQ License - * and Maintenance Agreement for more details: http://www.jooq.org/licensing - */ -package org.jooq.oss - -import static java.util.regex.Pattern.*; - -import java.io.File -import java.util.ArrayList -import java.util.regex.Pattern -import org.apache.commons.lang3.tuple.ImmutablePair -import org.jooq.SQLDialect -import org.jooq.xtend.Generators -import java.util.concurrent.ExecutorService -import java.util.concurrent.Executors - -class RemoveProCode { - def static void main(String[] args) { - Splitter::split("pro", "/../workspace-jooq-oss"); - } -} - -class RemoveTrialCode { - def static void main(String[] args) { - Splitter::split("trial", "/../workspace-jooq-pro"); - } -} - -class Splitter extends Generators { - - static ExecutorService ex; - String token; - - def static void split(String token, String workspace) { - ex = Executors::newFixedThreadPool(4); - - val splitter = new Splitter(token); - - val workspaceIn = new File("../..").canonicalFile; - val workspaceOut = new File(workspaceIn.canonicalPath + workspace).canonicalFile; - - for (project : workspaceIn.listFiles[f | f.name.startsWith("jOOQ")]) { - val in = new File(workspaceIn, project.name); - val out = new File(workspaceOut, project.name); - splitter.transform(in, out, in); - } - - ex.shutdown; - } - - def transform(File inRoot, File outRoot, File in) { - val out = new File(outRoot.canonicalPath + "/" + in.canonicalPath.replace(inRoot.canonicalPath, "")); - - if (in.directory) { - val files = in.listFiles[path | - !path.canonicalPath.endsWith(".class") - && !path.canonicalPath.endsWith(".dat") - && !path.canonicalPath.endsWith(".git") - && !path.canonicalPath.endsWith(".jar") - && !path.canonicalPath.endsWith(".pdf") - && !path.canonicalPath.endsWith(".zip") - && !path.canonicalPath.endsWith("._trace") - && !path.canonicalPath.endsWith("jOOQ-tools") - && !path.canonicalPath.endsWith("jOOQ-website") - && !path.canonicalPath.endsWith("jOOQ-websites") - && !path.canonicalPath.endsWith("jOOQ-webservices") - && !path.canonicalPath.contains("\\access") - && !path.canonicalPath.contains("\\ase") - && !path.canonicalPath.contains("\\db2") - && !path.canonicalPath.contains("\\ingres") - && !path.canonicalPath.contains("\\oracle") - && !path.canonicalPath.contains("\\sqlserver") - && !path.canonicalPath.contains("\\sybase") - && !path.canonicalPath.contains("\\target") - && !path.canonicalPath.contains("\\bin") - ]; - - for (file : files) { - transform(inRoot, outRoot, file); - } - } - else if (token == "pro" && in.name.equals("LICENSE.txt")) { - ex.submit[ | - write(out, ''' -Copyright (c) 2009-2013, Data Geekery GmbH (http://www.datageekery.com) -All rights reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Other licenses: ------------------------------------------------------------------------------ -Commercial licenses for this work are available. These replace the above -ASL 2.0 and offer limited warranties, support, maintenance, and commercial -database integrations. - -For more information, please visit: http://www.jooq.org/licenses'''); - ]; - } - else { - ex.submit[ | - var content = read(in); - - for (pattern : translateAll) { - val m = pattern.matcher(content); - - while (m.find) { - content = content.substring(0, m.start) - + m.group(1) - + m.group(2).replaceAll("\\S", "x") - + m.group(3) - + content.substring(m.end); - } - } - for (pair : replaceFirst) { - content = pair.left.matcher(content).replaceAll(pair.right); - } - for (pair : replaceAll) { - content = pair.left.matcher(content).replaceAll(pair.right); - } - - write(out, content); - ]; - } - } - - val translateAll = new ArrayList(); - val replaceAll = new ArrayList>(); - val replaceFirst = new ArrayList>(); - - new(String token) { - this.token = token; - - if (token == "pro") { - - // Replace a couple of imports - replaceFirst.add(new ImmutablePair(compile('''import org\.jooq\.(ArrayConstant|ArrayRecord|impl\.ArrayRecordImpl|impl\.FlashbackTable.*?);'''), "// ...")); - replaceFirst.add(new ImmutablePair(compile('''import static org\.jooq\.impl\.DSL\.(cube|grouping|groupingId|groupingSets);'''), "// ...")); - - // Replace the Java / Scala / Xtend license header - replaceFirst.add(new ImmutablePair(compile('''(?s:/\*\*[\r\n] \* Copyright.*?eula[\r\n] \*/)'''), ''' -/** - * Copyright (c) 2009-2013, Data Geekery GmbH (http://www.datageekery.com) - * All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * Other licenses: - * ----------------------------------------------------------------------------- - * Commercial licenses for this work are available. These replace the above - * ASL 2.0 and offer limited warranties, support, maintenance, and commercial - * database integrations. - * - * For more information, please visit: http://www.jooq.org/licenses - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - */''')); - - for (d : SQLDialect::values.filter[d | d.commercial]) { - - // Remove commercial dialects from @Support annotations - replaceAll.add(new ImmutablePair(compile('''(?s:(\@Support\([^\)]*?),\s*\b«d.name»\b([^\)]*?\)))'''), "$1$2")); - replaceAll.add(new ImmutablePair(compile('''(?s:(\@Support\([^\)]*?)\b«d.name»\b,\s*([^\)]*?\)))'''), "$1$2")); - replaceAll.add(new ImmutablePair(compile('''(?s:(\@Support\([^\)]*?)\s*\b«d.name»\b\s*([^\)]*?\)))'''), "$1$2")); - - // Remove commercial dialects from Arrays.asList() expressions - replaceAll.add(new ImmutablePair(compile('''(asList\([^\)]*?),\s*\b«d.name»\b([^\)]*?\))'''), "$1$2")); - replaceAll.add(new ImmutablePair(compile('''(asList\([^\)]*?)\b«d.name»\b,\s*([^\)]*?\))'''), "$1$2")); - replaceAll.add(new ImmutablePair(compile('''(asList\([^\)]*?)\s*\b«d.name»\b\s*([^\)]*?\))'''), "$1$2")); - - // Remove commercial dialects from imports - replaceAll.add(new ImmutablePair(compile('''import (static )?org\.jooq\.SQLDialect\.«d.name»;'''), "// ...")); - replaceAll.add(new ImmutablePair(compile('''import (static )?org\.jooq\.util\.«d.name.toLowerCase»\..*?;'''), "// ...")); - } - } - - // Remove sections of delimited code - translateAll.add(compile('''(?s:(/\* \[«token»\])( \*.*?/\* )(\[/«token»\] \*/))''')); - translateAll.add(compile('''(?s:(.*?))''')); - } -} diff --git a/jOOQ-tools/src/org/jooq/xtend/BetweenAndSteps.xtend b/jOOQ-tools/src/org/jooq/xtend/BetweenAndSteps.xtend deleted file mode 100644 index 6715362b03..0000000000 --- a/jOOQ-tools/src/org/jooq/xtend/BetweenAndSteps.xtend +++ /dev/null @@ -1,343 +0,0 @@ -/** - * Copyright (c) 2009-2013, Data Geekery GmbH (http://www.datageekery.com) - * All rights reserved. - * - * This work is dual-licensed - * - under the Apache Software License 2.0 (the "ASL") - * - under the jOOQ License and Maintenance Agreement (the "jOOQ License") - * ============================================================================= - * You may choose which license applies to you: - * - * - If you're using this work with Open Source databases, you may choose - * either ASL or jOOQ License. - * - If you're using this work with at least one commercial database, you must - * choose jOOQ License - * - * For more information, please visit http://www.jooq.org/licenses - * - * Apache Software License 2.0: - * ----------------------------------------------------------------------------- - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * jOOQ License and Maintenance Agreement: - * ----------------------------------------------------------------------------- - * Data Geekery grants the Customer the non-exclusive, timely limited and - * non-transferable license to install and use the Software under the terms of - * the jOOQ License and Maintenance Agreement. - * - * This library is distributed with a LIMITED WARRANTY. See the jOOQ License - * and Maintenance Agreement for more details: http://www.jooq.org/licensing - */ -package org.jooq.xtend - -import org.jooq.Constants - -/** - * @author Lukas Eder - */ -class BetweenAndSteps extends Generators { - - def static void main(String[] args) { - val steps = new BetweenAndSteps(); - steps.generateBetweenAndSteps(); - steps.generateBetweenAndStepsImpl(); - } - - def generateBetweenAndSteps() { - for (degree : (1..Constants::MAX_ROW_DEGREE)) { - val out = new StringBuilder(); - - out.append(''' - «classHeader» - package org.jooq; - - import javax.annotation.Generated; - - /** - * An intermediate DSL type for the construction of a BETWEEN - * predicate. - * - * @author Lukas Eder - */ - «generatedAnnotation» - public interface BetweenAndStep«degree»<«TN(degree)»> { - - /** - * Create a condition to check this field against some bounds - */ - @Support - Condition and(«Field_TN_XXXn(degree, "maxValue")»); - - /** - * Create a condition to check this field against some bounds - */ - @Support - Condition and(«TN_XXXn(degree, "maxValue")»); - - /** - * Create a condition to check this field against some bounds - */ - @Support - Condition and(Row«degree»<«TN(degree)»> maxValue); - - /** - * Create a condition to check this field against some bounds - */ - @Support - Condition and(Record«degree»<«TN(degree)»> maxValue); - - } - '''); - - write("org.jooq.BetweenAndStep" + degree, out); - } - } - - def generateBetweenAndStepsImpl() { - val out = new StringBuilder(); - - out.append(''' - «classHeader» - package org.jooq.impl; - - import static java.util.Arrays.asList; - import static org.jooq.Clause.CONDITION; - import static org.jooq.Clause.CONDITION_BETWEEN; - import static org.jooq.Clause.CONDITION_BETWEEN_SYMMETRIC; - import static org.jooq.Clause.CONDITION_NOT_BETWEEN; - import static org.jooq.Clause.CONDITION_NOT_BETWEEN_SYMMETRIC; - import static org.jooq.SQLDialect.ASE; - import static org.jooq.SQLDialect.CUBRID; - import static org.jooq.SQLDialect.DB2; - import static org.jooq.SQLDialect.DERBY; - import static org.jooq.SQLDialect.FIREBIRD; - import static org.jooq.SQLDialect.H2; - import static org.jooq.SQLDialect.MARIADB; - import static org.jooq.SQLDialect.MYSQL; - import static org.jooq.SQLDialect.ORACLE; - import static org.jooq.SQLDialect.SQLITE; - import static org.jooq.SQLDialect.SQLSERVER; - import static org.jooq.SQLDialect.SYBASE; - import static org.jooq.impl.DSL.row; - - import javax.annotation.Generated; - - «FOR degree : (1..Constants::MAX_ROW_DEGREE)» - import org.jooq.BetweenAndStep«degree»; - «ENDFOR» - import org.jooq.BetweenAndStepN; - import org.jooq.BindContext; - import org.jooq.Clause; - import org.jooq.Condition; - import org.jooq.Configuration; - import org.jooq.Context; - import org.jooq.Field; - import org.jooq.QueryPartInternal; - import org.jooq.Record; - «FOR degree : (1..Constants::MAX_ROW_DEGREE)» - import org.jooq.Record«degree»; - «ENDFOR» - import org.jooq.RenderContext; - import org.jooq.Row; - «FOR degree : (1..Constants::MAX_ROW_DEGREE)» - import org.jooq.Row«degree»; - «ENDFOR» - import org.jooq.RowN; - - /** - * @author Lukas Eder - */ - «generatedAnnotation» - @SuppressWarnings({ "rawtypes", "unchecked" }) - class RowBetweenCondition<«TN(Constants::MAX_ROW_DEGREE)»> extends AbstractCondition - implements - - // This BetweenAndStep implementation implements all types. Type-safety is - // being checked through the type-safe API. No need for further checks here - «FOR degree : (1..Constants::MAX_ROW_DEGREE)» - BetweenAndStep«degree»<«TN(degree)»>, - «ENDFOR» - BetweenAndStepN { - - private static final long serialVersionUID = -4666251100802237878L; - private static final Clause[] CLAUSES_BETWEEN = { CONDITION, CONDITION_BETWEEN }; - private static final Clause[] CLAUSES_BETWEEN_SYMMETRIC = { CONDITION, CONDITION_BETWEEN_SYMMETRIC }; - private static final Clause[] CLAUSES_NOT_BETWEEN = { CONDITION, CONDITION_NOT_BETWEEN }; - private static final Clause[] CLAUSES_NOT_BETWEEN_SYMMETRIC = { CONDITION, CONDITION_NOT_BETWEEN_SYMMETRIC }; - - private final boolean symmetric; - private final boolean not; - private final Row row; - private final Row minValue; - private Row maxValue; - - RowBetweenCondition(Row row, Row minValue, boolean not, boolean symmetric) { - this.row = row; - this.minValue = minValue; - this.not = not; - this.symmetric = symmetric; - } - - // ------------------------------------------------------------------------ - // XXX: BetweenAndStep API - // ------------------------------------------------------------------------ - - @Override - public final Condition and(Field f) { - if (maxValue == null) { - return and(row(f)); - } - else { - return super.and(f); - } - } - «FOR degree : (2..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition and(«Field_TN_tn(degree)») { - return and(row(«tn(degree)»)); - } - «ENDFOR» - - @Override - public final Condition and(Field... fields) { - return and(row(fields)); - } - «FOR degree : (1..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition and(«TN_tn(degree)») { - return and(row(«tn(degree)»)); - } - «ENDFOR» - - @Override - public final Condition and(Object... values) { - return and(row(values)); - } - «FOR degree : (1..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition and(Row«degree»<«TN(degree)»> r) { - this.maxValue = r; - return this; - } - «ENDFOR» - - @Override - public final Condition and(RowN r) { - this.maxValue = r; - return this; - } - «FOR degree : (1..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition and(Record«degree»<«TN(degree)»> record) { - return and(record.valuesRow()); - } - «ENDFOR» - - @Override - public final Condition and(Record record) { - RowN r = new RowImpl(Utils.fields(record.intoArray(), record.fields())); - return and(r); - } - - // ------------------------------------------------------------------------ - // XXX: QueryPart API - // ------------------------------------------------------------------------ - - @Override - public final void bind(BindContext context) { - delegate(context.configuration()).bind(context); - } - - @Override - public final void toSQL(RenderContext context) { - delegate(context.configuration()).toSQL(context); - } - - @Override - public final Clause[] clauses(Context ctx) { - return delegate(ctx.configuration()).clauses(ctx); - } - - private final QueryPartInternal delegate(Configuration configuration) { - // These casts are safe for RowImpl - RowN r = (RowN) row; - RowN min = (RowN) minValue; - RowN max = (RowN) maxValue; - - // These dialects don't support the SYMMETRIC keyword at all - if (symmetric && asList(ASE, CUBRID, DB2, DERBY, FIREBIRD, H2, MARIADB, MYSQL, ORACLE, SQLITE, SQLSERVER, SYBASE).contains(configuration.dialect().family())) { - if (not) { - return (QueryPartInternal) r.notBetween(min, max).and(r.notBetween(max, min)); - } - else { - return (QueryPartInternal) r.between(min, max).or(r.between(max, min)); - } - } - - // These dialects either don't support row value expressions, or they - // Can't handle row value expressions with the BETWEEN predicate - else if (row.size() > 1 && asList(CUBRID, DERBY, FIREBIRD, MARIADB, MYSQL, ORACLE, SQLITE, SQLSERVER, SYBASE).contains(configuration.dialect().family())) { - Condition result = r.ge(min).and(r.le(max)); - - if (not) { - result = result.not(); - } - - return (QueryPartInternal) result; - } - else { - return new Native(); - } - } - - private class Native extends AbstractQueryPart { - - /** - * Generated UID - */ - private static final long serialVersionUID = 2915703568738921575L; - - @Override - public final void toSQL(RenderContext context) { - context.visit(row); - if (not) context.sql(" ").keyword("not"); - context.sql(" ").keyword("between"); - if (symmetric) context.sql(" ").keyword("symmetric"); - context.sql(" ").visit(minValue); - context.sql(" ").keyword("and"); - context.sql(" ").visit(maxValue); - } - - @Override - public final void bind(BindContext context) { - context.visit(row).visit(minValue).visit(maxValue); - } - - @Override - public final Clause[] clauses(Context ctx) { - return not ? symmetric ? CLAUSES_NOT_BETWEEN_SYMMETRIC - : CLAUSES_NOT_BETWEEN - : symmetric ? CLAUSES_BETWEEN_SYMMETRIC - : CLAUSES_BETWEEN; - } - } - } - '''); - - write("org.jooq.impl.RowBetweenCondition", out); - } -} \ No newline at end of file diff --git a/jOOQ-tools/src/org/jooq/xtend/Conversions.xtend b/jOOQ-tools/src/org/jooq/xtend/Conversions.xtend deleted file mode 100644 index 83f774e298..0000000000 --- a/jOOQ-tools/src/org/jooq/xtend/Conversions.xtend +++ /dev/null @@ -1,129 +0,0 @@ -/** - * Copyright (c) 2009-2013, Data Geekery GmbH (http://www.datageekery.com) - * All rights reserved. - * - * This work is dual-licensed - * - under the Apache Software License 2.0 (the "ASL") - * - under the jOOQ License and Maintenance Agreement (the "jOOQ License") - * ============================================================================= - * You may choose which license applies to you: - * - * - If you're using this work with Open Source databases, you may choose - * either ASL or jOOQ License. - * - If you're using this work with at least one commercial database, you must - * choose jOOQ License - * - * For more information, please visit http://www.jooq.org/licenses - * - * Apache Software License 2.0: - * ----------------------------------------------------------------------------- - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * jOOQ License and Maintenance Agreement: - * ----------------------------------------------------------------------------- - * Data Geekery grants the Customer the non-exclusive, timely limited and - * non-transferable license to install and use the Software under the terms of - * the jOOQ License and Maintenance Agreement. - * - * This library is distributed with a LIMITED WARRANTY. See the jOOQ License - * and Maintenance Agreement for more details: http://www.jooq.org/licensing - */ -package org.jooq.xtend - -import org.jooq.Constants - -/** - * @author Lukas Eder - */ -class Conversions extends Generators { - - def static void main(String[] args) { - val conversions = new Conversions(); - conversions.generateAsTuple(); - conversions.generateAsMapper(); - // conversions.generateAsHandler(); - } - - def generateAsTuple() { - val out = new StringBuilder(); - - out.append(''' - «FOR degree : (1..Constants::MAX_ROW_DEGREE)» - - /** - * Enrich any {@link org.jooq.Record«degree»} with the {@link Tuple«degree»} case class - */ - implicit def asTuple«degree»[«TN(degree)»](r : Record«degree»[«TN(degree)»]): Tuple«degree»[«TN(degree)»] = r match { - case null => null - case _ => Tuple«degree»(«FOR d : (1..degree) SEPARATOR ', '»r.value«d»«ENDFOR») - } - «ENDFOR» - '''); - - insert("org.jooq.scala.Conversions", out, "tuples"); - } - - def generateAsMapper() { - val out = new StringBuilder(); - - out.append(''' - «FOR degree : (1..Constants::MAX_ROW_DEGREE)» - - /** - * Wrap a Scala Tuple«degree» => E function in a jOOQ RecordMapper type. - */ - implicit def asMapperFromArgList«degree»[«TN(degree)», E](f: («TN(degree)») => E): RecordMapper[Record«degree»[«TN(degree)»], E] = new RecordMapper[Record«degree»[«TN(degree)»], E] { - def map(record: Record«degree»[«TN(degree)»]) = f(«XXXn(degree, "record.value")») - } - «ENDFOR» - «FOR degree : (1..Constants::MAX_ROW_DEGREE)» - - /** - * Wrap a Scala Tuple«degree» => E function in a jOOQ RecordMapper type. - */ - implicit def asMapperFromTuple«degree»[«TN(degree)», E](f: Tuple«degree»[«TN(degree)»] => E): RecordMapper[Record«degree»[«TN(degree)»], E] = new RecordMapper[Record«degree»[«TN(degree)»], E] { - def map(record: Record«degree»[«TN(degree)»]) = f(Tuple«degree»(«XXXn(degree, "record.value")»)) - } - «ENDFOR» - '''); - - insert("org.jooq.scala.Conversions", out, "mapper"); - } - - def generateAsHandler() { - val out = new StringBuilder(); - - out.append(''' - «FOR degree : (1..Constants::MAX_ROW_DEGREE)» - - /** - * Wrap a Scala Tuple«degree» => Unit function in a jOOQ RecordHandler type. - */ - implicit def asHandlerFromArgList«degree»[«TN(degree)»](f: («TN(degree)») => Unit): RecordHandler[Record«degree»[«TN(degree)»]] = new RecordHandler[Record«degree»[«TN(degree)»]] { - def next(record: Record«degree»[«TN(degree)»]) = f(«XXXn(degree, "record.value")») - } - «ENDFOR» - «FOR degree : (1..Constants::MAX_ROW_DEGREE)» - - /** - * Wrap a Scala Tuple«degree» => Unit function in a jOOQ RecordHandler type. - */ - implicit def asHandlerFromTuple«degree»[«TN(degree)», E](f: Tuple«degree»[«TN(degree)»] => E): RecordHandler[Record«degree»[«TN(degree)»]] = new RecordHandler[Record«degree»[«TN(degree)»]] { - def next(record: Record«degree»[«TN(degree)»]) = f(Tuple«degree»(«XXXn(degree, "record.value")»)) - } - «ENDFOR» - '''); - - insert("org.jooq.scala.Conversions", out, "handler"); - } -} \ No newline at end of file diff --git a/jOOQ-tools/src/org/jooq/xtend/DSL.xtend b/jOOQ-tools/src/org/jooq/xtend/DSL.xtend deleted file mode 100644 index 979879352f..0000000000 --- a/jOOQ-tools/src/org/jooq/xtend/DSL.xtend +++ /dev/null @@ -1,156 +0,0 @@ -/** - * Copyright (c) 2009-2013, Data Geekery GmbH (http://www.datageekery.com) - * All rights reserved. - * - * This work is dual-licensed - * - under the Apache Software License 2.0 (the "ASL") - * - under the jOOQ License and Maintenance Agreement (the "jOOQ License") - * ============================================================================= - * You may choose which license applies to you: - * - * - If you're using this work with Open Source databases, you may choose - * either ASL or jOOQ License. - * - If you're using this work with at least one commercial database, you must - * choose jOOQ License - * - * For more information, please visit http://www.jooq.org/licenses - * - * Apache Software License 2.0: - * ----------------------------------------------------------------------------- - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * jOOQ License and Maintenance Agreement: - * ----------------------------------------------------------------------------- - * Data Geekery grants the Customer the non-exclusive, timely limited and - * non-transferable license to install and use the Software under the terms of - * the jOOQ License and Maintenance Agreement. - * - * This library is distributed with a LIMITED WARRANTY. See the jOOQ License - * and Maintenance Agreement for more details: http://www.jooq.org/licensing - */ -package org.jooq.xtend - -import org.jooq.Constants - -class DSL extends Generators { - - def static void main(String[] args) { - val dsl = new DSL(); - dsl.generateRowValue(); - dsl.generateRowField(); - dsl.generateValues(); - } - - def generateRowValue() { - val out = new StringBuilder(); - - for (degree : (1..Constants::MAX_ROW_DEGREE)) { - out.append(''' - - /** - * Create a row value expression of degree «degree». - *

- * Note: Not all databases support row value expressions, but many row value - * expression operations can be simulated on all databases. See relevant row - * value expression method Javadocs for details. - */ - «generatedMethod» - @Support - @Transition( - name = "ROW", - args = "Field+" - ) - public static <«TN(degree)»> Row«degree»<«TN(degree)»> row(«TN_tn(degree)») { - return row(«Utils_field_tn(degree)»); - } - '''); - } - - insert("org.jooq.impl.DSL", out, "row-value"); - } - - def generateRowField() { - val out = new StringBuilder(); - - for (degree : (1..Constants::MAX_ROW_DEGREE)) { - out.append(''' - - /** - * Create a row value expression of degree «degree». - *

- * Note: Not all databases support row value expressions, but many row value - * expression operations can be simulated on all databases. See relevant row - * value expression method Javadocs for details. - */ - «generatedMethod» - @Support - @Transition( - name = "ROW", - args = "Field+" - ) - public static <«TN(degree)»> Row«degree»<«TN(degree)»> row(«Field_TN_tn(degree)») { - return new RowImpl(«tn(degree)»); - } - '''); - } - - insert("org.jooq.impl.DSL", out, "row-field"); - } - - def generateValues() { - val out = new StringBuilder(); - - for (degree : (1..Constants::MAX_ROW_DEGREE)) { - out.append(''' - - /** - * Create a VALUES() expression of degree «degree». - *

- * The VALUES() constructor is a tool supported by some - * databases to allow for constructing tables from constant values. - *

- * If a database doesn't support the VALUES() constructor, it - * can be simulated using SELECT .. UNION ALL ... The following - * expressions are equivalent: - *

- *


-                 * -- Using VALUES() constructor
-                 * VALUES(«FOR d : (1..degree) SEPARATOR ', '»val1_«d»«ENDFOR»),
-                 *       («FOR d : (1..degree) SEPARATOR ', '»val2_«d»«ENDFOR»),
-                 *       («FOR d : (1..degree) SEPARATOR ', '»val3_«d»«ENDFOR»)
-                 * AS "v"(«FOR d : (1..degree) SEPARATOR ', '»"c«d»"  «ENDFOR»)
-                 *
-                 * -- Using UNION ALL
-                 * SELECT «FOR d : (1..degree) SEPARATOR ', '»val1_«d» AS "c«d»"«ENDFOR») UNION ALL
-                 * SELECT «FOR d : (1..degree) SEPARATOR ', '»val1_«d» AS "c«d»"«ENDFOR») UNION ALL
-                 * SELECT «FOR d : (1..degree) SEPARATOR ', '»val1_«d» AS "c«d»"«ENDFOR»)
-                 * 
- *

- * Use {@link Table#as(String, String...)} to rename the resulting table and - * its columns. - */ - «generatedMethod» - @Support - @Transition( - name = "VALUES", - args = "Row+" - ) - public static <«TN(degree)»> Table> values(Row«degree»<«TN(degree)»>... rows) { - return new Values>(rows).as("v", «FOR d : (1..degree) SEPARATOR ', '»"c«d»"«ENDFOR»); - } - '''); - } - - insert("org.jooq.impl.DSL", out, "values"); - } -} \ No newline at end of file diff --git a/jOOQ-tools/src/org/jooq/xtend/DSLContext.xtend b/jOOQ-tools/src/org/jooq/xtend/DSLContext.xtend deleted file mode 100644 index 19c7fdc312..0000000000 --- a/jOOQ-tools/src/org/jooq/xtend/DSLContext.xtend +++ /dev/null @@ -1,473 +0,0 @@ -/** - * Copyright (c) 2009-2013, Data Geekery GmbH (http://www.datageekery.com) - * All rights reserved. - * - * This work is dual-licensed - * - under the Apache Software License 2.0 (the "ASL") - * - under the jOOQ License and Maintenance Agreement (the "jOOQ License") - * ============================================================================= - * You may choose which license applies to you: - * - * - If you're using this work with Open Source databases, you may choose - * either ASL or jOOQ License. - * - If you're using this work with at least one commercial database, you must - * choose jOOQ License - * - * For more information, please visit http://www.jooq.org/licenses - * - * Apache Software License 2.0: - * ----------------------------------------------------------------------------- - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * jOOQ License and Maintenance Agreement: - * ----------------------------------------------------------------------------- - * Data Geekery grants the Customer the non-exclusive, timely limited and - * non-transferable license to install and use the Software under the terms of - * the jOOQ License and Maintenance Agreement. - * - * This library is distributed with a LIMITED WARRANTY. See the jOOQ License - * and Maintenance Agreement for more details: http://www.jooq.org/licensing - */ -package org.jooq.xtend - - -/** - * @author Lukas Eder - */ -import org.jooq.Constants - -class DSLContext extends Generators { - - def static void main(String[] args) { - val ctx = new DSLContext(); - ctx.generateNewRecord(); - ctx.generateSelect(); - ctx.generateSelectDistinct(); - ctx.generateInsert(); - ctx.generateMerge(); - } - - def generateNewRecord() { - val outImpl = new StringBuilder(); - val outAPI = new StringBuilder(); - - for (degree : (1..Constants::MAX_ROW_DEGREE)) { - var fieldOrRow = "Row" + degree; - - if (degree == 1) { - fieldOrRow = "Field"; - } - - outAPI.append(''' - - /** - * Create a new empty {@link Record}. - *

- * The resulting record is attached to this {@link Configuration} by - * default. Use {@link Settings#isAttachRecords()} to override this - * behaviour. - * - * @return The new record - */ - «generatedMethod» - <«TN(degree)»> Record«recTypeSuffix(degree)» newRecord(«Field_TN_fieldn(degree)»); - '''); - - outImpl.append(''' - - «generatedMethod» - @Override - public <«TN(degree)»> Record«recTypeSuffix(degree)» newRecord(«Field_TN_fieldn(degree)») { - return (Record«recTypeSuffixRaw(degree)») newRecord(new Field[] { «fieldn(degree)» }); - } - '''); - } - - insert("org.jooq.DSLContext", outAPI, "newRecord"); - insert("org.jooq.impl.DefaultDSLContext", outImpl, "newRecord"); - } - - def generateSelect() { - val outDSL = new StringBuilder(); - val outImpl = new StringBuilder(); - val outAPI = new StringBuilder(); - - for (degree : (1..Constants::MAX_ROW_DEGREE)) { - var fieldOrRow = "Row" + degree; - - if (degree == 1) { - fieldOrRow = "Field"; - } - - outAPI.append(''' - - /** - * Create a new DSL select statement. - *

- * This is the same as {@link #select(Field...)}, except that it - * declares additional record-level typesafety, which is needed by - * {@link «fieldOrRow»#in(Select)}, {@link «fieldOrRow»#equal(Select)} and other predicate - * building methods taking subselect arguments. - *

- * This creates an attached, renderable and executable SELECT - * statement from this {@link DSLContext}. If you don't need to render or - * execute this SELECT statement (e.g. because you want to - * create a subselect), consider using the static - * {@link DSL#select(«FOR d : (1..degree) SEPARATOR ', '»Field«ENDFOR»)} instead. - *

- * Example:

-                 * using(configuration)
-                 *       .select(«field1_field2_fieldn(degree)»)
-                 *       .from(table1)
-                 *       .join(table2).on(field1.equal(field2))
-                 *       .where(field1.greaterThan(100))
-                 *       .orderBy(field2);
-                 * 
- * - * @see DSL#selectDistinct(Field...) - * @see #selectDistinct(Field...) - */ - «generatedMethod» - @Support - @Transition( - name = "SELECT", - args = "Field+" - ) - <«TN(degree)»> SelectSelectStep> select(«Field_TN_fieldn(degree)»); - '''); - - outDSL.append(''' - - /** - * Create a new DSL subselect statement. - *

- * This is the same as {@link #select(Field...)}, except that it declares - * additional record-level typesafety, which is needed by - * {@link «fieldOrRow»#in(Select)}, {@link «fieldOrRow»#equal(Select)} and other predicate - * building methods taking subselect arguments. - *

- * Unlike {@link Select} factory methods in the {@link DSLContext} API, this - * creates an unattached, and thus not directly renderable or executable - * SELECT statement. You can use this statement in two ways: - *

    - *
  • As a subselect within another select
  • - *
  • As a statement, after attaching it using - * {@link Select#attach(org.jooq.Configuration)}
  • - *
- *

- * Example:

-                 * import static org.jooq.impl.DSL.*;
-                 *
-                 * // [...]
-                 *
-                 * select(«field1_field2_fieldn(degree)»)
-                 *  .from(table1)
-                 *  .join(table2).on(field1.equal(field2))
-                 *  .where(field1.greaterThan(100))
-                 *  .orderBy(field2);
-                 * 
- * - * @see DSLContext#select(Field...) - * @see #select(Field...) - */ - «generatedMethod» - @Support - @Transition( - name = "SELECT", - args = "Field+" - ) - public static <«TN(degree)»> SelectSelectStep> select(«Field_TN_fieldn(degree)») { - return (SelectSelectStep) select(new Field[] { «fieldn(degree)» }); - } - '''); - - outImpl.append(''' - - «generatedMethod» - @Override - public <«TN(degree)»> SelectSelectStep> select(«Field_TN_fieldn(degree)») { - return (SelectSelectStep) select(new Field[] { «fieldn(degree)» }); - } - '''); - } - - insert("org.jooq.DSLContext", outAPI, "select"); - insert("org.jooq.impl.DefaultDSLContext", outImpl, "select"); - insert("org.jooq.impl.DSL", outDSL, "select"); - } - - def generateSelectDistinct() { - val outDSL = new StringBuilder(); - val outImpl = new StringBuilder(); - val outAPI = new StringBuilder(); - - for (degree : (1..Constants::MAX_ROW_DEGREE)) { - var fieldOrRow = "Row" + degree; - - if (degree == 1) { - fieldOrRow = "Field"; - } - - outAPI.append(''' - - /** - * Create a new DSL select statement. - *

- * This is the same as {@link #selectDistinct(Field...)}, except that it - * declares additional record-level typesafety, which is needed by - * {@link «fieldOrRow»#in(Select)}, {@link «fieldOrRow»#equal(Select)} and other predicate - * building methods taking subselect arguments. - *

- * This creates an attached, renderable and executable SELECT - * statement from this {@link DSLContext}. If you don't need to render or - * execute this SELECT statement (e.g. because you want to - * create a subselect), consider using the static - * {@link DSL#selectDistinct(«FOR d : (1..degree) SEPARATOR ', '»Field«ENDFOR»)} instead. - *

- * Example:

-                 * using(configuration)
-                 *       .selectDistinct(«field1_field2_fieldn(degree)»)
-                 *       .from(table1)
-                 *       .join(table2).on(field1.equal(field2))
-                 *       .where(field1.greaterThan(100))
-                 *       .orderBy(field2);
-                 * 
- * - * @see DSL#selectDistinct(Field...) - * @see #selectDistinct(Field...) - */ - «generatedMethod» - @Support - @Transition( - name = "SELECT DISTINCT", - args = "Field+" - ) - <«TN(degree)»> SelectSelectStep> selectDistinct(«Field_TN_fieldn(degree)»); - '''); - - outDSL.append(''' - - /** - * Create a new DSL subselect statement. - *

- * This is the same as {@link #selectDistinct(Field...)}, except that it - * declares additional record-level typesafety, which is needed by - * {@link «fieldOrRow»#in(Select)}, {@link «fieldOrRow»#equal(Select)} and other predicate - * building methods taking subselect arguments. - *

- * Unlike {@link Select} factory methods in the {@link DSLContext} API, this - * creates an unattached, and thus not directly renderable or executable - * SELECT statement. You can use this statement in two ways: - *

    - *
  • As a subselect within another select
  • - *
  • As a statement, after attaching it using - * {@link Select#attach(org.jooq.Configuration)}
  • - *
- *

- * Example:

-                 * import static org.jooq.impl.DSL.*;
-                 *
-                 * // [...]
-                 *
-                 * selectDistinct(«field1_field2_fieldn(degree)»)
-                 *  .from(table1)
-                 *  .join(table2).on(field1.equal(field2))
-                 *  .where(field1.greaterThan(100))
-                 *  .orderBy(field2);
-                 * 
- * - * @see DSLContext#selectDistinct(Field...) - * @see #selectDistinct(Field...) - */ - «generatedMethod» - @Support - @Transition( - name = "SELECT DISTINCT", - args = "Field+" - ) - public static <«TN(degree)»> SelectSelectStep> selectDistinct(«Field_TN_fieldn(degree)») { - return (SelectSelectStep) selectDistinct(new Field[] { «fieldn(degree)» }); - } - '''); - - outImpl.append(''' - - «generatedMethod» - @Override - public <«TN(degree)»> SelectSelectStep> selectDistinct(«Field_TN_fieldn(degree)») { - return (SelectSelectStep) selectDistinct(new Field[] { «fieldn(degree)» }); - } - '''); - } - - insert("org.jooq.DSLContext", outAPI, "selectDistinct"); - insert("org.jooq.impl.DefaultDSLContext", outImpl, "selectDistinct"); - insert("org.jooq.impl.DSL", outDSL, "selectDistinct"); - } - - def generateInsert() { - val outDSL = new StringBuilder(); - val outImpl = new StringBuilder(); - val outAPI = new StringBuilder(); - - for (degree : (1..Constants::MAX_ROW_DEGREE)) { - outAPI.append(''' - - /** - * Create a new DSL insert statement. - *

- * Example:

-                 * using(configuration)
-                 *       .insertInto(table, «field1_field2_fieldn(degree)»)
-                 *       .values(«XXX1_XXX2_XXXn(degree, "valueA")»)
-                 *       .values(«XXX1_XXX2_XXXn(degree, "valueB")»)
-                 *       .onDuplicateKeyUpdate()
-                 *       .set(field1, value1)
-                 *       .set(field2, value2)
-                 *       .execute();
-                 * 
- */ - «generatedMethod» - @Support - InsertValuesStep«degree» insertInto(Table into, «Field_TN_fieldn(degree)»); - '''); - - outDSL.append(''' - - /** - * Create a new DSL insert statement. - *

- * Unlike {@link Insert} factory methods in the {@link DSLContext} API, this - * creates an unattached, and thus not directly renderable or executable - * INSERT statement. - *

- * Example:

-                 * import static org.jooq.impl.DSL.*;
-                 *
-                 * // [...]
-                 *
-                 * insertInto(table, «field1_field2_fieldn(degree)»)
-                 *   .values(«XXX1_XXX2_XXXn(degree, "valueA")»)
-                 *   .values(«XXX1_XXX2_XXXn(degree, "valueB")»)
-                 *   .onDuplicateKeyUpdate()
-                 *   .set(field1, value1)
-                 *   .set(field2, value2)
-                 * 
- * - * @see DSLContext#insertInto(Table, «(1..degree).map[e | "Field"].join(", ")») - */ - «generatedMethod» - @Support - public static InsertValuesStep«degree» insertInto(Table into, «Field_TN_fieldn(degree)») { - return (InsertValuesStep«degree») insertInto(into, new Field[] { «fieldn(degree)» }); - } - ''') - - outImpl.append(''' - - «generatedMethod» - @Override - public InsertValuesStep«degree» insertInto(Table into, «Field_TN_fieldn(degree)») { - return new InsertImpl(configuration, into, Arrays.asList(new Field[] { «fieldn(degree)» })); - } - '''); - } - - insert("org.jooq.DSLContext", outAPI, "insert"); - insert("org.jooq.impl.DefaultDSLContext", outImpl, "insert"); - insert("org.jooq.impl.DSL", outDSL, "insert"); - } - - def generateMerge() { - val outDSL = new StringBuilder(); - val outImpl = new StringBuilder(); - val outAPI = new StringBuilder(); - - for (degree : (1..Constants::MAX_ROW_DEGREE)) { - outAPI.append(''' - - /** - * Create a new DSL merge statement (H2-specific syntax). - *

- * This statement is available from DSL syntax only. It is known to be - * supported in some way by any of these dialects: - * - * - * - * - * - * - * - * - * - * - * - *
H2H2 natively supports this special syntaxwww.h2database.com/html/grammar.html#merge
DB2, HSQLDB, Oracle, SQL Server, Sybase SQL AnywhereThese databases can simulate the H2-specific MERGE statement using a - * standard SQL MERGE statement, without restrictionsSee {@link #mergeInto(Table)} for the standard MERGE statement
- */ - «generatedMethod» - @Support({ CUBRID, DB2, H2, HSQLDB, ORACLE, SQLSERVER, SYBASE }) - MergeKeyStep«degree» mergeInto(Table table, «Field_TN_fieldn(degree)»); - '''); - - outDSL.append(''' - - /** - * Create a new DSL merge statement (H2-specific syntax). - *

- * Unlike {@link Merge} factory methods in the {@link DSLContext} API, this - * creates an unattached, and thus not directly renderable or executable - * MERGE statement. - *

- * This statement is available from DSL syntax only. It is known to be - * supported in some way by any of these dialects: - * - * - * - * - * - * - * - * - * - * - * - *
H2H2 natively supports this special syntaxwww.h2database.com/html/grammar.html#merge
DB2, HSQLDB, Oracle, SQL Server, Sybase SQL AnywhereThese databases can simulate the H2-specific MERGE statement using a - * standard SQL MERGE statement, without restrictionsSee {@link #mergeInto(Table)} for the standard MERGE statement
- * - * @see DSLContext#mergeInto(Table, «(1..degree).map[e | "Field"].join(", ")») - */ - «generatedMethod» - @Support({ CUBRID, DB2, H2, HSQLDB, ORACLE, SQLSERVER, SYBASE }) - public static MergeKeyStep«degree» mergeInto(Table table, «Field_TN_fieldn(degree)») { - return using(new DefaultConfiguration()).mergeInto(table, «fieldn(degree)»); - } - '''); - - outImpl.append(''' - - «generatedMethod» - @Override - public MergeKeyStep«degree» mergeInto(Table table, «Field_TN_fieldn(degree)») { - return new MergeImpl(configuration, table, Arrays.asList(«fieldn(degree)»)); - } - '''); - } - - insert("org.jooq.DSLContext", outAPI, "merge"); - insert("org.jooq.impl.DefaultDSLContext", outImpl, "merge"); - insert("org.jooq.impl.DSL", outDSL, "merge"); - } -} \ No newline at end of file diff --git a/jOOQ-tools/src/org/jooq/xtend/GenerateAll.xtend b/jOOQ-tools/src/org/jooq/xtend/GenerateAll.xtend deleted file mode 100644 index 276e5d352b..0000000000 --- a/jOOQ-tools/src/org/jooq/xtend/GenerateAll.xtend +++ /dev/null @@ -1,58 +0,0 @@ -/** - * Copyright (c) 2009-2013, Data Geekery GmbH (http://www.datageekery.com) - * All rights reserved. - * - * This work is dual-licensed - * - under the Apache Software License 2.0 (the "ASL") - * - under the jOOQ License and Maintenance Agreement (the "jOOQ License") - * ============================================================================= - * You may choose which license applies to you: - * - * - If you're using this work with Open Source databases, you may choose - * either ASL or jOOQ License. - * - If you're using this work with at least one commercial database, you must - * choose jOOQ License - * - * For more information, please visit http://www.jooq.org/licenses - * - * Apache Software License 2.0: - * ----------------------------------------------------------------------------- - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * jOOQ License and Maintenance Agreement: - * ----------------------------------------------------------------------------- - * Data Geekery grants the Customer the non-exclusive, timely limited and - * non-transferable license to install and use the Software under the terms of - * the jOOQ License and Maintenance Agreement. - * - * This library is distributed with a LIMITED WARRANTY. See the jOOQ License - * and Maintenance Agreement for more details: http://www.jooq.org/licensing - */ -package org.jooq.xtend - -/** - * @author Lukas Eder - */ -class GenerateAll { - def static void main(String[] args) { - BetweenAndSteps::main(args); - Conversions::main(args); - DSLContext::main(args); - DSL::main(args); - InsertDSL::main(args); - MergeDSL::main(args); - Records::main(args); - Rows::main(args); - UpdateDSL::main(args); - } -} \ No newline at end of file diff --git a/jOOQ-tools/src/org/jooq/xtend/Generators.xtend b/jOOQ-tools/src/org/jooq/xtend/Generators.xtend deleted file mode 100644 index d463346119..0000000000 --- a/jOOQ-tools/src/org/jooq/xtend/Generators.xtend +++ /dev/null @@ -1,450 +0,0 @@ -/** - * Copyright (c) 2009-2013, Data Geekery GmbH (http://www.datageekery.com) - * All rights reserved. - * - * This work is dual-licensed - * - under the Apache Software License 2.0 (the "ASL") - * - under the jOOQ License and Maintenance Agreement (the "jOOQ License") - * ============================================================================= - * You may choose which license applies to you: - * - * - If you're using this work with Open Source databases, you may choose - * either ASL or jOOQ License. - * - If you're using this work with at least one commercial database, you must - * choose jOOQ License - * - * For more information, please visit http://www.jooq.org/licenses - * - * Apache Software License 2.0: - * ----------------------------------------------------------------------------- - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * jOOQ License and Maintenance Agreement: - * ----------------------------------------------------------------------------- - * Data Geekery grants the Customer the non-exclusive, timely limited and - * non-transferable license to install and use the Software under the terms of - * the jOOQ License and Maintenance Agreement. - * - * This library is distributed with a LIMITED WARRANTY. See the jOOQ License - * and Maintenance Agreement for more details: http://www.jooq.org/licensing - */ -package org.jooq.xtend - -import java.io.File -import java.io.FileWriter -import java.io.IOException -import java.io.RandomAccessFile - -/** - * @author Lukas Eder - */ -abstract class Generators { - - def file(String className) { - if (className.contains("scala")) { - return new File("./../jOOQ-scala/src/main/scala/" + className.replace(".", "/") + ".scala"); - } - else { - return new File("./../jOOQ/src/main/java/" + className.replace(".", "/") + ".java"); - } - } - - def read(String className) { - return read(file(className)) - } - - def read(File file) { - val f = new RandomAccessFile(file, "r"); - try { - val contents = Util::newByteArray(f.length); - f.readFully(contents); - return new String(contents); - } - catch (IOException e) { - e.printStackTrace(); - } - finally { - f.close; - } - } - - def insert(String className, CharSequence contents, String section) { - val result = new StringBuilder(); - val original = read(className); - val start = "// [jooq-tools] START [" + section + "]"; - val end = "// [jooq-tools] END [" + section + "]" - - result.append(original.substring(0, original.indexOf(start) + start.length + 1)) - result.append(contents); - result.append("\n"); - result.append(original.substring(original.indexOf(end))); - - write(className, result, section); - } - - def write(String className, CharSequence contents) { - write(className, contents, null); - } - - def write(String className, CharSequence contents, String section) { - val file = file(className); - write(file, contents, section); - } - - def write(File file, CharSequence contents) { - write(file, contents, null); - } - - def write(File file, CharSequence contents, String section) { - file.getParentFile().mkdirs(); - - try { - System::out.println("Writing " + file + (if (section != null) (" (section: " + section + ")") else "")); - val fw = new FileWriter(file); - fw.append(contents); - fw.flush(); - fw.close(); - } - catch (IOException e) { - e.printStackTrace(); - } - } - - def first(int degree) { - switch degree { - case 1 : "first" - case 2 : "second" - case 3 : "third" - case 4 : "fourth" - case 5 : "fifth" - case 6 : "sixth" - case 7 : "seventh" - case 8 : "eighth" - case 9 : "ninth" - case 10 : "tenth" - case 11 : "eleventh" - case 12 : "twelfth" - case 13 : "thirteenth" - case 14 : "fourteenth" - case 15 : "fifteenth" - case 16 : "sixteenth" - case 17 : "seventeenth" - case 18 : "eighteenth" - case 19 : "ninteenth" - case 20 : "twentieth" - case 21 : "twenty-first" - case 22 : "twenty-second" - case degree % 10 == 1 : degree + "st" - case degree % 10 == 2 : degree + "nd" - case degree % 10 == 3 : degree + "rd" - default : degree + "th" - } - } - - def classHeader() { - ''' - /** - * Copyright (c) 2009-2013, Data Geekery GmbH (http://www.datageekery.com) - * All rights reserved. - * - * This work is dual-licensed - * - under the Apache Software License 2.0 (the "ASL") - * - under the jOOQ License and Maintenance Agreement (the "jOOQ License") - * ============================================================================= - * You may choose which license applies to you: - * - * - If you're using this work with Open Source databases, you may choose - * either ASL or jOOQ License. - * - If you're using this work with at least one commercial database, you must - * choose jOOQ License - * - * For more information, please visit http://www.jooq.org/licenses - * - * Apache Software License 2.0: - * ----------------------------------------------------------------------------- - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * jOOQ License and Maintenance Agreement: - * ----------------------------------------------------------------------------- - * Data Geekery grants the Customer the non-exclusive, timely limited and - * non-transferable license to install and use the Software under the terms of - * the jOOQ License and Maintenance Agreement. - * - * This library is distributed with a LIMITED WARRANTY. See the jOOQ License - * and Maintenance Agreement for more details: http://www.jooq.org/licensing - */ - ''' - } - - def generatedAnnotation() { - ''' - @Generated("This class was generated using jOOQ-tools") - ''' - } - - def generatedMethod() { - ''' - @Generated("This method was generated using jOOQ-tools") - ''' - } - - /** - * A comma-separated list of types - *

- * T1, T2, .., T[N] - */ - def TN(int degree) { - return - if (degree == 0) - "Object..." - else - (1..degree).join(", ", [e | "T" + e]) - } - - /** - * A comma-separated list of identifier references - *

- * t1, t2, .., t[N] - */ - def tn(int degree) { - return - if (degree == 0) - "values" - else - (1..degree).join(", ", [e | "t" + e]) - } - - /** - * A comma-separated list of identifier declarations - *

- * T1 t1, T2 t2, .., T[N] t[N] - */ - def TN_tn(int degree) { - return - if (degree == 0) - "Object... values" - else - (1..degree).join(", ", [e | "T" + e + " t" + e]) - } - - /** - * A comma-separated list of identifier declarations - *

- * Object t1, Object t2, .., Object t[N] - */ - def Object_tn(int degree) { - return - if (degree == 0) - "Object... values" - else - (1..degree).join(", ", [e | "Object t" + e]) - } - - /** - * A comma-separated list of identifier declarations - *

- * T1 t1, T2 t2, .., T[N] t[N] - */ - def TN_XXXn(int degree, String XXX) { - return - if (degree == 0) - "Object... " + XXX + "s" - else - (1..degree).join(", ", [e | "T" + e + " " + XXX + e]) - } - - /** - * A comma-separated list of field declarations - *

- * Field<T1> t1, Field<T2> t2, .., Field<T[N]> t[N] - */ - def Field_TN_tn(int degree) { - return - if (degree == 0) - "Field... values" - else - (1..degree).join(", ", [e | "Field t" + e]) - } - - /** - * A comma-separated list of field declarations - *

- * Field t1, Field t2, .., Field t[N] - */ - def Field_tn(int degree) { - return - if (degree == 0) - "Field... values" - else - (1..degree).join(", ", [e | "Field t" + e]) - } - - /** - * A comma-separated list of field declarations - *

- * Field<T1> t1, Field<T2> t2, .., Field<T[N]> t[N] - */ - def Field_TN_XXXn(int degree, String XXX) { - return - if (degree == 0) - "Field... " + XXX + "s" - else - (1..degree).join(", ", [e | "Field " + XXX + e]) - } - - /** - * A comma-separated list of field declarations - *

- * Field<T1> field1, Field<T2> field2, .., Field<T[N]> field[N] - */ - def Field_TN_fieldn(int degree) { - return - if (degree == 0) - "Field... fields" - else - (1..degree).join(", ", [e | "Field field" + e]) - } - - /** - * A comma-separated list of field references - *

- * field1, field2, .., field[N] - */ - def fieldn(int degree) { - XXXn(degree, "field") - } - - /** - * A comma-separated list of field references - *

- * field1, field2, .., field[N] - */ - def XXXn(int degree, String XXX) { - return - if (degree == 0) - XXX + "s" - else - (1..degree).join(", ", [e | XXX + e]) - } - - /** - * A comma-separated list of field references - *

- * Unlike {@link #fieldn(int)}, this will return at most 5 fields - *

- * field1, field2, .., field[N] - */ - def field1_field2_fieldn(int degree) { - XXX1_XXX2_XXXn(degree, "field") - } - - /** - * A comma-separated list of literals - *

- * Unlike {@link #fieldn(int)}, this will return at most 5 fields - *

- * XXX1, XXX2, .., XXX[N] - */ - def XXX1_XXX2_XXXn(int degree, String XXX) { - if (degree <= 5) { - return fieldn(degree); - } - else { - return (1..3).join(", ", [e | XXX + e]) + - ", .., " + - (degree - 1..degree).join(", ", [e | XXX + e]) - } - } - - /** - * A comma-separated list of value constructor references - *

- * val(t1), val(t2), .., val(t[N]) - */ - def Utils_field_tn(int degree) { - (1..degree).join(", ", [e | "Utils.field(t" + e + ")"]) - } - - /** - * A numeric degree or "N" - */ - def degreeOrN(int degree) { - return degreeOr(degree, "N") - } - - /** - * A numeric degree or [nothing] - */ - def degreeOr(int degree) { - return degreeOr(degree, "") - } - - /** - * A numeric degree or [or] - */ - def degreeOr(int degree, String or) { - return if (degree == 0) or else degree - } - - /** - * The generic type of a class, e.g. "" or <T1, T2, T3> - */ - def type(int degree) { - type(degree, "") - } - - /** - * The generic type of a class, e.g. "" or <T1, T2, T3> - */ - def type(int degree, String spacer) { - '''«IF degree > 0»<«TN(degree)»>«spacer»«ENDIF»''' - } - - /** - * The generic type suffix of a class, e.g. N or 3<T1, T2, T3> - */ - def typeSuffix(int degree) { - '''«typeSuffixRaw(degree)»«type(degree)»''' - } - - /** - * The "raw" generic type suffix of a class, e.g. N or 3 - */ - def typeSuffixRaw(int degree) { - '''«degreeOrN(degree)»''' - } - - /** - * The generic type suffix of a record, e.g. "" or 3<T1, T2, T3> - */ - def recTypeSuffix(int degree) { - '''«recTypeSuffixRaw(degree)»«type(degree)»''' - } - - /** - * The "raw" generic type suffix of a record, e.g. "" or 3 - */ - def recTypeSuffixRaw(int degree) { - '''«degreeOr(degree)»''' - } -} \ No newline at end of file diff --git a/jOOQ-tools/src/org/jooq/xtend/InsertDSL.xtend b/jOOQ-tools/src/org/jooq/xtend/InsertDSL.xtend deleted file mode 100644 index aee6a16cf9..0000000000 --- a/jOOQ-tools/src/org/jooq/xtend/InsertDSL.xtend +++ /dev/null @@ -1,362 +0,0 @@ -/** - * Copyright (c) 2009-2013, Data Geekery GmbH (http://www.datageekery.com) - * All rights reserved. - * - * This work is dual-licensed - * - under the Apache Software License 2.0 (the "ASL") - * - under the jOOQ License and Maintenance Agreement (the "jOOQ License") - * ============================================================================= - * You may choose which license applies to you: - * - * - If you're using this work with Open Source databases, you may choose - * either ASL or jOOQ License. - * - If you're using this work with at least one commercial database, you must - * choose jOOQ License - * - * For more information, please visit http://www.jooq.org/licenses - * - * Apache Software License 2.0: - * ----------------------------------------------------------------------------- - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * jOOQ License and Maintenance Agreement: - * ----------------------------------------------------------------------------- - * Data Geekery grants the Customer the non-exclusive, timely limited and - * non-transferable license to install and use the Software under the terms of - * the jOOQ License and Maintenance Agreement. - * - * This library is distributed with a LIMITED WARRANTY. See the jOOQ License - * and Maintenance Agreement for more details: http://www.jooq.org/licensing - */ -package org.jooq.xtend - - -/** - * @author Lukas Eder - */ -import org.jooq.Constants - -class InsertDSL extends Generators { - - def static void main(String[] args) { - val insert = new InsertDSL(); - insert.generateInsertValuesStep(); - insert.generateInsertImpl(); - } - - def generateInsertValuesStep() { - for (degree : (1..Constants::MAX_ROW_DEGREE)) { - val out = new StringBuilder(); - - out.append(''' - «classHeader» - package org.jooq; - - import java.util.Collection; - - import javax.annotation.Generated; - - /** - * This type is used for the {@link Insert}'s DSL API. - *

- * Example:

-             * using(configuration)
-             *       .insertInto(table, «field1_field2_fieldn(degree)»)
-             *       .values(«XXX1_XXX2_XXXn(degree, "valueA")»)
-             *       .values(«XXX1_XXX2_XXXn(degree, "valueB")»)
-             *       .onDuplicateKeyUpdate()
-             *       .set(field1, value1)
-             *       .set(field2, value2)
-             *       .execute();
-             * 
- * - * @author Lukas Eder - */ - «generatedAnnotation» - public interface InsertValuesStep«degree» extends InsertOnDuplicateStep { - - /** - * Add values to the insert statement. - */ - @Support - InsertValuesStep«degree» values(«TN_XXXn(degree, "value")»); - - /** - * Add values to the insert statement. - */ - @Support - InsertValuesStep«degree» values(«Field_TN_XXXn(degree, "value")»); - - /** - * Add values to the insert statement. - */ - @Support - InsertValuesStep«degree» values(Collection values); - - /** - * Use a SELECT statement as the source of values for the - * INSERT statement - *

- * This variant of the INSERT .. SELECT statement expects a - * select returning exactly as many fields as specified previously in the - * INTO clause: - * {@link DSLContext#insertInto(Table, «(1..degree).join(", ", [e | 'Field'])»)} - */ - @Support - Insert select(Select> select); - } - '''); - - write("org.jooq.InsertValuesStep" + degree, out); - } - } - - def generateInsertImpl() { - val out = new StringBuilder(); - - out.append(''' - «classHeader» - package org.jooq.impl; - - import java.util.Arrays; - import java.util.Collection; - import java.util.List; - import java.util.Map; - - import org.jooq.AttachableInternal; - import org.jooq.Configuration; - import org.jooq.Field; - import org.jooq.FieldLike; - import org.jooq.Insert; - import org.jooq.InsertOnDuplicateSetMoreStep; - import org.jooq.InsertQuery; - import org.jooq.InsertResultStep; - import org.jooq.InsertSetMoreStep; - «FOR degree : (1..Constants::MAX_ROW_DEGREE)» - import org.jooq.InsertValuesStep«degree»; - «ENDFOR» - import org.jooq.InsertValuesStepN; - import org.jooq.Record; - import org.jooq.Record1; - import org.jooq.Result; - import org.jooq.Select; - import org.jooq.Table; - - /** - * @author Lukas Eder - */ - @SuppressWarnings({ "rawtypes", "unchecked" }) - class InsertImpl - extends AbstractDelegatingQuery> - implements - - // Cascading interface implementations for Insert behaviour - «FOR degree : (1..Constants::MAX_ROW_DEGREE)» - InsertValuesStep«degree», - «ENDFOR» - InsertValuesStepN, - InsertSetMoreStep, - InsertOnDuplicateSetMoreStep, - InsertResultStep { - - /** - * Generated UID - */ - private static final long serialVersionUID = 4222898879771679107L; - - private final Field[] fields; - private final Table into; - private boolean onDuplicateKeyUpdate; - - InsertImpl(Configuration configuration, Table into, Collection> fields) { - super(new InsertQueryImpl(configuration, into)); - - this.into = into; - this.fields = (fields == null || fields.size() == 0) - ? into.fields() - : fields.toArray(new Field[fields.size()]); - } - - // ------------------------------------------------------------------------- - // The DSL API - // ------------------------------------------------------------------------- - - @Override - public final Insert select(Select select) { - Configuration configuration = ((AttachableInternal) getDelegate()).configuration(); - return new InsertSelectQueryImpl(configuration, into, fields, select); - } - «FOR degree : (1..Constants::MAX_ROW_DEGREE)» - - @Override - public final InsertImpl values(«TN_XXXn(degree, "value")») { - return values(new Object[] { «XXXn(degree, "value")» }); - } - «ENDFOR» - - @Override - public final InsertImpl values(Object... values) { - if (fields.length != values.length) { - throw new IllegalArgumentException("The number of values must match the number of fields"); - } - - getDelegate().newRecord(); - for (int i = 0; i < fields.length; i++) { - addValue(getDelegate(), fields[i], values[i]); - } - - return this; - } - - @Override - public final InsertImpl values(Collection values) { - return values(values.toArray()); - } - - private void addValue(InsertQuery delegate, Field field, Object object) { - - // [#1343] Only convert non-jOOQ objects - if (object instanceof Field) { - delegate.addValue(field, (Field) object); - } - else if (object instanceof FieldLike) { - delegate.addValue(field, ((FieldLike) object).asField()); - } - else { - delegate.addValue(field, field.getDataType().convert(object)); - } - } - «FOR degree : (1..Constants::MAX_ROW_DEGREE)» - - @Override - public final InsertImpl values(«Field_TN_XXXn(degree, "value")») { - return values(new Field[] { «XXXn(degree, "value")» }); - } - «ENDFOR» - - @Override - public final InsertImpl values(Field... values) { - List> values1 = Arrays.asList(values); - if (fields.length != values1.size()) { - throw new IllegalArgumentException("The number of values must match the number of fields"); - } - - getDelegate().newRecord(); - for (int i = 0; i < fields.length; i++) { - // javac has trouble when inferring Object for T. Use Void instead - getDelegate().addValue((Field) fields[i], (Field) values1.get(i)); - } - - return this; - } - - @Override - public final InsertImpl onDuplicateKeyUpdate() { - onDuplicateKeyUpdate = true; - getDelegate().onDuplicateKeyUpdate(true); - return this; - } - - @Override - public final InsertImpl onDuplicateKeyIgnore() { - getDelegate().onDuplicateKeyIgnore(true); - return this; - } - - @Override - public final InsertImpl set(Field field, T value) { - if (onDuplicateKeyUpdate) { - getDelegate().addValueForUpdate(field, value); - } - else { - getDelegate().addValue(field, value); - } - - return this; - } - - @Override - public final InsertImpl set(Field field, Field value) { - if (onDuplicateKeyUpdate) { - getDelegate().addValueForUpdate(field, value); - } - else { - getDelegate().addValue(field, value); - } - - return this; - } - - @Override - public final InsertImpl set(Field field, Select> value) { - return set(field, value.asField()); - } - - @Override - public final InsertImpl set(Map, ?> map) { - if (onDuplicateKeyUpdate) { - getDelegate().addValuesForUpdate(map); - } - else { - getDelegate().addValues(map); - } - - return this; - } - - @Override - public final InsertImpl set(Record record) { - return set(Utils.map(record)); - } - - @Override - public final InsertImpl newRecord() { - getDelegate().newRecord(); - return this; - } - - @Override - public final InsertImpl returning() { - getDelegate().setReturning(); - return this; - } - - @Override - public final InsertImpl returning(Field... f) { - getDelegate().setReturning(f); - return this; - } - - @Override - public final InsertImpl returning(Collection> f) { - getDelegate().setReturning(f); - return this; - } - - @Override - public final Result fetch() { - getDelegate().execute(); - return getDelegate().getReturnedRecords(); - } - - @Override - public final R fetchOne() { - getDelegate().execute(); - return getDelegate().getReturnedRecord(); - } - } - '''); - - write("org.jooq.impl.InsertImpl", out); - } -} \ No newline at end of file diff --git a/jOOQ-tools/src/org/jooq/xtend/MergeDSL.xtend b/jOOQ-tools/src/org/jooq/xtend/MergeDSL.xtend deleted file mode 100644 index 6dacf0f8b8..0000000000 --- a/jOOQ-tools/src/org/jooq/xtend/MergeDSL.xtend +++ /dev/null @@ -1,417 +0,0 @@ -/** - * Copyright (c) 2009-2013, Data Geekery GmbH (http://www.datageekery.com) - * All rights reserved. - * - * This work is dual-licensed - * - under the Apache Software License 2.0 (the "ASL") - * - under the jOOQ License and Maintenance Agreement (the "jOOQ License") - * ============================================================================= - * You may choose which license applies to you: - * - * - If you're using this work with Open Source databases, you may choose - * either ASL or jOOQ License. - * - If you're using this work with at least one commercial database, you must - * choose jOOQ License - * - * For more information, please visit http://www.jooq.org/licenses - * - * Apache Software License 2.0: - * ----------------------------------------------------------------------------- - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * jOOQ License and Maintenance Agreement: - * ----------------------------------------------------------------------------- - * Data Geekery grants the Customer the non-exclusive, timely limited and - * non-transferable license to install and use the Software under the terms of - * the jOOQ License and Maintenance Agreement. - * - * This library is distributed with a LIMITED WARRANTY. See the jOOQ License - * and Maintenance Agreement for more details: http://www.jooq.org/licensing - */ -package org.jooq.xtend - -import org.jooq.Constants - -class MergeDSL extends Generators { - - def static void main(String[] args) { - val merge = new MergeDSL(); - merge.generateMergeNotMatchedStep(); - merge.generateMergeNotMatchedValuesStep(); - merge.generateMergeKeyStep(); - merge.generateMergeValuesStep(); - merge.generateMergeImplImplements(); - merge.generateMergeImplValues(); - merge.generateMergeImplWhenNotMatchedThenInsert(); - } - - def generateMergeNotMatchedStep() { - val out = new StringBuilder(); - - out.append(''' - «classHeader» - package org.jooq; - - import static org.jooq.SQLDialect.CUBRID; - import static org.jooq.SQLDialect.DB2; - import static org.jooq.SQLDialect.HSQLDB; - import static org.jooq.SQLDialect.ORACLE; - import static org.jooq.SQLDialect.SQLSERVER; - import static org.jooq.SQLDialect.SYBASE; - - import org.jooq.api.annotation.State; - import org.jooq.api.annotation.Transition; - - import java.util.Collection; - - import javax.annotation.Generated; - - /** - * This type is used for the {@link Merge}'s DSL API. - *

- * Example:

-         * DSLContext create = DSL.using(configuration);
-         *
-         * create.mergeInto(table)
-         *       .using(select)
-         *       .on(condition)
-         *       .whenMatchedThenUpdate()
-         *       .set(field1, value1)
-         *       .set(field2, value2)
-         *       .whenNotMatchedThenInsert(field1, field2)
-         *       .values(value1, value2)
-         *       .execute();
-         * 
- * - * @author Lukas Eder - */ - «generatedAnnotation» - @State - public interface MergeNotMatchedStep extends MergeFinalStep { - - /** - * Add the WHEN NOT MATCHED THEN INSERT clause to the - * MERGE statement. - *

- * Unlike the {@link #whenNotMatchedThenInsert(Field...)} and - * {@link #whenNotMatchedThenInsert(Collection)} methods, this will give - * access to a MySQL-like API allowing for - * INSERT SET a = x, b = y syntax. - */ - @Support({ CUBRID, DB2, HSQLDB, ORACLE, SQLSERVER, SYBASE }) - @Transition( - name = "WHEN NOT MATCHED THEN INSERT" - ) - MergeNotMatchedSetStep whenNotMatchedThenInsert(); - «FOR degree : (1..Constants::MAX_ROW_DEGREE)» - - /** - * Add the WHEN NOT MATCHED THEN INSERT clause to the - * MERGE statement - */ - @Support({ CUBRID, DB2, HSQLDB, ORACLE, SQLSERVER, SYBASE }) - <«TN(degree)»> MergeNotMatchedValuesStep«degree» whenNotMatchedThenInsert(«Field_TN_fieldn(degree)»); - «ENDFOR» - - /** - * Add the WHEN NOT MATCHED THEN INSERT clause to the - * MERGE statement - */ - @Support({ CUBRID, DB2, HSQLDB, ORACLE, SQLSERVER, SYBASE }) - @Transition( - name = "WHEN NOT MATCHED THEN INSERT", - args = "Field+" - ) - MergeNotMatchedValuesStepN whenNotMatchedThenInsert(Field... fields); - - /** - * Add the WHEN MATCHED THEN UPDATE clause to the - * MERGE statement - */ - @Support({ CUBRID, DB2, HSQLDB, ORACLE, SQLSERVER, SYBASE }) - @Transition( - name = "WHEN NOT MATCHED THEN INSERT", - args = "Field+" - ) - MergeNotMatchedValuesStepN whenNotMatchedThenInsert(Collection> fields); - } - '''); - - write("org.jooq.MergeNotMatchedStep", out); - } - - def generateMergeNotMatchedValuesStep() { - for (degree : (1..Constants::MAX_ROW_DEGREE)) { - val out = new StringBuilder(); - - out.append(''' - «classHeader» - package org.jooq; - - import static org.jooq.SQLDialect.CUBRID; - import static org.jooq.SQLDialect.DB2; - import static org.jooq.SQLDialect.HSQLDB; - import static org.jooq.SQLDialect.ORACLE; - import static org.jooq.SQLDialect.SQLSERVER; - import static org.jooq.SQLDialect.SYBASE; - - import java.util.Collection; - - import javax.annotation.Generated; - - /** - * This type is used for the {@link Merge}'s DSL API. - *

- * Example:

-             * DSLContext create = DSL.using(configuration);
-             *
-             * create.mergeInto(table)
-             *       .using(select)
-             *       .on(condition)
-             *       .whenMatchedThenUpdate()
-             *       .set(field1, value1)
-             *       .set(field2, value2)
-             *       .whenNotMatchedThenInsert(field1, field2)
-             *       .values(value1, value2)
-             *       .execute();
-             * 
- * - * @author Lukas Eder - */ - «generatedAnnotation» - public interface MergeNotMatchedValuesStep«degree» { - - /** - * Set VALUES for INSERT in the MERGE - * statement's WHEN NOT MATCHED THEN INSERT clause. - */ - @Support({ CUBRID, DB2, HSQLDB, ORACLE, SQLSERVER, SYBASE }) - MergeNotMatchedWhereStep values(«TN_XXXn(degree, "value")»); - - /** - * Set VALUES for INSERT in the MERGE - * statement's WHEN NOT MATCHED THEN INSERT clause. - */ - @Support({ CUBRID, DB2, HSQLDB, ORACLE, SQLSERVER, SYBASE }) - MergeNotMatchedWhereStep values(«Field_TN_XXXn(degree, "value")»); - - /** - * Set VALUES for INSERT in the MERGE - * statement's WHEN NOT MATCHED THEN INSERT clause. - */ - @Support({ CUBRID, DB2, HSQLDB, ORACLE, SQLSERVER, SYBASE }) - MergeNotMatchedWhereStep values(Collection values); - } - '''); - - write("org.jooq.MergeNotMatchedValuesStep" + degree, out); - } - } - - def generateMergeKeyStep() { - for (degree : (1..Constants::MAX_ROW_DEGREE)) { - val out = new StringBuilder(); - - out.append(''' - «classHeader» - package org.jooq; - - import static org.jooq.SQLDialect.CUBRID; - import static org.jooq.SQLDialect.DB2; - import static org.jooq.SQLDialect.H2; - import static org.jooq.SQLDialect.HSQLDB; - import static org.jooq.SQLDialect.ORACLE; - import static org.jooq.SQLDialect.SQLSERVER; - import static org.jooq.SQLDialect.SYBASE; - - import java.util.Collection; - - import javax.annotation.Generated; - - /** - * This type is used for the H2-specific variant of the {@link Merge}'s DSL API. - *

- * Example:

-             * DSLContext create = DSL.using(configuration);
-             *
-             * create.mergeInto(table, «field1_field2_fieldn(degree)»)
-             *       .key(id)
-             *       .values(«XXX1_XXX2_XXXn(degree, "value")»)
-             *       .execute();
-             * 
- * - * @author Lukas Eder - */ - «generatedAnnotation» - public interface MergeKeyStep«degree» extends MergeValuesStep«degree» { - - /** - * Specify an optional KEY clause. - *

- * Use this optional clause in order to override using the underlying - * PRIMARY KEY. - */ - @Support({ CUBRID, DB2, H2, HSQLDB, ORACLE, SQLSERVER, SYBASE }) - MergeValuesStep«degree» key(Field... keys); - - /** - * Specify an optional KEY clause. - *

- * Use this optional clause in order to override using the underlying - * PRIMARY KEY. - */ - @Support({ CUBRID, DB2, H2, HSQLDB, ORACLE, SQLSERVER, SYBASE }) - MergeValuesStep«degree» key(Collection> keys); - } - '''); - - write("org.jooq.MergeKeyStep" + degree, out); - } - } - - def generateMergeValuesStep() { - for (degree : (1..Constants::MAX_ROW_DEGREE)) { - val out = new StringBuilder(); - - out.append(''' - «classHeader» - package org.jooq; - - import static org.jooq.SQLDialect.CUBRID; - import static org.jooq.SQLDialect.DB2; - import static org.jooq.SQLDialect.H2; - import static org.jooq.SQLDialect.HSQLDB; - import static org.jooq.SQLDialect.ORACLE; - import static org.jooq.SQLDialect.SQLSERVER; - import static org.jooq.SQLDialect.SYBASE; - - import java.util.Collection; - - import javax.annotation.Generated; - - /** - * This type is used for the H2-specific variant of the {@link Merge}'s DSL API. - *

- * Example:

-             * using(configuration)
-             *       .mergeInto(table, «field1_field2_fieldn(degree)»)
-             *       .key(id)
-             *       .values(«XXX1_XXX2_XXXn(degree, "value")»)
-             *       .execute();
-             * 
- * - * @author Lukas Eder - */ - «generatedAnnotation» - public interface MergeValuesStep«degree» { - - /** - * Specify a VALUES clause - */ - @Support({ CUBRID, DB2, H2, HSQLDB, ORACLE, SQLSERVER, SYBASE }) - Merge values(«TN_XXXn(degree, "value")»); - - /** - * Specify a VALUES clause - */ - @Support({ CUBRID, DB2, H2, HSQLDB, ORACLE, SQLSERVER, SYBASE }) - Merge values(«Field_TN_XXXn(degree, "value")»); - - /** - * Specify a VALUES clause - */ - @Support({ CUBRID, DB2, H2, HSQLDB, ORACLE, SQLSERVER, SYBASE }) - Merge values(Collection values); - - /** - * Use a SELECT statement as the source of values for the - * MERGE statement - *

- * This variant of the MERGE .. SELECT statement expects a - * select returning exactly as many fields as specified previously in the - * INTO clause: - * {@link DSLContext#mergeInto(Table, «(1..degree).join(', ', [e | 'Field'])»)} - */ - @Support({ CUBRID, DB2, H2, HSQLDB, ORACLE, SQLSERVER, SYBASE }) - Merge select(Select> select); - } - '''); - - write("org.jooq.MergeValuesStep" + degree, out); - } - } - - def generateMergeImplImplements() { - val outKeyStep = new StringBuilder(); - val outNotMatchedValuesStep = new StringBuilder(); - - outKeyStep.append(''' - - «FOR degree : (1..Constants::MAX_ROW_DEGREE)» - MergeKeyStep«degree», - «ENDFOR» - ''') - - outNotMatchedValuesStep.append(''' - - «FOR degree : (1..Constants::MAX_ROW_DEGREE)» - MergeNotMatchedValuesStep«degree», - «ENDFOR» - ''') - - insert("org.jooq.impl.MergeImpl", outKeyStep, "implementsKeyStep"); - insert("org.jooq.impl.MergeImpl", outNotMatchedValuesStep, "implementsNotMatchedValuesStep"); - } - - def generateMergeImplValues() { - val out = new StringBuilder(); - - out.append(''' - - «FOR degree : (1..Constants::MAX_ROW_DEGREE)» - @Override - public final MergeImpl values(«TN_XXXn(degree, "value")») { - return values(new Object[] { «XXXn(degree, "value")» }); - } - - «ENDFOR» - «FOR degree : (1..Constants::MAX_ROW_DEGREE)» - - @Override - public final MergeImpl values(«Field_TN_XXXn(degree, "value")») { - return values(new Field[] { «XXXn(degree, "value")» }); - } - «ENDFOR» - ''') - - insert("org.jooq.impl.MergeImpl", out, "values"); - } - - def generateMergeImplWhenNotMatchedThenInsert() { - val out = new StringBuilder(); - - out.append(''' - - «FOR degree : (1..Constants::MAX_ROW_DEGREE)» - @Override - @SuppressWarnings("hiding") - public final <«TN(degree)»> MergeImpl whenNotMatchedThenInsert(«Field_TN_fieldn(degree)») { - return whenNotMatchedThenInsert(new Field[] { «fieldn(degree)» }); - } - - «ENDFOR» - ''') - - insert("org.jooq.impl.MergeImpl", out, "whenNotMatchedThenInsert"); - } -} \ No newline at end of file diff --git a/jOOQ-tools/src/org/jooq/xtend/Records.xtend b/jOOQ-tools/src/org/jooq/xtend/Records.xtend deleted file mode 100644 index 040c3f560e..0000000000 --- a/jOOQ-tools/src/org/jooq/xtend/Records.xtend +++ /dev/null @@ -1,208 +0,0 @@ -/** - * Copyright (c) 2009-2013, Data Geekery GmbH (http://www.datageekery.com) - * All rights reserved. - * - * This work is dual-licensed - * - under the Apache Software License 2.0 (the "ASL") - * - under the jOOQ License and Maintenance Agreement (the "jOOQ License") - * ============================================================================= - * You may choose which license applies to you: - * - * - If you're using this work with Open Source databases, you may choose - * either ASL or jOOQ License. - * - If you're using this work with at least one commercial database, you must - * choose jOOQ License - * - * For more information, please visit http://www.jooq.org/licenses - * - * Apache Software License 2.0: - * ----------------------------------------------------------------------------- - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * jOOQ License and Maintenance Agreement: - * ----------------------------------------------------------------------------- - * Data Geekery grants the Customer the non-exclusive, timely limited and - * non-transferable license to install and use the Software under the terms of - * the jOOQ License and Maintenance Agreement. - * - * This library is distributed with a LIMITED WARRANTY. See the jOOQ License - * and Maintenance Agreement for more details: http://www.jooq.org/licensing - */ -package org.jooq.xtend - -import org.jooq.Constants - -/** - * @author Lukas Eder - */ -class Records extends Generators { - - def static void main(String[] args) { - val records = new Records(); - records.generateRecords(); - records.generateRecordImpl(); - } - - def generateRecords() { - for (degree : (1..Constants::MAX_ROW_DEGREE)) { - val out = new StringBuilder(); - - out.append(''' - «classHeader» - package org.jooq; - - import javax.annotation.Generated; - - /** - * A model type for a records with degree «degree» - * - * @see Row«degree» - * @author Lukas Eder - */ - «generatedAnnotation» - public interface Record«degree»<«TN(degree)»> extends Record { - - // ------------------------------------------------------------------------ - // Row value expressions - // ------------------------------------------------------------------------ - - /** - * Get this record's fields as a {@link Row«degree»} - */ - @Override - Row«degree»<«TN(degree)»> fieldsRow(); - - /** - * Get this record's values as a {@link Row«degree»} - */ - @Override - Row«degree»<«TN(degree)»> valuesRow(); - - // ------------------------------------------------------------------------ - // Field accessors - // ------------------------------------------------------------------------ - «FOR d : (1..degree)» - - /** - * Get the «first(d)» field - */ - Field field«d»(); - «ENDFOR» - - // ------------------------------------------------------------------------ - // Value accessors - // ------------------------------------------------------------------------ - «FOR d : (1..degree)» - - /** - * Get the «first(d)» value - */ - T«d» value«d»(); - «ENDFOR» - - } - '''); - - write("org.jooq.Record" + degree, out); - } - } - - def generateRecordImpl() { - val out = new StringBuilder(); - - out.append(''' - «classHeader» - package org.jooq.impl; - - import java.util.Collection; - - import javax.annotation.Generated; - - import org.jooq.Field; - import org.jooq.Record; - «FOR degree : (1..Constants::MAX_ROW_DEGREE)» - import org.jooq.Record«degree»; - «ENDFOR» - - /** - * A general purpose record, typically used for ad-hoc types. - *

- * This type implements both the general-purpose, type-unsafe {@link Record} - * interface, as well as the more specific, type-safe {@link Record1}, - * {@link Record2} through {@link Record«Constants::MAX_ROW_DEGREE»} interfaces - * - * @author Lukas Eder - */ - «generatedAnnotation» - @SuppressWarnings({ "unchecked", "rawtypes" }) - class RecordImpl<«TN(Constants::MAX_ROW_DEGREE)»> extends AbstractRecord - implements - - // This record implementation implements all record types. Type-safety is - // being checked through the type-safe API. No need for further checks here - «FOR degree : (1..Constants::MAX_ROW_DEGREE) SEPARATOR ','» - Record«degree»<«TN(degree)»>«IF degree == Constants::MAX_ROW_DEGREE» {«ENDIF» - «ENDFOR» - - /** - * Generated UID - */ - private static final long serialVersionUID = -2201346180421463830L; - - /** - * Create a new general purpose record - */ - public RecordImpl(Field... fields) { - super(fields); - } - - /** - * Create a new general purpose record - */ - public RecordImpl(Collection> fields) { - super(fields); - } - - // ------------------------------------------------------------------------ - // XXX: Type-safe Record APIs - // ------------------------------------------------------------------------ - - @Override - public RowImpl<«TN(Constants::MAX_ROW_DEGREE)»> fieldsRow() { - return fields; - } - - @Override - public final RowImpl<«TN(Constants::MAX_ROW_DEGREE)»> valuesRow() { - return new RowImpl(Utils.fields(intoArray(), fields.fields())); - } - «FOR degree : (1..Constants::MAX_ROW_DEGREE)» - - @Override - public final Field field«degree»() { - return fields.field(«degree - 1»); - } - «ENDFOR» - «FOR degree : (1..Constants::MAX_ROW_DEGREE)» - - @Override - public final T«degree» value«degree»() { - return (T«degree») getValue(«degree - 1»); - } - «ENDFOR» - } - '''); - - write("org.jooq.impl.RecordImpl", out); - } -} \ No newline at end of file diff --git a/jOOQ-tools/src/org/jooq/xtend/Rows.xtend b/jOOQ-tools/src/org/jooq/xtend/Rows.xtend deleted file mode 100644 index 0497b0347b..0000000000 --- a/jOOQ-tools/src/org/jooq/xtend/Rows.xtend +++ /dev/null @@ -1,1982 +0,0 @@ -/** - * Copyright (c) 2009-2013, Data Geekery GmbH (http://www.datageekery.com) - * All rights reserved. - * - * This work is dual-licensed - * - under the Apache Software License 2.0 (the "ASL") - * - under the jOOQ License and Maintenance Agreement (the "jOOQ License") - * ============================================================================= - * You may choose which license applies to you: - * - * - If you're using this work with Open Source databases, you may choose - * either ASL or jOOQ License. - * - If you're using this work with at least one commercial database, you must - * choose jOOQ License - * - * For more information, please visit http://www.jooq.org/licenses - * - * Apache Software License 2.0: - * ----------------------------------------------------------------------------- - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * jOOQ License and Maintenance Agreement: - * ----------------------------------------------------------------------------- - * Data Geekery grants the Customer the non-exclusive, timely limited and - * non-transferable license to install and use the Software under the terms of - * the jOOQ License and Maintenance Agreement. - * - * This library is distributed with a LIMITED WARRANTY. See the jOOQ License - * and Maintenance Agreement for more details: http://www.jooq.org/licensing - */ -package org.jooq.xtend - -import org.jooq.Constants - -/** - * @author Lukas Eder - */ -class Rows extends Generators { - - def static void main(String[] args) { - val rows = new Rows(); - rows.generateRowClasses(); - rows.generateRowImpl(); - } - - def generateRowClasses() { - for (degree : (0..Constants::MAX_ROW_DEGREE)) { - val out = new StringBuilder(); - - val typeSuffix = typeSuffix(degree) - val typeSuffixRaw = typeSuffixRaw(degree) - val recTypeSuffix = recTypeSuffix(degree) - - out.append(''' - «classHeader» - package org.jooq; - - import org.jooq.Comparator; - import org.jooq.api.annotation.State; - - import java.util.Collection; - - import javax.annotation.Generated; - - /** - * A model type for a row value expression with degree «IF degree > 0»«degree»«ELSE»N > «Constants::MAX_ROW_DEGREE»«ENDIF». - *

- * Note: Not all databases support row value expressions, but many row value - * expression operations can be simulated on all databases. See relevant row - * value expression method Javadocs for details. - * - * @author Lukas Eder - */ - «generatedAnnotation» - @State - public interface Row«typeSuffix» extends Row { - «IF degree > 0» - - // ------------------------------------------------------------------------ - // Field accessors - // ------------------------------------------------------------------------ - «FOR d : (1..degree)» - - /** - * Get the «first(d)» field. - */ - Field field«d»(); - «ENDFOR» - «ENDIF» - - // ------------------------------------------------------------------------ - // Generic comparison predicates - // ------------------------------------------------------------------------ - - /** - * Compare this row value expression with another row value expression - * using a dynamic comparator. - *

- * See the explicit comparison methods for details. Note, not all - * {@link Comparator} types are supported - * - * @see #equal(Row«typeSuffixRaw») - * @see #notEqual(Row«typeSuffixRaw») - * @see #lessThan(Row«typeSuffixRaw») - * @see #lessOrEqual(Row«typeSuffixRaw») - * @see #greaterThan(Row«typeSuffixRaw») - * @see #greaterOrEqual(Row«typeSuffixRaw») - */ - @Support - Condition compare(Comparator comparator, Row«typeSuffix» row); - - /** - * Compare this row value expression with a record record - * using a dynamic comparator. - *

- * See the explicit comparison methods for details. Note, not all - * {@link Comparator} types are supported - * - * @see #equal(Row«typeSuffixRaw») - * @see #notEqual(Row«typeSuffixRaw») - * @see #lessThan(Row«typeSuffixRaw») - * @see #lessOrEqual(Row«typeSuffixRaw») - * @see #greaterThan(Row«typeSuffixRaw») - * @see #greaterOrEqual(Row«typeSuffixRaw») - */ - @Support - Condition compare(Comparator comparator, Record«recTypeSuffix» record); - - /** - * Compare this row value expression with another row value expression - * using a dynamic comparator. - *

- * See the explicit comparison methods for details. Note, not all - * {@link Comparator} types are supported - * - * @see #equal(Row«typeSuffixRaw») - * @see #notEqual(Row«typeSuffixRaw») - * @see #lessThan(Row«typeSuffixRaw») - * @see #lessOrEqual(Row«typeSuffixRaw») - * @see #greaterThan(Row«typeSuffixRaw») - * @see #greaterOrEqual(Row«typeSuffixRaw») - */ - @Support - Condition compare(Comparator comparator, «TN_tn(degree)»); - - /** - * Compare this row value expression with another row value expression - * using a dynamic comparator. - *

- * See the explicit comparison methods for details. Note, not all - * {@link Comparator} types are supported - * - * @see #equal(Row«typeSuffixRaw») - * @see #notEqual(Row«typeSuffixRaw») - * @see #lessThan(Row«typeSuffixRaw») - * @see #lessOrEqual(Row«typeSuffixRaw») - * @see #greaterThan(Row«typeSuffixRaw») - * @see #greaterOrEqual(Row«typeSuffixRaw») - */ - @Support - Condition compare(Comparator comparator, «Field_TN_tn(degree)»); - - // ------------------------------------------------------------------------ - // Equal / Not equal comparison predicates - // ------------------------------------------------------------------------ - - /** - * Compare this row value expression with another row value expression for - * equality. - *

- * Row equality comparison predicates can be simulated in those databases - * that do not support such predicates natively: - * (A, B) = (1, 2) is equivalent to - * A = 1 AND B = 2 - */ - @Support - Condition equal(Row«typeSuffix» row); - - /** - * Compare this row value expression with a record for equality. - * - * @see #equal(Row«typeSuffixRaw») - */ - @Support - Condition equal(Record«recTypeSuffix» record); - - /** - * Compare this row value expression with another row value expression for - * equality. - * - * @see #equal(Row«typeSuffixRaw») - */ - @Support - Condition equal(«TN_tn(degree)»); - - /** - * Compare this row value expression with another row value expression for - * equality. - * - * @see #equal(Row«typeSuffixRaw») - */ - @Support - Condition equal(«Field_TN_tn(degree)»); - - /** - * Compare this row value expression with a subselect for equality. - * - * @see #equal(Row«typeSuffixRaw») - */ - @Support - Condition equal(Select select); - - /** - * Compare this row value expression with another row value expression for - * equality. - * - * @see #equal(Row«typeSuffixRaw») - */ - @Support - Condition eq(Row«typeSuffix» row); - - /** - * Compare this row value expression with a record for equality. - * - * @see #equal(Row«typeSuffixRaw») - */ - @Support - Condition eq(Record«recTypeSuffix» record); - - /** - * Compare this row value expression with another row value expression for - * equality. - * - * @see #equal(Row«typeSuffixRaw») - */ - @Support - Condition eq(«TN_tn(degree)»); - - /** - * Compare this row value expression with another row value expression for - * equality. - * - * @see #equal(Row«typeSuffixRaw») - */ - @Support - Condition eq(«Field_TN_tn(degree)»); - - /** - * Compare this row value expression with a subselect for equality. - * - * @see #equal(Row«typeSuffixRaw») - */ - @Support - Condition eq(Select select); - - /** - * Compare this row value expression with another row value expression for - * non-equality. - *

- * Row non-equality comparison predicates can be simulated in those - * databases that do not support such predicates natively: - * (A, B) <> (1, 2) is equivalent to - * NOT(A = 1 AND B = 2) - */ - @Support - Condition notEqual(Row«typeSuffix» row); - - /** - * Compare this row value expression with a record for non-equality - * - * @see #notEqual(Row«typeSuffixRaw») - */ - @Support - Condition notEqual(Record«recTypeSuffix» record); - - /** - * Compare this row value expression with another row value expression for. - * non-equality - * - * @see #notEqual(Row«typeSuffixRaw») - */ - @Support - Condition notEqual(«TN_tn(degree)»); - - /** - * Compare this row value expression with another row value expression for - * non-equality. - * - * @see #notEqual(Row«typeSuffixRaw») - */ - @Support - Condition notEqual(«Field_TN_tn(degree)»); - - /** - * Compare this row value expression with a subselect for non-equality. - * - * @see #notEqual(Row«typeSuffixRaw») - */ - @Support - Condition notEqual(Select select); - - /** - * Compare this row value expression with another row value expression for - * non-equality. - * - * @see #notEqual(Row«typeSuffixRaw») - */ - @Support - Condition ne(Row«typeSuffix» row); - - /** - * Compare this row value expression with a record for non-equality. - * - * @see #notEqual(Row«typeSuffixRaw») - */ - @Support - Condition ne(Record«recTypeSuffix» record); - - /** - * Compare this row value expression with another row value expression for - * non-equality. - * - * @see #notEqual(Row«typeSuffixRaw») - */ - @Support - Condition ne(«TN_tn(degree)»); - - /** - * Compare this row value expression with another row value expression for - * non-equality. - * - * @see #notEqual(Row«typeSuffixRaw») - */ - @Support - Condition ne(«Field_TN_tn(degree)»); - - /** - * Compare this row value expression with a subselect for non-equality. - * - * @see #notEqual(Row«typeSuffixRaw») - */ - @Support - Condition ne(Select select); - - // ------------------------------------------------------------------------ - // Ordering comparison predicates - // ------------------------------------------------------------------------ - - /** - * Compare this row value expression with another row value expression for - * order. - *

- * Row order comparison predicates can be simulated in those - * databases that do not support such predicates natively: - * (A, B, C) < (1, 2, 3) is equivalent to - * A < 1 OR (A = 1 AND B < 2) OR (A = 1 AND B = 2 AND C < 3) - */ - @Support - Condition lessThan(Row«typeSuffix» row); - - /** - * Compare this row value expression with a record for order. - * - * @see #lessThan(Row«typeSuffixRaw») - */ - @Support - Condition lessThan(Record«recTypeSuffix» record); - - /** - * Compare this row value expression with another row value expression for - * order. - * - * @see #lessThan(Row«typeSuffixRaw») - */ - @Support - Condition lessThan(«TN_tn(degree)»); - - /** - * Compare this row value expression with another row value expression for - * order. - * - * @see #lessThan(Row«typeSuffixRaw») - */ - @Support - Condition lessThan(«Field_TN_tn(degree)»); - - /** - * Compare this row value expression with a subselect for order. - * - * @see #lessThan(Row«typeSuffixRaw») - */ - @Support - Condition lessThan(Select select); - - /** - * Compare this row value expression with another row value expression for - * order. - * - * @see #lessThan(Row«typeSuffixRaw») - */ - @Support - Condition lt(Row«typeSuffix» row); - - /** - * Compare this row value expression with a record for order. - * - * @see #lessThan(Row«typeSuffixRaw») - */ - @Support - Condition lt(Record«recTypeSuffix» record); - - /** - * Compare this row value expression with another row value expression for - * order. - * - * @see #lessThan(Row«typeSuffixRaw») - */ - @Support - Condition lt(«TN_tn(degree)»); - - /** - * Compare this row value expression with another row value expression for - * order. - * - * @see #lessThan(Row«typeSuffixRaw») - */ - @Support - Condition lt(«Field_TN_tn(degree)»); - - /** - * Compare this row value expression with a subselect for order. - * - * @see #lessThan(Row«typeSuffixRaw») - */ - @Support - Condition lt(Select select); - - /** - * Compare this row value expression with another row value expression for - * order. - *

- * Row order comparison predicates can be simulated in those - * databases that do not support such predicates natively: - * (A, B) <= (1, 2) is equivalent to - * A < 1 OR (A = 1 AND B < 2) OR (A = 1 AND B = 2) - */ - @Support - Condition lessOrEqual(Row«typeSuffix» row); - - /** - * Compare this row value expression with a record for order. - * - * @see #lessOrEqual(Row«typeSuffixRaw») - */ - @Support - Condition lessOrEqual(Record«recTypeSuffix» record); - - /** - * Compare this row value expression with another row value expression for - * order. - * - * @see #lessOrEqual(Row«typeSuffixRaw») - */ - @Support - Condition lessOrEqual(«TN_tn(degree)»); - - /** - * Compare this row value expression with another row value expression for - * order. - * - * @see #lessOrEqual(Row«typeSuffixRaw») - */ - @Support - Condition lessOrEqual(«Field_TN_tn(degree)»); - - /** - * Compare this row value expression with a subselect for order. - * - * @see #lessOrEqual(Row«typeSuffixRaw») - */ - @Support - Condition lessOrEqual(Select select); - - /** - * Compare this row value expression with another row value expression for - * order. - * - * @see #lessOrEqual(Row«typeSuffixRaw») - */ - @Support - Condition le(Row«typeSuffix» row); - - /** - * Compare this row value expression with a record for order. - * - * @see #lessOrEqual(Row«typeSuffixRaw») - */ - @Support - Condition le(Record«recTypeSuffix» record); - - /** - * Compare this row value expression with another row value expression for - * order. - * - * @see #lessOrEqual(Row«typeSuffixRaw») - */ - @Support - Condition le(«TN_tn(degree)»); - - /** - * Compare this row value expression with another row value expression for - * order. - * - * @see #lessOrEqual(Row«typeSuffixRaw») - */ - @Support - Condition le(«Field_TN_tn(degree)»); - - /** - * Compare this row value expression with a subselect for order. - * - * @see #lessOrEqual(Row«typeSuffixRaw») - */ - @Support - Condition le(Select select); - - /** - * Compare this row value expression with another row value expression for - * order. - *

- * Row order comparison predicates can be simulated in those - * databases that do not support such predicates natively: - * (A, B, C) > (1, 2, 3) is equivalent to - * A > 1 OR (A = 1 AND B > 2) OR (A = 1 AND B = 2 AND C > 3) - */ - @Support - Condition greaterThan(Row«typeSuffix» row); - - /** - * Compare this row value expression with a record for order. - * - * @see #greaterThan(Row«typeSuffixRaw») - */ - @Support - Condition greaterThan(Record«recTypeSuffix» record); - - /** - * Compare this row value expression with another row value expression for - * order. - * - * @see #greaterThan(Row«typeSuffixRaw») - */ - @Support - Condition greaterThan(«TN_tn(degree)»); - - /** - * Compare this row value expression with another row value expression for - * order. - * - * @see #greaterThan(Row«typeSuffixRaw») - */ - @Support - Condition greaterThan(«Field_TN_tn(degree)»); - - /** - * Compare this row value expression with a subselect for order. - * - * @see #greaterThan(Row«typeSuffixRaw») - */ - @Support - Condition greaterThan(Select select); - - /** - * Compare this row value expression with another row value expression for - * order. - * - * @see #greaterThan(Row«typeSuffixRaw») - */ - @Support - Condition gt(Row«typeSuffix» row); - - /** - * Compare this row value expression with a record for order. - * - * @see #greaterThan(Row«typeSuffixRaw») - */ - @Support - Condition gt(Record«recTypeSuffix» record); - - /** - * Compare this row value expression with another row value expression for - * order. - * - * @see #greaterThan(Row«typeSuffixRaw») - */ - @Support - Condition gt(«TN_tn(degree)»); - - /** - * Compare this row value expression with another row value expression for - * order. - * - * @see #greaterThan(Row«typeSuffixRaw») - */ - @Support - Condition gt(«Field_TN_tn(degree)»); - - /** - * Compare this row value expression with a subselect for order. - * - * @see #greaterThan(Row«typeSuffixRaw») - */ - @Support - Condition gt(Select select); - - /** - * Compare this row value expression with another row value expression for - * order. - *

- * Row order comparison predicates can be simulated in those - * databases that do not support such predicates natively: - * (A, B) >= (1, 2) is equivalent to - * A > 1 OR (A = 1 AND B > 2) OR (A = 1 AND B = 2) - */ - @Support - Condition greaterOrEqual(Row«typeSuffix» row); - - /** - * Compare this row value expression with a record for order. - * - * @see #greaterOrEqual(Row«typeSuffixRaw») - */ - @Support - Condition greaterOrEqual(Record«recTypeSuffix» record); - - /** - * Compare this row value expression with another row value expression for - * order. - * - * @see #greaterOrEqual(Row«typeSuffixRaw») - */ - @Support - Condition greaterOrEqual(«TN_tn(degree)»); - - /** - * Compare this row value expression with another row value expression for - * order. - * - * @see #greaterOrEqual(Row«typeSuffixRaw») - */ - @Support - Condition greaterOrEqual(«Field_TN_tn(degree)»); - - /** - * Compare this row value expression with a subselect for order. - * - * @see #greaterOrEqual(Row«typeSuffixRaw») - */ - @Support - Condition greaterOrEqual(Select select); - - /** - * Compare this row value expression with another row value expression for - * order. - * - * @see #greaterOrEqual(Row«typeSuffixRaw») - */ - @Support - Condition ge(Row«typeSuffix» row); - - /** - * Compare this row value expression with a record for order. - * - * @see #greaterOrEqual(Row«typeSuffixRaw») - */ - @Support - Condition ge(Record«recTypeSuffix» record); - - /** - * Compare this row value expression with another row value expression for - * order. - * - * @see #greaterOrEqual(Row«typeSuffixRaw») - */ - @Support - Condition ge(«TN_tn(degree)»); - - /** - * Compare this row value expression with another row value expression for - * order. - * - * @see #greaterOrEqual(Row«typeSuffixRaw») - */ - @Support - Condition ge(«Field_TN_tn(degree)»); - - /** - * Compare this row value expression with a subselect for order. - * - * @see #greaterOrEqual(Row«typeSuffixRaw») - */ - @Support - Condition ge(Select select); - - // ------------------------------------------------------------------------ - // [NOT] BETWEEN predicates - // ------------------------------------------------------------------------ - - /** - * Check if this row value expression is within a range of two other row - * value expressions. - * - * @see #between(Row«typeSuffixRaw», Row«typeSuffixRaw») - */ - @Support - BetweenAndStep«typeSuffix» between(«TN_XXXn(degree, "minValue")»); - - /** - * Check if this row value expression is within a range of two other row - * value expressions. - * - * @see #between(Row«typeSuffixRaw», Row«typeSuffixRaw») - */ - @Support - BetweenAndStep«typeSuffix» between(«Field_TN_XXXn(degree, "minValue")»); - - /** - * Check if this row value expression is within a range of two other row - * value expressions. - * - * @see #between(Row«typeSuffixRaw», Row«typeSuffixRaw») - */ - @Support - BetweenAndStep«typeSuffix» between(Row«typeSuffix» minValue); - - /** - * Check if this row value expression is within a range of two records. - * - * @see #between(Row«typeSuffixRaw», Row«typeSuffixRaw») - */ - @Support - BetweenAndStep«typeSuffix» between(Record«recTypeSuffix» minValue); - - /** - * Check if this row value expression is within a range of two other row - * value expressions. - *

- * This is the same as calling between(minValue).and(maxValue) - *

- * The expression A BETWEEN B AND C is equivalent to the - * expression A >= B AND A <= C for those SQL dialects that do - * not properly support the BETWEEN predicate for row value - * expressions - */ - @Support - Condition between(Row«typeSuffix» minValue, - Row«typeSuffix» maxValue); - - /** - * Check if this row value expression is within a range of two records. - *

- * This is the same as calling between(minValue).and(maxValue) - * - * @see #between(Row«typeSuffixRaw», Row«typeSuffixRaw») - */ - @Support - Condition between(Record«recTypeSuffix» minValue, - Record«recTypeSuffix» maxValue); - - /** - * Check if this row value expression is within a symmetric range of two - * other row value expressions. - * - * @see #betweenSymmetric(Row«typeSuffixRaw», Row«typeSuffixRaw») - */ - @Support - BetweenAndStep«typeSuffix» betweenSymmetric(«TN_XXXn(degree, "minValue")»); - - /** - * Check if this row value expression is within a symmetric range of two - * other row value expressions. - * - * @see #betweenSymmetric(Row«typeSuffixRaw», Row«typeSuffixRaw») - */ - @Support - BetweenAndStep«typeSuffix» betweenSymmetric(«Field_TN_XXXn(degree, "minValue")»); - - /** - * Check if this row value expression is within a symmetric range of two - * other row value expressions. - * - * @see #betweenSymmetric(Row«typeSuffixRaw», Row«typeSuffixRaw») - */ - @Support - BetweenAndStep«typeSuffix» betweenSymmetric(Row«typeSuffix» minValue); - - /** - * Check if this row value expression is within a symmetric range of two - * records. - * - * @see #betweenSymmetric(Row«typeSuffixRaw», Row«typeSuffixRaw») - */ - @Support - BetweenAndStep«typeSuffix» betweenSymmetric(Record«recTypeSuffix» minValue); - - /** - * Check if this row value expression is within a symmetric range of two - * other row value expressions. - *

- * This is the same as calling betweenSymmetric(minValue).and(maxValue) - *

- * The expression A BETWEEN SYMMETRIC B AND C is equivalent to - * the expression (A >= B AND A <= C) OR (A >= C AND A <= B) - * for those SQL dialects that do not properly support the - * BETWEEN predicate for row value expressions - */ - @Support - Condition betweenSymmetric(Row«typeSuffix» minValue, - Row«typeSuffix» maxValue); - - /** - * Check if this row value expression is within a symmetric range of two - * records. - *

- * This is the same as calling betweenSymmetric(minValue).and(maxValue) - * - * @see #betweenSymmetric(Row«typeSuffixRaw», Row«typeSuffixRaw») - */ - @Support - Condition betweenSymmetric(Record«recTypeSuffix» minValue, - Record«recTypeSuffix» maxValue); - - /** - * Check if this row value expression is not within a range of two other - * row value expressions. - * - * @see #between(Row«typeSuffixRaw», Row«typeSuffixRaw») - */ - @Support - BetweenAndStep«typeSuffix» notBetween(«TN_XXXn(degree, "minValue")»); - - /** - * Check if this row value expression is not within a range of two other - * row value expressions. - * - * @see #notBetween(Row«typeSuffixRaw», Row«typeSuffixRaw») - */ - @Support - BetweenAndStep«typeSuffix» notBetween(«Field_TN_XXXn(degree, "minValue")»); - - /** - * Check if this row value expression is not within a range of two other - * row value expressions. - * - * @see #notBetween(Row«typeSuffixRaw», Row«typeSuffixRaw») - */ - @Support - BetweenAndStep«typeSuffix» notBetween(Row«typeSuffix» minValue); - - /** - * Check if this row value expression is within a range of two records. - * - * @see #notBetween(Row«typeSuffixRaw», Row«typeSuffixRaw») - */ - @Support - BetweenAndStep«typeSuffix» notBetween(Record«recTypeSuffix» minValue); - - /** - * Check if this row value expression is not within a range of two other - * row value expressions. - *

- * This is the same as calling notBetween(minValue).and(maxValue) - *

- * The expression A NOT BETWEEN B AND C is equivalent to the - * expression A < B OR A > C for those SQL dialects that do - * not properly support the BETWEEN predicate for row value - * expressions - */ - @Support - Condition notBetween(Row«typeSuffix» minValue, - Row«typeSuffix» maxValue); - - /** - * Check if this row value expression is within a range of two records. - *

- * This is the same as calling notBetween(minValue).and(maxValue) - * - * @see #notBetween(Row«typeSuffixRaw», Row«typeSuffixRaw») - */ - @Support - Condition notBetween(Record«recTypeSuffix» minValue, - Record«recTypeSuffix» maxValue); - - /** - * Check if this row value expression is not within a symmetric range of two - * other row value expressions. - * - * @see #notBetweenSymmetric(Row«typeSuffixRaw», Row«typeSuffixRaw») - */ - @Support - BetweenAndStep«typeSuffix» notBetweenSymmetric(«TN_XXXn(degree, "minValue")»); - - /** - * Check if this row value expression is not within a symmetric range of two - * other row value expressions. - * - * @see #notBetweenSymmetric(Row«typeSuffixRaw», Row«typeSuffixRaw») - */ - @Support - BetweenAndStep«typeSuffix» notBetweenSymmetric(«Field_TN_XXXn(degree, "minValue")»); - - /** - * Check if this row value expression is not within a symmetric range of two - * other row value expressions. - * - * @see #notBetweenSymmetric(Row«typeSuffixRaw», Row«typeSuffixRaw») - */ - @Support - BetweenAndStep«typeSuffix» notBetweenSymmetric(Row«typeSuffix» minValue); - - /** - * Check if this row value expression is not within a symmetric range of two - * records. - * - * @see #notBetweenSymmetric(Row«typeSuffixRaw», Row«typeSuffixRaw») - */ - @Support - BetweenAndStep«typeSuffix» notBetweenSymmetric(Record«recTypeSuffix» minValue); - - /** - * Check if this row value expression is not within a symmetric range of two - * other row value expressions. - *

- * This is the same as calling notBetweenSymmetric(minValue).and(maxValue) - *

- * The expression A NOT BETWEEN SYMMETRIC B AND C is equivalent - * to the expression (A < B OR A > C) AND (A < C OR A > B) for - * those SQL dialects that do not properly support the BETWEEN - * predicate for row value expressions - */ - @Support - Condition notBetweenSymmetric(Row«typeSuffix» minValue, - Row«typeSuffix» maxValue); - - /** - * Check if this row value expression is not within a symmetric range of two - * records. - *

- * This is the same as calling notBetweenSymmetric(minValue).and(maxValue) - * - * @see #notBetweenSymmetric(Row«typeSuffixRaw», Row«typeSuffixRaw») - */ - @Support - Condition notBetweenSymmetric(Record«recTypeSuffix» minValue, - Record«recTypeSuffix» maxValue); - - // ------------------------------------------------------------------------ - // [NOT] DISTINCT predicates - // ------------------------------------------------------------------------ - -««« /** -««« * Compare this row value expression with another row value expression for -««« * distinctness. -««« */ -««« @Support -««« Condition isDistinctFrom(Row«typeSuffix» row); -««« -««« /** -««« * Compare this row value expression with a record for distinctness. -««« * -««« * @see #isDistinctFrom(Row«typeSuffixRaw») -««« */ -««« @Support -««« Condition isDistinctFrom(Record«recTypeSuffix» record); -««« -««« /** -««« * Compare this row value expression with another row value expression for -««« * distinctness. -««« * -««« * @see #isDistinctFrom(Row«typeSuffixRaw») -««« */ -««« @Support -««« Condition isDistinctFrom(«TN_tn(degree)»); -««« -««« /** -««« * Compare this row value expression with another row value expression for -««« * distinctness. -««« * -««« * @see #isDistinctFrom(Row«typeSuffixRaw») -««« */ -««« @Support -««« Condition isDistinctFrom(«Field_TN_tn(degree)»); -««« -««« /** -««« * Compare this row value expression with another row value expression for -««« * non-distinctness. -««« */ -««« @Support -««« Condition isNotDistinctFrom(Row«typeSuffix» row); -««« -««« /** -««« * Compare this row value expression with a record for non-distinctness. -««« * -««« * @see #isNotDistinctFrom(Row«typeSuffixRaw») -««« */ -««« @Support -««« Condition isNotDistinctFrom(Record«recTypeSuffix» record); -««« -««« /** -««« * Compare this row value expression with another row value expression for -««« * non-distinctness. -««« * -««« * @see #isNotDistinctFrom(Row«typeSuffixRaw») -««« */ -««« @Support -««« Condition isNotDistinctFrom(«TN_tn(degree)»); -««« -««« /** -««« * Compare this row value expression with another row value expression for -««« * non-distinctness. -««« * -««« * @see #isNotDistinctFrom(Row«typeSuffixRaw») -««« */ -««« @Support -««« Condition isNotDistinctFrom(«Field_TN_tn(degree)»); - - // ------------------------------------------------------------------------ - // [NOT] IN predicates - // ------------------------------------------------------------------------ - - /** - * Compare this row value expression with a set of row value expressions for - * equality. - *

- * Row IN predicates can be simulated in those databases that do not support - * such predicates natively: (A, B) IN ((1, 2), (3, 4)) is - * equivalent to ((A, B) = (1, 2)) OR ((A, B) = (3, 4)), which - * is equivalent to (A = 1 AND B = 2) OR (A = 3 AND B = 4) - */ - @Support - Condition in(Collection rows); - - /** - * Compare this row value expression with a set of row value expressions for - * equality. - * - * @see #in(Collection) - */ - @Support - Condition in(Row«typeSuffix»... rows); - - /** - * Compare this row value expression with a set of records for equality. - * - * @see #in(Collection) - */ - @Support - Condition in(Record«recTypeSuffix»... record); - - /** - * Compare this row value expression with a subselect for equality. - * - * @see #in(Collection) - */ - @Support - Condition in(Select select); - - /** - * Compare this row value expression with a set of row value expressions for - * equality. - *

- * Row NOT IN predicates can be simulated in those databases that do not - * support such predicates natively: - * (A, B) NOT IN ((1, 2), (3, 4)) is equivalent to - * NOT(((A, B) = (1, 2)) OR ((A, B) = (3, 4))), which is - * equivalent to NOT((A = 1 AND B = 2) OR (A = 3 AND B = 4)) - */ - @Support - Condition notIn(Collection rows); - - /** - * Compare this row value expression with a set of row value expressions for - * equality. - * - * @see #notIn(Collection) - */ - @Support - Condition notIn(Row«typeSuffix»... rows); - - /** - * Compare this row value expression with a set of records for non-equality. - * - * @see #notIn(Collection) - */ - @Support - Condition notIn(Record«recTypeSuffix»... record); - - /** - * Compare this row value expression with a subselect for non-equality. - * - * @see #notIn(Collection) - */ - @Support - Condition notIn(Select select); - - «IF degree == 2» - // ------------------------------------------------------------------------ - // Row2-specific OVERLAPS predicate - // ------------------------------------------------------------------------ - - /** - * Check if this row value expression overlaps another row value expression. - *

- * The SQL standard specifies a temporal OVERLAPS predicate, - * which comes in two flavours: - *

    - *
  • (DATE, DATE) OVERLAPS (DATE, DATE)
  • - *
  • (DATE, INTERVAL) OVERLAPS (DATE, INTERVAL)
  • - *
- *

- * jOOQ also supports arbitrary 2-degree row value expression comparisons, - * by simulating them as such

-                 * -- This predicate
-                 * (A, B) OVERLAPS (C, D)
-                 *
-                 * -- can be simulated as such
-                 * (C <= B) AND (A <= D)
-                 * 
- */ - @Support - Condition overlaps(T1 t1, T2 t2); - - /** - * Check if this row value expression overlaps another row value expression. - *

- * The SQL standard specifies a temporal OVERLAPS predicate, - * which comes in two flavours: - *

    - *
  • (DATE, DATE) OVERLAPS (DATE, DATE)
  • - *
  • (DATE, INTERVAL) OVERLAPS (DATE, INTERVAL)
  • - *
- *

- * jOOQ also supports arbitrary 2-degree row value expression comparisons, - * by simulating them as such

-                 * -- This predicate
-                 * (A, B) OVERLAPS (C, D)
-                 *
-                 * -- can be simulated as such
-                 * (C <= B) AND (A <= D)
-                 * 
- */ - @Support - Condition overlaps(Field t1, Field t2); - - /** - * Check if this row value expression overlaps another row value expression. - *

- * The SQL standard specifies a temporal OVERLAPS predicate, - * which comes in two flavours: - *

    - *
  • (DATE, DATE) OVERLAPS (DATE, DATE)
  • - *
  • (DATE, INTERVAL) OVERLAPS (DATE, INTERVAL)
  • - *
- *

- * jOOQ also supports arbitrary 2-degree row value expression comparisons, - * by simulating them as such

-                 * -- This predicate
-                 * (A, B) OVERLAPS (C, D)
-                 *
-                 * -- can be simulated as such
-                 * (C <= B) AND (A <= D)
-                 * 
- */ - @Support - Condition overlaps(Row2 row); - - «ENDIF» - } - '''); - - write("org.jooq.Row" + degreeOrN(degree), out); - } - } - - def generateRowImpl() { - val out = new StringBuilder(); - - out.append(''' - «classHeader» - package org.jooq.impl; - - import static org.jooq.Clause.FIELD_ROW; - import static org.jooq.impl.DSL.row; - - import java.util.Arrays; - import java.util.Collection; - - import javax.annotation.Generated; - - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - import org.jooq.BetweenAndStep«typeSuffixRaw(degree)»; - «ENDFOR» - import org.jooq.BindContext; - import org.jooq.Clause; - import org.jooq.Comparator; - import org.jooq.Condition; - import org.jooq.Context; - import org.jooq.DataType; - import org.jooq.Field; - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - import org.jooq.Record«recTypeSuffixRaw(degree)»; - «ENDFOR» - import org.jooq.RenderContext; - import org.jooq.Row; - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - import org.jooq.Row«typeSuffixRaw(degree)»; - «ENDFOR» - import org.jooq.Select; - - /** - * @author Lukas Eder - */ - «generatedAnnotation» - @SuppressWarnings({ "rawtypes", "unchecked" }) - class RowImpl<«TN(Constants::MAX_ROW_DEGREE)»> extends AbstractQueryPart - implements - - // This row implementation implements all row types. Type-safety is - // being checked through the type-safe API. No need for further checks here - «FOR degree : (0..Constants::MAX_ROW_DEGREE) SEPARATOR ','» - Row«typeSuffix(degree)» - «ENDFOR» - { - - /** - * Generated UID - */ - private static final long serialVersionUID = -929427349071556318L; - private static final Clause[] CLAUSES = { FIELD_ROW }; - - final Fields fields; - - RowImpl(Field... fields) { - this(new Fields(fields)); - } - - RowImpl(Collection> fields) { - this(new Fields(fields)); - } - - RowImpl(Fields fields) { - super(); - - this.fields = fields; - } - - // ------------------------------------------------------------------------ - // XXX: QueryPart API - // ------------------------------------------------------------------------ - - @Override - public final void toSQL(RenderContext context) { - context.sql("("); - - String separator = ""; - for (Field field : fields.fields) { - context.sql(separator); - context.visit(field); - - separator = ", "; - } - - context.sql(")"); - } - - @Override - public final void bind(BindContext context) { - context.visit(fields); - } - - @Override - public final Clause[] clauses(Context ctx) { - return CLAUSES; - } - - // ------------------------------------------------------------------------ - // XXX: Row accessor API - // ------------------------------------------------------------------------ - - @Override - public final int size() { - return fields.size(); - } - - @Override - public final Field field(Field field) { - return fields.field(field); - } - - @Override - public final Field field(String name) { - return fields.field(name); - } - - @Override - public final Field field(int index) { - return fields.field(index); - } - - @Override - public final Field[] fields() { - return fields.fields(); - } - - @Override - public final Field[] fields(Field... f) { - return fields.fields(f); - } - - @Override - public final Field[] fields(String... fieldNames) { - return fields.fields(fieldNames); - } - - @Override - public final Field[] fields(int... fieldIndexes) { - return fields.fields(fieldIndexes); - } - - @Override - public final int indexOf(Field field) { - return fields.indexOf(field); - } - - @Override - public final int indexOf(String fieldName) { - return fields.indexOf(fieldName); - } - - @Override - public final Class[] types() { - return fields.types(); - } - - @Override - public final Class type(int fieldIndex) { - return fields.type(fieldIndex); - } - - @Override - public final Class type(String fieldName) { - return fields.type(fieldName); - } - - @Override - public final DataType[] dataTypes() { - return fields.dataTypes(); - } - - @Override - public final DataType dataType(int fieldIndex) { - return fields.dataType(fieldIndex); - } - - @Override - public final DataType dataType(String fieldName) { - return fields.dataType(fieldName); - } - «FOR degree : (1..Constants::MAX_ROW_DEGREE)» - - @Override - public final Field field«degree»() { - return fields.field(«degree - 1»); - } - «ENDFOR» - - // ------------------------------------------------------------------------ - // [NOT] NULL predicates - // ------------------------------------------------------------------------ - - @Override - public final Condition isNull() { - return new RowIsNull(this, true); - } - - @Override - public final Condition isNotNull() { - return new RowIsNull(this, false); - } - - // ------------------------------------------------------------------------ - // Generic comparison predicates - // ------------------------------------------------------------------------ - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition compare(Comparator comparator, Row«typeSuffix(degree)» row) { - return new RowCondition(this, row, comparator); - } - «ENDFOR» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition compare(Comparator comparator, Record«recTypeSuffix(degree)» record) { - return new RowCondition(this, record.valuesRow(), comparator); - } - «ENDFOR» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition compare(Comparator comparator, «TN_tn(degree)») { - return compare(comparator, row(«tn(degree)»)); - } - «ENDFOR» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition compare(Comparator comparator, «Field_TN_tn(degree)») { - return compare(comparator, row(«tn(degree)»)); - } - «ENDFOR» - - // ------------------------------------------------------------------------ - // Equal / Not equal comparison predicates - // ------------------------------------------------------------------------ - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition equal(Row«typeSuffix(degree)» row) { - return compare(Comparator.EQUALS, row); - } - «ENDFOR» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition equal(Record«recTypeSuffix(degree)» record) { - return compare(Comparator.EQUALS, record); - } - «ENDFOR» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition equal(«TN_tn(degree)») { - return compare(Comparator.EQUALS, «tn(degree)»); - } - «ENDFOR» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition equal(«Field_TN_tn(degree)») { - return compare(Comparator.EQUALS, «tn(degree)»); - } - «ENDFOR» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition eq(Row«typeSuffix(degree)» row) { - return equal(row); - } - «ENDFOR» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition eq(Record«recTypeSuffix(degree)» record) { - return equal(record); - } - «ENDFOR» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition eq(«TN_tn(degree)») { - return equal(«tn(degree)»); - } - «ENDFOR» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition eq(«Field_TN_tn(degree)») { - return equal(«tn(degree)»); - } - «ENDFOR» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition notEqual(Row«typeSuffix(degree)» row) { - return compare(Comparator.NOT_EQUALS, row); - } - «ENDFOR» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition notEqual(Record«recTypeSuffix(degree)» record) { - return compare(Comparator.NOT_EQUALS, record); - } - «ENDFOR» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition notEqual(«TN_tn(degree)») { - return compare(Comparator.NOT_EQUALS, «tn(degree)»); - } - «ENDFOR» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition notEqual(«Field_TN_tn(degree)») { - return compare(Comparator.NOT_EQUALS, «tn(degree)»); - } - «ENDFOR» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition ne(Row«typeSuffix(degree)» row) { - return notEqual(row); - } - «ENDFOR» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition ne(Record«recTypeSuffix(degree)» record) { - return notEqual(record); - } - «ENDFOR» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition ne(«TN_tn(degree)») { - return notEqual(«tn(degree)»); - } - «ENDFOR» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition ne(«Field_TN_tn(degree)») { - return notEqual(«tn(degree)»); - } - «ENDFOR» - - // ------------------------------------------------------------------------ - // Ordering comparison predicates - // ------------------------------------------------------------------------ - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition lessThan(Row«typeSuffix(degree)» row) { - return compare(Comparator.LESS, row); - } - «ENDFOR» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition lessThan(Record«recTypeSuffix(degree)» record) { - return compare(Comparator.LESS, record); - } - «ENDFOR» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition lessThan(«TN_tn(degree)») { - return compare(Comparator.LESS, «tn(degree)»); - } - «ENDFOR» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition lessThan(«Field_TN_tn(degree)») { - return compare(Comparator.LESS, «tn(degree)»); - } - «ENDFOR» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition lt(Row«typeSuffix(degree)» row) { - return lessThan(row); - } - «ENDFOR» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition lt(Record«recTypeSuffix(degree)» record) { - return lessThan(record); - } - «ENDFOR» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition lt(«TN_tn(degree)») { - return lessThan(«tn(degree)»); - } - «ENDFOR» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition lt(«Field_TN_tn(degree)») { - return lessThan(«tn(degree)»); - } - «ENDFOR» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition lessOrEqual(Row«typeSuffix(degree)» row) { - return compare(Comparator.LESS_OR_EQUAL, row); - } - «ENDFOR» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition lessOrEqual(Record«recTypeSuffix(degree)» record) { - return compare(Comparator.LESS_OR_EQUAL, record); - } - «ENDFOR» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition lessOrEqual(«TN_tn(degree)») { - return compare(Comparator.LESS_OR_EQUAL, «tn(degree)»); - } - «ENDFOR» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition lessOrEqual(«Field_TN_tn(degree)») { - return compare(Comparator.LESS_OR_EQUAL, «tn(degree)»); - } - «ENDFOR» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition le(Row«typeSuffix(degree)» row) { - return lessOrEqual(row); - } - «ENDFOR» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition le(Record«recTypeSuffix(degree)» record) { - return lessOrEqual(record); - } - «ENDFOR» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition le(«TN_tn(degree)») { - return lessOrEqual(«tn(degree)»); - } - «ENDFOR» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition le(«Field_TN_tn(degree)») { - return lessOrEqual(«tn(degree)»); - } - «ENDFOR» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition greaterThan(Row«typeSuffix(degree)» row) { - return compare(Comparator.GREATER, row); - } - «ENDFOR» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition greaterThan(Record«recTypeSuffix(degree)» record) { - return compare(Comparator.GREATER, record); - } - «ENDFOR» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition greaterThan(«TN_tn(degree)») { - return compare(Comparator.GREATER, «tn(degree)»); - } - «ENDFOR» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition greaterThan(«Field_TN_tn(degree)») { - return compare(Comparator.GREATER, «tn(degree)»); - } - «ENDFOR» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition gt(Row«typeSuffix(degree)» row) { - return greaterThan(row); - } - «ENDFOR» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition gt(Record«recTypeSuffix(degree)» record) { - return greaterThan(record); - } - «ENDFOR» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition gt(«TN_tn(degree)») { - return greaterThan(«tn(degree)»); - } - «ENDFOR» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition gt(«Field_TN_tn(degree)») { - return greaterThan(«tn(degree)»); - } - «ENDFOR» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition greaterOrEqual(Row«typeSuffix(degree)» row) { - return compare(Comparator.GREATER_OR_EQUAL, row); - } - «ENDFOR» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition greaterOrEqual(Record«recTypeSuffix(degree)» record) { - return compare(Comparator.GREATER_OR_EQUAL, record); - } - «ENDFOR» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition greaterOrEqual(«TN_tn(degree)») { - return compare(Comparator.GREATER_OR_EQUAL, «tn(degree)»); - } - «ENDFOR» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition greaterOrEqual(«Field_TN_tn(degree)») { - return compare(Comparator.GREATER_OR_EQUAL, «tn(degree)»); - } - «ENDFOR» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition ge(Row«typeSuffix(degree)» row) { - return greaterOrEqual(row); - } - «ENDFOR» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition ge(Record«recTypeSuffix(degree)» record) { - return greaterOrEqual(record); - } - «ENDFOR» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition ge(«TN_tn(degree)») { - return greaterOrEqual(«tn(degree)»); - } - «ENDFOR» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition ge(«Field_TN_tn(degree)») { - return greaterOrEqual(«tn(degree)»); - } - «ENDFOR» - - // ------------------------------------------------------------------------ - // [NOT] BETWEEN predicates - // ------------------------------------------------------------------------ - «FOR keyword : newArrayList("between", "betweenSymmetric", "notBetween", "notBetweenSymmetric")» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final BetweenAndStep«typeSuffix(degree)» «keyword»(«TN_tn(degree)») { - return «keyword»(row(«tn(degree)»)); - } - «ENDFOR» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final BetweenAndStep«typeSuffix(degree)» «keyword»(«Field_TN_tn(degree)») { - return «keyword»(row(«tn(degree)»)); - } - «ENDFOR» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final BetweenAndStep«typeSuffix(degree)» «keyword»(Row«typeSuffix(degree)» row) { - return new RowBetweenCondition(this, row, «keyword.startsWith("not")», «keyword.endsWith("Symmetric")»); - } - «ENDFOR» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final BetweenAndStep«typeSuffix(degree)» «keyword»(Record«recTypeSuffix(degree)» record) { - return «keyword»(record.valuesRow()); - } - «ENDFOR» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition «keyword»(Row«typeSuffix(degree)» minValue, Row«typeSuffix(degree)» maxValue) { - return «keyword»(minValue).and(maxValue); - } - «ENDFOR» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition «keyword»(Record«recTypeSuffix(degree)» minValue, Record«recTypeSuffix(degree)» maxValue) { - return «keyword»(minValue).and(maxValue); - } - «ENDFOR» - «ENDFOR» - - // ------------------------------------------------------------------------ - // [NOT] DISTINCT predicates - // ------------------------------------------------------------------------ - - // ------------------------------------------------------------------------ - // [NOT] IN predicates - // ------------------------------------------------------------------------ - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition in(Row«typeSuffix(degree)»... rows) { - return in(Arrays.asList(rows)); - } - «ENDFOR» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition in(Record«recTypeSuffix(degree)»... records) { - Row«typeSuffix(degree)»[] rows = new Row«typeSuffixRaw(degree)»[records.length]; - - for (int i = 0; i < records.length; i++) { - rows[i] = «IF degree == 0»(RowN) «ENDIF»records[i].valuesRow(); - } - - return in(rows); - } - «ENDFOR» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition notIn(Row«typeSuffix(degree)»... rows) { - return notIn(Arrays.asList(rows)); - } - «ENDFOR» - «FOR degree : (0..Constants::MAX_ROW_DEGREE)» - - @Override - public final Condition notIn(Record«recTypeSuffix(degree)»... records) { - Row«typeSuffix(degree)»[] rows = new Row«typeSuffixRaw(degree)»[records.length]; - - for (int i = 0; i < records.length; i++) { - rows[i] = «IF degree == 0»(RowN) «ENDIF»records[i].valuesRow(); - } - - return notIn(rows); - } - «ENDFOR» - - @Override - public final Condition in(Collection rows) { - QueryPartList list = new QueryPartList(rows); - return new RowInCondition(this, list, Comparator.IN); - } - - @Override - public final Condition notIn(Collection rows) { - QueryPartList list = new QueryPartList(rows); - return new RowInCondition(this, list, Comparator.NOT_IN); - } - - // ------------------------------------------------------------------------ - // Predicates involving subqueries - // ------------------------------------------------------------------------ - - @Override - public final Condition equal(Select select) { - return new RowSubqueryCondition(this, select, Comparator.EQUALS); - } - - @Override - public final Condition eq(Select select) { - return equal(select); - } - - @Override - public final Condition notEqual(Select select) { - return new RowSubqueryCondition(this, select, Comparator.NOT_EQUALS); - } - - @Override - public final Condition ne(Select select) { - return notEqual(select); - } - - @Override - public final Condition greaterThan(Select select) { - return new RowSubqueryCondition(this, select, Comparator.GREATER); - } - - @Override - public final Condition gt(Select select) { - return greaterThan(select); - } - - @Override - public final Condition greaterOrEqual(Select select) { - return new RowSubqueryCondition(this, select, Comparator.GREATER_OR_EQUAL); - } - - @Override - public final Condition ge(Select select) { - return greaterOrEqual(select); - } - - @Override - public final Condition lessThan(Select select) { - return new RowSubqueryCondition(this, select, Comparator.LESS); - } - - @Override - public final Condition lt(Select select) { - return lessThan(select); - } - - @Override - public final Condition lessOrEqual(Select select) { - return new RowSubqueryCondition(this, select, Comparator.LESS_OR_EQUAL); - } - - @Override - public final Condition le(Select select) { - return lessOrEqual(select); - } - - @Override - public final Condition in(Select select) { - return new RowSubqueryCondition(this, select, Comparator.IN); - } - - @Override - public final Condition notIn(Select select) { - return new RowSubqueryCondition(this, select, Comparator.NOT_IN); - } - - // ------------------------------------------------------------------------ - // XXX: Row2 API - // ------------------------------------------------------------------------ - - @Override - public final Condition overlaps(T1 t1, T2 t2) { - return overlaps(row(t1, t2)); - } - - @Override - public final Condition overlaps(Field t1, Field t2) { - return overlaps(row(t1, t2)); - } - - @Override - public final Condition overlaps(Row2 row) { - return new RowOverlapsCondition(this, row); - } - } - '''); - - write("org.jooq.impl.RowImpl", out); - } -} diff --git a/jOOQ-tools/src/org/jooq/xtend/UpdateDSL.xtend b/jOOQ-tools/src/org/jooq/xtend/UpdateDSL.xtend deleted file mode 100644 index 4fa11ca274..0000000000 --- a/jOOQ-tools/src/org/jooq/xtend/UpdateDSL.xtend +++ /dev/null @@ -1,212 +0,0 @@ -/** - * Copyright (c) 2009-2013, Data Geekery GmbH (http://www.datageekery.com) - * All rights reserved. - * - * This work is dual-licensed - * - under the Apache Software License 2.0 (the "ASL") - * - under the jOOQ License and Maintenance Agreement (the "jOOQ License") - * ============================================================================= - * You may choose which license applies to you: - * - * - If you're using this work with Open Source databases, you may choose - * either ASL or jOOQ License. - * - If you're using this work with at least one commercial database, you must - * choose jOOQ License - * - * For more information, please visit http://www.jooq.org/licenses - * - * Apache Software License 2.0: - * ----------------------------------------------------------------------------- - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * jOOQ License and Maintenance Agreement: - * ----------------------------------------------------------------------------- - * Data Geekery grants the Customer the non-exclusive, timely limited and - * non-transferable license to install and use the Software under the terms of - * the jOOQ License and Maintenance Agreement. - * - * This library is distributed with a LIMITED WARRANTY. See the jOOQ License - * and Maintenance Agreement for more details: http://www.jooq.org/licensing - */ -package org.jooq.xtend - -import org.jooq.Constants - -/** - * @author Lukas Eder - */ -class UpdateDSL extends Generators { - - def static void main(String[] args) { - val update = new UpdateDSL(); - update.generateUpdateQuery(); - update.generateUpdateQueryImpl(); - update.generateUpdateSetFirstStep(); - update.generateUpdateImpl(); - } - - def generateUpdateQuery() { - val out = new StringBuilder(); - - out.append(''' - «FOR degree : (1..Constants::MAX_ROW_DEGREE)» - - /** - * Specify a multi-column set clause for the UPDATE statement. - */ - «generatedMethod» - @Support({ DB2, H2, HSQLDB, INGRES, ORACLE, POSTGRES }) - <«TN(degree)»> void addValues(Row«degree»<«TN(degree)»> row, Row«degree»<«TN(degree)»> value); - «ENDFOR» - «FOR degree : (1..Constants::MAX_ROW_DEGREE)» - - /** - * Specify a multi-column set clause for the UPDATE statement. - */ - «generatedMethod» - @Support({ DB2, H2, HSQLDB, INGRES, ORACLE }) - <«TN(degree)»> void addValues(Row«degree»<«TN(degree)»> row, Select> select); - «ENDFOR» - '''); - - insert("org.jooq.UpdateQuery", out, "addValues"); - } - - def generateUpdateQueryImpl() { - val out = new StringBuilder(); - - out.append(''' - «FOR degree : (1..Constants::MAX_ROW_DEGREE)» - - «generatedMethod» - @Override - public final <«TN(degree)»> void addValues(Row«degree»<«TN(degree)»> row, Row«degree»<«TN(degree)»> value) { - addValues0(row, value); - } - «ENDFOR» - «FOR degree : (1..Constants::MAX_ROW_DEGREE)» - - «generatedMethod» - @Override - public final <«TN(degree)»> void addValues(Row«degree»<«TN(degree)»> row, Select> select) { - addValues0(row, select); - } - «ENDFOR» - '''); - - insert("org.jooq.impl.UpdateQueryImpl", out, "addValues"); - } - - def generateUpdateSetFirstStep() { - val out = new StringBuilder(); - - out.append(''' - «classHeader» - package org.jooq; - - import static org.jooq.SQLDialect.DB2; - import static org.jooq.SQLDialect.H2; - import static org.jooq.SQLDialect.HSQLDB; - import static org.jooq.SQLDialect.INGRES; - import static org.jooq.SQLDialect.ORACLE; - import static org.jooq.SQLDialect.POSTGRES; - - import javax.annotation.Generated; - - import org.jooq.api.annotation.State; - import org.jooq.api.annotation.Transition; - - /** - * This type is used for the {@link Update}'s DSL API. - *

- * Example:

-         * using(configuration)
-         *       .update(table)
-         *       .set(field1, value1)
-         *       .set(field2, value2)
-         *       .where(field1.greaterThan(100))
-         *       .execute();
-         * 
- * - * @author Lukas Eder - */ - «generatedAnnotation» - @State - public interface UpdateSetFirstStep extends UpdateSetStep { - «FOR degree : (1..Constants::MAX_ROW_DEGREE)» - - /** - * Specify a multi-column set clause for the UPDATE statement. - *

- * This is simulated using a subquery for the value, where row - * value expressions aren't supported. - */ - @Support({ DB2, H2, HSQLDB, INGRES, ORACLE, POSTGRES }) - @Transition( - name = "SET", - args = { - "Row", - "Row" - } - ) - <«TN(degree)»> UpdateWhereStep set(Row«degree»<«TN(degree)»> row, Row«degree»<«TN(degree)»> value); - «ENDFOR» - «FOR degree : (1..Constants::MAX_ROW_DEGREE)» - - /** - * Specify a multi-column set clause for the UPDATE statement. - */ - @Support({ DB2, H2, HSQLDB, INGRES, ORACLE }) - @Transition( - name = "SET", - args = { - "Row", - "Select" - } - ) - <«TN(degree)»> UpdateWhereStep set(Row«degree»<«TN(degree)»> row, Select> select); - «ENDFOR» - - } - '''); - - write("org.jooq.UpdateSetFirstStep", out); - } - - def generateUpdateImpl() { - val out = new StringBuilder(); - - out.append(''' - «FOR degree : (1..Constants::MAX_ROW_DEGREE)» - - «generatedMethod» - @Override - public final <«TN(degree)»> UpdateWhereStep set(Row«degree»<«TN(degree)»> row, Row«degree»<«TN(degree)»> value) { - getDelegate().addValues(row, value); - return this; - } - «ENDFOR» - «FOR degree : (1..Constants::MAX_ROW_DEGREE)» - - «generatedMethod» - @Override - public final <«TN(degree)»> UpdateWhereStep set(Row«degree»<«TN(degree)»> row, Select> select) { - getDelegate().addValues(row, select); - return this; - } - «ENDFOR» - '''); - - insert("org.jooq.impl.UpdateImpl", out, "set"); - } -} \ No newline at end of file diff --git a/jOOQ-tools/src/org/jooq/xtend/Util.java b/jOOQ-tools/src/org/jooq/xtend/Util.java deleted file mode 100644 index 3c2dd94e91..0000000000 --- a/jOOQ-tools/src/org/jooq/xtend/Util.java +++ /dev/null @@ -1,49 +0,0 @@ -/** - * Copyright (c) 2009-2013, Data Geekery GmbH (http://www.datageekery.com) - * All rights reserved. - * - * This work is dual-licensed - * - under the Apache Software License 2.0 (the "ASL") - * - under the jOOQ License and Maintenance Agreement (the "jOOQ License") - * ============================================================================= - * You may choose which license applies to you: - * - * - If you're using this work with Open Source databases, you may choose - * either ASL or jOOQ License. - * - If you're using this work with at least one commercial database, you must - * choose jOOQ License - * - * For more information, please visit http://www.jooq.org/licenses - * - * Apache Software License 2.0: - * ----------------------------------------------------------------------------- - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * jOOQ License and Maintenance Agreement: - * ----------------------------------------------------------------------------- - * Data Geekery grants the Customer the non-exclusive, timely limited and - * non-transferable license to install and use the Software under the terms of - * the jOOQ License and Maintenance Agreement. - * - * This library is distributed with a LIMITED WARRANTY. See the jOOQ License - * and Maintenance Agreement for more details: http://www.jooq.org/licensing - */ -package org.jooq.xtend; - -public class Util { - - public static byte[] newByteArray(long length) { - // Xtend seems incapable of doing this: - return new byte[(int) length]; - } -} diff --git a/jOOQ-website/.classpath b/jOOQ-website/.classpath deleted file mode 100644 index 9352932b55..0000000000 --- a/jOOQ-website/.classpath +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/jOOQ-website/.gitignore b/jOOQ-website/.gitignore deleted file mode 100644 index 13a0a25e02..0000000000 --- a/jOOQ-website/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -/target -/manual -/manual-pdf -/manual-single-page -/doc -/access.php diff --git a/jOOQ-website/.htaccess b/jOOQ-website/.htaccess deleted file mode 100644 index e43e067c9e..0000000000 --- a/jOOQ-website/.htaccess +++ /dev/null @@ -1,49 +0,0 @@ -################################## Errors ###################################### -#ErrorDocument 301 /e/301-moved_permanently.html -#ErrorDocument 302 /e/302-moved_temporarily.html -#ErrorDocument 303 /e/303-see_other.html -#ErrorDocument 400 /e/400-bad_request.html -ErrorDocument 401 /e/401-authorization_required.html -#ErrorDocument 402 /e/402-payment_required.html -ErrorDocument 403 /e/403-forbidden.html -ErrorDocument 404 /e/404-not_found.html -#ErrorDocument 405 /e/405-method_not_allowed.html -#ErrorDocument 406 /e/406-not_acceptable.html -#ErrorDocument 407 /e/407-proxy_authentication_required.html -ErrorDocument 408 /e/408-request_timed_out.html -#ErrorDocument 409 /e/409-conflicting_request.html -#ErrorDocument 410 /e/410-gone.html -#ErrorDocument 411 /e/411-content_length_required.html -#ErrorDocument 412 /e/412-precondition_failed.html -#ErrorDocument 413 /e/413-request_entity_too_long.html -#ErrorDocument 414 /e/414-request_uri_too_long.html -#ErrorDocument 415 /e/415-unsupported_media_type.html -ErrorDocument 500 /e/500-internal_server_error.html -#ErrorDocument 501 /e/501-not_implemented.html -#ErrorDocument 502 /e/502-bad_gateway.html -ErrorDocument 503 /e/503-service_unavailable.html -#ErrorDocument 504 /e/504-gateway_timeout.html -#ErrorDocument 505 /e/505-http_version_not_supported.html -################################################################################ - -#Create uniform manual URLs, also for 2.4 manual -RewriteEngine On -RewriteBase / -RewriteRule ^manual(.*)$ doc/2.4/manual$1 [L,R=301] -RewriteRule ^doc/latest/manual([^/]*)/(.*)$ doc/3.0/manual$1/$2 [L,R=307] - -RewriteCond %{SCRIPT_FILENAME} !-d -RewriteCond %{SCRIPT_FILENAME} !-f - -# Create vanity URLS, mapping non-existing directories to equivalent .php files -RewriteRule ^.*?$ $0.php - -# Rewrite datageekery.com to subdirectory -RewriteCond %{REQUEST_URI} !^/datageekery.com/ -RewriteCond %{HTTP_HOST} ^(www\.)?datageekery.com [NC] -RewriteRule ^(.*)$ /datageekery.com/$1 - - -Order Allow,Deny -Deny from all - \ No newline at end of file diff --git a/jOOQ-website/.project b/jOOQ-website/.project deleted file mode 100644 index 08bfce2bfb..0000000000 --- a/jOOQ-website/.project +++ /dev/null @@ -1,29 +0,0 @@ - - - jOOQ-website - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.m2e.core.maven2Builder - - - - - org.maven.ide.eclipse.maven2Builder - - - - - - org.maven.ide.eclipse.maven2Nature - org.eclipse.m2e.core.maven2Nature - org.eclipse.jdt.core.javanature - - diff --git a/jOOQ-website/.settings/org.eclipse.jdt.core.prefs b/jOOQ-website/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 1d48cf419d..0000000000 --- a/jOOQ-website/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,382 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore -org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull -org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault -org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable -org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.6 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.doc.comment.support=enabled -org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.autoboxing=ignore -org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning -org.eclipse.jdt.core.compiler.problem.deadCode=warning -org.eclipse.jdt.core.compiler.problem.deprecation=warning -org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled -org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled -org.eclipse.jdt.core.compiler.problem.discouragedReference=warning -org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore -org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore -org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled -org.eclipse.jdt.core.compiler.problem.fieldHiding=warning -org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning -org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning -org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning -org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning -org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled -org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning -org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore -org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore -org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning -org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled -org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled -org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled -org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected -org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning -org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning -org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore -org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning -org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled -org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore -org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore -org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled -org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public -org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=all_standard_tags -org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore -org.eclipse.jdt.core.compiler.problem.missingJavadocTagsMethodTypeParameters=disabled -org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled -org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled -org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning -org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning -org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning -org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning -org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore -org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error -org.eclipse.jdt.core.compiler.problem.nullReference=error -org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error -org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning -org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning -org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore -org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning -org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning -org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore -org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning -org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning -org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning -org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore -org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning -org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore -org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore -org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled -org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning -org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled -org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled -org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore -org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning -org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled -org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning -org.eclipse.jdt.core.compiler.problem.unclosedCloseable=ignore -org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore -org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning -org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore -org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning -org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled -org.eclipse.jdt.core.compiler.problem.unusedImport=warning -org.eclipse.jdt.core.compiler.problem.unusedLabel=warning -org.eclipse.jdt.core.compiler.problem.unusedLocal=warning -org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore -org.eclipse.jdt.core.compiler.problem.unusedParameter=warning -org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled -org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled -org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled -org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning -org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning -org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning -org.eclipse.jdt.core.compiler.source=1.6 -org.eclipse.jdt.core.formatter.align_type_members_on_columns=true -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 -org.eclipse.jdt.core.formatter.alignment_for_assignment=0 -org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16 -org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 -org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 -org.eclipse.jdt.core.formatter.alignment_for_enum_constants=49 -org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 -org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 -org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 -org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 -org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 -org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 -org.eclipse.jdt.core.formatter.blank_lines_after_package=1 -org.eclipse.jdt.core.formatter.blank_lines_before_field=0 -org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 -org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 -org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 -org.eclipse.jdt.core.formatter.blank_lines_before_method=1 -org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 -org.eclipse.jdt.core.formatter.blank_lines_before_package=0 -org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 -org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 -org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line -org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=true -org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true -org.eclipse.jdt.core.formatter.comment.format_block_comments=true -org.eclipse.jdt.core.formatter.comment.format_header=false -org.eclipse.jdt.core.formatter.comment.format_html=true -org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true -org.eclipse.jdt.core.formatter.comment.format_line_comments=true -org.eclipse.jdt.core.formatter.comment.format_source_code=true -org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true -org.eclipse.jdt.core.formatter.comment.indent_root_tags=true -org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert -org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert -org.eclipse.jdt.core.formatter.comment.line_length=80 -org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true -org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true -org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false -org.eclipse.jdt.core.formatter.compact_else_if=true -org.eclipse.jdt.core.formatter.continuation_indentation=1 -org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=1 -org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off -org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on -org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false -org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true -org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true -org.eclipse.jdt.core.formatter.indent_empty_lines=false -org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true -org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true -org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true -org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true -org.eclipse.jdt.core.formatter.indentation.size=4 -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=insert -org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert -org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=insert -org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert -org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert -org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert -org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert -org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert -org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert -org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.join_lines_in_comments=true -org.eclipse.jdt.core.formatter.join_wrapped_lines=true -org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false -org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false -org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false -org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false -org.eclipse.jdt.core.formatter.lineSplit=120 -org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false -org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false -org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 -org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 -org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true -org.eclipse.jdt.core.formatter.tabulation.char=space -org.eclipse.jdt.core.formatter.tabulation.size=4 -org.eclipse.jdt.core.formatter.use_on_off_tags=false -org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false -org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true -org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true diff --git a/jOOQ-website/.settings/org.eclipse.jdt.ui.prefs b/jOOQ-website/.settings/org.eclipse.jdt.ui.prefs deleted file mode 100644 index e0c272bb40..0000000000 --- a/jOOQ-website/.settings/org.eclipse.jdt.ui.prefs +++ /dev/null @@ -1,115 +0,0 @@ -cleanup.add_default_serial_version_id=false -cleanup.add_generated_serial_version_id=true -cleanup.add_missing_annotations=true -cleanup.add_missing_deprecated_annotations=true -cleanup.add_missing_methods=false -cleanup.add_missing_nls_tags=false -cleanup.add_missing_override_annotations=true -cleanup.add_missing_override_annotations_interface_methods=true -cleanup.add_serial_version_id=true -cleanup.always_use_blocks=true -cleanup.always_use_parentheses_in_expressions=false -cleanup.always_use_this_for_non_static_field_access=true -cleanup.always_use_this_for_non_static_method_access=false -cleanup.convert_to_enhanced_for_loop=false -cleanup.correct_indentation=true -cleanup.format_source_code=false -cleanup.format_source_code_changes_only=false -cleanup.make_local_variable_final=true -cleanup.make_parameters_final=false -cleanup.make_private_fields_final=true -cleanup.make_type_abstract_if_missing_method=false -cleanup.make_variable_declarations_final=false -cleanup.never_use_blocks=false -cleanup.never_use_parentheses_in_expressions=true -cleanup.organize_imports=true -cleanup.qualify_static_field_accesses_with_declaring_class=false -cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true -cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true -cleanup.qualify_static_member_accesses_with_declaring_class=true -cleanup.qualify_static_method_accesses_with_declaring_class=false -cleanup.remove_private_constructors=true -cleanup.remove_trailing_whitespaces=true -cleanup.remove_trailing_whitespaces_all=true -cleanup.remove_trailing_whitespaces_ignore_empty=false -cleanup.remove_unnecessary_casts=true -cleanup.remove_unnecessary_nls_tags=true -cleanup.remove_unused_imports=true -cleanup.remove_unused_local_variables=false -cleanup.remove_unused_private_fields=true -cleanup.remove_unused_private_members=false -cleanup.remove_unused_private_methods=true -cleanup.remove_unused_private_types=true -cleanup.sort_members=false -cleanup.sort_members_all=false -cleanup.use_blocks=true -cleanup.use_blocks_only_for_return_and_throw=false -cleanup.use_parentheses_in_expressions=false -cleanup.use_this_for_non_static_field_access=false -cleanup.use_this_for_non_static_field_access_only_if_necessary=false -cleanup.use_this_for_non_static_method_access=false -cleanup.use_this_for_non_static_method_access_only_if_necessary=true -cleanup_profile=_jOOQ -cleanup_settings_version=2 -eclipse.preferences.version=1 -editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true -formatter_profile=_jOOQ -formatter_settings_version=12 -org.eclipse.jdt.ui.ignorelowercasenames=true -org.eclipse.jdt.ui.importorder=java;javax;org.jooq;org;com; -org.eclipse.jdt.ui.javadoc=false -org.eclipse.jdt.ui.ondemandthreshold=99999 -org.eclipse.jdt.ui.staticondemandthreshold=99999 -org.eclipse.jdt.ui.text.custom_code_templates= -sp_cleanup.add_default_serial_version_id=true -sp_cleanup.add_generated_serial_version_id=false -sp_cleanup.add_missing_annotations=true -sp_cleanup.add_missing_deprecated_annotations=true -sp_cleanup.add_missing_methods=false -sp_cleanup.add_missing_nls_tags=false -sp_cleanup.add_missing_override_annotations=true -sp_cleanup.add_missing_override_annotations_interface_methods=true -sp_cleanup.add_serial_version_id=false -sp_cleanup.always_use_blocks=true -sp_cleanup.always_use_parentheses_in_expressions=false -sp_cleanup.always_use_this_for_non_static_field_access=false -sp_cleanup.always_use_this_for_non_static_method_access=false -sp_cleanup.convert_to_enhanced_for_loop=false -sp_cleanup.correct_indentation=false -sp_cleanup.format_source_code=false -sp_cleanup.format_source_code_changes_only=false -sp_cleanup.make_local_variable_final=false -sp_cleanup.make_parameters_final=false -sp_cleanup.make_private_fields_final=true -sp_cleanup.make_type_abstract_if_missing_method=false -sp_cleanup.make_variable_declarations_final=false -sp_cleanup.never_use_blocks=false -sp_cleanup.never_use_parentheses_in_expressions=true -sp_cleanup.on_save_use_additional_actions=true -sp_cleanup.organize_imports=true -sp_cleanup.qualify_static_field_accesses_with_declaring_class=false -sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true -sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true -sp_cleanup.qualify_static_member_accesses_with_declaring_class=false -sp_cleanup.qualify_static_method_accesses_with_declaring_class=false -sp_cleanup.remove_private_constructors=true -sp_cleanup.remove_trailing_whitespaces=true -sp_cleanup.remove_trailing_whitespaces_all=true -sp_cleanup.remove_trailing_whitespaces_ignore_empty=false -sp_cleanup.remove_unnecessary_casts=true -sp_cleanup.remove_unnecessary_nls_tags=false -sp_cleanup.remove_unused_imports=true -sp_cleanup.remove_unused_local_variables=false -sp_cleanup.remove_unused_private_fields=true -sp_cleanup.remove_unused_private_members=false -sp_cleanup.remove_unused_private_methods=true -sp_cleanup.remove_unused_private_types=true -sp_cleanup.sort_members=false -sp_cleanup.sort_members_all=false -sp_cleanup.use_blocks=false -sp_cleanup.use_blocks_only_for_return_and_throw=false -sp_cleanup.use_parentheses_in_expressions=false -sp_cleanup.use_this_for_non_static_field_access=false -sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true -sp_cleanup.use_this_for_non_static_method_access=false -sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true diff --git a/jOOQ-website/.settings/org.eclipse.m2e.core.prefs b/jOOQ-website/.settings/org.eclipse.m2e.core.prefs deleted file mode 100644 index 14b697b7bb..0000000000 --- a/jOOQ-website/.settings/org.eclipse.m2e.core.prefs +++ /dev/null @@ -1,4 +0,0 @@ -activeProfiles= -eclipse.preferences.version=1 -resolveWorkspaceProjects=true -version=1 diff --git a/jOOQ-website/.settings/org.maven.ide.eclipse.prefs b/jOOQ-website/.settings/org.maven.ide.eclipse.prefs deleted file mode 100644 index c5172a20ac..0000000000 --- a/jOOQ-website/.settings/org.maven.ide.eclipse.prefs +++ /dev/null @@ -1,8 +0,0 @@ -#Sun Apr 10 10:03:42 CEST 2011 -activeProfiles= -eclipse.preferences.version=1 -fullBuildGoals=process-test-resources -resolveWorkspaceProjects=true -resourceFilterGoals=process-resources resources\:testResources -skipCompilerPlugin=true -version=1 diff --git a/jOOQ-website/MailChimp.class.php b/jOOQ-website/MailChimp.class.php deleted file mode 100644 index 8855ff9cbd..0000000000 --- a/jOOQ-website/MailChimp.class.php +++ /dev/null @@ -1,74 +0,0 @@ - - * @version 1.0 - */ -class MailChimp -{ - private $api_key; - private $api_endpoint = 'https://.api.mailchimp.com/2.0/'; - - - - /** - * Create a new instance - * @param string $api_key Your MailChimp API key - */ - function __construct($api_key) - { - $this->api_key = $api_key; - list(, $datacentre) = explode('-', $api_key); - $this->api_endpoint = str_replace('', $datacentre, $this->api_endpoint); - } - - - - - /** - * Call an API method. Every request needs the API key, so that is added automatically -- you don't need to pass it in. - * @param string $method The API method to call, e.g. 'lists/list' - * @param array $args An array of arguments to pass to the method. Will be json-encoded for you. - * @return array Associative array of json decoded API response. - */ - public function call($method, $args=array()) - { - return $this->_raw_request($method, $args); - } - - - - - /** - * Performs the underlying HTTP request. Not very exciting - * @param string $method The API method to be called - * @param array $args Assoc array of parameters to be passed - * @return array Assoc array of decoded result - */ - private function _raw_request($method, $args=array()) - { - $args['apikey'] = $this->api_key; - $url = $this->api_endpoint.'/'.$method.'.json'; - - $ch = curl_init(); - - curl_setopt($ch, CURLOPT_URL, $url); - curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, CURLOPT_TIMEOUT, 10); - curl_setopt($ch, CURLOPT_POST, true); - curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($args)); - $result = curl_exec($ch); - - $err = fopen('error.log', 'a'); - fwrite($err, curl_error($ch)); - fclose($err); - - curl_close($ch); - return $result ? json_decode($result, true) : false; - } -} \ No newline at end of file diff --git a/jOOQ-website/community.php b/jOOQ-website/community.php deleted file mode 100644 index ee3677251f..0000000000 --- a/jOOQ-website/community.php +++ /dev/null @@ -1,297 +0,0 @@ - - -

jOOQ lives from your feedback and support

-

-jOOQ is a very interactive project. It lives from your feedback and support. -There are many ways how you can contribute to the jOOQ community. -

- - - - - - - -
-

The technical community

-

Hall of Fame

-

-Passionate contributors have made jOOQ what it is. Here's a list of contributors -worth mentioning (in alphabetical order) -

-
    -
  • Aaron Digulla: jOOQ-codegen cleanup
  • -
  • Ben Manes: Gradle integration
  • -
  • Christopher Deckers: jOOQ-Console contribution
  • -
  • Christopher Klewes: Maven integration
  • -
  • Ed Schaller: Improvements to unsigned data types (jOOU)
  • -
  • Espen Stromsnes: DB2, H2, Sybase, and HSQLDB integrations
  • -
  • Florian Adler: jOOQ-minuteproject contribution
  • -
  • Ivan Dugic: Various GitHub ticket contributions
  • -
  • Lukas Eder: Project lead
  • -
  • Rakesh Waghela: Spreading the news
  • -
  • Robin Stocker: Git, GitHub, and Scala support
  • -
  • Sander Plas: jOOQ-codegen-maven, jOOQ-wicket contribution
  • -
  • Sergey Epik: jOOQ-spring contribution
  • -
  • Sugiharto Lim: Firebird integration
  • -
  • Vladislav "FractalizeR" Rastrusny: MySQL integration feedback
  • -
- -

You can contribute too!

-

-The easiest way to contribute is by providing feedback. Tell me, tell us, tell the world! -How to do it? Telling us:
-The jOOQ User Group

-Telling the world:
-http://stackoverflow.com/questions/tagged/jooq

-... or blog about jOOQ. Write articles! Advertise jOOQ! -

- - -

Contributing code

-

... or contribute code! If you want to share code, please follow these instructions

-
    -
  • If you haven't already, download Eclipse (Indigo or Juno) from http://www.eclipse.org/. While you could develop with other IDEs as well, you wouldn't profit from all the installed launch configurations, etc.
  • -
  • Be sure that you have http://www.eclipse.org/egit/ installed in your Eclipse distribution
  • -
  • Check out the codebase from GitHub: git@github.com:jOOQ/jOOQ.git
  • -
  • Import the jOOQ projects into Eclipse
  • -
  • If you haven't already, get M2E, the Eclipse Maven plugin to build jOOQ with Maven in Eclipse (The one from Sonatype, NOT the one from Eclipse)
  • -
  • Use the Eclipse formatting settings that have been checked in with the projects. Keeps the code nice and clean. Your code should not change (not much), if formatted with Ctrl-Shift-F. But don't format jOOQ DSL query code!
  • -
  • Send me your changes directly to the user group or in a GitHub ticket.
  • -
  • Send your changes as an Eclipse-compatible .patch file (or the sum of the modified Java classes). Ideally, the .patch file can be applied to the latest version of jOOQ on the SVN trunk.
  • -
  • I'll review, audit your changes and it goes into the repository with the next release, if I'm happy :-) AND: you'll make it to the hall of fame. Provide me with links to your webpage / blog / etc, if you would like to see that mentioned.
  • -
  • If you are a committer on GitHub, please commit with the following comment scheme:
    [#Issue-ID] GitHub-Ticket-Title - Your specific comment
  • -
- -

Hints for new features

- -

A lot of ideas are around already. Check out this GitHub Milestone to see some of them

- -

Hints for new database integrations

- -

Should you wish to provide an extension/support for a new RDBMS (such as Informix, Firebird, etc) your work would consist of these steps:

-
    -
  • Extend Eclipse .classpath files and .launch targets such that all developers are able to use your newly added database / JDBC drivers
  • -
  • Implement code generation for the new RDBMS. For that, you'll need to provide an implementation for AbstractDatabase in jOOQ-meta
  • -
  • Make the integration tests for the new RDBMS run.
  • -
- -

Or in more detail:

-

In detail, you have to do these steps:

-
    -
  • Migrate create.sql and reset.sql scripts to your dialect
  • -
  • Create the above schema (create.sql) and data (reset.sql) in your test database
  • -
  • Extend org.jooq.util.AbstractDatabase. Ideally, you'll use your own generated meta-schema classes and the jOOQ API to navigate through your RDBMS's meta-schema in order to discover your test schema. Apart from the integration tests, this adds an additional layer of "proof of concept". See for instance org.jooq.util.oracle.OracleDatabase, where rather complex nested queries are used to navigate through Oracle foreign key relationships.
  • -
  • For a minimal implementation, check out org.jooq.util.sqlite.SQLiteDatabase, which only implements loadPrimaryKeys0() and getTables0(). All other implementations are optional extensions.
  • -
-

Once you've done these steps, in order to be sure that everything works fine you'll also have to do this:

-
    -
  • Let jOOQ generate the integration test schema
  • -
  • Extend the org.jooq.test.jOOQAbstractTest for your RDBMS
  • -
  • Run the integration tests for your RDBMS
  • -
  • Fix all issues. You should get syntax errors, SQLDialectNotSupportedExceptions, etc
  • -
-

If you provide me with instructions how to set up your RDBMS instance and any partial implementation of the above, I'm going to take that into the jOOQ code base (giving you credit, of course) and guaranteeing implementation integrity in the future.

- -

So let's get to work, then! :-)

- -

Cheers, Lukas

-
-

The business community

-

Invest in jOOQ

-

-jOOQ is currently looking for partnerships. If you are a database vendor -or a software vendor and you wish to get basic or advanced support for your -specific database product integrated in jOOQ, or if you have any other specific -feature request, please contact me directly at -lukas.eder@gmail.com. -

- -

Advertise on www.jooq.org

-

-jOOQ has a growing community in dire need for good database products. Make -yourself heard to many database users! -

-
-
-
- - - -

Donations

-

-If you simply wish to -donate, -that is fine too. -

- -

The latest news, links

-

-Follow jOOQ on any of these channels to get the latest news: -

- - -

The jOOQ Brand

-

-Want to publish something about jOOQ? Use the official brand! Right-click on any image and -choose "Save As..." to store the image on your computer. -contact me for more specific formats: -

-

Logo (colour and b/w, 250x180):

- - - - - -
- - The jOOQ Logo 250x180 - - - - The jOOQ Logo 250x180 - -
- -

Logo (colour and b/w, 1024x768):

- - - - - -
- - The jOOQ Logo 1024x768 - - - - The jOOQ Logo 1024x768 - -
- -

Banner (colour and b/w, 1024x186):

- - The jOOQ Logo 1024x186 - - - -

Logo (colour and b/w, 220x220):

- - - - - -
- - The jOOQ Logo 250x180 - - - - The jOOQ Logo 250x180 - -
- -

jOOX Logo (colour, 1800x1800):

- - - - - -
- - The jOOQ Logo 1024x768 - - - - The jOOQ Logo 1024x768 - -
- -
- - diff --git a/jOOQ-website/conf.php b/jOOQ-website/conf.php deleted file mode 100644 index 0f343e1fee..0000000000 --- a/jOOQ-website/conf.php +++ /dev/null @@ -1,5 +0,0 @@ - \ No newline at end of file diff --git a/jOOQ-website/css/jooq.css b/jOOQ-website/css/jooq.css deleted file mode 100644 index b97fdf503c..0000000000 --- a/jOOQ-website/css/jooq.css +++ /dev/null @@ -1,421 +0,0 @@ -body { - font-family: 'Oxygen', sans-serif; - font-weight: normal; - text-shadow: 0 1px 0 #FFFFFF; - font-size: 15px; - font-style: normal; - font-weight: 400; - color: #000000; - letter-spacing: 0; - line-height: 1.4; - text-decoration: none; - text-shadow: none; - text-transform: none; - word-spacing: 0; - margin: 0; - padding: 0; - - background: #888787; - background: -webkit-gradient(linear, left, right, from(#888787), to(#666)); - background: -moz-linear-gradient(left, #888787, #666); - background: gradient(linear, left, right, from(#888787), to(#666)); -} - -h1, h2, h3, h4, h5, h6 { - font-family: 'Special Elite', cursive; - font-weight: normal; - color: #000000; - margin-top: 0.5em; - margin-bottom: 0.5em; -} - -h1 { - font-size: 4em; - text-shadow: 0 1px 1px #444; - padding-top: 10px; - margin: 0; -} - -h2 { - font-size: 2.5em; - text-shadow: 0 1px 1px #444; -} - -h3 { - font-size: 1.3em; - text-shadow: 0 1px 0 #444; -} - -pre { - background: none repeat scroll 0 0 #333333; - border-width: 2px; - border-style: solid; - border-color: #000; - box-shadow: 5px 5px 20px #AAAAAA; - color: #F1F2F3; - display: block; - font-family: monospace; - font-size: 12px; - line-height: 1.5em; - margin: 1.5em 0; - padding: 1em; - white-space: pre-wrap; - word-wrap: break-word; - text-align: left; -} - -button { - background: none repeat scroll 0 0 #333333; - border-width: 2px; - border-style: solid; - border-color: #000; - box-shadow: 5px 5px 20px #AAAAAA; - color: #F1F2F3; - display: block; - font-size: 12px; - line-height: 1.5em; - margin: 1.5em 0; - padding: 0.3em; - text-align: center; - width: 90%; -} - -p { - padding-left: 1em; - padding-right: 1em; -} - -td.left, th.left { - padding-right: 5px; - padding-bottom: 5px; - vertical-align: top; - text-align: right; -} -td.right, th.right { - padding-left: 5px; - padding-bottom: 5px; - vertical-align: top; - text-align: left; -} - -table.ticket-table td { - vertical-align: top; -} - -td h3 { - white-space: nowrap; -} - -ul { - margin: 0; - list-style-image:url(../img/favicon-16.png); -} - -ol { - padding-top: 1em; - padding-bottom: 1em; -} - -dl.toc { - overflow: hidden; -} - -dl.toc dt { - float: left; - clear: left; - width: 4em; -} - -dl.toc dt.toc-main { - padding-top: 1em; -} - -dl.toc dd { - float: left; - width: 50%; - margin: 0 0.5em; -} - -dl.toc dd.toc-main { - padding-top: 1em; -} - -button a, -button a:link, -button a:visited, -button a:hover, -button a:active { - color: #F1F2F3; - text-decoration: none; - text-shadow: 0 1px 2px #333333; -} - - -a, -a:link, -a:visited, -a:hover, -a:active { - color: #000000; - text-decoration: none; - text-shadow: 0 1px 2px #333333; -} - -a:hover { - text-decoration: underline; -} - -h2 a, h2 a:link, h2 a:visited, h2 a:hover, h2 a:active { - color: #aaaaaa; - text-decoration: none; - text-shadow: 0 1px 1px #444444; - - left: -30px; - position: absolute; - width: 740px; -} - -h2 a:hover { - text-decoration: underline; -} - -.wrapper { - height: auto; - min-height: 101%; - width: 1050px; - margin: 0 auto; - position: relative; -} - -.block { - background-color: #FFFFFF; - width: 100%; - - border-width: 0; - border-style: solid; - border-color: #000; - box-shadow: 0 0 30px #777777; -} - -#header { - padding-top: 1em; - padding-left: 3em; - padding-right: 3em; - padding-bottom: 1em; - - background: #aaaaaa; - background: -webkit-linear-gradient(left, #aaaaaa, #ffeeee); - background: -moz-linear-gradient(left, #aaaaaa, #ffeeee); - background: gradient(linear, left, right, from(#aaaaaa), to(#ffeeee)); - filter: progid:DXImageTransform.Microsoft.Gradient( - StartColorStr='#aaaaaa', EndColorStr='#ffeeee', GradientType=1); - - -webkit-box-shadow: inset rgba(0,0,0,.1) 0 5px 5px; - -moz-box-shadow: inset rgba(0,0,0,.1) 0 5px 5px; - box-shadow: inset rgba(0,0,0,.1) 0 5px 5px; - border-top: 1px solid rgba(0,0,0,.2); -} - -#content { - padding-top: 1em; - padding-left: 3em; - padding-right: 3em; - - background: #e8e8e8; - background: -webkit-linear-gradient(left, #e8e8e8, #ffffff); - /* [#2354] Firefox seems to have a bug here, for large pages */ - /* background: -moz-linear-gradient(left, #e8e8e8, #ffffff); */ - background: gradient(linear, left, right, from(#e8e8e8), to(#ffffff)); - filter: progid:DXImageTransform.Microsoft.Gradient( - StartColorStr='#e8e8e8', EndColorStr='#ffffff', GradientType=1); - - -webkit-box-shadow: inset rgba(0,0,0,.1) 0 5px 5px; - -moz-box-shadow: inset rgba(0,0,0,.1) 0 5px 5px; - box-shadow: inset rgba(0,0,0,.1) 0 5px 5px; - border-top: 1px solid rgba(0,0,0,.2); -} - -#navigation { - font-family: 'Special Elite',cursive; - - padding-top: 25px; - padding-left: 3em; - padding-right: 3em; - - height: 50px; - background: #444; - background: -webkit-linear-gradient(left top, #555, #333); - background: -moz-linear-gradient(top, #555, #333); - background: gradient(linear, left top, left bottom, from(#555), to(#333)); -} - -#tweets { - padding-top: 4px; - height: 25px; - float: left; -} - -#menu { - float: right; -} - -div.tweet-item { - float: left; - white-space: nowrap; - overflow: hidden; -} - -#tweets { - height: 25px; - float: left; - padding: 0; -} - -#menu { - float: right; -} - -div.tweet-item { - float: left; - padding-right: 20px; -} - -div.tweet-item img { - box-shadow: 0 0 5px #000; - border: 0; -} - -#navigation a, -#navigation a:link, -#navigation a:visited, -#navigation a:hover, -#navigation a:active { - color: #aaa; - text-shadow: #000 -1px -1px 0px; - text-decoration: none; - font-size: 1.5em; -} - -#navigation .navigation-item-active a, -#navigation .navigation-item-active a:link, -#navigation .navigation-item-active a:visited, -#navigation .navigation-item-active a:hover, -#navigation .navigation-item-active a:active { - color: #ffdddd; -} - -#navigation a:hover { - text-decoration: underline; -} - -div.navigation-item-left { - float: left; - margin-left: 2em; - height: 50px; -} - -div.navigation-item-active { - background: url("../img/navigation-item-active.png") no-repeat center bottom; -} - -#footer { - font-size: 0.7em; - color: #ddd; - - padding-top: 1em; - padding-left: 3em; - padding-right: 3em; - padding-bottom: 1em; - - background: #888787; - background: -webkit-gradient(linear, left, right, from(#888787), to(#666)); - background: -moz-linear-gradient(left, #888787, #666); - background: gradient(linear, left, right, from(#888787), to(#666)); - -webkit-box-shadow: inset rgba(0,0,0,.1) 0 5px 5px; - -moz-box-shadow: inset rgba(0,0,0,.1) 0 5px 5px; - box-shadow: inset rgba(0,0,0,.1) 0 5px 5px; - border-top: 1px solid rgba(0,0,0,.2); - text-shadow: #555 -1px -1px 0px; -} - -div.screenshot { - background: none repeat scroll 0 0 #ffffff; - border-width: 2px; - border-style: solid; - border-color: #000; - box-shadow: 5px 5px 20px #AAAAAA; - color: #000000; - display: block; - font-family: monospace; - font-size: 12px; - line-height: 1.5em; - margin: 1.5em 0; - white-space: pre-wrap; - word-wrap: break-word; - text-align: center; -} - -code { - font-family: monospace; - font-size: 12px; -} - -.mono { - font-family: monospace; -} - -.row { - width: 100%; - margin-top: 0; - margin-left: auto; - margin-right: auto; - overflow: hidden; -} - -.col { - float: left; - margin: 0; - overflow: hidden; -} - -.col > * { - margin-right: 20px; -} - -.col .input, -.col select { - width: 90%; -} - -.col-1 { - width: 33%; -} - -.col-2 { - width: 66%; -} - -.col-3 { - width: 100%; -} - -#intro { - height: auto; - margin-top: 40px; -} - -#intro .row { - margin-bottom: 30px; -} - -#intro .col { - height: 300px; -} - -#registration { - height: auto; -} - -#registration .row { - margin-bottom: 10px; -} diff --git a/jOOQ-website/css/jquery.modal.css b/jOOQ-website/css/jquery.modal.css deleted file mode 100644 index 7f5c7fc840..0000000000 --- a/jOOQ-website/css/jquery.modal.css +++ /dev/null @@ -1,44 +0,0 @@ -.modal { - display: none; - width: 400px; - background: #fff; - padding: 15px 30px; - -webkit-border-radius: 8px; - -moz-border-radius: 8px; - -o-border-radius: 8px; - -ms-border-radius: 8px; - border-radius: 8px; - -webkit-box-shadow: 0 0 10px #000; - -moz-box-shadow: 0 0 10px #000; - -o-box-shadow: 0 0 10px #000; - -ms-box-shadow: 0 0 10px #000; - box-shadow: 0 0 10px #000; -} - -.modal a.close-modal { - position: absolute; - top: -12.5px; - right: -12.5px; - display: block; - width: 30px; - height: 30px; - text-indent: -9999px; - background: url(close.png) no-repeat 0 0; -} - -.modal-spinner { - display: none; - width: 64px; - height: 64px; - position: fixed; - top: 50%; - left: 50%; - margin-right: -32px; - margin-top: -32px; - background: url(spinner.gif) #111 no-repeat center center; - -webkit-border-radius: 8px; - -moz-border-radius: 8px; - -o-border-radius: 8px; - -ms-border-radius: 8px; - border-radius: 8px; -} \ No newline at end of file diff --git a/jOOQ-website/donate.php b/jOOQ-website/donate.php deleted file mode 100644 index 20b5b9b312..0000000000 --- a/jOOQ-website/donate.php +++ /dev/null @@ -1,43 +0,0 @@ - - - -

Crowd-Fund jOOQ features on Catincan

-

-Some features might need a little funding to get started first. For example adding MS Access support to jOOQ. -

-

-In order to provide official support for MS Access in jOOQ, an MS Access license needs to be purchased from Microsoft. -

-

-You might have other ideas about features that could be funded in jOOQ. For more info, please refer to Catincan: -

-

-https://www.catincan.com/projects/close/jooq -

- - -

Donate directly through SourceForge / PayPal

-

-If you don't need any merchandise, or if you want to donate a bigger amount, feel free to do so directly here: -

-

-https://sourceforge.net/p/jooq/donate -

-

-Your donations are highly valued and make up for the numerous amounts of hours (and love) put into jOOQ. It also helps buying those more and more demanding machines that can run 14 RDBMS in parallel, for integration tests :-) -

- \ No newline at end of file diff --git a/jOOQ-website/download.php b/jOOQ-website/download.php deleted file mode 100644 index 192818daf1..0000000000 --- a/jOOQ-website/download.php +++ /dev/null @@ -1,123 +0,0 @@ - - -

# Download

-

-Get the latest version from SourceForge
-https://sourceforge.net/projects/jooq/files/Release/ -

- -

Maven

-

-jOOQ is also available as a Maven dependency from Maven central. Early snapshots can be obtained from the Sonatype Maven repository: -
-https://oss.sonatype.org/content/repositories/snapshots/org/jooq/ -

- -

Source Code

-

-jOOQ's sources are hosted at GitHub: -
-git@github.com:jOOQ/jOOQ.git -

- -

# Get the right version of jOOQ

-

-For increased quality, jOOQ uses semantic versioning. -The jOOQ roadmap plans for: -

- -
    -
  • jooq-X.0.0: major releases about once a year
  • -
  • jooq-X.Y.0: minor releases about once a month
  • -
  • jooq-X.Y.Z:patch releases at will
  • -
- -

3.x release notes

-

-Find release notes for currently maintained branches here: -

- - -

2.x release notes

-

-Find release notes for past branches here: -

- - -

-All branches are available here
-https://sourceforge.net/projects/jooq/files/Release/ -

- -

Future versions

-

-The semi-formal roadmap is here:
-https://github.com/jOOQ/jOOQ/issues/milestones -

- -

# License

-

-jOOQ is distributed under the Apache 2.0 licence -

- -

# Download other products of the jOO* family

-

-"jOO*" stands for Java Object Oriented ... It started with jOOQ, an internalised -domain specific language (aka SQL), written in Java. This DSL happens to be a -fluent API, a concept that is on the rise in software engineering. jOO* comes -into play whenever a pre-existing API is too clumsy and no fun to work with. Here -are some other products: - -

jOOX

-
- - The jOOX Logo -

jOOX stands for Java - Object Oriented XML. It is a simple wrapper for the org.w3c.dom package, - to allow for fluent XML document creation and manipulation where DOM is - required but too verbose. jOOX only wraps the underlying document and - can be used to enhance DOM, not as an alternative.

-
- -

jOOR and jOOU

-
-
 
-

jOOR stands for Java - Object Oriented Reflection. It is a simple wrapper for the java.lang.reflect package, - to allow for fluent reflective access of objects in Java.

-

jOOU stands for Java - Object Oriented Unsigned. It is a simple implementation of unsigned integer numbers in Java, - created out of necessity, as jOOQ supports MySQL's (and other databases') unsigned integers

-
- - - \ No newline at end of file diff --git a/jOOQ-website/e/.htaccess b/jOOQ-website/e/.htaccess deleted file mode 100644 index 5e4215af73..0000000000 --- a/jOOQ-website/e/.htaccess +++ /dev/null @@ -1 +0,0 @@ -Satisfy any diff --git a/jOOQ-website/e/400-bad_request.html b/jOOQ-website/e/400-bad_request.html deleted file mode 100644 index 4f215aca4d..0000000000 --- a/jOOQ-website/e/400-bad_request.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - - 400 Bad Request - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- The jOOQ Logo - - diff --git a/jOOQ-website/e/401-authorization_required.html b/jOOQ-website/e/401-authorization_required.html deleted file mode 100644 index c275d1c612..0000000000 --- a/jOOQ-website/e/401-authorization_required.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - - 401 Authorization Required - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- The jOOQ Logo - - diff --git a/jOOQ-website/e/403-forbidden.html b/jOOQ-website/e/403-forbidden.html deleted file mode 100644 index 4db7dc95be..0000000000 --- a/jOOQ-website/e/403-forbidden.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - - 403 Forbidden - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- The jOOQ Logo - - diff --git a/jOOQ-website/e/404-not_found.html b/jOOQ-website/e/404-not_found.html deleted file mode 100644 index e8e31554e8..0000000000 --- a/jOOQ-website/e/404-not_found.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - - 404 Not Found - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- The jOOQ Logo - - diff --git a/jOOQ-website/e/408-request_timed_out.html b/jOOQ-website/e/408-request_timed_out.html deleted file mode 100644 index 3eeabc129f..0000000000 --- a/jOOQ-website/e/408-request_timed_out.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - - 408 Request Timed Out - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- The jOOQ Logo - - diff --git a/jOOQ-website/e/500-internal_server_error.html b/jOOQ-website/e/500-internal_server_error.html deleted file mode 100644 index 85d878abc1..0000000000 --- a/jOOQ-website/e/500-internal_server_error.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - - 500 Internal Server Error - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- The jOOQ Logo - - diff --git a/jOOQ-website/e/503-service_unavailable.html b/jOOQ-website/e/503-service_unavailable.html deleted file mode 100644 index ff06679fa2..0000000000 --- a/jOOQ-website/e/503-service_unavailable.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - - 503 Service Unavailable - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- The jOOQ Logo - - diff --git a/jOOQ-website/e/index.html b/jOOQ-website/e/index.html deleted file mode 100644 index 19b5105ac2..0000000000 --- a/jOOQ-website/e/index.html +++ /dev/null @@ -1,453 +0,0 @@ - - -Codes HTTP / HTTP Codes - - - - -Codes : -1xx -2xx -3xx -4xx -5xx -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*1xx : Codes d'information / Information codes
CodeStatut / StatusDescription / Comment
100ContinuerAttente de la suite de la requête.
-La partie initiale de la requête a bien été reçue et le client peut continuer avec la suite de cette requête.
ContinueWaiting for the end part of the request.
-The initial part of the request has been received and the client may continue with its request.
101Changement de protocolesLe serveur accepte la requête du client de changer de protocole.
-Le client a demandé au serveur d'utiliser un autre protocole que celui actuellement utilisé, et le serveur accepte cette requête.
Switching ProtocolsThe server is complying with a client request to switch protocols to the one specified in the Upgrade header field.
-The client asked the server to use another protocol than the one actually used, and the server complied this request.
*2xx : Codes de succès / Success codes
CodeStatut / StatusDescription / Comment
200OKLa requête HTTP a été traitée avec succès.
-L'information retournée avec la réponse dépend de la méthode utilisée dans la requête. Par exemple la réponse à une requête GET classiquement émise par un navigateur web sera la ressource demandée (c'est-à-dire une page HTML, une image, etc).
OKThe HTTP request has succeeded.
-The information returned with the response is dependent on the method used in the request. For example the response to a standard GET request issued by a web browser is the requested resource (i.e. an HTML page, an image, etc).
201CrééLa requête a été correctement traitée et a résulté en la création d'une nouvelle ressource.
-Cette ressource peut être référencée par l'URI retournée dans le corps de la réponse, avec l'URL la plus précise pour la ressource indiquée dans l'en-tête du champ "Location".
CreatedThe request has been fulfilled and resulted in a new resource being created.
-The newly created resource can be referenced by the URI(s) returned in the entity of the response, with the most specific URL for the resource given by a Location header field.
202AcceptéLa requête a été acceptée pour être traitée, mais son traitement peut ne pas avoir abouti.
-Ce code est utilisé en remplacement du 201 lorsque le traitement ne peut pas avoir lieu immédiatement, son résultat est donc indéterminé.
AcceptedThe request has been accepted for processing, but the processing has not been completed.
-This code is used instead of 201 when the processing of the request cannot be carried out immediately, leaving the result undetermined.
203Information non certifiéeL'information retournée n'a pas été générée par le serveur HTTP mais par une autre source non authentifiée.
Non-Authoritative InformationUsually the preliminary information sent from a server to a browser comes directly from the server. If it does not, then this code might also be sent to indicate that information did not come from a known source.
204Pas de contenuLe serveur HTTP a correctement traité la requête mais il n'y a pas d'information à envoyer en retour.
-Cela peut par exemple se produire lorsqu'un fichier HTML ou le résultat d'un programme CGI-BIN est vide.
No ContentThe request was accepted and filled but no new information is being sent back.
-The browser receiving this response should not change its screen display (although new, and changed, private header information may be sent).
205Contenu réinitialiséLe client doit remettre à zéro le formulaire utilisé dans cette transaction.
-Ce code est envoyé au logiciel de navigation quand il doit réinitialiser un formulaire généré dynamiquement par un CGI-BIN, par exemple.
Reset ContentThe browser should clear the form used for this transaction for additional input.
-Appropriate for data-entry CGI applications.
206Contenu partielLe serveur retourne une partie seulement de la taille demandée.
-Ce code est utilisé lorsqu'une requête spécifiant une taille a été transmise.
Partial ContentThe server is returning partial data of the size requested.
-Used in response to a request specifying a Range header. The server must specify the range included in the response with the Content-Range header.
*3xx : Codes de redirection / Redirection codes
CodeStatut / StatusDescription / Comment
300Choix multiplesL'URI demandée concerne plus d'une ressource.
-Par exemple, l'URI concerne un document qui a été traduit en plusieurs langues. Le serveur doit retourner des informations indiquant comment choisir une ressource précise.
Multiple ChoicesThe requested URI refers to more than one resource.
-For example, the URI could refer to a document that has been translated into many languages. The entity body returned by the server could have a list of more specific data about how to choose the correct resource.
301Changement d'adresse définitifLa ressource demandée possède une nouvelle adresse (URI).
-Toute référence future à cette ressource doit être faite en utilisant l'une des URIs retournées dans la réponse. Le navigateur web doit normalement charger automatiquement la ressource demandée à sa nouvelle adresse.
Moved PermanentlyThe requested resource has been assigned a new permanent address (URI).
-Any future references to this resource should be done using one of the returned URIs. Web browsers should automatically load the requested resource using its new address.
302Changement d'adresse temporaireLa ressource demandée réside temporairement à une adresse (URI) différente.
-Cette redirection étant temporaire, le navigateur web doit continuer à utiliser l'URI originale pour les requêtes futures.
Moved TemporarilyThe requested resource resides temporarily under a different URI.
-Since the redirection may be altered on occasion, the client should continue to use the Request-URI for future requests.
303Voir ailleursL'URI spécifié est disponible à un autre URI et doit être demandé par un GET.
See OtherThe requested URI can be found at a different URI (specified in the Location header) and should be retrieved by a GET on that resource.
304Non modifiéLe navigateur web a effectué une requête GET conditionnelle et l'accès est autorisé, mais le document n'a pas été modifié.
-Cette réponse classique signifie que vous avez configuré votre navigateur pour utiliser un cache HTTP (proxy) dans lequel une copie du document demandé est déjà stockée. Le proxy a donc demandé au serveur si le document original a changé depuis, et a reçu cette réponse : il pourra ainsi utiliser la copie locale.
Not ModifiedThe web browser has performed a conditional GET request and access is allowed, but the document has not been modified.
-This classic response means you have configured your web browser to use an HTTP cache (proxy) in which a copy of the requested document is already stored. The cache proxy thus asked the server if the original document was modified, and received this response, so it will use the local copy instead of loading it from the server.
305Utiliser le proxyL'URI spécifié doit être accédé en passant par le proxy.
Use ProxyThe requested URI must be accessed through the proxy in the Location header.
*4xx : Erreur du client / Client Error
CodeStatut / StatusDescription / Comment
400Mauvaise requêteLa requête HTTP n'a pas pu être comprise par le serveur en raison d'une syntaxe erronée.
-Le problème peut provenir d'un navigateur web trop récent ou d'un serveur HTTP trop ancien.
Bad RequestThe HTTP request could not be understood by the server due to malformed syntax.
-The web browser may be too recent, or the HTTP server may be too old.
401Non autoriséLa requête nécessite une identification de l'utilisateur.
-Concrètement, cela signifie que tout ou partie du serveur contacté est protégé par un mot de passe, qu'il faut indiquer au serveur pour pouvoir accéder à son contenu.
UnauthorizedThe request requires user authentication.
-This means that all or a part of the requested server is protected by a password that should be given to the server to allow access to its contents.
402Paiement exigéCe code n'est pas encore mis en oeuvre dans le protocole HTTP.
Payment RequiredThis code is not yet implemented in HTTP.
403InterditLe serveur HTTP a compris la requête, mais refuse de la traiter.
-Ce code est généralement utilisé lorsqu'un serveur ne souhaite pas indiquer pourquoi la requête a été rejetée, ou lorsqu'aucune autre réponse ne correspond (par exemple le serveur est un Intranet et seules les machines du réseau local sont autorisées à se connecter au serveur).
ForbiddenThe HTTP server understood the request, but is refusing to fulfill it.
-This status code is commonly used when the server does not wish to reveal exactly why the request has been refused, or when no other response is applicable (for example the server is an Intranet and only the LAN machines are authorized to connect).
404Non trouvéLe serveur n'a rien trouvé qui corresponde à l'adresse (URI) demandée.
-Cela signifie que l'URL que vous avez tapée ou cliquée est mauvaise ou obsolète et ne correspond à aucun document existant sur le serveur (vous pouvez essayez de supprimer progressivement les composants de l'URL en partant de la fin pour éventuellement retrouver un chemin d'accès existant).
Not FoundThe server has not found anything matching the requested address (URI).
-This means the URL you have typed or cliked on is wrong or obsolete and does not match any document existing on the server (you may try to gradualy remove the URL components from the right to the left to eventually retrieve an existing path).
405Méthode non autoriséeCe code indique que la méthode utilisée par le client n'est pas supportée pour cet URI.
Method Not AllowedThis code is given with the Allow header and indicates that the method used by the client is not supported for this URI.
406Aucun disponibleL'adresse (URI) spécifiée existe, mais pas dans le format préféré du client.
-Le serveur indique en retour le langage et les types d'encodages disponibles pour cette adresse.
Not AcceptableThe URI specified by the client exists, but not in a format preferred by the client.
-Along with this code, the server provides the Content-Language, Content-Encoding, and Content-Type headers.
407Authentification proxy exigéeLe serveur proxy exige une authentification du client avant de transmettre la requête.
Proxy Authentication RequiredThe proxy server needs to authorize the request before forwarding it.
408Requête hors-délaiLe client n'a pas présenté une requête complète pendant le délai maximal qui lui était imparti, et le serveur a abandonné la connexion.
Request Time-outThis response code means the client did not produce a full request within some predetermined time (usually specified in the server's configuration), and the server is disconnecting the network connection.
409ConflitLa requête entre en conflit avec une autre requête ou avec la configuration du serveur.
-Des informations sur les raisons de ce conflit doivent être indiquée en retour.
ConflictThis code indicates that the request conflicts with another request or with the server's configuration.
-Information about the conflict should be returned in the data portion of the reply.
410PartiL'adresse (URI) demandée n'existe plus et a été définitivement supprimée du serveur.
GoneThis code indicates that the requested URI no longer exists and has been permanently removed from the server.
411Longueur exigéeLe serveur a besoin de connaître la taille de cette requête pour pouvoir y répondre.
Length RequiredThe server will not accept the request without a Content-Length header supplied in the request.
412Précondition échouéeLes conditions spécifiées dans la requête ne sont pas remplies.
Precondition FailedThe condition specified by one or more If... headers in the request evaluated to false.
413Corps de requête trop grandLe serveur ne peut traiter la requête car la taille de son contenu est trop importante.
Request Entity Too LargeThe server will not process the request because its entity body is too large.
414URI trop longLe serveur ne peut traiter la requête car la taille de l'objet (URI) a retourner est trop importante.
Request-URI Too LongThe server will not process the request because its request URI is too large.
415Format non supportéLe serveur ne peut traiter la requête car son contenu est écrit dans un format non supporté.
Unsupported Media TypeThe server will not process the request because its entity body is in an unsupported format.
416Plage demandée invalideLe sous-ensemble de recherche spécifié est invalide.
Requested range unsatifiableThe server will not process the request because the requested range is invalid.
417Comportement erronéLe comportement prévu pour le serveur n'est pas supporté.
Expectation failedThe behavior expected fot the server is not supported.
*5xx : Erreur du serveur / Server Error
CodeStatut / StatusDescription / Comment
500Erreur interne du serveurLe serveur HTTP a rencontré une condition inattendue qui l'a empêché de traiter la requête.
-Cette erreur peut par exemple être le résultat d'une mauvaise configuration du serveur, ou d'une ressource épuisée ou refusée au serveur sur la machine hôte.
Internal Server ErrorThe HTTP server encountered an unexpected condition which prevented it from fulfilling the request.
-For example this error can be caused by a serveur misconfiguration, or a resource exhausted or denied to the server on the host machine.
501Non mis en oeuvreLe serveur HTTP ne supporte pas la fonctionnalité nécessaire pour traiter la requête.
-C'est la réponse émise lorsque le serveur ne reconnaît pas la méthode indiquée dans la requête et n'est capable de la mettre en oeuvre pour aucune ressource (soit le navigateur web est trop récent, soit le serveur HTTP est trop ancien).
Not ImplementedThe HTTP server does not support the functionality required to fulfill the request.
-This is the appropriate response when the server does not recognize the request method and is not capable of supporting it for any resource (either the web browser is too recent, or the HTTP server is too old).
502Mauvais intermédiaireLe serveur intermédiaire a fourni une réponse invalide.
-Le serveur HTTP a agi en tant qu'intermédiaire (passerelle ou proxy) avec un autre serveur, et a reçu de ce dernier une réponse invalide en essayant de traiter la requête.
Bad GatewayThe gateway server returned an invalid response.
-The HTTP server, while acting as a gateway or proxy, received an invalid response from the upstream server it accessed in attempting to fulfill the request.
503Service indisponibleLe serveur HTTP est actuellement incapable de traiter la requête en raison d'une surcharge temporaire ou d'une opération de maintenance.
-Cela sous-entend l'existence d'une condition temporaire qui sera levée après un certain délai.
Service UnavailableThe HTTP server is currently unable to handle the request due to a temporary overloading or maintenance of the server.
-The implication is that this is a temporary condition which will be alleviated after some delay.
504Intermédiaire hors-délaiCette réponse est identique au code 408 (requête hors-délai), mais ici c'est un proxy ou un autre intermédiaire qui a mis trop longtemps à répondre.
Gateway Time-outThis response is like 408 (Request Time-out) except that a gateway or proxy has timed out.
505Version HTTP non supportéeLa version du protocole HTTP utilisée dans cette requête n'est pas (ou plus) supportée par le serveur.
HTTP Version not supportedThe server will not support the HTTP protocol version used in the request.
- - - diff --git a/jOOQ-website/error.log b/jOOQ-website/error.log deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/jOOQ-website/eula.php b/jOOQ-website/eula.php deleted file mode 100644 index 46466db031..0000000000 --- a/jOOQ-website/eula.php +++ /dev/null @@ -1,25 +0,0 @@ - - -

End User License Agreement

-

- The jOOQ Commercial License is not yet effective. You may thus not yet use jOOQ using the Commercial License. -

-

- Come back soon to learn how to commercially license jOOQ. -

- - \ No newline at end of file diff --git a/jOOQ-website/favicon.ico b/jOOQ-website/favicon.ico deleted file mode 100644 index a4773d156f..0000000000 Binary files a/jOOQ-website/favicon.ico and /dev/null differ diff --git a/jOOQ-website/fnt/Infinity.ttf b/jOOQ-website/fnt/Infinity.ttf deleted file mode 100644 index f67855a26c..0000000000 Binary files a/jOOQ-website/fnt/Infinity.ttf and /dev/null differ diff --git a/jOOQ-website/frame.php b/jOOQ-website/frame.php deleted file mode 100644 index f538b57a87..0000000000 --- a/jOOQ-website/frame.php +++ /dev/null @@ -1,367 +0,0 @@ -This version of the manual is outdated. For the latest version, follow this link: ' . - 'http://www.jooq.org/doc/' . $minorVersion . '/manual' . $singleSuffix . - '.

'; -} - -?> - - - - <?php - if (isset($home)) { - print "jOOQ is a fluent API for typesafe SQL query construction and execution"; - } else { - print getH1(); - } - ?> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-
- -
-
-
- - - - -
- The jOOQ Logo -
- - - - - diff --git a/jOOQ-website/img/.gitignore b/jOOQ-website/img/.gitignore deleted file mode 100644 index 0acd18c94c..0000000000 --- a/jOOQ-website/img/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/Thumbs.db diff --git a/jOOQ-website/img/banner-medium.png b/jOOQ-website/img/banner-medium.png deleted file mode 100644 index aefd51b57f..0000000000 Binary files a/jOOQ-website/img/banner-medium.png and /dev/null differ diff --git a/jOOQ-website/img/bg.jpg b/jOOQ-website/img/bg.jpg deleted file mode 100644 index 4847ebea0a..0000000000 Binary files a/jOOQ-website/img/bg.jpg and /dev/null differ diff --git a/jOOQ-website/img/eclipse-example-01.png b/jOOQ-website/img/eclipse-example-01.png deleted file mode 100644 index 372276eaf5..0000000000 Binary files a/jOOQ-website/img/eclipse-example-01.png and /dev/null differ diff --git a/jOOQ-website/img/eclipse-example-02.png b/jOOQ-website/img/eclipse-example-02.png deleted file mode 100644 index e53f3c524e..0000000000 Binary files a/jOOQ-website/img/eclipse-example-02.png and /dev/null differ diff --git a/jOOQ-website/img/eclipse-example-03.png b/jOOQ-website/img/eclipse-example-03.png deleted file mode 100644 index a1d87db25b..0000000000 Binary files a/jOOQ-website/img/eclipse-example-03.png and /dev/null differ diff --git a/jOOQ-website/img/eclipse-example-04.png b/jOOQ-website/img/eclipse-example-04.png deleted file mode 100644 index a8fc4e8726..0000000000 Binary files a/jOOQ-website/img/eclipse-example-04.png and /dev/null differ diff --git a/jOOQ-website/img/eclipse-example-05.png b/jOOQ-website/img/eclipse-example-05.png deleted file mode 100644 index 1fac385811..0000000000 Binary files a/jOOQ-website/img/eclipse-example-05.png and /dev/null differ diff --git a/jOOQ-website/img/favicon-16.png b/jOOQ-website/img/favicon-16.png deleted file mode 100644 index 58d2c8b32e..0000000000 Binary files a/jOOQ-website/img/favicon-16.png and /dev/null differ diff --git a/jOOQ-website/img/favicon-32.png b/jOOQ-website/img/favicon-32.png deleted file mode 100644 index 21115aade8..0000000000 Binary files a/jOOQ-website/img/favicon-32.png and /dev/null differ diff --git a/jOOQ-website/img/forkme.png b/jOOQ-website/img/forkme.png deleted file mode 100644 index 10c08f4d55..0000000000 Binary files a/jOOQ-website/img/forkme.png and /dev/null differ diff --git a/jOOQ-website/img/jooq-console-01.png b/jOOQ-website/img/jooq-console-01.png deleted file mode 100644 index b52d1f4644..0000000000 Binary files a/jOOQ-website/img/jooq-console-01.png and /dev/null differ diff --git a/jOOQ-website/img/jooq-console-02.png b/jOOQ-website/img/jooq-console-02.png deleted file mode 100644 index 4c32430baf..0000000000 Binary files a/jOOQ-website/img/jooq-console-02.png and /dev/null differ diff --git a/jOOQ-website/img/jooq-logo-black.png b/jOOQ-website/img/jooq-logo-black.png deleted file mode 100644 index d53c3992cf..0000000000 Binary files a/jOOQ-website/img/jooq-logo-black.png and /dev/null differ diff --git a/jOOQ-website/img/joox-big-bw.png b/jOOQ-website/img/joox-big-bw.png deleted file mode 100644 index 63e984bbf1..0000000000 Binary files a/jOOQ-website/img/joox-big-bw.png and /dev/null differ diff --git a/jOOQ-website/img/joox-big.png b/jOOQ-website/img/joox-big.png deleted file mode 100644 index 56d8162c6a..0000000000 Binary files a/jOOQ-website/img/joox-big.png and /dev/null differ diff --git a/jOOQ-website/img/joox-bw.png b/jOOQ-website/img/joox-bw.png deleted file mode 100644 index 883fca22e2..0000000000 Binary files a/jOOQ-website/img/joox-bw.png and /dev/null differ diff --git a/jOOQ-website/img/joox-small.png b/jOOQ-website/img/joox-small.png deleted file mode 100644 index aa255723e4..0000000000 Binary files a/jOOQ-website/img/joox-small.png and /dev/null differ diff --git a/jOOQ-website/img/joox.png b/jOOQ-website/img/joox.png deleted file mode 100644 index bc78caeba8..0000000000 Binary files a/jOOQ-website/img/joox.png and /dev/null differ diff --git a/jOOQ-website/img/logo-223x170.png b/jOOQ-website/img/logo-223x170.png deleted file mode 100644 index e66bffe3f4..0000000000 Binary files a/jOOQ-website/img/logo-223x170.png and /dev/null differ diff --git a/jOOQ-website/img/logo-big-bw.png b/jOOQ-website/img/logo-big-bw.png deleted file mode 100644 index 8bf09d7772..0000000000 Binary files a/jOOQ-website/img/logo-big-bw.png and /dev/null differ diff --git a/jOOQ-website/img/logo-big.jpg b/jOOQ-website/img/logo-big.jpg deleted file mode 100644 index 970912c0ca..0000000000 Binary files a/jOOQ-website/img/logo-big.jpg and /dev/null differ diff --git a/jOOQ-website/img/logo-big.png b/jOOQ-website/img/logo-big.png deleted file mode 100644 index fcb1824469..0000000000 Binary files a/jOOQ-website/img/logo-big.png and /dev/null differ diff --git a/jOOQ-website/img/logo-bw.png b/jOOQ-website/img/logo-bw.png deleted file mode 100644 index dafa088645..0000000000 Binary files a/jOOQ-website/img/logo-bw.png and /dev/null differ diff --git a/jOOQ-website/img/logo.png b/jOOQ-website/img/logo.png deleted file mode 100644 index 3c4dfe1eb8..0000000000 Binary files a/jOOQ-website/img/logo.png and /dev/null differ diff --git a/jOOQ-website/img/navigation-item-active.png b/jOOQ-website/img/navigation-item-active.png deleted file mode 100644 index 3c4966b080..0000000000 Binary files a/jOOQ-website/img/navigation-item-active.png and /dev/null differ diff --git a/jOOQ-website/img/social-fb-hover.png b/jOOQ-website/img/social-fb-hover.png deleted file mode 100644 index ae733892c4..0000000000 Binary files a/jOOQ-website/img/social-fb-hover.png and /dev/null differ diff --git a/jOOQ-website/img/social-fb.png b/jOOQ-website/img/social-fb.png deleted file mode 100644 index ae733892c4..0000000000 Binary files a/jOOQ-website/img/social-fb.png and /dev/null differ diff --git a/jOOQ-website/img/social-g+-hover.png b/jOOQ-website/img/social-g+-hover.png deleted file mode 100644 index ce6b4261ca..0000000000 Binary files a/jOOQ-website/img/social-g+-hover.png and /dev/null differ diff --git a/jOOQ-website/img/social-g+.png b/jOOQ-website/img/social-g+.png deleted file mode 100644 index 3b74db2cd2..0000000000 Binary files a/jOOQ-website/img/social-g+.png and /dev/null differ diff --git a/jOOQ-website/img/social-gh.png b/jOOQ-website/img/social-gh.png deleted file mode 100644 index 470a72be73..0000000000 Binary files a/jOOQ-website/img/social-gh.png and /dev/null differ diff --git a/jOOQ-website/img/social-in-hover.png b/jOOQ-website/img/social-in-hover.png deleted file mode 100644 index 8b838cef76..0000000000 Binary files a/jOOQ-website/img/social-in-hover.png and /dev/null differ diff --git a/jOOQ-website/img/social-in.png b/jOOQ-website/img/social-in.png deleted file mode 100644 index 1d4044e914..0000000000 Binary files a/jOOQ-website/img/social-in.png and /dev/null differ diff --git a/jOOQ-website/img/social-nl-hover.png b/jOOQ-website/img/social-nl-hover.png deleted file mode 100644 index d18926c046..0000000000 Binary files a/jOOQ-website/img/social-nl-hover.png and /dev/null differ diff --git a/jOOQ-website/img/social-nl.png b/jOOQ-website/img/social-nl.png deleted file mode 100644 index 778d27c785..0000000000 Binary files a/jOOQ-website/img/social-nl.png and /dev/null differ diff --git a/jOOQ-website/img/social-so.png b/jOOQ-website/img/social-so.png deleted file mode 100644 index 8dcd540070..0000000000 Binary files a/jOOQ-website/img/social-so.png and /dev/null differ diff --git a/jOOQ-website/img/social-su.png b/jOOQ-website/img/social-su.png deleted file mode 100644 index 857407e236..0000000000 Binary files a/jOOQ-website/img/social-su.png and /dev/null differ diff --git a/jOOQ-website/img/social-subscribe-hover.png b/jOOQ-website/img/social-subscribe-hover.png deleted file mode 100644 index a578854bef..0000000000 Binary files a/jOOQ-website/img/social-subscribe-hover.png and /dev/null differ diff --git a/jOOQ-website/img/social-subscribe.png b/jOOQ-website/img/social-subscribe.png deleted file mode 100644 index 8adc0f4e41..0000000000 Binary files a/jOOQ-website/img/social-subscribe.png and /dev/null differ diff --git a/jOOQ-website/img/social-tw-hover.png b/jOOQ-website/img/social-tw-hover.png deleted file mode 100644 index 9932d128b2..0000000000 Binary files a/jOOQ-website/img/social-tw-hover.png and /dev/null differ diff --git a/jOOQ-website/img/social-tw.png b/jOOQ-website/img/social-tw.png deleted file mode 100644 index c78af6dab6..0000000000 Binary files a/jOOQ-website/img/social-tw.png and /dev/null differ diff --git a/jOOQ-website/img/sql-performance-explained-de.png b/jOOQ-website/img/sql-performance-explained-de.png deleted file mode 100644 index b828e47765..0000000000 Binary files a/jOOQ-website/img/sql-performance-explained-de.png and /dev/null differ diff --git a/jOOQ-website/inc/LICENSE.txt b/jOOQ-website/inc/LICENSE.txt deleted file mode 100644 index 03b0953bc3..0000000000 --- a/jOOQ-website/inc/LICENSE.txt +++ /dev/null @@ -1,38 +0,0 @@ -Copyright (c) 2009-2013, Data Geekery GmbH (http://www.datageekery.com) -All rights reserved. - -This work is dual-licensed -- under the Apache Software License 2.0 (the "ASL") -- under the jOOQ License and Maintenance Agreement (the "jOOQ License") -============================================================================= -You may choose which license applies to you: - -- If you're using this work with Open Source databases, you may choose - either ASL or jOOQ License. -- If you're using this work with at least one commercial database, you must - choose jOOQ License - -For more information, please visit http://www.jooq.org/licenses - -Apache Software License 2.0: ------------------------------------------------------------------------------ -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -jOOQ License and Maintenance Agreement: ------------------------------------------------------------------------------ -Data Geekery grants the Customer the non-exclusive, timely limited and -non-transferable license to install and use the Software under the terms of -the jOOQ License and Maintenance Agreement. - -This library is distributed with a LIMITED WARRANTY. See the jOOQ License -and Maintenance Agreement for more details: http://www.jooq.org/licensing diff --git a/jOOQ-website/inc/RELEASENOTES-2.0.txt b/jOOQ-website/inc/RELEASENOTES-2.0.txt deleted file mode 100644 index 4bce8b89ab..0000000000 --- a/jOOQ-website/inc/RELEASENOTES-2.0.txt +++ /dev/null @@ -1,2299 +0,0 @@ -jOOQ Release notes -================== - -For an interactive overview, see also -http://github.com/jOOQ/jOOQ/issues - -For a formatted text version, see -http://www.jooq.org/notes.php?version=2.0 - -For a text version, see -http://www.jooq.org/inc/RELEASENOTES-2.0.txt - -Version 2.0.6 - April 22, 2012 -================================================================= - -This is a minor patch release, fixing some issues - -Bug fixes ---------- -#1189 - TableMapping regression for SQLite database -#1190 - Cannot store SQLite records when using - StatementType.STATIC_STATEMENT -#1199 - Table.getFields() returns an internal representation of a - table's field list. Make generated tables immutable - instead! -#1211 - Enforce method name disambiguation also when using custom - strategies (regression of #182) -#1212 - Enforce identifier disambiguation also when using custom - strategies (regression) -#1221 - Incorrect ExecuteListener invocation for INSERT .. - RETURNING. executeStart() and executeEnd() are omitted -#1223 - Cache ExecuteListener classes for performance -#1232 - SQLException when Factory.fetch() does not return a - ResultSet -#1237 - Don't generate enum classes for columns in MySQL tables - that are excluded from code generation -#1241 - Wrong variable binding when comparing CHAR columns in - Derby and DB2 without explicit casting to VARCHAR -#1244 - Cannot override class name in GeneratorStrategy in - Mode.POJO -#1256 - User defined H2 functions codegen bug -#1263 - Pass fetchsizes <= 0 to the JDBC driver (for MySQL - compatibility) -#1271 - Most databases allow for multiple identical foreign keys. - This leads to compilation errors in generated source code -#1287 - Remove oracle.sql dependency also from OSGi information - in pom.xml -#1298 - Avoid source code generation errors when generating code - for unknown, dialect-specific data types -#1343 - Regression in insertInto(...).values(...). Cannot pass - Field to values() - -Version 2.0.5 - February 26, 2012 -================================================================= - -This release finally introduced basic runtime configuration -features for the jOOQ Factory. This configuration now includes: - -- Execute listener and SQL tracing support. jOOQ allows you to - hook your own listeners into jOOQ's query execution engine to - be notified of all sorts of events -- The existing SchemaMapping features. They are now part of the - runtime configuration -- StatementType settings. Specify whether a Factory should - execute java.sql.PreparedStatements (with bind variables) or - static java.sql.Statements with inlined variables. - -The runtime configuration is documented here: - -http://www.jooq.org/manual/JOOQ/Factory/ - -The listener and tracing support has been requested by -Christopher Deckers, a new jOOQ user who has had the courtesy to -contribute the new jOOQ Console, which is documented here: - -http://www.jooq.org/manual/ADVANCED/ExecuteListener/ - -Apart from that, another long-requested feature is now fully -implemented: The GeneratorStrategy, allowing for custom naming -strategies in generated source code. This will allow for -generating custom table / record class name prefixes / suffixes, -as well as overriding the default behaviour for rendering UPPER, -lower and CamelCase artefacts. See the manual for details: - -http://www.jooq.org/manual/META/Configuration/ - -Features and improvements -------------------------- -#93 - Add Field.equalIgnoreCase(), Field.notEqualIgnoreCase() -#408 - Add class prefixes, suffixes and other options to the - code generator -#492 - Add runtime configuration -#1107 - Let Field.contains() support the Postgres ARRAY @> ARRAY - operator -#1140 - Add ResultQuery.fetchResultSet() to return the underlying - JDBC result set -#1143 - Add Result.isNotEmpty() for convenience -#1145 - Add runtime configuration to specify whether jOOQ should - execute java.sql.PreparedStatement (with bind variables) - or a java.sql.Statement (with inlined parameters) -#1146 - Add Query.getSQL(boolean) to indicate that bind values - should be inlined (as a convenience for - Factory.renderInlined(QueryPart)) -#1148 - Add Cursor.resultSet() to expose the underlying ResultSet -#1149 - Allow for optional - "http://www.jooq.org/xsd/jooq-codegen-2.0.4.xsd" - namespace in jooq-codegen configuration -#1152 - Add & org.jooq.EnumType> - E MySQLFactory.enumType(Class, int) for enum reverse - lookups of MySQL-specific enums -#1159 - Support matching numbers with LIKE, e.g. ID LIKE '%33%' -#1160 - Implement Field.contains(), .startsWith(), .endsWith() - for numeric values, too -#1161 - Use reflection to remove compile-time dependency on - ojdbc for creating ARRAYs -#1162 - Integrate jOOR into jOOQ for simpler reflection -#1164 - Distinguish between Definition.getInputName(), - .getOutputName() -#1165 - Add constraint name to generated javadoc -#1167 - Trivial issue with org.jooq.Factory.exists Javadoc - - GitHub issue #10 -#1169 - Add Configuration.setData(), getData() to convey custom - data in a configuration's lifecycle -#1172 - Add runtime configuration to deactivate JooqLogger -#1177 - Add jOOQ-Console module to jOOQ -#1184 - Add DataType.isArray() - -API changes (backwards-compatible) ----------------------------------- -#1142 - Rename Result.exportXML() to Result.intoXML() to stay - more consistent -#1151 - Deprecate SchemaMapping in favour of new runtime - configuration - -Bug fixes ---------- -#978 - Schema.getTables() and similar methods return empty lists - when Schema is mapped with SchemaMapping -#1153 - Bad inlining of booleans in Sybase ASE / DB2 / Oracle - SQL Server / SQLite -#1154 - Bad inlining of byte[] in most dialects -#1155 - byte[] are erroneously converted to String when using - Record.intoArray() -#1156 - Bad inlining of DATE / TIME / TIMESTAMP data types in - Ingres (and other dialects, when the setting differs from - the default) -#1166 - Some generated Javadoc uses naming strategy or plain - output name, instead of qualified output name -#1168 - Oracle packages are generated as static, instead of - static final -#1175 - Factory.use() seems to render SQL with the Schema name - still present -#1179 - Oracle-generated ArrayRecords need a reference to - org.jooq.Schema to read TABLE of OBJECT from stored - procedures - -Test cases ----------- -#1147 - Add integration tests for executing SQL generated using - Factory.renderInlined() - -Version 2.0.4 - February 12, 2012 -================================================================= - -This release introduced many improvements to source code -generation. These improvements include: - -- Maven and standalone code generation now use the same XML - configuration, which is read by jOOQ-codegen using JAXB. This - allows for more complex configuration elements in the future -- jOOQ-codegen can now handle multi-schema databases and generate - code for tables referencing tables from other schemata. This - is integration tested against the SQL Server AdventureWorks - database -- jOOQ now allows to generate simple POJOs in addition to Records - and to annotate both POJOs and Records with JPA annotations - such as @Entity, @Table, @Id, @Column, @UniqueConstraint, etc. - -You can migrate your existing .properties configuration by running -> org.jooq.util.GenerationTool /your.properties migrate - -Besides that, there is a lot of ongoing work to improve the -integration of Oracle's TABLE and VARRAY types. - -Features and improvements -------------------------- -#8 - Add JPA annotations to generated POJOs / Records -#282 - Add support for multi-schema databases -#287 - Add support for Oracle TABLE types -#395 - Use XML configuration file instead of properties file -#1089 - Add Field.contains(), .startsWith(), .endsWith() as a - convenience for Field.like() (including escaping) -#1092 - Move master data table configuration from - generator.generate to generator.database namespace -#1093 - Add support for generator.strategy in Maven source code - generation -#1094 - Add support for generator.database.date-as-timestamp in - Maven source code generation -#1095 - Move generator.generate.unsigned-types to - generator.database namespace -#1096 - Add support for generator.generate.unsigned-types in - Maven source code generation -#1103 - Add support for SQL Server data type uniqueidentifier -#1106 - Add Factory.escape(Field, char) for use with LIKE -#1108 - Add support for multi-schema databases using Maven code - generation -#1115 - Add support for Oracle VARRAY/TABLE of OBJECT types -#1127 - Add support for POJO classes generation -#1129 - Allow for using Param in LIMIT .. OFFSET clauses -#1132 - Add RenderContext.castMode() to allow for avoiding casts - where this is not really needed -#1136 - Add generation option to enable/disable generating - navigation methods - -Bug fixes ---------- -#1099 - Derby generated artefacts are not sorted alphabetically -#1101 - Internal API leak exposed through covariance in - AbstractTable.joinXXX() methods -#1110 - VARRAY element type information is lost when unnesting - VARRAY's in Oracle -#1111 - VARRAY element type information is lost when unnesting - VARRAY's returned from functions in Oracle -#1114 - Syntax error when unnesting TABLE of OBJECT in Oracle. - The unnested table contains several columns but jOOQ only - unnests "COLUMN_VALUE" -#1117 - NullPointerException when passing an ArrayRecord - containing a null array to a stored function in Oracle -#1125 - Postgres needs casting for date time data types in - queries like SELECT ? FROM DUAL -#1131 - DB2: [Noauthorized routine named "LIKE" of type - "FUNCTION" having compatible arguments was found] when - using Field.like(concat(x, y)) -#1133 - Compilation errors in generated source code if the same - constraint name exists in several schemata -#1134 - NullPointerException in code generation when a foreign - key constraint references a table from another schema - that is not being generated -#1135 - Generated Javadoc references inputSchema instead of - outputSchema - -Test cases ----------- -#1009 - Add more integration tests for proper handling of - java.sql.Date, Time, Timestamp -#1090 - Run jOOQ tests against AdventureWorks SQL Server sample - database -#1105 - Add integration tests for multi-schema source code - generation and querying -#1122 - The 10k lines of integration test code are too heavy for - the compiler. Create test modules with fewer lines of - code, each. - -Version 2.0.3 - January 29, 2012 -================================================================= - -This release focuses on increased compatibility between various -SQL dialect integrations as far as ARRAY and JOIN support is -concerned: - -- ARRAY types are only available in H2, HSQLDB, Oracle, Postgres. - Nevertheless, they can be somewhat simulated in other dialects - using nested selects with UNION ALL. Increased compatibility - leads to a nicer API, where ARRAYs are used along with ALL/ANY - quantifiers, for instance. - -- JOIN syntaxes can be quite powerful in SQL. Apart from - simulating NATURAL JOIN, JOIN USING clauses, as well as a - synthetic "KEY JOIN" syntax, jOOQ now also supports nesting - JOIN expressions to create more complex table sources. See a - recent blog post on the subject here: - -http://blog.jooq.org/2012/01/15/lets-revise-the-sql-from-clause/ - -Features and improvements -------------------------- -#578 - Add KEY JOIN syntax to simulate joining using generated - foreign keys -#577 - Simulate NATURAL JOIN syntax, where this is unavailable -#582 - Simulate JOIN USING syntax, where this is unavailable -#671 - Allow for nesting JOIN clauses -#676 - Add Table.join() methods to create more flexible table - sources -#993 - Add Field.equalAny(T[]), .equalAny(Field) methods -#1048 - Simulate (array) syntax for dialects - that do not support arrays -#1051 - Add Factory.execute(String, Object...) as a convenience - method for Factory.query(...).execute() -#1055 - Simulate Factory.table(Object[]) and table(List) using - UNION ALL in dialects that do not support arrays -#1060 - Improve debug logging of H2 arrays. The syntax is not - ARRAY[1, 2], but (1, 2) -#1065 - Add OracleFactory.sysContext(String, String) to support - Oracle's SYS_CONTEXT function -#1069 - Add support for INSERT INTO table(field1, field2, ...) - SELECT syntax - as opposed to the existing INSERT INTO - table SELECT -#1072 - Add support for LIKE .. ESCAPE .. syntax -#1074 - Add Field.notBetween(T, T) for convenience -#1080 - Add support for JDBC's Statement.setFetchSize() in - ResultQuery.fetchLazy() -#1082 - Add some more DEBUG logging in AbstractResultQuery - -API changes (backwards-compatible) ----------------------------------- -#1059 - Change SelectFromStep.from(Collection>) to - from(Collection>) - -API changes (backwards-incompatible) ------------------------------------- -#1087 - Change the NTILE function to return Field - instead of Field - -Bug fixes ---------- -#1071 - Make Sequence Serializable -#1081 - Derby error in NULL handling when simulating unnested - arrays that contain NULL values -#1084 - Bind index mismatch in val(null).equal(null) and in - val(null).notEqual(null) -#1091 - Add missing @Support annotations on Table.crossJoin() - methods - -Test cases ----------- -#1026 - Add integration tests for NTILE window function and - document compatibility -#1073 - Add integration tests for NOT IN queries holding NULL - arguments - -Version 2.0.2 - January 8, 2012 -================================================================= - -This is a maintenance release for jOOQ 2.0. The main improvements -include - -- The whole jOOQ API is now annotated with a new org.jooq.Support - annotation to help you assess whether a certain SQL clause is - available in your database or not. This is particularly useful - when your application should support several databases at once - (e.g. MySQL, Postgres, Oracle) -- The Oracle PIVOT clause is now formally supported for advanced - statistical queries in Oracle. This clause will be simulated in - other dialects in the future. -- The DATE data type can be mapped to TIMESTAMP. This important - when you query a legacy Oracle database, where DATE columns - can also contain time information -- Several convenience methods have been added for more fluent - syntax, when using plain SQL result queries, subqueries as - tables, or when unnesting arrays in ANY() and ALL() quantifiers - -Further type mapping support is still experimental. An official -cooperation with MinuteProject for source code generation is -being analysed. With MinuteProject, many source code generation -issues could be addressed centrally, as MinuteProject specialises -in source code generation: - -http://minuteproject.wikispaces.com/ - -Features and improvements -------------------------- -#595 - Add support for Oracle's PIVOT clause -#869 - Add support for using ANY, ALL with arrays, not just with - subselects -#1007 - Formally document the API methods to indicate whether - something is supported by any given SQL dialect -#1011 - Add code generation configuration parameter to avoid - generating @Generated annotation -#1019 - Render LIMIT x OFFSET y also for MySQL, instead of - LIMIT y, x -#1022 - Add missing Sybase ASE implementation for Factory.use() -#1024 - Add Factory.resultQuery(String, Object...) to allow for - arbitrary execution modes of plain SQL queries (lazy, - later, into, array, etc) -#1025 - Add missing SQLite implementation for Factory.deg() and - Factory.rad() -#1033 - Generate table comments into generated Tables.java as - Javadoc -#1040 - Add Object[][] Result.intoArray() and - Object[] Record.intoArray() for convenience. Let - E Record.into(Class) also support array types. -#1041 - Add Table Factory.table(Select) convenience - method for more fluency -#1042 - Add support for DISTINCT keyword in SUM, AVG, MIN, MAX - aggregate functions -#1046 - Generate Ingres table and column comments in generated - source code (only Ingres 10) - -API changes (backwards-compatible) ----------------------------------- -#1050 - Deprecate usage of SOME quantifier in predicates, such as - equalSome() - -API changes (backwards-incompatible) ------------------------------------- -#1036 - Fixed API typo in - WindowsRowsStep.rowsBetweenUnboundedFollwing() -#1037 - The fluent API allows for JOIN clauses without FROM - clause - -Bug fixes ---------- -#1010 - The MERGE INTO .. WHEN NOT MATCHED THEN INSERT .. syntax - may cause type-safety issues in some databases. VALUES - should be converted before binding -#1014 - FindBugs: Latent risk of infinite recursion due to typo - in QueryPartList.retainAll(); -#1015 - FindBugs: 7 occurrences of "Bad attempt to compute - absolute value of signed 32-bit hashcode". In extreme - cases, this could lead to SQL syntax errors -#1016 - The Oracle CONNECT BY cond1 AND cond2 syntax erroneously - creates a WHERE cond2 CONNECT BY cond1 statement -#1028 - Syntax errors when using untyped param() in HSQLDB (and - other strongly typed dialects) -#1029 - Postgres can't bind NULL values in cases, where bind type - is Object.class and bind value was created with - Factory.param() -#1030 - UnsupportedOperationException when calling - Query.bind(int, Object) on a query containing plain SQL - fields -#1031 - Incorrect debug logging when plain SQL QueryParts like - field("?") bind null values -#1032 - Incorrect debug logging when plain SQL QueryParts contain - String literals, such as 'Hello? Anyobody out there?' -#1047 - Field.notEqualAny() erroneously renders <> ALL() - -Test cases ----------- -#1021 - Add explicit integration tests for - LEFT|RIGHT|FULL OUTER JOIN - -Version 2.0.1 - December 23, 2011 -================================================================= - -This is a maintenance release for jOOQ 2.0. The main improvements -include - -- Better integration for using jOOQ with Spring Data. This - includes support for named parameters, as well as allowing to - change bind values on previously constructed Query objects -- The MERGE statement has been enhanced for better integration - with Oracle. -- jOOQ is now ready to use with Scala / Groovy - -For more information about using jOOQ with Scala, see this blog -post: -http://blog.jooq.org/2011/12/11/the-ultimate-sql-dsl-jooq-in-scala/ - -There is now also experimental support for a custom type mapping. -This mapping allows to rewrite data types at code generation time -as well as to specify custom enum data types (e.g. boolean Y/N). -Not all integration tests run smoothly for custom data types, -hence, this feature is not yet fully supported. - -Features and improvements -------------------------- -#691 - Add support for Oracle CURSOR REF IN / INOUT parameters -#677 - Add type-mapping configuration, enforcing types for - columns -#947 - Add custom type mapping support (experimental) -#968 - Allow for custom enum types, configured in the code - generator (experimental) -#974 - Add Schema.getTable(String), getSequence(String), - getUDT(String) for better runtime Schema meta-navigation -#975 - Add Sequence.getName(), getSchema(), getDataType() -#980 - Add support for named parameters, to better interact with - Spring -#991 - Add Query.bind(String, Object) and bind(int, Object) to - easily modify existing bind values -#992 - Document thrown DataTypeException in Convert methods -#998 - Enhance MERGE statement for Oracle extensions: - WHEN MATCHED THEN UPDATE .. WHERE .. DELETE WHERE .. - WHEN NOT MATCHED THEN INSERT .. WHERE .. -#1000 - Add support for MySQL's INSERT INTO .. SET .. syntax in - MERGE statement's WHEN NOT MATCHED THEN INSERT clause - -API changes (backwards-compatible) ----------------------------------- -#981 - Cannot insertInto(table("my_table")), as plain SQL tables - return Table, not Table. Relax - bound on R -#988 - Change Factory.field(String) to return Field - instead of Field -#999 - Make MERGE's WHEN MATCHED .. and WHEN NOT MATCHED .. - clauses optional -#1001 - Identity.getField() should return TableField - instead of Field -#1006 - Add Factory.value(...) as a synonym for Factory.val(...) - for increased Scala / Groovy compatibility - -Bug fixes ---------- -#973 - EnumType renders name() instead of getLiteral() in - formatXXX() methods -#977 - EnumType renders name() instead of getLiteral() in - Convert.convert() method -#979 - Record.from() sets all changed flags to true. That's not - necessarily correct in the event of storing the record - back to the DB -#985 - AbstractRecord.equals() does not correctly compare - arrays. Compare them using Arrays.asList() -#986 - Postgres / DB2 / Sybase ASE foreign-key namespace is - unique-per-table. jOOQ forces all foreign keys from all - tables into the same namespace -#990 - Problems when encoding arbitrary byte[] as String(byte[]) - in inlined SQL. This can cause issues when DEBUG-level - logging is activated -#995 - Routines don't respect SchemaMapping - Github issue #8 -#1002 - TableRecord.storeUsing() doesn't update IDENTITY column - values, if the column is not part of the main unique key -#1003 - Sybase / SQL Server / MySQL / Ingres / H2 / Derby's - INSERT .. RETURNING simulation returns null if a table - has an IDENTITY column, but no primary/unique key -#1005 - The INSERT INTO .. VALUES .. syntax may cause type-safety - issues in some databases. VALUES should be converted - before binding - -Test cases ----------- -#984 - Detach IDENTITY column tests from UNIQUE KEY tests, - create a dedicated test suite instead - -Version 2.0.0 - November 25, 2011 -================================================================= -This release is a fresh start in many areas of jOOQ, adressing -issues that have been requested by users for a long time. These -release notes docment the most important changes, a detailed -upgrade guide, as well as the detailed list of improvements. - -Most important changes ----------------------- -- The API became more static. This applies to many Factory - methods, such as val(), literal(), as well as to many Field - methods that have been moved over to the Factory. For example, - when before, you wrote this using "postfix function notation": - -
NAME.replace(" ", "_").trim()
- - you will now write (just as in SQL): - -
trim(replace(NAME, " ", "_"))
- - Using static imports of Factory.*, jOOQ makes SQL look even - more like SQL. The current "postfix notation" is maintained for - backwards compatibility. -- By default, jooq-codegen will now generate a "dynamic" meta - model as opposed to the existing static one. Generated tables - covariantly override the as(String) aliasing method, leading - to a much more convenient aliasing style. When before, you - wrote: - -
-Table parent = T.as("parent");
-Table child  = T.as("child");
-Condition join =
-  parent.getField("ID").equal(child.getField("PARENT_ID"))
-
- - You can now write: - -
-T parent = T.as("parent");
-T child  = T.as("child");
-Condition join = parent.ID.equal(child.PARENT_ID)
-
- - Of course, the existing notation still works - -- Exceptions are no longer checked. When previously, the DB's - SQLException was propagated to client code, there is now an - unchecked DataAccessException hierarchy, similar to that of - Spring. This will eventually give way to a standardised error - handling abstraction, in future developments. -- Window functions are now constructed from their underlying - aggregate functions just like in SQL. For example: - -
-sum(AMOUNT)
-sum(AMOUNT).over().partitionBy(ACCOUNT)
-
- - This makes for a more concise API, especially when considering - future extensions, such as Oracle's KEEP (DENSE_RANK FIRST...) - syntax. -- More type safety has been introduced regarding various places - where generic and types are involved. - This is especially true for INSERT / UPDATE / DELETE statements -- Sequences now also have a type -- Unsigned number types are now supported in those databases that - use them. Unsigned numbers are implemented in jOOU, a spin-off - open source project. For convenience, this library is - "internalised" into jOOQ, to avoid adding a dependency - -http://code.google.com/p/joou/ - -Upgrade instructions: ---------------------- -Various of the above changes are incompatible with jOOQ 1.x. In -order to upgrade, please be aware of the following pitfalls: - -- The schema needs to be re-generated. -- Much of the post-fix function notation is replaced by static - methods in the Factory. Today's org.jooq.Field API is - maintained in jOOQ 2.0, for backwards compatibility. It will - be removed, eventually, though. Expect some incompatible - changes, where window functions are involved -- Some Factory instance methods (such as val(), literal()) are - now static. They are compatible, but may cause compiler - warnings. -- The meta model is now an instance model by default. If you - prefer the static meta model, you can configure this in your - jooq-codegen configuration. -- The additional typesafety involving and types may cause - compiler warnings and errors. -- SQLException is no longer part of the API. This can cause - compiler issues, in particular when extending jOOQ -- Some utility classes have moved to org.jooq.tools - -Should these incompatibilities be too significant for your -project, you can still stay on the 1.x branch, which will be -maintained for a while. Be aware that upgrading might be more -difficult, later, though. - -Features and improvements -------------------------- -#55 - Implement improved exception handling -#117 - Improve DSL support for field and table aliasing (decrease - verbosity) -#519 - Add support for MySQL UNSIGNED numeric types -#626 - Create static function access -#661 - Add support for bitwise operators -#718 - Sequences should be mapped to appropriate type (e.g. - SMALLINT, INT, BIGINT, etc) -#734 - Add support for Oracle / SQL Server CUBE() and ROLLUP() - grouping functions -#751 - Add support for Oracle / SQL Server GROUPING SETS() - function -#799 - Add support for Oracle PL/SQL's object-oriented MEMBER - PROCEDURES and MEMBER FUNCTIONS -#804 - Add to Insert, Update, Delete -#835 - Review API typesafety for InsertSetMoreStep - set(Field, T) and similar methods -#890 - Add Factory.selectCount() convenience method -#891 - Let min() max(), etc functions return a new type - AggregateFunction. This type can then be used as an entry- - point for window functions -#892 - Add support for Oracle / SQL Server GROUPING() and - GROUPING_ID() functions to be used along with CUBE() and - ROLLUP() -#893 - Simulate ROLLUP() function for MySQL, using the WITH - ROLLUP grouping modifier -#894 - Move functions from Field to org.jooq.impl.Factory - and make them static -#895 - Add power(..., Field) -#897 - Add (experimental) Spring integration project -#898 - Replace usage of checked SQLException by an unchecked - DataAccessException, similar to that of Spring -#899 - Build jOOQ .jar files as bundles to be deployed into OSGI - environments -#900 - Purge deprecated API - Prior to 2.0 -#901 - Introduce InvalidResultException as a subtype of - DataAccessException for integrity checks in methods like - ResultQuery#fetchOne(), ResultQuery#fetchMap(), etc. -#902 - Make AggregateFunction the base type for constructing - window functions -#904 - Move SQLDialectNotSupportedException into - org.jooq.exception package -#905 - Introduce MappingException as a subtype of - DataAccessException for integrity checks in methods like - ResultQuery#fetchInto(), etc. -#907 - Add missing Field.like(Field), notLike(Field) - methods to overload the existing Field.like(T), notLike(T) -#908 - Change rpad / lpad functions to accept String instead of - char -#912 - Add R newRecord(Table, Object) as - the inverse of various into(Class) methods -#916 - Add > {Record.into(Table) | - Result.into(Table) | ResultQuery.fetchInto(Table) | - Cursor.fetchInto(Table)} -#917 - Add various Cursor.fetchOneInto() convenience methods -#918 - Add CustomTable, CustomRecord as base classes for more - convenience when used with various into(Table) methods -#919 - Allow for accessing non-public constructors of Record - subtypes -#923 - Move some utilities to org.jooq.tools -#924 - Generate a reference to every table in a new Tables.java - class for improved static access -#928 - Add DataTypeException extending DataAccessException in - case something went wrong when converting data types -#930 - Support converting date time types to java.util.Calendar. - This applies to various into(Class) methods, as well as - Result.getValue(xx, Class) -#931 - Allow for conversion between Long and date/time types, and - vice versa -#932 - Let the bound of R in TableRecord extend TableRecord, - in UpdatableRecord to extend UpdatableRecord -#933 - Add support for type Character in Record.into(Class) - methods and similar -#936 - Accept primitive types, such as int.class for type - conversion -#938 - CODEGEN: Add static/instance table field configuration -#939 - Include license.txt and readme.txt in .jar files' META-INF - directory -#953 - Make DefaultGeneratorStrategy methods non-final to allow - for overriding -#954 - Add examples for source code generation of multiple - schemata with Maven -#955 - Generate a reference to every type in a new UDTs.java - class -#957 - Add R Factory.newRecord(UDT) for constructing - attached UDTRecords -#958 - CODEGEN: Add generation-time schema mapping, allowing for - re-writing schemata in jooq-codegen -#960 - CODEGEN: Add code generation configuration parameter to - avoid using the new UByte, UShort, UInteger, ULong wrappers - for UNSIGNED number types -#961 - Use Oracle's SYS.ALL_SEQUENCES.MAX_VALUE to determine the - type of a sequence. -#969 - Add List ResultQuery.fetch(Field, - Class) convenience method - -Bug fixes ---------- -#686 - Reduce the internal API leak by preventing access to - TableFieldImpl, UDTFieldImpl, ParameterImpl -#903 - lag(Field, int, T) erroneously delegates to lead() -#906 - Add more NullPointerException safety to API -#913 - NoClassDefFoundError in JooqUtil.isJPAAvailable() -#920 - Generic type is lost in Cursor.fetchInto(RecordHandler) -#925 - SelectConditionStep should extend SelectConnectByStep, not - SelectGroupByStep -#926 - AbstractRecord.into() fails to convert java.sql.Date into - java.util.Date -#934 - Don't consider static members in reflection utilities when - used with Record.into(Class) and similar methods -#935 - Don't consider final member fields in reflection utilities - when used with Record.into(Class) and similar methods -#937 - In the event of name clash (same name for table and field) - generated code has errors -#945 - Calling UpdatableRecord.setValue() twice with the same - argument causes the changed flag to be reset to false -#948 - Always set the changed flag to true in Record.setValue() -#959 - Compilation errors in generated source code if MySQL enum - values match Java reserved words, such as 'true', 'false', - 'new', etc... -#962 - Postgres ordering of generated enum literals is unstable -#967 - Better document type conversion - -Version 1.7.0 - November 25, 2011 -================================================================= -This is a maintenance release for the 1.x branch. Some important -bug fixes are merged from version 2.0. These include: - -Bug fixes ---------- -#925 - SelectConditionStep should extend SelectConnectByStep, not - SelectGroupByStep -#926 - AbstractRecord.into() fails to convert java.sql.Date into - java.util.Date -#937 - In the event of name clash (same name for table and field) - generated code has errors -#945 - Calling UpdatableRecord.setValue() twice with the same - argument causes the changed flag to be reset to false -#948 - Always set the changed flag to true in Record.setValue() -#951 - Empty Password for jooq-codegen-maven causes NPE - -Version 1.6.9 - November 7, 2011 -================================================================= -This is a maintenance release for the 1.x branch. Developments -on this branch will stop after version 1.6.9. Only important bug -fixes are merged to this branch. Developments for release 2.0 -have started. - -The most important functionality in release 1.6.9 is the newly -added support for JDBC batch operations. You can now batch -execute several queries. - -See the official blog for more information: -http://blog.jooq.org/2011/10/25/jdbc-batch-operations-with-jooq/ - -Features and improvements -------------------------- -#621 - Add support for JDBC batch operations -#794 - Add support for ORDER BY [int value] in order to reference - a column index for sorting -#882 - Optimise Field.isTrue() and isFalse(). Take Field's data - type into consideration. -#885 - Add support for INSERT INTO .. VALUES (..) syntax, - omitting explicit field declarations -#887 - Add List Cursor.fetchInto(Class) - -Bug fixes ---------- -#748 - H2 regression in 1.3.158 regarding stored functions, which - return a ResultSet (this was fixed in H2) -#859 - Derby casting of numeric types to BOOLEAN doesn't work -#886 - Regression in date extract function when used in a - subselect -#888 - Derby casting of VARCHAR to FLOAT (and similar) doesn't - work - -Version 1.6.8 - October 22, 2011 -================================================================= -The main improvement of this release is the re-design of the -stored procedure / function API. With 12 supported RDBMS, which -all have their own idea about what is a stored procedure and what -is a stored function, it has proven to be a better design, to -unite them in one single type: org.jooq.Routine. A routine can -have a return value as well as OUT parameters. It can be embedded -in SQL and used as a field or a table. - -This means, you will need to re-generate your database schema, -when upgrading to jOOQ 1.6.8. After re-generation, you'll need to -fix your client code. These are the package changes: - -- [generated.package].procedures > [generated.package].routines -- [generated.package].functions > [generated.package].routines -- [generated.package].Procedures > [generated.package].Routines -- [generated.package].Functions > [generated.package].Routines - -Oracle generated packages are not re-located. With these -improvements, using stored procedures and functions becomes even -more reliable, especially when cursor types are involved. Read -more about the rationale behind this change: - -http://blog.jooq.org/2011/10/17/what-are-procedures-and-functions-after-all/ - -Apart from that, important improvements have been made in the -area of plain SQL tables. Also, consider a demo integration of -jOOQ with Google Cloud SQL: - -http://blog.jooq.org/2011/10/22/jooq-and-google-cloud-sql-example/ - -Features and improvements -------------------------- -#271 - Don't pre-fetch table meta data when selecting from plain - SQL tables -#489 - Add support for SELECT * (i.e. render SELECT * where - applicable) -#596 - Add support for VARIANCE() and STDDEV() OVER() window - functions -#608 - Add jOOQ version number in generated source code -#670 - Add more Javadoc to Field.xxx() functions -#692 - Add support for ResultSet type returned from HSQLDB - stored functions -#850 - Use http://www.jooq.org as URL for the @Generated - annotation -#854 - Add convenience methods Fields.isTrue(), isFalse() for - conversion of "Y", "YES", "1", "true", "on", etc into a - boolean condition -#870 - Add support for MEDIAN aggregate function -#872 - Add support for STDDEV_POP(), STDDEV_SAMP(), VAR_POP(), - VAR_SAMP() aggregate functions -#874 - Reduce the number of internal classes for dialect-specific - function aliases -#878 - Implement DataType.equals() and hashCode() - -API changes (backwards-compatible) ----------------------------------- -#851 - Change Field.{sortAsc|sortDesc}(List sortList) into - Field.{sortAsc|sortDesc}(Collection sortList) - -API changes (backwards-incompatible) ------------------------------------- -#848 - Purge deprecated API - Prior to 1.6.1 -#849 - Replace Cursor.fetchResult() by Cursor.fetch() -#852 - Review stored procedures / functions concept. Merge them - all into a single "Routine" type - -Bug fixes ---------- -#756 - Error when aliasing HSQLDB and Postgres unnested tables -#761 - Exception when TRACE logging execution with plain SQL - tables involved -#773 - Execute standalone stored functions as CallableStatement - to prevent issues with transactions -#847 - Query.getSQL() doesn't render dialect-specific SQL when - Query is constructed using the fluent API -#853 - DB2 generated convenience methods for stored functions - have unstable ordering -#857 - Derby casting of numeric types to String / VARCHAR does - not work -#858 - SQLDataType.getSQLDataType() should return itself, instead - of null -#860 - SQLite CEIL function is incorrectly simulated. CEIL(2.0) - returns 3.0 instead of 2.0 -#861 - Field.replace(String) generates bad SQL for various RDBMS. - Field.replace(String, String) works, though -#863 - Ingres integration generates illegal SQL when selecting - things like SELECT 1 WHERE 1 = 1 -#866 - Sybase ASE Field.replace(String) function incorrectly - removes the argument string -#873 - Error when selecting two times the same aggregate field -#877 - Compilation error in generated source code when a table - without a primary key has an identity column -#879 - Add Google Cloud SQL Example -#880 - Query.getSQL() does not consider SchemaMapping - -Test cases ----------- -#811 - Loader integration tests fail for SQLite -#812 - CSV Loader test leaves Postgres JDBC connection in an - inconsistent transactional state on error -#856 - Add integration tests for Field.abs() -#865 - Add integration tests for Field.ascii() -#867 - Add integration tests for Field.sum(), avg(), max(), min() -#881 - Re-design H2 stored functions to be pre-compiled, in order - to speed up integration tests - -Version 1.6.7 - September 25, 2011 -================================================================= - -This release coincides with the launch of the new website at -http://www.jooq.org. Hence, it ships with little additions to the -deliverable itself. - -Apart from new convenience methods, the main addition is a Maven -plugin for jooq-codegen contributed by Sander Plas. - -Features and improvements -------------------------- -#797 - Create Maven plugin for source code generation -#825 - Add List> Factory.fetchMany(String) to - allow for fetching several result sets from stored - procedures, such as Sybase ASE's "sp_help" -#838 - Implement MetaDataFieldProvider.toString() -#841 - Add List Result.getValues(Field, Class) -#842 - Add Query.getBindValues() method to allow for extracting - bind values in the correct order -#843 - Add Factory.fetch(ResultSet) to transform a JDBC ResultSet - into a jOOQ Result - -API changes (backwards-compatible) ----------------------------------- -#837 - Avoid final keyword on Object methods, such as .equals(), - .hashCode(), etc - -Bug fixes ---------- -#836 - Bad syntax when selecting from aliased plain SQL tables -#839 - Boolean conversion in getValueAsBoolean() should trim - String values first -#840 - Numeric conversions in getValueAsXXX() should trim String - values first -#844 - NullPointerException when selecting a column from a Result, - that does not exist - -Version 1.6.6 - September 11, 2011 -================================================================= - -Finally, support for another RDBMS has been added. Sybase's other -important product Sybase Adaptive Server Enterprise (or simply -Sybase ASE) is now officially supported by jOOQ - -Apart from this, there had been important improvements with the -recently added INSERT .. RETURNING clause, as well as some fixes -related to DECIMAL / NUMERIC data types - -Features and improvements -------------------------- -#796 - Complete missing public org.jooq.impl Javadoc -#800 - Add support for Sybase Adaptive Server Enterprise -#808 - Add support for INSERT .. RETURNING for Ingres -#809 - Add support for INSERT .. RETURNING for Sybase SQL - Anywhere using SELECT @@identity -#810 - Add support for INSERT .. RETURNING for SQLite using - last_inserted_rowid() -#813 - Add DSL support for INSERT .. RETURNING -#814 - Change TableRecord to reload its trigger-initialised main - key in Oracle and other RDBMS that don't support IDENTITY - columns -#818 - Add SQLiteFactory.rowid() -#819 - Support SQLite AUTOINCREMENT columns as IDENTITY -#820 - Add Factory.fetchOne(String) for executing plain SQL - queries that return single records -#826 - Allow for returning several records in the INSERT .. - RETURNING clause. This now works for DB2, HSQLDB, MySQL, - and Postgres -#827 - Support Sybase SQL Anywhere's TOP n START AT m clause - instead of simulating it with nested SELECT's - -API changes (previous API now deprecated) ------------------------------------------ -#817 - Deprecate Factory.lastID(Identity) - -Bug fixes ---------- -#815 - SQL Server fetching of IDENTITY value is broken -#821 - Optimise ResultQuery.fetchAny() executing fetchLazy() - internally, and only fetching one record from the cursor -#822 - Let Constant cast to more precise NUMERIC/DECIMAL types - in those RDBMS where casting is necessary -#823 - Cannot bind SQLite BigDecimal, BigInteger types - bind - them as String instead -#824 - BigInteger values cannot be bound in DB2, Derby -#828 - Document inefficient implementation for GREATEST and LEAST - in some RDBMS - -Version 1.6.5 - August 28, 2011 -================================================================= - -This release finally adds a loader for CSV data to jOOQ. You can -now load CSV data using a simple fluent API, configuring error -handling, duplicate behaviour and transaction handling, as well -as various CSV parameters. - -This release also changes the way generated keys are retrieved -after INSERT's. Instead of (potentially inconsistently) running -SELECT MAX(pk) immediately after the INSERT, Postgres' INSERT.. -RETURNING clause is used (or simulated), in a single statement. - -Features and improvements -------------------------- -#784 - Add Result.exportXML() to retrieve a DOM document similar - to that of .formatXML() -#792 - Add support for loading of CSV data into tables -#795 - Add List fetch(int, Class) and - fetch(String, Class) convenience methods -#803 - Add support for INSERT .. RETURNING or simulate it where - not available -#805 - Add T[] fetchArray(int, Class) and - fetchArray(String, Class) convenience methods -#806 - Add T fetchOne(int, Class) and - fetchOne(String, Class) convenience methods - -Bug fixes ---------- -#798 - Oracle IN (...) clause with more than 1000 arguments does - not work -#802 - Use "INSERT .. RETURNING" instead of "SELECT MAX(pk)" - to retrieve the primary key of a new record - -Version 1.6.4 - August 07, 2011 -================================================================= - -This release ships with a couple of useful concepts inspired by -other frameworks. These are: - -- selecting into custom POJO's. Results can be mapped to POJO's - by convention or using JPA @Column annotations -- selecting into custom callbacks. This is already a wide-spread - practice in Spring JdbcTemplates. -- selecting long-running queries asynchronously. This idea has - been inspired by the Avaje Ebean framework - -Apart from these changes and some bugfixes, the internal API has -been completely re-designed. The idea here is that query -rendering and variable binding are even faster (less String -objects), more extensible and more accurate. This is a pre- -requisite for many future developments with even more complex SQL -statements, such as for instance CTE's (Common Table Expressions) - -Features and improvements -------------------------- -#137 - Add support for asynchronous query execution using - FutureResult ResultQuery.fetchLater() similar to - Avaje Ebean -#198 - Add SELECT INTO functionality into POJO's using - T ResultQuery.fetchInto(Class) similar to JPA - CriteriaQuery -#728 - Add .fetchInto(RecordHandler) to ResultQuery, Result, - and Cursor to allow for callbacks similar to Spring's - JdbcTemplate/Ollin Framework -#774 - Add more TRACE logging to .fetchLazy() -#777 - CURSOR: Add function alias: UNNEST for TABLE -#781 - Add E function (Euler number) -#782 - Add T Record.getValue(..., Class) methods - for convenient type conversion -#785 - Allow for storing TableRecord with a provided Field[] - indicating the primary key -#786 - Document thread-safety facts in Factory Javadoc -#788 - Add Key.getFieldsArray() convenience method -#793 - Add support for Oracle's SYS_CONNECT_BY_PATH function - -API changes (backwards-incompatible) ------------------------------------- -#758 - Change internal QueryPart rendering and binding API to use - Configuration and Context as callback parameters. If you - use CustomField or CustomCondition, please correct your - implementations accordingly. Other parts of the API should - not be affected -#778 - Purge deprecated API, deprecation prior to jOOQ 1.5.7 -#790 - Purge deprecated generated code, deprecation prior to - jOOQ 1.5.7 - -API changes (previous API now deprecated) ------------------------------------------ -#776 - Deprecate QueryPart.getSQL(), add Query.getSQL() -#789 - Deprecate Record constructors with Configuration - parameter - -Test cases ----------- -#636 - Add integration tests for more advanced CONNECT BY - example -#772 - Add integration tests for selecting cartesian products - (several tables in FROM clause) - -Bug fixes ---------- -#730 - Sybase cannot bind null values in plain SQL -#759 - Omit the TOP 100 PERCENT clause in SQL Server ordered - top-level queries -#767 - An empty Java package is generated for PL/SQL packages - containing underscores -#771 - Some exotic literals are not properly escaped with quotes - yet, e.g. UDT identifiers, VARRAY types, etc. -#775 - Automatic re-attaching after deserialisation does not work - when used with .fetchLazy() -#787 - The UpdatableRecord's internal changed flags are not - updated after INSERTs / UPDATEs - -Version 1.6.3 - July 31, 2011 -================================================================= - -This is mainly a maintenance release with lots of bugfixes, -mostly around code generation, plain SQL tables, and data types. -Please note that generated source code may contain incompatible -changes due to #639 (see below for details)! - -Apart from that, project CURSOR is advancing and it is now -possible to unnest arrays into tables. See this article for -details about where jOOQ is heading with project CURSOR: - -http://blog.jooq.org/2011/07/24/the-power-of-ref-cursor-types/ - -Features and improvements -------------------------- -#679 - Improve H2 NVL2 support as of H2 1.3.156 -#680 - Improve H2 ROUND support as of H2 1.3.156 -#735 - Add README documentation to GitHub -#736 - Add more info regarding number of generated artefacts in - jooq-codegen logging -#750 - Add DataType.isNumeric(), .isString(), .isTemporal(), - .isBinary() -#754 - Log query as executed by JDBC PreparedStatement when - TRACE logging (without inlining variables) -#752 - CURSOR: Add support for selecting from ARRAY types -#762 - Use H2's native support of NVL, instead of COALESCE -#764 - CURSOR: Add support for selecting from ARRAY types - returned from stored functions - -API changes (backwards-incompatible) ------------------------------------- -#639 - Map DECIMAL(n, 0) and NUMBER/NUMERIC(n, 0) data types - to Byte/Short/Integer/Long/BigInteger instead of - BigDecimal in generated source code. Re-generated code - will not be compatible! - -API changes (previous API now deprecated) ------------------------------------------ -#731 - Inconsistent API with Field.lessOrEqualToXXX(). Removed - "To" from method name -#757 - Deprecate Factory.constant() methods - -Test cases ----------- -#731 - Add missing integration tests for equalAll(), equalSome() - and similar methods -#747 - Upgrade H2 to 1.3.158 - -Bug fixes ---------- -#632 - Sybase error : column @p0 not found in nested SELECT -#700 - Restore HSQLDB ARRAY support with INFORMATION_SCHEMA - change in HSQLDB 2.2.3, and some fixes in 2.2.5 -#725 - Cannot insert byte[] data with plain SQL -#733 - H2 changed JDBC type for ResultSet/CURSOR from 0 to -10, - like Oracle -#737 - Compilation errors in generated source code if table - fields contain spaces -#738 - Compilation errors in generated source code if MySQL - procedure parameter type contains two comma-separated - arguments (like DECIMAL(10,2)) -#739 - Postgres navigator methods and keys are not re-generated - in the same order -#740 - Formatting is broken on Result.format() with some special - newline characters -#743 - Make SQL Server INFORMATION_SCHEMA independent from - HSQLDB again, to prevent incompatibility issues -#744 - Ingres REAL and FLOAT4 types are generated as FLOAT/FLOAT8 - which maps to java.lang.Double, instead of java.lang.Float -#753 - Postgres error when binding array that contains null - values -#755 - NullPointerException when converting an array containing - a null value -#766 - Bad decoding of JDBC Types BIGINT (to BigInteger instead - of Long) and REAL (to BigDecimal instead of Float) when - plain SQL tables are involved - -Version 1.6.2 - July 10, 2011 -================================================================= - -This release mainly introduces three new projects. - -Project CURSOR where jOOQ finally supports various RDBMS's TABLE, -CURSOR, and REF CURSOR data types. This is especially useful when -those types are returned from stored procedures and functions. -Cursors are simply mapped to jOOQ Result types and can -thus be used like regular table results - -Project EXPORT aims at exporting data from the database in -various serialisable formats, such as XML, CSV, HTML, Text, JSON. -This project will be continued in the future, to also -deserialise from (some of) these data streams. This will allow -for easy transport of jOOQ Result types over the net. - -Project CODEGEN has finally been started. Many improvements -suggested by jOOQ users will be implemented in the next releases. -In this release, important fixes have been made to prevent -compilation errors in generated artefacts. - -Features and improvements -------------------------- -#61 - EXPORT: Add Result.formatXML() -#166 - CURSOR: Add support for ResultSet type returned from - Oracle stored procedures / functions -#411 - Allow for fetching Map (instead of Record) - and List> (instead of Result) -#549 - Add Factory.function() for plain SQL functions -#611 - Simulate RPAD and LPAD in SQL Server, Sybase -#627 - Add support for Postgres FOR UPDATE OF [table-name] clause -#628 - Add support for REPEAT (SQL Server: REPLICATE) function -#637 - Nicely format time in StopWatch logging output -#640 - Simulate Postgres FOR UPDATE OF [table-name] clause in - other dialects -#649 - CURSOR: Add Cursor.fetch(int) .fetchOne() - .fetchResult(int) .fetchResult() -#653 - Add support for MySQL encryption and compression functions -#660 - Clarify Javadoc of UpdatableRecord to explain its - behaviour when changing the main unique key -#669 - EXPORT: Add Result.formatHTML() -#672 - Add convenience method UpdatableRecord.copy() in order to - reset primary key values for a subsequent INSERT -#675 - EXPORT: Add Result.formatCSV() -#683 - Implement ResultImpl.equals() and .hashCode() -#684 - Implement AbstractStore.equals() and .hashCode() -#685 - Add Store.size() to indicate the maximum index of the - Store -#687 - EXPORT: Add result.formatJSON() -#689 - Create separate builds: jooq-core.zip and - jooq-with-dependencies.zip -#690 - CURSOR: Add support for ResultSet type returned from H2 - stored functions -#695 - CURSOR: Add support for ResultSet type returned from - Postgres stored functions -#697 - Add Factory.fetch(String) for executing plain SQL queries - that return results -#701 - Add ResultQuery.fetchArray() and .fetchOneArray to return - Object[][] and Object[] -#704 - Always add top and bottom line in Result.format() -#705 - Right-align numeric values in Result.format() -#716 - Add SUBSTRING function Field.substring(Field, Field) - taking fields as arguments -#719 - Document risk of SQL injection in plain SQL and literal - factory methods -#726 - Add LENGTH function as a synonym for CHAR_LENGTH - -API changes (backwards-compatible) ----------------------------------- -#698 - Inconsistent API with Factory.fetch(Table [,Condition]) - Let method return Result instead of List -#699 - Let Result extend List - -API changes (previous API now deprecated) ------------------------------------------ -#656 - Decrease verbosity of plain SQL methods. They will just be - called Factory.field() .condition() .table() .query() - -Test cases ----------- -#643 - Add integration test for code generation of invalid and - incomplete types in Oracle -#654 - Add integration tests for master data tables with PK types - other than NUMBER/INT -#655 - Add missing integration tests for TRIM function - -Bug fixes ---------- -#450 - Improve plain SQL integrity checks for bind variables -#610 - CODEGEN: Compilation error in generated source code for - databases with table named 'system' -#646 - An empty Java package is generated for an empty PL/SQL - package. This is unnecessary -#651 - CODEGEN: Avoid importing datatypes in generated source - code to prevent collisions -#657 - NullPointerException when creating a Factory with a null - SchemaMapping -#658 - Master data table code generation is broken for tables - with more or less than 3 columns -#662 - Add support for the missing Postgres data type "bpchar" -#663 - Add support for the missing Sybase data type "int" -#664 - Ingres INTEGER data types are not correctly generated -#665 - HSQLDB Datatype CLOB and BLOB are not supported, when - selecting from plain SQL tables -#666 - The evil bug: Ingres TRIM function only executes RTRIM -#673 - UpdatableRecord.store() doesn't work if called after - .delete() -#702 - Add support for the missing SQLite data type "NULL" -#706 - CURSOR: Ensure that Query.execute() runs in a single - transaction when Postgres refcursor is involved in the - query (this fixes a Postgres JDBC driver flaw) -#724 - NullPointerException when passing a single literal null - bind value to plain SQL methods without casting to Object -#729 - DB2, Derby, Ingres, Oracle cannot bind null values in - plain SQL - -Version 1.6.1 - June 19, 2011 -================================================================= - -In this release, the PORTABILITY project has been implemented. -Finally, the SQLDialect has been removed from most generated -artefacts (Schema, Table, Field, Sequence, etc). Also, the -constructing Factory is not referenced by its created QueryParts -anymore, unless this is really necessary (Query objects, UDT's, -ARRAY types). This leads to higher compatibility between schemata -of different databases, e.g. if users want to use an HSQLDB -development and Oracle productive database. - -Unfortunately, this means that the way stored procedures are -called had to be changed. This is an API break that could not be -avoided. The pre-1.6.1 StoredObject.execute(Connection) method -is deprecated and will be removed in the future. It has been -replaced by StoredObject.execute(Configuration) - -In addition to this project, many more window functions are now -supported, as well as the Oracle-specific CONNECT BY clause for -recursive queries. - -Features --------- -#351 - Add support for Oracle ROWID data type -#452 - PORTABILITY: Create a super-set of RDBMS data types -#453 - PORTABILITY: Don't create dialect-specific QueryParts -#455 - Add support for the Oracle CONNECT BY clause -#587 - Add optional OFFSET clause to form LIMIT .. OFFSET - constructs -#589 - Add extended FOR UDPATE [OF ...] [{WAIT n | NOWAIT | SKIP - LOCKED }] support -#591 - Add support for LEAD() OVER() and LAG() OVER() window - functions -#592 - Add support for the CUME_DIST() OVER() window function -#601 - Add Factory.literal() convenience methods -#602 - Add Factory.val() methods to decrease .constant() - verbosity -#604 - Add support for RESPECT NULLS clause in some window - functions -#605 - Add Factory.use(String) for non-generated schemata -#613 - Add PI function -#616 - Add Factory.two() literal convenience method -#630 - Add support for Oracle CONNECT BY pseudo-columns LEVEL, - CONNECT_BY_ISCYCLE, CONNECT_BY_ISLEAF - -API changes ------------ -#299 - PORTABILITY: Create a dialect-independent meta-model -#588 - Add OVER() keyword to FIRST_VALUE() and LAST_VALUE() API - -Test cases ----------- -#368 - Add integration test for use with schema mapping -#586 - Upgrade H2 to 1.3.155 -#607 - Add integration tests for CRUD / SP's / UDT's / ARRAY's - with SchemaMapping -#612 - Add integration tests for LPAD and RPAD functions -#624 - Add integration test for code generation of invalid/ - incomplete views in Oracle -#631 - PORTABILITY: Add integration tests for using Oracle- - generated schema against an HSQLDB database -#638 - Add missing integration test for DECIMAL data type - -Bugfixes --------- -#176 - Stored procedures / functions in EQUIVALENT schemata - cannot be called -#493 - Bind variable mismatch when constructing bad SQL -#594 - Confusing Javadoc in SELECT DSL API -#603 - Fix DB2 'IGNORE NULLS' clause -#619 - SUBSTRING() function is broken in DB2, Ingres, SQL Server -#623 - SQL syntax error for some MERGE queries in SQL Server and - Sybase -#633 - SchemaMapping is not applied to sequences -#634 - Sequences are not escaped in generated SQL - -Version 1.6.0 - June 05, 2011 -================================================================= - -Apart from supporting various additional standard and non- -standard JOIN constructs, there is now also full support for the -SQL standard MERGE statement and MySQL's ON DUPLICATE KEY variant -thereof. A great number of API enhancements have been added, -which improve the usability of jOOQ. The Ingres database is now -also supported. - -Features --------- -#301 - Add support for Oracle execution hints -#409 - Add support for NATURAL JOIN syntax, where RDBMS allows it -#415 - Make fluent API's underlying SelectQuery objects publicly - available -#429 - Add Ingres support -#475 - Document class-level generic types and in Javadoc -#486 - Add support for SQL MERGE clause -#494 - Allow for omitting schema name in generated SQL -#496 - Automatically update IDENTITY values in UpdatableRecord, - after storing them -#520 - Add support for JOIN ... USING syntax -#524 - Upgrade HSQLDB to 2.2 -#533 - Add ORDER BY [Map] or BY [List] functionality -#534 - Add Result.isEmpty() -#535 - Call upon ConfigurationRegistry.provideFor() before - throwing a DetachedException -#536 - Simulate CASE [value] WHEN [value] THEN [result] END - syntax in Derby -#538 - Add some logging to ConfigurationProvider -#539 - Add possibility to negate numeric values with Field.neg() -#541 - Add support for MySQL ON DUPLICATE KEY clause -#542 - Allow for Collection arguments in INSERT's DSL API -#543 - Allow for creating FUNCTION() OVER() without PARTITION BY - or ORDER BY clause -#546 - Add Factory.use(Schema) -#548 - Add new internal type FieldMap -#550 - Simulate ON DUPLICATE KEY INSERT clause in dialects other - than MySQL -#551 - Add TableMapping, similar to SchemaMapping for mapping - tables -#553 - Add Factory.plainSQLQuery -#554 - Add Factory.plainSQLField with a DataType parameter -#555 - Add UpdateXXX.set(Map) convenience methods to DSL API -#557 - Enhance INSERT DSL API to allow for adding VALUES clause - with InsertXXX.set() syntax -#570 - Add support for the RAND() function -#567 - Add support for Ingres Sequences -#572 - Add support for the ATAN2() function -#573 - Add possibility for additional select() clauses for - convenience -#575 - Add support for the FULL OUTER JOIN syntax, where RDBMS - supports it -#576 - Add support for the CROSS JOIN syntax, where RDBMS - supports it -#581 - Enhance API and allow Collection> - instead of Collection> - -API changes ------------ -#397 - Purge deprecated API - -Bugfixes --------- -#481 - Handle case where an empty record is stored -#522 - Misleading Javadoc in generated stored procedures and - function constructors -#532 - Restore Postgres INFORMATION_SCHEMA -#537 - Prevent null from being added to QueryPartList -#540 - Error when TRACE logging Limit -#544 - Aliased elements are not bound correctly when rendered - with toSQLReference() -#559 - Loosen type safety on overloaded methods to prevent - compilation errors with javac/Netbeans -#560 - HSQLDB DataType REAL is configured incorrectly -#565 - Add integration tests for current_user() function -#569 - ORA-01427 when generating foreign key relations -#571 - Field.trim() not correctly implemented for SQL Server -#583 - Accelerate integration tests: Reset schema only if - necessary - -Version 1.5.9 - May 15, 2011 -================================================================= - -This version ships with lots of new functionality. Finally, the -DSL-style API has been extended to CRUD operations (INSERT, -UPDATE, DELETE)! Also, support for the TRUNCATE TABLE statement -has been added. - -The most important new features include the support for SQL:2003 -standard window functions, which are available in most major -RDBMS. Additionally, basic function support has been widely -extended. - -Features --------- -#148 - Added support for window functions -#204 - Add support for multi-record INSERT's -#416 - Added support for retrieval of IDENTITY values -#433 - Use bind variables for LIMIT and OFFSET -#441 - Added foreign key relationship meta information to the - generated source code -#446 - Beautify ResultImpl.toString() method -#461 - Automatically cast CONCAT parameters to Field if - necessary -#463 - Added support for trigonometric functions -#471 - Added support for the sign function -#472 - Added support for GREATEST/LEAST functions -#474 - Added support for "hyperbolic" functions SINH, COSH, TANH, - and COTH -#482 - Added DSL API for INSERT statements -#483 - Added DSL API for UPDATE statements -#484 - Added DSL API for DELETE statements -#485 - Added "Registry" for client code to provide Configurations - to jOOQ Attachables -#490 - Added support for the TRUNCATE TABLE statement -#495 - Generate source code for IDENTITY columns -#501 - Added support for boolean conversion to Result, Record, - and Store -#503 - Allow for schema navigation via generated artefacts -#518 - Let stored procedures reference owner package - if applicable -#525 - Added NULLS {FIRST | LAST} clause to ORDER BY constructs -#528 - Added Factory.getDataType() convenience method -#530 - Added Factory.zero() and Factory.one() convenience methods - -API changes (jooq) ------------------- -#527 - Weakened type-safety on Field.nvl2() -#529 - Deprecated Factory.select(Object...), added .selectOne() - and .selectZero() instead - -API changes (jooq-meta) ------------------------ -#30 - Add ParameterDefinition for stored procedures, instead of - reusing ColumnDefinition -#499 - Add reference to TableDefinition in ColumnDefinition -#500 - Add AttributeDefinition for UDTDefinition, instead of - reusing ColumnDefinition - -Bug fixes ---------- -#369 - Adapt H2 relations generation to H2's correction of - information_schema.cross_references -#435 - Added integration tests for NESTED SELECTs holding LIMIT - clauses -#460 - Syntax error when using a field with a reserved name -#462 - Fixed Javadoc broken links -#473 - Don't cast when cast is unnecessary -#479 - INSERT statement should not set all fields for a table -#497 - Derby referential code generation is broken, for named - foreign keys -#498 - Oracle package content is generated in arbitrary order -#502 - Syntax error when creating an empty IN condition -#526 - Corrected Javadoc in Field.coalesce() - -Version 1.5.8 - April 29, 2011 -================================================================= - -Finally, jOOQ now supports two important new RDBMS: -SQL Server and Sybase! - -Apart from this great enhancement, there is now also full support -for the non-SQL standard LIMIT clause, even in dialects where the -LIMIT clause is not supported natively (especially Oracle, but -also DB2, SQL Server and Sybase, which have limitations). jOOQ -simulates LIMITs by rendering nested selects filtering on ROWNUM -(Oracle) or on ROW_NUMBER() (DB2, SQL Server and Sybase). - -Other interesting additions are an increasing support for native -mathematical functions. More function support will be added in -future versions. - -Features --------- -#16 - Added support for SQL Server -#21 - Uniform implementation of the LIMIT clause. Implemented - LIMIT clause simulation through analytic functions, where - LIMIT is not supported natively -#97 - Added support for Sybase -#418 - Measure time of various steps in source code generation -#420 - Added support for proprietary SQL extensions "FOR UPDATE" - and "FOR SHARE" -#431 - Added additional statistics to generation log files -#432 - Unified the various "standard" ANSI INFORMATION_SCHEMA - implementations in the jooq-meta artefact -#436 - Added support for the modulo function -#438 - Added floor and ceil functions -#439 - Added support for mathematical functions (logarithms, - exponentials, sqrt) -#447 - Enhanced Field.add() and Field.subtract() to work for date - time fields, also - - -API changes ------------ -#428 - Created new Maven artefact jooq-meta to cleanly separate - database meta-data navigation from code generation -#458 - Decreased DSL verbosity for arithmetic operations and for - ordering - -Bug fixes ---------- -#417 - Restored warning when unknown column type is encountered - in source code generation -#419 - Corrected misleading Select.fetchOne(...) Javadoc -#421 - Optimised AbstractRecord's memory consumption -#448 - Corrected some Javadoc @see links -#449 - Changed Field.concatenate() to accept Field parameters - to avoid generic varargs warnings - -Version 1.5.7 - April 17, 2011 -================================================================= - -This is the first release built with support of Maven thanks to -the help of some jOOQ users! - -The main new features in this release are the improved support -for serialisation/deserialisation of jOOQ objects through use of -the newly introduced "Attachable" interface. - -If using log4j or the newly supported slf4j logging framework -in debug/trace mode, there is the possibility to log query -building/execution time statistics. - -Apart from these new features, fixes were mainly done in the -fields of type casting, HSQLDB 2.1 upgrade support, stored -procedures with OUT, IN/OUT parameters. Please upgrade, if you -are using any of those features. - -If you extend jOOQ as a base implementation for source code -generation, be aware of the fact, that the jOOQ-codegen is -currently undergoing major changes. Expect the code generation -API to stabilise again in one of the next releases. - -Features --------- -#104 - Added maven dependency -#248 - Integrate UDT types with ARRAYs -#295 - Allow for attaching/detaching UpdatableRecords to/from - Configurations -#359 - Added statistics measurement to Query execution for debug - log level -#362 - Added deprecation configuration flag -#364 - Document unknown type in generated source code -#373 - Improve exception handling in code generation -#378 - Added support for Oracle stored functions with OUT - parameters -#382 - Added Factory.attach() methods to re-attach deserialised - Attachables -#394 - Add logging support for SLF4J -#398 - Allow to provide a DataType in Factory.constant() -#399 - Provide access to TypeUtils.convert() methods via DataType -#404 - Added trace logging for measuring the speed of various - query execution steps - -API changes ------------ -#358 - Enhanced DSL API to allow for HAVING clauses without - GROUP BY clauses -#367 - Make Store, Result, QueryPart "Attachable" -#374 - Introduce strategy pattern to code generation for future - support for advanced naming schemes -#375 - Decouple Database from Generator -#381 - Made DataType Serializable -#384 - Deprecated singleton QueryParts -#388 - Unify "internal" API using an Adapter pattern - -Bug fixes ---------- -#187 - Protect generated Record navigation methods against name - clashes -#266 - Added more thorough integration tests for dialect-specific - casting (including some fixes related to varchar types) -#360 - Added more integration tests for the DISTINCT clause -#361 - Add more checks in testInsertUpdateDelete() -#366 - Warn only once per ColumnDefinition, if a data type is - unknown -#377 - NullPointerException when generating invalid stored - function -#380 - Added integration tests to check for proper - serialisability -#386 - Fixed incompatibilities with HSQLDB 2.1.0 -#387 - Fixed unnecessary imports in some Oracle generated - Records -#389 - Fixed javac compiler warning in AbstractStoredObject -#391 - Cannot properly call stored procedures when IN/OUT - parameter is bound to NULL -#392 - Procedures with several OUT parameters may not register - OUT parameters correctly -#410 - Passing null VARRAY values to Oracle stored procedures - causes issues -#412 - limit(int) sets default offset incorrectly in some - dialects - -Version 1.5.6 - March 31, 2011 -================================================================= - -This release consists mainly of code generation bug fixes and -minor API improvements and enhancements. - -The most important improvement is ticket #90, by which lazy -fetching and iteration over data is now supported. jOOQ lets you -keep a reference to a Cursor that has an open JDBC ResultSet, to -fetch data from on-the-fly. - -A few major code generation bugs were reported where the -generated code may cause ambiguity due to an inconsistent API. -This means that you will have to re-generate your schema after -upgrading to version 1.5.6. Some of your code may not compile -anymore, after this upgrade. - -Features --------- -#90 - Added possibility for lazy fetching of data -#208 - Added convenience methods for direct invocation of - sequences' currval() and nextval() attributes -#212 - Created one factory per dialect for better separation of - dialect-specific support -#213 - Generate a factory for each schema -#251 - Opened up base implementations for Field and Condition - to allow for custom implementations by client code -#274 - Integrate H2 ARRAY types with stored procedures -#292 - Documented usage of log4j and java.util.logging -#306 - Added support for the NULLIF function -#319 - Added Field.between(Field, Field) method -#320 - Added trace logging for variable binding and SQL - generation methods -#323 - Added Field.in(Field...) method -#325 - Include release version number in delivered .jar files -#328 - Improved configuration setup documentation page -#333 - Let Result implement Serializable -#334 - Added fetchMap() convenience methods -#335 - Added more functions and aggregate functions examples to - documentation -#338 - Visually improve code generation logging -#339 - Removed skipping of unreferenced UDT's, ENUM's and ARRAY's -#342 - Improved generated referential code by using fetch() and - fetchOne() API -#356 - Let UpdatableRecord.store() and delete() return an int - to indicate whether the record was actually modified - -API changes ------------ -#233 - Allow for joining TableLike instead of Table -#337 - Added generic type > to - InsertSelectQuery -#341 - Fixed API flaw where SelectOnConditionStep.and() methods - and similar ones returned SelectConditionStep, instead of - SelectOnConditionStep - -Bugfixes --------- -#69 - Corrected referential code generation for foreign keys - that reference non-primary unique keys -#85 - Corrected referential code generation for multi-field - foreign keys -#121 - Covered more Factory.executeXXX() methods with integration - tests -#318 - Fixed NullPointerException when executing SELECT * from - aliased tables -#321 - BetweenCondition does not bind left hand side Field - correctly -#322 - InCondition does not bind left hand side Field correctly -#326 - Avoid method overloading where binding to Object - may lead to compile-time ambiguities (with javac) -#343 - Add more foreign key navigation method integration tests -#347 - Add explicit integration tests for schema artefacts - excluded from code generation -#350 - Disambiguate navigation methods if several foreign keys - reference the same entity -#352 - Disambiguate navigation methods if a table ending on S - references itself -#353 - Added integration test for compilation of generated - artefacts with javac (as opposed to the Eclipse compiler) -#355 - Error when storing an UpdatableRecord that has no changed - values - -Version 1.5.5.2 - March 15, 2011 -================================================================= - -A critical bug was reported from the 1.5 release stream where -stored functions did not render their parameters in correct order - -Features --------- -#302 - Map Oracle's NUMBER data type to java.lang.Number in - stored procedures, stored functions - -Bugfixes --------- -#317 - StoredFunctionImpl.asField() renders parameters in wrong - order - -Version 1.5.5.1 - March 13, 2011 -================================================================= - -In version 1.5.5, there was a fatal bug breaking Derby source -code generation. Only the Derby dialect is affected. Please -update immediately, if you are using jOOQ's Derby integration - -Bugfixes --------- -#315 - Generated master data records are not sorted by PK -#316 - Derby code generation fatally broken - -Version 1.5.5 - March 12, 2011 -================================================================= - -This version is released early as there are some important -bugfixes. Additional improvemetns include: - -- Improved DSL related to conditions in HAVING and JOIN clauses -- Support for Oracle-style functions, such as NVL, NVL2, COALESCE - DECODE, etc - -Features --------- -#304 - Add support for Oracle NVL function -#305 - Add support for COALESCE function -#308 - Add support for Oracle NVL2 function -#311 - Add support for Oracle DECODE function - -API changes ------------ -#223 - Enhance DSL to accept and(), or() and similar methods in - JOIN steps -#224 - Enhance DSL to accept and(), or() and similar methods in - HAVING steps - -Bugfixes --------- -#297 - Fixed Factory.concatenate() function -#298 - Added integration tests for nested selects in HAVING - clause -#300 - Added integration tests for nested selects in JOIN clause -#303 - Javadoc correction -#307 - Accelerated integration tests -#309 - Fixed JDBC variable binding issue related to Conditions - where the lhs is a function (e.g. stored function) and the - rhs is a constant -#310 - Fixed issue where fetchOne() methods throw - NullPointerException if no result record is available -#312 - Fixed issue where Field.equal(...) methods rendered - unexpected SQL when rhs null is cast to a type -#313 - Fixed Derby cast type for VARCHAR -#304 - Let the DerbyDataType default for java.lang.String be - VARCHAR, not LONG VARCHAR - -Version 1.5.4 - March 04, 2011 -================================================================= - -Feature #243 required a minor API change in the base classes of -generated source code. This means you have to re-generate all -your jOOQ artifacts in order to migrate to 1.5.4. The artifacts -themselves should be regenerated in a compatible way, such that -your client code should not be affected. If this is not the case, -please report a ticket here: - - https://github.com/jOOQ/jOOQ/issues - -Apart from the Derby RDMBS and some new data type support, there -have been many new convenience methods added all over the API. -For instance, if type-safety is not really a requirement, there -are lots of possibilities to use plain SQL directly in the DSL. -In that case, data can be accessed from Record, Results, not only -through Field, but also through field names or indexes. - -Check out the updated documentation (soon) here: - - http://www.jooq.org - -- Support for the Derby RDBMS -- Support for casting. This allows for even greater flexibility - in cases where jOOQ cannot 100% ensure type-safety -- Support for ARRAY types. Oracle, Postgres, HSQLDB and H2 ARRAY - types are now supported natively as regular bindings in - jOOQ's Field -- Support for dialect-specific data types. CHAR, VARCHAR, CLOB - are no longer treated equally as java.lang.String. Their - type heritage is also generated -- More sequence support -- Lots and lots of bug fixes - -Features --------- -#95 - Support for the Derby RDMBS -#163 - Add support for JDBC type ARRAY (with Postgres) -#209 - Add support for DB2 sequences -#210 - Add support for H2 sequences -#211 - Add support for HSQLDB sequences -#215 - Support for SQL casting using as cast type -#246 - Support for SQL casting using dialect-specific data types -#254 - Add HSQLDB support for ARRAY types -#256 - Add Oracle support for VARRAY types -#257 - Integrate ARRAY types with stored procedures -#261 - Add a global type mapping to the generated Schema object -#267 - Add DataTypeDefinition for further abstraction of data - types in code generation -#269 - Add H2 support for ARRAY types -#290 - If log4j is not on the classpath, use java.util.logging - instead, as fallback - -API Changes ------------ -#156 - Allow for results to be accessed by index, not by field -#218 - Corrected bad method signature: - Record.getValueAsLong(Field, Integer) -#219 - Extended Result and Select API's to be more similar to - that of Record -#232 - Add more convenience plain SQL support to the API -#235 - Add convenience methods to Record, Result and Select for - access of data via field name -#243 - Refactor DataType implementations in order to allow for - the use of generics -#259 - Add field type to database meta data (ColumnDefinition) -#260 - Add field type to database meta data (Field) -#262 - Add default behaviour for Record.getValue(Field) -#276 - Add Javadoc as a ZIP file to the jOOQ distribution - -Bugfixes --------- -#125 - Add more plain SQL integration tests -#191 - Add more integration tests for nested unions -#205 - Implemented workaround for handling Postgres stored - functions with UDT OUT parameters -#214 - Fixed NPE when generating a stored function with an - unknown parameter type -#216 - Fixed some cases where binding of BigInteger is not done - correctly -#220 - Syntax error when using select statement in a CASE clause -#221 - Corrected integration tests for combined update and - select statements -#222 - Added integration test for INSERT statements having - nested SELECT statements for their fields -#225 - Correctly cast array types in Postgres -#230 - Potential misuse of Blob and Clob in H2's JDBC types -#239 - Factory.fetchAny() is not implemented for SQLite -#244 - Fixed peculiar MySQL casting support where cast types do - not match any data types -#245 - Fixed NPE when reading null dates in SQLite -#249 - Added ARRAY type integration tests -#255 - Stored procedure bind variables get mixed up when any - argument is null -#263 - Correctly handle Postgres function overloading -#264 - Ambiguous funciton calls when calling overloaded functions - with null parameter -#281 - Handle compilation errors when generating stored - procedures with > 254 parameters -#283 - Fixed compilation errors in generated source code for - Oracle's UDT table type -#284 - Fixed compilation errors in generated source code for - Oracle procedures in packages, when they have no - parameters -#285 - Fixed compilation errors in generated source code for - Oracle tables with the same name in different schemata -#286 - Fixed name collisions in generated objects with the - java.lang.* package -#288 - Prevent the creation of UNION queries with bad syntax - in MySQL -#289 - Correctly alias fields within UNION queries for some - dialects, which then only require the "AS" keyword -#291 - Cannot create an aliased field called "year" in Postgres - -Version 1.5.3 - January 13, 2011 -================================================================= - -- Lots of stored procedure support was implemented -- Support for sequences was added -- The final decision to postpone support for DB2 UDT's was made -- Some code generation bugfixes - -Features --------- -#36 - Added stored procedure / stored function support for HSQLDB -#140 - Added support for Oracle sequences -#147 - Added support for H2 stored functions -#162 - Correctly integrate UDTs with stored procedures -#170 - Added support for Postgres stored functions -#186 - Added support for more Oracle PL/SQL simple data types -#193 - Simulate support for H2 "stored procedures" -#195 - Simulate support for Postgres "stored procedures" -#206 - Added support for Postgres sequences - -API changes ------------ -#180 - Improved DSL for constant values -#181 - Allow for referencing Field in function argument list -#189 - Renamed convenience methods in org.jooq.Record -#207 - Add fetchOne(Field) method to org.jooq.Select API - -Bugfixes --------- -#182 - Protected generated Record classes against clashes with inherited methods -#183 - Fixed NullPointerException, when generating master data tables with - NULL fields -#184 - Fixed IllegalArgumentException, when a data type is present in the - schema, but unavailable in code generation logic -#185 - Code generation should not fail when single elements cannot be generated -#188 - Improved integration tests for stored procedures / functions / packages -#196 - Increase RDMBS version compatibility by avoiding "SELECT *" in code - generation logic -#199 - Added integration tests for stored procedures in RDBMS that do not - support OUT parameters -#201 - Fixed issue in DB2 where stored procedures without parameters were not - generated. -#202 - Added integration tests for stored procedures / functions without - parameters - -Version 1.5.2 - December 27, 2010 -================================================================= - -- Improved support for stored procedures, also in packages -- A minor API change was inevitable to implement #173. The API change only - concerns the INTERNAL API. Deprecation marks are added and deprecated items - will be removed in 1.6.0 -- Experimental SQLite database support -- Some important bug fixes - -Features --------- -#25 - Added support for Oracle packages -#114 - Added support for Oracle UDTs -#145 - Added support for the SQLite database -#150 - Generate static convenience methods for stored procedures / functions -#151 - Generate static convenience methods for stored function fields -#152 - Generate meaningful serialVersionUID in generated classes -#173 - Added support for EQUIVALENT schemata - -API changes ------------ -#159 - Added convenience method List getValues(Field) to Result -#165 - Added convenience methods for creating EXISTS clauses -#169 - Improved DSL for WHERE clauses - -Bugfixes --------- -#68 - Prevent issues originating from overloaded stored procedure names, - generating identical Java class names -#153 - Fixed issue with generated code for DB2 stored functions -#154 - Fixed issue with generated code for DB2 stored functions -#155 - Fixed issues with database NULL not being mapped correctly to Java NULL - when selecting values that have a primitive type (int, long, etc) -#158 - Potential ClassCastException when using Field -#171 - Corrected issue related to selection of default schema in DB2 -#177 - Fixed issue related to generated code for tables or UDTs without columns - - -Version 1.5.1 - December 13, 2010 -================================================================= - -- H2 database support thanks to Espen Stromsnes -- Improved stored procedure support - -Features --------- -#96 - Added H2 database support -#101 - Added stored procedure / stored function support for Oracle -#138 - Added stored procedure support for DB2 -#146 - Added support for DB2 functions - -API changes ------------ -#143 - Added convenience methods to Record - -Bugfixes --------- -#84 - Implemented referential code generation for foreign keys that do not - match their primary keys' types -#141 - Encoding problem in generated master data classes - -Version 1.5.0 - November 22, 2010 -================================================================= - -- A big one. Major API changes / improvements -- Added lots of convenience methods -- UDT support -- Enum support -- DB2 support thanks to Espen Stromsnes -- "Light" dependency to log4j added. jOOQ will still run without it - -Features --------- -#1 - Create support for UDTs (so far only for PostgreSQL) -#15 - Added DB2 support -#60 - Added support for nested selects in INSERT and UPDATE - statements -#83 - Added log4j logging to code generation and runtime -#87 - Add support for arithmetic expressions -#105 - Added support for ENUM data types, where applicable - (MySQL and PostgreSQL so far) -#110 - Added execute and fetch convenience methods -#111 - Added missing "select distinct" support -#122 - Annotate generated classes with javax.annotation.Generated -#123 - Generate user enum fields from data values (master data) -#124 - Added PlainSQLTable -#127 - Added not() operator to Condition -#135 - Added convenience methods andNot() and orNot() in - Condition - -API changes ------------ -#89 - Removed support for DataSource. jOOQ is not a transaction - manager -#92 - Added SortField type to be used for sorting -#99 - Provide better access to functions (No more FunctionFactory) -#116 - Merge Manager functionality into Factory -#118 - Improve API of org.jooq.Field -#119 - Improve subquery condition API -#132 - Reduced much of the select query API -#134 - Better separation of SelectQuery and SimpleSelectQuery - -Bugfixes --------- -#109 - Error when executing select * if generated schema does not - match actual schema -#115 - Fix various "null" pseudo field issues -#126 - Error when selecting a single field from a union nested - select -#129 - Fixed performance issue in Oracle code generation for - very large databases - - -Version 1.4.4 - November 22, 2010 -================================================================= - -Unreleased version, fixes included in 1.5.0 - -Bugfixes --------- - -#133 - JoinCondition does not take comparison operator - -Version 1.4.3 - October 25, 2010 -================================================================= - -Some more bugfixes - -Bugfixes --------- - -#71 - Generated code does not compile, when foreign key and - primary key have a data type mismatch -#73 - In Oracle generated code, multi-field foreign keys may - generated bad relations code -#82 - Conversion of literals to camelcase fails if numbers are - involved - -Version 1.4.2 - October 22, 2010 -================================================================= - -Various bugfixes and minor improvements - -Features --------- -#66 - Add support for CASE or DECODE expression - -API changes ------------ -#77 - Functions should not extend FieldImpl, but a new - AbstractField -#78 - QueryPart pollutes declared method space of its - implementations. Hide it by indirection - -Bugfixes --------- -#64 - Code generation fails when foreign key references a unique - key that is not the primary key. Code generation for these - cases is omitted -#67 - When loading properties files, a leading / seems to be - mandatory. This is preventing users from correctly setting - up jOOQ the first time -#70 - Add support for Oracle datatype TIMESTAMP(6) -#72 - Name clashes in generated Tables -#75 - Constant does not bind its values. -#76 - Constant should not render strings all the time -#79 - Constants are not properly escaped -#80 - Position function does not bind any variables -#81 - Add cast function to Constants in HSQL - -Version 1.4.1 - October 18, 2010 -================================================================= - -Oracle patch release - -Features --------- -#63 - Generate referential functionality for Oracle - -Version 1.4.0 - October 17, 2010 -================================================================= - -Support for PostGreSQL was added. -Added lots of OR-mapping functionality. -There is a general API change due to various new features. - -Features --------- -#14 - Add PostGreSQL support -#40 - Resolve foreign keys. Allow for navigation between objects. -#42 - Add PlainSQLField -#45 - Add "dirty" flag to Record's values. This allows for - updating only relevant data. -#47 - Complete implementation for UPDATE, INSERT, DELETE - statements. Added some missing functionality. -#48 - Add more support for Date, Time, Timestamp fields. -#51 - Add a org.jooq.impl.Manager class that provides common - utility methods for CRUD operations - -API changes ------------ -#10 - Add second generic type . This is a - prerequisite for many OR-mapping features -#18 - Use org.jooq.Record in InsertQuery and UpdateQuery -#46 - Create UpdatableRecords as a prerequisite for JPA and true - OR-mapping. These records support store() and delete() - methods -#52 - Add default constructor in generated Records. -#53 - Add refresh functionality to UpdatableRecords. See also #46 -#54 - Add a state to the factory class -#56 - Reduce API, remove unnecessary Condition subinterfaces -#57 - Reduce API, remove unnecessary QueryPart interfaces - -Bugfixes --------- -#49 - NullPointerException when generating relations on schema - subset -#58 - Count function renders bad SQL in various dialects -#59 - Exception when selecting unaliased functions in queries - -Version 1.3.0 - August 24, 2010 -================================================================= - -Support for HSQLDB was added. -There is a major API change due to #44. - -Features --------- -#29 - Generate primary keys and foreign keys in Oracle code - generation -#34 - Add support for HSQLDB -#39 - Generate primary keys and foreign keys in HSQLDB code - generation -#41 - Add documentation to QueryFactory and Functions - -API changes ------------ -#23 - Add support for more advanced joins -#32 - Merge SelectQuery and ResultProviderQuery interfaces -#44 - Let Query methods return "this" - -Bugfixes --------- -#35 - Add unit tests for HSQLDB support -#37 - Syntax error in combined select queries! - The usage of combined queries in MySQL may still be a bit - awkward. Keep an eye out for further fixes -#43 - Join with aliased tables doesn't work - -Version 1.2.0 - August 21, 2010 -================================================================= - -The added Oracle support is now unit tested and more stable. -The Oracle NUMBER data type is mapped more precisely to Java -types. - -Features --------- -#12 - Model primary keys and foreign keys in generated code -#22 - Improve mapping of Oracle NUMBER data type -#26 - Add Plain SQL QueryParts -#27 - Add support for HAVING clause - -Bugfixes --------- -#24 - Add Unit tests for oracle database (and fixed bugs) -#31 - Pull up addOrderBy() methods from SelectQuery to - ResultProviderQuery - -Version 1.1.0 - August 17, 2010 -================================================================= - -The main new feature is the Oracle support. Wait for -Version 1.1.1 for that support to be stabilised, as there are no -Oracle unit tests running against an Oracle database yet. - -Features --------- - -#2 - Add support for inner / nested selects -#3 - Add more function support -#4 - Implement filtering functionality for code generation -#6 - Add Oracle Support -#9 - Create true POJO's (implementing org.jooq.Record) with - getters and setters -#17 - Make org.jooq.impl.Parameter independent of Field - -Bugfixes --------- - -#11 - Code generation does not remove files - -Version 1.0.1 - August 14, 2010 -================================================================= - -Features --------- - -#5 - Prevent code regeneration, if no changes were made -#7 - Implement ant task for code generation - -Version 1.0.0 - August 14, 2010 -================================================================================ -Initial Release \ No newline at end of file diff --git a/jOOQ-website/inc/RELEASENOTES-2.1.txt b/jOOQ-website/inc/RELEASENOTES-2.1.txt deleted file mode 100644 index 5783e32b67..0000000000 --- a/jOOQ-website/inc/RELEASENOTES-2.1.txt +++ /dev/null @@ -1,2397 +0,0 @@ -jOOQ Release notes -================== - -For an interactive overview, see also -http://github.com/jOOQ/jOOQ/issues - -For a formatted text version, see -http://www.jooq.org/notes.php?version=2.1 - -For a text version, see -http://www.jooq.org/inc/RELEASENOTES-2.1.txt - -Version 2.1.1 - April 22, 2012 -================================================================= - -This is a minor patch release, fixing some issues - -Bug fixes ---------- -#1241 - Wrong variable binding when comparing CHAR columns in - Derby and DB2 without explicit casting to VARCHAR -#1244 - Cannot override class name in GeneratorStrategy in - Mode.POJO -#1264 - Pass fetchsizes <= 0 to the JDBC driver (for MySQL - compatibility) -#1267 - User defined H2 functions codegen bug -#1270 - Most databases allow for multiple identical foreign keys. - This leads to compilation errors in generated source code -#1287 - Remove oracle.sql dependency also from OSGi information - in pom.xml -#1298 - Avoid source code generation errors when generating code - for unknown, dialect-specific data types -#1308 - Oracle's DataTypeDefinition reports the length of a BLOB - / CLOB data type to be 4000 -#1343 - Regression in insertInto(...).values(...). Cannot pass - Field to values() - -Version 2.1.0 - March 18, 2012 -================================================================= - -With this version, jOOQ attempts to follow versioning rules -imposed by semantic versioning: http://semver.org/ -There will be 1 minor release per month, and a couple of patch -releases per year, depending on popular demand - -The main improvements for this release include - -- The possibility of providing jOOQ with a custom type mapping. - You can now define your own Converter types that are used by - jOOQ to map a database's SQLDataTypes to your custom types. - This is particularly useful for Java's enums. Read more about - custom converters in the manual: - http://www.jooq.org/manual/ADVANCED/CustomTypes/ - -- There are a lot of new runtime configuration options to control - the SQL style of SQL rendered by jOOQ. You can now specify - whether table/column names should be quoted / capitalised / - lower-cased, whether SQL keywords should be capitalised or not, - etc... - -- The handling of NULL has been improved in favour of using jOOQ - as a SQL builder library (e.g. along with Spring for execution) - NULL is no longer inlined, but bound as a variable. - -- jOOQ now supports simulation of the relational division - operation using an intuitive syntax. Read more about the - relational division here: - http://en.wikipedia.org/wiki/Relational_algebra#Division - -Features and improvements -------------------------- -#161 - Add runtime configuration to pretty print rendered SQL -#349 - Add SQLite relations support -#491 - Add runtime configuration for SQL keyword style (upper - case, lower case) -#521 - Add runtime configuration for SQL reference style (upper - case, lower case, as-is, quoted) -#1150 - Add code generation option to disable generation of - records -#1181 - Add support for SQL Server data types timestamp and - rowversion -#1188 - Load default Settings from the classpath at - /jooq-settings.xml, or from -Dorg.jooq.settings -#1193 - Specify main-class in jOOQ Console's manifest.mf and - include dependency in jar file -#1194 - Add ColumnDefinition.isNullable() -#1202 - Add support for the relational division operation: - A.divideBy(B).on(A.ID.equal(B.A_ID)).returning(A.X, ...) -#1207 - Add Factory.batch(Collection) for - convenience -#1208 - Render @javax.persistence.Column(nullable = false) - property, if available -#1209 - Render @javax.persistence.Column(length, precision, - scale) properties, if available -#1215 - Add org.jooq.Converter for custom type mapping -#1216 - Overload Record, Result.getValue() and .setValue() - methods to accept a Converter -#1217 - Add EnumConverter as a base type for custom enum - converters -#1218 - Add code generation options to generate - referencing a Java type and a Converter -#1224 - Add DataTypeDefinition.getLength() to jooq-meta's type - system -#1233 - Support custom JDBC properties for jooq-codegen -#1234 - Add Database.getTable(SchemaDefinition, String, boolean) - to fetch tables case-insensitively -#1239 - Add Factory.fetchLazy(String, Object...) - -API changes (backwards-compatible) ----------------------------------- -#1191 - Deprecate ConfigurationRegistry and replace by equivalent - ExecuteListener feature -#1219 - API Bug: Cannot use LIMIT .. OFFSET along with FOR UPDATE - -Bug fixes ---------- -#625 - Remove dependency from generated Routines to the - generator's SQLDialect -#1128 - NULL is inlined in INSERT statement instead of binding it - as a variable. This can cause issues when using jOOQ with - Spring -#1137 - Exclude MySQL column-level enum types when that column is - overridden by a -#1158 - Derby cannot handle inlined NULL literals in some - contexts -#1180 - Execute BatchMultiple (multi-query batch query), when - executing BatchSimple (single-query, multi-bind-value - query) with StatementType == STATIC_STATEMENT -#1189 - TableMapping regression for SQLite database -#1190 - Cannot store SQLite records when using - StatementType.STATIC_STATEMENT -#1199 - Table.getFields() returns an internal representation of a - table's field list. Make generated tables immutable! -#1200 - Internal API leak exposed through covariance in - AbstractType.getFields() -#1211 - Enforce method name disambiguation also when using custom - strategies in jooq-codegen -#1212 - Enforce identifier disambiguation also when using custom - strategies in jooq-codegen -#1221 - Incorrect ExecuteListener invocation for INSERT .. - RETURNING. executeStart() and executeEnd() are omitted -#1223 - Cache ExecuteListener classes for performance -#1225 - Bind NULL byte[] as java.sql.Types.BINARY instead of - BLOB in Postgres, to avoid errors -#1226 - Bind NULL UDTs with their associated type name in Oracle -#1232 - SQLException when Factory.fetch() does not return a - ResultSet -#1237 - Don't generate enum classes for columns in MySQL tables - that are excluded from code generation - -Version 2.0.5 - February 26, 2012 -================================================================= - -This release finally introduced basic runtime configuration -features for the jOOQ Factory. This configuration now includes: - -- Execute listener and SQL tracing support. jOOQ allows you to - hook your own listeners into jOOQ's query execution engine to - be notified of all sorts of events -- The existing SchemaMapping features. They are now part of the - runtime configuration -- StatementType settings. Specify whether a Factory should - execute java.sql.PreparedStatements (with bind variables) or - static java.sql.Statements with inlined variables. - -The runtime configuration is documented here: - -http://www.jooq.org/manual/JOOQ/Factory/ - -The listener and tracing support has been requested by -Christopher Deckers, a new jOOQ user who has had the courtesy to -contribute the new jOOQ Console, which is documented here: - -http://www.jooq.org/manual/ADVANCED/ExecuteListener/ - -Apart from that, another long-requested feature is now fully -implemented: The GeneratorStrategy, allowing for custom naming -strategies in generated source code. This will allow for -generating custom table / record class name prefixes / suffixes, -as well as overriding the default behaviour for rendering UPPER, -lower and CamelCase artefacts. See the manual for details: - -http://www.jooq.org/manual/META/Configuration/ - -Features and improvements -------------------------- -#93 - Add Field.equalIgnoreCase(), Field.notEqualIgnoreCase() -#408 - Add class prefixes, suffixes and other options to the - code generator -#492 - Add runtime configuration -#1107 - Let Field.contains() support the Postgres ARRAY @> ARRAY - operator -#1140 - Add ResultQuery.fetchResultSet() to return the underlying - JDBC result set -#1143 - Add Result.isNotEmpty() for convenience -#1145 - Add runtime configuration to specify whether jOOQ should - execute java.sql.PreparedStatement (with bind variables) - or a java.sql.Statement (with inlined parameters) -#1146 - Add Query.getSQL(boolean) to indicate that bind values - should be inlined (as a convenience for - Factory.renderInlined(QueryPart)) -#1148 - Add Cursor.resultSet() to expose the underlying ResultSet -#1149 - Allow for optional - "http://www.jooq.org/xsd/jooq-codegen-2.0.4.xsd" - namespace in jooq-codegen configuration -#1152 - Add & org.jooq.EnumType> - E MySQLFactory.enumType(Class, int) for enum reverse - lookups of MySQL-specific enums -#1159 - Support matching numbers with LIKE, e.g. ID LIKE '%33%' -#1160 - Implement Field.contains(), .startsWith(), .endsWith() - for numeric values, too -#1161 - Use reflection to remove compile-time dependency on - ojdbc for creating ARRAYs -#1162 - Integrate jOOR into jOOQ for simpler reflection -#1164 - Distinguish between Definition.getInputName(), - .getOutputName() -#1165 - Add constraint name to generated javadoc -#1167 - Trivial issue with org.jooq.Factory.exists Javadoc - - GitHub issue #10 -#1169 - Add Configuration.setData(), getData() to convey custom - data in a configuration's lifecycle -#1172 - Add runtime configuration to deactivate JooqLogger -#1177 - Add jOOQ-Console module to jOOQ -#1184 - Add DataType.isArray() - -API changes (backwards-compatible) ----------------------------------- -#1142 - Rename Result.exportXML() to Result.intoXML() to stay - more consistent -#1151 - Deprecate SchemaMapping in favour of new runtime - configuration - -Bug fixes ---------- -#978 - Schema.getTables() and similar methods return empty lists - when Schema is mapped with SchemaMapping -#1153 - Bad inlining of booleans in Sybase ASE / DB2 / Oracle - SQL Server / SQLite -#1154 - Bad inlining of byte[] in most dialects -#1155 - byte[] are erroneously converted to String when using - Record.intoArray() -#1156 - Bad inlining of DATE / TIME / TIMESTAMP data types in - Ingres (and other dialects, when the setting differs from - the default) -#1166 - Some generated Javadoc uses naming strategy or plain - output name, instead of qualified output name -#1168 - Oracle packages are generated as static, instead of - static final -#1175 - Factory.use() seems to render SQL with the Schema name - still present -#1179 - Oracle-generated ArrayRecords need a reference to - org.jooq.Schema to read TABLE of OBJECT from stored - procedures - -Test cases ----------- -#1147 - Add integration tests for executing SQL generated using - Factory.renderInlined() - -Version 2.0.4 - February 12, 2012 -================================================================= - -This release introduced many improvements to source code -generation. These improvements include: - -- Maven and standalone code generation now use the same XML - configuration, which is read by jOOQ-codegen using JAXB. This - allows for more complex configuration elements in the future -- jOOQ-codegen can now handle multi-schema databases and generate - code for tables referencing tables from other schemata. This - is integration tested against the SQL Server AdventureWorks - database -- jOOQ now allows to generate simple POJOs in addition to Records - and to annotate both POJOs and Records with JPA annotations - such as @Entity, @Table, @Id, @Column, @UniqueConstraint, etc. - -You can migrate your existing .properties configuration by running -> org.jooq.util.GenerationTool /your.properties migrate - -Besides that, there is a lot of ongoing work to improve the -integration of Oracle's TABLE and VARRAY types. - -Features and improvements -------------------------- -#8 - Add JPA annotations to generated POJOs / Records -#282 - Add support for multi-schema databases -#287 - Add support for Oracle TABLE types -#395 - Use XML configuration file instead of properties file -#1089 - Add Field.contains(), .startsWith(), .endsWith() as a - convenience for Field.like() (including escaping) -#1092 - Move master data table configuration from - generator.generate to generator.database namespace -#1093 - Add support for generator.strategy in Maven source code - generation -#1094 - Add support for generator.database.date-as-timestamp in - Maven source code generation -#1095 - Move generator.generate.unsigned-types to - generator.database namespace -#1096 - Add support for generator.generate.unsigned-types in - Maven source code generation -#1103 - Add support for SQL Server data type uniqueidentifier -#1106 - Add Factory.escape(Field, char) for use with LIKE -#1108 - Add support for multi-schema databases using Maven code - generation -#1115 - Add support for Oracle VARRAY/TABLE of OBJECT types -#1127 - Add support for POJO classes generation -#1129 - Allow for using Param in LIMIT .. OFFSET clauses -#1132 - Add RenderContext.castMode() to allow for avoiding casts - where this is not really needed -#1136 - Add generation option to enable/disable generating - navigation methods - -Bug fixes ---------- -#1099 - Derby generated artefacts are not sorted alphabetically -#1101 - Internal API leak exposed through covariance in - AbstractTable.joinXXX() methods -#1110 - VARRAY element type information is lost when unnesting - VARRAY's in Oracle -#1111 - VARRAY element type information is lost when unnesting - VARRAY's returned from functions in Oracle -#1114 - Syntax error when unnesting TABLE of OBJECT in Oracle. - The unnested table contains several columns but jOOQ only - unnests "COLUMN_VALUE" -#1117 - NullPointerException when passing an ArrayRecord - containing a null array to a stored function in Oracle -#1125 - Postgres needs casting for date time data types in - queries like SELECT ? FROM DUAL -#1131 - DB2: [Noauthorized routine named "LIKE" of type - "FUNCTION" having compatible arguments was found] when - using Field.like(concat(x, y)) -#1133 - Compilation errors in generated source code if the same - constraint name exists in several schemata -#1134 - NullPointerException in code generation when a foreign - key constraint references a table from another schema - that is not being generated -#1135 - Generated Javadoc references inputSchema instead of - outputSchema - -Test cases ----------- -#1009 - Add more integration tests for proper handling of - java.sql.Date, Time, Timestamp -#1090 - Run jOOQ tests against AdventureWorks SQL Server sample - database -#1105 - Add integration tests for multi-schema source code - generation and querying -#1122 - The 10k lines of integration test code are too heavy for - the compiler. Create test modules with fewer lines of - code, each. - -Version 2.0.3 - January 29, 2012 -================================================================= - -This release focuses on increased compatibility between various -SQL dialect integrations as far as ARRAY and JOIN support is -concerned: - -- ARRAY types are only available in H2, HSQLDB, Oracle, Postgres. - Nevertheless, they can be somewhat simulated in other dialects - using nested selects with UNION ALL. Increased compatibility - leads to a nicer API, where ARRAYs are used along with ALL/ANY - quantifiers, for instance. - -- JOIN syntaxes can be quite powerful in SQL. Apart from - simulating NATURAL JOIN, JOIN USING clauses, as well as a - synthetic "KEY JOIN" syntax, jOOQ now also supports nesting - JOIN expressions to create more complex table sources. See a - recent blog post on the subject here: - -http://blog.jooq.org/2012/01/15/lets-revise-the-sql-from-clause/ - -Features and improvements -------------------------- -#578 - Add KEY JOIN syntax to simulate joining using generated - foreign keys -#577 - Simulate NATURAL JOIN syntax, where this is unavailable -#582 - Simulate JOIN USING syntax, where this is unavailable -#671 - Allow for nesting JOIN clauses -#676 - Add Table.join() methods to create more flexible table - sources -#993 - Add Field.equalAny(T[]), .equalAny(Field) methods -#1048 - Simulate (array) syntax for dialects - that do not support arrays -#1051 - Add Factory.execute(String, Object...) as a convenience - method for Factory.query(...).execute() -#1055 - Simulate Factory.table(Object[]) and table(List) using - UNION ALL in dialects that do not support arrays -#1060 - Improve debug logging of H2 arrays. The syntax is not - ARRAY[1, 2], but (1, 2) -#1065 - Add OracleFactory.sysContext(String, String) to support - Oracle's SYS_CONTEXT function -#1069 - Add support for INSERT INTO table(field1, field2, ...) - SELECT syntax - as opposed to the existing INSERT INTO - table SELECT -#1072 - Add support for LIKE .. ESCAPE .. syntax -#1074 - Add Field.notBetween(T, T) for convenience -#1080 - Add support for JDBC's Statement.setFetchSize() in - ResultQuery.fetchLazy() -#1082 - Add some more DEBUG logging in AbstractResultQuery - -API changes (backwards-compatible) ----------------------------------- -#1059 - Change SelectFromStep.from(Collection>) to - from(Collection>) - -API changes (backwards-incompatible) ------------------------------------- -#1087 - Change the NTILE function to return Field - instead of Field - -Bug fixes ---------- -#1071 - Make Sequence Serializable -#1081 - Derby error in NULL handling when simulating unnested - arrays that contain NULL values -#1084 - Bind index mismatch in val(null).equal(null) and in - val(null).notEqual(null) -#1091 - Add missing @Support annotations on Table.crossJoin() - methods - -Test cases ----------- -#1026 - Add integration tests for NTILE window function and - document compatibility -#1073 - Add integration tests for NOT IN queries holding NULL - arguments - -Version 2.0.2 - January 8, 2012 -================================================================= - -This is a maintenance release for jOOQ 2.0. The main improvements -include - -- The whole jOOQ API is now annotated with a new org.jooq.Support - annotation to help you assess whether a certain SQL clause is - available in your database or not. This is particularly useful - when your application should support several databases at once - (e.g. MySQL, Postgres, Oracle) -- The Oracle PIVOT clause is now formally supported for advanced - statistical queries in Oracle. This clause will be simulated in - other dialects in the future. -- The DATE data type can be mapped to TIMESTAMP. This important - when you query a legacy Oracle database, where DATE columns - can also contain time information -- Several convenience methods have been added for more fluent - syntax, when using plain SQL result queries, subqueries as - tables, or when unnesting arrays in ANY() and ALL() quantifiers - -Further type mapping support is still experimental. An official -cooperation with MinuteProject for source code generation is -being analysed. With MinuteProject, many source code generation -issues could be addressed centrally, as MinuteProject specialises -in source code generation: - -http://minuteproject.wikispaces.com/ - -Features and improvements -------------------------- -#595 - Add support for Oracle's PIVOT clause -#869 - Add support for using ANY, ALL with arrays, not just with - subselects -#1007 - Formally document the API methods to indicate whether - something is supported by any given SQL dialect -#1011 - Add code generation configuration parameter to avoid - generating @Generated annotation -#1019 - Render LIMIT x OFFSET y also for MySQL, instead of - LIMIT y, x -#1022 - Add missing Sybase ASE implementation for Factory.use() -#1024 - Add Factory.resultQuery(String, Object...) to allow for - arbitrary execution modes of plain SQL queries (lazy, - later, into, array, etc) -#1025 - Add missing SQLite implementation for Factory.deg() and - Factory.rad() -#1033 - Generate table comments into generated Tables.java as - Javadoc -#1040 - Add Object[][] Result.intoArray() and - Object[] Record.intoArray() for convenience. Let - E Record.into(Class) also support array types. -#1041 - Add Table Factory.table(Select) convenience - method for more fluency -#1042 - Add support for DISTINCT keyword in SUM, AVG, MIN, MAX - aggregate functions -#1046 - Generate Ingres table and column comments in generated - source code (only Ingres 10) - -API changes (backwards-compatible) ----------------------------------- -#1050 - Deprecate usage of SOME quantifier in predicates, such as - equalSome() - -API changes (backwards-incompatible) ------------------------------------- -#1036 - Fixed API typo in - WindowsRowsStep.rowsBetweenUnboundedFollwing() -#1037 - The fluent API allows for JOIN clauses without FROM - clause - -Bug fixes ---------- -#1010 - The MERGE INTO .. WHEN NOT MATCHED THEN INSERT .. syntax - may cause type-safety issues in some databases. VALUES - should be converted before binding -#1014 - FindBugs: Latent risk of infinite recursion due to typo - in QueryPartList.retainAll(); -#1015 - FindBugs: 7 occurrences of "Bad attempt to compute - absolute value of signed 32-bit hashcode". In extreme - cases, this could lead to SQL syntax errors -#1016 - The Oracle CONNECT BY cond1 AND cond2 syntax erroneously - creates a WHERE cond2 CONNECT BY cond1 statement -#1028 - Syntax errors when using untyped param() in HSQLDB (and - other strongly typed dialects) -#1029 - Postgres can't bind NULL values in cases, where bind type - is Object.class and bind value was created with - Factory.param() -#1030 - UnsupportedOperationException when calling - Query.bind(int, Object) on a query containing plain SQL - fields -#1031 - Incorrect debug logging when plain SQL QueryParts like - field("?") bind null values -#1032 - Incorrect debug logging when plain SQL QueryParts contain - String literals, such as 'Hello? Anyobody out there?' -#1047 - Field.notEqualAny() erroneously renders <> ALL() - -Test cases ----------- -#1021 - Add explicit integration tests for - LEFT|RIGHT|FULL OUTER JOIN - -Version 2.0.1 - December 23, 2011 -================================================================= - -This is a maintenance release for jOOQ 2.0. The main improvements -include - -- Better integration for using jOOQ with Spring Data. This - includes support for named parameters, as well as allowing to - change bind values on previously constructed Query objects -- The MERGE statement has been enhanced for better integration - with Oracle. -- jOOQ is now ready to use with Scala / Groovy - -For more information about using jOOQ with Scala, see this blog -post: -http://blog.jooq.org/2011/12/11/the-ultimate-sql-dsl-jooq-in-scala/ - -There is now also experimental support for a custom type mapping. -This mapping allows to rewrite data types at code generation time -as well as to specify custom enum data types (e.g. boolean Y/N). -Not all integration tests run smoothly for custom data types, -hence, this feature is not yet fully supported. - -Features and improvements -------------------------- -#691 - Add support for Oracle CURSOR REF IN / INOUT parameters -#677 - Add type-mapping configuration, enforcing types for - columns -#947 - Add custom type mapping support (experimental) -#968 - Allow for custom enum types, configured in the code - generator (experimental) -#974 - Add Schema.getTable(String), getSequence(String), - getUDT(String) for better runtime Schema meta-navigation -#975 - Add Sequence.getName(), getSchema(), getDataType() -#980 - Add support for named parameters, to better interact with - Spring -#991 - Add Query.bind(String, Object) and bind(int, Object) to - easily modify existing bind values -#992 - Document thrown DataTypeException in Convert methods -#998 - Enhance MERGE statement for Oracle extensions: - WHEN MATCHED THEN UPDATE .. WHERE .. DELETE WHERE .. - WHEN NOT MATCHED THEN INSERT .. WHERE .. -#1000 - Add support for MySQL's INSERT INTO .. SET .. syntax in - MERGE statement's WHEN NOT MATCHED THEN INSERT clause - -API changes (backwards-compatible) ----------------------------------- -#981 - Cannot insertInto(table("my_table")), as plain SQL tables - return Table, not Table. Relax - bound on R -#988 - Change Factory.field(String) to return Field - instead of Field -#999 - Make MERGE's WHEN MATCHED .. and WHEN NOT MATCHED .. - clauses optional -#1001 - Identity.getField() should return TableField - instead of Field -#1006 - Add Factory.value(...) as a synonym for Factory.val(...) - for increased Scala / Groovy compatibility - -Bug fixes ---------- -#973 - EnumType renders name() instead of getLiteral() in - formatXXX() methods -#977 - EnumType renders name() instead of getLiteral() in - Convert.convert() method -#979 - Record.from() sets all changed flags to true. That's not - necessarily correct in the event of storing the record - back to the DB -#985 - AbstractRecord.equals() does not correctly compare - arrays. Compare them using Arrays.asList() -#986 - Postgres / DB2 / Sybase ASE foreign-key namespace is - unique-per-table. jOOQ forces all foreign keys from all - tables into the same namespace -#990 - Problems when encoding arbitrary byte[] as String(byte[]) - in inlined SQL. This can cause issues when DEBUG-level - logging is activated -#995 - Routines don't respect SchemaMapping - Github issue #8 -#1002 - TableRecord.storeUsing() doesn't update IDENTITY column - values, if the column is not part of the main unique key -#1003 - Sybase / SQL Server / MySQL / Ingres / H2 / Derby's - INSERT .. RETURNING simulation returns null if a table - has an IDENTITY column, but no primary/unique key -#1005 - The INSERT INTO .. VALUES .. syntax may cause type-safety - issues in some databases. VALUES should be converted - before binding - -Test cases ----------- -#984 - Detach IDENTITY column tests from UNIQUE KEY tests, - create a dedicated test suite instead - -Version 2.0.0 - November 25, 2011 -================================================================= -This release is a fresh start in many areas of jOOQ, adressing -issues that have been requested by users for a long time. These -release notes docment the most important changes, a detailed -upgrade guide, as well as the detailed list of improvements. - -Most important changes ----------------------- -- The API became more static. This applies to many Factory - methods, such as val(), literal(), as well as to many Field - methods that have been moved over to the Factory. For example, - when before, you wrote this using "postfix function notation": - -
NAME.replace(" ", "_").trim()
- - you will now write (just as in SQL): - -
trim(replace(NAME, " ", "_"))
- - Using static imports of Factory.*, jOOQ makes SQL look even - more like SQL. The current "postfix notation" is maintained for - backwards compatibility. -- By default, jooq-codegen will now generate a "dynamic" meta - model as opposed to the existing static one. Generated tables - covariantly override the as(String) aliasing method, leading - to a much more convenient aliasing style. When before, you - wrote: - -
-Table parent = T.as("parent");
-Table child  = T.as("child");
-Condition join =
-  parent.getField("ID").equal(child.getField("PARENT_ID"))
-
- - You can now write: - -
-T parent = T.as("parent");
-T child  = T.as("child");
-Condition join = parent.ID.equal(child.PARENT_ID)
-
- - Of course, the existing notation still works - -- Exceptions are no longer checked. When previously, the DB's - SQLException was propagated to client code, there is now an - unchecked DataAccessException hierarchy, similar to that of - Spring. This will eventually give way to a standardised error - handling abstraction, in future developments. -- Window functions are now constructed from their underlying - aggregate functions just like in SQL. For example: - -
-sum(AMOUNT)
-sum(AMOUNT).over().partitionBy(ACCOUNT)
-
- - This makes for a more concise API, especially when considering - future extensions, such as Oracle's KEEP (DENSE_RANK FIRST...) - syntax. -- More type safety has been introduced regarding various places - where generic and types are involved. - This is especially true for INSERT / UPDATE / DELETE statements -- Sequences now also have a type -- Unsigned number types are now supported in those databases that - use them. Unsigned numbers are implemented in jOOU, a spin-off - open source project. For convenience, this library is - "internalised" into jOOQ, to avoid adding a dependency - -http://code.google.com/p/joou/ - -Upgrade instructions: ---------------------- -Various of the above changes are incompatible with jOOQ 1.x. In -order to upgrade, please be aware of the following pitfalls: - -- The schema needs to be re-generated. -- Much of the post-fix function notation is replaced by static - methods in the Factory. Today's org.jooq.Field API is - maintained in jOOQ 2.0, for backwards compatibility. It will - be removed, eventually, though. Expect some incompatible - changes, where window functions are involved -- Some Factory instance methods (such as val(), literal()) are - now static. They are compatible, but may cause compiler - warnings. -- The meta model is now an instance model by default. If you - prefer the static meta model, you can configure this in your - jooq-codegen configuration. -- The additional typesafety involving and types may cause - compiler warnings and errors. -- SQLException is no longer part of the API. This can cause - compiler issues, in particular when extending jOOQ -- Some utility classes have moved to org.jooq.tools - -Should these incompatibilities be too significant for your -project, you can still stay on the 1.x branch, which will be -maintained for a while. Be aware that upgrading might be more -difficult, later, though. - -Features and improvements -------------------------- -#55 - Implement improved exception handling -#117 - Improve DSL support for field and table aliasing (decrease - verbosity) -#519 - Add support for MySQL UNSIGNED numeric types -#626 - Create static function access -#661 - Add support for bitwise operators -#718 - Sequences should be mapped to appropriate type (e.g. - SMALLINT, INT, BIGINT, etc) -#734 - Add support for Oracle / SQL Server CUBE() and ROLLUP() - grouping functions -#751 - Add support for Oracle / SQL Server GROUPING SETS() - function -#799 - Add support for Oracle PL/SQL's object-oriented MEMBER - PROCEDURES and MEMBER FUNCTIONS -#804 - Add to Insert, Update, Delete -#835 - Review API typesafety for InsertSetMoreStep - set(Field, T) and similar methods -#890 - Add Factory.selectCount() convenience method -#891 - Let min() max(), etc functions return a new type - AggregateFunction. This type can then be used as an entry- - point for window functions -#892 - Add support for Oracle / SQL Server GROUPING() and - GROUPING_ID() functions to be used along with CUBE() and - ROLLUP() -#893 - Simulate ROLLUP() function for MySQL, using the WITH - ROLLUP grouping modifier -#894 - Move functions from Field to org.jooq.impl.Factory - and make them static -#895 - Add power(..., Field) -#897 - Add (experimental) Spring integration project -#898 - Replace usage of checked SQLException by an unchecked - DataAccessException, similar to that of Spring -#899 - Build jOOQ .jar files as bundles to be deployed into OSGI - environments -#900 - Purge deprecated API - Prior to 2.0 -#901 - Introduce InvalidResultException as a subtype of - DataAccessException for integrity checks in methods like - ResultQuery#fetchOne(), ResultQuery#fetchMap(), etc. -#902 - Make AggregateFunction the base type for constructing - window functions -#904 - Move SQLDialectNotSupportedException into - org.jooq.exception package -#905 - Introduce MappingException as a subtype of - DataAccessException for integrity checks in methods like - ResultQuery#fetchInto(), etc. -#907 - Add missing Field.like(Field), notLike(Field) - methods to overload the existing Field.like(T), notLike(T) -#908 - Change rpad / lpad functions to accept String instead of - char -#912 - Add R newRecord(Table, Object) as - the inverse of various into(Class) methods -#916 - Add > {Record.into(Table) | - Result.into(Table) | ResultQuery.fetchInto(Table) | - Cursor.fetchInto(Table)} -#917 - Add various Cursor.fetchOneInto() convenience methods -#918 - Add CustomTable, CustomRecord as base classes for more - convenience when used with various into(Table) methods -#919 - Allow for accessing non-public constructors of Record - subtypes -#923 - Move some utilities to org.jooq.tools -#924 - Generate a reference to every table in a new Tables.java - class for improved static access -#928 - Add DataTypeException extending DataAccessException in - case something went wrong when converting data types -#930 - Support converting date time types to java.util.Calendar. - This applies to various into(Class) methods, as well as - Result.getValue(xx, Class) -#931 - Allow for conversion between Long and date/time types, and - vice versa -#932 - Let the bound of R in TableRecord extend TableRecord, - in UpdatableRecord to extend UpdatableRecord -#933 - Add support for type Character in Record.into(Class) - methods and similar -#936 - Accept primitive types, such as int.class for type - conversion -#938 - CODEGEN: Add static/instance table field configuration -#939 - Include license.txt and readme.txt in .jar files' META-INF - directory -#953 - Make DefaultGeneratorStrategy methods non-final to allow - for overriding -#954 - Add examples for source code generation of multiple - schemata with Maven -#955 - Generate a reference to every type in a new UDTs.java - class -#957 - Add R Factory.newRecord(UDT) for constructing - attached UDTRecords -#958 - CODEGEN: Add generation-time schema mapping, allowing for - re-writing schemata in jooq-codegen -#960 - CODEGEN: Add code generation configuration parameter to - avoid using the new UByte, UShort, UInteger, ULong wrappers - for UNSIGNED number types -#961 - Use Oracle's SYS.ALL_SEQUENCES.MAX_VALUE to determine the - type of a sequence. -#969 - Add List ResultQuery.fetch(Field, - Class) convenience method - -Bug fixes ---------- -#686 - Reduce the internal API leak by preventing access to - TableFieldImpl, UDTFieldImpl, ParameterImpl -#903 - lag(Field, int, T) erroneously delegates to lead() -#906 - Add more NullPointerException safety to API -#913 - NoClassDefFoundError in JooqUtil.isJPAAvailable() -#920 - Generic type is lost in Cursor.fetchInto(RecordHandler) -#925 - SelectConditionStep should extend SelectConnectByStep, not - SelectGroupByStep -#926 - AbstractRecord.into() fails to convert java.sql.Date into - java.util.Date -#934 - Don't consider static members in reflection utilities when - used with Record.into(Class) and similar methods -#935 - Don't consider final member fields in reflection utilities - when used with Record.into(Class) and similar methods -#937 - In the event of name clash (same name for table and field) - generated code has errors -#945 - Calling UpdatableRecord.setValue() twice with the same - argument causes the changed flag to be reset to false -#948 - Always set the changed flag to true in Record.setValue() -#959 - Compilation errors in generated source code if MySQL enum - values match Java reserved words, such as 'true', 'false', - 'new', etc... -#962 - Postgres ordering of generated enum literals is unstable -#967 - Better document type conversion - -Version 1.7.0 - November 25, 2011 -================================================================= -This is a maintenance release for the 1.x branch. Some important -bug fixes are merged from version 2.0. These include: - -Bug fixes ---------- -#925 - SelectConditionStep should extend SelectConnectByStep, not - SelectGroupByStep -#926 - AbstractRecord.into() fails to convert java.sql.Date into - java.util.Date -#937 - In the event of name clash (same name for table and field) - generated code has errors -#945 - Calling UpdatableRecord.setValue() twice with the same - argument causes the changed flag to be reset to false -#948 - Always set the changed flag to true in Record.setValue() -#951 - Empty Password for jooq-codegen-maven causes NPE - -Version 1.6.9 - November 7, 2011 -================================================================= -This is a maintenance release for the 1.x branch. Developments -on this branch will stop after version 1.6.9. Only important bug -fixes are merged to this branch. Developments for release 2.0 -have started. - -The most important functionality in release 1.6.9 is the newly -added support for JDBC batch operations. You can now batch -execute several queries. - -See the official blog for more information: -http://blog.jooq.org/2011/10/25/jdbc-batch-operations-with-jooq/ - -Features and improvements -------------------------- -#621 - Add support for JDBC batch operations -#794 - Add support for ORDER BY [int value] in order to reference - a column index for sorting -#882 - Optimise Field.isTrue() and isFalse(). Take Field's data - type into consideration. -#885 - Add support for INSERT INTO .. VALUES (..) syntax, - omitting explicit field declarations -#887 - Add List Cursor.fetchInto(Class) - -Bug fixes ---------- -#748 - H2 regression in 1.3.158 regarding stored functions, which - return a ResultSet (this was fixed in H2) -#859 - Derby casting of numeric types to BOOLEAN doesn't work -#886 - Regression in date extract function when used in a - subselect -#888 - Derby casting of VARCHAR to FLOAT (and similar) doesn't - work - -Version 1.6.8 - October 22, 2011 -================================================================= -The main improvement of this release is the re-design of the -stored procedure / function API. With 12 supported RDBMS, which -all have their own idea about what is a stored procedure and what -is a stored function, it has proven to be a better design, to -unite them in one single type: org.jooq.Routine. A routine can -have a return value as well as OUT parameters. It can be embedded -in SQL and used as a field or a table. - -This means, you will need to re-generate your database schema, -when upgrading to jOOQ 1.6.8. After re-generation, you'll need to -fix your client code. These are the package changes: - -- [generated.package].procedures > [generated.package].routines -- [generated.package].functions > [generated.package].routines -- [generated.package].Procedures > [generated.package].Routines -- [generated.package].Functions > [generated.package].Routines - -Oracle generated packages are not re-located. With these -improvements, using stored procedures and functions becomes even -more reliable, especially when cursor types are involved. Read -more about the rationale behind this change: - -http://blog.jooq.org/2011/10/17/what-are-procedures-and-functions-after-all/ - -Apart from that, important improvements have been made in the -area of plain SQL tables. Also, consider a demo integration of -jOOQ with Google Cloud SQL: - -http://blog.jooq.org/2011/10/22/jooq-and-google-cloud-sql-example/ - -Features and improvements -------------------------- -#271 - Don't pre-fetch table meta data when selecting from plain - SQL tables -#489 - Add support for SELECT * (i.e. render SELECT * where - applicable) -#596 - Add support for VARIANCE() and STDDEV() OVER() window - functions -#608 - Add jOOQ version number in generated source code -#670 - Add more Javadoc to Field.xxx() functions -#692 - Add support for ResultSet type returned from HSQLDB - stored functions -#850 - Use http://www.jooq.org as URL for the @Generated - annotation -#854 - Add convenience methods Fields.isTrue(), isFalse() for - conversion of "Y", "YES", "1", "true", "on", etc into a - boolean condition -#870 - Add support for MEDIAN aggregate function -#872 - Add support for STDDEV_POP(), STDDEV_SAMP(), VAR_POP(), - VAR_SAMP() aggregate functions -#874 - Reduce the number of internal classes for dialect-specific - function aliases -#878 - Implement DataType.equals() and hashCode() - -API changes (backwards-compatible) ----------------------------------- -#851 - Change Field.{sortAsc|sortDesc}(List sortList) into - Field.{sortAsc|sortDesc}(Collection sortList) - -API changes (backwards-incompatible) ------------------------------------- -#848 - Purge deprecated API - Prior to 1.6.1 -#849 - Replace Cursor.fetchResult() by Cursor.fetch() -#852 - Review stored procedures / functions concept. Merge them - all into a single "Routine" type - -Bug fixes ---------- -#756 - Error when aliasing HSQLDB and Postgres unnested tables -#761 - Exception when TRACE logging execution with plain SQL - tables involved -#773 - Execute standalone stored functions as CallableStatement - to prevent issues with transactions -#847 - Query.getSQL() doesn't render dialect-specific SQL when - Query is constructed using the fluent API -#853 - DB2 generated convenience methods for stored functions - have unstable ordering -#857 - Derby casting of numeric types to String / VARCHAR does - not work -#858 - SQLDataType.getSQLDataType() should return itself, instead - of null -#860 - SQLite CEIL function is incorrectly simulated. CEIL(2.0) - returns 3.0 instead of 2.0 -#861 - Field.replace(String) generates bad SQL for various RDBMS. - Field.replace(String, String) works, though -#863 - Ingres integration generates illegal SQL when selecting - things like SELECT 1 WHERE 1 = 1 -#866 - Sybase ASE Field.replace(String) function incorrectly - removes the argument string -#873 - Error when selecting two times the same aggregate field -#877 - Compilation error in generated source code when a table - without a primary key has an identity column -#879 - Add Google Cloud SQL Example -#880 - Query.getSQL() does not consider SchemaMapping - -Test cases ----------- -#811 - Loader integration tests fail for SQLite -#812 - CSV Loader test leaves Postgres JDBC connection in an - inconsistent transactional state on error -#856 - Add integration tests for Field.abs() -#865 - Add integration tests for Field.ascii() -#867 - Add integration tests for Field.sum(), avg(), max(), min() -#881 - Re-design H2 stored functions to be pre-compiled, in order - to speed up integration tests - -Version 1.6.7 - September 25, 2011 -================================================================= - -This release coincides with the launch of the new website at -http://www.jooq.org. Hence, it ships with little additions to the -deliverable itself. - -Apart from new convenience methods, the main addition is a Maven -plugin for jooq-codegen contributed by Sander Plas. - -Features and improvements -------------------------- -#797 - Create Maven plugin for source code generation -#825 - Add List> Factory.fetchMany(String) to - allow for fetching several result sets from stored - procedures, such as Sybase ASE's "sp_help" -#838 - Implement MetaDataFieldProvider.toString() -#841 - Add List Result.getValues(Field, Class) -#842 - Add Query.getBindValues() method to allow for extracting - bind values in the correct order -#843 - Add Factory.fetch(ResultSet) to transform a JDBC ResultSet - into a jOOQ Result - -API changes (backwards-compatible) ----------------------------------- -#837 - Avoid final keyword on Object methods, such as .equals(), - .hashCode(), etc - -Bug fixes ---------- -#836 - Bad syntax when selecting from aliased plain SQL tables -#839 - Boolean conversion in getValueAsBoolean() should trim - String values first -#840 - Numeric conversions in getValueAsXXX() should trim String - values first -#844 - NullPointerException when selecting a column from a Result, - that does not exist - -Version 1.6.6 - September 11, 2011 -================================================================= - -Finally, support for another RDBMS has been added. Sybase's other -important product Sybase Adaptive Server Enterprise (or simply -Sybase ASE) is now officially supported by jOOQ - -Apart from this, there had been important improvements with the -recently added INSERT .. RETURNING clause, as well as some fixes -related to DECIMAL / NUMERIC data types - -Features and improvements -------------------------- -#796 - Complete missing public org.jooq.impl Javadoc -#800 - Add support for Sybase Adaptive Server Enterprise -#808 - Add support for INSERT .. RETURNING for Ingres -#809 - Add support for INSERT .. RETURNING for Sybase SQL - Anywhere using SELECT @@identity -#810 - Add support for INSERT .. RETURNING for SQLite using - last_inserted_rowid() -#813 - Add DSL support for INSERT .. RETURNING -#814 - Change TableRecord to reload its trigger-initialised main - key in Oracle and other RDBMS that don't support IDENTITY - columns -#818 - Add SQLiteFactory.rowid() -#819 - Support SQLite AUTOINCREMENT columns as IDENTITY -#820 - Add Factory.fetchOne(String) for executing plain SQL - queries that return single records -#826 - Allow for returning several records in the INSERT .. - RETURNING clause. This now works for DB2, HSQLDB, MySQL, - and Postgres -#827 - Support Sybase SQL Anywhere's TOP n START AT m clause - instead of simulating it with nested SELECT's - -API changes (previous API now deprecated) ------------------------------------------ -#817 - Deprecate Factory.lastID(Identity) - -Bug fixes ---------- -#815 - SQL Server fetching of IDENTITY value is broken -#821 - Optimise ResultQuery.fetchAny() executing fetchLazy() - internally, and only fetching one record from the cursor -#822 - Let Constant cast to more precise NUMERIC/DECIMAL types - in those RDBMS where casting is necessary -#823 - Cannot bind SQLite BigDecimal, BigInteger types - bind - them as String instead -#824 - BigInteger values cannot be bound in DB2, Derby -#828 - Document inefficient implementation for GREATEST and LEAST - in some RDBMS - -Version 1.6.5 - August 28, 2011 -================================================================= - -This release finally adds a loader for CSV data to jOOQ. You can -now load CSV data using a simple fluent API, configuring error -handling, duplicate behaviour and transaction handling, as well -as various CSV parameters. - -This release also changes the way generated keys are retrieved -after INSERT's. Instead of (potentially inconsistently) running -SELECT MAX(pk) immediately after the INSERT, Postgres' INSERT.. -RETURNING clause is used (or simulated), in a single statement. - -Features and improvements -------------------------- -#784 - Add Result.exportXML() to retrieve a DOM document similar - to that of .formatXML() -#792 - Add support for loading of CSV data into tables -#795 - Add List fetch(int, Class) and - fetch(String, Class) convenience methods -#803 - Add support for INSERT .. RETURNING or simulate it where - not available -#805 - Add T[] fetchArray(int, Class) and - fetchArray(String, Class) convenience methods -#806 - Add T fetchOne(int, Class) and - fetchOne(String, Class) convenience methods - -Bug fixes ---------- -#798 - Oracle IN (...) clause with more than 1000 arguments does - not work -#802 - Use "INSERT .. RETURNING" instead of "SELECT MAX(pk)" - to retrieve the primary key of a new record - -Version 1.6.4 - August 07, 2011 -================================================================= - -This release ships with a couple of useful concepts inspired by -other frameworks. These are: - -- selecting into custom POJO's. Results can be mapped to POJO's - by convention or using JPA @Column annotations -- selecting into custom callbacks. This is already a wide-spread - practice in Spring JdbcTemplates. -- selecting long-running queries asynchronously. This idea has - been inspired by the Avaje Ebean framework - -Apart from these changes and some bugfixes, the internal API has -been completely re-designed. The idea here is that query -rendering and variable binding are even faster (less String -objects), more extensible and more accurate. This is a pre- -requisite for many future developments with even more complex SQL -statements, such as for instance CTE's (Common Table Expressions) - -Features and improvements -------------------------- -#137 - Add support for asynchronous query execution using - FutureResult ResultQuery.fetchLater() similar to - Avaje Ebean -#198 - Add SELECT INTO functionality into POJO's using - T ResultQuery.fetchInto(Class) similar to JPA - CriteriaQuery -#728 - Add .fetchInto(RecordHandler) to ResultQuery, Result, - and Cursor to allow for callbacks similar to Spring's - JdbcTemplate/Ollin Framework -#774 - Add more TRACE logging to .fetchLazy() -#777 - CURSOR: Add function alias: UNNEST for TABLE -#781 - Add E function (Euler number) -#782 - Add T Record.getValue(..., Class) methods - for convenient type conversion -#785 - Allow for storing TableRecord with a provided Field[] - indicating the primary key -#786 - Document thread-safety facts in Factory Javadoc -#788 - Add Key.getFieldsArray() convenience method -#793 - Add support for Oracle's SYS_CONNECT_BY_PATH function - -API changes (backwards-incompatible) ------------------------------------- -#758 - Change internal QueryPart rendering and binding API to use - Configuration and Context as callback parameters. If you - use CustomField or CustomCondition, please correct your - implementations accordingly. Other parts of the API should - not be affected -#778 - Purge deprecated API, deprecation prior to jOOQ 1.5.7 -#790 - Purge deprecated generated code, deprecation prior to - jOOQ 1.5.7 - -API changes (previous API now deprecated) ------------------------------------------ -#776 - Deprecate QueryPart.getSQL(), add Query.getSQL() -#789 - Deprecate Record constructors with Configuration - parameter - -Test cases ----------- -#636 - Add integration tests for more advanced CONNECT BY - example -#772 - Add integration tests for selecting cartesian products - (several tables in FROM clause) - -Bug fixes ---------- -#730 - Sybase cannot bind null values in plain SQL -#759 - Omit the TOP 100 PERCENT clause in SQL Server ordered - top-level queries -#767 - An empty Java package is generated for PL/SQL packages - containing underscores -#771 - Some exotic literals are not properly escaped with quotes - yet, e.g. UDT identifiers, VARRAY types, etc. -#775 - Automatic re-attaching after deserialisation does not work - when used with .fetchLazy() -#787 - The UpdatableRecord's internal changed flags are not - updated after INSERTs / UPDATEs - -Version 1.6.3 - July 31, 2011 -================================================================= - -This is mainly a maintenance release with lots of bugfixes, -mostly around code generation, plain SQL tables, and data types. -Please note that generated source code may contain incompatible -changes due to #639 (see below for details)! - -Apart from that, project CURSOR is advancing and it is now -possible to unnest arrays into tables. See this article for -details about where jOOQ is heading with project CURSOR: - -http://blog.jooq.org/2011/07/24/the-power-of-ref-cursor-types/ - -Features and improvements -------------------------- -#679 - Improve H2 NVL2 support as of H2 1.3.156 -#680 - Improve H2 ROUND support as of H2 1.3.156 -#735 - Add README documentation to GitHub -#736 - Add more info regarding number of generated artefacts in - jooq-codegen logging -#750 - Add DataType.isNumeric(), .isString(), .isTemporal(), - .isBinary() -#754 - Log query as executed by JDBC PreparedStatement when - TRACE logging (without inlining variables) -#752 - CURSOR: Add support for selecting from ARRAY types -#762 - Use H2's native support of NVL, instead of COALESCE -#764 - CURSOR: Add support for selecting from ARRAY types - returned from stored functions - -API changes (backwards-incompatible) ------------------------------------- -#639 - Map DECIMAL(n, 0) and NUMBER/NUMERIC(n, 0) data types - to Byte/Short/Integer/Long/BigInteger instead of - BigDecimal in generated source code. Re-generated code - will not be compatible! - -API changes (previous API now deprecated) ------------------------------------------ -#731 - Inconsistent API with Field.lessOrEqualToXXX(). Removed - "To" from method name -#757 - Deprecate Factory.constant() methods - -Test cases ----------- -#731 - Add missing integration tests for equalAll(), equalSome() - and similar methods -#747 - Upgrade H2 to 1.3.158 - -Bug fixes ---------- -#632 - Sybase error : column @p0 not found in nested SELECT -#700 - Restore HSQLDB ARRAY support with INFORMATION_SCHEMA - change in HSQLDB 2.2.3, and some fixes in 2.2.5 -#725 - Cannot insert byte[] data with plain SQL -#733 - H2 changed JDBC type for ResultSet/CURSOR from 0 to -10, - like Oracle -#737 - Compilation errors in generated source code if table - fields contain spaces -#738 - Compilation errors in generated source code if MySQL - procedure parameter type contains two comma-separated - arguments (like DECIMAL(10,2)) -#739 - Postgres navigator methods and keys are not re-generated - in the same order -#740 - Formatting is broken on Result.format() with some special - newline characters -#743 - Make SQL Server INFORMATION_SCHEMA independent from - HSQLDB again, to prevent incompatibility issues -#744 - Ingres REAL and FLOAT4 types are generated as FLOAT/FLOAT8 - which maps to java.lang.Double, instead of java.lang.Float -#753 - Postgres error when binding array that contains null - values -#755 - NullPointerException when converting an array containing - a null value -#766 - Bad decoding of JDBC Types BIGINT (to BigInteger instead - of Long) and REAL (to BigDecimal instead of Float) when - plain SQL tables are involved - -Version 1.6.2 - July 10, 2011 -================================================================= - -This release mainly introduces three new projects. - -Project CURSOR where jOOQ finally supports various RDBMS's TABLE, -CURSOR, and REF CURSOR data types. This is especially useful when -those types are returned from stored procedures and functions. -Cursors are simply mapped to jOOQ Result types and can -thus be used like regular table results - -Project EXPORT aims at exporting data from the database in -various serialisable formats, such as XML, CSV, HTML, Text, JSON. -This project will be continued in the future, to also -deserialise from (some of) these data streams. This will allow -for easy transport of jOOQ Result types over the net. - -Project CODEGEN has finally been started. Many improvements -suggested by jOOQ users will be implemented in the next releases. -In this release, important fixes have been made to prevent -compilation errors in generated artefacts. - -Features and improvements -------------------------- -#61 - EXPORT: Add Result.formatXML() -#166 - CURSOR: Add support for ResultSet type returned from - Oracle stored procedures / functions -#411 - Allow for fetching Map (instead of Record) - and List> (instead of Result) -#549 - Add Factory.function() for plain SQL functions -#611 - Simulate RPAD and LPAD in SQL Server, Sybase -#627 - Add support for Postgres FOR UPDATE OF [table-name] clause -#628 - Add support for REPEAT (SQL Server: REPLICATE) function -#637 - Nicely format time in StopWatch logging output -#640 - Simulate Postgres FOR UPDATE OF [table-name] clause in - other dialects -#649 - CURSOR: Add Cursor.fetch(int) .fetchOne() - .fetchResult(int) .fetchResult() -#653 - Add support for MySQL encryption and compression functions -#660 - Clarify Javadoc of UpdatableRecord to explain its - behaviour when changing the main unique key -#669 - EXPORT: Add Result.formatHTML() -#672 - Add convenience method UpdatableRecord.copy() in order to - reset primary key values for a subsequent INSERT -#675 - EXPORT: Add Result.formatCSV() -#683 - Implement ResultImpl.equals() and .hashCode() -#684 - Implement AbstractStore.equals() and .hashCode() -#685 - Add Store.size() to indicate the maximum index of the - Store -#687 - EXPORT: Add result.formatJSON() -#689 - Create separate builds: jooq-core.zip and - jooq-with-dependencies.zip -#690 - CURSOR: Add support for ResultSet type returned from H2 - stored functions -#695 - CURSOR: Add support for ResultSet type returned from - Postgres stored functions -#697 - Add Factory.fetch(String) for executing plain SQL queries - that return results -#701 - Add ResultQuery.fetchArray() and .fetchOneArray to return - Object[][] and Object[] -#704 - Always add top and bottom line in Result.format() -#705 - Right-align numeric values in Result.format() -#716 - Add SUBSTRING function Field.substring(Field, Field) - taking fields as arguments -#719 - Document risk of SQL injection in plain SQL and literal - factory methods -#726 - Add LENGTH function as a synonym for CHAR_LENGTH - -API changes (backwards-compatible) ----------------------------------- -#698 - Inconsistent API with Factory.fetch(Table [,Condition]) - Let method return Result instead of List -#699 - Let Result extend List - -API changes (previous API now deprecated) ------------------------------------------ -#656 - Decrease verbosity of plain SQL methods. They will just be - called Factory.field() .condition() .table() .query() - -Test cases ----------- -#643 - Add integration test for code generation of invalid and - incomplete types in Oracle -#654 - Add integration tests for master data tables with PK types - other than NUMBER/INT -#655 - Add missing integration tests for TRIM function - -Bug fixes ---------- -#450 - Improve plain SQL integrity checks for bind variables -#610 - CODEGEN: Compilation error in generated source code for - databases with table named 'system' -#646 - An empty Java package is generated for an empty PL/SQL - package. This is unnecessary -#651 - CODEGEN: Avoid importing datatypes in generated source - code to prevent collisions -#657 - NullPointerException when creating a Factory with a null - SchemaMapping -#658 - Master data table code generation is broken for tables - with more or less than 3 columns -#662 - Add support for the missing Postgres data type "bpchar" -#663 - Add support for the missing Sybase data type "int" -#664 - Ingres INTEGER data types are not correctly generated -#665 - HSQLDB Datatype CLOB and BLOB are not supported, when - selecting from plain SQL tables -#666 - The evil bug: Ingres TRIM function only executes RTRIM -#673 - UpdatableRecord.store() doesn't work if called after - .delete() -#702 - Add support for the missing SQLite data type "NULL" -#706 - CURSOR: Ensure that Query.execute() runs in a single - transaction when Postgres refcursor is involved in the - query (this fixes a Postgres JDBC driver flaw) -#724 - NullPointerException when passing a single literal null - bind value to plain SQL methods without casting to Object -#729 - DB2, Derby, Ingres, Oracle cannot bind null values in - plain SQL - -Version 1.6.1 - June 19, 2011 -================================================================= - -In this release, the PORTABILITY project has been implemented. -Finally, the SQLDialect has been removed from most generated -artefacts (Schema, Table, Field, Sequence, etc). Also, the -constructing Factory is not referenced by its created QueryParts -anymore, unless this is really necessary (Query objects, UDT's, -ARRAY types). This leads to higher compatibility between schemata -of different databases, e.g. if users want to use an HSQLDB -development and Oracle productive database. - -Unfortunately, this means that the way stored procedures are -called had to be changed. This is an API break that could not be -avoided. The pre-1.6.1 StoredObject.execute(Connection) method -is deprecated and will be removed in the future. It has been -replaced by StoredObject.execute(Configuration) - -In addition to this project, many more window functions are now -supported, as well as the Oracle-specific CONNECT BY clause for -recursive queries. - -Features --------- -#351 - Add support for Oracle ROWID data type -#452 - PORTABILITY: Create a super-set of RDBMS data types -#453 - PORTABILITY: Don't create dialect-specific QueryParts -#455 - Add support for the Oracle CONNECT BY clause -#587 - Add optional OFFSET clause to form LIMIT .. OFFSET - constructs -#589 - Add extended FOR UDPATE [OF ...] [{WAIT n | NOWAIT | SKIP - LOCKED }] support -#591 - Add support for LEAD() OVER() and LAG() OVER() window - functions -#592 - Add support for the CUME_DIST() OVER() window function -#601 - Add Factory.literal() convenience methods -#602 - Add Factory.val() methods to decrease .constant() - verbosity -#604 - Add support for RESPECT NULLS clause in some window - functions -#605 - Add Factory.use(String) for non-generated schemata -#613 - Add PI function -#616 - Add Factory.two() literal convenience method -#630 - Add support for Oracle CONNECT BY pseudo-columns LEVEL, - CONNECT_BY_ISCYCLE, CONNECT_BY_ISLEAF - -API changes ------------ -#299 - PORTABILITY: Create a dialect-independent meta-model -#588 - Add OVER() keyword to FIRST_VALUE() and LAST_VALUE() API - -Test cases ----------- -#368 - Add integration test for use with schema mapping -#586 - Upgrade H2 to 1.3.155 -#607 - Add integration tests for CRUD / SP's / UDT's / ARRAY's - with SchemaMapping -#612 - Add integration tests for LPAD and RPAD functions -#624 - Add integration test for code generation of invalid/ - incomplete views in Oracle -#631 - PORTABILITY: Add integration tests for using Oracle- - generated schema against an HSQLDB database -#638 - Add missing integration test for DECIMAL data type - -Bugfixes --------- -#176 - Stored procedures / functions in EQUIVALENT schemata - cannot be called -#493 - Bind variable mismatch when constructing bad SQL -#594 - Confusing Javadoc in SELECT DSL API -#603 - Fix DB2 'IGNORE NULLS' clause -#619 - SUBSTRING() function is broken in DB2, Ingres, SQL Server -#623 - SQL syntax error for some MERGE queries in SQL Server and - Sybase -#633 - SchemaMapping is not applied to sequences -#634 - Sequences are not escaped in generated SQL - -Version 1.6.0 - June 05, 2011 -================================================================= - -Apart from supporting various additional standard and non- -standard JOIN constructs, there is now also full support for the -SQL standard MERGE statement and MySQL's ON DUPLICATE KEY variant -thereof. A great number of API enhancements have been added, -which improve the usability of jOOQ. The Ingres database is now -also supported. - -Features --------- -#301 - Add support for Oracle execution hints -#409 - Add support for NATURAL JOIN syntax, where RDBMS allows it -#415 - Make fluent API's underlying SelectQuery objects publicly - available -#429 - Add Ingres support -#475 - Document class-level generic types and in Javadoc -#486 - Add support for SQL MERGE clause -#494 - Allow for omitting schema name in generated SQL -#496 - Automatically update IDENTITY values in UpdatableRecord, - after storing them -#520 - Add support for JOIN ... USING syntax -#524 - Upgrade HSQLDB to 2.2 -#533 - Add ORDER BY [Map] or BY [List] functionality -#534 - Add Result.isEmpty() -#535 - Call upon ConfigurationRegistry.provideFor() before - throwing a DetachedException -#536 - Simulate CASE [value] WHEN [value] THEN [result] END - syntax in Derby -#538 - Add some logging to ConfigurationProvider -#539 - Add possibility to negate numeric values with Field.neg() -#541 - Add support for MySQL ON DUPLICATE KEY clause -#542 - Allow for Collection arguments in INSERT's DSL API -#543 - Allow for creating FUNCTION() OVER() without PARTITION BY - or ORDER BY clause -#546 - Add Factory.use(Schema) -#548 - Add new internal type FieldMap -#550 - Simulate ON DUPLICATE KEY INSERT clause in dialects other - than MySQL -#551 - Add TableMapping, similar to SchemaMapping for mapping - tables -#553 - Add Factory.plainSQLQuery -#554 - Add Factory.plainSQLField with a DataType parameter -#555 - Add UpdateXXX.set(Map) convenience methods to DSL API -#557 - Enhance INSERT DSL API to allow for adding VALUES clause - with InsertXXX.set() syntax -#570 - Add support for the RAND() function -#567 - Add support for Ingres Sequences -#572 - Add support for the ATAN2() function -#573 - Add possibility for additional select() clauses for - convenience -#575 - Add support for the FULL OUTER JOIN syntax, where RDBMS - supports it -#576 - Add support for the CROSS JOIN syntax, where RDBMS - supports it -#581 - Enhance API and allow Collection> - instead of Collection> - -API changes ------------ -#397 - Purge deprecated API - -Bugfixes --------- -#481 - Handle case where an empty record is stored -#522 - Misleading Javadoc in generated stored procedures and - function constructors -#532 - Restore Postgres INFORMATION_SCHEMA -#537 - Prevent null from being added to QueryPartList -#540 - Error when TRACE logging Limit -#544 - Aliased elements are not bound correctly when rendered - with toSQLReference() -#559 - Loosen type safety on overloaded methods to prevent - compilation errors with javac/Netbeans -#560 - HSQLDB DataType REAL is configured incorrectly -#565 - Add integration tests for current_user() function -#569 - ORA-01427 when generating foreign key relations -#571 - Field.trim() not correctly implemented for SQL Server -#583 - Accelerate integration tests: Reset schema only if - necessary - -Version 1.5.9 - May 15, 2011 -================================================================= - -This version ships with lots of new functionality. Finally, the -DSL-style API has been extended to CRUD operations (INSERT, -UPDATE, DELETE)! Also, support for the TRUNCATE TABLE statement -has been added. - -The most important new features include the support for SQL:2003 -standard window functions, which are available in most major -RDBMS. Additionally, basic function support has been widely -extended. - -Features --------- -#148 - Added support for window functions -#204 - Add support for multi-record INSERT's -#416 - Added support for retrieval of IDENTITY values -#433 - Use bind variables for LIMIT and OFFSET -#441 - Added foreign key relationship meta information to the - generated source code -#446 - Beautify ResultImpl.toString() method -#461 - Automatically cast CONCAT parameters to Field if - necessary -#463 - Added support for trigonometric functions -#471 - Added support for the sign function -#472 - Added support for GREATEST/LEAST functions -#474 - Added support for "hyperbolic" functions SINH, COSH, TANH, - and COTH -#482 - Added DSL API for INSERT statements -#483 - Added DSL API for UPDATE statements -#484 - Added DSL API for DELETE statements -#485 - Added "Registry" for client code to provide Configurations - to jOOQ Attachables -#490 - Added support for the TRUNCATE TABLE statement -#495 - Generate source code for IDENTITY columns -#501 - Added support for boolean conversion to Result, Record, - and Store -#503 - Allow for schema navigation via generated artefacts -#518 - Let stored procedures reference owner package - if applicable -#525 - Added NULLS {FIRST | LAST} clause to ORDER BY constructs -#528 - Added Factory.getDataType() convenience method -#530 - Added Factory.zero() and Factory.one() convenience methods - -API changes (jooq) ------------------- -#527 - Weakened type-safety on Field.nvl2() -#529 - Deprecated Factory.select(Object...), added .selectOne() - and .selectZero() instead - -API changes (jooq-meta) ------------------------ -#30 - Add ParameterDefinition for stored procedures, instead of - reusing ColumnDefinition -#499 - Add reference to TableDefinition in ColumnDefinition -#500 - Add AttributeDefinition for UDTDefinition, instead of - reusing ColumnDefinition - -Bug fixes ---------- -#369 - Adapt H2 relations generation to H2's correction of - information_schema.cross_references -#435 - Added integration tests for NESTED SELECTs holding LIMIT - clauses -#460 - Syntax error when using a field with a reserved name -#462 - Fixed Javadoc broken links -#473 - Don't cast when cast is unnecessary -#479 - INSERT statement should not set all fields for a table -#497 - Derby referential code generation is broken, for named - foreign keys -#498 - Oracle package content is generated in arbitrary order -#502 - Syntax error when creating an empty IN condition -#526 - Corrected Javadoc in Field.coalesce() - -Version 1.5.8 - April 29, 2011 -================================================================= - -Finally, jOOQ now supports two important new RDBMS: -SQL Server and Sybase! - -Apart from this great enhancement, there is now also full support -for the non-SQL standard LIMIT clause, even in dialects where the -LIMIT clause is not supported natively (especially Oracle, but -also DB2, SQL Server and Sybase, which have limitations). jOOQ -simulates LIMITs by rendering nested selects filtering on ROWNUM -(Oracle) or on ROW_NUMBER() (DB2, SQL Server and Sybase). - -Other interesting additions are an increasing support for native -mathematical functions. More function support will be added in -future versions. - -Features --------- -#16 - Added support for SQL Server -#21 - Uniform implementation of the LIMIT clause. Implemented - LIMIT clause simulation through analytic functions, where - LIMIT is not supported natively -#97 - Added support for Sybase -#418 - Measure time of various steps in source code generation -#420 - Added support for proprietary SQL extensions "FOR UPDATE" - and "FOR SHARE" -#431 - Added additional statistics to generation log files -#432 - Unified the various "standard" ANSI INFORMATION_SCHEMA - implementations in the jooq-meta artefact -#436 - Added support for the modulo function -#438 - Added floor and ceil functions -#439 - Added support for mathematical functions (logarithms, - exponentials, sqrt) -#447 - Enhanced Field.add() and Field.subtract() to work for date - time fields, also - - -API changes ------------ -#428 - Created new Maven artefact jooq-meta to cleanly separate - database meta-data navigation from code generation -#458 - Decreased DSL verbosity for arithmetic operations and for - ordering - -Bug fixes ---------- -#417 - Restored warning when unknown column type is encountered - in source code generation -#419 - Corrected misleading Select.fetchOne(...) Javadoc -#421 - Optimised AbstractRecord's memory consumption -#448 - Corrected some Javadoc @see links -#449 - Changed Field.concatenate() to accept Field parameters - to avoid generic varargs warnings - -Version 1.5.7 - April 17, 2011 -================================================================= - -This is the first release built with support of Maven thanks to -the help of some jOOQ users! - -The main new features in this release are the improved support -for serialisation/deserialisation of jOOQ objects through use of -the newly introduced "Attachable" interface. - -If using log4j or the newly supported slf4j logging framework -in debug/trace mode, there is the possibility to log query -building/execution time statistics. - -Apart from these new features, fixes were mainly done in the -fields of type casting, HSQLDB 2.1 upgrade support, stored -procedures with OUT, IN/OUT parameters. Please upgrade, if you -are using any of those features. - -If you extend jOOQ as a base implementation for source code -generation, be aware of the fact, that the jOOQ-codegen is -currently undergoing major changes. Expect the code generation -API to stabilise again in one of the next releases. - -Features --------- -#104 - Added maven dependency -#248 - Integrate UDT types with ARRAYs -#295 - Allow for attaching/detaching UpdatableRecords to/from - Configurations -#359 - Added statistics measurement to Query execution for debug - log level -#362 - Added deprecation configuration flag -#364 - Document unknown type in generated source code -#373 - Improve exception handling in code generation -#378 - Added support for Oracle stored functions with OUT - parameters -#382 - Added Factory.attach() methods to re-attach deserialised - Attachables -#394 - Add logging support for SLF4J -#398 - Allow to provide a DataType in Factory.constant() -#399 - Provide access to TypeUtils.convert() methods via DataType -#404 - Added trace logging for measuring the speed of various - query execution steps - -API changes ------------ -#358 - Enhanced DSL API to allow for HAVING clauses without - GROUP BY clauses -#367 - Make Store, Result, QueryPart "Attachable" -#374 - Introduce strategy pattern to code generation for future - support for advanced naming schemes -#375 - Decouple Database from Generator -#381 - Made DataType Serializable -#384 - Deprecated singleton QueryParts -#388 - Unify "internal" API using an Adapter pattern - -Bug fixes ---------- -#187 - Protect generated Record navigation methods against name - clashes -#266 - Added more thorough integration tests for dialect-specific - casting (including some fixes related to varchar types) -#360 - Added more integration tests for the DISTINCT clause -#361 - Add more checks in testInsertUpdateDelete() -#366 - Warn only once per ColumnDefinition, if a data type is - unknown -#377 - NullPointerException when generating invalid stored - function -#380 - Added integration tests to check for proper - serialisability -#386 - Fixed incompatibilities with HSQLDB 2.1.0 -#387 - Fixed unnecessary imports in some Oracle generated - Records -#389 - Fixed javac compiler warning in AbstractStoredObject -#391 - Cannot properly call stored procedures when IN/OUT - parameter is bound to NULL -#392 - Procedures with several OUT parameters may not register - OUT parameters correctly -#410 - Passing null VARRAY values to Oracle stored procedures - causes issues -#412 - limit(int) sets default offset incorrectly in some - dialects - -Version 1.5.6 - March 31, 2011 -================================================================= - -This release consists mainly of code generation bug fixes and -minor API improvements and enhancements. - -The most important improvement is ticket #90, by which lazy -fetching and iteration over data is now supported. jOOQ lets you -keep a reference to a Cursor that has an open JDBC ResultSet, to -fetch data from on-the-fly. - -A few major code generation bugs were reported where the -generated code may cause ambiguity due to an inconsistent API. -This means that you will have to re-generate your schema after -upgrading to version 1.5.6. Some of your code may not compile -anymore, after this upgrade. - -Features --------- -#90 - Added possibility for lazy fetching of data -#208 - Added convenience methods for direct invocation of - sequences' currval() and nextval() attributes -#212 - Created one factory per dialect for better separation of - dialect-specific support -#213 - Generate a factory for each schema -#251 - Opened up base implementations for Field and Condition - to allow for custom implementations by client code -#274 - Integrate H2 ARRAY types with stored procedures -#292 - Documented usage of log4j and java.util.logging -#306 - Added support for the NULLIF function -#319 - Added Field.between(Field, Field) method -#320 - Added trace logging for variable binding and SQL - generation methods -#323 - Added Field.in(Field...) method -#325 - Include release version number in delivered .jar files -#328 - Improved configuration setup documentation page -#333 - Let Result implement Serializable -#334 - Added fetchMap() convenience methods -#335 - Added more functions and aggregate functions examples to - documentation -#338 - Visually improve code generation logging -#339 - Removed skipping of unreferenced UDT's, ENUM's and ARRAY's -#342 - Improved generated referential code by using fetch() and - fetchOne() API -#356 - Let UpdatableRecord.store() and delete() return an int - to indicate whether the record was actually modified - -API changes ------------ -#233 - Allow for joining TableLike instead of Table -#337 - Added generic type > to - InsertSelectQuery -#341 - Fixed API flaw where SelectOnConditionStep.and() methods - and similar ones returned SelectConditionStep, instead of - SelectOnConditionStep - -Bugfixes --------- -#69 - Corrected referential code generation for foreign keys - that reference non-primary unique keys -#85 - Corrected referential code generation for multi-field - foreign keys -#121 - Covered more Factory.executeXXX() methods with integration - tests -#318 - Fixed NullPointerException when executing SELECT * from - aliased tables -#321 - BetweenCondition does not bind left hand side Field - correctly -#322 - InCondition does not bind left hand side Field correctly -#326 - Avoid method overloading where binding to Object - may lead to compile-time ambiguities (with javac) -#343 - Add more foreign key navigation method integration tests -#347 - Add explicit integration tests for schema artefacts - excluded from code generation -#350 - Disambiguate navigation methods if several foreign keys - reference the same entity -#352 - Disambiguate navigation methods if a table ending on S - references itself -#353 - Added integration test for compilation of generated - artefacts with javac (as opposed to the Eclipse compiler) -#355 - Error when storing an UpdatableRecord that has no changed - values - -Version 1.5.5.2 - March 15, 2011 -================================================================= - -A critical bug was reported from the 1.5 release stream where -stored functions did not render their parameters in correct order - -Features --------- -#302 - Map Oracle's NUMBER data type to java.lang.Number in - stored procedures, stored functions - -Bugfixes --------- -#317 - StoredFunctionImpl.asField() renders parameters in wrong - order - -Version 1.5.5.1 - March 13, 2011 -================================================================= - -In version 1.5.5, there was a fatal bug breaking Derby source -code generation. Only the Derby dialect is affected. Please -update immediately, if you are using jOOQ's Derby integration - -Bugfixes --------- -#315 - Generated master data records are not sorted by PK -#316 - Derby code generation fatally broken - -Version 1.5.5 - March 12, 2011 -================================================================= - -This version is released early as there are some important -bugfixes. Additional improvemetns include: - -- Improved DSL related to conditions in HAVING and JOIN clauses -- Support for Oracle-style functions, such as NVL, NVL2, COALESCE - DECODE, etc - -Features --------- -#304 - Add support for Oracle NVL function -#305 - Add support for COALESCE function -#308 - Add support for Oracle NVL2 function -#311 - Add support for Oracle DECODE function - -API changes ------------ -#223 - Enhance DSL to accept and(), or() and similar methods in - JOIN steps -#224 - Enhance DSL to accept and(), or() and similar methods in - HAVING steps - -Bugfixes --------- -#297 - Fixed Factory.concatenate() function -#298 - Added integration tests for nested selects in HAVING - clause -#300 - Added integration tests for nested selects in JOIN clause -#303 - Javadoc correction -#307 - Accelerated integration tests -#309 - Fixed JDBC variable binding issue related to Conditions - where the lhs is a function (e.g. stored function) and the - rhs is a constant -#310 - Fixed issue where fetchOne() methods throw - NullPointerException if no result record is available -#312 - Fixed issue where Field.equal(...) methods rendered - unexpected SQL when rhs null is cast to a type -#313 - Fixed Derby cast type for VARCHAR -#304 - Let the DerbyDataType default for java.lang.String be - VARCHAR, not LONG VARCHAR - -Version 1.5.4 - March 04, 2011 -================================================================= - -Feature #243 required a minor API change in the base classes of -generated source code. This means you have to re-generate all -your jOOQ artifacts in order to migrate to 1.5.4. The artifacts -themselves should be regenerated in a compatible way, such that -your client code should not be affected. If this is not the case, -please report a ticket here: - - https://github.com/jOOQ/jOOQ/issues - -Apart from the Derby RDMBS and some new data type support, there -have been many new convenience methods added all over the API. -For instance, if type-safety is not really a requirement, there -are lots of possibilities to use plain SQL directly in the DSL. -In that case, data can be accessed from Record, Results, not only -through Field, but also through field names or indexes. - -Check out the updated documentation (soon) here: - - http://www.jooq.org - -- Support for the Derby RDBMS -- Support for casting. This allows for even greater flexibility - in cases where jOOQ cannot 100% ensure type-safety -- Support for ARRAY types. Oracle, Postgres, HSQLDB and H2 ARRAY - types are now supported natively as regular bindings in - jOOQ's Field -- Support for dialect-specific data types. CHAR, VARCHAR, CLOB - are no longer treated equally as java.lang.String. Their - type heritage is also generated -- More sequence support -- Lots and lots of bug fixes - -Features --------- -#95 - Support for the Derby RDMBS -#163 - Add support for JDBC type ARRAY (with Postgres) -#209 - Add support for DB2 sequences -#210 - Add support for H2 sequences -#211 - Add support for HSQLDB sequences -#215 - Support for SQL casting using as cast type -#246 - Support for SQL casting using dialect-specific data types -#254 - Add HSQLDB support for ARRAY types -#256 - Add Oracle support for VARRAY types -#257 - Integrate ARRAY types with stored procedures -#261 - Add a global type mapping to the generated Schema object -#267 - Add DataTypeDefinition for further abstraction of data - types in code generation -#269 - Add H2 support for ARRAY types -#290 - If log4j is not on the classpath, use java.util.logging - instead, as fallback - -API Changes ------------ -#156 - Allow for results to be accessed by index, not by field -#218 - Corrected bad method signature: - Record.getValueAsLong(Field, Integer) -#219 - Extended Result and Select API's to be more similar to - that of Record -#232 - Add more convenience plain SQL support to the API -#235 - Add convenience methods to Record, Result and Select for - access of data via field name -#243 - Refactor DataType implementations in order to allow for - the use of generics -#259 - Add field type to database meta data (ColumnDefinition) -#260 - Add field type to database meta data (Field) -#262 - Add default behaviour for Record.getValue(Field) -#276 - Add Javadoc as a ZIP file to the jOOQ distribution - -Bugfixes --------- -#125 - Add more plain SQL integration tests -#191 - Add more integration tests for nested unions -#205 - Implemented workaround for handling Postgres stored - functions with UDT OUT parameters -#214 - Fixed NPE when generating a stored function with an - unknown parameter type -#216 - Fixed some cases where binding of BigInteger is not done - correctly -#220 - Syntax error when using select statement in a CASE clause -#221 - Corrected integration tests for combined update and - select statements -#222 - Added integration test for INSERT statements having - nested SELECT statements for their fields -#225 - Correctly cast array types in Postgres -#230 - Potential misuse of Blob and Clob in H2's JDBC types -#239 - Factory.fetchAny() is not implemented for SQLite -#244 - Fixed peculiar MySQL casting support where cast types do - not match any data types -#245 - Fixed NPE when reading null dates in SQLite -#249 - Added ARRAY type integration tests -#255 - Stored procedure bind variables get mixed up when any - argument is null -#263 - Correctly handle Postgres function overloading -#264 - Ambiguous funciton calls when calling overloaded functions - with null parameter -#281 - Handle compilation errors when generating stored - procedures with > 254 parameters -#283 - Fixed compilation errors in generated source code for - Oracle's UDT table type -#284 - Fixed compilation errors in generated source code for - Oracle procedures in packages, when they have no - parameters -#285 - Fixed compilation errors in generated source code for - Oracle tables with the same name in different schemata -#286 - Fixed name collisions in generated objects with the - java.lang.* package -#288 - Prevent the creation of UNION queries with bad syntax - in MySQL -#289 - Correctly alias fields within UNION queries for some - dialects, which then only require the "AS" keyword -#291 - Cannot create an aliased field called "year" in Postgres - -Version 1.5.3 - January 13, 2011 -================================================================= - -- Lots of stored procedure support was implemented -- Support for sequences was added -- The final decision to postpone support for DB2 UDT's was made -- Some code generation bugfixes - -Features --------- -#36 - Added stored procedure / stored function support for HSQLDB -#140 - Added support for Oracle sequences -#147 - Added support for H2 stored functions -#162 - Correctly integrate UDTs with stored procedures -#170 - Added support for Postgres stored functions -#186 - Added support for more Oracle PL/SQL simple data types -#193 - Simulate support for H2 "stored procedures" -#195 - Simulate support for Postgres "stored procedures" -#206 - Added support for Postgres sequences - -API changes ------------ -#180 - Improved DSL for constant values -#181 - Allow for referencing Field in function argument list -#189 - Renamed convenience methods in org.jooq.Record -#207 - Add fetchOne(Field) method to org.jooq.Select API - -Bugfixes --------- -#182 - Protected generated Record classes against clashes with inherited methods -#183 - Fixed NullPointerException, when generating master data tables with - NULL fields -#184 - Fixed IllegalArgumentException, when a data type is present in the - schema, but unavailable in code generation logic -#185 - Code generation should not fail when single elements cannot be generated -#188 - Improved integration tests for stored procedures / functions / packages -#196 - Increase RDMBS version compatibility by avoiding "SELECT *" in code - generation logic -#199 - Added integration tests for stored procedures in RDBMS that do not - support OUT parameters -#201 - Fixed issue in DB2 where stored procedures without parameters were not - generated. -#202 - Added integration tests for stored procedures / functions without - parameters - -Version 1.5.2 - December 27, 2010 -================================================================= - -- Improved support for stored procedures, also in packages -- A minor API change was inevitable to implement #173. The API change only - concerns the INTERNAL API. Deprecation marks are added and deprecated items - will be removed in 1.6.0 -- Experimental SQLite database support -- Some important bug fixes - -Features --------- -#25 - Added support for Oracle packages -#114 - Added support for Oracle UDTs -#145 - Added support for the SQLite database -#150 - Generate static convenience methods for stored procedures / functions -#151 - Generate static convenience methods for stored function fields -#152 - Generate meaningful serialVersionUID in generated classes -#173 - Added support for EQUIVALENT schemata - -API changes ------------ -#159 - Added convenience method List getValues(Field) to Result -#165 - Added convenience methods for creating EXISTS clauses -#169 - Improved DSL for WHERE clauses - -Bugfixes --------- -#68 - Prevent issues originating from overloaded stored procedure names, - generating identical Java class names -#153 - Fixed issue with generated code for DB2 stored functions -#154 - Fixed issue with generated code for DB2 stored functions -#155 - Fixed issues with database NULL not being mapped correctly to Java NULL - when selecting values that have a primitive type (int, long, etc) -#158 - Potential ClassCastException when using Field -#171 - Corrected issue related to selection of default schema in DB2 -#177 - Fixed issue related to generated code for tables or UDTs without columns - - -Version 1.5.1 - December 13, 2010 -================================================================= - -- H2 database support thanks to Espen Stromsnes -- Improved stored procedure support - -Features --------- -#96 - Added H2 database support -#101 - Added stored procedure / stored function support for Oracle -#138 - Added stored procedure support for DB2 -#146 - Added support for DB2 functions - -API changes ------------ -#143 - Added convenience methods to Record - -Bugfixes --------- -#84 - Implemented referential code generation for foreign keys that do not - match their primary keys' types -#141 - Encoding problem in generated master data classes - -Version 1.5.0 - November 22, 2010 -================================================================= - -- A big one. Major API changes / improvements -- Added lots of convenience methods -- UDT support -- Enum support -- DB2 support thanks to Espen Stromsnes -- "Light" dependency to log4j added. jOOQ will still run without it - -Features --------- -#1 - Create support for UDTs (so far only for PostgreSQL) -#15 - Added DB2 support -#60 - Added support for nested selects in INSERT and UPDATE - statements -#83 - Added log4j logging to code generation and runtime -#87 - Add support for arithmetic expressions -#105 - Added support for ENUM data types, where applicable - (MySQL and PostgreSQL so far) -#110 - Added execute and fetch convenience methods -#111 - Added missing "select distinct" support -#122 - Annotate generated classes with javax.annotation.Generated -#123 - Generate user enum fields from data values (master data) -#124 - Added PlainSQLTable -#127 - Added not() operator to Condition -#135 - Added convenience methods andNot() and orNot() in - Condition - -API changes ------------ -#89 - Removed support for DataSource. jOOQ is not a transaction - manager -#92 - Added SortField type to be used for sorting -#99 - Provide better access to functions (No more FunctionFactory) -#116 - Merge Manager functionality into Factory -#118 - Improve API of org.jooq.Field -#119 - Improve subquery condition API -#132 - Reduced much of the select query API -#134 - Better separation of SelectQuery and SimpleSelectQuery - -Bugfixes --------- -#109 - Error when executing select * if generated schema does not - match actual schema -#115 - Fix various "null" pseudo field issues -#126 - Error when selecting a single field from a union nested - select -#129 - Fixed performance issue in Oracle code generation for - very large databases - - -Version 1.4.4 - November 22, 2010 -================================================================= - -Unreleased version, fixes included in 1.5.0 - -Bugfixes --------- - -#133 - JoinCondition does not take comparison operator - -Version 1.4.3 - October 25, 2010 -================================================================= - -Some more bugfixes - -Bugfixes --------- - -#71 - Generated code does not compile, when foreign key and - primary key have a data type mismatch -#73 - In Oracle generated code, multi-field foreign keys may - generated bad relations code -#82 - Conversion of literals to camelcase fails if numbers are - involved - -Version 1.4.2 - October 22, 2010 -================================================================= - -Various bugfixes and minor improvements - -Features --------- -#66 - Add support for CASE or DECODE expression - -API changes ------------ -#77 - Functions should not extend FieldImpl, but a new - AbstractField -#78 - QueryPart pollutes declared method space of its - implementations. Hide it by indirection - -Bugfixes --------- -#64 - Code generation fails when foreign key references a unique - key that is not the primary key. Code generation for these - cases is omitted -#67 - When loading properties files, a leading / seems to be - mandatory. This is preventing users from correctly setting - up jOOQ the first time -#70 - Add support for Oracle datatype TIMESTAMP(6) -#72 - Name clashes in generated Tables -#75 - Constant does not bind its values. -#76 - Constant should not render strings all the time -#79 - Constants are not properly escaped -#80 - Position function does not bind any variables -#81 - Add cast function to Constants in HSQL - -Version 1.4.1 - October 18, 2010 -================================================================= - -Oracle patch release - -Features --------- -#63 - Generate referential functionality for Oracle - -Version 1.4.0 - October 17, 2010 -================================================================= - -Support for PostGreSQL was added. -Added lots of OR-mapping functionality. -There is a general API change due to various new features. - -Features --------- -#14 - Add PostGreSQL support -#40 - Resolve foreign keys. Allow for navigation between objects. -#42 - Add PlainSQLField -#45 - Add "dirty" flag to Record's values. This allows for - updating only relevant data. -#47 - Complete implementation for UPDATE, INSERT, DELETE - statements. Added some missing functionality. -#48 - Add more support for Date, Time, Timestamp fields. -#51 - Add a org.jooq.impl.Manager class that provides common - utility methods for CRUD operations - -API changes ------------ -#10 - Add second generic type . This is a - prerequisite for many OR-mapping features -#18 - Use org.jooq.Record in InsertQuery and UpdateQuery -#46 - Create UpdatableRecords as a prerequisite for JPA and true - OR-mapping. These records support store() and delete() - methods -#52 - Add default constructor in generated Records. -#53 - Add refresh functionality to UpdatableRecords. See also #46 -#54 - Add a state to the factory class -#56 - Reduce API, remove unnecessary Condition subinterfaces -#57 - Reduce API, remove unnecessary QueryPart interfaces - -Bugfixes --------- -#49 - NullPointerException when generating relations on schema - subset -#58 - Count function renders bad SQL in various dialects -#59 - Exception when selecting unaliased functions in queries - -Version 1.3.0 - August 24, 2010 -================================================================= - -Support for HSQLDB was added. -There is a major API change due to #44. - -Features --------- -#29 - Generate primary keys and foreign keys in Oracle code - generation -#34 - Add support for HSQLDB -#39 - Generate primary keys and foreign keys in HSQLDB code - generation -#41 - Add documentation to QueryFactory and Functions - -API changes ------------ -#23 - Add support for more advanced joins -#32 - Merge SelectQuery and ResultProviderQuery interfaces -#44 - Let Query methods return "this" - -Bugfixes --------- -#35 - Add unit tests for HSQLDB support -#37 - Syntax error in combined select queries! - The usage of combined queries in MySQL may still be a bit - awkward. Keep an eye out for further fixes -#43 - Join with aliased tables doesn't work - -Version 1.2.0 - August 21, 2010 -================================================================= - -The added Oracle support is now unit tested and more stable. -The Oracle NUMBER data type is mapped more precisely to Java -types. - -Features --------- -#12 - Model primary keys and foreign keys in generated code -#22 - Improve mapping of Oracle NUMBER data type -#26 - Add Plain SQL QueryParts -#27 - Add support for HAVING clause - -Bugfixes --------- -#24 - Add Unit tests for oracle database (and fixed bugs) -#31 - Pull up addOrderBy() methods from SelectQuery to - ResultProviderQuery - -Version 1.1.0 - August 17, 2010 -================================================================= - -The main new feature is the Oracle support. Wait for -Version 1.1.1 for that support to be stabilised, as there are no -Oracle unit tests running against an Oracle database yet. - -Features --------- - -#2 - Add support for inner / nested selects -#3 - Add more function support -#4 - Implement filtering functionality for code generation -#6 - Add Oracle Support -#9 - Create true POJO's (implementing org.jooq.Record) with - getters and setters -#17 - Make org.jooq.impl.Parameter independent of Field - -Bugfixes --------- - -#11 - Code generation does not remove files - -Version 1.0.1 - August 14, 2010 -================================================================= - -Features --------- - -#5 - Prevent code regeneration, if no changes were made -#7 - Implement ant task for code generation - -Version 1.0.0 - August 14, 2010 -================================================================================ -Initial Release \ No newline at end of file diff --git a/jOOQ-website/inc/RELEASENOTES-2.2.txt b/jOOQ-website/inc/RELEASENOTES-2.2.txt deleted file mode 100644 index a9e57cfd08..0000000000 --- a/jOOQ-website/inc/RELEASENOTES-2.2.txt +++ /dev/null @@ -1,2527 +0,0 @@ -jOOQ Release notes -================== - -For an interactive overview, see also -http://github.com/jOOQ/jOOQ/issues - -For a formatted text version, see -http://www.jooq.org/notes.php?version=2.2 - -For a text version, see -http://www.jooq.org/inc/RELEASENOTES-2.2.txt - -Version 2.2.3 - July 1, 2012 -================================================================= - -This is a minor patch release, fixing some issues - -Bug fixes ---------- -#1109 - Standalone TABLE or VARRAY types are not correctly - initialised before referencing tables load them -#1360 - jOOR issue 12: "Don't reset the accessible flag to false, - if setting it to true is required, to avoid race - conditions in concurrency contexts" -#1394 - NullPointerException when omitting element in - code generation configuration -#1403 - Documentation bug: ctx.statement() can be replaced in - executeStart(). This is not documented -#1406 - Compilation errors in generated source code when Postgres - stored procedure parameter is called "NAME" -#1407 - Compilation errors in generated source code when Postgres - data-type is "any" (with quotes!) -#1441 - Performance issue with AbstractDataType.convert(Object). - Avoid conversions when they're obviously unneeded -#1449 - Generate some meaningful Javadoc into the generated - [schema-name]Factory classes -#1454 - Add line breaks to generated Javadoc where appropriate -#1465 - Custom generator strategy's printImplements() is called - with Mode == RECORD for tables -#1478 - Caching SQLDialect in AbstractDatabase heavily improves - code generation performance -#1483 - Inefficient cloning of default settings using JAXB - unmarshalling leads to non-negligible overall overhead. - Use serialisation instead (short of a useful XJC clone - plugin) -#1490 - Compilation error when a SQL Server stored procedure has - a parameter named "value" -#1493 - Bad syntax for SELECT /*+hint*/ DISTINCT ... in Oracle -#1515 - Splitting of large NOT IN conditions is wrong. The parts - should be connected with AND, not with OR - -Version 2.2.2 - April 22, 2012 -================================================================= - -This is a minor patch release, fixing some issues - -Bug fixes ---------- -#1308 - Oracle's DataTypeDefinition reports the length of a BLOB - / CLOB data type to be 4000 -#1324 - Code generation error in Oracle 10g when generating - stored procedures -#1329 - NullPointerException when passing null to - timestampDiff(Field, Field) -#1343 - Regression in insertInto(...).values(...). Cannot pass - Field to values() -#1311 - NPE at org.jooq.util.AbstractDatabase.getOutputSchema() - -Version 2.2.1 - April 12, 2012 -================================================================= - -This is a minor patch release, fixing some issues related to the -code generation of the new CUBRID integration as well as other, -minor issues. Upgrade if you're using CUBRID - -Bug fixes ---------- -#1287 - Remove oracle.sql dependency also from OSGi information - in pom.xml -#1288 - SQL syntax errors from sequences when using RenderMapping - with defaultSchema -#1289 - DefaultBindContext logs as Util.class -#1297 - Compilation error in CUBRID generated artefacts - referencing OBJECT types -#1298 - Avoid source code generation errors when generating code - for unknown, dialect-specific data types - -Version 2.2.0 - April 09, 2012 -================================================================= - -Finally, jOOQ has added support for another database, and a very -promising one, that is. http://www.cubrid.org is a surprisingly -original mixture of a relational and object-oriented database -where tables and classes are synonyms, so are records and -instances. The CUBRID database has a high level of compatibility -with MySQL and is aimed at MySQL users wanting more performance -for their web applications. For details, see the slides here: - -http://www.slideshare.net/cubrid/growing-in-the-wild-the-story-by-cubrid-database-developers - -jOOQ is proud to have become a CUBRID partner, looking forward -to further cooperation with CUBRID in the near future. - -Apart from that, jOOQ now fully supports SQL standard INTERVAL -data types. With JDBC and JPA lacking official support for this, -jOOQ aims for becoming the tool of choice for vendor-specific -date time arithmetic. True INTERVAL data type support is given in -HSQLDB, Ingres, Oracle, Postgres databases. Besides that, CUBRID -and MySQL support INTERVAL data type arguments in functions. In -other dialects, jOOQ simulates DATEADD(), TIMESTAMPADD(), -DATEDIFF(), TIMESTAMPDIFF(). - -For jOOQ's OLAP friends, there is now also support for the Oracle -LISTAGG function (LIST() in Sybase, XMLAGG() in DB2, STRING_AGG() -in Postgres, GROUP_CONCAT() in CUBRID, H2, HSQLDB, MySQL). -LISTAGG is an "ordered aggregate function", meaning that the -aggregation is done using a specific ordering. Keep an eye out -for more such function support in future versions. - -Features and improvements -------------------------- -#566 - Add support for INTERVAL data types -#585 - Add support for DATE, TIME and INTERVAL arithmetic -#1183 - Add support for DEFAULT values in Oracle stored procedure - parameters -#1243 - Let generated POJOs (and Records) extend base classes - and implement interfaces -#1252 - Avoid JDBC escape syntax for Oracle stored procedure - calls. Generate PL/SQL syntax, instead -#1255 - Let generated Tables contain a public default constructor - to be able to extend those classes - Github issue #12 -#1257 - Add CUBRID support -#1268 - Add Factory.field(String, QueryPart...) to generate - custom clauses -#1269 - Add YEAR(), MONTH(), DAY(), HOUR(), MINUTE(), SECOND() - function support as shortcuts for EXTRACT() -#1273 - Simulate GROUP_CONCAT() aggregate function using Oracle's - LISTAGG() function, where available -#1274 - Add support for the Oracle LISTAGG(...) WITHIN GROUP - (ORDER BY ..) [ OVER (..) ] aggregate / analytic function -#1275 - Simulate Sybase LIST() aggregate function using Oracle's - LISTAGG() function -#1276 - Simulate Oracle's LISTAGG() in DB2 using XMLAGG(), - SUBSTR() and CONCAT() -#1278 - DEBUG log both executed SQL and SQL with inlined bind - values - -API changes (backwards-compatible) ----------------------------------- -#1262 - Pull up OracleFactory.prior() and other CONNECT BY - related methods to Factory - -Bug fixes ---------- -#1241 - Wrong variable binding when comparing CHAR columns in - Derby and DB2 without explicit casting to VARCHAR -#1244 - Cannot override class name in GeneratorStrategy in - Mode.POJO -#1248 - Setting both false and - true leads to compilation errors -#1256 - Fixed code generation issue with H2 user defined - functions returning VARCHAR -#1263 - Pass fetchsizes <= 0 to the JDBC driver (for vendor- - specific MySQL compatibility) -#1270 - Most databases allow for multiple identical foreign keys. - This leads to compilation errors in generated source code - -Version 2.1.0 - March 18, 2012 -================================================================= - -With this version, jOOQ attempts to follow versioning rules -imposed by semantic versioning: http://semver.org/ -There will be 1 minor release per month, and a couple of patch -releases per year, depending on popular demand - -The main improvements for this release include - -- The possibility of providing jOOQ with a custom type mapping. - You can now define your own Converter types that are used by - jOOQ to map a database's SQLDataTypes to your custom types. - This is particularly useful for Java's enums. Read more about - custom converters in the manual: - http://www.jooq.org/manual/ADVANCED/CustomTypes/ - -- There are a lot of new runtime configuration options to control - the SQL style of SQL rendered by jOOQ. You can now specify - whether table/column names should be quoted / capitalised / - lower-cased, whether SQL keywords should be capitalised or not, - etc... - -- The handling of NULL has been improved in favour of using jOOQ - as a SQL builder library (e.g. along with Spring for execution) - NULL is no longer inlined, but bound as a variable. - -- jOOQ now supports simulation of the relational division - operation using an intuitive syntax. Read more about the - relational division here: - http://en.wikipedia.org/wiki/Relational_algebra#Division - -Features and improvements -------------------------- -#161 - Add runtime configuration to pretty print rendered SQL -#349 - Add SQLite relations support -#491 - Add runtime configuration for SQL keyword style (upper - case, lower case) -#521 - Add runtime configuration for SQL reference style (upper - case, lower case, as-is, quoted) -#1150 - Add code generation option to disable generation of - records -#1181 - Add support for SQL Server data types timestamp and - rowversion -#1188 - Load default Settings from the classpath at - /jooq-settings.xml, or from -Dorg.jooq.settings -#1193 - Specify main-class in jOOQ Console's manifest.mf and - include dependency in jar file -#1194 - Add ColumnDefinition.isNullable() -#1202 - Add support for the relational division operation: - A.divideBy(B).on(A.ID.equal(B.A_ID)).returning(A.X, ...) -#1207 - Add Factory.batch(Collection) for - convenience -#1208 - Render @javax.persistence.Column(nullable = false) - property, if available -#1209 - Render @javax.persistence.Column(length, precision, - scale) properties, if available -#1215 - Add org.jooq.Converter for custom type mapping -#1216 - Overload Record, Result.getValue() and .setValue() - methods to accept a Converter -#1217 - Add EnumConverter as a base type for custom enum - converters -#1218 - Add code generation options to generate - referencing a Java type and a Converter -#1224 - Add DataTypeDefinition.getLength() to jooq-meta's type - system -#1233 - Support custom JDBC properties for jooq-codegen -#1234 - Add Database.getTable(SchemaDefinition, String, boolean) - to fetch tables case-insensitively -#1239 - Add Factory.fetchLazy(String, Object...) - -API changes (backwards-compatible) ----------------------------------- -#1191 - Deprecate ConfigurationRegistry and replace by equivalent - ExecuteListener feature -#1219 - API Bug: Cannot use LIMIT .. OFFSET along with FOR UPDATE - -Bug fixes ---------- -#625 - Remove dependency from generated Routines to the - generator's SQLDialect -#1128 - NULL is inlined in INSERT statement instead of binding it - as a variable. This can cause issues when using jOOQ with - Spring -#1137 - Exclude MySQL column-level enum types when that column is - overridden by a -#1158 - Derby cannot handle inlined NULL literals in some - contexts -#1180 - Execute BatchMultiple (multi-query batch query), when - executing BatchSimple (single-query, multi-bind-value - query) with StatementType == STATIC_STATEMENT -#1189 - TableMapping regression for SQLite database -#1190 - Cannot store SQLite records when using - StatementType.STATIC_STATEMENT -#1199 - Table.getFields() returns an internal representation of a - table's field list. Make generated tables immutable! -#1200 - Internal API leak exposed through covariance in - AbstractType.getFields() -#1211 - Enforce method name disambiguation also when using custom - strategies in jooq-codegen -#1212 - Enforce identifier disambiguation also when using custom - strategies in jooq-codegen -#1221 - Incorrect ExecuteListener invocation for INSERT .. - RETURNING. executeStart() and executeEnd() are omitted -#1223 - Cache ExecuteListener classes for performance -#1225 - Bind NULL byte[] as java.sql.Types.BINARY instead of - BLOB in Postgres, to avoid errors -#1226 - Bind NULL UDTs with their associated type name in Oracle -#1232 - SQLException when Factory.fetch() does not return a - ResultSet -#1237 - Don't generate enum classes for columns in MySQL tables - that are excluded from code generation - -Version 2.0.5 - February 26, 2012 -================================================================= - -This release finally introduced basic runtime configuration -features for the jOOQ Factory. This configuration now includes: - -- Execute listener and SQL tracing support. jOOQ allows you to - hook your own listeners into jOOQ's query execution engine to - be notified of all sorts of events -- The existing SchemaMapping features. They are now part of the - runtime configuration -- StatementType settings. Specify whether a Factory should - execute java.sql.PreparedStatements (with bind variables) or - static java.sql.Statements with inlined variables. - -The runtime configuration is documented here: - -http://www.jooq.org/manual/JOOQ/Factory/ - -The listener and tracing support has been requested by -Christopher Deckers, a new jOOQ user who has had the courtesy to -contribute the new jOOQ Console, which is documented here: - -http://www.jooq.org/manual/ADVANCED/ExecuteListener/ - -Apart from that, another long-requested feature is now fully -implemented: The GeneratorStrategy, allowing for custom naming -strategies in generated source code. This will allow for -generating custom table / record class name prefixes / suffixes, -as well as overriding the default behaviour for rendering UPPER, -lower and CamelCase artefacts. See the manual for details: - -http://www.jooq.org/manual/META/Configuration/ - -Features and improvements -------------------------- -#93 - Add Field.equalIgnoreCase(), Field.notEqualIgnoreCase() -#408 - Add class prefixes, suffixes and other options to the - code generator -#492 - Add runtime configuration -#1107 - Let Field.contains() support the Postgres ARRAY @> ARRAY - operator -#1140 - Add ResultQuery.fetchResultSet() to return the underlying - JDBC result set -#1143 - Add Result.isNotEmpty() for convenience -#1145 - Add runtime configuration to specify whether jOOQ should - execute java.sql.PreparedStatement (with bind variables) - or a java.sql.Statement (with inlined parameters) -#1146 - Add Query.getSQL(boolean) to indicate that bind values - should be inlined (as a convenience for - Factory.renderInlined(QueryPart)) -#1148 - Add Cursor.resultSet() to expose the underlying ResultSet -#1149 - Allow for optional - "http://www.jooq.org/xsd/jooq-codegen-2.0.4.xsd" - namespace in jooq-codegen configuration -#1152 - Add & org.jooq.EnumType> - E MySQLFactory.enumType(Class, int) for enum reverse - lookups of MySQL-specific enums -#1159 - Support matching numbers with LIKE, e.g. ID LIKE '%33%' -#1160 - Implement Field.contains(), .startsWith(), .endsWith() - for numeric values, too -#1161 - Use reflection to remove compile-time dependency on - ojdbc for creating ARRAYs -#1162 - Integrate jOOR into jOOQ for simpler reflection -#1164 - Distinguish between Definition.getInputName(), - .getOutputName() -#1165 - Add constraint name to generated javadoc -#1167 - Trivial issue with org.jooq.Factory.exists Javadoc - - GitHub issue #10 -#1169 - Add Configuration.setData(), getData() to convey custom - data in a configuration's lifecycle -#1172 - Add runtime configuration to deactivate JooqLogger -#1177 - Add jOOQ-Console module to jOOQ -#1184 - Add DataType.isArray() - -API changes (backwards-compatible) ----------------------------------- -#1142 - Rename Result.exportXML() to Result.intoXML() to stay - more consistent -#1151 - Deprecate SchemaMapping in favour of new runtime - configuration - -Bug fixes ---------- -#978 - Schema.getTables() and similar methods return empty lists - when Schema is mapped with SchemaMapping -#1153 - Bad inlining of booleans in Sybase ASE / DB2 / Oracle - SQL Server / SQLite -#1154 - Bad inlining of byte[] in most dialects -#1155 - byte[] are erroneously converted to String when using - Record.intoArray() -#1156 - Bad inlining of DATE / TIME / TIMESTAMP data types in - Ingres (and other dialects, when the setting differs from - the default) -#1166 - Some generated Javadoc uses naming strategy or plain - output name, instead of qualified output name -#1168 - Oracle packages are generated as static, instead of - static final -#1175 - Factory.use() seems to render SQL with the Schema name - still present -#1179 - Oracle-generated ArrayRecords need a reference to - org.jooq.Schema to read TABLE of OBJECT from stored - procedures - -Test cases ----------- -#1147 - Add integration tests for executing SQL generated using - Factory.renderInlined() - -Version 2.0.4 - February 12, 2012 -================================================================= - -This release introduced many improvements to source code -generation. These improvements include: - -- Maven and standalone code generation now use the same XML - configuration, which is read by jOOQ-codegen using JAXB. This - allows for more complex configuration elements in the future -- jOOQ-codegen can now handle multi-schema databases and generate - code for tables referencing tables from other schemata. This - is integration tested against the SQL Server AdventureWorks - database -- jOOQ now allows to generate simple POJOs in addition to Records - and to annotate both POJOs and Records with JPA annotations - such as @Entity, @Table, @Id, @Column, @UniqueConstraint, etc. - -You can migrate your existing .properties configuration by running -> org.jooq.util.GenerationTool /your.properties migrate - -Besides that, there is a lot of ongoing work to improve the -integration of Oracle's TABLE and VARRAY types. - -Features and improvements -------------------------- -#8 - Add JPA annotations to generated POJOs / Records -#282 - Add support for multi-schema databases -#287 - Add support for Oracle TABLE types -#395 - Use XML configuration file instead of properties file -#1089 - Add Field.contains(), .startsWith(), .endsWith() as a - convenience for Field.like() (including escaping) -#1092 - Move master data table configuration from - generator.generate to generator.database namespace -#1093 - Add support for generator.strategy in Maven source code - generation -#1094 - Add support for generator.database.date-as-timestamp in - Maven source code generation -#1095 - Move generator.generate.unsigned-types to - generator.database namespace -#1096 - Add support for generator.generate.unsigned-types in - Maven source code generation -#1103 - Add support for SQL Server data type uniqueidentifier -#1106 - Add Factory.escape(Field, char) for use with LIKE -#1108 - Add support for multi-schema databases using Maven code - generation -#1115 - Add support for Oracle VARRAY/TABLE of OBJECT types -#1127 - Add support for POJO classes generation -#1129 - Allow for using Param in LIMIT .. OFFSET clauses -#1132 - Add RenderContext.castMode() to allow for avoiding casts - where this is not really needed -#1136 - Add generation option to enable/disable generating - navigation methods - -Bug fixes ---------- -#1099 - Derby generated artefacts are not sorted alphabetically -#1101 - Internal API leak exposed through covariance in - AbstractTable.joinXXX() methods -#1110 - VARRAY element type information is lost when unnesting - VARRAY's in Oracle -#1111 - VARRAY element type information is lost when unnesting - VARRAY's returned from functions in Oracle -#1114 - Syntax error when unnesting TABLE of OBJECT in Oracle. - The unnested table contains several columns but jOOQ only - unnests "COLUMN_VALUE" -#1117 - NullPointerException when passing an ArrayRecord - containing a null array to a stored function in Oracle -#1125 - Postgres needs casting for date time data types in - queries like SELECT ? FROM DUAL -#1131 - DB2: [Noauthorized routine named "LIKE" of type - "FUNCTION" having compatible arguments was found] when - using Field.like(concat(x, y)) -#1133 - Compilation errors in generated source code if the same - constraint name exists in several schemata -#1134 - NullPointerException in code generation when a foreign - key constraint references a table from another schema - that is not being generated -#1135 - Generated Javadoc references inputSchema instead of - outputSchema - -Test cases ----------- -#1009 - Add more integration tests for proper handling of - java.sql.Date, Time, Timestamp -#1090 - Run jOOQ tests against AdventureWorks SQL Server sample - database -#1105 - Add integration tests for multi-schema source code - generation and querying -#1122 - The 10k lines of integration test code are too heavy for - the compiler. Create test modules with fewer lines of - code, each. - -Version 2.0.3 - January 29, 2012 -================================================================= - -This release focuses on increased compatibility between various -SQL dialect integrations as far as ARRAY and JOIN support is -concerned: - -- ARRAY types are only available in H2, HSQLDB, Oracle, Postgres. - Nevertheless, they can be somewhat simulated in other dialects - using nested selects with UNION ALL. Increased compatibility - leads to a nicer API, where ARRAYs are used along with ALL/ANY - quantifiers, for instance. - -- JOIN syntaxes can be quite powerful in SQL. Apart from - simulating NATURAL JOIN, JOIN USING clauses, as well as a - synthetic "KEY JOIN" syntax, jOOQ now also supports nesting - JOIN expressions to create more complex table sources. See a - recent blog post on the subject here: - -http://blog.jooq.org/2012/01/15/lets-revise-the-sql-from-clause/ - -Features and improvements -------------------------- -#578 - Add KEY JOIN syntax to simulate joining using generated - foreign keys -#577 - Simulate NATURAL JOIN syntax, where this is unavailable -#582 - Simulate JOIN USING syntax, where this is unavailable -#671 - Allow for nesting JOIN clauses -#676 - Add Table.join() methods to create more flexible table - sources -#993 - Add Field.equalAny(T[]), .equalAny(Field) methods -#1048 - Simulate (array) syntax for dialects - that do not support arrays -#1051 - Add Factory.execute(String, Object...) as a convenience - method for Factory.query(...).execute() -#1055 - Simulate Factory.table(Object[]) and table(List) using - UNION ALL in dialects that do not support arrays -#1060 - Improve debug logging of H2 arrays. The syntax is not - ARRAY[1, 2], but (1, 2) -#1065 - Add OracleFactory.sysContext(String, String) to support - Oracle's SYS_CONTEXT function -#1069 - Add support for INSERT INTO table(field1, field2, ...) - SELECT syntax - as opposed to the existing INSERT INTO - table SELECT -#1072 - Add support for LIKE .. ESCAPE .. syntax -#1074 - Add Field.notBetween(T, T) for convenience -#1080 - Add support for JDBC's Statement.setFetchSize() in - ResultQuery.fetchLazy() -#1082 - Add some more DEBUG logging in AbstractResultQuery - -API changes (backwards-compatible) ----------------------------------- -#1059 - Change SelectFromStep.from(Collection>) to - from(Collection>) - -API changes (backwards-incompatible) ------------------------------------- -#1087 - Change the NTILE function to return Field - instead of Field - -Bug fixes ---------- -#1071 - Make Sequence Serializable -#1081 - Derby error in NULL handling when simulating unnested - arrays that contain NULL values -#1084 - Bind index mismatch in val(null).equal(null) and in - val(null).notEqual(null) -#1091 - Add missing @Support annotations on Table.crossJoin() - methods - -Test cases ----------- -#1026 - Add integration tests for NTILE window function and - document compatibility -#1073 - Add integration tests for NOT IN queries holding NULL - arguments - -Version 2.0.2 - January 8, 2012 -================================================================= - -This is a maintenance release for jOOQ 2.0. The main improvements -include - -- The whole jOOQ API is now annotated with a new org.jooq.Support - annotation to help you assess whether a certain SQL clause is - available in your database or not. This is particularly useful - when your application should support several databases at once - (e.g. MySQL, Postgres, Oracle) -- The Oracle PIVOT clause is now formally supported for advanced - statistical queries in Oracle. This clause will be simulated in - other dialects in the future. -- The DATE data type can be mapped to TIMESTAMP. This important - when you query a legacy Oracle database, where DATE columns - can also contain time information -- Several convenience methods have been added for more fluent - syntax, when using plain SQL result queries, subqueries as - tables, or when unnesting arrays in ANY() and ALL() quantifiers - -Further type mapping support is still experimental. An official -cooperation with MinuteProject for source code generation is -being analysed. With MinuteProject, many source code generation -issues could be addressed centrally, as MinuteProject specialises -in source code generation: - -http://minuteproject.wikispaces.com/ - -Features and improvements -------------------------- -#595 - Add support for Oracle's PIVOT clause -#869 - Add support for using ANY, ALL with arrays, not just with - subselects -#1007 - Formally document the API methods to indicate whether - something is supported by any given SQL dialect -#1011 - Add code generation configuration parameter to avoid - generating @Generated annotation -#1019 - Render LIMIT x OFFSET y also for MySQL, instead of - LIMIT y, x -#1022 - Add missing Sybase ASE implementation for Factory.use() -#1024 - Add Factory.resultQuery(String, Object...) to allow for - arbitrary execution modes of plain SQL queries (lazy, - later, into, array, etc) -#1025 - Add missing SQLite implementation for Factory.deg() and - Factory.rad() -#1033 - Generate table comments into generated Tables.java as - Javadoc -#1040 - Add Object[][] Result.intoArray() and - Object[] Record.intoArray() for convenience. Let - E Record.into(Class) also support array types. -#1041 - Add Table Factory.table(Select) convenience - method for more fluency -#1042 - Add support for DISTINCT keyword in SUM, AVG, MIN, MAX - aggregate functions -#1046 - Generate Ingres table and column comments in generated - source code (only Ingres 10) - -API changes (backwards-compatible) ----------------------------------- -#1050 - Deprecate usage of SOME quantifier in predicates, such as - equalSome() - -API changes (backwards-incompatible) ------------------------------------- -#1036 - Fixed API typo in - WindowsRowsStep.rowsBetweenUnboundedFollwing() -#1037 - The fluent API allows for JOIN clauses without FROM - clause - -Bug fixes ---------- -#1010 - The MERGE INTO .. WHEN NOT MATCHED THEN INSERT .. syntax - may cause type-safety issues in some databases. VALUES - should be converted before binding -#1014 - FindBugs: Latent risk of infinite recursion due to typo - in QueryPartList.retainAll(); -#1015 - FindBugs: 7 occurrences of "Bad attempt to compute - absolute value of signed 32-bit hashcode". In extreme - cases, this could lead to SQL syntax errors -#1016 - The Oracle CONNECT BY cond1 AND cond2 syntax erroneously - creates a WHERE cond2 CONNECT BY cond1 statement -#1028 - Syntax errors when using untyped param() in HSQLDB (and - other strongly typed dialects) -#1029 - Postgres can't bind NULL values in cases, where bind type - is Object.class and bind value was created with - Factory.param() -#1030 - UnsupportedOperationException when calling - Query.bind(int, Object) on a query containing plain SQL - fields -#1031 - Incorrect debug logging when plain SQL QueryParts like - field("?") bind null values -#1032 - Incorrect debug logging when plain SQL QueryParts contain - String literals, such as 'Hello? Anyobody out there?' -#1047 - Field.notEqualAny() erroneously renders <> ALL() - -Test cases ----------- -#1021 - Add explicit integration tests for - LEFT|RIGHT|FULL OUTER JOIN - -Version 2.0.1 - December 23, 2011 -================================================================= - -This is a maintenance release for jOOQ 2.0. The main improvements -include - -- Better integration for using jOOQ with Spring Data. This - includes support for named parameters, as well as allowing to - change bind values on previously constructed Query objects -- The MERGE statement has been enhanced for better integration - with Oracle. -- jOOQ is now ready to use with Scala / Groovy - -For more information about using jOOQ with Scala, see this blog -post: -http://blog.jooq.org/2011/12/11/the-ultimate-sql-dsl-jooq-in-scala/ - -There is now also experimental support for a custom type mapping. -This mapping allows to rewrite data types at code generation time -as well as to specify custom enum data types (e.g. boolean Y/N). -Not all integration tests run smoothly for custom data types, -hence, this feature is not yet fully supported. - -Features and improvements -------------------------- -#691 - Add support for Oracle CURSOR REF IN / INOUT parameters -#677 - Add type-mapping configuration, enforcing types for - columns -#947 - Add custom type mapping support (experimental) -#968 - Allow for custom enum types, configured in the code - generator (experimental) -#974 - Add Schema.getTable(String), getSequence(String), - getUDT(String) for better runtime Schema meta-navigation -#975 - Add Sequence.getName(), getSchema(), getDataType() -#980 - Add support for named parameters, to better interact with - Spring -#991 - Add Query.bind(String, Object) and bind(int, Object) to - easily modify existing bind values -#992 - Document thrown DataTypeException in Convert methods -#998 - Enhance MERGE statement for Oracle extensions: - WHEN MATCHED THEN UPDATE .. WHERE .. DELETE WHERE .. - WHEN NOT MATCHED THEN INSERT .. WHERE .. -#1000 - Add support for MySQL's INSERT INTO .. SET .. syntax in - MERGE statement's WHEN NOT MATCHED THEN INSERT clause - -API changes (backwards-compatible) ----------------------------------- -#981 - Cannot insertInto(table("my_table")), as plain SQL tables - return Table, not Table. Relax - bound on R -#988 - Change Factory.field(String) to return Field - instead of Field -#999 - Make MERGE's WHEN MATCHED .. and WHEN NOT MATCHED .. - clauses optional -#1001 - Identity.getField() should return TableField - instead of Field -#1006 - Add Factory.value(...) as a synonym for Factory.val(...) - for increased Scala / Groovy compatibility - -Bug fixes ---------- -#973 - EnumType renders name() instead of getLiteral() in - formatXXX() methods -#977 - EnumType renders name() instead of getLiteral() in - Convert.convert() method -#979 - Record.from() sets all changed flags to true. That's not - necessarily correct in the event of storing the record - back to the DB -#985 - AbstractRecord.equals() does not correctly compare - arrays. Compare them using Arrays.asList() -#986 - Postgres / DB2 / Sybase ASE foreign-key namespace is - unique-per-table. jOOQ forces all foreign keys from all - tables into the same namespace -#990 - Problems when encoding arbitrary byte[] as String(byte[]) - in inlined SQL. This can cause issues when DEBUG-level - logging is activated -#995 - Routines don't respect SchemaMapping - Github issue #8 -#1002 - TableRecord.storeUsing() doesn't update IDENTITY column - values, if the column is not part of the main unique key -#1003 - Sybase / SQL Server / MySQL / Ingres / H2 / Derby's - INSERT .. RETURNING simulation returns null if a table - has an IDENTITY column, but no primary/unique key -#1005 - The INSERT INTO .. VALUES .. syntax may cause type-safety - issues in some databases. VALUES should be converted - before binding - -Test cases ----------- -#984 - Detach IDENTITY column tests from UNIQUE KEY tests, - create a dedicated test suite instead - -Version 2.0.0 - November 25, 2011 -================================================================= -This release is a fresh start in many areas of jOOQ, adressing -issues that have been requested by users for a long time. These -release notes docment the most important changes, a detailed -upgrade guide, as well as the detailed list of improvements. - -Most important changes ----------------------- -- The API became more static. This applies to many Factory - methods, such as val(), literal(), as well as to many Field - methods that have been moved over to the Factory. For example, - when before, you wrote this using "postfix function notation": - -
NAME.replace(" ", "_").trim()
- - you will now write (just as in SQL): - -
trim(replace(NAME, " ", "_"))
- - Using static imports of Factory.*, jOOQ makes SQL look even - more like SQL. The current "postfix notation" is maintained for - backwards compatibility. -- By default, jooq-codegen will now generate a "dynamic" meta - model as opposed to the existing static one. Generated tables - covariantly override the as(String) aliasing method, leading - to a much more convenient aliasing style. When before, you - wrote: - -
-Table parent = T.as("parent");
-Table child  = T.as("child");
-Condition join =
-  parent.getField("ID").equal(child.getField("PARENT_ID"))
-
- - You can now write: - -
-T parent = T.as("parent");
-T child  = T.as("child");
-Condition join = parent.ID.equal(child.PARENT_ID)
-
- - Of course, the existing notation still works - -- Exceptions are no longer checked. When previously, the DB's - SQLException was propagated to client code, there is now an - unchecked DataAccessException hierarchy, similar to that of - Spring. This will eventually give way to a standardised error - handling abstraction, in future developments. -- Window functions are now constructed from their underlying - aggregate functions just like in SQL. For example: - -
-sum(AMOUNT)
-sum(AMOUNT).over().partitionBy(ACCOUNT)
-
- - This makes for a more concise API, especially when considering - future extensions, such as Oracle's KEEP (DENSE_RANK FIRST...) - syntax. -- More type safety has been introduced regarding various places - where generic and types are involved. - This is especially true for INSERT / UPDATE / DELETE statements -- Sequences now also have a type -- Unsigned number types are now supported in those databases that - use them. Unsigned numbers are implemented in jOOU, a spin-off - open source project. For convenience, this library is - "internalised" into jOOQ, to avoid adding a dependency - -http://code.google.com/p/joou/ - -Upgrade instructions: ---------------------- -Various of the above changes are incompatible with jOOQ 1.x. In -order to upgrade, please be aware of the following pitfalls: - -- The schema needs to be re-generated. -- Much of the post-fix function notation is replaced by static - methods in the Factory. Today's org.jooq.Field API is - maintained in jOOQ 2.0, for backwards compatibility. It will - be removed, eventually, though. Expect some incompatible - changes, where window functions are involved -- Some Factory instance methods (such as val(), literal()) are - now static. They are compatible, but may cause compiler - warnings. -- The meta model is now an instance model by default. If you - prefer the static meta model, you can configure this in your - jooq-codegen configuration. -- The additional typesafety involving and types may cause - compiler warnings and errors. -- SQLException is no longer part of the API. This can cause - compiler issues, in particular when extending jOOQ -- Some utility classes have moved to org.jooq.tools - -Should these incompatibilities be too significant for your -project, you can still stay on the 1.x branch, which will be -maintained for a while. Be aware that upgrading might be more -difficult, later, though. - -Features and improvements -------------------------- -#55 - Implement improved exception handling -#117 - Improve DSL support for field and table aliasing (decrease - verbosity) -#519 - Add support for MySQL UNSIGNED numeric types -#626 - Create static function access -#661 - Add support for bitwise operators -#718 - Sequences should be mapped to appropriate type (e.g. - SMALLINT, INT, BIGINT, etc) -#734 - Add support for Oracle / SQL Server CUBE() and ROLLUP() - grouping functions -#751 - Add support for Oracle / SQL Server GROUPING SETS() - function -#799 - Add support for Oracle PL/SQL's object-oriented MEMBER - PROCEDURES and MEMBER FUNCTIONS -#804 - Add to Insert, Update, Delete -#835 - Review API typesafety for InsertSetMoreStep - set(Field, T) and similar methods -#890 - Add Factory.selectCount() convenience method -#891 - Let min() max(), etc functions return a new type - AggregateFunction. This type can then be used as an entry- - point for window functions -#892 - Add support for Oracle / SQL Server GROUPING() and - GROUPING_ID() functions to be used along with CUBE() and - ROLLUP() -#893 - Simulate ROLLUP() function for MySQL, using the WITH - ROLLUP grouping modifier -#894 - Move functions from Field to org.jooq.impl.Factory - and make them static -#895 - Add power(..., Field) -#897 - Add (experimental) Spring integration project -#898 - Replace usage of checked SQLException by an unchecked - DataAccessException, similar to that of Spring -#899 - Build jOOQ .jar files as bundles to be deployed into OSGI - environments -#900 - Purge deprecated API - Prior to 2.0 -#901 - Introduce InvalidResultException as a subtype of - DataAccessException for integrity checks in methods like - ResultQuery#fetchOne(), ResultQuery#fetchMap(), etc. -#902 - Make AggregateFunction the base type for constructing - window functions -#904 - Move SQLDialectNotSupportedException into - org.jooq.exception package -#905 - Introduce MappingException as a subtype of - DataAccessException for integrity checks in methods like - ResultQuery#fetchInto(), etc. -#907 - Add missing Field.like(Field), notLike(Field) - methods to overload the existing Field.like(T), notLike(T) -#908 - Change rpad / lpad functions to accept String instead of - char -#912 - Add R newRecord(Table, Object) as - the inverse of various into(Class) methods -#916 - Add > {Record.into(Table) | - Result.into(Table) | ResultQuery.fetchInto(Table) | - Cursor.fetchInto(Table)} -#917 - Add various Cursor.fetchOneInto() convenience methods -#918 - Add CustomTable, CustomRecord as base classes for more - convenience when used with various into(Table) methods -#919 - Allow for accessing non-public constructors of Record - subtypes -#923 - Move some utilities to org.jooq.tools -#924 - Generate a reference to every table in a new Tables.java - class for improved static access -#928 - Add DataTypeException extending DataAccessException in - case something went wrong when converting data types -#930 - Support converting date time types to java.util.Calendar. - This applies to various into(Class) methods, as well as - Result.getValue(xx, Class) -#931 - Allow for conversion between Long and date/time types, and - vice versa -#932 - Let the bound of R in TableRecord extend TableRecord, - in UpdatableRecord to extend UpdatableRecord -#933 - Add support for type Character in Record.into(Class) - methods and similar -#936 - Accept primitive types, such as int.class for type - conversion -#938 - CODEGEN: Add static/instance table field configuration -#939 - Include license.txt and readme.txt in .jar files' META-INF - directory -#953 - Make DefaultGeneratorStrategy methods non-final to allow - for overriding -#954 - Add examples for source code generation of multiple - schemata with Maven -#955 - Generate a reference to every type in a new UDTs.java - class -#957 - Add R Factory.newRecord(UDT) for constructing - attached UDTRecords -#958 - CODEGEN: Add generation-time schema mapping, allowing for - re-writing schemata in jooq-codegen -#960 - CODEGEN: Add code generation configuration parameter to - avoid using the new UByte, UShort, UInteger, ULong wrappers - for UNSIGNED number types -#961 - Use Oracle's SYS.ALL_SEQUENCES.MAX_VALUE to determine the - type of a sequence. -#969 - Add List ResultQuery.fetch(Field, - Class) convenience method - -Bug fixes ---------- -#686 - Reduce the internal API leak by preventing access to - TableFieldImpl, UDTFieldImpl, ParameterImpl -#903 - lag(Field, int, T) erroneously delegates to lead() -#906 - Add more NullPointerException safety to API -#913 - NoClassDefFoundError in JooqUtil.isJPAAvailable() -#920 - Generic type is lost in Cursor.fetchInto(RecordHandler) -#925 - SelectConditionStep should extend SelectConnectByStep, not - SelectGroupByStep -#926 - AbstractRecord.into() fails to convert java.sql.Date into - java.util.Date -#934 - Don't consider static members in reflection utilities when - used with Record.into(Class) and similar methods -#935 - Don't consider final member fields in reflection utilities - when used with Record.into(Class) and similar methods -#937 - In the event of name clash (same name for table and field) - generated code has errors -#945 - Calling UpdatableRecord.setValue() twice with the same - argument causes the changed flag to be reset to false -#948 - Always set the changed flag to true in Record.setValue() -#959 - Compilation errors in generated source code if MySQL enum - values match Java reserved words, such as 'true', 'false', - 'new', etc... -#962 - Postgres ordering of generated enum literals is unstable -#967 - Better document type conversion - -Version 1.7.0 - November 25, 2011 -================================================================= -This is a maintenance release for the 1.x branch. Some important -bug fixes are merged from version 2.0. These include: - -Bug fixes ---------- -#925 - SelectConditionStep should extend SelectConnectByStep, not - SelectGroupByStep -#926 - AbstractRecord.into() fails to convert java.sql.Date into - java.util.Date -#937 - In the event of name clash (same name for table and field) - generated code has errors -#945 - Calling UpdatableRecord.setValue() twice with the same - argument causes the changed flag to be reset to false -#948 - Always set the changed flag to true in Record.setValue() -#951 - Empty Password for jooq-codegen-maven causes NPE - -Version 1.6.9 - November 7, 2011 -================================================================= -This is a maintenance release for the 1.x branch. Developments -on this branch will stop after version 1.6.9. Only important bug -fixes are merged to this branch. Developments for release 2.0 -have started. - -The most important functionality in release 1.6.9 is the newly -added support for JDBC batch operations. You can now batch -execute several queries. - -See the official blog for more information: -http://blog.jooq.org/2011/10/25/jdbc-batch-operations-with-jooq/ - -Features and improvements -------------------------- -#621 - Add support for JDBC batch operations -#794 - Add support for ORDER BY [int value] in order to reference - a column index for sorting -#882 - Optimise Field.isTrue() and isFalse(). Take Field's data - type into consideration. -#885 - Add support for INSERT INTO .. VALUES (..) syntax, - omitting explicit field declarations -#887 - Add List Cursor.fetchInto(Class) - -Bug fixes ---------- -#748 - H2 regression in 1.3.158 regarding stored functions, which - return a ResultSet (this was fixed in H2) -#859 - Derby casting of numeric types to BOOLEAN doesn't work -#886 - Regression in date extract function when used in a - subselect -#888 - Derby casting of VARCHAR to FLOAT (and similar) doesn't - work - -Version 1.6.8 - October 22, 2011 -================================================================= -The main improvement of this release is the re-design of the -stored procedure / function API. With 12 supported RDBMS, which -all have their own idea about what is a stored procedure and what -is a stored function, it has proven to be a better design, to -unite them in one single type: org.jooq.Routine. A routine can -have a return value as well as OUT parameters. It can be embedded -in SQL and used as a field or a table. - -This means, you will need to re-generate your database schema, -when upgrading to jOOQ 1.6.8. After re-generation, you'll need to -fix your client code. These are the package changes: - -- [generated.package].procedures > [generated.package].routines -- [generated.package].functions > [generated.package].routines -- [generated.package].Procedures > [generated.package].Routines -- [generated.package].Functions > [generated.package].Routines - -Oracle generated packages are not re-located. With these -improvements, using stored procedures and functions becomes even -more reliable, especially when cursor types are involved. Read -more about the rationale behind this change: - -http://blog.jooq.org/2011/10/17/what-are-procedures-and-functions-after-all/ - -Apart from that, important improvements have been made in the -area of plain SQL tables. Also, consider a demo integration of -jOOQ with Google Cloud SQL: - -http://blog.jooq.org/2011/10/22/jooq-and-google-cloud-sql-example/ - -Features and improvements -------------------------- -#271 - Don't pre-fetch table meta data when selecting from plain - SQL tables -#489 - Add support for SELECT * (i.e. render SELECT * where - applicable) -#596 - Add support for VARIANCE() and STDDEV() OVER() window - functions -#608 - Add jOOQ version number in generated source code -#670 - Add more Javadoc to Field.xxx() functions -#692 - Add support for ResultSet type returned from HSQLDB - stored functions -#850 - Use http://www.jooq.org as URL for the @Generated - annotation -#854 - Add convenience methods Fields.isTrue(), isFalse() for - conversion of "Y", "YES", "1", "true", "on", etc into a - boolean condition -#870 - Add support for MEDIAN aggregate function -#872 - Add support for STDDEV_POP(), STDDEV_SAMP(), VAR_POP(), - VAR_SAMP() aggregate functions -#874 - Reduce the number of internal classes for dialect-specific - function aliases -#878 - Implement DataType.equals() and hashCode() - -API changes (backwards-compatible) ----------------------------------- -#851 - Change Field.{sortAsc|sortDesc}(List sortList) into - Field.{sortAsc|sortDesc}(Collection sortList) - -API changes (backwards-incompatible) ------------------------------------- -#848 - Purge deprecated API - Prior to 1.6.1 -#849 - Replace Cursor.fetchResult() by Cursor.fetch() -#852 - Review stored procedures / functions concept. Merge them - all into a single "Routine" type - -Bug fixes ---------- -#756 - Error when aliasing HSQLDB and Postgres unnested tables -#761 - Exception when TRACE logging execution with plain SQL - tables involved -#773 - Execute standalone stored functions as CallableStatement - to prevent issues with transactions -#847 - Query.getSQL() doesn't render dialect-specific SQL when - Query is constructed using the fluent API -#853 - DB2 generated convenience methods for stored functions - have unstable ordering -#857 - Derby casting of numeric types to String / VARCHAR does - not work -#858 - SQLDataType.getSQLDataType() should return itself, instead - of null -#860 - SQLite CEIL function is incorrectly simulated. CEIL(2.0) - returns 3.0 instead of 2.0 -#861 - Field.replace(String) generates bad SQL for various RDBMS. - Field.replace(String, String) works, though -#863 - Ingres integration generates illegal SQL when selecting - things like SELECT 1 WHERE 1 = 1 -#866 - Sybase ASE Field.replace(String) function incorrectly - removes the argument string -#873 - Error when selecting two times the same aggregate field -#877 - Compilation error in generated source code when a table - without a primary key has an identity column -#879 - Add Google Cloud SQL Example -#880 - Query.getSQL() does not consider SchemaMapping - -Test cases ----------- -#811 - Loader integration tests fail for SQLite -#812 - CSV Loader test leaves Postgres JDBC connection in an - inconsistent transactional state on error -#856 - Add integration tests for Field.abs() -#865 - Add integration tests for Field.ascii() -#867 - Add integration tests for Field.sum(), avg(), max(), min() -#881 - Re-design H2 stored functions to be pre-compiled, in order - to speed up integration tests - -Version 1.6.7 - September 25, 2011 -================================================================= - -This release coincides with the launch of the new website at -http://www.jooq.org. Hence, it ships with little additions to the -deliverable itself. - -Apart from new convenience methods, the main addition is a Maven -plugin for jooq-codegen contributed by Sander Plas. - -Features and improvements -------------------------- -#797 - Create Maven plugin for source code generation -#825 - Add List> Factory.fetchMany(String) to - allow for fetching several result sets from stored - procedures, such as Sybase ASE's "sp_help" -#838 - Implement MetaDataFieldProvider.toString() -#841 - Add List Result.getValues(Field, Class) -#842 - Add Query.getBindValues() method to allow for extracting - bind values in the correct order -#843 - Add Factory.fetch(ResultSet) to transform a JDBC ResultSet - into a jOOQ Result - -API changes (backwards-compatible) ----------------------------------- -#837 - Avoid final keyword on Object methods, such as .equals(), - .hashCode(), etc - -Bug fixes ---------- -#836 - Bad syntax when selecting from aliased plain SQL tables -#839 - Boolean conversion in getValueAsBoolean() should trim - String values first -#840 - Numeric conversions in getValueAsXXX() should trim String - values first -#844 - NullPointerException when selecting a column from a Result, - that does not exist - -Version 1.6.6 - September 11, 2011 -================================================================= - -Finally, support for another RDBMS has been added. Sybase's other -important product Sybase Adaptive Server Enterprise (or simply -Sybase ASE) is now officially supported by jOOQ - -Apart from this, there had been important improvements with the -recently added INSERT .. RETURNING clause, as well as some fixes -related to DECIMAL / NUMERIC data types - -Features and improvements -------------------------- -#796 - Complete missing public org.jooq.impl Javadoc -#800 - Add support for Sybase Adaptive Server Enterprise -#808 - Add support for INSERT .. RETURNING for Ingres -#809 - Add support for INSERT .. RETURNING for Sybase SQL - Anywhere using SELECT @@identity -#810 - Add support for INSERT .. RETURNING for SQLite using - last_inserted_rowid() -#813 - Add DSL support for INSERT .. RETURNING -#814 - Change TableRecord to reload its trigger-initialised main - key in Oracle and other RDBMS that don't support IDENTITY - columns -#818 - Add SQLiteFactory.rowid() -#819 - Support SQLite AUTOINCREMENT columns as IDENTITY -#820 - Add Factory.fetchOne(String) for executing plain SQL - queries that return single records -#826 - Allow for returning several records in the INSERT .. - RETURNING clause. This now works for DB2, HSQLDB, MySQL, - and Postgres -#827 - Support Sybase SQL Anywhere's TOP n START AT m clause - instead of simulating it with nested SELECT's - -API changes (previous API now deprecated) ------------------------------------------ -#817 - Deprecate Factory.lastID(Identity) - -Bug fixes ---------- -#815 - SQL Server fetching of IDENTITY value is broken -#821 - Optimise ResultQuery.fetchAny() executing fetchLazy() - internally, and only fetching one record from the cursor -#822 - Let Constant cast to more precise NUMERIC/DECIMAL types - in those RDBMS where casting is necessary -#823 - Cannot bind SQLite BigDecimal, BigInteger types - bind - them as String instead -#824 - BigInteger values cannot be bound in DB2, Derby -#828 - Document inefficient implementation for GREATEST and LEAST - in some RDBMS - -Version 1.6.5 - August 28, 2011 -================================================================= - -This release finally adds a loader for CSV data to jOOQ. You can -now load CSV data using a simple fluent API, configuring error -handling, duplicate behaviour and transaction handling, as well -as various CSV parameters. - -This release also changes the way generated keys are retrieved -after INSERT's. Instead of (potentially inconsistently) running -SELECT MAX(pk) immediately after the INSERT, Postgres' INSERT.. -RETURNING clause is used (or simulated), in a single statement. - -Features and improvements -------------------------- -#784 - Add Result.exportXML() to retrieve a DOM document similar - to that of .formatXML() -#792 - Add support for loading of CSV data into tables -#795 - Add List fetch(int, Class) and - fetch(String, Class) convenience methods -#803 - Add support for INSERT .. RETURNING or simulate it where - not available -#805 - Add T[] fetchArray(int, Class) and - fetchArray(String, Class) convenience methods -#806 - Add T fetchOne(int, Class) and - fetchOne(String, Class) convenience methods - -Bug fixes ---------- -#798 - Oracle IN (...) clause with more than 1000 arguments does - not work -#802 - Use "INSERT .. RETURNING" instead of "SELECT MAX(pk)" - to retrieve the primary key of a new record - -Version 1.6.4 - August 07, 2011 -================================================================= - -This release ships with a couple of useful concepts inspired by -other frameworks. These are: - -- selecting into custom POJO's. Results can be mapped to POJO's - by convention or using JPA @Column annotations -- selecting into custom callbacks. This is already a wide-spread - practice in Spring JdbcTemplates. -- selecting long-running queries asynchronously. This idea has - been inspired by the Avaje Ebean framework - -Apart from these changes and some bugfixes, the internal API has -been completely re-designed. The idea here is that query -rendering and variable binding are even faster (less String -objects), more extensible and more accurate. This is a pre- -requisite for many future developments with even more complex SQL -statements, such as for instance CTE's (Common Table Expressions) - -Features and improvements -------------------------- -#137 - Add support for asynchronous query execution using - FutureResult ResultQuery.fetchLater() similar to - Avaje Ebean -#198 - Add SELECT INTO functionality into POJO's using - T ResultQuery.fetchInto(Class) similar to JPA - CriteriaQuery -#728 - Add .fetchInto(RecordHandler) to ResultQuery, Result, - and Cursor to allow for callbacks similar to Spring's - JdbcTemplate/Ollin Framework -#774 - Add more TRACE logging to .fetchLazy() -#777 - CURSOR: Add function alias: UNNEST for TABLE -#781 - Add E function (Euler number) -#782 - Add T Record.getValue(..., Class) methods - for convenient type conversion -#785 - Allow for storing TableRecord with a provided Field[] - indicating the primary key -#786 - Document thread-safety facts in Factory Javadoc -#788 - Add Key.getFieldsArray() convenience method -#793 - Add support for Oracle's SYS_CONNECT_BY_PATH function - -API changes (backwards-incompatible) ------------------------------------- -#758 - Change internal QueryPart rendering and binding API to use - Configuration and Context as callback parameters. If you - use CustomField or CustomCondition, please correct your - implementations accordingly. Other parts of the API should - not be affected -#778 - Purge deprecated API, deprecation prior to jOOQ 1.5.7 -#790 - Purge deprecated generated code, deprecation prior to - jOOQ 1.5.7 - -API changes (previous API now deprecated) ------------------------------------------ -#776 - Deprecate QueryPart.getSQL(), add Query.getSQL() -#789 - Deprecate Record constructors with Configuration - parameter - -Test cases ----------- -#636 - Add integration tests for more advanced CONNECT BY - example -#772 - Add integration tests for selecting cartesian products - (several tables in FROM clause) - -Bug fixes ---------- -#730 - Sybase cannot bind null values in plain SQL -#759 - Omit the TOP 100 PERCENT clause in SQL Server ordered - top-level queries -#767 - An empty Java package is generated for PL/SQL packages - containing underscores -#771 - Some exotic literals are not properly escaped with quotes - yet, e.g. UDT identifiers, VARRAY types, etc. -#775 - Automatic re-attaching after deserialisation does not work - when used with .fetchLazy() -#787 - The UpdatableRecord's internal changed flags are not - updated after INSERTs / UPDATEs - -Version 1.6.3 - July 31, 2011 -================================================================= - -This is mainly a maintenance release with lots of bugfixes, -mostly around code generation, plain SQL tables, and data types. -Please note that generated source code may contain incompatible -changes due to #639 (see below for details)! - -Apart from that, project CURSOR is advancing and it is now -possible to unnest arrays into tables. See this article for -details about where jOOQ is heading with project CURSOR: - -http://blog.jooq.org/2011/07/24/the-power-of-ref-cursor-types/ - -Features and improvements -------------------------- -#679 - Improve H2 NVL2 support as of H2 1.3.156 -#680 - Improve H2 ROUND support as of H2 1.3.156 -#735 - Add README documentation to GitHub -#736 - Add more info regarding number of generated artefacts in - jooq-codegen logging -#750 - Add DataType.isNumeric(), .isString(), .isTemporal(), - .isBinary() -#754 - Log query as executed by JDBC PreparedStatement when - TRACE logging (without inlining variables) -#752 - CURSOR: Add support for selecting from ARRAY types -#762 - Use H2's native support of NVL, instead of COALESCE -#764 - CURSOR: Add support for selecting from ARRAY types - returned from stored functions - -API changes (backwards-incompatible) ------------------------------------- -#639 - Map DECIMAL(n, 0) and NUMBER/NUMERIC(n, 0) data types - to Byte/Short/Integer/Long/BigInteger instead of - BigDecimal in generated source code. Re-generated code - will not be compatible! - -API changes (previous API now deprecated) ------------------------------------------ -#731 - Inconsistent API with Field.lessOrEqualToXXX(). Removed - "To" from method name -#757 - Deprecate Factory.constant() methods - -Test cases ----------- -#731 - Add missing integration tests for equalAll(), equalSome() - and similar methods -#747 - Upgrade H2 to 1.3.158 - -Bug fixes ---------- -#632 - Sybase error : column @p0 not found in nested SELECT -#700 - Restore HSQLDB ARRAY support with INFORMATION_SCHEMA - change in HSQLDB 2.2.3, and some fixes in 2.2.5 -#725 - Cannot insert byte[] data with plain SQL -#733 - H2 changed JDBC type for ResultSet/CURSOR from 0 to -10, - like Oracle -#737 - Compilation errors in generated source code if table - fields contain spaces -#738 - Compilation errors in generated source code if MySQL - procedure parameter type contains two comma-separated - arguments (like DECIMAL(10,2)) -#739 - Postgres navigator methods and keys are not re-generated - in the same order -#740 - Formatting is broken on Result.format() with some special - newline characters -#743 - Make SQL Server INFORMATION_SCHEMA independent from - HSQLDB again, to prevent incompatibility issues -#744 - Ingres REAL and FLOAT4 types are generated as FLOAT/FLOAT8 - which maps to java.lang.Double, instead of java.lang.Float -#753 - Postgres error when binding array that contains null - values -#755 - NullPointerException when converting an array containing - a null value -#766 - Bad decoding of JDBC Types BIGINT (to BigInteger instead - of Long) and REAL (to BigDecimal instead of Float) when - plain SQL tables are involved - -Version 1.6.2 - July 10, 2011 -================================================================= - -This release mainly introduces three new projects. - -Project CURSOR where jOOQ finally supports various RDBMS's TABLE, -CURSOR, and REF CURSOR data types. This is especially useful when -those types are returned from stored procedures and functions. -Cursors are simply mapped to jOOQ Result types and can -thus be used like regular table results - -Project EXPORT aims at exporting data from the database in -various serialisable formats, such as XML, CSV, HTML, Text, JSON. -This project will be continued in the future, to also -deserialise from (some of) these data streams. This will allow -for easy transport of jOOQ Result types over the net. - -Project CODEGEN has finally been started. Many improvements -suggested by jOOQ users will be implemented in the next releases. -In this release, important fixes have been made to prevent -compilation errors in generated artefacts. - -Features and improvements -------------------------- -#61 - EXPORT: Add Result.formatXML() -#166 - CURSOR: Add support for ResultSet type returned from - Oracle stored procedures / functions -#411 - Allow for fetching Map (instead of Record) - and List> (instead of Result) -#549 - Add Factory.function() for plain SQL functions -#611 - Simulate RPAD and LPAD in SQL Server, Sybase -#627 - Add support for Postgres FOR UPDATE OF [table-name] clause -#628 - Add support for REPEAT (SQL Server: REPLICATE) function -#637 - Nicely format time in StopWatch logging output -#640 - Simulate Postgres FOR UPDATE OF [table-name] clause in - other dialects -#649 - CURSOR: Add Cursor.fetch(int) .fetchOne() - .fetchResult(int) .fetchResult() -#653 - Add support for MySQL encryption and compression functions -#660 - Clarify Javadoc of UpdatableRecord to explain its - behaviour when changing the main unique key -#669 - EXPORT: Add Result.formatHTML() -#672 - Add convenience method UpdatableRecord.copy() in order to - reset primary key values for a subsequent INSERT -#675 - EXPORT: Add Result.formatCSV() -#683 - Implement ResultImpl.equals() and .hashCode() -#684 - Implement AbstractStore.equals() and .hashCode() -#685 - Add Store.size() to indicate the maximum index of the - Store -#687 - EXPORT: Add result.formatJSON() -#689 - Create separate builds: jooq-core.zip and - jooq-with-dependencies.zip -#690 - CURSOR: Add support for ResultSet type returned from H2 - stored functions -#695 - CURSOR: Add support for ResultSet type returned from - Postgres stored functions -#697 - Add Factory.fetch(String) for executing plain SQL queries - that return results -#701 - Add ResultQuery.fetchArray() and .fetchOneArray to return - Object[][] and Object[] -#704 - Always add top and bottom line in Result.format() -#705 - Right-align numeric values in Result.format() -#716 - Add SUBSTRING function Field.substring(Field, Field) - taking fields as arguments -#719 - Document risk of SQL injection in plain SQL and literal - factory methods -#726 - Add LENGTH function as a synonym for CHAR_LENGTH - -API changes (backwards-compatible) ----------------------------------- -#698 - Inconsistent API with Factory.fetch(Table [,Condition]) - Let method return Result instead of List -#699 - Let Result extend List - -API changes (previous API now deprecated) ------------------------------------------ -#656 - Decrease verbosity of plain SQL methods. They will just be - called Factory.field() .condition() .table() .query() - -Test cases ----------- -#643 - Add integration test for code generation of invalid and - incomplete types in Oracle -#654 - Add integration tests for master data tables with PK types - other than NUMBER/INT -#655 - Add missing integration tests for TRIM function - -Bug fixes ---------- -#450 - Improve plain SQL integrity checks for bind variables -#610 - CODEGEN: Compilation error in generated source code for - databases with table named 'system' -#646 - An empty Java package is generated for an empty PL/SQL - package. This is unnecessary -#651 - CODEGEN: Avoid importing datatypes in generated source - code to prevent collisions -#657 - NullPointerException when creating a Factory with a null - SchemaMapping -#658 - Master data table code generation is broken for tables - with more or less than 3 columns -#662 - Add support for the missing Postgres data type "bpchar" -#663 - Add support for the missing Sybase data type "int" -#664 - Ingres INTEGER data types are not correctly generated -#665 - HSQLDB Datatype CLOB and BLOB are not supported, when - selecting from plain SQL tables -#666 - The evil bug: Ingres TRIM function only executes RTRIM -#673 - UpdatableRecord.store() doesn't work if called after - .delete() -#702 - Add support for the missing SQLite data type "NULL" -#706 - CURSOR: Ensure that Query.execute() runs in a single - transaction when Postgres refcursor is involved in the - query (this fixes a Postgres JDBC driver flaw) -#724 - NullPointerException when passing a single literal null - bind value to plain SQL methods without casting to Object -#729 - DB2, Derby, Ingres, Oracle cannot bind null values in - plain SQL - -Version 1.6.1 - June 19, 2011 -================================================================= - -In this release, the PORTABILITY project has been implemented. -Finally, the SQLDialect has been removed from most generated -artefacts (Schema, Table, Field, Sequence, etc). Also, the -constructing Factory is not referenced by its created QueryParts -anymore, unless this is really necessary (Query objects, UDT's, -ARRAY types). This leads to higher compatibility between schemata -of different databases, e.g. if users want to use an HSQLDB -development and Oracle productive database. - -Unfortunately, this means that the way stored procedures are -called had to be changed. This is an API break that could not be -avoided. The pre-1.6.1 StoredObject.execute(Connection) method -is deprecated and will be removed in the future. It has been -replaced by StoredObject.execute(Configuration) - -In addition to this project, many more window functions are now -supported, as well as the Oracle-specific CONNECT BY clause for -recursive queries. - -Features --------- -#351 - Add support for Oracle ROWID data type -#452 - PORTABILITY: Create a super-set of RDBMS data types -#453 - PORTABILITY: Don't create dialect-specific QueryParts -#455 - Add support for the Oracle CONNECT BY clause -#587 - Add optional OFFSET clause to form LIMIT .. OFFSET - constructs -#589 - Add extended FOR UDPATE [OF ...] [{WAIT n | NOWAIT | SKIP - LOCKED }] support -#591 - Add support for LEAD() OVER() and LAG() OVER() window - functions -#592 - Add support for the CUME_DIST() OVER() window function -#601 - Add Factory.literal() convenience methods -#602 - Add Factory.val() methods to decrease .constant() - verbosity -#604 - Add support for RESPECT NULLS clause in some window - functions -#605 - Add Factory.use(String) for non-generated schemata -#613 - Add PI function -#616 - Add Factory.two() literal convenience method -#630 - Add support for Oracle CONNECT BY pseudo-columns LEVEL, - CONNECT_BY_ISCYCLE, CONNECT_BY_ISLEAF - -API changes ------------ -#299 - PORTABILITY: Create a dialect-independent meta-model -#588 - Add OVER() keyword to FIRST_VALUE() and LAST_VALUE() API - -Test cases ----------- -#368 - Add integration test for use with schema mapping -#586 - Upgrade H2 to 1.3.155 -#607 - Add integration tests for CRUD / SP's / UDT's / ARRAY's - with SchemaMapping -#612 - Add integration tests for LPAD and RPAD functions -#624 - Add integration test for code generation of invalid/ - incomplete views in Oracle -#631 - PORTABILITY: Add integration tests for using Oracle- - generated schema against an HSQLDB database -#638 - Add missing integration test for DECIMAL data type - -Bugfixes --------- -#176 - Stored procedures / functions in EQUIVALENT schemata - cannot be called -#493 - Bind variable mismatch when constructing bad SQL -#594 - Confusing Javadoc in SELECT DSL API -#603 - Fix DB2 'IGNORE NULLS' clause -#619 - SUBSTRING() function is broken in DB2, Ingres, SQL Server -#623 - SQL syntax error for some MERGE queries in SQL Server and - Sybase -#633 - SchemaMapping is not applied to sequences -#634 - Sequences are not escaped in generated SQL - -Version 1.6.0 - June 05, 2011 -================================================================= - -Apart from supporting various additional standard and non- -standard JOIN constructs, there is now also full support for the -SQL standard MERGE statement and MySQL's ON DUPLICATE KEY variant -thereof. A great number of API enhancements have been added, -which improve the usability of jOOQ. The Ingres database is now -also supported. - -Features --------- -#301 - Add support for Oracle execution hints -#409 - Add support for NATURAL JOIN syntax, where RDBMS allows it -#415 - Make fluent API's underlying SelectQuery objects publicly - available -#429 - Add Ingres support -#475 - Document class-level generic types and in Javadoc -#486 - Add support for SQL MERGE clause -#494 - Allow for omitting schema name in generated SQL -#496 - Automatically update IDENTITY values in UpdatableRecord, - after storing them -#520 - Add support for JOIN ... USING syntax -#524 - Upgrade HSQLDB to 2.2 -#533 - Add ORDER BY [Map] or BY [List] functionality -#534 - Add Result.isEmpty() -#535 - Call upon ConfigurationRegistry.provideFor() before - throwing a DetachedException -#536 - Simulate CASE [value] WHEN [value] THEN [result] END - syntax in Derby -#538 - Add some logging to ConfigurationProvider -#539 - Add possibility to negate numeric values with Field.neg() -#541 - Add support for MySQL ON DUPLICATE KEY clause -#542 - Allow for Collection arguments in INSERT's DSL API -#543 - Allow for creating FUNCTION() OVER() without PARTITION BY - or ORDER BY clause -#546 - Add Factory.use(Schema) -#548 - Add new internal type FieldMap -#550 - Simulate ON DUPLICATE KEY INSERT clause in dialects other - than MySQL -#551 - Add TableMapping, similar to SchemaMapping for mapping - tables -#553 - Add Factory.plainSQLQuery -#554 - Add Factory.plainSQLField with a DataType parameter -#555 - Add UpdateXXX.set(Map) convenience methods to DSL API -#557 - Enhance INSERT DSL API to allow for adding VALUES clause - with InsertXXX.set() syntax -#570 - Add support for the RAND() function -#567 - Add support for Ingres Sequences -#572 - Add support for the ATAN2() function -#573 - Add possibility for additional select() clauses for - convenience -#575 - Add support for the FULL OUTER JOIN syntax, where RDBMS - supports it -#576 - Add support for the CROSS JOIN syntax, where RDBMS - supports it -#581 - Enhance API and allow Collection> - instead of Collection> - -API changes ------------ -#397 - Purge deprecated API - -Bugfixes --------- -#481 - Handle case where an empty record is stored -#522 - Misleading Javadoc in generated stored procedures and - function constructors -#532 - Restore Postgres INFORMATION_SCHEMA -#537 - Prevent null from being added to QueryPartList -#540 - Error when TRACE logging Limit -#544 - Aliased elements are not bound correctly when rendered - with toSQLReference() -#559 - Loosen type safety on overloaded methods to prevent - compilation errors with javac/Netbeans -#560 - HSQLDB DataType REAL is configured incorrectly -#565 - Add integration tests for current_user() function -#569 - ORA-01427 when generating foreign key relations -#571 - Field.trim() not correctly implemented for SQL Server -#583 - Accelerate integration tests: Reset schema only if - necessary - -Version 1.5.9 - May 15, 2011 -================================================================= - -This version ships with lots of new functionality. Finally, the -DSL-style API has been extended to CRUD operations (INSERT, -UPDATE, DELETE)! Also, support for the TRUNCATE TABLE statement -has been added. - -The most important new features include the support for SQL:2003 -standard window functions, which are available in most major -RDBMS. Additionally, basic function support has been widely -extended. - -Features --------- -#148 - Added support for window functions -#204 - Add support for multi-record INSERT's -#416 - Added support for retrieval of IDENTITY values -#433 - Use bind variables for LIMIT and OFFSET -#441 - Added foreign key relationship meta information to the - generated source code -#446 - Beautify ResultImpl.toString() method -#461 - Automatically cast CONCAT parameters to Field if - necessary -#463 - Added support for trigonometric functions -#471 - Added support for the sign function -#472 - Added support for GREATEST/LEAST functions -#474 - Added support for "hyperbolic" functions SINH, COSH, TANH, - and COTH -#482 - Added DSL API for INSERT statements -#483 - Added DSL API for UPDATE statements -#484 - Added DSL API for DELETE statements -#485 - Added "Registry" for client code to provide Configurations - to jOOQ Attachables -#490 - Added support for the TRUNCATE TABLE statement -#495 - Generate source code for IDENTITY columns -#501 - Added support for boolean conversion to Result, Record, - and Store -#503 - Allow for schema navigation via generated artefacts -#518 - Let stored procedures reference owner package - if applicable -#525 - Added NULLS {FIRST | LAST} clause to ORDER BY constructs -#528 - Added Factory.getDataType() convenience method -#530 - Added Factory.zero() and Factory.one() convenience methods - -API changes (jooq) ------------------- -#527 - Weakened type-safety on Field.nvl2() -#529 - Deprecated Factory.select(Object...), added .selectOne() - and .selectZero() instead - -API changes (jooq-meta) ------------------------ -#30 - Add ParameterDefinition for stored procedures, instead of - reusing ColumnDefinition -#499 - Add reference to TableDefinition in ColumnDefinition -#500 - Add AttributeDefinition for UDTDefinition, instead of - reusing ColumnDefinition - -Bug fixes ---------- -#369 - Adapt H2 relations generation to H2's correction of - information_schema.cross_references -#435 - Added integration tests for NESTED SELECTs holding LIMIT - clauses -#460 - Syntax error when using a field with a reserved name -#462 - Fixed Javadoc broken links -#473 - Don't cast when cast is unnecessary -#479 - INSERT statement should not set all fields for a table -#497 - Derby referential code generation is broken, for named - foreign keys -#498 - Oracle package content is generated in arbitrary order -#502 - Syntax error when creating an empty IN condition -#526 - Corrected Javadoc in Field.coalesce() - -Version 1.5.8 - April 29, 2011 -================================================================= - -Finally, jOOQ now supports two important new RDBMS: -SQL Server and Sybase! - -Apart from this great enhancement, there is now also full support -for the non-SQL standard LIMIT clause, even in dialects where the -LIMIT clause is not supported natively (especially Oracle, but -also DB2, SQL Server and Sybase, which have limitations). jOOQ -simulates LIMITs by rendering nested selects filtering on ROWNUM -(Oracle) or on ROW_NUMBER() (DB2, SQL Server and Sybase). - -Other interesting additions are an increasing support for native -mathematical functions. More function support will be added in -future versions. - -Features --------- -#16 - Added support for SQL Server -#21 - Uniform implementation of the LIMIT clause. Implemented - LIMIT clause simulation through analytic functions, where - LIMIT is not supported natively -#97 - Added support for Sybase -#418 - Measure time of various steps in source code generation -#420 - Added support for proprietary SQL extensions "FOR UPDATE" - and "FOR SHARE" -#431 - Added additional statistics to generation log files -#432 - Unified the various "standard" ANSI INFORMATION_SCHEMA - implementations in the jooq-meta artefact -#436 - Added support for the modulo function -#438 - Added floor and ceil functions -#439 - Added support for mathematical functions (logarithms, - exponentials, sqrt) -#447 - Enhanced Field.add() and Field.subtract() to work for date - time fields, also - - -API changes ------------ -#428 - Created new Maven artefact jooq-meta to cleanly separate - database meta-data navigation from code generation -#458 - Decreased DSL verbosity for arithmetic operations and for - ordering - -Bug fixes ---------- -#417 - Restored warning when unknown column type is encountered - in source code generation -#419 - Corrected misleading Select.fetchOne(...) Javadoc -#421 - Optimised AbstractRecord's memory consumption -#448 - Corrected some Javadoc @see links -#449 - Changed Field.concatenate() to accept Field parameters - to avoid generic varargs warnings - -Version 1.5.7 - April 17, 2011 -================================================================= - -This is the first release built with support of Maven thanks to -the help of some jOOQ users! - -The main new features in this release are the improved support -for serialisation/deserialisation of jOOQ objects through use of -the newly introduced "Attachable" interface. - -If using log4j or the newly supported slf4j logging framework -in debug/trace mode, there is the possibility to log query -building/execution time statistics. - -Apart from these new features, fixes were mainly done in the -fields of type casting, HSQLDB 2.1 upgrade support, stored -procedures with OUT, IN/OUT parameters. Please upgrade, if you -are using any of those features. - -If you extend jOOQ as a base implementation for source code -generation, be aware of the fact, that the jOOQ-codegen is -currently undergoing major changes. Expect the code generation -API to stabilise again in one of the next releases. - -Features --------- -#104 - Added maven dependency -#248 - Integrate UDT types with ARRAYs -#295 - Allow for attaching/detaching UpdatableRecords to/from - Configurations -#359 - Added statistics measurement to Query execution for debug - log level -#362 - Added deprecation configuration flag -#364 - Document unknown type in generated source code -#373 - Improve exception handling in code generation -#378 - Added support for Oracle stored functions with OUT - parameters -#382 - Added Factory.attach() methods to re-attach deserialised - Attachables -#394 - Add logging support for SLF4J -#398 - Allow to provide a DataType in Factory.constant() -#399 - Provide access to TypeUtils.convert() methods via DataType -#404 - Added trace logging for measuring the speed of various - query execution steps - -API changes ------------ -#358 - Enhanced DSL API to allow for HAVING clauses without - GROUP BY clauses -#367 - Make Store, Result, QueryPart "Attachable" -#374 - Introduce strategy pattern to code generation for future - support for advanced naming schemes -#375 - Decouple Database from Generator -#381 - Made DataType Serializable -#384 - Deprecated singleton QueryParts -#388 - Unify "internal" API using an Adapter pattern - -Bug fixes ---------- -#187 - Protect generated Record navigation methods against name - clashes -#266 - Added more thorough integration tests for dialect-specific - casting (including some fixes related to varchar types) -#360 - Added more integration tests for the DISTINCT clause -#361 - Add more checks in testInsertUpdateDelete() -#366 - Warn only once per ColumnDefinition, if a data type is - unknown -#377 - NullPointerException when generating invalid stored - function -#380 - Added integration tests to check for proper - serialisability -#386 - Fixed incompatibilities with HSQLDB 2.1.0 -#387 - Fixed unnecessary imports in some Oracle generated - Records -#389 - Fixed javac compiler warning in AbstractStoredObject -#391 - Cannot properly call stored procedures when IN/OUT - parameter is bound to NULL -#392 - Procedures with several OUT parameters may not register - OUT parameters correctly -#410 - Passing null VARRAY values to Oracle stored procedures - causes issues -#412 - limit(int) sets default offset incorrectly in some - dialects - -Version 1.5.6 - March 31, 2011 -================================================================= - -This release consists mainly of code generation bug fixes and -minor API improvements and enhancements. - -The most important improvement is ticket #90, by which lazy -fetching and iteration over data is now supported. jOOQ lets you -keep a reference to a Cursor that has an open JDBC ResultSet, to -fetch data from on-the-fly. - -A few major code generation bugs were reported where the -generated code may cause ambiguity due to an inconsistent API. -This means that you will have to re-generate your schema after -upgrading to version 1.5.6. Some of your code may not compile -anymore, after this upgrade. - -Features --------- -#90 - Added possibility for lazy fetching of data -#208 - Added convenience methods for direct invocation of - sequences' currval() and nextval() attributes -#212 - Created one factory per dialect for better separation of - dialect-specific support -#213 - Generate a factory for each schema -#251 - Opened up base implementations for Field and Condition - to allow for custom implementations by client code -#274 - Integrate H2 ARRAY types with stored procedures -#292 - Documented usage of log4j and java.util.logging -#306 - Added support for the NULLIF function -#319 - Added Field.between(Field, Field) method -#320 - Added trace logging for variable binding and SQL - generation methods -#323 - Added Field.in(Field...) method -#325 - Include release version number in delivered .jar files -#328 - Improved configuration setup documentation page -#333 - Let Result implement Serializable -#334 - Added fetchMap() convenience methods -#335 - Added more functions and aggregate functions examples to - documentation -#338 - Visually improve code generation logging -#339 - Removed skipping of unreferenced UDT's, ENUM's and ARRAY's -#342 - Improved generated referential code by using fetch() and - fetchOne() API -#356 - Let UpdatableRecord.store() and delete() return an int - to indicate whether the record was actually modified - -API changes ------------ -#233 - Allow for joining TableLike instead of Table -#337 - Added generic type > to - InsertSelectQuery -#341 - Fixed API flaw where SelectOnConditionStep.and() methods - and similar ones returned SelectConditionStep, instead of - SelectOnConditionStep - -Bugfixes --------- -#69 - Corrected referential code generation for foreign keys - that reference non-primary unique keys -#85 - Corrected referential code generation for multi-field - foreign keys -#121 - Covered more Factory.executeXXX() methods with integration - tests -#318 - Fixed NullPointerException when executing SELECT * from - aliased tables -#321 - BetweenCondition does not bind left hand side Field - correctly -#322 - InCondition does not bind left hand side Field correctly -#326 - Avoid method overloading where binding to Object - may lead to compile-time ambiguities (with javac) -#343 - Add more foreign key navigation method integration tests -#347 - Add explicit integration tests for schema artefacts - excluded from code generation -#350 - Disambiguate navigation methods if several foreign keys - reference the same entity -#352 - Disambiguate navigation methods if a table ending on S - references itself -#353 - Added integration test for compilation of generated - artefacts with javac (as opposed to the Eclipse compiler) -#355 - Error when storing an UpdatableRecord that has no changed - values - -Version 1.5.5.2 - March 15, 2011 -================================================================= - -A critical bug was reported from the 1.5 release stream where -stored functions did not render their parameters in correct order - -Features --------- -#302 - Map Oracle's NUMBER data type to java.lang.Number in - stored procedures, stored functions - -Bugfixes --------- -#317 - StoredFunctionImpl.asField() renders parameters in wrong - order - -Version 1.5.5.1 - March 13, 2011 -================================================================= - -In version 1.5.5, there was a fatal bug breaking Derby source -code generation. Only the Derby dialect is affected. Please -update immediately, if you are using jOOQ's Derby integration - -Bugfixes --------- -#315 - Generated master data records are not sorted by PK -#316 - Derby code generation fatally broken - -Version 1.5.5 - March 12, 2011 -================================================================= - -This version is released early as there are some important -bugfixes. Additional improvemetns include: - -- Improved DSL related to conditions in HAVING and JOIN clauses -- Support for Oracle-style functions, such as NVL, NVL2, COALESCE - DECODE, etc - -Features --------- -#304 - Add support for Oracle NVL function -#305 - Add support for COALESCE function -#308 - Add support for Oracle NVL2 function -#311 - Add support for Oracle DECODE function - -API changes ------------ -#223 - Enhance DSL to accept and(), or() and similar methods in - JOIN steps -#224 - Enhance DSL to accept and(), or() and similar methods in - HAVING steps - -Bugfixes --------- -#297 - Fixed Factory.concatenate() function -#298 - Added integration tests for nested selects in HAVING - clause -#300 - Added integration tests for nested selects in JOIN clause -#303 - Javadoc correction -#307 - Accelerated integration tests -#309 - Fixed JDBC variable binding issue related to Conditions - where the lhs is a function (e.g. stored function) and the - rhs is a constant -#310 - Fixed issue where fetchOne() methods throw - NullPointerException if no result record is available -#312 - Fixed issue where Field.equal(...) methods rendered - unexpected SQL when rhs null is cast to a type -#313 - Fixed Derby cast type for VARCHAR -#304 - Let the DerbyDataType default for java.lang.String be - VARCHAR, not LONG VARCHAR - -Version 1.5.4 - March 04, 2011 -================================================================= - -Feature #243 required a minor API change in the base classes of -generated source code. This means you have to re-generate all -your jOOQ artifacts in order to migrate to 1.5.4. The artifacts -themselves should be regenerated in a compatible way, such that -your client code should not be affected. If this is not the case, -please report a ticket here: - - https://github.com/jOOQ/jOOQ/issues - -Apart from the Derby RDMBS and some new data type support, there -have been many new convenience methods added all over the API. -For instance, if type-safety is not really a requirement, there -are lots of possibilities to use plain SQL directly in the DSL. -In that case, data can be accessed from Record, Results, not only -through Field, but also through field names or indexes. - -Check out the updated documentation (soon) here: - - http://www.jooq.org - -- Support for the Derby RDBMS -- Support for casting. This allows for even greater flexibility - in cases where jOOQ cannot 100% ensure type-safety -- Support for ARRAY types. Oracle, Postgres, HSQLDB and H2 ARRAY - types are now supported natively as regular bindings in - jOOQ's Field -- Support for dialect-specific data types. CHAR, VARCHAR, CLOB - are no longer treated equally as java.lang.String. Their - type heritage is also generated -- More sequence support -- Lots and lots of bug fixes - -Features --------- -#95 - Support for the Derby RDMBS -#163 - Add support for JDBC type ARRAY (with Postgres) -#209 - Add support for DB2 sequences -#210 - Add support for H2 sequences -#211 - Add support for HSQLDB sequences -#215 - Support for SQL casting using as cast type -#246 - Support for SQL casting using dialect-specific data types -#254 - Add HSQLDB support for ARRAY types -#256 - Add Oracle support for VARRAY types -#257 - Integrate ARRAY types with stored procedures -#261 - Add a global type mapping to the generated Schema object -#267 - Add DataTypeDefinition for further abstraction of data - types in code generation -#269 - Add H2 support for ARRAY types -#290 - If log4j is not on the classpath, use java.util.logging - instead, as fallback - -API Changes ------------ -#156 - Allow for results to be accessed by index, not by field -#218 - Corrected bad method signature: - Record.getValueAsLong(Field, Integer) -#219 - Extended Result and Select API's to be more similar to - that of Record -#232 - Add more convenience plain SQL support to the API -#235 - Add convenience methods to Record, Result and Select for - access of data via field name -#243 - Refactor DataType implementations in order to allow for - the use of generics -#259 - Add field type to database meta data (ColumnDefinition) -#260 - Add field type to database meta data (Field) -#262 - Add default behaviour for Record.getValue(Field) -#276 - Add Javadoc as a ZIP file to the jOOQ distribution - -Bugfixes --------- -#125 - Add more plain SQL integration tests -#191 - Add more integration tests for nested unions -#205 - Implemented workaround for handling Postgres stored - functions with UDT OUT parameters -#214 - Fixed NPE when generating a stored function with an - unknown parameter type -#216 - Fixed some cases where binding of BigInteger is not done - correctly -#220 - Syntax error when using select statement in a CASE clause -#221 - Corrected integration tests for combined update and - select statements -#222 - Added integration test for INSERT statements having - nested SELECT statements for their fields -#225 - Correctly cast array types in Postgres -#230 - Potential misuse of Blob and Clob in H2's JDBC types -#239 - Factory.fetchAny() is not implemented for SQLite -#244 - Fixed peculiar MySQL casting support where cast types do - not match any data types -#245 - Fixed NPE when reading null dates in SQLite -#249 - Added ARRAY type integration tests -#255 - Stored procedure bind variables get mixed up when any - argument is null -#263 - Correctly handle Postgres function overloading -#264 - Ambiguous funciton calls when calling overloaded functions - with null parameter -#281 - Handle compilation errors when generating stored - procedures with > 254 parameters -#283 - Fixed compilation errors in generated source code for - Oracle's UDT table type -#284 - Fixed compilation errors in generated source code for - Oracle procedures in packages, when they have no - parameters -#285 - Fixed compilation errors in generated source code for - Oracle tables with the same name in different schemata -#286 - Fixed name collisions in generated objects with the - java.lang.* package -#288 - Prevent the creation of UNION queries with bad syntax - in MySQL -#289 - Correctly alias fields within UNION queries for some - dialects, which then only require the "AS" keyword -#291 - Cannot create an aliased field called "year" in Postgres - -Version 1.5.3 - January 13, 2011 -================================================================= - -- Lots of stored procedure support was implemented -- Support for sequences was added -- The final decision to postpone support for DB2 UDT's was made -- Some code generation bugfixes - -Features --------- -#36 - Added stored procedure / stored function support for HSQLDB -#140 - Added support for Oracle sequences -#147 - Added support for H2 stored functions -#162 - Correctly integrate UDTs with stored procedures -#170 - Added support for Postgres stored functions -#186 - Added support for more Oracle PL/SQL simple data types -#193 - Simulate support for H2 "stored procedures" -#195 - Simulate support for Postgres "stored procedures" -#206 - Added support for Postgres sequences - -API changes ------------ -#180 - Improved DSL for constant values -#181 - Allow for referencing Field in function argument list -#189 - Renamed convenience methods in org.jooq.Record -#207 - Add fetchOne(Field) method to org.jooq.Select API - -Bugfixes --------- -#182 - Protected generated Record classes against clashes with inherited methods -#183 - Fixed NullPointerException, when generating master data tables with - NULL fields -#184 - Fixed IllegalArgumentException, when a data type is present in the - schema, but unavailable in code generation logic -#185 - Code generation should not fail when single elements cannot be generated -#188 - Improved integration tests for stored procedures / functions / packages -#196 - Increase RDMBS version compatibility by avoiding "SELECT *" in code - generation logic -#199 - Added integration tests for stored procedures in RDBMS that do not - support OUT parameters -#201 - Fixed issue in DB2 where stored procedures without parameters were not - generated. -#202 - Added integration tests for stored procedures / functions without - parameters - -Version 1.5.2 - December 27, 2010 -================================================================= - -- Improved support for stored procedures, also in packages -- A minor API change was inevitable to implement #173. The API change only - concerns the INTERNAL API. Deprecation marks are added and deprecated items - will be removed in 1.6.0 -- Experimental SQLite database support -- Some important bug fixes - -Features --------- -#25 - Added support for Oracle packages -#114 - Added support for Oracle UDTs -#145 - Added support for the SQLite database -#150 - Generate static convenience methods for stored procedures / functions -#151 - Generate static convenience methods for stored function fields -#152 - Generate meaningful serialVersionUID in generated classes -#173 - Added support for EQUIVALENT schemata - -API changes ------------ -#159 - Added convenience method List getValues(Field) to Result -#165 - Added convenience methods for creating EXISTS clauses -#169 - Improved DSL for WHERE clauses - -Bugfixes --------- -#68 - Prevent issues originating from overloaded stored procedure names, - generating identical Java class names -#153 - Fixed issue with generated code for DB2 stored functions -#154 - Fixed issue with generated code for DB2 stored functions -#155 - Fixed issues with database NULL not being mapped correctly to Java NULL - when selecting values that have a primitive type (int, long, etc) -#158 - Potential ClassCastException when using Field -#171 - Corrected issue related to selection of default schema in DB2 -#177 - Fixed issue related to generated code for tables or UDTs without columns - - -Version 1.5.1 - December 13, 2010 -================================================================= - -- H2 database support thanks to Espen Stromsnes -- Improved stored procedure support - -Features --------- -#96 - Added H2 database support -#101 - Added stored procedure / stored function support for Oracle -#138 - Added stored procedure support for DB2 -#146 - Added support for DB2 functions - -API changes ------------ -#143 - Added convenience methods to Record - -Bugfixes --------- -#84 - Implemented referential code generation for foreign keys that do not - match their primary keys' types -#141 - Encoding problem in generated master data classes - -Version 1.5.0 - November 22, 2010 -================================================================= - -- A big one. Major API changes / improvements -- Added lots of convenience methods -- UDT support -- Enum support -- DB2 support thanks to Espen Stromsnes -- "Light" dependency to log4j added. jOOQ will still run without it - -Features --------- -#1 - Create support for UDTs (so far only for PostgreSQL) -#15 - Added DB2 support -#60 - Added support for nested selects in INSERT and UPDATE - statements -#83 - Added log4j logging to code generation and runtime -#87 - Add support for arithmetic expressions -#105 - Added support for ENUM data types, where applicable - (MySQL and PostgreSQL so far) -#110 - Added execute and fetch convenience methods -#111 - Added missing "select distinct" support -#122 - Annotate generated classes with javax.annotation.Generated -#123 - Generate user enum fields from data values (master data) -#124 - Added PlainSQLTable -#127 - Added not() operator to Condition -#135 - Added convenience methods andNot() and orNot() in - Condition - -API changes ------------ -#89 - Removed support for DataSource. jOOQ is not a transaction - manager -#92 - Added SortField type to be used for sorting -#99 - Provide better access to functions (No more FunctionFactory) -#116 - Merge Manager functionality into Factory -#118 - Improve API of org.jooq.Field -#119 - Improve subquery condition API -#132 - Reduced much of the select query API -#134 - Better separation of SelectQuery and SimpleSelectQuery - -Bugfixes --------- -#109 - Error when executing select * if generated schema does not - match actual schema -#115 - Fix various "null" pseudo field issues -#126 - Error when selecting a single field from a union nested - select -#129 - Fixed performance issue in Oracle code generation for - very large databases - - -Version 1.4.4 - November 22, 2010 -================================================================= - -Unreleased version, fixes included in 1.5.0 - -Bugfixes --------- - -#133 - JoinCondition does not take comparison operator - -Version 1.4.3 - October 25, 2010 -================================================================= - -Some more bugfixes - -Bugfixes --------- - -#71 - Generated code does not compile, when foreign key and - primary key have a data type mismatch -#73 - In Oracle generated code, multi-field foreign keys may - generated bad relations code -#82 - Conversion of literals to camelcase fails if numbers are - involved - -Version 1.4.2 - October 22, 2010 -================================================================= - -Various bugfixes and minor improvements - -Features --------- -#66 - Add support for CASE or DECODE expression - -API changes ------------ -#77 - Functions should not extend FieldImpl, but a new - AbstractField -#78 - QueryPart pollutes declared method space of its - implementations. Hide it by indirection - -Bugfixes --------- -#64 - Code generation fails when foreign key references a unique - key that is not the primary key. Code generation for these - cases is omitted -#67 - When loading properties files, a leading / seems to be - mandatory. This is preventing users from correctly setting - up jOOQ the first time -#70 - Add support for Oracle datatype TIMESTAMP(6) -#72 - Name clashes in generated Tables -#75 - Constant does not bind its values. -#76 - Constant should not render strings all the time -#79 - Constants are not properly escaped -#80 - Position function does not bind any variables -#81 - Add cast function to Constants in HSQL - -Version 1.4.1 - October 18, 2010 -================================================================= - -Oracle patch release - -Features --------- -#63 - Generate referential functionality for Oracle - -Version 1.4.0 - October 17, 2010 -================================================================= - -Support for PostGreSQL was added. -Added lots of OR-mapping functionality. -There is a general API change due to various new features. - -Features --------- -#14 - Add PostGreSQL support -#40 - Resolve foreign keys. Allow for navigation between objects. -#42 - Add PlainSQLField -#45 - Add "dirty" flag to Record's values. This allows for - updating only relevant data. -#47 - Complete implementation for UPDATE, INSERT, DELETE - statements. Added some missing functionality. -#48 - Add more support for Date, Time, Timestamp fields. -#51 - Add a org.jooq.impl.Manager class that provides common - utility methods for CRUD operations - -API changes ------------ -#10 - Add second generic type . This is a - prerequisite for many OR-mapping features -#18 - Use org.jooq.Record in InsertQuery and UpdateQuery -#46 - Create UpdatableRecords as a prerequisite for JPA and true - OR-mapping. These records support store() and delete() - methods -#52 - Add default constructor in generated Records. -#53 - Add refresh functionality to UpdatableRecords. See also #46 -#54 - Add a state to the factory class -#56 - Reduce API, remove unnecessary Condition subinterfaces -#57 - Reduce API, remove unnecessary QueryPart interfaces - -Bugfixes --------- -#49 - NullPointerException when generating relations on schema - subset -#58 - Count function renders bad SQL in various dialects -#59 - Exception when selecting unaliased functions in queries - -Version 1.3.0 - August 24, 2010 -================================================================= - -Support for HSQLDB was added. -There is a major API change due to #44. - -Features --------- -#29 - Generate primary keys and foreign keys in Oracle code - generation -#34 - Add support for HSQLDB -#39 - Generate primary keys and foreign keys in HSQLDB code - generation -#41 - Add documentation to QueryFactory and Functions - -API changes ------------ -#23 - Add support for more advanced joins -#32 - Merge SelectQuery and ResultProviderQuery interfaces -#44 - Let Query methods return "this" - -Bugfixes --------- -#35 - Add unit tests for HSQLDB support -#37 - Syntax error in combined select queries! - The usage of combined queries in MySQL may still be a bit - awkward. Keep an eye out for further fixes -#43 - Join with aliased tables doesn't work - -Version 1.2.0 - August 21, 2010 -================================================================= - -The added Oracle support is now unit tested and more stable. -The Oracle NUMBER data type is mapped more precisely to Java -types. - -Features --------- -#12 - Model primary keys and foreign keys in generated code -#22 - Improve mapping of Oracle NUMBER data type -#26 - Add Plain SQL QueryParts -#27 - Add support for HAVING clause - -Bugfixes --------- -#24 - Add Unit tests for oracle database (and fixed bugs) -#31 - Pull up addOrderBy() methods from SelectQuery to - ResultProviderQuery - -Version 1.1.0 - August 17, 2010 -================================================================= - -The main new feature is the Oracle support. Wait for -Version 1.1.1 for that support to be stabilised, as there are no -Oracle unit tests running against an Oracle database yet. - -Features --------- - -#2 - Add support for inner / nested selects -#3 - Add more function support -#4 - Implement filtering functionality for code generation -#6 - Add Oracle Support -#9 - Create true POJO's (implementing org.jooq.Record) with - getters and setters -#17 - Make org.jooq.impl.Parameter independent of Field - -Bugfixes --------- - -#11 - Code generation does not remove files - -Version 1.0.1 - August 14, 2010 -================================================================= - -Features --------- - -#5 - Prevent code regeneration, if no changes were made -#7 - Implement ant task for code generation - -Version 1.0.0 - August 14, 2010 -================================================================================ -Initial Release \ No newline at end of file diff --git a/jOOQ-website/inc/RELEASENOTES-2.3.txt b/jOOQ-website/inc/RELEASENOTES-2.3.txt deleted file mode 100644 index 592a2f7b02..0000000000 --- a/jOOQ-website/inc/RELEASENOTES-2.3.txt +++ /dev/null @@ -1,2663 +0,0 @@ -jOOQ Release notes -================== - -For an interactive overview, see also -http://github.com/jOOQ/jOOQ/issues - -For a formatted text version, see -http://www.jooq.org/notes.php - -For a text version, see -http://www.jooq.org/inc/RELEASENOTES.txt - -Version 2.3.3 - August 28, 2012 -================================================================= - -This is a minor patch release with some useful fixes for the 2.4 -branch - -Bug fixes ---------- -#1537 - Factory.batchStore() renders bad SQL for Postgres. The - RETURNING clause is not allowed in batch INSERTs -#1556 - Add javax.validation API to full deliverable -#1572 - Use Thread.currentThread().getContextClassLoader() to - load ExecuteListener classes as a workaround for - experienced class loading problems when using OSGi -#1650 - jOOR fix #16: Can't call Reflect.create(A, B, null) -#1660 - Factory.renderContext().castMode(CastMode.NEVER) - .render(query) doesn't work. CastMode is not applied -#1667 - Bad variable binding when NULLS FIRST, NULLS LAST is - simulated in SQL Server and other databases -#1673 - Result.formatXML() and Result.intoXML() do not render - namespaces correctly -#1693 - Cannot bind UDT values from other schemata to stored - procedures -#1632 - Improve the performance of various DefaultRenderContext - methods, by locally caching Settings values locally - -Version 2.3.2 - June 3, 2012 -================================================================= -This is a minor patch release with some useful fixes for the 2.3 -branch - -Bug fixes ---------- -#1441 - Performance issue with AbstractDataType.convert(Object). - Avoid conversions when they're obviously unneeded -#1449 - Generate some meaningful Javadoc into the generated - [schema-name]Factory classes -#1454 - Add line breaks to generated Javadoc where appropriate -#1465 - Custom generator strategy's printImplements() is called - with Mode == RECORD for tables -#1483 - Inefficient cloning of default settings using JAXB - unmarshalling leads to non-negligible overall overhead. - Use serialisation instead (short of a useful XJC clone - plugin) -#1478 - Caching SQLDialect in AbstractDatabase heavily improves - code generation performance -#1490 - Compilation error when a SQL Server stored procedure has - a parameter named "value" -#1493 - Bad syntax for SELECT /*+hint*/ DISTINCT ... in Oracle -#1515 - Splitting of large NOT IN conditions is wrong. The parts - should be connected with AND, not with OR - -Version 2.3.1 - May 11, 2012 -================================================================= -This is an important patch release fixing some regressions in the -code generator for the Postgres dialect. With 2.3.0, it was no -longer possible to generate schemata of which the database user -was not the owner. - -Bug fixes ---------- -#1334 - Fix inaccurate simulation of TRUNC(number, decimals) for - Derby -#1403 - Documentation bug: ctx.statement() can be replaced in - executeStart(). This is not documented -#1406 - Compilation errors in generated source code when Postgres - stored procedure parameter is called "NAME" -#1407 - Compilation errors in generated source code when Postgres - data-type is "any" (with quotes!) -#1409 - Postgres code generation broken when not connecting with - the owner of a schema - -Version 2.3.0 - May 6, 2012 -================================================================= - -This is a minor feature increment release, featuring many useful -API enhancements, some new functions, some new syntax support -elements, improved source code generation and a lot of -improvements on the jOOQ Console, thanks to Christopher Deckers. - -The updated jOOQ Console now allows for filtering incoming -statements directly on the server side, using regular expression -filters on statement text and other features. These improvements -are a part of a general strategy to introduce breakpoints and -more sophisticated debugging capability to the jOOQ Console. - -Features and improvements -------------------------- -#597 - Add support for Oracle KEEP (DENSE_RANK FIRST...) - aggregate function clause -#910 - Add ExecuteListener extension to allow for overriding - exception translator to handle vendor-specific error - codes -#1286 - Add "renderSchema" flag to Settings, to completely - disable rendering of schema names -#1293 - Generate setter methods for JAXB annotated configuration - properties -#1295 - Add support for MySQL's INSERT IGNORE clause -#1296 - Simulate the FOR UPDATE clause for SQL Server, CUBRID, - using JDBC's ResultSet.CONCUR_UPDATABLE -#1302 - Add Factory.inline() to allow for flagging inline-only - "bind values" -#1303 - Add connection-less Factory constructors for convenience, - when jOOQ is only used as a SQL query builder -#1304 - Add option to generate JSR-303 @NotNull and @Size - annotations to generated POJO's -#1307 - Let HSQLDB dialect render NVL2() as NVL2() instead of - CASE expression -#1312 - Allow for omitting , and generate all - available schemata in that case -#1315 - Let generated factories use their associated Schema as - the Settings' RenderMapping's defaultSchema -#1319 - Move jooq-spring's FactoryProxy to the core jooq project -#1322 - Add Factory.dateAdd() and timestampAdd() for convenience -#1327 - Add DataType.isLob() -#1328 - Add Field inline(char), inline(Character), - inline(CharSequence) for convenience -#1333 - Add support for the Oracle TRUNC function, for numeric - arithmetic -#1336 - Let Record.into(Class) and similar methods accept - "immutable" classes, i.e. setter-less classes that take - several constructor arguments -#1340 - Use Constructor.setAccessible(true), if no default - constructor is available on the target type of - Record.into(Class) -#1342 - Improve Javadoc on Factory.function(). Document arguments -#1349 - Add support for the CUBRID Click-Counter INCR() -#1352 - Allow for creating syntax-error and SQL-injection safe - qualifiers for org.jooq.Field and org.jooq.Table -#1361 - Add Factory.batchStore(TableRecord...), to allow for - batch UPDATE/INSERTs of many records -#1367 - Make configured ExecuteListeners default constructors - accessible -#1366 - Let org.jooq.Batch extend Serializable -#1378 - Upgrade internal jOOR dependency to jOOR 0.9.3 -#1379 - Upgrade internal jOOU dependency to jOOU 0.9.1 -#1390 - Add RenderContext.qualify() to indicate whether - QueryParts should render qualified versions of themselves - or not - -Features and improvements (jOOQ Console) ----------------------------------------- -#1242 - Upgrade jOOQ Console dependency on RSyntaxTextArea from - 1.5 to 2.0.2 -#1249 - Allow for filtering incoming statements in jOOQ Console -#1393 - Implement a communication protocol between Console server - types and Console client types to allow for more - sophisticated functionality - -API changes (backwards-compatible) ----------------------------------- -#1310 - Deprecate Factory.literal() in favor of Factory.inline(), - and Factory.field() -#1368 - Promote AbstractQuery.isExecutable() to the public API - -Bug fixes ---------- -#989 - INSERT and UPDATE statements always render non-qualified, - escaped field names. This may cause trouble when using - plain SQL fields -#1109 - Standalone TABLE or VARRAY types are not correctly - initialised before referencing tables load them -#1279 - NullPointerException when leaving empty -#1283 - The LIKE escape character needs escaping, too, in - contains(), startsWith(), endsWith() -#1306 - Add missing INTERVAL data types to HSQLDBDataType -#1308 - Oracle's DataTypeDefinition reports the length of a BLOB - / CLOB data type to be 4000 -#1313 - and match only table names, not - fully qualified names -#1323 - Add support for byte[] in Postgres UDTs -#1324 - Code generation error in Oracle 10g when generating - stored procedures -#1326 - Error when deserialising BLOBs from Oracle UDTs -#1329 - NullPointerException when passing null to - timestampDiff(Field, Field) -#1343 - Regression in insertInto(...).values(...). Cannot pass - Field to values() -#1344 - Initialise Result ArrayLists to their expected size, if - that size is known. -#1360 - jOOR issue 12: "Don't reset the accessible flag to false, - if setting it to true is required, to avoid race - conditions in concurrency contexts" -#1371 - Missing conversion when using unsafe Field types in - BATCH statements -#1376 - Oracle UDTs in REF CURSORs are not deserialised correctly - from procedure OUT parameters -#1377 - Oracle UDTs are not deserialised correctly when the same - UDT name is present in multiple schemata -#1394 - NullPointerException when omitting element in - code generation configuration - -Version 2.2.1 - April 12, 2012 -================================================================= - -This is a minor patch release, fixing some issues related to the -code generation of the new CUBRID integration as well as other, -minor issues. Upgrade if you're using CUBRID - -Bug fixes ---------- -#1287 - Remove oracle.sql dependency also from OSGi information - in pom.xml -#1288 - SQL syntax errors from sequences when using RenderMapping - with defaultSchema -#1289 - DefaultBindContext logs as Util.class -#1297 - Compilation error in CUBRID generated artefacts - referencing OBJECT types -#1298 - Avoid source code generation errors when generating code - for unknown, dialect-specific data types - -Version 2.2.0 - April 09, 2012 -================================================================= - -Finally, jOOQ has added support for another database, and a very -promising one, that is. http://www.cubrid.org is a surprisingly -original mixture of a relational and object-oriented database -where tables and classes are synonyms, so are records and -instances. The CUBRID database has a high level of compatibility -with MySQL and is aimed at MySQL users wanting more performance -for their web applications. For details, see the slides here: - -http://www.slideshare.net/cubrid/growing-in-the-wild-the-story-by-cubrid-database-developers - -jOOQ is proud to have become a CUBRID partner, looking forward -to further cooperation with CUBRID in the near future. - -Apart from that, jOOQ now fully supports SQL standard INTERVAL -data types. With JDBC and JPA lacking official support for this, -jOOQ aims for becoming the tool of choice for vendor-specific -date time arithmetic. True INTERVAL data type support is given in -HSQLDB, Ingres, Oracle, Postgres databases. Besides that, CUBRID -and MySQL support INTERVAL data type arguments in functions. In -other dialects, jOOQ simulates DATEADD(), TIMESTAMPADD(), -DATEDIFF(), TIMESTAMPDIFF(). - -For jOOQ's OLAP friends, there is now also support for the Oracle -LISTAGG function (LIST() in Sybase, XMLAGG() in DB2, STRING_AGG() -in Postgres, GROUP_CONCAT() in CUBRID, H2, HSQLDB, MySQL). -LISTAGG is an "ordered aggregate function", meaning that the -aggregation is done using a specific ordering. Keep an eye out -for more such function support in future versions. - -Features and improvements -------------------------- -#566 - Add support for INTERVAL data types -#585 - Add support for DATE, TIME and INTERVAL arithmetic -#1183 - Add support for DEFAULT values in Oracle stored procedure - parameters -#1243 - Let generated POJOs (and Records) extend base classes - and implement interfaces -#1252 - Avoid JDBC escape syntax for Oracle stored procedure - calls. Generate PL/SQL syntax, instead -#1255 - Let generated Tables contain a public default constructor - to be able to extend those classes - Github issue #12 -#1257 - Add CUBRID support -#1268 - Add Factory.field(String, QueryPart...) to generate - custom clauses -#1269 - Add YEAR(), MONTH(), DAY(), HOUR(), MINUTE(), SECOND() - function support as shortcuts for EXTRACT() -#1273 - Simulate GROUP_CONCAT() aggregate function using Oracle's - LISTAGG() function, where available -#1274 - Add support for the Oracle LISTAGG(...) WITHIN GROUP - (ORDER BY ..) [ OVER (..) ] aggregate / analytic function -#1275 - Simulate Sybase LIST() aggregate function using Oracle's - LISTAGG() function -#1276 - Simulate Oracle's LISTAGG() in DB2 using XMLAGG(), - SUBSTR() and CONCAT() -#1278 - DEBUG log both executed SQL and SQL with inlined bind - values - -API changes (backwards-compatible) ----------------------------------- -#1262 - Pull up OracleFactory.prior() and other CONNECT BY - related methods to Factory - -Bug fixes ---------- -#1241 - Wrong variable binding when comparing CHAR columns in - Derby and DB2 without explicit casting to VARCHAR -#1244 - Cannot override class name in GeneratorStrategy in - Mode.POJO -#1248 - Setting both false and - true leads to compilation errors -#1256 - Fixed code generation issue with H2 user defined - functions returning VARCHAR -#1263 - Pass fetchsizes <= 0 to the JDBC driver (for vendor- - specific MySQL compatibility) -#1270 - Most databases allow for multiple identical foreign keys. - This leads to compilation errors in generated source code - -Version 2.1.0 - March 18, 2012 -================================================================= - -With this version, jOOQ attempts to follow versioning rules -imposed by semantic versioning: http://semver.org/ -There will be 1 minor release per month, and a couple of patch -releases per year, depending on popular demand - -The main improvements for this release include - -- The possibility of providing jOOQ with a custom type mapping. - You can now define your own Converter types that are used by - jOOQ to map a database's SQLDataTypes to your custom types. - This is particularly useful for Java's enums. Read more about - custom converters in the manual: - http://www.jooq.org/manual/ADVANCED/CustomTypes/ - -- There are a lot of new runtime configuration options to control - the SQL style of SQL rendered by jOOQ. You can now specify - whether table/column names should be quoted / capitalised / - lower-cased, whether SQL keywords should be capitalised or not, - etc... - -- The handling of NULL has been improved in favour of using jOOQ - as a SQL builder library (e.g. along with Spring for execution) - NULL is no longer inlined, but bound as a variable. - -- jOOQ now supports simulation of the relational division - operation using an intuitive syntax. Read more about the - relational division here: - http://en.wikipedia.org/wiki/Relational_algebra#Division - -Features and improvements -------------------------- -#161 - Add runtime configuration to pretty print rendered SQL -#349 - Add SQLite relations support -#491 - Add runtime configuration for SQL keyword style (upper - case, lower case) -#521 - Add runtime configuration for SQL reference style (upper - case, lower case, as-is, quoted) -#1150 - Add code generation option to disable generation of - records -#1181 - Add support for SQL Server data types timestamp and - rowversion -#1188 - Load default Settings from the classpath at - /jooq-settings.xml, or from -Dorg.jooq.settings -#1193 - Specify main-class in jOOQ Console's manifest.mf and - include dependency in jar file -#1194 - Add ColumnDefinition.isNullable() -#1202 - Add support for the relational division operation: - A.divideBy(B).on(A.ID.equal(B.A_ID)).returning(A.X, ...) -#1207 - Add Factory.batch(Collection) for - convenience -#1208 - Render @javax.persistence.Column(nullable = false) - property, if available -#1209 - Render @javax.persistence.Column(length, precision, - scale) properties, if available -#1215 - Add org.jooq.Converter for custom type mapping -#1216 - Overload Record, Result.getValue() and .setValue() - methods to accept a Converter -#1217 - Add EnumConverter as a base type for custom enum - converters -#1218 - Add code generation options to generate - referencing a Java type and a Converter -#1224 - Add DataTypeDefinition.getLength() to jooq-meta's type - system -#1233 - Support custom JDBC properties for jooq-codegen -#1234 - Add Database.getTable(SchemaDefinition, String, boolean) - to fetch tables case-insensitively -#1239 - Add Factory.fetchLazy(String, Object...) - -API changes (backwards-compatible) ----------------------------------- -#1191 - Deprecate ConfigurationRegistry and replace by equivalent - ExecuteListener feature -#1219 - API Bug: Cannot use LIMIT .. OFFSET along with FOR UPDATE - -Bug fixes ---------- -#625 - Remove dependency from generated Routines to the - generator's SQLDialect -#1128 - NULL is inlined in INSERT statement instead of binding it - as a variable. This can cause issues when using jOOQ with - Spring -#1137 - Exclude MySQL column-level enum types when that column is - overridden by a -#1158 - Derby cannot handle inlined NULL literals in some - contexts -#1180 - Execute BatchMultiple (multi-query batch query), when - executing BatchSimple (single-query, multi-bind-value - query) with StatementType == STATIC_STATEMENT -#1189 - TableMapping regression for SQLite database -#1190 - Cannot store SQLite records when using - StatementType.STATIC_STATEMENT -#1199 - Table.getFields() returns an internal representation of a - table's field list. Make generated tables immutable! -#1200 - Internal API leak exposed through covariance in - AbstractType.getFields() -#1211 - Enforce method name disambiguation also when using custom - strategies in jooq-codegen -#1212 - Enforce identifier disambiguation also when using custom - strategies in jooq-codegen -#1221 - Incorrect ExecuteListener invocation for INSERT .. - RETURNING. executeStart() and executeEnd() are omitted -#1223 - Cache ExecuteListener classes for performance -#1225 - Bind NULL byte[] as java.sql.Types.BINARY instead of - BLOB in Postgres, to avoid errors -#1226 - Bind NULL UDTs with their associated type name in Oracle -#1232 - SQLException when Factory.fetch() does not return a - ResultSet -#1237 - Don't generate enum classes for columns in MySQL tables - that are excluded from code generation - -Version 2.0.5 - February 26, 2012 -================================================================= - -This release finally introduced basic runtime configuration -features for the jOOQ Factory. This configuration now includes: - -- Execute listener and SQL tracing support. jOOQ allows you to - hook your own listeners into jOOQ's query execution engine to - be notified of all sorts of events -- The existing SchemaMapping features. They are now part of the - runtime configuration -- StatementType settings. Specify whether a Factory should - execute java.sql.PreparedStatements (with bind variables) or - static java.sql.Statements with inlined variables. - -The runtime configuration is documented here: - -http://www.jooq.org/manual/JOOQ/Factory/ - -The listener and tracing support has been requested by -Christopher Deckers, a new jOOQ user who has had the courtesy to -contribute the new jOOQ Console, which is documented here: - -http://www.jooq.org/manual/ADVANCED/ExecuteListener/ - -Apart from that, another long-requested feature is now fully -implemented: The GeneratorStrategy, allowing for custom naming -strategies in generated source code. This will allow for -generating custom table / record class name prefixes / suffixes, -as well as overriding the default behaviour for rendering UPPER, -lower and CamelCase artefacts. See the manual for details: - -http://www.jooq.org/manual/META/Configuration/ - -Features and improvements -------------------------- -#93 - Add Field.equalIgnoreCase(), Field.notEqualIgnoreCase() -#408 - Add class prefixes, suffixes and other options to the - code generator -#492 - Add runtime configuration -#1107 - Let Field.contains() support the Postgres ARRAY @> ARRAY - operator -#1140 - Add ResultQuery.fetchResultSet() to return the underlying - JDBC result set -#1143 - Add Result.isNotEmpty() for convenience -#1145 - Add runtime configuration to specify whether jOOQ should - execute java.sql.PreparedStatement (with bind variables) - or a java.sql.Statement (with inlined parameters) -#1146 - Add Query.getSQL(boolean) to indicate that bind values - should be inlined (as a convenience for - Factory.renderInlined(QueryPart)) -#1148 - Add Cursor.resultSet() to expose the underlying ResultSet -#1149 - Allow for optional - "http://www.jooq.org/xsd/jooq-codegen-2.0.4.xsd" - namespace in jooq-codegen configuration -#1152 - Add & org.jooq.EnumType> - E MySQLFactory.enumType(Class, int) for enum reverse - lookups of MySQL-specific enums -#1159 - Support matching numbers with LIKE, e.g. ID LIKE '%33%' -#1160 - Implement Field.contains(), .startsWith(), .endsWith() - for numeric values, too -#1161 - Use reflection to remove compile-time dependency on - ojdbc for creating ARRAYs -#1162 - Integrate jOOR into jOOQ for simpler reflection -#1164 - Distinguish between Definition.getInputName(), - .getOutputName() -#1165 - Add constraint name to generated javadoc -#1167 - Trivial issue with org.jooq.Factory.exists Javadoc - - GitHub issue #10 -#1169 - Add Configuration.setData(), getData() to convey custom - data in a configuration's lifecycle -#1172 - Add runtime configuration to deactivate JooqLogger -#1177 - Add jOOQ-Console module to jOOQ -#1184 - Add DataType.isArray() - -API changes (backwards-compatible) ----------------------------------- -#1142 - Rename Result.exportXML() to Result.intoXML() to stay - more consistent -#1151 - Deprecate SchemaMapping in favour of new runtime - configuration - -Bug fixes ---------- -#978 - Schema.getTables() and similar methods return empty lists - when Schema is mapped with SchemaMapping -#1153 - Bad inlining of booleans in Sybase ASE / DB2 / Oracle - SQL Server / SQLite -#1154 - Bad inlining of byte[] in most dialects -#1155 - byte[] are erroneously converted to String when using - Record.intoArray() -#1156 - Bad inlining of DATE / TIME / TIMESTAMP data types in - Ingres (and other dialects, when the setting differs from - the default) -#1166 - Some generated Javadoc uses naming strategy or plain - output name, instead of qualified output name -#1168 - Oracle packages are generated as static, instead of - static final -#1175 - Factory.use() seems to render SQL with the Schema name - still present -#1179 - Oracle-generated ArrayRecords need a reference to - org.jooq.Schema to read TABLE of OBJECT from stored - procedures - -Test cases ----------- -#1147 - Add integration tests for executing SQL generated using - Factory.renderInlined() - -Version 2.0.4 - February 12, 2012 -================================================================= - -This release introduced many improvements to source code -generation. These improvements include: - -- Maven and standalone code generation now use the same XML - configuration, which is read by jOOQ-codegen using JAXB. This - allows for more complex configuration elements in the future -- jOOQ-codegen can now handle multi-schema databases and generate - code for tables referencing tables from other schemata. This - is integration tested against the SQL Server AdventureWorks - database -- jOOQ now allows to generate simple POJOs in addition to Records - and to annotate both POJOs and Records with JPA annotations - such as @Entity, @Table, @Id, @Column, @UniqueConstraint, etc. - -You can migrate your existing .properties configuration by running -> org.jooq.util.GenerationTool /your.properties migrate - -Besides that, there is a lot of ongoing work to improve the -integration of Oracle's TABLE and VARRAY types. - -Features and improvements -------------------------- -#8 - Add JPA annotations to generated POJOs / Records -#282 - Add support for multi-schema databases -#287 - Add support for Oracle TABLE types -#395 - Use XML configuration file instead of properties file -#1089 - Add Field.contains(), .startsWith(), .endsWith() as a - convenience for Field.like() (including escaping) -#1092 - Move master data table configuration from - generator.generate to generator.database namespace -#1093 - Add support for generator.strategy in Maven source code - generation -#1094 - Add support for generator.database.date-as-timestamp in - Maven source code generation -#1095 - Move generator.generate.unsigned-types to - generator.database namespace -#1096 - Add support for generator.generate.unsigned-types in - Maven source code generation -#1103 - Add support for SQL Server data type uniqueidentifier -#1106 - Add Factory.escape(Field, char) for use with LIKE -#1108 - Add support for multi-schema databases using Maven code - generation -#1115 - Add support for Oracle VARRAY/TABLE of OBJECT types -#1127 - Add support for POJO classes generation -#1129 - Allow for using Param in LIMIT .. OFFSET clauses -#1132 - Add RenderContext.castMode() to allow for avoiding casts - where this is not really needed -#1136 - Add generation option to enable/disable generating - navigation methods - -Bug fixes ---------- -#1099 - Derby generated artefacts are not sorted alphabetically -#1101 - Internal API leak exposed through covariance in - AbstractTable.joinXXX() methods -#1110 - VARRAY element type information is lost when unnesting - VARRAY's in Oracle -#1111 - VARRAY element type information is lost when unnesting - VARRAY's returned from functions in Oracle -#1114 - Syntax error when unnesting TABLE of OBJECT in Oracle. - The unnested table contains several columns but jOOQ only - unnests "COLUMN_VALUE" -#1117 - NullPointerException when passing an ArrayRecord - containing a null array to a stored function in Oracle -#1125 - Postgres needs casting for date time data types in - queries like SELECT ? FROM DUAL -#1131 - DB2: [Noauthorized routine named "LIKE" of type - "FUNCTION" having compatible arguments was found] when - using Field.like(concat(x, y)) -#1133 - Compilation errors in generated source code if the same - constraint name exists in several schemata -#1134 - NullPointerException in code generation when a foreign - key constraint references a table from another schema - that is not being generated -#1135 - Generated Javadoc references inputSchema instead of - outputSchema - -Test cases ----------- -#1009 - Add more integration tests for proper handling of - java.sql.Date, Time, Timestamp -#1090 - Run jOOQ tests against AdventureWorks SQL Server sample - database -#1105 - Add integration tests for multi-schema source code - generation and querying -#1122 - The 10k lines of integration test code are too heavy for - the compiler. Create test modules with fewer lines of - code, each. - -Version 2.0.3 - January 29, 2012 -================================================================= - -This release focuses on increased compatibility between various -SQL dialect integrations as far as ARRAY and JOIN support is -concerned: - -- ARRAY types are only available in H2, HSQLDB, Oracle, Postgres. - Nevertheless, they can be somewhat simulated in other dialects - using nested selects with UNION ALL. Increased compatibility - leads to a nicer API, where ARRAYs are used along with ALL/ANY - quantifiers, for instance. - -- JOIN syntaxes can be quite powerful in SQL. Apart from - simulating NATURAL JOIN, JOIN USING clauses, as well as a - synthetic "KEY JOIN" syntax, jOOQ now also supports nesting - JOIN expressions to create more complex table sources. See a - recent blog post on the subject here: - -http://blog.jooq.org/2012/01/15/lets-revise-the-sql-from-clause/ - -Features and improvements -------------------------- -#578 - Add KEY JOIN syntax to simulate joining using generated - foreign keys -#577 - Simulate NATURAL JOIN syntax, where this is unavailable -#582 - Simulate JOIN USING syntax, where this is unavailable -#671 - Allow for nesting JOIN clauses -#676 - Add Table.join() methods to create more flexible table - sources -#993 - Add Field.equalAny(T[]), .equalAny(Field) methods -#1048 - Simulate (array) syntax for dialects - that do not support arrays -#1051 - Add Factory.execute(String, Object...) as a convenience - method for Factory.query(...).execute() -#1055 - Simulate Factory.table(Object[]) and table(List) using - UNION ALL in dialects that do not support arrays -#1060 - Improve debug logging of H2 arrays. The syntax is not - ARRAY[1, 2], but (1, 2) -#1065 - Add OracleFactory.sysContext(String, String) to support - Oracle's SYS_CONTEXT function -#1069 - Add support for INSERT INTO table(field1, field2, ...) - SELECT syntax - as opposed to the existing INSERT INTO - table SELECT -#1072 - Add support for LIKE .. ESCAPE .. syntax -#1074 - Add Field.notBetween(T, T) for convenience -#1080 - Add support for JDBC's Statement.setFetchSize() in - ResultQuery.fetchLazy() -#1082 - Add some more DEBUG logging in AbstractResultQuery - -API changes (backwards-compatible) ----------------------------------- -#1059 - Change SelectFromStep.from(Collection>) to - from(Collection>) - -API changes (backwards-incompatible) ------------------------------------- -#1087 - Change the NTILE function to return Field - instead of Field - -Bug fixes ---------- -#1071 - Make Sequence Serializable -#1081 - Derby error in NULL handling when simulating unnested - arrays that contain NULL values -#1084 - Bind index mismatch in val(null).equal(null) and in - val(null).notEqual(null) -#1091 - Add missing @Support annotations on Table.crossJoin() - methods - -Test cases ----------- -#1026 - Add integration tests for NTILE window function and - document compatibility -#1073 - Add integration tests for NOT IN queries holding NULL - arguments - -Version 2.0.2 - January 8, 2012 -================================================================= - -This is a maintenance release for jOOQ 2.0. The main improvements -include - -- The whole jOOQ API is now annotated with a new org.jooq.Support - annotation to help you assess whether a certain SQL clause is - available in your database or not. This is particularly useful - when your application should support several databases at once - (e.g. MySQL, Postgres, Oracle) -- The Oracle PIVOT clause is now formally supported for advanced - statistical queries in Oracle. This clause will be simulated in - other dialects in the future. -- The DATE data type can be mapped to TIMESTAMP. This important - when you query a legacy Oracle database, where DATE columns - can also contain time information -- Several convenience methods have been added for more fluent - syntax, when using plain SQL result queries, subqueries as - tables, or when unnesting arrays in ANY() and ALL() quantifiers - -Further type mapping support is still experimental. An official -cooperation with MinuteProject for source code generation is -being analysed. With MinuteProject, many source code generation -issues could be addressed centrally, as MinuteProject specialises -in source code generation: - -http://minuteproject.wikispaces.com/ - -Features and improvements -------------------------- -#595 - Add support for Oracle's PIVOT clause -#869 - Add support for using ANY, ALL with arrays, not just with - subselects -#1007 - Formally document the API methods to indicate whether - something is supported by any given SQL dialect -#1011 - Add code generation configuration parameter to avoid - generating @Generated annotation -#1019 - Render LIMIT x OFFSET y also for MySQL, instead of - LIMIT y, x -#1022 - Add missing Sybase ASE implementation for Factory.use() -#1024 - Add Factory.resultQuery(String, Object...) to allow for - arbitrary execution modes of plain SQL queries (lazy, - later, into, array, etc) -#1025 - Add missing SQLite implementation for Factory.deg() and - Factory.rad() -#1033 - Generate table comments into generated Tables.java as - Javadoc -#1040 - Add Object[][] Result.intoArray() and - Object[] Record.intoArray() for convenience. Let - E Record.into(Class) also support array types. -#1041 - Add Table Factory.table(Select) convenience - method for more fluency -#1042 - Add support for DISTINCT keyword in SUM, AVG, MIN, MAX - aggregate functions -#1046 - Generate Ingres table and column comments in generated - source code (only Ingres 10) - -API changes (backwards-compatible) ----------------------------------- -#1050 - Deprecate usage of SOME quantifier in predicates, such as - equalSome() - -API changes (backwards-incompatible) ------------------------------------- -#1036 - Fixed API typo in - WindowsRowsStep.rowsBetweenUnboundedFollwing() -#1037 - The fluent API allows for JOIN clauses without FROM - clause - -Bug fixes ---------- -#1010 - The MERGE INTO .. WHEN NOT MATCHED THEN INSERT .. syntax - may cause type-safety issues in some databases. VALUES - should be converted before binding -#1014 - FindBugs: Latent risk of infinite recursion due to typo - in QueryPartList.retainAll(); -#1015 - FindBugs: 7 occurrences of "Bad attempt to compute - absolute value of signed 32-bit hashcode". In extreme - cases, this could lead to SQL syntax errors -#1016 - The Oracle CONNECT BY cond1 AND cond2 syntax erroneously - creates a WHERE cond2 CONNECT BY cond1 statement -#1028 - Syntax errors when using untyped param() in HSQLDB (and - other strongly typed dialects) -#1029 - Postgres can't bind NULL values in cases, where bind type - is Object.class and bind value was created with - Factory.param() -#1030 - UnsupportedOperationException when calling - Query.bind(int, Object) on a query containing plain SQL - fields -#1031 - Incorrect debug logging when plain SQL QueryParts like - field("?") bind null values -#1032 - Incorrect debug logging when plain SQL QueryParts contain - String literals, such as 'Hello? Anyobody out there?' -#1047 - Field.notEqualAny() erroneously renders <> ALL() - -Test cases ----------- -#1021 - Add explicit integration tests for - LEFT|RIGHT|FULL OUTER JOIN - -Version 2.0.1 - December 23, 2011 -================================================================= - -This is a maintenance release for jOOQ 2.0. The main improvements -include - -- Better integration for using jOOQ with Spring Data. This - includes support for named parameters, as well as allowing to - change bind values on previously constructed Query objects -- The MERGE statement has been enhanced for better integration - with Oracle. -- jOOQ is now ready to use with Scala / Groovy - -For more information about using jOOQ with Scala, see this blog -post: -http://blog.jooq.org/2011/12/11/the-ultimate-sql-dsl-jooq-in-scala/ - -There is now also experimental support for a custom type mapping. -This mapping allows to rewrite data types at code generation time -as well as to specify custom enum data types (e.g. boolean Y/N). -Not all integration tests run smoothly for custom data types, -hence, this feature is not yet fully supported. - -Features and improvements -------------------------- -#691 - Add support for Oracle CURSOR REF IN / INOUT parameters -#677 - Add type-mapping configuration, enforcing types for - columns -#947 - Add custom type mapping support (experimental) -#968 - Allow for custom enum types, configured in the code - generator (experimental) -#974 - Add Schema.getTable(String), getSequence(String), - getUDT(String) for better runtime Schema meta-navigation -#975 - Add Sequence.getName(), getSchema(), getDataType() -#980 - Add support for named parameters, to better interact with - Spring -#991 - Add Query.bind(String, Object) and bind(int, Object) to - easily modify existing bind values -#992 - Document thrown DataTypeException in Convert methods -#998 - Enhance MERGE statement for Oracle extensions: - WHEN MATCHED THEN UPDATE .. WHERE .. DELETE WHERE .. - WHEN NOT MATCHED THEN INSERT .. WHERE .. -#1000 - Add support for MySQL's INSERT INTO .. SET .. syntax in - MERGE statement's WHEN NOT MATCHED THEN INSERT clause - -API changes (backwards-compatible) ----------------------------------- -#981 - Cannot insertInto(table("my_table")), as plain SQL tables - return Table, not Table. Relax - bound on R -#988 - Change Factory.field(String) to return Field - instead of Field -#999 - Make MERGE's WHEN MATCHED .. and WHEN NOT MATCHED .. - clauses optional -#1001 - Identity.getField() should return TableField - instead of Field -#1006 - Add Factory.value(...) as a synonym for Factory.val(...) - for increased Scala / Groovy compatibility - -Bug fixes ---------- -#973 - EnumType renders name() instead of getLiteral() in - formatXXX() methods -#977 - EnumType renders name() instead of getLiteral() in - Convert.convert() method -#979 - Record.from() sets all changed flags to true. That's not - necessarily correct in the event of storing the record - back to the DB -#985 - AbstractRecord.equals() does not correctly compare - arrays. Compare them using Arrays.asList() -#986 - Postgres / DB2 / Sybase ASE foreign-key namespace is - unique-per-table. jOOQ forces all foreign keys from all - tables into the same namespace -#990 - Problems when encoding arbitrary byte[] as String(byte[]) - in inlined SQL. This can cause issues when DEBUG-level - logging is activated -#995 - Routines don't respect SchemaMapping - Github issue #8 -#1002 - TableRecord.storeUsing() doesn't update IDENTITY column - values, if the column is not part of the main unique key -#1003 - Sybase / SQL Server / MySQL / Ingres / H2 / Derby's - INSERT .. RETURNING simulation returns null if a table - has an IDENTITY column, but no primary/unique key -#1005 - The INSERT INTO .. VALUES .. syntax may cause type-safety - issues in some databases. VALUES should be converted - before binding - -Test cases ----------- -#984 - Detach IDENTITY column tests from UNIQUE KEY tests, - create a dedicated test suite instead - -Version 2.0.0 - November 25, 2011 -================================================================= -This release is a fresh start in many areas of jOOQ, adressing -issues that have been requested by users for a long time. These -release notes docment the most important changes, a detailed -upgrade guide, as well as the detailed list of improvements. - -Most important changes ----------------------- -- The API became more static. This applies to many Factory - methods, such as val(), literal(), as well as to many Field - methods that have been moved over to the Factory. For example, - when before, you wrote this using "postfix function notation": - -
NAME.replace(" ", "_").trim()
- - you will now write (just as in SQL): - -
trim(replace(NAME, " ", "_"))
- - Using static imports of Factory.*, jOOQ makes SQL look even - more like SQL. The current "postfix notation" is maintained for - backwards compatibility. -- By default, jooq-codegen will now generate a "dynamic" meta - model as opposed to the existing static one. Generated tables - covariantly override the as(String) aliasing method, leading - to a much more convenient aliasing style. When before, you - wrote: - -
-Table parent = T.as("parent");
-Table child  = T.as("child");
-Condition join =
-  parent.getField("ID").equal(child.getField("PARENT_ID"))
-
- - You can now write: - -
-T parent = T.as("parent");
-T child  = T.as("child");
-Condition join = parent.ID.equal(child.PARENT_ID)
-
- - Of course, the existing notation still works - -- Exceptions are no longer checked. When previously, the DB's - SQLException was propagated to client code, there is now an - unchecked DataAccessException hierarchy, similar to that of - Spring. This will eventually give way to a standardised error - handling abstraction, in future developments. -- Window functions are now constructed from their underlying - aggregate functions just like in SQL. For example: - -
-sum(AMOUNT)
-sum(AMOUNT).over().partitionBy(ACCOUNT)
-
- - This makes for a more concise API, especially when considering - future extensions, such as Oracle's KEEP (DENSE_RANK FIRST...) - syntax. -- More type safety has been introduced regarding various places - where generic and types are involved. - This is especially true for INSERT / UPDATE / DELETE statements -- Sequences now also have a type -- Unsigned number types are now supported in those databases that - use them. Unsigned numbers are implemented in jOOU, a spin-off - open source project. For convenience, this library is - "internalised" into jOOQ, to avoid adding a dependency - -http://code.google.com/p/joou/ - -Upgrade instructions: ---------------------- -Various of the above changes are incompatible with jOOQ 1.x. In -order to upgrade, please be aware of the following pitfalls: - -- The schema needs to be re-generated. -- Much of the post-fix function notation is replaced by static - methods in the Factory. Today's org.jooq.Field API is - maintained in jOOQ 2.0, for backwards compatibility. It will - be removed, eventually, though. Expect some incompatible - changes, where window functions are involved -- Some Factory instance methods (such as val(), literal()) are - now static. They are compatible, but may cause compiler - warnings. -- The meta model is now an instance model by default. If you - prefer the static meta model, you can configure this in your - jooq-codegen configuration. -- The additional typesafety involving and types may cause - compiler warnings and errors. -- SQLException is no longer part of the API. This can cause - compiler issues, in particular when extending jOOQ -- Some utility classes have moved to org.jooq.tools - -Should these incompatibilities be too significant for your -project, you can still stay on the 1.x branch, which will be -maintained for a while. Be aware that upgrading might be more -difficult, later, though. - -Features and improvements -------------------------- -#55 - Implement improved exception handling -#117 - Improve DSL support for field and table aliasing (decrease - verbosity) -#519 - Add support for MySQL UNSIGNED numeric types -#626 - Create static function access -#661 - Add support for bitwise operators -#718 - Sequences should be mapped to appropriate type (e.g. - SMALLINT, INT, BIGINT, etc) -#734 - Add support for Oracle / SQL Server CUBE() and ROLLUP() - grouping functions -#751 - Add support for Oracle / SQL Server GROUPING SETS() - function -#799 - Add support for Oracle PL/SQL's object-oriented MEMBER - PROCEDURES and MEMBER FUNCTIONS -#804 - Add to Insert, Update, Delete -#835 - Review API typesafety for InsertSetMoreStep - set(Field, T) and similar methods -#890 - Add Factory.selectCount() convenience method -#891 - Let min() max(), etc functions return a new type - AggregateFunction. This type can then be used as an entry- - point for window functions -#892 - Add support for Oracle / SQL Server GROUPING() and - GROUPING_ID() functions to be used along with CUBE() and - ROLLUP() -#893 - Simulate ROLLUP() function for MySQL, using the WITH - ROLLUP grouping modifier -#894 - Move functions from Field to org.jooq.impl.Factory - and make them static -#895 - Add power(..., Field) -#897 - Add (experimental) Spring integration project -#898 - Replace usage of checked SQLException by an unchecked - DataAccessException, similar to that of Spring -#899 - Build jOOQ .jar files as bundles to be deployed into OSGI - environments -#900 - Purge deprecated API - Prior to 2.0 -#901 - Introduce InvalidResultException as a subtype of - DataAccessException for integrity checks in methods like - ResultQuery#fetchOne(), ResultQuery#fetchMap(), etc. -#902 - Make AggregateFunction the base type for constructing - window functions -#904 - Move SQLDialectNotSupportedException into - org.jooq.exception package -#905 - Introduce MappingException as a subtype of - DataAccessException for integrity checks in methods like - ResultQuery#fetchInto(), etc. -#907 - Add missing Field.like(Field), notLike(Field) - methods to overload the existing Field.like(T), notLike(T) -#908 - Change rpad / lpad functions to accept String instead of - char -#912 - Add R newRecord(Table, Object) as - the inverse of various into(Class) methods -#916 - Add > {Record.into(Table) | - Result.into(Table) | ResultQuery.fetchInto(Table) | - Cursor.fetchInto(Table)} -#917 - Add various Cursor.fetchOneInto() convenience methods -#918 - Add CustomTable, CustomRecord as base classes for more - convenience when used with various into(Table) methods -#919 - Allow for accessing non-public constructors of Record - subtypes -#923 - Move some utilities to org.jooq.tools -#924 - Generate a reference to every table in a new Tables.java - class for improved static access -#928 - Add DataTypeException extending DataAccessException in - case something went wrong when converting data types -#930 - Support converting date time types to java.util.Calendar. - This applies to various into(Class) methods, as well as - Result.getValue(xx, Class) -#931 - Allow for conversion between Long and date/time types, and - vice versa -#932 - Let the bound of R in TableRecord extend TableRecord, - in UpdatableRecord to extend UpdatableRecord -#933 - Add support for type Character in Record.into(Class) - methods and similar -#936 - Accept primitive types, such as int.class for type - conversion -#938 - CODEGEN: Add static/instance table field configuration -#939 - Include license.txt and readme.txt in .jar files' META-INF - directory -#953 - Make DefaultGeneratorStrategy methods non-final to allow - for overriding -#954 - Add examples for source code generation of multiple - schemata with Maven -#955 - Generate a reference to every type in a new UDTs.java - class -#957 - Add R Factory.newRecord(UDT) for constructing - attached UDTRecords -#958 - CODEGEN: Add generation-time schema mapping, allowing for - re-writing schemata in jooq-codegen -#960 - CODEGEN: Add code generation configuration parameter to - avoid using the new UByte, UShort, UInteger, ULong wrappers - for UNSIGNED number types -#961 - Use Oracle's SYS.ALL_SEQUENCES.MAX_VALUE to determine the - type of a sequence. -#969 - Add List ResultQuery.fetch(Field, - Class) convenience method - -Bug fixes ---------- -#686 - Reduce the internal API leak by preventing access to - TableFieldImpl, UDTFieldImpl, ParameterImpl -#903 - lag(Field, int, T) erroneously delegates to lead() -#906 - Add more NullPointerException safety to API -#913 - NoClassDefFoundError in JooqUtil.isJPAAvailable() -#920 - Generic type is lost in Cursor.fetchInto(RecordHandler) -#925 - SelectConditionStep should extend SelectConnectByStep, not - SelectGroupByStep -#926 - AbstractRecord.into() fails to convert java.sql.Date into - java.util.Date -#934 - Don't consider static members in reflection utilities when - used with Record.into(Class) and similar methods -#935 - Don't consider final member fields in reflection utilities - when used with Record.into(Class) and similar methods -#937 - In the event of name clash (same name for table and field) - generated code has errors -#945 - Calling UpdatableRecord.setValue() twice with the same - argument causes the changed flag to be reset to false -#948 - Always set the changed flag to true in Record.setValue() -#959 - Compilation errors in generated source code if MySQL enum - values match Java reserved words, such as 'true', 'false', - 'new', etc... -#962 - Postgres ordering of generated enum literals is unstable -#967 - Better document type conversion - -Version 1.7.0 - November 25, 2011 -================================================================= -This is a maintenance release for the 1.x branch. Some important -bug fixes are merged from version 2.0. These include: - -Bug fixes ---------- -#925 - SelectConditionStep should extend SelectConnectByStep, not - SelectGroupByStep -#926 - AbstractRecord.into() fails to convert java.sql.Date into - java.util.Date -#937 - In the event of name clash (same name for table and field) - generated code has errors -#945 - Calling UpdatableRecord.setValue() twice with the same - argument causes the changed flag to be reset to false -#948 - Always set the changed flag to true in Record.setValue() -#951 - Empty Password for jooq-codegen-maven causes NPE - -Version 1.6.9 - November 7, 2011 -================================================================= -This is a maintenance release for the 1.x branch. Developments -on this branch will stop after version 1.6.9. Only important bug -fixes are merged to this branch. Developments for release 2.0 -have started. - -The most important functionality in release 1.6.9 is the newly -added support for JDBC batch operations. You can now batch -execute several queries. - -See the official blog for more information: -http://blog.jooq.org/2011/10/25/jdbc-batch-operations-with-jooq/ - -Features and improvements -------------------------- -#621 - Add support for JDBC batch operations -#794 - Add support for ORDER BY [int value] in order to reference - a column index for sorting -#882 - Optimise Field.isTrue() and isFalse(). Take Field's data - type into consideration. -#885 - Add support for INSERT INTO .. VALUES (..) syntax, - omitting explicit field declarations -#887 - Add List Cursor.fetchInto(Class) - -Bug fixes ---------- -#748 - H2 regression in 1.3.158 regarding stored functions, which - return a ResultSet (this was fixed in H2) -#859 - Derby casting of numeric types to BOOLEAN doesn't work -#886 - Regression in date extract function when used in a - subselect -#888 - Derby casting of VARCHAR to FLOAT (and similar) doesn't - work - -Version 1.6.8 - October 22, 2011 -================================================================= -The main improvement of this release is the re-design of the -stored procedure / function API. With 12 supported RDBMS, which -all have their own idea about what is a stored procedure and what -is a stored function, it has proven to be a better design, to -unite them in one single type: org.jooq.Routine. A routine can -have a return value as well as OUT parameters. It can be embedded -in SQL and used as a field or a table. - -This means, you will need to re-generate your database schema, -when upgrading to jOOQ 1.6.8. After re-generation, you'll need to -fix your client code. These are the package changes: - -- [generated.package].procedures > [generated.package].routines -- [generated.package].functions > [generated.package].routines -- [generated.package].Procedures > [generated.package].Routines -- [generated.package].Functions > [generated.package].Routines - -Oracle generated packages are not re-located. With these -improvements, using stored procedures and functions becomes even -more reliable, especially when cursor types are involved. Read -more about the rationale behind this change: - -http://blog.jooq.org/2011/10/17/what-are-procedures-and-functions-after-all/ - -Apart from that, important improvements have been made in the -area of plain SQL tables. Also, consider a demo integration of -jOOQ with Google Cloud SQL: - -http://blog.jooq.org/2011/10/22/jooq-and-google-cloud-sql-example/ - -Features and improvements -------------------------- -#271 - Don't pre-fetch table meta data when selecting from plain - SQL tables -#489 - Add support for SELECT * (i.e. render SELECT * where - applicable) -#596 - Add support for VARIANCE() and STDDEV() OVER() window - functions -#608 - Add jOOQ version number in generated source code -#670 - Add more Javadoc to Field.xxx() functions -#692 - Add support for ResultSet type returned from HSQLDB - stored functions -#850 - Use http://www.jooq.org as URL for the @Generated - annotation -#854 - Add convenience methods Fields.isTrue(), isFalse() for - conversion of "Y", "YES", "1", "true", "on", etc into a - boolean condition -#870 - Add support for MEDIAN aggregate function -#872 - Add support for STDDEV_POP(), STDDEV_SAMP(), VAR_POP(), - VAR_SAMP() aggregate functions -#874 - Reduce the number of internal classes for dialect-specific - function aliases -#878 - Implement DataType.equals() and hashCode() - -API changes (backwards-compatible) ----------------------------------- -#851 - Change Field.{sortAsc|sortDesc}(List sortList) into - Field.{sortAsc|sortDesc}(Collection sortList) - -API changes (backwards-incompatible) ------------------------------------- -#848 - Purge deprecated API - Prior to 1.6.1 -#849 - Replace Cursor.fetchResult() by Cursor.fetch() -#852 - Review stored procedures / functions concept. Merge them - all into a single "Routine" type - -Bug fixes ---------- -#756 - Error when aliasing HSQLDB and Postgres unnested tables -#761 - Exception when TRACE logging execution with plain SQL - tables involved -#773 - Execute standalone stored functions as CallableStatement - to prevent issues with transactions -#847 - Query.getSQL() doesn't render dialect-specific SQL when - Query is constructed using the fluent API -#853 - DB2 generated convenience methods for stored functions - have unstable ordering -#857 - Derby casting of numeric types to String / VARCHAR does - not work -#858 - SQLDataType.getSQLDataType() should return itself, instead - of null -#860 - SQLite CEIL function is incorrectly simulated. CEIL(2.0) - returns 3.0 instead of 2.0 -#861 - Field.replace(String) generates bad SQL for various RDBMS. - Field.replace(String, String) works, though -#863 - Ingres integration generates illegal SQL when selecting - things like SELECT 1 WHERE 1 = 1 -#866 - Sybase ASE Field.replace(String) function incorrectly - removes the argument string -#873 - Error when selecting two times the same aggregate field -#877 - Compilation error in generated source code when a table - without a primary key has an identity column -#879 - Add Google Cloud SQL Example -#880 - Query.getSQL() does not consider SchemaMapping - -Test cases ----------- -#811 - Loader integration tests fail for SQLite -#812 - CSV Loader test leaves Postgres JDBC connection in an - inconsistent transactional state on error -#856 - Add integration tests for Field.abs() -#865 - Add integration tests for Field.ascii() -#867 - Add integration tests for Field.sum(), avg(), max(), min() -#881 - Re-design H2 stored functions to be pre-compiled, in order - to speed up integration tests - -Version 1.6.7 - September 25, 2011 -================================================================= - -This release coincides with the launch of the new website at -http://www.jooq.org. Hence, it ships with little additions to the -deliverable itself. - -Apart from new convenience methods, the main addition is a Maven -plugin for jooq-codegen contributed by Sander Plas. - -Features and improvements -------------------------- -#797 - Create Maven plugin for source code generation -#825 - Add List> Factory.fetchMany(String) to - allow for fetching several result sets from stored - procedures, such as Sybase ASE's "sp_help" -#838 - Implement MetaDataFieldProvider.toString() -#841 - Add List Result.getValues(Field, Class) -#842 - Add Query.getBindValues() method to allow for extracting - bind values in the correct order -#843 - Add Factory.fetch(ResultSet) to transform a JDBC ResultSet - into a jOOQ Result - -API changes (backwards-compatible) ----------------------------------- -#837 - Avoid final keyword on Object methods, such as .equals(), - .hashCode(), etc - -Bug fixes ---------- -#836 - Bad syntax when selecting from aliased plain SQL tables -#839 - Boolean conversion in getValueAsBoolean() should trim - String values first -#840 - Numeric conversions in getValueAsXXX() should trim String - values first -#844 - NullPointerException when selecting a column from a Result, - that does not exist - -Version 1.6.6 - September 11, 2011 -================================================================= - -Finally, support for another RDBMS has been added. Sybase's other -important product Sybase Adaptive Server Enterprise (or simply -Sybase ASE) is now officially supported by jOOQ - -Apart from this, there had been important improvements with the -recently added INSERT .. RETURNING clause, as well as some fixes -related to DECIMAL / NUMERIC data types - -Features and improvements -------------------------- -#796 - Complete missing public org.jooq.impl Javadoc -#800 - Add support for Sybase Adaptive Server Enterprise -#808 - Add support for INSERT .. RETURNING for Ingres -#809 - Add support for INSERT .. RETURNING for Sybase SQL - Anywhere using SELECT @@identity -#810 - Add support for INSERT .. RETURNING for SQLite using - last_inserted_rowid() -#813 - Add DSL support for INSERT .. RETURNING -#814 - Change TableRecord to reload its trigger-initialised main - key in Oracle and other RDBMS that don't support IDENTITY - columns -#818 - Add SQLiteFactory.rowid() -#819 - Support SQLite AUTOINCREMENT columns as IDENTITY -#820 - Add Factory.fetchOne(String) for executing plain SQL - queries that return single records -#826 - Allow for returning several records in the INSERT .. - RETURNING clause. This now works for DB2, HSQLDB, MySQL, - and Postgres -#827 - Support Sybase SQL Anywhere's TOP n START AT m clause - instead of simulating it with nested SELECT's - -API changes (previous API now deprecated) ------------------------------------------ -#817 - Deprecate Factory.lastID(Identity) - -Bug fixes ---------- -#815 - SQL Server fetching of IDENTITY value is broken -#821 - Optimise ResultQuery.fetchAny() executing fetchLazy() - internally, and only fetching one record from the cursor -#822 - Let Constant cast to more precise NUMERIC/DECIMAL types - in those RDBMS where casting is necessary -#823 - Cannot bind SQLite BigDecimal, BigInteger types - bind - them as String instead -#824 - BigInteger values cannot be bound in DB2, Derby -#828 - Document inefficient implementation for GREATEST and LEAST - in some RDBMS - -Version 1.6.5 - August 28, 2011 -================================================================= - -This release finally adds a loader for CSV data to jOOQ. You can -now load CSV data using a simple fluent API, configuring error -handling, duplicate behaviour and transaction handling, as well -as various CSV parameters. - -This release also changes the way generated keys are retrieved -after INSERT's. Instead of (potentially inconsistently) running -SELECT MAX(pk) immediately after the INSERT, Postgres' INSERT.. -RETURNING clause is used (or simulated), in a single statement. - -Features and improvements -------------------------- -#784 - Add Result.exportXML() to retrieve a DOM document similar - to that of .formatXML() -#792 - Add support for loading of CSV data into tables -#795 - Add List fetch(int, Class) and - fetch(String, Class) convenience methods -#803 - Add support for INSERT .. RETURNING or simulate it where - not available -#805 - Add T[] fetchArray(int, Class) and - fetchArray(String, Class) convenience methods -#806 - Add T fetchOne(int, Class) and - fetchOne(String, Class) convenience methods - -Bug fixes ---------- -#798 - Oracle IN (...) clause with more than 1000 arguments does - not work -#802 - Use "INSERT .. RETURNING" instead of "SELECT MAX(pk)" - to retrieve the primary key of a new record - -Version 1.6.4 - August 07, 2011 -================================================================= - -This release ships with a couple of useful concepts inspired by -other frameworks. These are: - -- selecting into custom POJO's. Results can be mapped to POJO's - by convention or using JPA @Column annotations -- selecting into custom callbacks. This is already a wide-spread - practice in Spring JdbcTemplates. -- selecting long-running queries asynchronously. This idea has - been inspired by the Avaje Ebean framework - -Apart from these changes and some bugfixes, the internal API has -been completely re-designed. The idea here is that query -rendering and variable binding are even faster (less String -objects), more extensible and more accurate. This is a pre- -requisite for many future developments with even more complex SQL -statements, such as for instance CTE's (Common Table Expressions) - -Features and improvements -------------------------- -#137 - Add support for asynchronous query execution using - FutureResult ResultQuery.fetchLater() similar to - Avaje Ebean -#198 - Add SELECT INTO functionality into POJO's using - T ResultQuery.fetchInto(Class) similar to JPA - CriteriaQuery -#728 - Add .fetchInto(RecordHandler) to ResultQuery, Result, - and Cursor to allow for callbacks similar to Spring's - JdbcTemplate/Ollin Framework -#774 - Add more TRACE logging to .fetchLazy() -#777 - CURSOR: Add function alias: UNNEST for TABLE -#781 - Add E function (Euler number) -#782 - Add T Record.getValue(..., Class) methods - for convenient type conversion -#785 - Allow for storing TableRecord with a provided Field[] - indicating the primary key -#786 - Document thread-safety facts in Factory Javadoc -#788 - Add Key.getFieldsArray() convenience method -#793 - Add support for Oracle's SYS_CONNECT_BY_PATH function - -API changes (backwards-incompatible) ------------------------------------- -#758 - Change internal QueryPart rendering and binding API to use - Configuration and Context as callback parameters. If you - use CustomField or CustomCondition, please correct your - implementations accordingly. Other parts of the API should - not be affected -#778 - Purge deprecated API, deprecation prior to jOOQ 1.5.7 -#790 - Purge deprecated generated code, deprecation prior to - jOOQ 1.5.7 - -API changes (previous API now deprecated) ------------------------------------------ -#776 - Deprecate QueryPart.getSQL(), add Query.getSQL() -#789 - Deprecate Record constructors with Configuration - parameter - -Test cases ----------- -#636 - Add integration tests for more advanced CONNECT BY - example -#772 - Add integration tests for selecting cartesian products - (several tables in FROM clause) - -Bug fixes ---------- -#730 - Sybase cannot bind null values in plain SQL -#759 - Omit the TOP 100 PERCENT clause in SQL Server ordered - top-level queries -#767 - An empty Java package is generated for PL/SQL packages - containing underscores -#771 - Some exotic literals are not properly escaped with quotes - yet, e.g. UDT identifiers, VARRAY types, etc. -#775 - Automatic re-attaching after deserialisation does not work - when used with .fetchLazy() -#787 - The UpdatableRecord's internal changed flags are not - updated after INSERTs / UPDATEs - -Version 1.6.3 - July 31, 2011 -================================================================= - -This is mainly a maintenance release with lots of bugfixes, -mostly around code generation, plain SQL tables, and data types. -Please note that generated source code may contain incompatible -changes due to #639 (see below for details)! - -Apart from that, project CURSOR is advancing and it is now -possible to unnest arrays into tables. See this article for -details about where jOOQ is heading with project CURSOR: - -http://blog.jooq.org/2011/07/24/the-power-of-ref-cursor-types/ - -Features and improvements -------------------------- -#679 - Improve H2 NVL2 support as of H2 1.3.156 -#680 - Improve H2 ROUND support as of H2 1.3.156 -#735 - Add README documentation to GitHub -#736 - Add more info regarding number of generated artefacts in - jooq-codegen logging -#750 - Add DataType.isNumeric(), .isString(), .isTemporal(), - .isBinary() -#754 - Log query as executed by JDBC PreparedStatement when - TRACE logging (without inlining variables) -#752 - CURSOR: Add support for selecting from ARRAY types -#762 - Use H2's native support of NVL, instead of COALESCE -#764 - CURSOR: Add support for selecting from ARRAY types - returned from stored functions - -API changes (backwards-incompatible) ------------------------------------- -#639 - Map DECIMAL(n, 0) and NUMBER/NUMERIC(n, 0) data types - to Byte/Short/Integer/Long/BigInteger instead of - BigDecimal in generated source code. Re-generated code - will not be compatible! - -API changes (previous API now deprecated) ------------------------------------------ -#731 - Inconsistent API with Field.lessOrEqualToXXX(). Removed - "To" from method name -#757 - Deprecate Factory.constant() methods - -Test cases ----------- -#731 - Add missing integration tests for equalAll(), equalSome() - and similar methods -#747 - Upgrade H2 to 1.3.158 - -Bug fixes ---------- -#632 - Sybase error : column @p0 not found in nested SELECT -#700 - Restore HSQLDB ARRAY support with INFORMATION_SCHEMA - change in HSQLDB 2.2.3, and some fixes in 2.2.5 -#725 - Cannot insert byte[] data with plain SQL -#733 - H2 changed JDBC type for ResultSet/CURSOR from 0 to -10, - like Oracle -#737 - Compilation errors in generated source code if table - fields contain spaces -#738 - Compilation errors in generated source code if MySQL - procedure parameter type contains two comma-separated - arguments (like DECIMAL(10,2)) -#739 - Postgres navigator methods and keys are not re-generated - in the same order -#740 - Formatting is broken on Result.format() with some special - newline characters -#743 - Make SQL Server INFORMATION_SCHEMA independent from - HSQLDB again, to prevent incompatibility issues -#744 - Ingres REAL and FLOAT4 types are generated as FLOAT/FLOAT8 - which maps to java.lang.Double, instead of java.lang.Float -#753 - Postgres error when binding array that contains null - values -#755 - NullPointerException when converting an array containing - a null value -#766 - Bad decoding of JDBC Types BIGINT (to BigInteger instead - of Long) and REAL (to BigDecimal instead of Float) when - plain SQL tables are involved - -Version 1.6.2 - July 10, 2011 -================================================================= - -This release mainly introduces three new projects. - -Project CURSOR where jOOQ finally supports various RDBMS's TABLE, -CURSOR, and REF CURSOR data types. This is especially useful when -those types are returned from stored procedures and functions. -Cursors are simply mapped to jOOQ Result types and can -thus be used like regular table results - -Project EXPORT aims at exporting data from the database in -various serialisable formats, such as XML, CSV, HTML, Text, JSON. -This project will be continued in the future, to also -deserialise from (some of) these data streams. This will allow -for easy transport of jOOQ Result types over the net. - -Project CODEGEN has finally been started. Many improvements -suggested by jOOQ users will be implemented in the next releases. -In this release, important fixes have been made to prevent -compilation errors in generated artefacts. - -Features and improvements -------------------------- -#61 - EXPORT: Add Result.formatXML() -#166 - CURSOR: Add support for ResultSet type returned from - Oracle stored procedures / functions -#411 - Allow for fetching Map (instead of Record) - and List> (instead of Result) -#549 - Add Factory.function() for plain SQL functions -#611 - Simulate RPAD and LPAD in SQL Server, Sybase -#627 - Add support for Postgres FOR UPDATE OF [table-name] clause -#628 - Add support for REPEAT (SQL Server: REPLICATE) function -#637 - Nicely format time in StopWatch logging output -#640 - Simulate Postgres FOR UPDATE OF [table-name] clause in - other dialects -#649 - CURSOR: Add Cursor.fetch(int) .fetchOne() - .fetchResult(int) .fetchResult() -#653 - Add support for MySQL encryption and compression functions -#660 - Clarify Javadoc of UpdatableRecord to explain its - behaviour when changing the main unique key -#669 - EXPORT: Add Result.formatHTML() -#672 - Add convenience method UpdatableRecord.copy() in order to - reset primary key values for a subsequent INSERT -#675 - EXPORT: Add Result.formatCSV() -#683 - Implement ResultImpl.equals() and .hashCode() -#684 - Implement AbstractStore.equals() and .hashCode() -#685 - Add Store.size() to indicate the maximum index of the - Store -#687 - EXPORT: Add result.formatJSON() -#689 - Create separate builds: jooq-core.zip and - jooq-with-dependencies.zip -#690 - CURSOR: Add support for ResultSet type returned from H2 - stored functions -#695 - CURSOR: Add support for ResultSet type returned from - Postgres stored functions -#697 - Add Factory.fetch(String) for executing plain SQL queries - that return results -#701 - Add ResultQuery.fetchArray() and .fetchOneArray to return - Object[][] and Object[] -#704 - Always add top and bottom line in Result.format() -#705 - Right-align numeric values in Result.format() -#716 - Add SUBSTRING function Field.substring(Field, Field) - taking fields as arguments -#719 - Document risk of SQL injection in plain SQL and literal - factory methods -#726 - Add LENGTH function as a synonym for CHAR_LENGTH - -API changes (backwards-compatible) ----------------------------------- -#698 - Inconsistent API with Factory.fetch(Table [,Condition]) - Let method return Result instead of List -#699 - Let Result extend List - -API changes (previous API now deprecated) ------------------------------------------ -#656 - Decrease verbosity of plain SQL methods. They will just be - called Factory.field() .condition() .table() .query() - -Test cases ----------- -#643 - Add integration test for code generation of invalid and - incomplete types in Oracle -#654 - Add integration tests for master data tables with PK types - other than NUMBER/INT -#655 - Add missing integration tests for TRIM function - -Bug fixes ---------- -#450 - Improve plain SQL integrity checks for bind variables -#610 - CODEGEN: Compilation error in generated source code for - databases with table named 'system' -#646 - An empty Java package is generated for an empty PL/SQL - package. This is unnecessary -#651 - CODEGEN: Avoid importing datatypes in generated source - code to prevent collisions -#657 - NullPointerException when creating a Factory with a null - SchemaMapping -#658 - Master data table code generation is broken for tables - with more or less than 3 columns -#662 - Add support for the missing Postgres data type "bpchar" -#663 - Add support for the missing Sybase data type "int" -#664 - Ingres INTEGER data types are not correctly generated -#665 - HSQLDB Datatype CLOB and BLOB are not supported, when - selecting from plain SQL tables -#666 - The evil bug: Ingres TRIM function only executes RTRIM -#673 - UpdatableRecord.store() doesn't work if called after - .delete() -#702 - Add support for the missing SQLite data type "NULL" -#706 - CURSOR: Ensure that Query.execute() runs in a single - transaction when Postgres refcursor is involved in the - query (this fixes a Postgres JDBC driver flaw) -#724 - NullPointerException when passing a single literal null - bind value to plain SQL methods without casting to Object -#729 - DB2, Derby, Ingres, Oracle cannot bind null values in - plain SQL - -Version 1.6.1 - June 19, 2011 -================================================================= - -In this release, the PORTABILITY project has been implemented. -Finally, the SQLDialect has been removed from most generated -artefacts (Schema, Table, Field, Sequence, etc). Also, the -constructing Factory is not referenced by its created QueryParts -anymore, unless this is really necessary (Query objects, UDT's, -ARRAY types). This leads to higher compatibility between schemata -of different databases, e.g. if users want to use an HSQLDB -development and Oracle productive database. - -Unfortunately, this means that the way stored procedures are -called had to be changed. This is an API break that could not be -avoided. The pre-1.6.1 StoredObject.execute(Connection) method -is deprecated and will be removed in the future. It has been -replaced by StoredObject.execute(Configuration) - -In addition to this project, many more window functions are now -supported, as well as the Oracle-specific CONNECT BY clause for -recursive queries. - -Features --------- -#351 - Add support for Oracle ROWID data type -#452 - PORTABILITY: Create a super-set of RDBMS data types -#453 - PORTABILITY: Don't create dialect-specific QueryParts -#455 - Add support for the Oracle CONNECT BY clause -#587 - Add optional OFFSET clause to form LIMIT .. OFFSET - constructs -#589 - Add extended FOR UDPATE [OF ...] [{WAIT n | NOWAIT | SKIP - LOCKED }] support -#591 - Add support for LEAD() OVER() and LAG() OVER() window - functions -#592 - Add support for the CUME_DIST() OVER() window function -#601 - Add Factory.literal() convenience methods -#602 - Add Factory.val() methods to decrease .constant() - verbosity -#604 - Add support for RESPECT NULLS clause in some window - functions -#605 - Add Factory.use(String) for non-generated schemata -#613 - Add PI function -#616 - Add Factory.two() literal convenience method -#630 - Add support for Oracle CONNECT BY pseudo-columns LEVEL, - CONNECT_BY_ISCYCLE, CONNECT_BY_ISLEAF - -API changes ------------ -#299 - PORTABILITY: Create a dialect-independent meta-model -#588 - Add OVER() keyword to FIRST_VALUE() and LAST_VALUE() API - -Test cases ----------- -#368 - Add integration test for use with schema mapping -#586 - Upgrade H2 to 1.3.155 -#607 - Add integration tests for CRUD / SP's / UDT's / ARRAY's - with SchemaMapping -#612 - Add integration tests for LPAD and RPAD functions -#624 - Add integration test for code generation of invalid/ - incomplete views in Oracle -#631 - PORTABILITY: Add integration tests for using Oracle- - generated schema against an HSQLDB database -#638 - Add missing integration test for DECIMAL data type - -Bugfixes --------- -#176 - Stored procedures / functions in EQUIVALENT schemata - cannot be called -#493 - Bind variable mismatch when constructing bad SQL -#594 - Confusing Javadoc in SELECT DSL API -#603 - Fix DB2 'IGNORE NULLS' clause -#619 - SUBSTRING() function is broken in DB2, Ingres, SQL Server -#623 - SQL syntax error for some MERGE queries in SQL Server and - Sybase -#633 - SchemaMapping is not applied to sequences -#634 - Sequences are not escaped in generated SQL - -Version 1.6.0 - June 05, 2011 -================================================================= - -Apart from supporting various additional standard and non- -standard JOIN constructs, there is now also full support for the -SQL standard MERGE statement and MySQL's ON DUPLICATE KEY variant -thereof. A great number of API enhancements have been added, -which improve the usability of jOOQ. The Ingres database is now -also supported. - -Features --------- -#301 - Add support for Oracle execution hints -#409 - Add support for NATURAL JOIN syntax, where RDBMS allows it -#415 - Make fluent API's underlying SelectQuery objects publicly - available -#429 - Add Ingres support -#475 - Document class-level generic types and in Javadoc -#486 - Add support for SQL MERGE clause -#494 - Allow for omitting schema name in generated SQL -#496 - Automatically update IDENTITY values in UpdatableRecord, - after storing them -#520 - Add support for JOIN ... USING syntax -#524 - Upgrade HSQLDB to 2.2 -#533 - Add ORDER BY [Map] or BY [List] functionality -#534 - Add Result.isEmpty() -#535 - Call upon ConfigurationRegistry.provideFor() before - throwing a DetachedException -#536 - Simulate CASE [value] WHEN [value] THEN [result] END - syntax in Derby -#538 - Add some logging to ConfigurationProvider -#539 - Add possibility to negate numeric values with Field.neg() -#541 - Add support for MySQL ON DUPLICATE KEY clause -#542 - Allow for Collection arguments in INSERT's DSL API -#543 - Allow for creating FUNCTION() OVER() without PARTITION BY - or ORDER BY clause -#546 - Add Factory.use(Schema) -#548 - Add new internal type FieldMap -#550 - Simulate ON DUPLICATE KEY INSERT clause in dialects other - than MySQL -#551 - Add TableMapping, similar to SchemaMapping for mapping - tables -#553 - Add Factory.plainSQLQuery -#554 - Add Factory.plainSQLField with a DataType parameter -#555 - Add UpdateXXX.set(Map) convenience methods to DSL API -#557 - Enhance INSERT DSL API to allow for adding VALUES clause - with InsertXXX.set() syntax -#570 - Add support for the RAND() function -#567 - Add support for Ingres Sequences -#572 - Add support for the ATAN2() function -#573 - Add possibility for additional select() clauses for - convenience -#575 - Add support for the FULL OUTER JOIN syntax, where RDBMS - supports it -#576 - Add support for the CROSS JOIN syntax, where RDBMS - supports it -#581 - Enhance API and allow Collection> - instead of Collection> - -API changes ------------ -#397 - Purge deprecated API - -Bugfixes --------- -#481 - Handle case where an empty record is stored -#522 - Misleading Javadoc in generated stored procedures and - function constructors -#532 - Restore Postgres INFORMATION_SCHEMA -#537 - Prevent null from being added to QueryPartList -#540 - Error when TRACE logging Limit -#544 - Aliased elements are not bound correctly when rendered - with toSQLReference() -#559 - Loosen type safety on overloaded methods to prevent - compilation errors with javac/Netbeans -#560 - HSQLDB DataType REAL is configured incorrectly -#565 - Add integration tests for current_user() function -#569 - ORA-01427 when generating foreign key relations -#571 - Field.trim() not correctly implemented for SQL Server -#583 - Accelerate integration tests: Reset schema only if - necessary - -Version 1.5.9 - May 15, 2011 -================================================================= - -This version ships with lots of new functionality. Finally, the -DSL-style API has been extended to CRUD operations (INSERT, -UPDATE, DELETE)! Also, support for the TRUNCATE TABLE statement -has been added. - -The most important new features include the support for SQL:2003 -standard window functions, which are available in most major -RDBMS. Additionally, basic function support has been widely -extended. - -Features --------- -#148 - Added support for window functions -#204 - Add support for multi-record INSERT's -#416 - Added support for retrieval of IDENTITY values -#433 - Use bind variables for LIMIT and OFFSET -#441 - Added foreign key relationship meta information to the - generated source code -#446 - Beautify ResultImpl.toString() method -#461 - Automatically cast CONCAT parameters to Field if - necessary -#463 - Added support for trigonometric functions -#471 - Added support for the sign function -#472 - Added support for GREATEST/LEAST functions -#474 - Added support for "hyperbolic" functions SINH, COSH, TANH, - and COTH -#482 - Added DSL API for INSERT statements -#483 - Added DSL API for UPDATE statements -#484 - Added DSL API for DELETE statements -#485 - Added "Registry" for client code to provide Configurations - to jOOQ Attachables -#490 - Added support for the TRUNCATE TABLE statement -#495 - Generate source code for IDENTITY columns -#501 - Added support for boolean conversion to Result, Record, - and Store -#503 - Allow for schema navigation via generated artefacts -#518 - Let stored procedures reference owner package - if applicable -#525 - Added NULLS {FIRST | LAST} clause to ORDER BY constructs -#528 - Added Factory.getDataType() convenience method -#530 - Added Factory.zero() and Factory.one() convenience methods - -API changes (jooq) ------------------- -#527 - Weakened type-safety on Field.nvl2() -#529 - Deprecated Factory.select(Object...), added .selectOne() - and .selectZero() instead - -API changes (jooq-meta) ------------------------ -#30 - Add ParameterDefinition for stored procedures, instead of - reusing ColumnDefinition -#499 - Add reference to TableDefinition in ColumnDefinition -#500 - Add AttributeDefinition for UDTDefinition, instead of - reusing ColumnDefinition - -Bug fixes ---------- -#369 - Adapt H2 relations generation to H2's correction of - information_schema.cross_references -#435 - Added integration tests for NESTED SELECTs holding LIMIT - clauses -#460 - Syntax error when using a field with a reserved name -#462 - Fixed Javadoc broken links -#473 - Don't cast when cast is unnecessary -#479 - INSERT statement should not set all fields for a table -#497 - Derby referential code generation is broken, for named - foreign keys -#498 - Oracle package content is generated in arbitrary order -#502 - Syntax error when creating an empty IN condition -#526 - Corrected Javadoc in Field.coalesce() - -Version 1.5.8 - April 29, 2011 -================================================================= - -Finally, jOOQ now supports two important new RDBMS: -SQL Server and Sybase! - -Apart from this great enhancement, there is now also full support -for the non-SQL standard LIMIT clause, even in dialects where the -LIMIT clause is not supported natively (especially Oracle, but -also DB2, SQL Server and Sybase, which have limitations). jOOQ -simulates LIMITs by rendering nested selects filtering on ROWNUM -(Oracle) or on ROW_NUMBER() (DB2, SQL Server and Sybase). - -Other interesting additions are an increasing support for native -mathematical functions. More function support will be added in -future versions. - -Features --------- -#16 - Added support for SQL Server -#21 - Uniform implementation of the LIMIT clause. Implemented - LIMIT clause simulation through analytic functions, where - LIMIT is not supported natively -#97 - Added support for Sybase -#418 - Measure time of various steps in source code generation -#420 - Added support for proprietary SQL extensions "FOR UPDATE" - and "FOR SHARE" -#431 - Added additional statistics to generation log files -#432 - Unified the various "standard" ANSI INFORMATION_SCHEMA - implementations in the jooq-meta artefact -#436 - Added support for the modulo function -#438 - Added floor and ceil functions -#439 - Added support for mathematical functions (logarithms, - exponentials, sqrt) -#447 - Enhanced Field.add() and Field.subtract() to work for date - time fields, also - - -API changes ------------ -#428 - Created new Maven artefact jooq-meta to cleanly separate - database meta-data navigation from code generation -#458 - Decreased DSL verbosity for arithmetic operations and for - ordering - -Bug fixes ---------- -#417 - Restored warning when unknown column type is encountered - in source code generation -#419 - Corrected misleading Select.fetchOne(...) Javadoc -#421 - Optimised AbstractRecord's memory consumption -#448 - Corrected some Javadoc @see links -#449 - Changed Field.concatenate() to accept Field parameters - to avoid generic varargs warnings - -Version 1.5.7 - April 17, 2011 -================================================================= - -This is the first release built with support of Maven thanks to -the help of some jOOQ users! - -The main new features in this release are the improved support -for serialisation/deserialisation of jOOQ objects through use of -the newly introduced "Attachable" interface. - -If using log4j or the newly supported slf4j logging framework -in debug/trace mode, there is the possibility to log query -building/execution time statistics. - -Apart from these new features, fixes were mainly done in the -fields of type casting, HSQLDB 2.1 upgrade support, stored -procedures with OUT, IN/OUT parameters. Please upgrade, if you -are using any of those features. - -If you extend jOOQ as a base implementation for source code -generation, be aware of the fact, that the jOOQ-codegen is -currently undergoing major changes. Expect the code generation -API to stabilise again in one of the next releases. - -Features --------- -#104 - Added maven dependency -#248 - Integrate UDT types with ARRAYs -#295 - Allow for attaching/detaching UpdatableRecords to/from - Configurations -#359 - Added statistics measurement to Query execution for debug - log level -#362 - Added deprecation configuration flag -#364 - Document unknown type in generated source code -#373 - Improve exception handling in code generation -#378 - Added support for Oracle stored functions with OUT - parameters -#382 - Added Factory.attach() methods to re-attach deserialised - Attachables -#394 - Add logging support for SLF4J -#398 - Allow to provide a DataType in Factory.constant() -#399 - Provide access to TypeUtils.convert() methods via DataType -#404 - Added trace logging for measuring the speed of various - query execution steps - -API changes ------------ -#358 - Enhanced DSL API to allow for HAVING clauses without - GROUP BY clauses -#367 - Make Store, Result, QueryPart "Attachable" -#374 - Introduce strategy pattern to code generation for future - support for advanced naming schemes -#375 - Decouple Database from Generator -#381 - Made DataType Serializable -#384 - Deprecated singleton QueryParts -#388 - Unify "internal" API using an Adapter pattern - -Bug fixes ---------- -#187 - Protect generated Record navigation methods against name - clashes -#266 - Added more thorough integration tests for dialect-specific - casting (including some fixes related to varchar types) -#360 - Added more integration tests for the DISTINCT clause -#361 - Add more checks in testInsertUpdateDelete() -#366 - Warn only once per ColumnDefinition, if a data type is - unknown -#377 - NullPointerException when generating invalid stored - function -#380 - Added integration tests to check for proper - serialisability -#386 - Fixed incompatibilities with HSQLDB 2.1.0 -#387 - Fixed unnecessary imports in some Oracle generated - Records -#389 - Fixed javac compiler warning in AbstractStoredObject -#391 - Cannot properly call stored procedures when IN/OUT - parameter is bound to NULL -#392 - Procedures with several OUT parameters may not register - OUT parameters correctly -#410 - Passing null VARRAY values to Oracle stored procedures - causes issues -#412 - limit(int) sets default offset incorrectly in some - dialects - -Version 1.5.6 - March 31, 2011 -================================================================= - -This release consists mainly of code generation bug fixes and -minor API improvements and enhancements. - -The most important improvement is ticket #90, by which lazy -fetching and iteration over data is now supported. jOOQ lets you -keep a reference to a Cursor that has an open JDBC ResultSet, to -fetch data from on-the-fly. - -A few major code generation bugs were reported where the -generated code may cause ambiguity due to an inconsistent API. -This means that you will have to re-generate your schema after -upgrading to version 1.5.6. Some of your code may not compile -anymore, after this upgrade. - -Features --------- -#90 - Added possibility for lazy fetching of data -#208 - Added convenience methods for direct invocation of - sequences' currval() and nextval() attributes -#212 - Created one factory per dialect for better separation of - dialect-specific support -#213 - Generate a factory for each schema -#251 - Opened up base implementations for Field and Condition - to allow for custom implementations by client code -#274 - Integrate H2 ARRAY types with stored procedures -#292 - Documented usage of log4j and java.util.logging -#306 - Added support for the NULLIF function -#319 - Added Field.between(Field, Field) method -#320 - Added trace logging for variable binding and SQL - generation methods -#323 - Added Field.in(Field...) method -#325 - Include release version number in delivered .jar files -#328 - Improved configuration setup documentation page -#333 - Let Result implement Serializable -#334 - Added fetchMap() convenience methods -#335 - Added more functions and aggregate functions examples to - documentation -#338 - Visually improve code generation logging -#339 - Removed skipping of unreferenced UDT's, ENUM's and ARRAY's -#342 - Improved generated referential code by using fetch() and - fetchOne() API -#356 - Let UpdatableRecord.store() and delete() return an int - to indicate whether the record was actually modified - -API changes ------------ -#233 - Allow for joining TableLike instead of Table -#337 - Added generic type > to - InsertSelectQuery -#341 - Fixed API flaw where SelectOnConditionStep.and() methods - and similar ones returned SelectConditionStep, instead of - SelectOnConditionStep - -Bugfixes --------- -#69 - Corrected referential code generation for foreign keys - that reference non-primary unique keys -#85 - Corrected referential code generation for multi-field - foreign keys -#121 - Covered more Factory.executeXXX() methods with integration - tests -#318 - Fixed NullPointerException when executing SELECT * from - aliased tables -#321 - BetweenCondition does not bind left hand side Field - correctly -#322 - InCondition does not bind left hand side Field correctly -#326 - Avoid method overloading where binding to Object - may lead to compile-time ambiguities (with javac) -#343 - Add more foreign key navigation method integration tests -#347 - Add explicit integration tests for schema artefacts - excluded from code generation -#350 - Disambiguate navigation methods if several foreign keys - reference the same entity -#352 - Disambiguate navigation methods if a table ending on S - references itself -#353 - Added integration test for compilation of generated - artefacts with javac (as opposed to the Eclipse compiler) -#355 - Error when storing an UpdatableRecord that has no changed - values - -Version 1.5.5.2 - March 15, 2011 -================================================================= - -A critical bug was reported from the 1.5 release stream where -stored functions did not render their parameters in correct order - -Features --------- -#302 - Map Oracle's NUMBER data type to java.lang.Number in - stored procedures, stored functions - -Bugfixes --------- -#317 - StoredFunctionImpl.asField() renders parameters in wrong - order - -Version 1.5.5.1 - March 13, 2011 -================================================================= - -In version 1.5.5, there was a fatal bug breaking Derby source -code generation. Only the Derby dialect is affected. Please -update immediately, if you are using jOOQ's Derby integration - -Bugfixes --------- -#315 - Generated master data records are not sorted by PK -#316 - Derby code generation fatally broken - -Version 1.5.5 - March 12, 2011 -================================================================= - -This version is released early as there are some important -bugfixes. Additional improvemetns include: - -- Improved DSL related to conditions in HAVING and JOIN clauses -- Support for Oracle-style functions, such as NVL, NVL2, COALESCE - DECODE, etc - -Features --------- -#304 - Add support for Oracle NVL function -#305 - Add support for COALESCE function -#308 - Add support for Oracle NVL2 function -#311 - Add support for Oracle DECODE function - -API changes ------------ -#223 - Enhance DSL to accept and(), or() and similar methods in - JOIN steps -#224 - Enhance DSL to accept and(), or() and similar methods in - HAVING steps - -Bugfixes --------- -#297 - Fixed Factory.concatenate() function -#298 - Added integration tests for nested selects in HAVING - clause -#300 - Added integration tests for nested selects in JOIN clause -#303 - Javadoc correction -#307 - Accelerated integration tests -#309 - Fixed JDBC variable binding issue related to Conditions - where the lhs is a function (e.g. stored function) and the - rhs is a constant -#310 - Fixed issue where fetchOne() methods throw - NullPointerException if no result record is available -#312 - Fixed issue where Field.equal(...) methods rendered - unexpected SQL when rhs null is cast to a type -#313 - Fixed Derby cast type for VARCHAR -#304 - Let the DerbyDataType default for java.lang.String be - VARCHAR, not LONG VARCHAR - -Version 1.5.4 - March 04, 2011 -================================================================= - -Feature #243 required a minor API change in the base classes of -generated source code. This means you have to re-generate all -your jOOQ artifacts in order to migrate to 1.5.4. The artifacts -themselves should be regenerated in a compatible way, such that -your client code should not be affected. If this is not the case, -please report a ticket here: - - https://github.com/jOOQ/jOOQ/issues - -Apart from the Derby RDMBS and some new data type support, there -have been many new convenience methods added all over the API. -For instance, if type-safety is not really a requirement, there -are lots of possibilities to use plain SQL directly in the DSL. -In that case, data can be accessed from Record, Results, not only -through Field, but also through field names or indexes. - -Check out the updated documentation (soon) here: - - http://www.jooq.org - -- Support for the Derby RDBMS -- Support for casting. This allows for even greater flexibility - in cases where jOOQ cannot 100% ensure type-safety -- Support for ARRAY types. Oracle, Postgres, HSQLDB and H2 ARRAY - types are now supported natively as regular bindings in - jOOQ's Field -- Support for dialect-specific data types. CHAR, VARCHAR, CLOB - are no longer treated equally as java.lang.String. Their - type heritage is also generated -- More sequence support -- Lots and lots of bug fixes - -Features --------- -#95 - Support for the Derby RDMBS -#163 - Add support for JDBC type ARRAY (with Postgres) -#209 - Add support for DB2 sequences -#210 - Add support for H2 sequences -#211 - Add support for HSQLDB sequences -#215 - Support for SQL casting using as cast type -#246 - Support for SQL casting using dialect-specific data types -#254 - Add HSQLDB support for ARRAY types -#256 - Add Oracle support for VARRAY types -#257 - Integrate ARRAY types with stored procedures -#261 - Add a global type mapping to the generated Schema object -#267 - Add DataTypeDefinition for further abstraction of data - types in code generation -#269 - Add H2 support for ARRAY types -#290 - If log4j is not on the classpath, use java.util.logging - instead, as fallback - -API Changes ------------ -#156 - Allow for results to be accessed by index, not by field -#218 - Corrected bad method signature: - Record.getValueAsLong(Field, Integer) -#219 - Extended Result and Select API's to be more similar to - that of Record -#232 - Add more convenience plain SQL support to the API -#235 - Add convenience methods to Record, Result and Select for - access of data via field name -#243 - Refactor DataType implementations in order to allow for - the use of generics -#259 - Add field type to database meta data (ColumnDefinition) -#260 - Add field type to database meta data (Field) -#262 - Add default behaviour for Record.getValue(Field) -#276 - Add Javadoc as a ZIP file to the jOOQ distribution - -Bugfixes --------- -#125 - Add more plain SQL integration tests -#191 - Add more integration tests for nested unions -#205 - Implemented workaround for handling Postgres stored - functions with UDT OUT parameters -#214 - Fixed NPE when generating a stored function with an - unknown parameter type -#216 - Fixed some cases where binding of BigInteger is not done - correctly -#220 - Syntax error when using select statement in a CASE clause -#221 - Corrected integration tests for combined update and - select statements -#222 - Added integration test for INSERT statements having - nested SELECT statements for their fields -#225 - Correctly cast array types in Postgres -#230 - Potential misuse of Blob and Clob in H2's JDBC types -#239 - Factory.fetchAny() is not implemented for SQLite -#244 - Fixed peculiar MySQL casting support where cast types do - not match any data types -#245 - Fixed NPE when reading null dates in SQLite -#249 - Added ARRAY type integration tests -#255 - Stored procedure bind variables get mixed up when any - argument is null -#263 - Correctly handle Postgres function overloading -#264 - Ambiguous funciton calls when calling overloaded functions - with null parameter -#281 - Handle compilation errors when generating stored - procedures with > 254 parameters -#283 - Fixed compilation errors in generated source code for - Oracle's UDT table type -#284 - Fixed compilation errors in generated source code for - Oracle procedures in packages, when they have no - parameters -#285 - Fixed compilation errors in generated source code for - Oracle tables with the same name in different schemata -#286 - Fixed name collisions in generated objects with the - java.lang.* package -#288 - Prevent the creation of UNION queries with bad syntax - in MySQL -#289 - Correctly alias fields within UNION queries for some - dialects, which then only require the "AS" keyword -#291 - Cannot create an aliased field called "year" in Postgres - -Version 1.5.3 - January 13, 2011 -================================================================= - -- Lots of stored procedure support was implemented -- Support for sequences was added -- The final decision to postpone support for DB2 UDT's was made -- Some code generation bugfixes - -Features --------- -#36 - Added stored procedure / stored function support for HSQLDB -#140 - Added support for Oracle sequences -#147 - Added support for H2 stored functions -#162 - Correctly integrate UDTs with stored procedures -#170 - Added support for Postgres stored functions -#186 - Added support for more Oracle PL/SQL simple data types -#193 - Simulate support for H2 "stored procedures" -#195 - Simulate support for Postgres "stored procedures" -#206 - Added support for Postgres sequences - -API changes ------------ -#180 - Improved DSL for constant values -#181 - Allow for referencing Field in function argument list -#189 - Renamed convenience methods in org.jooq.Record -#207 - Add fetchOne(Field) method to org.jooq.Select API - -Bugfixes --------- -#182 - Protected generated Record classes against clashes with inherited methods -#183 - Fixed NullPointerException, when generating master data tables with - NULL fields -#184 - Fixed IllegalArgumentException, when a data type is present in the - schema, but unavailable in code generation logic -#185 - Code generation should not fail when single elements cannot be generated -#188 - Improved integration tests for stored procedures / functions / packages -#196 - Increase RDMBS version compatibility by avoiding "SELECT *" in code - generation logic -#199 - Added integration tests for stored procedures in RDBMS that do not - support OUT parameters -#201 - Fixed issue in DB2 where stored procedures without parameters were not - generated. -#202 - Added integration tests for stored procedures / functions without - parameters - -Version 1.5.2 - December 27, 2010 -================================================================= - -- Improved support for stored procedures, also in packages -- A minor API change was inevitable to implement #173. The API change only - concerns the INTERNAL API. Deprecation marks are added and deprecated items - will be removed in 1.6.0 -- Experimental SQLite database support -- Some important bug fixes - -Features --------- -#25 - Added support for Oracle packages -#114 - Added support for Oracle UDTs -#145 - Added support for the SQLite database -#150 - Generate static convenience methods for stored procedures / functions -#151 - Generate static convenience methods for stored function fields -#152 - Generate meaningful serialVersionUID in generated classes -#173 - Added support for EQUIVALENT schemata - -API changes ------------ -#159 - Added convenience method List getValues(Field) to Result -#165 - Added convenience methods for creating EXISTS clauses -#169 - Improved DSL for WHERE clauses - -Bugfixes --------- -#68 - Prevent issues originating from overloaded stored procedure names, - generating identical Java class names -#153 - Fixed issue with generated code for DB2 stored functions -#154 - Fixed issue with generated code for DB2 stored functions -#155 - Fixed issues with database NULL not being mapped correctly to Java NULL - when selecting values that have a primitive type (int, long, etc) -#158 - Potential ClassCastException when using Field -#171 - Corrected issue related to selection of default schema in DB2 -#177 - Fixed issue related to generated code for tables or UDTs without columns - - -Version 1.5.1 - December 13, 2010 -================================================================= - -- H2 database support thanks to Espen Stromsnes -- Improved stored procedure support - -Features --------- -#96 - Added H2 database support -#101 - Added stored procedure / stored function support for Oracle -#138 - Added stored procedure support for DB2 -#146 - Added support for DB2 functions - -API changes ------------ -#143 - Added convenience methods to Record - -Bugfixes --------- -#84 - Implemented referential code generation for foreign keys that do not - match their primary keys' types -#141 - Encoding problem in generated master data classes - -Version 1.5.0 - November 22, 2010 -================================================================= - -- A big one. Major API changes / improvements -- Added lots of convenience methods -- UDT support -- Enum support -- DB2 support thanks to Espen Stromsnes -- "Light" dependency to log4j added. jOOQ will still run without it - -Features --------- -#1 - Create support for UDTs (so far only for PostgreSQL) -#15 - Added DB2 support -#60 - Added support for nested selects in INSERT and UPDATE - statements -#83 - Added log4j logging to code generation and runtime -#87 - Add support for arithmetic expressions -#105 - Added support for ENUM data types, where applicable - (MySQL and PostgreSQL so far) -#110 - Added execute and fetch convenience methods -#111 - Added missing "select distinct" support -#122 - Annotate generated classes with javax.annotation.Generated -#123 - Generate user enum fields from data values (master data) -#124 - Added PlainSQLTable -#127 - Added not() operator to Condition -#135 - Added convenience methods andNot() and orNot() in - Condition - -API changes ------------ -#89 - Removed support for DataSource. jOOQ is not a transaction - manager -#92 - Added SortField type to be used for sorting -#99 - Provide better access to functions (No more FunctionFactory) -#116 - Merge Manager functionality into Factory -#118 - Improve API of org.jooq.Field -#119 - Improve subquery condition API -#132 - Reduced much of the select query API -#134 - Better separation of SelectQuery and SimpleSelectQuery - -Bugfixes --------- -#109 - Error when executing select * if generated schema does not - match actual schema -#115 - Fix various "null" pseudo field issues -#126 - Error when selecting a single field from a union nested - select -#129 - Fixed performance issue in Oracle code generation for - very large databases - - -Version 1.4.4 - November 22, 2010 -================================================================= - -Unreleased version, fixes included in 1.5.0 - -Bugfixes --------- - -#133 - JoinCondition does not take comparison operator - -Version 1.4.3 - October 25, 2010 -================================================================= - -Some more bugfixes - -Bugfixes --------- - -#71 - Generated code does not compile, when foreign key and - primary key have a data type mismatch -#73 - In Oracle generated code, multi-field foreign keys may - generated bad relations code -#82 - Conversion of literals to camelcase fails if numbers are - involved - -Version 1.4.2 - October 22, 2010 -================================================================= - -Various bugfixes and minor improvements - -Features --------- -#66 - Add support for CASE or DECODE expression - -API changes ------------ -#77 - Functions should not extend FieldImpl, but a new - AbstractField -#78 - QueryPart pollutes declared method space of its - implementations. Hide it by indirection - -Bugfixes --------- -#64 - Code generation fails when foreign key references a unique - key that is not the primary key. Code generation for these - cases is omitted -#67 - When loading properties files, a leading / seems to be - mandatory. This is preventing users from correctly setting - up jOOQ the first time -#70 - Add support for Oracle datatype TIMESTAMP(6) -#72 - Name clashes in generated Tables -#75 - Constant does not bind its values. -#76 - Constant should not render strings all the time -#79 - Constants are not properly escaped -#80 - Position function does not bind any variables -#81 - Add cast function to Constants in HSQL - -Version 1.4.1 - October 18, 2010 -================================================================= - -Oracle patch release - -Features --------- -#63 - Generate referential functionality for Oracle - -Version 1.4.0 - October 17, 2010 -================================================================= - -Support for PostGreSQL was added. -Added lots of OR-mapping functionality. -There is a general API change due to various new features. - -Features --------- -#14 - Add PostGreSQL support -#40 - Resolve foreign keys. Allow for navigation between objects. -#42 - Add PlainSQLField -#45 - Add "dirty" flag to Record's values. This allows for - updating only relevant data. -#47 - Complete implementation for UPDATE, INSERT, DELETE - statements. Added some missing functionality. -#48 - Add more support for Date, Time, Timestamp fields. -#51 - Add a org.jooq.impl.Manager class that provides common - utility methods for CRUD operations - -API changes ------------ -#10 - Add second generic type . This is a - prerequisite for many OR-mapping features -#18 - Use org.jooq.Record in InsertQuery and UpdateQuery -#46 - Create UpdatableRecords as a prerequisite for JPA and true - OR-mapping. These records support store() and delete() - methods -#52 - Add default constructor in generated Records. -#53 - Add refresh functionality to UpdatableRecords. See also #46 -#54 - Add a state to the factory class -#56 - Reduce API, remove unnecessary Condition subinterfaces -#57 - Reduce API, remove unnecessary QueryPart interfaces - -Bugfixes --------- -#49 - NullPointerException when generating relations on schema - subset -#58 - Count function renders bad SQL in various dialects -#59 - Exception when selecting unaliased functions in queries - -Version 1.3.0 - August 24, 2010 -================================================================= - -Support for HSQLDB was added. -There is a major API change due to #44. - -Features --------- -#29 - Generate primary keys and foreign keys in Oracle code - generation -#34 - Add support for HSQLDB -#39 - Generate primary keys and foreign keys in HSQLDB code - generation -#41 - Add documentation to QueryFactory and Functions - -API changes ------------ -#23 - Add support for more advanced joins -#32 - Merge SelectQuery and ResultProviderQuery interfaces -#44 - Let Query methods return "this" - -Bugfixes --------- -#35 - Add unit tests for HSQLDB support -#37 - Syntax error in combined select queries! - The usage of combined queries in MySQL may still be a bit - awkward. Keep an eye out for further fixes -#43 - Join with aliased tables doesn't work - -Version 1.2.0 - August 21, 2010 -================================================================= - -The added Oracle support is now unit tested and more stable. -The Oracle NUMBER data type is mapped more precisely to Java -types. - -Features --------- -#12 - Model primary keys and foreign keys in generated code -#22 - Improve mapping of Oracle NUMBER data type -#26 - Add Plain SQL QueryParts -#27 - Add support for HAVING clause - -Bugfixes --------- -#24 - Add Unit tests for oracle database (and fixed bugs) -#31 - Pull up addOrderBy() methods from SelectQuery to - ResultProviderQuery - -Version 1.1.0 - August 17, 2010 -================================================================= - -The main new feature is the Oracle support. Wait for -Version 1.1.1 for that support to be stabilised, as there are no -Oracle unit tests running against an Oracle database yet. - -Features --------- - -#2 - Add support for inner / nested selects -#3 - Add more function support -#4 - Implement filtering functionality for code generation -#6 - Add Oracle Support -#9 - Create true POJO's (implementing org.jooq.Record) with - getters and setters -#17 - Make org.jooq.impl.Parameter independent of Field - -Bugfixes --------- - -#11 - Code generation does not remove files - -Version 1.0.1 - August 14, 2010 -================================================================= - -Features --------- - -#5 - Prevent code regeneration, if no changes were made -#7 - Implement ant task for code generation - -Version 1.0.0 - August 14, 2010 -================================================================================ -Initial Release \ No newline at end of file diff --git a/jOOQ-website/inc/RELEASENOTES-2.4.txt b/jOOQ-website/inc/RELEASENOTES-2.4.txt deleted file mode 100644 index a0725aaa73..0000000000 --- a/jOOQ-website/inc/RELEASENOTES-2.4.txt +++ /dev/null @@ -1,2816 +0,0 @@ -jOOQ Release notes -================== - -For an interactive overview, see also -http://github.com/jOOQ/jOOQ/issues - -For a formatted text version, see -http://www.jooq.org/notes.php - -For a text version, see -http://www.jooq.org/inc/RELEASENOTES.txt - -Version 2.4.2 - September 23, 2012 -================================================================= - -This is a minor patch release with some useful fixes for the -2.4 branch - -Bug fixes ---------- -#1774 - QueryPart.toString() does not load default settings from - classpath -#1792 - Factory.fieldByName() and tableByName() do not correctly - escape quotes -#1797 - SQL syntax errors when plain SQL contains comments with - question marks and SQL is executed as - StatementType.STATIC_STATEMENT -#1802 - Result.into(Table) doesn't work correctly, if the same - field name appears twice in Result -#1819 - MappingException in Record.into(Class), when POJO setters - have applicable names but non-applicable argument types -#1820 - Cannot fetch into non-public POJO classes. Their members - / getters / setters should be made accessible -#1829 - Factory.execute(String) may cause errors when plain SQL - returns results - -Version 2.4.1 - August 28, 2012 -================================================================= - -This is a minor patch release with some useful fixes for the 2.4 -branch - -Bug fixes ---------- -#1553 - Add some Javadoc to document the difference between using - a Factory with a Connection or with a DataSource -#1556 - Add javax.validation API to full deliverable -#1572 - Use Thread.currentThread().getContextClassLoader() to - load ExecuteListener classes as a workaround for - experienced class loading problems when using OSGi -#1584 - Code generation error with Oracle UDT static functions -#1650 - jOOR fix #16: Can't call Reflect.create(A, B, null) -#1660 - Factory.renderContext().castMode(CastMode.NEVER) - .render(query) doesn't work. CastMode is not applied -#1667 - Bad variable binding when NULLS FIRST, NULLS LAST is - simulated in SQL Server and other databases -#1673 - Result.formatXML() and Result.intoXML() do not render - namespaces correctly -#1693 - Cannot bind UDT values from other schemata to stored - procedures -#1730 - Compilation errors in SQLite generated code when flag - is set to true -#1751 - Result.intoResultSet() generates wrong ResultSetMetaData - if runtime schema mapping is applied -#1632 - Improve the performance of various DefaultRenderContext - methods, by locally caching Settings values locally - -Version 2.4.0 - July 8, 2012 -================================================================= - -This release's main new feature is jOOQ's added convenience in -Factory initialisation for those users who get their database -connectivity through JDBC DataSources. If supplied with a -DataSource, a jOOQ Factory will handle the Connection lifecycle -internally, closing the Connection when no longer needed. - -The H2 MERGE statement syntax is now supported and simulated in -other databases, for those users that prefer its more intuitive -syntax over the SQL standard. - -The code generator now also allows for generating interfaces and -DAOs per table. DAO generation was previous discussed on the user -group and seen in a competitor product called OneWebSQL. - -The jOOQ Console now supports breakpoints for even more effective -SQL development - -Features and improvements -------------------------- -#1141 - Add Result.intoResultSet() to wrap a Result in a JDBC - ResultSet -#1253 - Avoid JDBC escape syntax for date/time literals -#1280 - Generate DAO classes and interfaces for POJOs -#1404 - Document the lifecycle of an ExecuteListener in the - Javadoc -#1411 - Add support for Postgres "any" data type (with quotes!). - This seems to map well to java.lang.Object -#1418 - Support case-insensitive schema names in code generation -#1419 - Add some WARN-level logging when the source-code - generator doesn't generate any artefacts -#1423 - Add Field.likeIgnoreCase() to support Postgres' ILIKE - operator -#1424 - Add Factory(DataSource) and similar constructors -#1427 - Add Factory.batchStore(Collection>) for convenience -#1428 - Add DataType.convert(Object...) and - DataType.convert(Collection) for convenience -#1431 - Add org.jooq.Name Factory.name(String) to contruct - QueryParts that are escaped according to - Settings.getRenderNameStyle() -#1432 - Add Factory.fetch(String, QueryPart...) and - Factory.execute(String, QueryPart...) and similar methods - to support arbitrary QueryParts in plain SQL -#1434 - Add UniqueKeyDefinition.isPrimaryKey() for completeness -#1438 - Add Result Factory.fetchFromCSV(String) -#1440 - Add top-level pom.xml for jooq-parent artefact (GitHub - Issue #14) -#1446 - Converting arbitrary strings to Number / Date should - return null, instead of throwing an exception -#1449 - Generate some meaningful Javadoc into the generated - [schema-name]Factory classes -#1454 - Add line breaks to generated Javadoc where appropriate -#1463 - Add option to let generated Record / POJO objects - implement a common generated interface -#1470 - Support interface types in ResultQuery.fetchInto(Class), - Result.into(Class), and Record.into(Class) methods, - returning a proxy -#1471 - Upgrade internal jOOR dependency to jOOR 0.9.4 -#1473 - Add IdentityDefinition to jooq-meta -#1501 - Add support for conversion of String to - java.sql.{Date, Time, Timestamp}. GitHub issue #22 -#1504 - Document behaviour of fetch() and fetchOne() in case jOOQ - cannot fetch actual records -#1509 - Minor improvements in the generator source code. GitHub - pull request #23 -#1510 - Generate additional setters for foreign keys, accepting - records as arguments -#1521 - Expose Connection methods, such as commit(), rollback() - and similar transaction-related methods in Factory -#1523 - Support ROW_NUMBER() OVER() for the latest version of - Derby and H2, which support it -#1524 - Simulate ROW_NUMBER() OVER() in HSQLDB using ROWNUM() -#1528 - Let generated interfaces extend Serializable -#1532 - Clarify the lifecycle of Configuration.data in the - Javadoc -#1534 - Generate more meaningful Javadoc where "an uncommented - item" stands now -#1536 - Add documentation to the FOR UPDATE OF clause, indicating - that DB2 may have stricter requirements regarding - updatability of fields -#1541 - Add support for the H2 MERGE syntax - GitHub Issue #18 -#1542 - Simulate the H2 MERGE syntax in other dialects supporting - the SQL standard MERGE statement - GitHub Issue #18 -#1545 - Website and Documentation anchors should be links to - themselves, visually recognisable - -Features and improvements (jOOQ Console) ----------------------------------------- -#1398 - Allow for adding breakpoints in jOOQ Console - -API changes (backwards-compatible) ----------------------------------- -#1408 - Relax bounds of in Factory.truncate() to Record, - instead of TableRecord -#1429 - Change Convert.convert(List, XXX) to accept Collection - instead of List - -Bug fixes ---------- -#1020 - Improve Oracle's LIMIT .. OFFSET clause simulation. - GitHub Issue #16 -#1358 - Compilation errors in generated source code when Oracle - overloaded procedures collide with procedures that end - with numbers -#1437 - Error in Javadoc of FactoryOperations.fetchOne(). This - method may return null -#1441 - Performance issue with AbstractDataType.convert(Object). - Avoid conversions when they're obviously unneeded -#1448 - Handle String to Enum conversion (when Java Enums are - stored as Strings in the database) - GitHub issue #15 -#1459 - Generated Keys.java static class too large (static - initialiser can become bigger than 64kb) -#1460 - Table.getReferencesTo(Table) doesn't work correctly for - aliased tables -#1461 - Exception when rendering of {fn datetimeadd(...)} for - HSQLDB and Derby -#1462 - Document missing GeneratorStrategy features, such as - getJavaClassImplements() -#1465 - Custom generator strategy's printImplements() is called - with Mode == RECORD for tables -#1478 - Caching SQLDialect in AbstractDatabase heavily improves - code generation performance -#1483 - Inefficient cloning of default settings using JAXB - unmarshalling leads to non-negligible overall overhead. - Use serialisation instead (short of a useful XJC clone - plugin) -#1489 - Fix manual where it claims to throw SQLExceptions -#1490 - Compilation error when a SQL Server stored procedure has - a parameter named "value" -#1493 - Bad syntax for SELECT /*+hint*/ DISTINCT ... in Oracle -#1498 - jOOQ does not compile using JDK 7 / JDBC 4.1. GitHub - Issue #24 -#1499 - Generated members of Tables.java are not final -#1505 - Bad exception message when ON DUPLICATE KEY IGNORE cannot - be simulated -#1515 - Splitting of large NOT IN conditions is wrong. The parts - should be connected with AND, not with OR -#1522 - fetch().into(Table) doesn't initialise records correctly, - such that subsequent calls to store() will execute an - INSERT, rather than an UPDATE -#1525 - Generate missing Javadoc to getters for procedure OUT - parameters -#1529 - Factory.batchStore() logs all single statements to DEBUG - output. Find a more accurate log output -#1537 - Factory.batchStore() renders bad SQL for Postgres. The - RETURNING clause is not allowed in batch INSERTs - -Version 2.3.1 - May 11, 2012 -================================================================= -This is an important patch release fixing some regressions in the -code generator for the Postgres dialect. With 2.3.0, it was no -longer possible to generate schemata of which the database user -was not the owner. - -Bug fixes ---------- -#1334 - Fix inaccurate simulation of TRUNC(number, decimals) for - Derby -#1403 - Documentation bug: ctx.statement() can be replaced in - executeStart(). This is not documented -#1406 - Compilation errors in generated source code when Postgres - stored procedure parameter is called "NAME" -#1407 - Compilation errors in generated source code when Postgres - data-type is "any" (with quotes!) -#1409 - Postgres code generation broken when not connecting with - the owner of a schema - -Version 2.3.0 - May 6, 2012 -================================================================= - -This is a minor feature increment release, featuring many useful -API enhancements, some new functions, some new syntax support -elements, improved source code generation and a lot of -improvements on the jOOQ Console, thanks to Christopher Deckers. - -The updated jOOQ Console now allows for filtering incoming -statements directly on the server side, using regular expression -filters on statement text and other features. These improvements -are a part of a general strategy to introduce breakpoints and -more sophisticated debugging capability to the jOOQ Console. - -Features and improvements -------------------------- -#597 - Add support for Oracle KEEP (DENSE_RANK FIRST...) - aggregate function clause -#910 - Add ExecuteListener extension to allow for overriding - exception translator to handle vendor-specific error - codes -#1286 - Add "renderSchema" flag to Settings, to completely - disable rendering of schema names -#1293 - Generate setter methods for JAXB annotated configuration - properties -#1295 - Add support for MySQL's INSERT IGNORE clause -#1296 - Simulate the FOR UPDATE clause for SQL Server, CUBRID, - using JDBC's ResultSet.CONCUR_UPDATABLE -#1302 - Add Factory.inline() to allow for flagging inline-only - "bind values" -#1303 - Add connection-less Factory constructors for convenience, - when jOOQ is only used as a SQL query builder -#1304 - Add option to generate JSR-303 @NotNull and @Size - annotations to generated POJO's -#1307 - Let HSQLDB dialect render NVL2() as NVL2() instead of - CASE expression -#1312 - Allow for omitting , and generate all - available schemata in that case -#1315 - Let generated factories use their associated Schema as - the Settings' RenderMapping's defaultSchema -#1319 - Move jooq-spring's FactoryProxy to the core jooq project -#1322 - Add Factory.dateAdd() and timestampAdd() for convenience -#1327 - Add DataType.isLob() -#1328 - Add Field inline(char), inline(Character), - inline(CharSequence) for convenience -#1333 - Add support for the Oracle TRUNC function, for numeric - arithmetic -#1336 - Let Record.into(Class) and similar methods accept - "immutable" classes, i.e. setter-less classes that take - several constructor arguments -#1340 - Use Constructor.setAccessible(true), if no default - constructor is available on the target type of - Record.into(Class) -#1342 - Improve Javadoc on Factory.function(). Document arguments -#1349 - Add support for the CUBRID Click-Counter INCR() -#1352 - Allow for creating syntax-error and SQL-injection safe - qualifiers for org.jooq.Field and org.jooq.Table -#1361 - Add Factory.batchStore(TableRecord...), to allow for - batch UPDATE/INSERTs of many records -#1367 - Make configured ExecuteListeners default constructors - accessible -#1366 - Let org.jooq.Batch extend Serializable -#1378 - Upgrade internal jOOR dependency to jOOR 0.9.3 -#1379 - Upgrade internal jOOU dependency to jOOU 0.9.1 -#1390 - Add RenderContext.qualify() to indicate whether - QueryParts should render qualified versions of themselves - or not - -Features and improvements (jOOQ Console) ----------------------------------------- -#1242 - Upgrade jOOQ Console dependency on RSyntaxTextArea from - 1.5 to 2.0.2 -#1249 - Allow for filtering incoming statements in jOOQ Console -#1393 - Implement a communication protocol between Console server - types and Console client types to allow for more - sophisticated functionality - -API changes (backwards-compatible) ----------------------------------- -#1310 - Deprecate Factory.literal() in favor of Factory.inline(), - and Factory.field() -#1368 - Promote AbstractQuery.isExecutable() to the public API - -Bug fixes ---------- -#989 - INSERT and UPDATE statements always render non-qualified, - escaped field names. This may cause trouble when using - plain SQL fields -#1109 - Standalone TABLE or VARRAY types are not correctly - initialised before referencing tables load them -#1279 - NullPointerException when leaving empty -#1283 - The LIKE escape character needs escaping, too, in - contains(), startsWith(), endsWith() -#1306 - Add missing INTERVAL data types to HSQLDBDataType -#1308 - Oracle's DataTypeDefinition reports the length of a BLOB - / CLOB data type to be 4000 -#1313 - and match only table names, not - fully qualified names -#1323 - Add support for byte[] in Postgres UDTs -#1324 - Code generation error in Oracle 10g when generating - stored procedures -#1326 - Error when deserialising BLOBs from Oracle UDTs -#1329 - NullPointerException when passing null to - timestampDiff(Field, Field) -#1343 - Regression in insertInto(...).values(...). Cannot pass - Field to values() -#1344 - Initialise Result ArrayLists to their expected size, if - that size is known. -#1360 - jOOR issue 12: "Don't reset the accessible flag to false, - if setting it to true is required, to avoid race - conditions in concurrency contexts" -#1371 - Missing conversion when using unsafe Field types in - BATCH statements -#1376 - Oracle UDTs in REF CURSORs are not deserialised correctly - from procedure OUT parameters -#1377 - Oracle UDTs are not deserialised correctly when the same - UDT name is present in multiple schemata -#1394 - NullPointerException when omitting element in - code generation configuration - -Version 2.2.1 - April 12, 2012 -================================================================= - -This is a minor patch release, fixing some issues related to the -code generation of the new CUBRID integration as well as other, -minor issues. Upgrade if you're using CUBRID - -Bug fixes ---------- -#1287 - Remove oracle.sql dependency also from OSGi information - in pom.xml -#1288 - SQL syntax errors from sequences when using RenderMapping - with defaultSchema -#1289 - DefaultBindContext logs as Util.class -#1297 - Compilation error in CUBRID generated artefacts - referencing OBJECT types -#1298 - Avoid source code generation errors when generating code - for unknown, dialect-specific data types - -Version 2.2.0 - April 09, 2012 -================================================================= - -Finally, jOOQ has added support for another database, and a very -promising one, that is. http://www.cubrid.org is a surprisingly -original mixture of a relational and object-oriented database -where tables and classes are synonyms, so are records and -instances. The CUBRID database has a high level of compatibility -with MySQL and is aimed at MySQL users wanting more performance -for their web applications. For details, see the slides here: - -http://www.slideshare.net/cubrid/growing-in-the-wild-the-story-by-cubrid-database-developers - -jOOQ is proud to have become a CUBRID partner, looking forward -to further cooperation with CUBRID in the near future. - -Apart from that, jOOQ now fully supports SQL standard INTERVAL -data types. With JDBC and JPA lacking official support for this, -jOOQ aims for becoming the tool of choice for vendor-specific -date time arithmetic. True INTERVAL data type support is given in -HSQLDB, Ingres, Oracle, Postgres databases. Besides that, CUBRID -and MySQL support INTERVAL data type arguments in functions. In -other dialects, jOOQ simulates DATEADD(), TIMESTAMPADD(), -DATEDIFF(), TIMESTAMPDIFF(). - -For jOOQ's OLAP friends, there is now also support for the Oracle -LISTAGG function (LIST() in Sybase, XMLAGG() in DB2, STRING_AGG() -in Postgres, GROUP_CONCAT() in CUBRID, H2, HSQLDB, MySQL). -LISTAGG is an "ordered aggregate function", meaning that the -aggregation is done using a specific ordering. Keep an eye out -for more such function support in future versions. - -Features and improvements -------------------------- -#566 - Add support for INTERVAL data types -#585 - Add support for DATE, TIME and INTERVAL arithmetic -#1183 - Add support for DEFAULT values in Oracle stored procedure - parameters -#1243 - Let generated POJOs (and Records) extend base classes - and implement interfaces -#1252 - Avoid JDBC escape syntax for Oracle stored procedure - calls. Generate PL/SQL syntax, instead -#1255 - Let generated Tables contain a public default constructor - to be able to extend those classes - Github issue #12 -#1257 - Add CUBRID support -#1268 - Add Factory.field(String, QueryPart...) to generate - custom clauses -#1269 - Add YEAR(), MONTH(), DAY(), HOUR(), MINUTE(), SECOND() - function support as shortcuts for EXTRACT() -#1273 - Simulate GROUP_CONCAT() aggregate function using Oracle's - LISTAGG() function, where available -#1274 - Add support for the Oracle LISTAGG(...) WITHIN GROUP - (ORDER BY ..) [ OVER (..) ] aggregate / analytic function -#1275 - Simulate Sybase LIST() aggregate function using Oracle's - LISTAGG() function -#1276 - Simulate Oracle's LISTAGG() in DB2 using XMLAGG(), - SUBSTR() and CONCAT() -#1278 - DEBUG log both executed SQL and SQL with inlined bind - values - -API changes (backwards-compatible) ----------------------------------- -#1262 - Pull up OracleFactory.prior() and other CONNECT BY - related methods to Factory - -Bug fixes ---------- -#1241 - Wrong variable binding when comparing CHAR columns in - Derby and DB2 without explicit casting to VARCHAR -#1244 - Cannot override class name in GeneratorStrategy in - Mode.POJO -#1248 - Setting both false and - true leads to compilation errors -#1256 - Fixed code generation issue with H2 user defined - functions returning VARCHAR -#1263 - Pass fetchsizes <= 0 to the JDBC driver (for vendor- - specific MySQL compatibility) -#1270 - Most databases allow for multiple identical foreign keys. - This leads to compilation errors in generated source code - -Version 2.1.0 - March 18, 2012 -================================================================= - -With this version, jOOQ attempts to follow versioning rules -imposed by semantic versioning: http://semver.org/ -There will be 1 minor release per month, and a couple of patch -releases per year, depending on popular demand - -The main improvements for this release include - -- The possibility of providing jOOQ with a custom type mapping. - You can now define your own Converter types that are used by - jOOQ to map a database's SQLDataTypes to your custom types. - This is particularly useful for Java's enums. Read more about - custom converters in the manual: - http://www.jooq.org/manual/ADVANCED/CustomTypes/ - -- There are a lot of new runtime configuration options to control - the SQL style of SQL rendered by jOOQ. You can now specify - whether table/column names should be quoted / capitalised / - lower-cased, whether SQL keywords should be capitalised or not, - etc... - -- The handling of NULL has been improved in favour of using jOOQ - as a SQL builder library (e.g. along with Spring for execution) - NULL is no longer inlined, but bound as a variable. - -- jOOQ now supports simulation of the relational division - operation using an intuitive syntax. Read more about the - relational division here: - http://en.wikipedia.org/wiki/Relational_algebra#Division - -Features and improvements -------------------------- -#161 - Add runtime configuration to pretty print rendered SQL -#349 - Add SQLite relations support -#491 - Add runtime configuration for SQL keyword style (upper - case, lower case) -#521 - Add runtime configuration for SQL reference style (upper - case, lower case, as-is, quoted) -#1150 - Add code generation option to disable generation of - records -#1181 - Add support for SQL Server data types timestamp and - rowversion -#1188 - Load default Settings from the classpath at - /jooq-settings.xml, or from -Dorg.jooq.settings -#1193 - Specify main-class in jOOQ Console's manifest.mf and - include dependency in jar file -#1194 - Add ColumnDefinition.isNullable() -#1202 - Add support for the relational division operation: - A.divideBy(B).on(A.ID.equal(B.A_ID)).returning(A.X, ...) -#1207 - Add Factory.batch(Collection) for - convenience -#1208 - Render @javax.persistence.Column(nullable = false) - property, if available -#1209 - Render @javax.persistence.Column(length, precision, - scale) properties, if available -#1215 - Add org.jooq.Converter for custom type mapping -#1216 - Overload Record, Result.getValue() and .setValue() - methods to accept a Converter -#1217 - Add EnumConverter as a base type for custom enum - converters -#1218 - Add code generation options to generate - referencing a Java type and a Converter -#1224 - Add DataTypeDefinition.getLength() to jooq-meta's type - system -#1233 - Support custom JDBC properties for jooq-codegen -#1234 - Add Database.getTable(SchemaDefinition, String, boolean) - to fetch tables case-insensitively -#1239 - Add Factory.fetchLazy(String, Object...) - -API changes (backwards-compatible) ----------------------------------- -#1191 - Deprecate ConfigurationRegistry and replace by equivalent - ExecuteListener feature -#1219 - API Bug: Cannot use LIMIT .. OFFSET along with FOR UPDATE - -Bug fixes ---------- -#625 - Remove dependency from generated Routines to the - generator's SQLDialect -#1128 - NULL is inlined in INSERT statement instead of binding it - as a variable. This can cause issues when using jOOQ with - Spring -#1137 - Exclude MySQL column-level enum types when that column is - overridden by a -#1158 - Derby cannot handle inlined NULL literals in some - contexts -#1180 - Execute BatchMultiple (multi-query batch query), when - executing BatchSimple (single-query, multi-bind-value - query) with StatementType == STATIC_STATEMENT -#1189 - TableMapping regression for SQLite database -#1190 - Cannot store SQLite records when using - StatementType.STATIC_STATEMENT -#1199 - Table.getFields() returns an internal representation of a - table's field list. Make generated tables immutable! -#1200 - Internal API leak exposed through covariance in - AbstractType.getFields() -#1211 - Enforce method name disambiguation also when using custom - strategies in jooq-codegen -#1212 - Enforce identifier disambiguation also when using custom - strategies in jooq-codegen -#1221 - Incorrect ExecuteListener invocation for INSERT .. - RETURNING. executeStart() and executeEnd() are omitted -#1223 - Cache ExecuteListener classes for performance -#1225 - Bind NULL byte[] as java.sql.Types.BINARY instead of - BLOB in Postgres, to avoid errors -#1226 - Bind NULL UDTs with their associated type name in Oracle -#1232 - SQLException when Factory.fetch() does not return a - ResultSet -#1237 - Don't generate enum classes for columns in MySQL tables - that are excluded from code generation - -Version 2.0.5 - February 26, 2012 -================================================================= - -This release finally introduced basic runtime configuration -features for the jOOQ Factory. This configuration now includes: - -- Execute listener and SQL tracing support. jOOQ allows you to - hook your own listeners into jOOQ's query execution engine to - be notified of all sorts of events -- The existing SchemaMapping features. They are now part of the - runtime configuration -- StatementType settings. Specify whether a Factory should - execute java.sql.PreparedStatements (with bind variables) or - static java.sql.Statements with inlined variables. - -The runtime configuration is documented here: - -http://www.jooq.org/manual/JOOQ/Factory/ - -The listener and tracing support has been requested by -Christopher Deckers, a new jOOQ user who has had the courtesy to -contribute the new jOOQ Console, which is documented here: - -http://www.jooq.org/manual/ADVANCED/ExecuteListener/ - -Apart from that, another long-requested feature is now fully -implemented: The GeneratorStrategy, allowing for custom naming -strategies in generated source code. This will allow for -generating custom table / record class name prefixes / suffixes, -as well as overriding the default behaviour for rendering UPPER, -lower and CamelCase artefacts. See the manual for details: - -http://www.jooq.org/manual/META/Configuration/ - -Features and improvements -------------------------- -#93 - Add Field.equalIgnoreCase(), Field.notEqualIgnoreCase() -#408 - Add class prefixes, suffixes and other options to the - code generator -#492 - Add runtime configuration -#1107 - Let Field.contains() support the Postgres ARRAY @> ARRAY - operator -#1140 - Add ResultQuery.fetchResultSet() to return the underlying - JDBC result set -#1143 - Add Result.isNotEmpty() for convenience -#1145 - Add runtime configuration to specify whether jOOQ should - execute java.sql.PreparedStatement (with bind variables) - or a java.sql.Statement (with inlined parameters) -#1146 - Add Query.getSQL(boolean) to indicate that bind values - should be inlined (as a convenience for - Factory.renderInlined(QueryPart)) -#1148 - Add Cursor.resultSet() to expose the underlying ResultSet -#1149 - Allow for optional - "http://www.jooq.org/xsd/jooq-codegen-2.0.4.xsd" - namespace in jooq-codegen configuration -#1152 - Add & org.jooq.EnumType> - E MySQLFactory.enumType(Class, int) for enum reverse - lookups of MySQL-specific enums -#1159 - Support matching numbers with LIKE, e.g. ID LIKE '%33%' -#1160 - Implement Field.contains(), .startsWith(), .endsWith() - for numeric values, too -#1161 - Use reflection to remove compile-time dependency on - ojdbc for creating ARRAYs -#1162 - Integrate jOOR into jOOQ for simpler reflection -#1164 - Distinguish between Definition.getInputName(), - .getOutputName() -#1165 - Add constraint name to generated javadoc -#1167 - Trivial issue with org.jooq.Factory.exists Javadoc - - GitHub issue #10 -#1169 - Add Configuration.setData(), getData() to convey custom - data in a configuration's lifecycle -#1172 - Add runtime configuration to deactivate JooqLogger -#1177 - Add jOOQ-Console module to jOOQ -#1184 - Add DataType.isArray() - -API changes (backwards-compatible) ----------------------------------- -#1142 - Rename Result.exportXML() to Result.intoXML() to stay - more consistent -#1151 - Deprecate SchemaMapping in favour of new runtime - configuration - -Bug fixes ---------- -#978 - Schema.getTables() and similar methods return empty lists - when Schema is mapped with SchemaMapping -#1153 - Bad inlining of booleans in Sybase ASE / DB2 / Oracle - SQL Server / SQLite -#1154 - Bad inlining of byte[] in most dialects -#1155 - byte[] are erroneously converted to String when using - Record.intoArray() -#1156 - Bad inlining of DATE / TIME / TIMESTAMP data types in - Ingres (and other dialects, when the setting differs from - the default) -#1166 - Some generated Javadoc uses naming strategy or plain - output name, instead of qualified output name -#1168 - Oracle packages are generated as static, instead of - static final -#1175 - Factory.use() seems to render SQL with the Schema name - still present -#1179 - Oracle-generated ArrayRecords need a reference to - org.jooq.Schema to read TABLE of OBJECT from stored - procedures - -Test cases ----------- -#1147 - Add integration tests for executing SQL generated using - Factory.renderInlined() - -Version 2.0.4 - February 12, 2012 -================================================================= - -This release introduced many improvements to source code -generation. These improvements include: - -- Maven and standalone code generation now use the same XML - configuration, which is read by jOOQ-codegen using JAXB. This - allows for more complex configuration elements in the future -- jOOQ-codegen can now handle multi-schema databases and generate - code for tables referencing tables from other schemata. This - is integration tested against the SQL Server AdventureWorks - database -- jOOQ now allows to generate simple POJOs in addition to Records - and to annotate both POJOs and Records with JPA annotations - such as @Entity, @Table, @Id, @Column, @UniqueConstraint, etc. - -You can migrate your existing .properties configuration by running -> org.jooq.util.GenerationTool /your.properties migrate - -Besides that, there is a lot of ongoing work to improve the -integration of Oracle's TABLE and VARRAY types. - -Features and improvements -------------------------- -#8 - Add JPA annotations to generated POJOs / Records -#282 - Add support for multi-schema databases -#287 - Add support for Oracle TABLE types -#395 - Use XML configuration file instead of properties file -#1089 - Add Field.contains(), .startsWith(), .endsWith() as a - convenience for Field.like() (including escaping) -#1092 - Move master data table configuration from - generator.generate to generator.database namespace -#1093 - Add support for generator.strategy in Maven source code - generation -#1094 - Add support for generator.database.date-as-timestamp in - Maven source code generation -#1095 - Move generator.generate.unsigned-types to - generator.database namespace -#1096 - Add support for generator.generate.unsigned-types in - Maven source code generation -#1103 - Add support for SQL Server data type uniqueidentifier -#1106 - Add Factory.escape(Field, char) for use with LIKE -#1108 - Add support for multi-schema databases using Maven code - generation -#1115 - Add support for Oracle VARRAY/TABLE of OBJECT types -#1127 - Add support for POJO classes generation -#1129 - Allow for using Param in LIMIT .. OFFSET clauses -#1132 - Add RenderContext.castMode() to allow for avoiding casts - where this is not really needed -#1136 - Add generation option to enable/disable generating - navigation methods - -Bug fixes ---------- -#1099 - Derby generated artefacts are not sorted alphabetically -#1101 - Internal API leak exposed through covariance in - AbstractTable.joinXXX() methods -#1110 - VARRAY element type information is lost when unnesting - VARRAY's in Oracle -#1111 - VARRAY element type information is lost when unnesting - VARRAY's returned from functions in Oracle -#1114 - Syntax error when unnesting TABLE of OBJECT in Oracle. - The unnested table contains several columns but jOOQ only - unnests "COLUMN_VALUE" -#1117 - NullPointerException when passing an ArrayRecord - containing a null array to a stored function in Oracle -#1125 - Postgres needs casting for date time data types in - queries like SELECT ? FROM DUAL -#1131 - DB2: [Noauthorized routine named "LIKE" of type - "FUNCTION" having compatible arguments was found] when - using Field.like(concat(x, y)) -#1133 - Compilation errors in generated source code if the same - constraint name exists in several schemata -#1134 - NullPointerException in code generation when a foreign - key constraint references a table from another schema - that is not being generated -#1135 - Generated Javadoc references inputSchema instead of - outputSchema - -Test cases ----------- -#1009 - Add more integration tests for proper handling of - java.sql.Date, Time, Timestamp -#1090 - Run jOOQ tests against AdventureWorks SQL Server sample - database -#1105 - Add integration tests for multi-schema source code - generation and querying -#1122 - The 10k lines of integration test code are too heavy for - the compiler. Create test modules with fewer lines of - code, each. - -Version 2.0.3 - January 29, 2012 -================================================================= - -This release focuses on increased compatibility between various -SQL dialect integrations as far as ARRAY and JOIN support is -concerned: - -- ARRAY types are only available in H2, HSQLDB, Oracle, Postgres. - Nevertheless, they can be somewhat simulated in other dialects - using nested selects with UNION ALL. Increased compatibility - leads to a nicer API, where ARRAYs are used along with ALL/ANY - quantifiers, for instance. - -- JOIN syntaxes can be quite powerful in SQL. Apart from - simulating NATURAL JOIN, JOIN USING clauses, as well as a - synthetic "KEY JOIN" syntax, jOOQ now also supports nesting - JOIN expressions to create more complex table sources. See a - recent blog post on the subject here: - -http://blog.jooq.org/2012/01/15/lets-revise-the-sql-from-clause/ - -Features and improvements -------------------------- -#578 - Add KEY JOIN syntax to simulate joining using generated - foreign keys -#577 - Simulate NATURAL JOIN syntax, where this is unavailable -#582 - Simulate JOIN USING syntax, where this is unavailable -#671 - Allow for nesting JOIN clauses -#676 - Add Table.join() methods to create more flexible table - sources -#993 - Add Field.equalAny(T[]), .equalAny(Field) methods -#1048 - Simulate (array) syntax for dialects - that do not support arrays -#1051 - Add Factory.execute(String, Object...) as a convenience - method for Factory.query(...).execute() -#1055 - Simulate Factory.table(Object[]) and table(List) using - UNION ALL in dialects that do not support arrays -#1060 - Improve debug logging of H2 arrays. The syntax is not - ARRAY[1, 2], but (1, 2) -#1065 - Add OracleFactory.sysContext(String, String) to support - Oracle's SYS_CONTEXT function -#1069 - Add support for INSERT INTO table(field1, field2, ...) - SELECT syntax - as opposed to the existing INSERT INTO - table SELECT -#1072 - Add support for LIKE .. ESCAPE .. syntax -#1074 - Add Field.notBetween(T, T) for convenience -#1080 - Add support for JDBC's Statement.setFetchSize() in - ResultQuery.fetchLazy() -#1082 - Add some more DEBUG logging in AbstractResultQuery - -API changes (backwards-compatible) ----------------------------------- -#1059 - Change SelectFromStep.from(Collection>) to - from(Collection>) - -API changes (backwards-incompatible) ------------------------------------- -#1087 - Change the NTILE function to return Field - instead of Field - -Bug fixes ---------- -#1071 - Make Sequence Serializable -#1081 - Derby error in NULL handling when simulating unnested - arrays that contain NULL values -#1084 - Bind index mismatch in val(null).equal(null) and in - val(null).notEqual(null) -#1091 - Add missing @Support annotations on Table.crossJoin() - methods - -Test cases ----------- -#1026 - Add integration tests for NTILE window function and - document compatibility -#1073 - Add integration tests for NOT IN queries holding NULL - arguments - -Version 2.0.2 - January 8, 2012 -================================================================= - -This is a maintenance release for jOOQ 2.0. The main improvements -include - -- The whole jOOQ API is now annotated with a new org.jooq.Support - annotation to help you assess whether a certain SQL clause is - available in your database or not. This is particularly useful - when your application should support several databases at once - (e.g. MySQL, Postgres, Oracle) -- The Oracle PIVOT clause is now formally supported for advanced - statistical queries in Oracle. This clause will be simulated in - other dialects in the future. -- The DATE data type can be mapped to TIMESTAMP. This important - when you query a legacy Oracle database, where DATE columns - can also contain time information -- Several convenience methods have been added for more fluent - syntax, when using plain SQL result queries, subqueries as - tables, or when unnesting arrays in ANY() and ALL() quantifiers - -Further type mapping support is still experimental. An official -cooperation with MinuteProject for source code generation is -being analysed. With MinuteProject, many source code generation -issues could be addressed centrally, as MinuteProject specialises -in source code generation: - -http://minuteproject.wikispaces.com/ - -Features and improvements -------------------------- -#595 - Add support for Oracle's PIVOT clause -#869 - Add support for using ANY, ALL with arrays, not just with - subselects -#1007 - Formally document the API methods to indicate whether - something is supported by any given SQL dialect -#1011 - Add code generation configuration parameter to avoid - generating @Generated annotation -#1019 - Render LIMIT x OFFSET y also for MySQL, instead of - LIMIT y, x -#1022 - Add missing Sybase ASE implementation for Factory.use() -#1024 - Add Factory.resultQuery(String, Object...) to allow for - arbitrary execution modes of plain SQL queries (lazy, - later, into, array, etc) -#1025 - Add missing SQLite implementation for Factory.deg() and - Factory.rad() -#1033 - Generate table comments into generated Tables.java as - Javadoc -#1040 - Add Object[][] Result.intoArray() and - Object[] Record.intoArray() for convenience. Let - E Record.into(Class) also support array types. -#1041 - Add Table Factory.table(Select) convenience - method for more fluency -#1042 - Add support for DISTINCT keyword in SUM, AVG, MIN, MAX - aggregate functions -#1046 - Generate Ingres table and column comments in generated - source code (only Ingres 10) - -API changes (backwards-compatible) ----------------------------------- -#1050 - Deprecate usage of SOME quantifier in predicates, such as - equalSome() - -API changes (backwards-incompatible) ------------------------------------- -#1036 - Fixed API typo in - WindowsRowsStep.rowsBetweenUnboundedFollwing() -#1037 - The fluent API allows for JOIN clauses without FROM - clause - -Bug fixes ---------- -#1010 - The MERGE INTO .. WHEN NOT MATCHED THEN INSERT .. syntax - may cause type-safety issues in some databases. VALUES - should be converted before binding -#1014 - FindBugs: Latent risk of infinite recursion due to typo - in QueryPartList.retainAll(); -#1015 - FindBugs: 7 occurrences of "Bad attempt to compute - absolute value of signed 32-bit hashcode". In extreme - cases, this could lead to SQL syntax errors -#1016 - The Oracle CONNECT BY cond1 AND cond2 syntax erroneously - creates a WHERE cond2 CONNECT BY cond1 statement -#1028 - Syntax errors when using untyped param() in HSQLDB (and - other strongly typed dialects) -#1029 - Postgres can't bind NULL values in cases, where bind type - is Object.class and bind value was created with - Factory.param() -#1030 - UnsupportedOperationException when calling - Query.bind(int, Object) on a query containing plain SQL - fields -#1031 - Incorrect debug logging when plain SQL QueryParts like - field("?") bind null values -#1032 - Incorrect debug logging when plain SQL QueryParts contain - String literals, such as 'Hello? Anyobody out there?' -#1047 - Field.notEqualAny() erroneously renders <> ALL() - -Test cases ----------- -#1021 - Add explicit integration tests for - LEFT|RIGHT|FULL OUTER JOIN - -Version 2.0.1 - December 23, 2011 -================================================================= - -This is a maintenance release for jOOQ 2.0. The main improvements -include - -- Better integration for using jOOQ with Spring Data. This - includes support for named parameters, as well as allowing to - change bind values on previously constructed Query objects -- The MERGE statement has been enhanced for better integration - with Oracle. -- jOOQ is now ready to use with Scala / Groovy - -For more information about using jOOQ with Scala, see this blog -post: -http://blog.jooq.org/2011/12/11/the-ultimate-sql-dsl-jooq-in-scala/ - -There is now also experimental support for a custom type mapping. -This mapping allows to rewrite data types at code generation time -as well as to specify custom enum data types (e.g. boolean Y/N). -Not all integration tests run smoothly for custom data types, -hence, this feature is not yet fully supported. - -Features and improvements -------------------------- -#691 - Add support for Oracle CURSOR REF IN / INOUT parameters -#677 - Add type-mapping configuration, enforcing types for - columns -#947 - Add custom type mapping support (experimental) -#968 - Allow for custom enum types, configured in the code - generator (experimental) -#974 - Add Schema.getTable(String), getSequence(String), - getUDT(String) for better runtime Schema meta-navigation -#975 - Add Sequence.getName(), getSchema(), getDataType() -#980 - Add support for named parameters, to better interact with - Spring -#991 - Add Query.bind(String, Object) and bind(int, Object) to - easily modify existing bind values -#992 - Document thrown DataTypeException in Convert methods -#998 - Enhance MERGE statement for Oracle extensions: - WHEN MATCHED THEN UPDATE .. WHERE .. DELETE WHERE .. - WHEN NOT MATCHED THEN INSERT .. WHERE .. -#1000 - Add support for MySQL's INSERT INTO .. SET .. syntax in - MERGE statement's WHEN NOT MATCHED THEN INSERT clause - -API changes (backwards-compatible) ----------------------------------- -#981 - Cannot insertInto(table("my_table")), as plain SQL tables - return Table, not Table. Relax - bound on R -#988 - Change Factory.field(String) to return Field - instead of Field -#999 - Make MERGE's WHEN MATCHED .. and WHEN NOT MATCHED .. - clauses optional -#1001 - Identity.getField() should return TableField - instead of Field -#1006 - Add Factory.value(...) as a synonym for Factory.val(...) - for increased Scala / Groovy compatibility - -Bug fixes ---------- -#973 - EnumType renders name() instead of getLiteral() in - formatXXX() methods -#977 - EnumType renders name() instead of getLiteral() in - Convert.convert() method -#979 - Record.from() sets all changed flags to true. That's not - necessarily correct in the event of storing the record - back to the DB -#985 - AbstractRecord.equals() does not correctly compare - arrays. Compare them using Arrays.asList() -#986 - Postgres / DB2 / Sybase ASE foreign-key namespace is - unique-per-table. jOOQ forces all foreign keys from all - tables into the same namespace -#990 - Problems when encoding arbitrary byte[] as String(byte[]) - in inlined SQL. This can cause issues when DEBUG-level - logging is activated -#995 - Routines don't respect SchemaMapping - Github issue #8 -#1002 - TableRecord.storeUsing() doesn't update IDENTITY column - values, if the column is not part of the main unique key -#1003 - Sybase / SQL Server / MySQL / Ingres / H2 / Derby's - INSERT .. RETURNING simulation returns null if a table - has an IDENTITY column, but no primary/unique key -#1005 - The INSERT INTO .. VALUES .. syntax may cause type-safety - issues in some databases. VALUES should be converted - before binding - -Test cases ----------- -#984 - Detach IDENTITY column tests from UNIQUE KEY tests, - create a dedicated test suite instead - -Version 2.0.0 - November 25, 2011 -================================================================= -This release is a fresh start in many areas of jOOQ, adressing -issues that have been requested by users for a long time. These -release notes docment the most important changes, a detailed -upgrade guide, as well as the detailed list of improvements. - -Most important changes ----------------------- -- The API became more static. This applies to many Factory - methods, such as val(), literal(), as well as to many Field - methods that have been moved over to the Factory. For example, - when before, you wrote this using "postfix function notation": - -
NAME.replace(" ", "_").trim()
- - you will now write (just as in SQL): - -
trim(replace(NAME, " ", "_"))
- - Using static imports of Factory.*, jOOQ makes SQL look even - more like SQL. The current "postfix notation" is maintained for - backwards compatibility. -- By default, jooq-codegen will now generate a "dynamic" meta - model as opposed to the existing static one. Generated tables - covariantly override the as(String) aliasing method, leading - to a much more convenient aliasing style. When before, you - wrote: - -
-Table parent = T.as("parent");
-Table child  = T.as("child");
-Condition join =
-  parent.getField("ID").equal(child.getField("PARENT_ID"))
-
- - You can now write: - -
-T parent = T.as("parent");
-T child  = T.as("child");
-Condition join = parent.ID.equal(child.PARENT_ID)
-
- - Of course, the existing notation still works - -- Exceptions are no longer checked. When previously, the DB's - SQLException was propagated to client code, there is now an - unchecked DataAccessException hierarchy, similar to that of - Spring. This will eventually give way to a standardised error - handling abstraction, in future developments. -- Window functions are now constructed from their underlying - aggregate functions just like in SQL. For example: - -
-sum(AMOUNT)
-sum(AMOUNT).over().partitionBy(ACCOUNT)
-
- - This makes for a more concise API, especially when considering - future extensions, such as Oracle's KEEP (DENSE_RANK FIRST...) - syntax. -- More type safety has been introduced regarding various places - where generic and types are involved. - This is especially true for INSERT / UPDATE / DELETE statements -- Sequences now also have a type -- Unsigned number types are now supported in those databases that - use them. Unsigned numbers are implemented in jOOU, a spin-off - open source project. For convenience, this library is - "internalised" into jOOQ, to avoid adding a dependency - -http://code.google.com/p/joou/ - -Upgrade instructions: ---------------------- -Various of the above changes are incompatible with jOOQ 1.x. In -order to upgrade, please be aware of the following pitfalls: - -- The schema needs to be re-generated. -- Much of the post-fix function notation is replaced by static - methods in the Factory. Today's org.jooq.Field API is - maintained in jOOQ 2.0, for backwards compatibility. It will - be removed, eventually, though. Expect some incompatible - changes, where window functions are involved -- Some Factory instance methods (such as val(), literal()) are - now static. They are compatible, but may cause compiler - warnings. -- The meta model is now an instance model by default. If you - prefer the static meta model, you can configure this in your - jooq-codegen configuration. -- The additional typesafety involving and types may cause - compiler warnings and errors. -- SQLException is no longer part of the API. This can cause - compiler issues, in particular when extending jOOQ -- Some utility classes have moved to org.jooq.tools - -Should these incompatibilities be too significant for your -project, you can still stay on the 1.x branch, which will be -maintained for a while. Be aware that upgrading might be more -difficult, later, though. - -Features and improvements -------------------------- -#55 - Implement improved exception handling -#117 - Improve DSL support for field and table aliasing (decrease - verbosity) -#519 - Add support for MySQL UNSIGNED numeric types -#626 - Create static function access -#661 - Add support for bitwise operators -#718 - Sequences should be mapped to appropriate type (e.g. - SMALLINT, INT, BIGINT, etc) -#734 - Add support for Oracle / SQL Server CUBE() and ROLLUP() - grouping functions -#751 - Add support for Oracle / SQL Server GROUPING SETS() - function -#799 - Add support for Oracle PL/SQL's object-oriented MEMBER - PROCEDURES and MEMBER FUNCTIONS -#804 - Add to Insert, Update, Delete -#835 - Review API typesafety for InsertSetMoreStep - set(Field, T) and similar methods -#890 - Add Factory.selectCount() convenience method -#891 - Let min() max(), etc functions return a new type - AggregateFunction. This type can then be used as an entry- - point for window functions -#892 - Add support for Oracle / SQL Server GROUPING() and - GROUPING_ID() functions to be used along with CUBE() and - ROLLUP() -#893 - Simulate ROLLUP() function for MySQL, using the WITH - ROLLUP grouping modifier -#894 - Move functions from Field to org.jooq.impl.Factory - and make them static -#895 - Add power(..., Field) -#897 - Add (experimental) Spring integration project -#898 - Replace usage of checked SQLException by an unchecked - DataAccessException, similar to that of Spring -#899 - Build jOOQ .jar files as bundles to be deployed into OSGI - environments -#900 - Purge deprecated API - Prior to 2.0 -#901 - Introduce InvalidResultException as a subtype of - DataAccessException for integrity checks in methods like - ResultQuery#fetchOne(), ResultQuery#fetchMap(), etc. -#902 - Make AggregateFunction the base type for constructing - window functions -#904 - Move SQLDialectNotSupportedException into - org.jooq.exception package -#905 - Introduce MappingException as a subtype of - DataAccessException for integrity checks in methods like - ResultQuery#fetchInto(), etc. -#907 - Add missing Field.like(Field), notLike(Field) - methods to overload the existing Field.like(T), notLike(T) -#908 - Change rpad / lpad functions to accept String instead of - char -#912 - Add R newRecord(Table, Object) as - the inverse of various into(Class) methods -#916 - Add > {Record.into(Table) | - Result.into(Table) | ResultQuery.fetchInto(Table) | - Cursor.fetchInto(Table)} -#917 - Add various Cursor.fetchOneInto() convenience methods -#918 - Add CustomTable, CustomRecord as base classes for more - convenience when used with various into(Table) methods -#919 - Allow for accessing non-public constructors of Record - subtypes -#923 - Move some utilities to org.jooq.tools -#924 - Generate a reference to every table in a new Tables.java - class for improved static access -#928 - Add DataTypeException extending DataAccessException in - case something went wrong when converting data types -#930 - Support converting date time types to java.util.Calendar. - This applies to various into(Class) methods, as well as - Result.getValue(xx, Class) -#931 - Allow for conversion between Long and date/time types, and - vice versa -#932 - Let the bound of R in TableRecord extend TableRecord, - in UpdatableRecord to extend UpdatableRecord -#933 - Add support for type Character in Record.into(Class) - methods and similar -#936 - Accept primitive types, such as int.class for type - conversion -#938 - CODEGEN: Add static/instance table field configuration -#939 - Include license.txt and readme.txt in .jar files' META-INF - directory -#953 - Make DefaultGeneratorStrategy methods non-final to allow - for overriding -#954 - Add examples for source code generation of multiple - schemata with Maven -#955 - Generate a reference to every type in a new UDTs.java - class -#957 - Add R Factory.newRecord(UDT) for constructing - attached UDTRecords -#958 - CODEGEN: Add generation-time schema mapping, allowing for - re-writing schemata in jooq-codegen -#960 - CODEGEN: Add code generation configuration parameter to - avoid using the new UByte, UShort, UInteger, ULong wrappers - for UNSIGNED number types -#961 - Use Oracle's SYS.ALL_SEQUENCES.MAX_VALUE to determine the - type of a sequence. -#969 - Add List ResultQuery.fetch(Field, - Class) convenience method - -Bug fixes ---------- -#686 - Reduce the internal API leak by preventing access to - TableFieldImpl, UDTFieldImpl, ParameterImpl -#903 - lag(Field, int, T) erroneously delegates to lead() -#906 - Add more NullPointerException safety to API -#913 - NoClassDefFoundError in JooqUtil.isJPAAvailable() -#920 - Generic type is lost in Cursor.fetchInto(RecordHandler) -#925 - SelectConditionStep should extend SelectConnectByStep, not - SelectGroupByStep -#926 - AbstractRecord.into() fails to convert java.sql.Date into - java.util.Date -#934 - Don't consider static members in reflection utilities when - used with Record.into(Class) and similar methods -#935 - Don't consider final member fields in reflection utilities - when used with Record.into(Class) and similar methods -#937 - In the event of name clash (same name for table and field) - generated code has errors -#945 - Calling UpdatableRecord.setValue() twice with the same - argument causes the changed flag to be reset to false -#948 - Always set the changed flag to true in Record.setValue() -#959 - Compilation errors in generated source code if MySQL enum - values match Java reserved words, such as 'true', 'false', - 'new', etc... -#962 - Postgres ordering of generated enum literals is unstable -#967 - Better document type conversion - -Version 1.7.0 - November 25, 2011 -================================================================= -This is a maintenance release for the 1.x branch. Some important -bug fixes are merged from version 2.0. These include: - -Bug fixes ---------- -#925 - SelectConditionStep should extend SelectConnectByStep, not - SelectGroupByStep -#926 - AbstractRecord.into() fails to convert java.sql.Date into - java.util.Date -#937 - In the event of name clash (same name for table and field) - generated code has errors -#945 - Calling UpdatableRecord.setValue() twice with the same - argument causes the changed flag to be reset to false -#948 - Always set the changed flag to true in Record.setValue() -#951 - Empty Password for jooq-codegen-maven causes NPE - -Version 1.6.9 - November 7, 2011 -================================================================= -This is a maintenance release for the 1.x branch. Developments -on this branch will stop after version 1.6.9. Only important bug -fixes are merged to this branch. Developments for release 2.0 -have started. - -The most important functionality in release 1.6.9 is the newly -added support for JDBC batch operations. You can now batch -execute several queries. - -See the official blog for more information: -http://blog.jooq.org/2011/10/25/jdbc-batch-operations-with-jooq/ - -Features and improvements -------------------------- -#621 - Add support for JDBC batch operations -#794 - Add support for ORDER BY [int value] in order to reference - a column index for sorting -#882 - Optimise Field.isTrue() and isFalse(). Take Field's data - type into consideration. -#885 - Add support for INSERT INTO .. VALUES (..) syntax, - omitting explicit field declarations -#887 - Add List Cursor.fetchInto(Class) - -Bug fixes ---------- -#748 - H2 regression in 1.3.158 regarding stored functions, which - return a ResultSet (this was fixed in H2) -#859 - Derby casting of numeric types to BOOLEAN doesn't work -#886 - Regression in date extract function when used in a - subselect -#888 - Derby casting of VARCHAR to FLOAT (and similar) doesn't - work - -Version 1.6.8 - October 22, 2011 -================================================================= -The main improvement of this release is the re-design of the -stored procedure / function API. With 12 supported RDBMS, which -all have their own idea about what is a stored procedure and what -is a stored function, it has proven to be a better design, to -unite them in one single type: org.jooq.Routine. A routine can -have a return value as well as OUT parameters. It can be embedded -in SQL and used as a field or a table. - -This means, you will need to re-generate your database schema, -when upgrading to jOOQ 1.6.8. After re-generation, you'll need to -fix your client code. These are the package changes: - -- [generated.package].procedures > [generated.package].routines -- [generated.package].functions > [generated.package].routines -- [generated.package].Procedures > [generated.package].Routines -- [generated.package].Functions > [generated.package].Routines - -Oracle generated packages are not re-located. With these -improvements, using stored procedures and functions becomes even -more reliable, especially when cursor types are involved. Read -more about the rationale behind this change: - -http://blog.jooq.org/2011/10/17/what-are-procedures-and-functions-after-all/ - -Apart from that, important improvements have been made in the -area of plain SQL tables. Also, consider a demo integration of -jOOQ with Google Cloud SQL: - -http://blog.jooq.org/2011/10/22/jooq-and-google-cloud-sql-example/ - -Features and improvements -------------------------- -#271 - Don't pre-fetch table meta data when selecting from plain - SQL tables -#489 - Add support for SELECT * (i.e. render SELECT * where - applicable) -#596 - Add support for VARIANCE() and STDDEV() OVER() window - functions -#608 - Add jOOQ version number in generated source code -#670 - Add more Javadoc to Field.xxx() functions -#692 - Add support for ResultSet type returned from HSQLDB - stored functions -#850 - Use http://www.jooq.org as URL for the @Generated - annotation -#854 - Add convenience methods Fields.isTrue(), isFalse() for - conversion of "Y", "YES", "1", "true", "on", etc into a - boolean condition -#870 - Add support for MEDIAN aggregate function -#872 - Add support for STDDEV_POP(), STDDEV_SAMP(), VAR_POP(), - VAR_SAMP() aggregate functions -#874 - Reduce the number of internal classes for dialect-specific - function aliases -#878 - Implement DataType.equals() and hashCode() - -API changes (backwards-compatible) ----------------------------------- -#851 - Change Field.{sortAsc|sortDesc}(List sortList) into - Field.{sortAsc|sortDesc}(Collection sortList) - -API changes (backwards-incompatible) ------------------------------------- -#848 - Purge deprecated API - Prior to 1.6.1 -#849 - Replace Cursor.fetchResult() by Cursor.fetch() -#852 - Review stored procedures / functions concept. Merge them - all into a single "Routine" type - -Bug fixes ---------- -#756 - Error when aliasing HSQLDB and Postgres unnested tables -#761 - Exception when TRACE logging execution with plain SQL - tables involved -#773 - Execute standalone stored functions as CallableStatement - to prevent issues with transactions -#847 - Query.getSQL() doesn't render dialect-specific SQL when - Query is constructed using the fluent API -#853 - DB2 generated convenience methods for stored functions - have unstable ordering -#857 - Derby casting of numeric types to String / VARCHAR does - not work -#858 - SQLDataType.getSQLDataType() should return itself, instead - of null -#860 - SQLite CEIL function is incorrectly simulated. CEIL(2.0) - returns 3.0 instead of 2.0 -#861 - Field.replace(String) generates bad SQL for various RDBMS. - Field.replace(String, String) works, though -#863 - Ingres integration generates illegal SQL when selecting - things like SELECT 1 WHERE 1 = 1 -#866 - Sybase ASE Field.replace(String) function incorrectly - removes the argument string -#873 - Error when selecting two times the same aggregate field -#877 - Compilation error in generated source code when a table - without a primary key has an identity column -#879 - Add Google Cloud SQL Example -#880 - Query.getSQL() does not consider SchemaMapping - -Test cases ----------- -#811 - Loader integration tests fail for SQLite -#812 - CSV Loader test leaves Postgres JDBC connection in an - inconsistent transactional state on error -#856 - Add integration tests for Field.abs() -#865 - Add integration tests for Field.ascii() -#867 - Add integration tests for Field.sum(), avg(), max(), min() -#881 - Re-design H2 stored functions to be pre-compiled, in order - to speed up integration tests - -Version 1.6.7 - September 25, 2011 -================================================================= - -This release coincides with the launch of the new website at -http://www.jooq.org. Hence, it ships with little additions to the -deliverable itself. - -Apart from new convenience methods, the main addition is a Maven -plugin for jooq-codegen contributed by Sander Plas. - -Features and improvements -------------------------- -#797 - Create Maven plugin for source code generation -#825 - Add List> Factory.fetchMany(String) to - allow for fetching several result sets from stored - procedures, such as Sybase ASE's "sp_help" -#838 - Implement MetaDataFieldProvider.toString() -#841 - Add List Result.getValues(Field, Class) -#842 - Add Query.getBindValues() method to allow for extracting - bind values in the correct order -#843 - Add Factory.fetch(ResultSet) to transform a JDBC ResultSet - into a jOOQ Result - -API changes (backwards-compatible) ----------------------------------- -#837 - Avoid final keyword on Object methods, such as .equals(), - .hashCode(), etc - -Bug fixes ---------- -#836 - Bad syntax when selecting from aliased plain SQL tables -#839 - Boolean conversion in getValueAsBoolean() should trim - String values first -#840 - Numeric conversions in getValueAsXXX() should trim String - values first -#844 - NullPointerException when selecting a column from a Result, - that does not exist - -Version 1.6.6 - September 11, 2011 -================================================================= - -Finally, support for another RDBMS has been added. Sybase's other -important product Sybase Adaptive Server Enterprise (or simply -Sybase ASE) is now officially supported by jOOQ - -Apart from this, there had been important improvements with the -recently added INSERT .. RETURNING clause, as well as some fixes -related to DECIMAL / NUMERIC data types - -Features and improvements -------------------------- -#796 - Complete missing public org.jooq.impl Javadoc -#800 - Add support for Sybase Adaptive Server Enterprise -#808 - Add support for INSERT .. RETURNING for Ingres -#809 - Add support for INSERT .. RETURNING for Sybase SQL - Anywhere using SELECT @@identity -#810 - Add support for INSERT .. RETURNING for SQLite using - last_inserted_rowid() -#813 - Add DSL support for INSERT .. RETURNING -#814 - Change TableRecord to reload its trigger-initialised main - key in Oracle and other RDBMS that don't support IDENTITY - columns -#818 - Add SQLiteFactory.rowid() -#819 - Support SQLite AUTOINCREMENT columns as IDENTITY -#820 - Add Factory.fetchOne(String) for executing plain SQL - queries that return single records -#826 - Allow for returning several records in the INSERT .. - RETURNING clause. This now works for DB2, HSQLDB, MySQL, - and Postgres -#827 - Support Sybase SQL Anywhere's TOP n START AT m clause - instead of simulating it with nested SELECT's - -API changes (previous API now deprecated) ------------------------------------------ -#817 - Deprecate Factory.lastID(Identity) - -Bug fixes ---------- -#815 - SQL Server fetching of IDENTITY value is broken -#821 - Optimise ResultQuery.fetchAny() executing fetchLazy() - internally, and only fetching one record from the cursor -#822 - Let Constant cast to more precise NUMERIC/DECIMAL types - in those RDBMS where casting is necessary -#823 - Cannot bind SQLite BigDecimal, BigInteger types - bind - them as String instead -#824 - BigInteger values cannot be bound in DB2, Derby -#828 - Document inefficient implementation for GREATEST and LEAST - in some RDBMS - -Version 1.6.5 - August 28, 2011 -================================================================= - -This release finally adds a loader for CSV data to jOOQ. You can -now load CSV data using a simple fluent API, configuring error -handling, duplicate behaviour and transaction handling, as well -as various CSV parameters. - -This release also changes the way generated keys are retrieved -after INSERT's. Instead of (potentially inconsistently) running -SELECT MAX(pk) immediately after the INSERT, Postgres' INSERT.. -RETURNING clause is used (or simulated), in a single statement. - -Features and improvements -------------------------- -#784 - Add Result.exportXML() to retrieve a DOM document similar - to that of .formatXML() -#792 - Add support for loading of CSV data into tables -#795 - Add List fetch(int, Class) and - fetch(String, Class) convenience methods -#803 - Add support for INSERT .. RETURNING or simulate it where - not available -#805 - Add T[] fetchArray(int, Class) and - fetchArray(String, Class) convenience methods -#806 - Add T fetchOne(int, Class) and - fetchOne(String, Class) convenience methods - -Bug fixes ---------- -#798 - Oracle IN (...) clause with more than 1000 arguments does - not work -#802 - Use "INSERT .. RETURNING" instead of "SELECT MAX(pk)" - to retrieve the primary key of a new record - -Version 1.6.4 - August 07, 2011 -================================================================= - -This release ships with a couple of useful concepts inspired by -other frameworks. These are: - -- selecting into custom POJO's. Results can be mapped to POJO's - by convention or using JPA @Column annotations -- selecting into custom callbacks. This is already a wide-spread - practice in Spring JdbcTemplates. -- selecting long-running queries asynchronously. This idea has - been inspired by the Avaje Ebean framework - -Apart from these changes and some bugfixes, the internal API has -been completely re-designed. The idea here is that query -rendering and variable binding are even faster (less String -objects), more extensible and more accurate. This is a pre- -requisite for many future developments with even more complex SQL -statements, such as for instance CTE's (Common Table Expressions) - -Features and improvements -------------------------- -#137 - Add support for asynchronous query execution using - FutureResult ResultQuery.fetchLater() similar to - Avaje Ebean -#198 - Add SELECT INTO functionality into POJO's using - T ResultQuery.fetchInto(Class) similar to JPA - CriteriaQuery -#728 - Add .fetchInto(RecordHandler) to ResultQuery, Result, - and Cursor to allow for callbacks similar to Spring's - JdbcTemplate/Ollin Framework -#774 - Add more TRACE logging to .fetchLazy() -#777 - CURSOR: Add function alias: UNNEST for TABLE -#781 - Add E function (Euler number) -#782 - Add T Record.getValue(..., Class) methods - for convenient type conversion -#785 - Allow for storing TableRecord with a provided Field[] - indicating the primary key -#786 - Document thread-safety facts in Factory Javadoc -#788 - Add Key.getFieldsArray() convenience method -#793 - Add support for Oracle's SYS_CONNECT_BY_PATH function - -API changes (backwards-incompatible) ------------------------------------- -#758 - Change internal QueryPart rendering and binding API to use - Configuration and Context as callback parameters. If you - use CustomField or CustomCondition, please correct your - implementations accordingly. Other parts of the API should - not be affected -#778 - Purge deprecated API, deprecation prior to jOOQ 1.5.7 -#790 - Purge deprecated generated code, deprecation prior to - jOOQ 1.5.7 - -API changes (previous API now deprecated) ------------------------------------------ -#776 - Deprecate QueryPart.getSQL(), add Query.getSQL() -#789 - Deprecate Record constructors with Configuration - parameter - -Test cases ----------- -#636 - Add integration tests for more advanced CONNECT BY - example -#772 - Add integration tests for selecting cartesian products - (several tables in FROM clause) - -Bug fixes ---------- -#730 - Sybase cannot bind null values in plain SQL -#759 - Omit the TOP 100 PERCENT clause in SQL Server ordered - top-level queries -#767 - An empty Java package is generated for PL/SQL packages - containing underscores -#771 - Some exotic literals are not properly escaped with quotes - yet, e.g. UDT identifiers, VARRAY types, etc. -#775 - Automatic re-attaching after deserialisation does not work - when used with .fetchLazy() -#787 - The UpdatableRecord's internal changed flags are not - updated after INSERTs / UPDATEs - -Version 1.6.3 - July 31, 2011 -================================================================= - -This is mainly a maintenance release with lots of bugfixes, -mostly around code generation, plain SQL tables, and data types. -Please note that generated source code may contain incompatible -changes due to #639 (see below for details)! - -Apart from that, project CURSOR is advancing and it is now -possible to unnest arrays into tables. See this article for -details about where jOOQ is heading with project CURSOR: - -http://blog.jooq.org/2011/07/24/the-power-of-ref-cursor-types/ - -Features and improvements -------------------------- -#679 - Improve H2 NVL2 support as of H2 1.3.156 -#680 - Improve H2 ROUND support as of H2 1.3.156 -#735 - Add README documentation to GitHub -#736 - Add more info regarding number of generated artefacts in - jooq-codegen logging -#750 - Add DataType.isNumeric(), .isString(), .isTemporal(), - .isBinary() -#754 - Log query as executed by JDBC PreparedStatement when - TRACE logging (without inlining variables) -#752 - CURSOR: Add support for selecting from ARRAY types -#762 - Use H2's native support of NVL, instead of COALESCE -#764 - CURSOR: Add support for selecting from ARRAY types - returned from stored functions - -API changes (backwards-incompatible) ------------------------------------- -#639 - Map DECIMAL(n, 0) and NUMBER/NUMERIC(n, 0) data types - to Byte/Short/Integer/Long/BigInteger instead of - BigDecimal in generated source code. Re-generated code - will not be compatible! - -API changes (previous API now deprecated) ------------------------------------------ -#731 - Inconsistent API with Field.lessOrEqualToXXX(). Removed - "To" from method name -#757 - Deprecate Factory.constant() methods - -Test cases ----------- -#731 - Add missing integration tests for equalAll(), equalSome() - and similar methods -#747 - Upgrade H2 to 1.3.158 - -Bug fixes ---------- -#632 - Sybase error : column @p0 not found in nested SELECT -#700 - Restore HSQLDB ARRAY support with INFORMATION_SCHEMA - change in HSQLDB 2.2.3, and some fixes in 2.2.5 -#725 - Cannot insert byte[] data with plain SQL -#733 - H2 changed JDBC type for ResultSet/CURSOR from 0 to -10, - like Oracle -#737 - Compilation errors in generated source code if table - fields contain spaces -#738 - Compilation errors in generated source code if MySQL - procedure parameter type contains two comma-separated - arguments (like DECIMAL(10,2)) -#739 - Postgres navigator methods and keys are not re-generated - in the same order -#740 - Formatting is broken on Result.format() with some special - newline characters -#743 - Make SQL Server INFORMATION_SCHEMA independent from - HSQLDB again, to prevent incompatibility issues -#744 - Ingres REAL and FLOAT4 types are generated as FLOAT/FLOAT8 - which maps to java.lang.Double, instead of java.lang.Float -#753 - Postgres error when binding array that contains null - values -#755 - NullPointerException when converting an array containing - a null value -#766 - Bad decoding of JDBC Types BIGINT (to BigInteger instead - of Long) and REAL (to BigDecimal instead of Float) when - plain SQL tables are involved - -Version 1.6.2 - July 10, 2011 -================================================================= - -This release mainly introduces three new projects. - -Project CURSOR where jOOQ finally supports various RDBMS's TABLE, -CURSOR, and REF CURSOR data types. This is especially useful when -those types are returned from stored procedures and functions. -Cursors are simply mapped to jOOQ Result types and can -thus be used like regular table results - -Project EXPORT aims at exporting data from the database in -various serialisable formats, such as XML, CSV, HTML, Text, JSON. -This project will be continued in the future, to also -deserialise from (some of) these data streams. This will allow -for easy transport of jOOQ Result types over the net. - -Project CODEGEN has finally been started. Many improvements -suggested by jOOQ users will be implemented in the next releases. -In this release, important fixes have been made to prevent -compilation errors in generated artefacts. - -Features and improvements -------------------------- -#61 - EXPORT: Add Result.formatXML() -#166 - CURSOR: Add support for ResultSet type returned from - Oracle stored procedures / functions -#411 - Allow for fetching Map (instead of Record) - and List> (instead of Result) -#549 - Add Factory.function() for plain SQL functions -#611 - Simulate RPAD and LPAD in SQL Server, Sybase -#627 - Add support for Postgres FOR UPDATE OF [table-name] clause -#628 - Add support for REPEAT (SQL Server: REPLICATE) function -#637 - Nicely format time in StopWatch logging output -#640 - Simulate Postgres FOR UPDATE OF [table-name] clause in - other dialects -#649 - CURSOR: Add Cursor.fetch(int) .fetchOne() - .fetchResult(int) .fetchResult() -#653 - Add support for MySQL encryption and compression functions -#660 - Clarify Javadoc of UpdatableRecord to explain its - behaviour when changing the main unique key -#669 - EXPORT: Add Result.formatHTML() -#672 - Add convenience method UpdatableRecord.copy() in order to - reset primary key values for a subsequent INSERT -#675 - EXPORT: Add Result.formatCSV() -#683 - Implement ResultImpl.equals() and .hashCode() -#684 - Implement AbstractStore.equals() and .hashCode() -#685 - Add Store.size() to indicate the maximum index of the - Store -#687 - EXPORT: Add result.formatJSON() -#689 - Create separate builds: jooq-core.zip and - jooq-with-dependencies.zip -#690 - CURSOR: Add support for ResultSet type returned from H2 - stored functions -#695 - CURSOR: Add support for ResultSet type returned from - Postgres stored functions -#697 - Add Factory.fetch(String) for executing plain SQL queries - that return results -#701 - Add ResultQuery.fetchArray() and .fetchOneArray to return - Object[][] and Object[] -#704 - Always add top and bottom line in Result.format() -#705 - Right-align numeric values in Result.format() -#716 - Add SUBSTRING function Field.substring(Field, Field) - taking fields as arguments -#719 - Document risk of SQL injection in plain SQL and literal - factory methods -#726 - Add LENGTH function as a synonym for CHAR_LENGTH - -API changes (backwards-compatible) ----------------------------------- -#698 - Inconsistent API with Factory.fetch(Table [,Condition]) - Let method return Result instead of List -#699 - Let Result extend List - -API changes (previous API now deprecated) ------------------------------------------ -#656 - Decrease verbosity of plain SQL methods. They will just be - called Factory.field() .condition() .table() .query() - -Test cases ----------- -#643 - Add integration test for code generation of invalid and - incomplete types in Oracle -#654 - Add integration tests for master data tables with PK types - other than NUMBER/INT -#655 - Add missing integration tests for TRIM function - -Bug fixes ---------- -#450 - Improve plain SQL integrity checks for bind variables -#610 - CODEGEN: Compilation error in generated source code for - databases with table named 'system' -#646 - An empty Java package is generated for an empty PL/SQL - package. This is unnecessary -#651 - CODEGEN: Avoid importing datatypes in generated source - code to prevent collisions -#657 - NullPointerException when creating a Factory with a null - SchemaMapping -#658 - Master data table code generation is broken for tables - with more or less than 3 columns -#662 - Add support for the missing Postgres data type "bpchar" -#663 - Add support for the missing Sybase data type "int" -#664 - Ingres INTEGER data types are not correctly generated -#665 - HSQLDB Datatype CLOB and BLOB are not supported, when - selecting from plain SQL tables -#666 - The evil bug: Ingres TRIM function only executes RTRIM -#673 - UpdatableRecord.store() doesn't work if called after - .delete() -#702 - Add support for the missing SQLite data type "NULL" -#706 - CURSOR: Ensure that Query.execute() runs in a single - transaction when Postgres refcursor is involved in the - query (this fixes a Postgres JDBC driver flaw) -#724 - NullPointerException when passing a single literal null - bind value to plain SQL methods without casting to Object -#729 - DB2, Derby, Ingres, Oracle cannot bind null values in - plain SQL - -Version 1.6.1 - June 19, 2011 -================================================================= - -In this release, the PORTABILITY project has been implemented. -Finally, the SQLDialect has been removed from most generated -artefacts (Schema, Table, Field, Sequence, etc). Also, the -constructing Factory is not referenced by its created QueryParts -anymore, unless this is really necessary (Query objects, UDT's, -ARRAY types). This leads to higher compatibility between schemata -of different databases, e.g. if users want to use an HSQLDB -development and Oracle productive database. - -Unfortunately, this means that the way stored procedures are -called had to be changed. This is an API break that could not be -avoided. The pre-1.6.1 StoredObject.execute(Connection) method -is deprecated and will be removed in the future. It has been -replaced by StoredObject.execute(Configuration) - -In addition to this project, many more window functions are now -supported, as well as the Oracle-specific CONNECT BY clause for -recursive queries. - -Features --------- -#351 - Add support for Oracle ROWID data type -#452 - PORTABILITY: Create a super-set of RDBMS data types -#453 - PORTABILITY: Don't create dialect-specific QueryParts -#455 - Add support for the Oracle CONNECT BY clause -#587 - Add optional OFFSET clause to form LIMIT .. OFFSET - constructs -#589 - Add extended FOR UDPATE [OF ...] [{WAIT n | NOWAIT | SKIP - LOCKED }] support -#591 - Add support for LEAD() OVER() and LAG() OVER() window - functions -#592 - Add support for the CUME_DIST() OVER() window function -#601 - Add Factory.literal() convenience methods -#602 - Add Factory.val() methods to decrease .constant() - verbosity -#604 - Add support for RESPECT NULLS clause in some window - functions -#605 - Add Factory.use(String) for non-generated schemata -#613 - Add PI function -#616 - Add Factory.two() literal convenience method -#630 - Add support for Oracle CONNECT BY pseudo-columns LEVEL, - CONNECT_BY_ISCYCLE, CONNECT_BY_ISLEAF - -API changes ------------ -#299 - PORTABILITY: Create a dialect-independent meta-model -#588 - Add OVER() keyword to FIRST_VALUE() and LAST_VALUE() API - -Test cases ----------- -#368 - Add integration test for use with schema mapping -#586 - Upgrade H2 to 1.3.155 -#607 - Add integration tests for CRUD / SP's / UDT's / ARRAY's - with SchemaMapping -#612 - Add integration tests for LPAD and RPAD functions -#624 - Add integration test for code generation of invalid/ - incomplete views in Oracle -#631 - PORTABILITY: Add integration tests for using Oracle- - generated schema against an HSQLDB database -#638 - Add missing integration test for DECIMAL data type - -Bugfixes --------- -#176 - Stored procedures / functions in EQUIVALENT schemata - cannot be called -#493 - Bind variable mismatch when constructing bad SQL -#594 - Confusing Javadoc in SELECT DSL API -#603 - Fix DB2 'IGNORE NULLS' clause -#619 - SUBSTRING() function is broken in DB2, Ingres, SQL Server -#623 - SQL syntax error for some MERGE queries in SQL Server and - Sybase -#633 - SchemaMapping is not applied to sequences -#634 - Sequences are not escaped in generated SQL - -Version 1.6.0 - June 05, 2011 -================================================================= - -Apart from supporting various additional standard and non- -standard JOIN constructs, there is now also full support for the -SQL standard MERGE statement and MySQL's ON DUPLICATE KEY variant -thereof. A great number of API enhancements have been added, -which improve the usability of jOOQ. The Ingres database is now -also supported. - -Features --------- -#301 - Add support for Oracle execution hints -#409 - Add support for NATURAL JOIN syntax, where RDBMS allows it -#415 - Make fluent API's underlying SelectQuery objects publicly - available -#429 - Add Ingres support -#475 - Document class-level generic types and in Javadoc -#486 - Add support for SQL MERGE clause -#494 - Allow for omitting schema name in generated SQL -#496 - Automatically update IDENTITY values in UpdatableRecord, - after storing them -#520 - Add support for JOIN ... USING syntax -#524 - Upgrade HSQLDB to 2.2 -#533 - Add ORDER BY [Map] or BY [List] functionality -#534 - Add Result.isEmpty() -#535 - Call upon ConfigurationRegistry.provideFor() before - throwing a DetachedException -#536 - Simulate CASE [value] WHEN [value] THEN [result] END - syntax in Derby -#538 - Add some logging to ConfigurationProvider -#539 - Add possibility to negate numeric values with Field.neg() -#541 - Add support for MySQL ON DUPLICATE KEY clause -#542 - Allow for Collection arguments in INSERT's DSL API -#543 - Allow for creating FUNCTION() OVER() without PARTITION BY - or ORDER BY clause -#546 - Add Factory.use(Schema) -#548 - Add new internal type FieldMap -#550 - Simulate ON DUPLICATE KEY INSERT clause in dialects other - than MySQL -#551 - Add TableMapping, similar to SchemaMapping for mapping - tables -#553 - Add Factory.plainSQLQuery -#554 - Add Factory.plainSQLField with a DataType parameter -#555 - Add UpdateXXX.set(Map) convenience methods to DSL API -#557 - Enhance INSERT DSL API to allow for adding VALUES clause - with InsertXXX.set() syntax -#570 - Add support for the RAND() function -#567 - Add support for Ingres Sequences -#572 - Add support for the ATAN2() function -#573 - Add possibility for additional select() clauses for - convenience -#575 - Add support for the FULL OUTER JOIN syntax, where RDBMS - supports it -#576 - Add support for the CROSS JOIN syntax, where RDBMS - supports it -#581 - Enhance API and allow Collection> - instead of Collection> - -API changes ------------ -#397 - Purge deprecated API - -Bugfixes --------- -#481 - Handle case where an empty record is stored -#522 - Misleading Javadoc in generated stored procedures and - function constructors -#532 - Restore Postgres INFORMATION_SCHEMA -#537 - Prevent null from being added to QueryPartList -#540 - Error when TRACE logging Limit -#544 - Aliased elements are not bound correctly when rendered - with toSQLReference() -#559 - Loosen type safety on overloaded methods to prevent - compilation errors with javac/Netbeans -#560 - HSQLDB DataType REAL is configured incorrectly -#565 - Add integration tests for current_user() function -#569 - ORA-01427 when generating foreign key relations -#571 - Field.trim() not correctly implemented for SQL Server -#583 - Accelerate integration tests: Reset schema only if - necessary - -Version 1.5.9 - May 15, 2011 -================================================================= - -This version ships with lots of new functionality. Finally, the -DSL-style API has been extended to CRUD operations (INSERT, -UPDATE, DELETE)! Also, support for the TRUNCATE TABLE statement -has been added. - -The most important new features include the support for SQL:2003 -standard window functions, which are available in most major -RDBMS. Additionally, basic function support has been widely -extended. - -Features --------- -#148 - Added support for window functions -#204 - Add support for multi-record INSERT's -#416 - Added support for retrieval of IDENTITY values -#433 - Use bind variables for LIMIT and OFFSET -#441 - Added foreign key relationship meta information to the - generated source code -#446 - Beautify ResultImpl.toString() method -#461 - Automatically cast CONCAT parameters to Field if - necessary -#463 - Added support for trigonometric functions -#471 - Added support for the sign function -#472 - Added support for GREATEST/LEAST functions -#474 - Added support for "hyperbolic" functions SINH, COSH, TANH, - and COTH -#482 - Added DSL API for INSERT statements -#483 - Added DSL API for UPDATE statements -#484 - Added DSL API for DELETE statements -#485 - Added "Registry" for client code to provide Configurations - to jOOQ Attachables -#490 - Added support for the TRUNCATE TABLE statement -#495 - Generate source code for IDENTITY columns -#501 - Added support for boolean conversion to Result, Record, - and Store -#503 - Allow for schema navigation via generated artefacts -#518 - Let stored procedures reference owner package - if applicable -#525 - Added NULLS {FIRST | LAST} clause to ORDER BY constructs -#528 - Added Factory.getDataType() convenience method -#530 - Added Factory.zero() and Factory.one() convenience methods - -API changes (jooq) ------------------- -#527 - Weakened type-safety on Field.nvl2() -#529 - Deprecated Factory.select(Object...), added .selectOne() - and .selectZero() instead - -API changes (jooq-meta) ------------------------ -#30 - Add ParameterDefinition for stored procedures, instead of - reusing ColumnDefinition -#499 - Add reference to TableDefinition in ColumnDefinition -#500 - Add AttributeDefinition for UDTDefinition, instead of - reusing ColumnDefinition - -Bug fixes ---------- -#369 - Adapt H2 relations generation to H2's correction of - information_schema.cross_references -#435 - Added integration tests for NESTED SELECTs holding LIMIT - clauses -#460 - Syntax error when using a field with a reserved name -#462 - Fixed Javadoc broken links -#473 - Don't cast when cast is unnecessary -#479 - INSERT statement should not set all fields for a table -#497 - Derby referential code generation is broken, for named - foreign keys -#498 - Oracle package content is generated in arbitrary order -#502 - Syntax error when creating an empty IN condition -#526 - Corrected Javadoc in Field.coalesce() - -Version 1.5.8 - April 29, 2011 -================================================================= - -Finally, jOOQ now supports two important new RDBMS: -SQL Server and Sybase! - -Apart from this great enhancement, there is now also full support -for the non-SQL standard LIMIT clause, even in dialects where the -LIMIT clause is not supported natively (especially Oracle, but -also DB2, SQL Server and Sybase, which have limitations). jOOQ -simulates LIMITs by rendering nested selects filtering on ROWNUM -(Oracle) or on ROW_NUMBER() (DB2, SQL Server and Sybase). - -Other interesting additions are an increasing support for native -mathematical functions. More function support will be added in -future versions. - -Features --------- -#16 - Added support for SQL Server -#21 - Uniform implementation of the LIMIT clause. Implemented - LIMIT clause simulation through analytic functions, where - LIMIT is not supported natively -#97 - Added support for Sybase -#418 - Measure time of various steps in source code generation -#420 - Added support for proprietary SQL extensions "FOR UPDATE" - and "FOR SHARE" -#431 - Added additional statistics to generation log files -#432 - Unified the various "standard" ANSI INFORMATION_SCHEMA - implementations in the jooq-meta artefact -#436 - Added support for the modulo function -#438 - Added floor and ceil functions -#439 - Added support for mathematical functions (logarithms, - exponentials, sqrt) -#447 - Enhanced Field.add() and Field.subtract() to work for date - time fields, also - - -API changes ------------ -#428 - Created new Maven artefact jooq-meta to cleanly separate - database meta-data navigation from code generation -#458 - Decreased DSL verbosity for arithmetic operations and for - ordering - -Bug fixes ---------- -#417 - Restored warning when unknown column type is encountered - in source code generation -#419 - Corrected misleading Select.fetchOne(...) Javadoc -#421 - Optimised AbstractRecord's memory consumption -#448 - Corrected some Javadoc @see links -#449 - Changed Field.concatenate() to accept Field parameters - to avoid generic varargs warnings - -Version 1.5.7 - April 17, 2011 -================================================================= - -This is the first release built with support of Maven thanks to -the help of some jOOQ users! - -The main new features in this release are the improved support -for serialisation/deserialisation of jOOQ objects through use of -the newly introduced "Attachable" interface. - -If using log4j or the newly supported slf4j logging framework -in debug/trace mode, there is the possibility to log query -building/execution time statistics. - -Apart from these new features, fixes were mainly done in the -fields of type casting, HSQLDB 2.1 upgrade support, stored -procedures with OUT, IN/OUT parameters. Please upgrade, if you -are using any of those features. - -If you extend jOOQ as a base implementation for source code -generation, be aware of the fact, that the jOOQ-codegen is -currently undergoing major changes. Expect the code generation -API to stabilise again in one of the next releases. - -Features --------- -#104 - Added maven dependency -#248 - Integrate UDT types with ARRAYs -#295 - Allow for attaching/detaching UpdatableRecords to/from - Configurations -#359 - Added statistics measurement to Query execution for debug - log level -#362 - Added deprecation configuration flag -#364 - Document unknown type in generated source code -#373 - Improve exception handling in code generation -#378 - Added support for Oracle stored functions with OUT - parameters -#382 - Added Factory.attach() methods to re-attach deserialised - Attachables -#394 - Add logging support for SLF4J -#398 - Allow to provide a DataType in Factory.constant() -#399 - Provide access to TypeUtils.convert() methods via DataType -#404 - Added trace logging for measuring the speed of various - query execution steps - -API changes ------------ -#358 - Enhanced DSL API to allow for HAVING clauses without - GROUP BY clauses -#367 - Make Store, Result, QueryPart "Attachable" -#374 - Introduce strategy pattern to code generation for future - support for advanced naming schemes -#375 - Decouple Database from Generator -#381 - Made DataType Serializable -#384 - Deprecated singleton QueryParts -#388 - Unify "internal" API using an Adapter pattern - -Bug fixes ---------- -#187 - Protect generated Record navigation methods against name - clashes -#266 - Added more thorough integration tests for dialect-specific - casting (including some fixes related to varchar types) -#360 - Added more integration tests for the DISTINCT clause -#361 - Add more checks in testInsertUpdateDelete() -#366 - Warn only once per ColumnDefinition, if a data type is - unknown -#377 - NullPointerException when generating invalid stored - function -#380 - Added integration tests to check for proper - serialisability -#386 - Fixed incompatibilities with HSQLDB 2.1.0 -#387 - Fixed unnecessary imports in some Oracle generated - Records -#389 - Fixed javac compiler warning in AbstractStoredObject -#391 - Cannot properly call stored procedures when IN/OUT - parameter is bound to NULL -#392 - Procedures with several OUT parameters may not register - OUT parameters correctly -#410 - Passing null VARRAY values to Oracle stored procedures - causes issues -#412 - limit(int) sets default offset incorrectly in some - dialects - -Version 1.5.6 - March 31, 2011 -================================================================= - -This release consists mainly of code generation bug fixes and -minor API improvements and enhancements. - -The most important improvement is ticket #90, by which lazy -fetching and iteration over data is now supported. jOOQ lets you -keep a reference to a Cursor that has an open JDBC ResultSet, to -fetch data from on-the-fly. - -A few major code generation bugs were reported where the -generated code may cause ambiguity due to an inconsistent API. -This means that you will have to re-generate your schema after -upgrading to version 1.5.6. Some of your code may not compile -anymore, after this upgrade. - -Features --------- -#90 - Added possibility for lazy fetching of data -#208 - Added convenience methods for direct invocation of - sequences' currval() and nextval() attributes -#212 - Created one factory per dialect for better separation of - dialect-specific support -#213 - Generate a factory for each schema -#251 - Opened up base implementations for Field and Condition - to allow for custom implementations by client code -#274 - Integrate H2 ARRAY types with stored procedures -#292 - Documented usage of log4j and java.util.logging -#306 - Added support for the NULLIF function -#319 - Added Field.between(Field, Field) method -#320 - Added trace logging for variable binding and SQL - generation methods -#323 - Added Field.in(Field...) method -#325 - Include release version number in delivered .jar files -#328 - Improved configuration setup documentation page -#333 - Let Result implement Serializable -#334 - Added fetchMap() convenience methods -#335 - Added more functions and aggregate functions examples to - documentation -#338 - Visually improve code generation logging -#339 - Removed skipping of unreferenced UDT's, ENUM's and ARRAY's -#342 - Improved generated referential code by using fetch() and - fetchOne() API -#356 - Let UpdatableRecord.store() and delete() return an int - to indicate whether the record was actually modified - -API changes ------------ -#233 - Allow for joining TableLike instead of Table -#337 - Added generic type > to - InsertSelectQuery -#341 - Fixed API flaw where SelectOnConditionStep.and() methods - and similar ones returned SelectConditionStep, instead of - SelectOnConditionStep - -Bugfixes --------- -#69 - Corrected referential code generation for foreign keys - that reference non-primary unique keys -#85 - Corrected referential code generation for multi-field - foreign keys -#121 - Covered more Factory.executeXXX() methods with integration - tests -#318 - Fixed NullPointerException when executing SELECT * from - aliased tables -#321 - BetweenCondition does not bind left hand side Field - correctly -#322 - InCondition does not bind left hand side Field correctly -#326 - Avoid method overloading where binding to Object - may lead to compile-time ambiguities (with javac) -#343 - Add more foreign key navigation method integration tests -#347 - Add explicit integration tests for schema artefacts - excluded from code generation -#350 - Disambiguate navigation methods if several foreign keys - reference the same entity -#352 - Disambiguate navigation methods if a table ending on S - references itself -#353 - Added integration test for compilation of generated - artefacts with javac (as opposed to the Eclipse compiler) -#355 - Error when storing an UpdatableRecord that has no changed - values - -Version 1.5.5.2 - March 15, 2011 -================================================================= - -A critical bug was reported from the 1.5 release stream where -stored functions did not render their parameters in correct order - -Features --------- -#302 - Map Oracle's NUMBER data type to java.lang.Number in - stored procedures, stored functions - -Bugfixes --------- -#317 - StoredFunctionImpl.asField() renders parameters in wrong - order - -Version 1.5.5.1 - March 13, 2011 -================================================================= - -In version 1.5.5, there was a fatal bug breaking Derby source -code generation. Only the Derby dialect is affected. Please -update immediately, if you are using jOOQ's Derby integration - -Bugfixes --------- -#315 - Generated master data records are not sorted by PK -#316 - Derby code generation fatally broken - -Version 1.5.5 - March 12, 2011 -================================================================= - -This version is released early as there are some important -bugfixes. Additional improvemetns include: - -- Improved DSL related to conditions in HAVING and JOIN clauses -- Support for Oracle-style functions, such as NVL, NVL2, COALESCE - DECODE, etc - -Features --------- -#304 - Add support for Oracle NVL function -#305 - Add support for COALESCE function -#308 - Add support for Oracle NVL2 function -#311 - Add support for Oracle DECODE function - -API changes ------------ -#223 - Enhance DSL to accept and(), or() and similar methods in - JOIN steps -#224 - Enhance DSL to accept and(), or() and similar methods in - HAVING steps - -Bugfixes --------- -#297 - Fixed Factory.concatenate() function -#298 - Added integration tests for nested selects in HAVING - clause -#300 - Added integration tests for nested selects in JOIN clause -#303 - Javadoc correction -#307 - Accelerated integration tests -#309 - Fixed JDBC variable binding issue related to Conditions - where the lhs is a function (e.g. stored function) and the - rhs is a constant -#310 - Fixed issue where fetchOne() methods throw - NullPointerException if no result record is available -#312 - Fixed issue where Field.equal(...) methods rendered - unexpected SQL when rhs null is cast to a type -#313 - Fixed Derby cast type for VARCHAR -#304 - Let the DerbyDataType default for java.lang.String be - VARCHAR, not LONG VARCHAR - -Version 1.5.4 - March 04, 2011 -================================================================= - -Feature #243 required a minor API change in the base classes of -generated source code. This means you have to re-generate all -your jOOQ artifacts in order to migrate to 1.5.4. The artifacts -themselves should be regenerated in a compatible way, such that -your client code should not be affected. If this is not the case, -please report a ticket here: - - https://sourceforge.net/apps/trac/jooq/newticket - -Apart from the Derby RDMBS and some new data type support, there -have been many new convenience methods added all over the API. -For instance, if type-safety is not really a requirement, there -are lots of possibilities to use plain SQL directly in the DSL. -In that case, data can be accessed from Record, Results, not only -through Field, but also through field names or indexes. - -Check out the updated documentation (soon) here: - - https://sourceforge.net/apps/trac/jooq/wiki/Examples - -- Support for the Derby RDBMS -- Support for casting. This allows for even greater flexibility - in cases where jOOQ cannot 100% ensure type-safety -- Support for ARRAY types. Oracle, Postgres, HSQLDB and H2 ARRAY - types are now supported natively as regular bindings in - jOOQ's Field -- Support for dialect-specific data types. CHAR, VARCHAR, CLOB - are no longer treated equally as java.lang.String. Their - type heritage is also generated -- More sequence support -- Lots and lots of bug fixes - -Features --------- -#95 - Support for the Derby RDMBS -#163 - Add support for JDBC type ARRAY (with Postgres) -#209 - Add support for DB2 sequences -#210 - Add support for H2 sequences -#211 - Add support for HSQLDB sequences -#215 - Support for SQL casting using as cast type -#246 - Support for SQL casting using dialect-specific data types -#254 - Add HSQLDB support for ARRAY types -#256 - Add Oracle support for VARRAY types -#257 - Integrate ARRAY types with stored procedures -#261 - Add a global type mapping to the generated Schema object -#267 - Add DataTypeDefinition for further abstraction of data - types in code generation -#269 - Add H2 support for ARRAY types -#290 - If log4j is not on the classpath, use java.util.logging - instead, as fallback - -API Changes ------------ -#156 - Allow for results to be accessed by index, not by field -#218 - Corrected bad method signature: - Record.getValueAsLong(Field, Integer) -#219 - Extended Result and Select API's to be more similar to - that of Record -#232 - Add more convenience plain SQL support to the API -#235 - Add convenience methods to Record, Result and Select for - access of data via field name -#243 - Refactor DataType implementations in order to allow for - the use of generics -#259 - Add field type to database meta data (ColumnDefinition) -#260 - Add field type to database meta data (Field) -#262 - Add default behaviour for Record.getValue(Field) -#276 - Add Javadoc as a ZIP file to the jOOQ distribution - -Bugfixes --------- -#125 - Add more plain SQL integration tests -#191 - Add more integration tests for nested unions -#205 - Implemented workaround for handling Postgres stored - functions with UDT OUT parameters -#214 - Fixed NPE when generating a stored function with an - unknown parameter type -#216 - Fixed some cases where binding of BigInteger is not done - correctly -#220 - Syntax error when using select statement in a CASE clause -#221 - Corrected integration tests for combined update and - select statements -#222 - Added integration test for INSERT statements having - nested SELECT statements for their fields -#225 - Correctly cast array types in Postgres -#230 - Potential misuse of Blob and Clob in H2's JDBC types -#239 - Factory.fetchAny() is not implemented for SQLite -#244 - Fixed peculiar MySQL casting support where cast types do - not match any data types -#245 - Fixed NPE when reading null dates in SQLite -#249 - Added ARRAY type integration tests -#255 - Stored procedure bind variables get mixed up when any - argument is null -#263 - Correctly handle Postgres function overloading -#264 - Ambiguous funciton calls when calling overloaded functions - with null parameter -#281 - Handle compilation errors when generating stored - procedures with > 254 parameters -#283 - Fixed compilation errors in generated source code for - Oracle's UDT table type -#284 - Fixed compilation errors in generated source code for - Oracle procedures in packages, when they have no - parameters -#285 - Fixed compilation errors in generated source code for - Oracle tables with the same name in different schemata -#286 - Fixed name collisions in generated objects with the - java.lang.* package -#288 - Prevent the creation of UNION queries with bad syntax - in MySQL -#289 - Correctly alias fields within UNION queries for some - dialects, which then only require the "AS" keyword -#291 - Cannot create an aliased field called "year" in Postgres - -Version 1.5.3 - January 13, 2011 -================================================================= - -- Lots of stored procedure support was implemented -- Support for sequences was added -- The final decision to postpone support for DB2 UDT's was made -- Some code generation bugfixes - -Features --------- -#36 - Added stored procedure / stored function support for HSQLDB -#140 - Added support for Oracle sequences -#147 - Added support for H2 stored functions -#162 - Correctly integrate UDTs with stored procedures -#170 - Added support for Postgres stored functions -#186 - Added support for more Oracle PL/SQL simple data types -#193 - Simulate support for H2 "stored procedures" -#195 - Simulate support for Postgres "stored procedures" -#206 - Added support for Postgres sequences - -API changes ------------ -#180 - Improved DSL for constant values -#181 - Allow for referencing Field in function argument list -#189 - Renamed convenience methods in org.jooq.Record -#207 - Add fetchOne(Field) method to org.jooq.Select API - -Bugfixes --------- -#182 - Protected generated Record classes against clashes with inherited methods -#183 - Fixed NullPointerException, when generating master data tables with - NULL fields -#184 - Fixed IllegalArgumentException, when a data type is present in the - schema, but unavailable in code generation logic -#185 - Code generation should not fail when single elements cannot be generated -#188 - Improved integration tests for stored procedures / functions / packages -#196 - Increase RDMBS version compatibility by avoiding "SELECT *" in code - generation logic -#199 - Added integration tests for stored procedures in RDBMS that do not - support OUT parameters -#201 - Fixed issue in DB2 where stored procedures without parameters were not - generated. -#202 - Added integration tests for stored procedures / functions without - parameters - -Version 1.5.2 - December 27, 2010 -================================================================= - -- Improved support for stored procedures, also in packages -- A minor API change was inevitable to implement #173. The API change only - concerns the INTERNAL API. Deprecation marks are added and deprecated items - will be removed in 1.6.0 -- Experimental SQLite database support -- Some important bug fixes - -Features --------- -#25 - Added support for Oracle packages -#114 - Added support for Oracle UDTs -#145 - Added support for the SQLite database -#150 - Generate static convenience methods for stored procedures / functions -#151 - Generate static convenience methods for stored function fields -#152 - Generate meaningful serialVersionUID in generated classes -#173 - Added support for EQUIVALENT schemata - -API changes ------------ -#159 - Added convenience method List getValues(Field) to Result -#165 - Added convenience methods for creating EXISTS clauses -#169 - Improved DSL for WHERE clauses - -Bugfixes --------- -#68 - Prevent issues originating from overloaded stored procedure names, - generating identical Java class names -#153 - Fixed issue with generated code for DB2 stored functions -#154 - Fixed issue with generated code for DB2 stored functions -#155 - Fixed issues with database NULL not being mapped correctly to Java NULL - when selecting values that have a primitive type (int, long, etc) -#158 - Potential ClassCastException when using Field -#171 - Corrected issue related to selection of default schema in DB2 -#177 - Fixed issue related to generated code for tables or UDTs without columns - - -Version 1.5.1 - December 13, 2010 -================================================================= - -- H2 database support thanks to Espen Stromsnes -- Improved stored procedure support - -Features --------- -#96 - Added H2 database support -#101 - Added stored procedure / stored function support for Oracle -#138 - Added stored procedure support for DB2 -#146 - Added support for DB2 functions - -API changes ------------ -#143 - Added convenience methods to Record - -Bugfixes --------- -#84 - Implemented referential code generation for foreign keys that do not - match their primary keys' types -#141 - Encoding problem in generated master data classes - -Version 1.5.0 - November 22, 2010 -================================================================= - -- A big one. Major API changes / improvements -- Added lots of convenience methods -- UDT support -- Enum support -- DB2 support thanks to Espen Stromsnes -- "Light" dependency to log4j added. jOOQ will still run without it - -Features --------- -#1 - Create support for UDTs (so far only for PostgreSQL) -#15 - Added DB2 support -#60 - Added support for nested selects in INSERT and UPDATE - statements -#83 - Added log4j logging to code generation and runtime -#87 - Add support for arithmetic expressions -#105 - Added support for ENUM data types, where applicable - (MySQL and PostgreSQL so far) -#110 - Added execute and fetch convenience methods -#111 - Added missing "select distinct" support -#122 - Annotate generated classes with javax.annotation.Generated -#123 - Generate user enum fields from data values (master data) -#124 - Added PlainSQLTable -#127 - Added not() operator to Condition -#135 - Added convenience methods andNot() and orNot() in - Condition - -API changes ------------ -#89 - Removed support for DataSource. jOOQ is not a transaction - manager -#92 - Added SortField type to be used for sorting -#99 - Provide better access to functions (No more FunctionFactory) -#116 - Merge Manager functionality into Factory -#118 - Improve API of org.jooq.Field -#119 - Improve subquery condition API -#132 - Reduced much of the select query API -#134 - Better separation of SelectQuery and SimpleSelectQuery - -Bugfixes --------- -#109 - Error when executing select * if generated schema does not - match actual schema -#115 - Fix various "null" pseudo field issues -#126 - Error when selecting a single field from a union nested - select -#129 - Fixed performance issue in Oracle code generation for - very large databases - - -Version 1.4.4 - November 22, 2010 -================================================================= - -Unreleased version, fixes included in 1.5.0 - -Bugfixes --------- - -#133 - JoinCondition does not take comparison operator - -Version 1.4.3 - October 25, 2010 -================================================================= - -Some more bugfixes - -Bugfixes --------- - -#71 - Generated code does not compile, when foreign key and - primary key have a data type mismatch -#73 - In Oracle generated code, multi-field foreign keys may - generated bad relations code -#82 - Conversion of literals to camelcase fails if numbers are - involved - -Version 1.4.2 - October 22, 2010 -================================================================= - -Various bugfixes and minor improvements - -Features --------- -#66 - Add support for CASE or DECODE expression - -API changes ------------ -#77 - Functions should not extend FieldImpl, but a new - AbstractField -#78 - QueryPart pollutes declared method space of its - implementations. Hide it by indirection - -Bugfixes --------- -#64 - Code generation fails when foreign key references a unique - key that is not the primary key. Code generation for these - cases is omitted -#67 - When loading properties files, a leading / seems to be - mandatory. This is preventing users from correctly setting - up jOOQ the first time -#70 - Add support for Oracle datatype TIMESTAMP(6) -#72 - Name clashes in generated Tables -#75 - Constant does not bind its values. -#76 - Constant should not render strings all the time -#79 - Constants are not properly escaped -#80 - Position function does not bind any variables -#81 - Add cast function to Constants in HSQL - -Version 1.4.1 - October 18, 2010 -================================================================= - -Oracle patch release - -Features --------- -#63 - Generate referential functionality for Oracle - -Version 1.4.0 - October 17, 2010 -================================================================= - -Support for PostGreSQL was added. -Added lots of OR-mapping functionality. -There is a general API change due to various new features. - -Features --------- -#14 - Add PostGreSQL support -#40 - Resolve foreign keys. Allow for navigation between objects. -#42 - Add PlainSQLField -#45 - Add "dirty" flag to Record's values. This allows for - updating only relevant data. -#47 - Complete implementation for UPDATE, INSERT, DELETE - statements. Added some missing functionality. -#48 - Add more support for Date, Time, Timestamp fields. -#51 - Add a org.jooq.impl.Manager class that provides common - utility methods for CRUD operations - -API changes ------------ -#10 - Add second generic type . This is a - prerequisite for many OR-mapping features -#18 - Use org.jooq.Record in InsertQuery and UpdateQuery -#46 - Create UpdatableRecords as a prerequisite for JPA and true - OR-mapping. These records support store() and delete() - methods -#52 - Add default constructor in generated Records. -#53 - Add refresh functionality to UpdatableRecords. See also #46 -#54 - Add a state to the factory class -#56 - Reduce API, remove unnecessary Condition subinterfaces -#57 - Reduce API, remove unnecessary QueryPart interfaces - -Bugfixes --------- -#49 - NullPointerException when generating relations on schema - subset -#58 - Count function renders bad SQL in various dialects -#59 - Exception when selecting unaliased functions in queries - -Version 1.3.0 - August 24, 2010 -================================================================= - -Support for HSQLDB was added. -There is a major API change due to #44. - -Features --------- -#29 - Generate primary keys and foreign keys in Oracle code - generation -#34 - Add support for HSQLDB -#39 - Generate primary keys and foreign keys in HSQLDB code - generation -#41 - Add documentation to QueryFactory and Functions - -API changes ------------ -#23 - Add support for more advanced joins -#32 - Merge SelectQuery and ResultProviderQuery interfaces -#44 - Let Query methods return "this" - -Bugfixes --------- -#35 - Add unit tests for HSQLDB support -#37 - Syntax error in combined select queries! - The usage of combined queries in MySQL may still be a bit - awkward. Keep an eye out for further fixes -#43 - Join with aliased tables doesn't work - -Version 1.2.0 - August 21, 2010 -================================================================= - -The added Oracle support is now unit tested and more stable. -The Oracle NUMBER data type is mapped more precisely to Java -types. - -Features --------- -#12 - Model primary keys and foreign keys in generated code -#22 - Improve mapping of Oracle NUMBER data type -#26 - Add Plain SQL QueryParts -#27 - Add support for HAVING clause - -Bugfixes --------- -#24 - Add Unit tests for oracle database (and fixed bugs) -#31 - Pull up addOrderBy() methods from SelectQuery to - ResultProviderQuery - -Version 1.1.0 - August 17, 2010 -================================================================= - -The main new feature is the Oracle support. Wait for -Version 1.1.1 for that support to be stabilised, as there are no -Oracle unit tests running against an Oracle database yet. - -Features --------- - -#2 - Add support for inner / nested selects -#3 - Add more function support -#4 - Implement filtering functionality for code generation -#6 - Add Oracle Support -#9 - Create true POJO's (implementing org.jooq.Record) with - getters and setters -#17 - Make org.jooq.impl.Parameter independent of Field - -Bugfixes --------- - -#11 - Code generation does not remove files - -Version 1.0.1 - August 14, 2010 -================================================================= - -Features --------- - -#5 - Prevent code regeneration, if no changes were made -#7 - Implement ant task for code generation - -Version 1.0.0 - August 14, 2010 -================================================================================ -Initial Release \ No newline at end of file diff --git a/jOOQ-website/inc/RELEASENOTES-2.5.txt b/jOOQ-website/inc/RELEASENOTES-2.5.txt deleted file mode 100644 index bd6cb59fb4..0000000000 --- a/jOOQ-website/inc/RELEASENOTES-2.5.txt +++ /dev/null @@ -1,2936 +0,0 @@ -jOOQ Release notes -================== - -For an interactive overview, see also -http://github.com/jOOQ/jOOQ/issues - -For a formatted text version, see -http://www.jooq.org/notes.php - -For a text version, see -http://www.jooq.org/inc/RELEASENOTES.txt - -Version 2.5.1 - September 23, 2012 -================================================================= - -This is a minor patch release with some useful fixes for the -2.5 branch - -Bug fixes ---------- -#1751 - Result.intoResultSet() generates wrong ResultSetMetaData - if runtime schema mapping is applied -#1764 - Add missing @Support({ ... FIREBIRD ... }) annotations -#1768 - NullPointerException when DAO.fetchOne() returns no - record -#1774 - QueryPart.toString() does not load default settings from - classpath -#1786 - Fix SEQUENCE support for Firebird -#1792 - Factory.fieldByName() and tableByName() do not correctly - escape quotes -#1797 - SQL syntax errors when plain SQL contains comments with - question marks and SQL is executed as - StatementType.STATIC_STATEMENT -#1802 - Result.into(Table) doesn't work correctly, if the same - field name appears twice in Result -#1819 - MappingException in Record.into(Class), when POJO setters - have applicable names but non-applicable argument types -#1820 - Cannot fetch into non-public POJO classes. Their members - / getters / setters should be made accessible -#1829 - Factory.execute(String) may cause errors when plain SQL - returns results - -Version 2.5.0 - August 26, 2012 -================================================================= - -Welcome to another great database integration in jOOQ: Firebird! -This is one of the more popular open source SQL databases out -there, with a rich feature set, including the SQL standard MERGE -statement. - -Apart from this, the main new features are: - -- Optimistic locking. jOOQ's UpdatableRecord API transparently - implements optimistic locking on its store() and delete() - methods. By default, the in-memory record is compared with the - one in the database at write time. But you can also let jOOQ - handle incremented VERSION or TIMESTAMP columns for you. -- Oracle feature increment. Many nice Oracle features are now - supported: user-defined aggregates, regular expressions, - Oracle Text, CONNECT_BY_ROOT and ORDER SIBLINGS BY clausess, - partitioned outer joins and more -- jOOQ's convenience API has been greatly enhanced. This includes - many improved fetch methods and new short forms for equal=eq, - notEqual=ne, greaterThan=gt, etc. to better align jOOQ with - JPA, XSL, QueryDSL and many other tools that abbreviate these - keywords -- Many types and methods have been deprecated to help you foresee - the upcoming changes in jOOQ 3.0 - -Please consider also the updated manual with its new, more -user-friendly structure - -Features and improvements -------------------------- -#430 - Add support for the Firebird database -#457 - Add support for Oracle user-defined AGGREGATE functions -#620 - Add support for the SQL:2008 standard LIKE_REGEX operator -#722 - Remove casting of bind values in Ingres -#727 - Simulate RPAD and LPAD in SQLite -#816 - Add support for Oracle Text functions -#1339 - Add option to generate immutable pojos -#1547 - Support "optimistic locking" in UpdatableRecord.store() - and delete() -#1552 - Generate fetchBy[ColumnName] methods in generated DAO - classes -#1553 - Add some Javadoc to document the difference between using - a Factory with a Connection or with a DataSource -#1556 - Add javax.validation API to full deliverable -#1565 - Add Factory.connectByRoot(Field) to support the Oracle - CONNECT_BY_ROOT pseudo column -#1570 - Add Factory.condition(String, QueryPart...) similar to - Factory.field(String, QueryPart...) -#1582 - Add support for Oracle's ORDER SIBLINGS BY clause, in - combination with CONNECT BY -#1586 - Add missing constructors taking DataSource to dialect- - specific factories -#1587 - Generate missing constructors taking DataSource in - schema-specific factories -#1595 - Simulate REPEAT() in SQLite -#1596 - Add support for optimistic locking using generated - information about "timestamp" or "version" columns -#1627 - Handle NULL in CSV imports/exports -#1645 - Add support for Oracle's PARTITION BY clause in OUTER - JOINs -#1657 - Reorganise the manual -#1664 - By default, activate in the code generator -#1665 - Add support for the empty GROUP BY () clause -#1675 - Add support for the SQL standard IS [NOT] DISTINCT FROM - predicate -#1680 - Overload all plain SQL DSL methods to also accept - QueryPart arguments -#1681 - Simulate empty GROUP BY () clause in Sybase ASE and - Ingres, joining a dummy table and grouping by a constant - field -#1684 - Add Setting to indicate that fetched - records shouldn't be automatically "attached" -#1685 - Improve Javadoc of Attachable.attach(). Document how - "detaching" works -#1688 - Add E Record.into(E) as a complement to - E Record.into(Class) -#1692 - Replace Factory.executeInsert(), Factory.executeUpdate() - and similar methods with more succinct variants -#1696 - Add short versions of comparison predicate methods, such - as eq, ne, gt, ge, lt, le -#1698 - Add support for the SQL standard BETWEEN SYMMETRIC - predicate -#1701 - Add Factory.not(Condition) as a synonym for - Condition.not() -#1704 - Document the behaviour of Factory.newRecord(Table, - Object) and Record.from(Object) with respect to - UpdatableRecord.store() -#1707 - Add Map> ResultQuery.fetchGroups( - Field) and Result.intoGroups(Field) -#1712 - Add > Result.sortAsc, - .sortDesc(Field) -#1713 - Add Result.sortAsc, .sortDesc(Field, - Comparator) -#1714 - Add Result.sortAsc, .sortDesc(Comparator) -#1718 - Document usage of InvalidResultException on the - ResultQuery.fetchXXX() Javadocs -#1721 - Add Map> ResultQuery.fetchGroups( - Field, Field) and Result.intoGroups(Field, - Field) -#1722 - ResultQuery.fetchArray(int) and .fetchArray(String) - should return a typed array, even if this cannot be - checked by the compiler -#1723 - Add Factory.fetchLazy(ResultSet) - -API changes (backwards-compatible) ----------------------------------- -#1544 - Remove Attachable interface from QueryPart hierarchy -#1579 - Deprecate org.jooq.Type -#1580 - Deprecate org.jooq.SchemaProvider -#1638 - Deprecate org.jooq.ArrayRecord.createArray() -#1639 - Deprecate org.jooq.Adapter -#1687 - Let Cursor.fetchInto(Table) return Result instead - of List -#1736 - Deprecate TableRecord.{store|refresh|delete}Using() - methods as being part of jOOQ's internal API -#1741 - Deprecate org.jooq.MasterDataType - -Bug fixes ---------- -#1572 - Use Thread.currentThread().getContextClassLoader() to - load ExecuteListener classes as a workaround for - experienced class loading problems when using OSGi -#1584 - Code generation error with Oracle UDT static functions -#1632 - Improve the performance of various DefaultRenderContext - methods, by locally caching Settings values -#1633 - Improve the performance of CursorImpl.CursorIterator by - setting Record values by index rather than by Field -#1635 - Improve the performance of Factory.fetch(ResultSet) by - caching data type normalisation regex in FieldTypeHelper -#1650 - jOOR Fix #16: Can't call Reflect.create(A, B, null) -#1660 - Factory.renderContext().castMode(CastMode.NEVER) - .render(query) doesn't work. CastMode is not applied -#1667 - Bad variable binding when NULLS FIRST, NULLS LAST is - simulated in SQL Server and other databases -#1673 - Result.formatXML() and Result.intoXML() do not render - namespaces correctly -#1683 - Oracle code generation regression for 10g. No such column - ALL_PROCEDURES.OBJECT_ID -#1693 - Cannot bind UDT values from other schemata to stored - procedures -#1730 - Compilation errors in SQLite generated code when flag - is set to true - -Version 2.4.0 - July 8, 2012 -================================================================= - -This release's main new feature is jOOQ's added convenience in -Factory initialisation for those users who get their database -connectivity through JDBC DataSources. If supplied with a -DataSource, a jOOQ Factory will handle the Connection lifecycle -internally, closing the Connection when no longer needed. - -The H2 MERGE statement syntax is now supported and simulated in -other databases, for those users that prefer its more intuitive -syntax over the SQL standard. - -The code generator now also allows for generating interfaces and -DAOs per table. DAO generation was previous discussed on the user -group and seen in a competitor product called OneWebSQL. - -The jOOQ Console now supports breakpoints for even more effective -SQL development - -Features and improvements -------------------------- -#1141 - Add Result.intoResultSet() to wrap a Result in a JDBC - ResultSet -#1253 - Avoid JDBC escape syntax for date/time literals -#1280 - Generate DAO classes and interfaces for POJOs -#1404 - Document the lifecycle of an ExecuteListener in the - Javadoc -#1411 - Add support for Postgres "any" data type (with quotes!). - This seems to map well to java.lang.Object -#1418 - Support case-insensitive schema names in code generation -#1419 - Add some WARN-level logging when the source-code - generator doesn't generate any artefacts -#1423 - Add Field.likeIgnoreCase() to support Postgres' ILIKE - operator -#1424 - Add Factory(DataSource) and similar constructors -#1427 - Add Factory.batchStore(Collection>) for convenience -#1428 - Add DataType.convert(Object...) and - DataType.convert(Collection) for convenience -#1431 - Add org.jooq.Name Factory.name(String) to contruct - QueryParts that are escaped according to - Settings.getRenderNameStyle() -#1432 - Add Factory.fetch(String, QueryPart...) and - Factory.execute(String, QueryPart...) and similar methods - to support arbitrary QueryParts in plain SQL -#1434 - Add UniqueKeyDefinition.isPrimaryKey() for completeness -#1438 - Add Result Factory.fetchFromCSV(String) -#1440 - Add top-level pom.xml for jooq-parent artefact (GitHub - Issue #14) -#1446 - Converting arbitrary strings to Number / Date should - return null, instead of throwing an exception -#1449 - Generate some meaningful Javadoc into the generated - [schema-name]Factory classes -#1454 - Add line breaks to generated Javadoc where appropriate -#1463 - Add option to let generated Record / POJO objects - implement a common generated interface -#1470 - Support interface types in ResultQuery.fetchInto(Class), - Result.into(Class), and Record.into(Class) methods, - returning a proxy -#1471 - Upgrade internal jOOR dependency to jOOR 0.9.4 -#1473 - Add IdentityDefinition to jooq-meta -#1501 - Add support for conversion of String to - java.sql.{Date, Time, Timestamp}. GitHub issue #22 -#1504 - Document behaviour of fetch() and fetchOne() in case jOOQ - cannot fetch actual records -#1509 - Minor improvements in the generator source code. GitHub - pull request #23 -#1510 - Generate additional setters for foreign keys, accepting - records as arguments -#1521 - Expose Connection methods, such as commit(), rollback() - and similar transaction-related methods in Factory -#1523 - Support ROW_NUMBER() OVER() for the latest version of - Derby and H2, which support it -#1524 - Simulate ROW_NUMBER() OVER() in HSQLDB using ROWNUM() -#1528 - Let generated interfaces extend Serializable -#1532 - Clarify the lifecycle of Configuration.data in the - Javadoc -#1534 - Generate more meaningful Javadoc where "an uncommented - item" stands now -#1536 - Add documentation to the FOR UPDATE OF clause, indicating - that DB2 may have stricter requirements regarding - updatability of fields -#1541 - Add support for the H2 MERGE syntax - GitHub Issue #18 -#1542 - Simulate the H2 MERGE syntax in other dialects supporting - the SQL standard MERGE statement - GitHub Issue #18 -#1545 - Website and Documentation anchors should be links to - themselves, visually recognisable - -Features and improvements (jOOQ Console) ----------------------------------------- -#1398 - Allow for adding breakpoints in jOOQ Console - -API changes (backwards-compatible) ----------------------------------- -#1408 - Relax bounds of in Factory.truncate() to Record, - instead of TableRecord -#1429 - Change Convert.convert(List, XXX) to accept Collection - instead of List - -Bug fixes ---------- -#1020 - Improve Oracle's LIMIT .. OFFSET clause simulation. - GitHub Issue #16 -#1358 - Compilation errors in generated source code when Oracle - overloaded procedures collide with procedures that end - with numbers -#1437 - Error in Javadoc of FactoryOperations.fetchOne(). This - method may return null -#1441 - Performance issue with AbstractDataType.convert(Object). - Avoid conversions when they're obviously unneeded -#1448 - Handle String to Enum conversion (when Java Enums are - stored as Strings in the database) - GitHub issue #15 -#1459 - Generated Keys.java static class too large (static - initialiser can become bigger than 64kb) -#1460 - Table.getReferencesTo(Table) doesn't work correctly for - aliased tables -#1461 - Exception when rendering of {fn datetimeadd(...)} for - HSQLDB and Derby -#1462 - Document missing GeneratorStrategy features, such as - getJavaClassImplements() -#1465 - Custom generator strategy's printImplements() is called - with Mode == RECORD for tables -#1478 - Caching SQLDialect in AbstractDatabase heavily improves - code generation performance -#1483 - Inefficient cloning of default settings using JAXB - unmarshalling leads to non-negligible overall overhead. - Use serialisation instead (short of a useful XJC clone - plugin) -#1489 - Fix manual where it claims to throw SQLExceptions -#1490 - Compilation error when a SQL Server stored procedure has - a parameter named "value" -#1493 - Bad syntax for SELECT /*+hint*/ DISTINCT ... in Oracle -#1498 - jOOQ does not compile using JDK 7 / JDBC 4.1. GitHub - Issue #24 -#1499 - Generated members of Tables.java are not final -#1505 - Bad exception message when ON DUPLICATE KEY IGNORE cannot - be simulated -#1515 - Splitting of large NOT IN conditions is wrong. The parts - should be connected with AND, not with OR -#1522 - fetch().into(Table) doesn't initialise records correctly, - such that subsequent calls to store() will execute an - INSERT, rather than an UPDATE -#1525 - Generate missing Javadoc to getters for procedure OUT - parameters -#1529 - Factory.batchStore() logs all single statements to DEBUG - output. Find a more accurate log output -#1537 - Factory.batchStore() renders bad SQL for Postgres. The - RETURNING clause is not allowed in batch INSERTs - -Version 2.3.1 - May 11, 2012 -================================================================= -This is an important patch release fixing some regressions in the -code generator for the Postgres dialect. With 2.3.0, it was no -longer possible to generate schemata of which the database user -was not the owner. - -Bug fixes ---------- -#1334 - Fix inaccurate simulation of TRUNC(number, decimals) for - Derby -#1403 - Documentation bug: ctx.statement() can be replaced in - executeStart(). This is not documented -#1406 - Compilation errors in generated source code when Postgres - stored procedure parameter is called "NAME" -#1407 - Compilation errors in generated source code when Postgres - data-type is "any" (with quotes!) -#1409 - Postgres code generation broken when not connecting with - the owner of a schema - -Version 2.3.0 - May 6, 2012 -================================================================= - -This is a minor feature increment release, featuring many useful -API enhancements, some new functions, some new syntax support -elements, improved source code generation and a lot of -improvements on the jOOQ Console, thanks to Christopher Deckers. - -The updated jOOQ Console now allows for filtering incoming -statements directly on the server side, using regular expression -filters on statement text and other features. These improvements -are a part of a general strategy to introduce breakpoints and -more sophisticated debugging capability to the jOOQ Console. - -Features and improvements -------------------------- -#597 - Add support for Oracle KEEP (DENSE_RANK FIRST...) - aggregate function clause -#910 - Add ExecuteListener extension to allow for overriding - exception translator to handle vendor-specific error - codes -#1286 - Add "renderSchema" flag to Settings, to completely - disable rendering of schema names -#1293 - Generate setter methods for JAXB annotated configuration - properties -#1295 - Add support for MySQL's INSERT IGNORE clause -#1296 - Simulate the FOR UPDATE clause for SQL Server, CUBRID, - using JDBC's ResultSet.CONCUR_UPDATABLE -#1302 - Add Factory.inline() to allow for flagging inline-only - "bind values" -#1303 - Add connection-less Factory constructors for convenience, - when jOOQ is only used as a SQL query builder -#1304 - Add option to generate JSR-303 @NotNull and @Size - annotations to generated POJO's -#1307 - Let HSQLDB dialect render NVL2() as NVL2() instead of - CASE expression -#1312 - Allow for omitting , and generate all - available schemata in that case -#1315 - Let generated factories use their associated Schema as - the Settings' RenderMapping's defaultSchema -#1319 - Move jooq-spring's FactoryProxy to the core jooq project -#1322 - Add Factory.dateAdd() and timestampAdd() for convenience -#1327 - Add DataType.isLob() -#1328 - Add Field inline(char), inline(Character), - inline(CharSequence) for convenience -#1333 - Add support for the Oracle TRUNC function, for numeric - arithmetic -#1336 - Let Record.into(Class) and similar methods accept - "immutable" classes, i.e. setter-less classes that take - several constructor arguments -#1340 - Use Constructor.setAccessible(true), if no default - constructor is available on the target type of - Record.into(Class) -#1342 - Improve Javadoc on Factory.function(). Document arguments -#1349 - Add support for the CUBRID Click-Counter INCR() -#1352 - Allow for creating syntax-error and SQL-injection safe - qualifiers for org.jooq.Field and org.jooq.Table -#1361 - Add Factory.batchStore(TableRecord...), to allow for - batch UPDATE/INSERTs of many records -#1367 - Make configured ExecuteListeners default constructors - accessible -#1366 - Let org.jooq.Batch extend Serializable -#1378 - Upgrade internal jOOR dependency to jOOR 0.9.3 -#1379 - Upgrade internal jOOU dependency to jOOU 0.9.1 -#1390 - Add RenderContext.qualify() to indicate whether - QueryParts should render qualified versions of themselves - or not - -Features and improvements (jOOQ Console) ----------------------------------------- -#1242 - Upgrade jOOQ Console dependency on RSyntaxTextArea from - 1.5 to 2.0.2 -#1249 - Allow for filtering incoming statements in jOOQ Console -#1393 - Implement a communication protocol between Console server - types and Console client types to allow for more - sophisticated functionality - -API changes (backwards-compatible) ----------------------------------- -#1310 - Deprecate Factory.literal() in favor of Factory.inline(), - and Factory.field() -#1368 - Promote AbstractQuery.isExecutable() to the public API - -Bug fixes ---------- -#989 - INSERT and UPDATE statements always render non-qualified, - escaped field names. This may cause trouble when using - plain SQL fields -#1109 - Standalone TABLE or VARRAY types are not correctly - initialised before referencing tables load them -#1279 - NullPointerException when leaving empty -#1283 - The LIKE escape character needs escaping, too, in - contains(), startsWith(), endsWith() -#1306 - Add missing INTERVAL data types to HSQLDBDataType -#1308 - Oracle's DataTypeDefinition reports the length of a BLOB - / CLOB data type to be 4000 -#1313 - and match only table names, not - fully qualified names -#1323 - Add support for byte[] in Postgres UDTs -#1324 - Code generation error in Oracle 10g when generating - stored procedures -#1326 - Error when deserialising BLOBs from Oracle UDTs -#1329 - NullPointerException when passing null to - timestampDiff(Field, Field) -#1343 - Regression in insertInto(...).values(...). Cannot pass - Field to values() -#1344 - Initialise Result ArrayLists to their expected size, if - that size is known. -#1360 - jOOR issue 12: "Don't reset the accessible flag to false, - if setting it to true is required, to avoid race - conditions in concurrency contexts" -#1371 - Missing conversion when using unsafe Field types in - BATCH statements -#1376 - Oracle UDTs in REF CURSORs are not deserialised correctly - from procedure OUT parameters -#1377 - Oracle UDTs are not deserialised correctly when the same - UDT name is present in multiple schemata -#1394 - NullPointerException when omitting element in - code generation configuration - -Version 2.2.1 - April 12, 2012 -================================================================= - -This is a minor patch release, fixing some issues related to the -code generation of the new CUBRID integration as well as other, -minor issues. Upgrade if you're using CUBRID - -Bug fixes ---------- -#1287 - Remove oracle.sql dependency also from OSGi information - in pom.xml -#1288 - SQL syntax errors from sequences when using RenderMapping - with defaultSchema -#1289 - DefaultBindContext logs as Util.class -#1297 - Compilation error in CUBRID generated artefacts - referencing OBJECT types -#1298 - Avoid source code generation errors when generating code - for unknown, dialect-specific data types - -Version 2.2.0 - April 09, 2012 -================================================================= - -Finally, jOOQ has added support for another database, and a very -promising one, that is. http://www.cubrid.org is a surprisingly -original mixture of a relational and object-oriented database -where tables and classes are synonyms, so are records and -instances. The CUBRID database has a high level of compatibility -with MySQL and is aimed at MySQL users wanting more performance -for their web applications. For details, see the slides here: - -http://www.slideshare.net/cubrid/growing-in-the-wild-the-story-by-cubrid-database-developers - -jOOQ is proud to have become a CUBRID partner, looking forward -to further cooperation with CUBRID in the near future. - -Apart from that, jOOQ now fully supports SQL standard INTERVAL -data types. With JDBC and JPA lacking official support for this, -jOOQ aims for becoming the tool of choice for vendor-specific -date time arithmetic. True INTERVAL data type support is given in -HSQLDB, Ingres, Oracle, Postgres databases. Besides that, CUBRID -and MySQL support INTERVAL data type arguments in functions. In -other dialects, jOOQ simulates DATEADD(), TIMESTAMPADD(), -DATEDIFF(), TIMESTAMPDIFF(). - -For jOOQ's OLAP friends, there is now also support for the Oracle -LISTAGG function (LIST() in Sybase, XMLAGG() in DB2, STRING_AGG() -in Postgres, GROUP_CONCAT() in CUBRID, H2, HSQLDB, MySQL). -LISTAGG is an "ordered aggregate function", meaning that the -aggregation is done using a specific ordering. Keep an eye out -for more such function support in future versions. - -Features and improvements -------------------------- -#566 - Add support for INTERVAL data types -#585 - Add support for DATE, TIME and INTERVAL arithmetic -#1183 - Add support for DEFAULT values in Oracle stored procedure - parameters -#1243 - Let generated POJOs (and Records) extend base classes - and implement interfaces -#1252 - Avoid JDBC escape syntax for Oracle stored procedure - calls. Generate PL/SQL syntax, instead -#1255 - Let generated Tables contain a public default constructor - to be able to extend those classes - Github issue #12 -#1257 - Add CUBRID support -#1268 - Add Factory.field(String, QueryPart...) to generate - custom clauses -#1269 - Add YEAR(), MONTH(), DAY(), HOUR(), MINUTE(), SECOND() - function support as shortcuts for EXTRACT() -#1273 - Simulate GROUP_CONCAT() aggregate function using Oracle's - LISTAGG() function, where available -#1274 - Add support for the Oracle LISTAGG(...) WITHIN GROUP - (ORDER BY ..) [ OVER (..) ] aggregate / analytic function -#1275 - Simulate Sybase LIST() aggregate function using Oracle's - LISTAGG() function -#1276 - Simulate Oracle's LISTAGG() in DB2 using XMLAGG(), - SUBSTR() and CONCAT() -#1278 - DEBUG log both executed SQL and SQL with inlined bind - values - -API changes (backwards-compatible) ----------------------------------- -#1262 - Pull up OracleFactory.prior() and other CONNECT BY - related methods to Factory - -Bug fixes ---------- -#1241 - Wrong variable binding when comparing CHAR columns in - Derby and DB2 without explicit casting to VARCHAR -#1244 - Cannot override class name in GeneratorStrategy in - Mode.POJO -#1248 - Setting both false and - true leads to compilation errors -#1256 - Fixed code generation issue with H2 user defined - functions returning VARCHAR -#1263 - Pass fetchsizes <= 0 to the JDBC driver (for vendor- - specific MySQL compatibility) -#1270 - Most databases allow for multiple identical foreign keys. - This leads to compilation errors in generated source code - -Version 2.1.0 - March 18, 2012 -================================================================= - -With this version, jOOQ attempts to follow versioning rules -imposed by semantic versioning: http://semver.org/ -There will be 1 minor release per month, and a couple of patch -releases per year, depending on popular demand - -The main improvements for this release include - -- The possibility of providing jOOQ with a custom type mapping. - You can now define your own Converter types that are used by - jOOQ to map a database's SQLDataTypes to your custom types. - This is particularly useful for Java's enums. Read more about - custom converters in the manual: - http://www.jooq.org/manual/ADVANCED/CustomTypes/ - -- There are a lot of new runtime configuration options to control - the SQL style of SQL rendered by jOOQ. You can now specify - whether table/column names should be quoted / capitalised / - lower-cased, whether SQL keywords should be capitalised or not, - etc... - -- The handling of NULL has been improved in favour of using jOOQ - as a SQL builder library (e.g. along with Spring for execution) - NULL is no longer inlined, but bound as a variable. - -- jOOQ now supports simulation of the relational division - operation using an intuitive syntax. Read more about the - relational division here: - http://en.wikipedia.org/wiki/Relational_algebra#Division - -Features and improvements -------------------------- -#161 - Add runtime configuration to pretty print rendered SQL -#349 - Add SQLite relations support -#491 - Add runtime configuration for SQL keyword style (upper - case, lower case) -#521 - Add runtime configuration for SQL reference style (upper - case, lower case, as-is, quoted) -#1150 - Add code generation option to disable generation of - records -#1181 - Add support for SQL Server data types timestamp and - rowversion -#1188 - Load default Settings from the classpath at - /jooq-settings.xml, or from -Dorg.jooq.settings -#1193 - Specify main-class in jOOQ Console's manifest.mf and - include dependency in jar file -#1194 - Add ColumnDefinition.isNullable() -#1202 - Add support for the relational division operation: - A.divideBy(B).on(A.ID.equal(B.A_ID)).returning(A.X, ...) -#1207 - Add Factory.batch(Collection) for - convenience -#1208 - Render @javax.persistence.Column(nullable = false) - property, if available -#1209 - Render @javax.persistence.Column(length, precision, - scale) properties, if available -#1215 - Add org.jooq.Converter for custom type mapping -#1216 - Overload Record, Result.getValue() and .setValue() - methods to accept a Converter -#1217 - Add EnumConverter as a base type for custom enum - converters -#1218 - Add code generation options to generate - referencing a Java type and a Converter -#1224 - Add DataTypeDefinition.getLength() to jooq-meta's type - system -#1233 - Support custom JDBC properties for jooq-codegen -#1234 - Add Database.getTable(SchemaDefinition, String, boolean) - to fetch tables case-insensitively -#1239 - Add Factory.fetchLazy(String, Object...) - -API changes (backwards-compatible) ----------------------------------- -#1191 - Deprecate ConfigurationRegistry and replace by equivalent - ExecuteListener feature -#1219 - API Bug: Cannot use LIMIT .. OFFSET along with FOR UPDATE - -Bug fixes ---------- -#625 - Remove dependency from generated Routines to the - generator's SQLDialect -#1128 - NULL is inlined in INSERT statement instead of binding it - as a variable. This can cause issues when using jOOQ with - Spring -#1137 - Exclude MySQL column-level enum types when that column is - overridden by a -#1158 - Derby cannot handle inlined NULL literals in some - contexts -#1180 - Execute BatchMultiple (multi-query batch query), when - executing BatchSimple (single-query, multi-bind-value - query) with StatementType == STATIC_STATEMENT -#1189 - TableMapping regression for SQLite database -#1190 - Cannot store SQLite records when using - StatementType.STATIC_STATEMENT -#1199 - Table.getFields() returns an internal representation of a - table's field list. Make generated tables immutable! -#1200 - Internal API leak exposed through covariance in - AbstractType.getFields() -#1211 - Enforce method name disambiguation also when using custom - strategies in jooq-codegen -#1212 - Enforce identifier disambiguation also when using custom - strategies in jooq-codegen -#1221 - Incorrect ExecuteListener invocation for INSERT .. - RETURNING. executeStart() and executeEnd() are omitted -#1223 - Cache ExecuteListener classes for performance -#1225 - Bind NULL byte[] as java.sql.Types.BINARY instead of - BLOB in Postgres, to avoid errors -#1226 - Bind NULL UDTs with their associated type name in Oracle -#1232 - SQLException when Factory.fetch() does not return a - ResultSet -#1237 - Don't generate enum classes for columns in MySQL tables - that are excluded from code generation - -Version 2.0.5 - February 26, 2012 -================================================================= - -This release finally introduced basic runtime configuration -features for the jOOQ Factory. This configuration now includes: - -- Execute listener and SQL tracing support. jOOQ allows you to - hook your own listeners into jOOQ's query execution engine to - be notified of all sorts of events -- The existing SchemaMapping features. They are now part of the - runtime configuration -- StatementType settings. Specify whether a Factory should - execute java.sql.PreparedStatements (with bind variables) or - static java.sql.Statements with inlined variables. - -The runtime configuration is documented here: - -http://www.jooq.org/manual/JOOQ/Factory/ - -The listener and tracing support has been requested by -Christopher Deckers, a new jOOQ user who has had the courtesy to -contribute the new jOOQ Console, which is documented here: - -http://www.jooq.org/manual/ADVANCED/ExecuteListener/ - -Apart from that, another long-requested feature is now fully -implemented: The GeneratorStrategy, allowing for custom naming -strategies in generated source code. This will allow for -generating custom table / record class name prefixes / suffixes, -as well as overriding the default behaviour for rendering UPPER, -lower and CamelCase artefacts. See the manual for details: - -http://www.jooq.org/manual/META/Configuration/ - -Features and improvements -------------------------- -#93 - Add Field.equalIgnoreCase(), Field.notEqualIgnoreCase() -#408 - Add class prefixes, suffixes and other options to the - code generator -#492 - Add runtime configuration -#1107 - Let Field.contains() support the Postgres ARRAY @> ARRAY - operator -#1140 - Add ResultQuery.fetchResultSet() to return the underlying - JDBC result set -#1143 - Add Result.isNotEmpty() for convenience -#1145 - Add runtime configuration to specify whether jOOQ should - execute java.sql.PreparedStatement (with bind variables) - or a java.sql.Statement (with inlined parameters) -#1146 - Add Query.getSQL(boolean) to indicate that bind values - should be inlined (as a convenience for - Factory.renderInlined(QueryPart)) -#1148 - Add Cursor.resultSet() to expose the underlying ResultSet -#1149 - Allow for optional - "http://www.jooq.org/xsd/jooq-codegen-2.0.4.xsd" - namespace in jooq-codegen configuration -#1152 - Add & org.jooq.EnumType> - E MySQLFactory.enumType(Class, int) for enum reverse - lookups of MySQL-specific enums -#1159 - Support matching numbers with LIKE, e.g. ID LIKE '%33%' -#1160 - Implement Field.contains(), .startsWith(), .endsWith() - for numeric values, too -#1161 - Use reflection to remove compile-time dependency on - ojdbc for creating ARRAYs -#1162 - Integrate jOOR into jOOQ for simpler reflection -#1164 - Distinguish between Definition.getInputName(), - .getOutputName() -#1165 - Add constraint name to generated javadoc -#1167 - Trivial issue with org.jooq.Factory.exists Javadoc - - GitHub issue #10 -#1169 - Add Configuration.setData(), getData() to convey custom - data in a configuration's lifecycle -#1172 - Add runtime configuration to deactivate JooqLogger -#1177 - Add jOOQ-Console module to jOOQ -#1184 - Add DataType.isArray() - -API changes (backwards-compatible) ----------------------------------- -#1142 - Rename Result.exportXML() to Result.intoXML() to stay - more consistent -#1151 - Deprecate SchemaMapping in favour of new runtime - configuration - -Bug fixes ---------- -#978 - Schema.getTables() and similar methods return empty lists - when Schema is mapped with SchemaMapping -#1153 - Bad inlining of booleans in Sybase ASE / DB2 / Oracle - SQL Server / SQLite -#1154 - Bad inlining of byte[] in most dialects -#1155 - byte[] are erroneously converted to String when using - Record.intoArray() -#1156 - Bad inlining of DATE / TIME / TIMESTAMP data types in - Ingres (and other dialects, when the setting differs from - the default) -#1166 - Some generated Javadoc uses naming strategy or plain - output name, instead of qualified output name -#1168 - Oracle packages are generated as static, instead of - static final -#1175 - Factory.use() seems to render SQL with the Schema name - still present -#1179 - Oracle-generated ArrayRecords need a reference to - org.jooq.Schema to read TABLE of OBJECT from stored - procedures - -Test cases ----------- -#1147 - Add integration tests for executing SQL generated using - Factory.renderInlined() - -Version 2.0.4 - February 12, 2012 -================================================================= - -This release introduced many improvements to source code -generation. These improvements include: - -- Maven and standalone code generation now use the same XML - configuration, which is read by jOOQ-codegen using JAXB. This - allows for more complex configuration elements in the future -- jOOQ-codegen can now handle multi-schema databases and generate - code for tables referencing tables from other schemata. This - is integration tested against the SQL Server AdventureWorks - database -- jOOQ now allows to generate simple POJOs in addition to Records - and to annotate both POJOs and Records with JPA annotations - such as @Entity, @Table, @Id, @Column, @UniqueConstraint, etc. - -You can migrate your existing .properties configuration by running -> org.jooq.util.GenerationTool /your.properties migrate - -Besides that, there is a lot of ongoing work to improve the -integration of Oracle's TABLE and VARRAY types. - -Features and improvements -------------------------- -#8 - Add JPA annotations to generated POJOs / Records -#282 - Add support for multi-schema databases -#287 - Add support for Oracle TABLE types -#395 - Use XML configuration file instead of properties file -#1089 - Add Field.contains(), .startsWith(), .endsWith() as a - convenience for Field.like() (including escaping) -#1092 - Move master data table configuration from - generator.generate to generator.database namespace -#1093 - Add support for generator.strategy in Maven source code - generation -#1094 - Add support for generator.database.date-as-timestamp in - Maven source code generation -#1095 - Move generator.generate.unsigned-types to - generator.database namespace -#1096 - Add support for generator.generate.unsigned-types in - Maven source code generation -#1103 - Add support for SQL Server data type uniqueidentifier -#1106 - Add Factory.escape(Field, char) for use with LIKE -#1108 - Add support for multi-schema databases using Maven code - generation -#1115 - Add support for Oracle VARRAY/TABLE of OBJECT types -#1127 - Add support for POJO classes generation -#1129 - Allow for using Param in LIMIT .. OFFSET clauses -#1132 - Add RenderContext.castMode() to allow for avoiding casts - where this is not really needed -#1136 - Add generation option to enable/disable generating - navigation methods - -Bug fixes ---------- -#1099 - Derby generated artefacts are not sorted alphabetically -#1101 - Internal API leak exposed through covariance in - AbstractTable.joinXXX() methods -#1110 - VARRAY element type information is lost when unnesting - VARRAY's in Oracle -#1111 - VARRAY element type information is lost when unnesting - VARRAY's returned from functions in Oracle -#1114 - Syntax error when unnesting TABLE of OBJECT in Oracle. - The unnested table contains several columns but jOOQ only - unnests "COLUMN_VALUE" -#1117 - NullPointerException when passing an ArrayRecord - containing a null array to a stored function in Oracle -#1125 - Postgres needs casting for date time data types in - queries like SELECT ? FROM DUAL -#1131 - DB2: [Noauthorized routine named "LIKE" of type - "FUNCTION" having compatible arguments was found] when - using Field.like(concat(x, y)) -#1133 - Compilation errors in generated source code if the same - constraint name exists in several schemata -#1134 - NullPointerException in code generation when a foreign - key constraint references a table from another schema - that is not being generated -#1135 - Generated Javadoc references inputSchema instead of - outputSchema - -Test cases ----------- -#1009 - Add more integration tests for proper handling of - java.sql.Date, Time, Timestamp -#1090 - Run jOOQ tests against AdventureWorks SQL Server sample - database -#1105 - Add integration tests for multi-schema source code - generation and querying -#1122 - The 10k lines of integration test code are too heavy for - the compiler. Create test modules with fewer lines of - code, each. - -Version 2.0.3 - January 29, 2012 -================================================================= - -This release focuses on increased compatibility between various -SQL dialect integrations as far as ARRAY and JOIN support is -concerned: - -- ARRAY types are only available in H2, HSQLDB, Oracle, Postgres. - Nevertheless, they can be somewhat simulated in other dialects - using nested selects with UNION ALL. Increased compatibility - leads to a nicer API, where ARRAYs are used along with ALL/ANY - quantifiers, for instance. - -- JOIN syntaxes can be quite powerful in SQL. Apart from - simulating NATURAL JOIN, JOIN USING clauses, as well as a - synthetic "KEY JOIN" syntax, jOOQ now also supports nesting - JOIN expressions to create more complex table sources. See a - recent blog post on the subject here: - -http://blog.jooq.org/2012/01/15/lets-revise-the-sql-from-clause/ - -Features and improvements -------------------------- -#578 - Add KEY JOIN syntax to simulate joining using generated - foreign keys -#577 - Simulate NATURAL JOIN syntax, where this is unavailable -#582 - Simulate JOIN USING syntax, where this is unavailable -#671 - Allow for nesting JOIN clauses -#676 - Add Table.join() methods to create more flexible table - sources -#993 - Add Field.equalAny(T[]), .equalAny(Field) methods -#1048 - Simulate (array) syntax for dialects - that do not support arrays -#1051 - Add Factory.execute(String, Object...) as a convenience - method for Factory.query(...).execute() -#1055 - Simulate Factory.table(Object[]) and table(List) using - UNION ALL in dialects that do not support arrays -#1060 - Improve debug logging of H2 arrays. The syntax is not - ARRAY[1, 2], but (1, 2) -#1065 - Add OracleFactory.sysContext(String, String) to support - Oracle's SYS_CONTEXT function -#1069 - Add support for INSERT INTO table(field1, field2, ...) - SELECT syntax - as opposed to the existing INSERT INTO - table SELECT -#1072 - Add support for LIKE .. ESCAPE .. syntax -#1074 - Add Field.notBetween(T, T) for convenience -#1080 - Add support for JDBC's Statement.setFetchSize() in - ResultQuery.fetchLazy() -#1082 - Add some more DEBUG logging in AbstractResultQuery - -API changes (backwards-compatible) ----------------------------------- -#1059 - Change SelectFromStep.from(Collection>) to - from(Collection>) - -API changes (backwards-incompatible) ------------------------------------- -#1087 - Change the NTILE function to return Field - instead of Field - -Bug fixes ---------- -#1071 - Make Sequence Serializable -#1081 - Derby error in NULL handling when simulating unnested - arrays that contain NULL values -#1084 - Bind index mismatch in val(null).equal(null) and in - val(null).notEqual(null) -#1091 - Add missing @Support annotations on Table.crossJoin() - methods - -Test cases ----------- -#1026 - Add integration tests for NTILE window function and - document compatibility -#1073 - Add integration tests for NOT IN queries holding NULL - arguments - -Version 2.0.2 - January 8, 2012 -================================================================= - -This is a maintenance release for jOOQ 2.0. The main improvements -include - -- The whole jOOQ API is now annotated with a new org.jooq.Support - annotation to help you assess whether a certain SQL clause is - available in your database or not. This is particularly useful - when your application should support several databases at once - (e.g. MySQL, Postgres, Oracle) -- The Oracle PIVOT clause is now formally supported for advanced - statistical queries in Oracle. This clause will be simulated in - other dialects in the future. -- The DATE data type can be mapped to TIMESTAMP. This important - when you query a legacy Oracle database, where DATE columns - can also contain time information -- Several convenience methods have been added for more fluent - syntax, when using plain SQL result queries, subqueries as - tables, or when unnesting arrays in ANY() and ALL() quantifiers - -Further type mapping support is still experimental. An official -cooperation with MinuteProject for source code generation is -being analysed. With MinuteProject, many source code generation -issues could be addressed centrally, as MinuteProject specialises -in source code generation: - -http://minuteproject.wikispaces.com/ - -Features and improvements -------------------------- -#595 - Add support for Oracle's PIVOT clause -#869 - Add support for using ANY, ALL with arrays, not just with - subselects -#1007 - Formally document the API methods to indicate whether - something is supported by any given SQL dialect -#1011 - Add code generation configuration parameter to avoid - generating @Generated annotation -#1019 - Render LIMIT x OFFSET y also for MySQL, instead of - LIMIT y, x -#1022 - Add missing Sybase ASE implementation for Factory.use() -#1024 - Add Factory.resultQuery(String, Object...) to allow for - arbitrary execution modes of plain SQL queries (lazy, - later, into, array, etc) -#1025 - Add missing SQLite implementation for Factory.deg() and - Factory.rad() -#1033 - Generate table comments into generated Tables.java as - Javadoc -#1040 - Add Object[][] Result.intoArray() and - Object[] Record.intoArray() for convenience. Let - E Record.into(Class) also support array types. -#1041 - Add Table Factory.table(Select) convenience - method for more fluency -#1042 - Add support for DISTINCT keyword in SUM, AVG, MIN, MAX - aggregate functions -#1046 - Generate Ingres table and column comments in generated - source code (only Ingres 10) - -API changes (backwards-compatible) ----------------------------------- -#1050 - Deprecate usage of SOME quantifier in predicates, such as - equalSome() - -API changes (backwards-incompatible) ------------------------------------- -#1036 - Fixed API typo in - WindowsRowsStep.rowsBetweenUnboundedFollwing() -#1037 - The fluent API allows for JOIN clauses without FROM - clause - -Bug fixes ---------- -#1010 - The MERGE INTO .. WHEN NOT MATCHED THEN INSERT .. syntax - may cause type-safety issues in some databases. VALUES - should be converted before binding -#1014 - FindBugs: Latent risk of infinite recursion due to typo - in QueryPartList.retainAll(); -#1015 - FindBugs: 7 occurrences of "Bad attempt to compute - absolute value of signed 32-bit hashcode". In extreme - cases, this could lead to SQL syntax errors -#1016 - The Oracle CONNECT BY cond1 AND cond2 syntax erroneously - creates a WHERE cond2 CONNECT BY cond1 statement -#1028 - Syntax errors when using untyped param() in HSQLDB (and - other strongly typed dialects) -#1029 - Postgres can't bind NULL values in cases, where bind type - is Object.class and bind value was created with - Factory.param() -#1030 - UnsupportedOperationException when calling - Query.bind(int, Object) on a query containing plain SQL - fields -#1031 - Incorrect debug logging when plain SQL QueryParts like - field("?") bind null values -#1032 - Incorrect debug logging when plain SQL QueryParts contain - String literals, such as 'Hello? Anyobody out there?' -#1047 - Field.notEqualAny() erroneously renders <> ALL() - -Test cases ----------- -#1021 - Add explicit integration tests for - LEFT|RIGHT|FULL OUTER JOIN - -Version 2.0.1 - December 23, 2011 -================================================================= - -This is a maintenance release for jOOQ 2.0. The main improvements -include - -- Better integration for using jOOQ with Spring Data. This - includes support for named parameters, as well as allowing to - change bind values on previously constructed Query objects -- The MERGE statement has been enhanced for better integration - with Oracle. -- jOOQ is now ready to use with Scala / Groovy - -For more information about using jOOQ with Scala, see this blog -post: -http://blog.jooq.org/2011/12/11/the-ultimate-sql-dsl-jooq-in-scala/ - -There is now also experimental support for a custom type mapping. -This mapping allows to rewrite data types at code generation time -as well as to specify custom enum data types (e.g. boolean Y/N). -Not all integration tests run smoothly for custom data types, -hence, this feature is not yet fully supported. - -Features and improvements -------------------------- -#691 - Add support for Oracle CURSOR REF IN / INOUT parameters -#677 - Add type-mapping configuration, enforcing types for - columns -#947 - Add custom type mapping support (experimental) -#968 - Allow for custom enum types, configured in the code - generator (experimental) -#974 - Add Schema.getTable(String), getSequence(String), - getUDT(String) for better runtime Schema meta-navigation -#975 - Add Sequence.getName(), getSchema(), getDataType() -#980 - Add support for named parameters, to better interact with - Spring -#991 - Add Query.bind(String, Object) and bind(int, Object) to - easily modify existing bind values -#992 - Document thrown DataTypeException in Convert methods -#998 - Enhance MERGE statement for Oracle extensions: - WHEN MATCHED THEN UPDATE .. WHERE .. DELETE WHERE .. - WHEN NOT MATCHED THEN INSERT .. WHERE .. -#1000 - Add support for MySQL's INSERT INTO .. SET .. syntax in - MERGE statement's WHEN NOT MATCHED THEN INSERT clause - -API changes (backwards-compatible) ----------------------------------- -#981 - Cannot insertInto(table("my_table")), as plain SQL tables - return Table, not Table. Relax - bound on R -#988 - Change Factory.field(String) to return Field - instead of Field -#999 - Make MERGE's WHEN MATCHED .. and WHEN NOT MATCHED .. - clauses optional -#1001 - Identity.getField() should return TableField - instead of Field -#1006 - Add Factory.value(...) as a synonym for Factory.val(...) - for increased Scala / Groovy compatibility - -Bug fixes ---------- -#973 - EnumType renders name() instead of getLiteral() in - formatXXX() methods -#977 - EnumType renders name() instead of getLiteral() in - Convert.convert() method -#979 - Record.from() sets all changed flags to true. That's not - necessarily correct in the event of storing the record - back to the DB -#985 - AbstractRecord.equals() does not correctly compare - arrays. Compare them using Arrays.asList() -#986 - Postgres / DB2 / Sybase ASE foreign-key namespace is - unique-per-table. jOOQ forces all foreign keys from all - tables into the same namespace -#990 - Problems when encoding arbitrary byte[] as String(byte[]) - in inlined SQL. This can cause issues when DEBUG-level - logging is activated -#995 - Routines don't respect SchemaMapping - Github issue #8 -#1002 - TableRecord.storeUsing() doesn't update IDENTITY column - values, if the column is not part of the main unique key -#1003 - Sybase / SQL Server / MySQL / Ingres / H2 / Derby's - INSERT .. RETURNING simulation returns null if a table - has an IDENTITY column, but no primary/unique key -#1005 - The INSERT INTO .. VALUES .. syntax may cause type-safety - issues in some databases. VALUES should be converted - before binding - -Test cases ----------- -#984 - Detach IDENTITY column tests from UNIQUE KEY tests, - create a dedicated test suite instead - -Version 2.0.0 - November 25, 2011 -================================================================= -This release is a fresh start in many areas of jOOQ, adressing -issues that have been requested by users for a long time. These -release notes docment the most important changes, a detailed -upgrade guide, as well as the detailed list of improvements. - -Most important changes ----------------------- -- The API became more static. This applies to many Factory - methods, such as val(), literal(), as well as to many Field - methods that have been moved over to the Factory. For example, - when before, you wrote this using "postfix function notation": - -
NAME.replace(" ", "_").trim()
- - you will now write (just as in SQL): - -
trim(replace(NAME, " ", "_"))
- - Using static imports of Factory.*, jOOQ makes SQL look even - more like SQL. The current "postfix notation" is maintained for - backwards compatibility. -- By default, jooq-codegen will now generate a "dynamic" meta - model as opposed to the existing static one. Generated tables - covariantly override the as(String) aliasing method, leading - to a much more convenient aliasing style. When before, you - wrote: - -
-Table parent = T.as("parent");
-Table child  = T.as("child");
-Condition join =
-  parent.getField("ID").equal(child.getField("PARENT_ID"))
-
- - You can now write: - -
-T parent = T.as("parent");
-T child  = T.as("child");
-Condition join = parent.ID.equal(child.PARENT_ID)
-
- - Of course, the existing notation still works - -- Exceptions are no longer checked. When previously, the DB's - SQLException was propagated to client code, there is now an - unchecked DataAccessException hierarchy, similar to that of - Spring. This will eventually give way to a standardised error - handling abstraction, in future developments. -- Window functions are now constructed from their underlying - aggregate functions just like in SQL. For example: - -
-sum(AMOUNT)
-sum(AMOUNT).over().partitionBy(ACCOUNT)
-
- - This makes for a more concise API, especially when considering - future extensions, such as Oracle's KEEP (DENSE_RANK FIRST...) - syntax. -- More type safety has been introduced regarding various places - where generic and types are involved. - This is especially true for INSERT / UPDATE / DELETE statements -- Sequences now also have a type -- Unsigned number types are now supported in those databases that - use them. Unsigned numbers are implemented in jOOU, a spin-off - open source project. For convenience, this library is - "internalised" into jOOQ, to avoid adding a dependency - -http://code.google.com/p/joou/ - -Upgrade instructions: ---------------------- -Various of the above changes are incompatible with jOOQ 1.x. In -order to upgrade, please be aware of the following pitfalls: - -- The schema needs to be re-generated. -- Much of the post-fix function notation is replaced by static - methods in the Factory. Today's org.jooq.Field API is - maintained in jOOQ 2.0, for backwards compatibility. It will - be removed, eventually, though. Expect some incompatible - changes, where window functions are involved -- Some Factory instance methods (such as val(), literal()) are - now static. They are compatible, but may cause compiler - warnings. -- The meta model is now an instance model by default. If you - prefer the static meta model, you can configure this in your - jooq-codegen configuration. -- The additional typesafety involving and types may cause - compiler warnings and errors. -- SQLException is no longer part of the API. This can cause - compiler issues, in particular when extending jOOQ -- Some utility classes have moved to org.jooq.tools - -Should these incompatibilities be too significant for your -project, you can still stay on the 1.x branch, which will be -maintained for a while. Be aware that upgrading might be more -difficult, later, though. - -Features and improvements -------------------------- -#55 - Implement improved exception handling -#117 - Improve DSL support for field and table aliasing (decrease - verbosity) -#519 - Add support for MySQL UNSIGNED numeric types -#626 - Create static function access -#661 - Add support for bitwise operators -#718 - Sequences should be mapped to appropriate type (e.g. - SMALLINT, INT, BIGINT, etc) -#734 - Add support for Oracle / SQL Server CUBE() and ROLLUP() - grouping functions -#751 - Add support for Oracle / SQL Server GROUPING SETS() - function -#799 - Add support for Oracle PL/SQL's object-oriented MEMBER - PROCEDURES and MEMBER FUNCTIONS -#804 - Add to Insert, Update, Delete -#835 - Review API typesafety for InsertSetMoreStep - set(Field, T) and similar methods -#890 - Add Factory.selectCount() convenience method -#891 - Let min() max(), etc functions return a new type - AggregateFunction. This type can then be used as an entry- - point for window functions -#892 - Add support for Oracle / SQL Server GROUPING() and - GROUPING_ID() functions to be used along with CUBE() and - ROLLUP() -#893 - Simulate ROLLUP() function for MySQL, using the WITH - ROLLUP grouping modifier -#894 - Move functions from Field to org.jooq.impl.Factory - and make them static -#895 - Add power(..., Field) -#897 - Add (experimental) Spring integration project -#898 - Replace usage of checked SQLException by an unchecked - DataAccessException, similar to that of Spring -#899 - Build jOOQ .jar files as bundles to be deployed into OSGI - environments -#900 - Purge deprecated API - Prior to 2.0 -#901 - Introduce InvalidResultException as a subtype of - DataAccessException for integrity checks in methods like - ResultQuery#fetchOne(), ResultQuery#fetchMap(), etc. -#902 - Make AggregateFunction the base type for constructing - window functions -#904 - Move SQLDialectNotSupportedException into - org.jooq.exception package -#905 - Introduce MappingException as a subtype of - DataAccessException for integrity checks in methods like - ResultQuery#fetchInto(), etc. -#907 - Add missing Field.like(Field), notLike(Field) - methods to overload the existing Field.like(T), notLike(T) -#908 - Change rpad / lpad functions to accept String instead of - char -#912 - Add R newRecord(Table, Object) as - the inverse of various into(Class) methods -#916 - Add > {Record.into(Table) | - Result.into(Table) | ResultQuery.fetchInto(Table) | - Cursor.fetchInto(Table)} -#917 - Add various Cursor.fetchOneInto() convenience methods -#918 - Add CustomTable, CustomRecord as base classes for more - convenience when used with various into(Table) methods -#919 - Allow for accessing non-public constructors of Record - subtypes -#923 - Move some utilities to org.jooq.tools -#924 - Generate a reference to every table in a new Tables.java - class for improved static access -#928 - Add DataTypeException extending DataAccessException in - case something went wrong when converting data types -#930 - Support converting date time types to java.util.Calendar. - This applies to various into(Class) methods, as well as - Result.getValue(xx, Class) -#931 - Allow for conversion between Long and date/time types, and - vice versa -#932 - Let the bound of R in TableRecord extend TableRecord, - in UpdatableRecord to extend UpdatableRecord -#933 - Add support for type Character in Record.into(Class) - methods and similar -#936 - Accept primitive types, such as int.class for type - conversion -#938 - CODEGEN: Add static/instance table field configuration -#939 - Include license.txt and readme.txt in .jar files' META-INF - directory -#953 - Make DefaultGeneratorStrategy methods non-final to allow - for overriding -#954 - Add examples for source code generation of multiple - schemata with Maven -#955 - Generate a reference to every type in a new UDTs.java - class -#957 - Add R Factory.newRecord(UDT) for constructing - attached UDTRecords -#958 - CODEGEN: Add generation-time schema mapping, allowing for - re-writing schemata in jooq-codegen -#960 - CODEGEN: Add code generation configuration parameter to - avoid using the new UByte, UShort, UInteger, ULong wrappers - for UNSIGNED number types -#961 - Use Oracle's SYS.ALL_SEQUENCES.MAX_VALUE to determine the - type of a sequence. -#969 - Add List ResultQuery.fetch(Field, - Class) convenience method - -Bug fixes ---------- -#686 - Reduce the internal API leak by preventing access to - TableFieldImpl, UDTFieldImpl, ParameterImpl -#903 - lag(Field, int, T) erroneously delegates to lead() -#906 - Add more NullPointerException safety to API -#913 - NoClassDefFoundError in JooqUtil.isJPAAvailable() -#920 - Generic type is lost in Cursor.fetchInto(RecordHandler) -#925 - SelectConditionStep should extend SelectConnectByStep, not - SelectGroupByStep -#926 - AbstractRecord.into() fails to convert java.sql.Date into - java.util.Date -#934 - Don't consider static members in reflection utilities when - used with Record.into(Class) and similar methods -#935 - Don't consider final member fields in reflection utilities - when used with Record.into(Class) and similar methods -#937 - In the event of name clash (same name for table and field) - generated code has errors -#945 - Calling UpdatableRecord.setValue() twice with the same - argument causes the changed flag to be reset to false -#948 - Always set the changed flag to true in Record.setValue() -#959 - Compilation errors in generated source code if MySQL enum - values match Java reserved words, such as 'true', 'false', - 'new', etc... -#962 - Postgres ordering of generated enum literals is unstable -#967 - Better document type conversion - -Version 1.7.0 - November 25, 2011 -================================================================= -This is a maintenance release for the 1.x branch. Some important -bug fixes are merged from version 2.0. These include: - -Bug fixes ---------- -#925 - SelectConditionStep should extend SelectConnectByStep, not - SelectGroupByStep -#926 - AbstractRecord.into() fails to convert java.sql.Date into - java.util.Date -#937 - In the event of name clash (same name for table and field) - generated code has errors -#945 - Calling UpdatableRecord.setValue() twice with the same - argument causes the changed flag to be reset to false -#948 - Always set the changed flag to true in Record.setValue() -#951 - Empty Password for jooq-codegen-maven causes NPE - -Version 1.6.9 - November 7, 2011 -================================================================= -This is a maintenance release for the 1.x branch. Developments -on this branch will stop after version 1.6.9. Only important bug -fixes are merged to this branch. Developments for release 2.0 -have started. - -The most important functionality in release 1.6.9 is the newly -added support for JDBC batch operations. You can now batch -execute several queries. - -See the official blog for more information: -http://blog.jooq.org/2011/10/25/jdbc-batch-operations-with-jooq/ - -Features and improvements -------------------------- -#621 - Add support for JDBC batch operations -#794 - Add support for ORDER BY [int value] in order to reference - a column index for sorting -#882 - Optimise Field.isTrue() and isFalse(). Take Field's data - type into consideration. -#885 - Add support for INSERT INTO .. VALUES (..) syntax, - omitting explicit field declarations -#887 - Add List Cursor.fetchInto(Class) - -Bug fixes ---------- -#748 - H2 regression in 1.3.158 regarding stored functions, which - return a ResultSet (this was fixed in H2) -#859 - Derby casting of numeric types to BOOLEAN doesn't work -#886 - Regression in date extract function when used in a - subselect -#888 - Derby casting of VARCHAR to FLOAT (and similar) doesn't - work - -Version 1.6.8 - October 22, 2011 -================================================================= -The main improvement of this release is the re-design of the -stored procedure / function API. With 12 supported RDBMS, which -all have their own idea about what is a stored procedure and what -is a stored function, it has proven to be a better design, to -unite them in one single type: org.jooq.Routine. A routine can -have a return value as well as OUT parameters. It can be embedded -in SQL and used as a field or a table. - -This means, you will need to re-generate your database schema, -when upgrading to jOOQ 1.6.8. After re-generation, you'll need to -fix your client code. These are the package changes: - -- [generated.package].procedures > [generated.package].routines -- [generated.package].functions > [generated.package].routines -- [generated.package].Procedures > [generated.package].Routines -- [generated.package].Functions > [generated.package].Routines - -Oracle generated packages are not re-located. With these -improvements, using stored procedures and functions becomes even -more reliable, especially when cursor types are involved. Read -more about the rationale behind this change: - -http://blog.jooq.org/2011/10/17/what-are-procedures-and-functions-after-all/ - -Apart from that, important improvements have been made in the -area of plain SQL tables. Also, consider a demo integration of -jOOQ with Google Cloud SQL: - -http://blog.jooq.org/2011/10/22/jooq-and-google-cloud-sql-example/ - -Features and improvements -------------------------- -#271 - Don't pre-fetch table meta data when selecting from plain - SQL tables -#489 - Add support for SELECT * (i.e. render SELECT * where - applicable) -#596 - Add support for VARIANCE() and STDDEV() OVER() window - functions -#608 - Add jOOQ version number in generated source code -#670 - Add more Javadoc to Field.xxx() functions -#692 - Add support for ResultSet type returned from HSQLDB - stored functions -#850 - Use http://www.jooq.org as URL for the @Generated - annotation -#854 - Add convenience methods Fields.isTrue(), isFalse() for - conversion of "Y", "YES", "1", "true", "on", etc into a - boolean condition -#870 - Add support for MEDIAN aggregate function -#872 - Add support for STDDEV_POP(), STDDEV_SAMP(), VAR_POP(), - VAR_SAMP() aggregate functions -#874 - Reduce the number of internal classes for dialect-specific - function aliases -#878 - Implement DataType.equals() and hashCode() - -API changes (backwards-compatible) ----------------------------------- -#851 - Change Field.{sortAsc|sortDesc}(List sortList) into - Field.{sortAsc|sortDesc}(Collection sortList) - -API changes (backwards-incompatible) ------------------------------------- -#848 - Purge deprecated API - Prior to 1.6.1 -#849 - Replace Cursor.fetchResult() by Cursor.fetch() -#852 - Review stored procedures / functions concept. Merge them - all into a single "Routine" type - -Bug fixes ---------- -#756 - Error when aliasing HSQLDB and Postgres unnested tables -#761 - Exception when TRACE logging execution with plain SQL - tables involved -#773 - Execute standalone stored functions as CallableStatement - to prevent issues with transactions -#847 - Query.getSQL() doesn't render dialect-specific SQL when - Query is constructed using the fluent API -#853 - DB2 generated convenience methods for stored functions - have unstable ordering -#857 - Derby casting of numeric types to String / VARCHAR does - not work -#858 - SQLDataType.getSQLDataType() should return itself, instead - of null -#860 - SQLite CEIL function is incorrectly simulated. CEIL(2.0) - returns 3.0 instead of 2.0 -#861 - Field.replace(String) generates bad SQL for various RDBMS. - Field.replace(String, String) works, though -#863 - Ingres integration generates illegal SQL when selecting - things like SELECT 1 WHERE 1 = 1 -#866 - Sybase ASE Field.replace(String) function incorrectly - removes the argument string -#873 - Error when selecting two times the same aggregate field -#877 - Compilation error in generated source code when a table - without a primary key has an identity column -#879 - Add Google Cloud SQL Example -#880 - Query.getSQL() does not consider SchemaMapping - -Test cases ----------- -#811 - Loader integration tests fail for SQLite -#812 - CSV Loader test leaves Postgres JDBC connection in an - inconsistent transactional state on error -#856 - Add integration tests for Field.abs() -#865 - Add integration tests for Field.ascii() -#867 - Add integration tests for Field.sum(), avg(), max(), min() -#881 - Re-design H2 stored functions to be pre-compiled, in order - to speed up integration tests - -Version 1.6.7 - September 25, 2011 -================================================================= - -This release coincides with the launch of the new website at -http://www.jooq.org. Hence, it ships with little additions to the -deliverable itself. - -Apart from new convenience methods, the main addition is a Maven -plugin for jooq-codegen contributed by Sander Plas. - -Features and improvements -------------------------- -#797 - Create Maven plugin for source code generation -#825 - Add List> Factory.fetchMany(String) to - allow for fetching several result sets from stored - procedures, such as Sybase ASE's "sp_help" -#838 - Implement MetaDataFieldProvider.toString() -#841 - Add List Result.getValues(Field, Class) -#842 - Add Query.getBindValues() method to allow for extracting - bind values in the correct order -#843 - Add Factory.fetch(ResultSet) to transform a JDBC ResultSet - into a jOOQ Result - -API changes (backwards-compatible) ----------------------------------- -#837 - Avoid final keyword on Object methods, such as .equals(), - .hashCode(), etc - -Bug fixes ---------- -#836 - Bad syntax when selecting from aliased plain SQL tables -#839 - Boolean conversion in getValueAsBoolean() should trim - String values first -#840 - Numeric conversions in getValueAsXXX() should trim String - values first -#844 - NullPointerException when selecting a column from a Result, - that does not exist - -Version 1.6.6 - September 11, 2011 -================================================================= - -Finally, support for another RDBMS has been added. Sybase's other -important product Sybase Adaptive Server Enterprise (or simply -Sybase ASE) is now officially supported by jOOQ - -Apart from this, there had been important improvements with the -recently added INSERT .. RETURNING clause, as well as some fixes -related to DECIMAL / NUMERIC data types - -Features and improvements -------------------------- -#796 - Complete missing public org.jooq.impl Javadoc -#800 - Add support for Sybase Adaptive Server Enterprise -#808 - Add support for INSERT .. RETURNING for Ingres -#809 - Add support for INSERT .. RETURNING for Sybase SQL - Anywhere using SELECT @@identity -#810 - Add support for INSERT .. RETURNING for SQLite using - last_inserted_rowid() -#813 - Add DSL support for INSERT .. RETURNING -#814 - Change TableRecord to reload its trigger-initialised main - key in Oracle and other RDBMS that don't support IDENTITY - columns -#818 - Add SQLiteFactory.rowid() -#819 - Support SQLite AUTOINCREMENT columns as IDENTITY -#820 - Add Factory.fetchOne(String) for executing plain SQL - queries that return single records -#826 - Allow for returning several records in the INSERT .. - RETURNING clause. This now works for DB2, HSQLDB, MySQL, - and Postgres -#827 - Support Sybase SQL Anywhere's TOP n START AT m clause - instead of simulating it with nested SELECT's - -API changes (previous API now deprecated) ------------------------------------------ -#817 - Deprecate Factory.lastID(Identity) - -Bug fixes ---------- -#815 - SQL Server fetching of IDENTITY value is broken -#821 - Optimise ResultQuery.fetchAny() executing fetchLazy() - internally, and only fetching one record from the cursor -#822 - Let Constant cast to more precise NUMERIC/DECIMAL types - in those RDBMS where casting is necessary -#823 - Cannot bind SQLite BigDecimal, BigInteger types - bind - them as String instead -#824 - BigInteger values cannot be bound in DB2, Derby -#828 - Document inefficient implementation for GREATEST and LEAST - in some RDBMS - -Version 1.6.5 - August 28, 2011 -================================================================= - -This release finally adds a loader for CSV data to jOOQ. You can -now load CSV data using a simple fluent API, configuring error -handling, duplicate behaviour and transaction handling, as well -as various CSV parameters. - -This release also changes the way generated keys are retrieved -after INSERT's. Instead of (potentially inconsistently) running -SELECT MAX(pk) immediately after the INSERT, Postgres' INSERT.. -RETURNING clause is used (or simulated), in a single statement. - -Features and improvements -------------------------- -#784 - Add Result.exportXML() to retrieve a DOM document similar - to that of .formatXML() -#792 - Add support for loading of CSV data into tables -#795 - Add List fetch(int, Class) and - fetch(String, Class) convenience methods -#803 - Add support for INSERT .. RETURNING or simulate it where - not available -#805 - Add T[] fetchArray(int, Class) and - fetchArray(String, Class) convenience methods -#806 - Add T fetchOne(int, Class) and - fetchOne(String, Class) convenience methods - -Bug fixes ---------- -#798 - Oracle IN (...) clause with more than 1000 arguments does - not work -#802 - Use "INSERT .. RETURNING" instead of "SELECT MAX(pk)" - to retrieve the primary key of a new record - -Version 1.6.4 - August 07, 2011 -================================================================= - -This release ships with a couple of useful concepts inspired by -other frameworks. These are: - -- selecting into custom POJO's. Results can be mapped to POJO's - by convention or using JPA @Column annotations -- selecting into custom callbacks. This is already a wide-spread - practice in Spring JdbcTemplates. -- selecting long-running queries asynchronously. This idea has - been inspired by the Avaje Ebean framework - -Apart from these changes and some bugfixes, the internal API has -been completely re-designed. The idea here is that query -rendering and variable binding are even faster (less String -objects), more extensible and more accurate. This is a pre- -requisite for many future developments with even more complex SQL -statements, such as for instance CTE's (Common Table Expressions) - -Features and improvements -------------------------- -#137 - Add support for asynchronous query execution using - FutureResult ResultQuery.fetchLater() similar to - Avaje Ebean -#198 - Add SELECT INTO functionality into POJO's using - T ResultQuery.fetchInto(Class) similar to JPA - CriteriaQuery -#728 - Add .fetchInto(RecordHandler) to ResultQuery, Result, - and Cursor to allow for callbacks similar to Spring's - JdbcTemplate/Ollin Framework -#774 - Add more TRACE logging to .fetchLazy() -#777 - CURSOR: Add function alias: UNNEST for TABLE -#781 - Add E function (Euler number) -#782 - Add T Record.getValue(..., Class) methods - for convenient type conversion -#785 - Allow for storing TableRecord with a provided Field[] - indicating the primary key -#786 - Document thread-safety facts in Factory Javadoc -#788 - Add Key.getFieldsArray() convenience method -#793 - Add support for Oracle's SYS_CONNECT_BY_PATH function - -API changes (backwards-incompatible) ------------------------------------- -#758 - Change internal QueryPart rendering and binding API to use - Configuration and Context as callback parameters. If you - use CustomField or CustomCondition, please correct your - implementations accordingly. Other parts of the API should - not be affected -#778 - Purge deprecated API, deprecation prior to jOOQ 1.5.7 -#790 - Purge deprecated generated code, deprecation prior to - jOOQ 1.5.7 - -API changes (previous API now deprecated) ------------------------------------------ -#776 - Deprecate QueryPart.getSQL(), add Query.getSQL() -#789 - Deprecate Record constructors with Configuration - parameter - -Test cases ----------- -#636 - Add integration tests for more advanced CONNECT BY - example -#772 - Add integration tests for selecting cartesian products - (several tables in FROM clause) - -Bug fixes ---------- -#730 - Sybase cannot bind null values in plain SQL -#759 - Omit the TOP 100 PERCENT clause in SQL Server ordered - top-level queries -#767 - An empty Java package is generated for PL/SQL packages - containing underscores -#771 - Some exotic literals are not properly escaped with quotes - yet, e.g. UDT identifiers, VARRAY types, etc. -#775 - Automatic re-attaching after deserialisation does not work - when used with .fetchLazy() -#787 - The UpdatableRecord's internal changed flags are not - updated after INSERTs / UPDATEs - -Version 1.6.3 - July 31, 2011 -================================================================= - -This is mainly a maintenance release with lots of bugfixes, -mostly around code generation, plain SQL tables, and data types. -Please note that generated source code may contain incompatible -changes due to #639 (see below for details)! - -Apart from that, project CURSOR is advancing and it is now -possible to unnest arrays into tables. See this article for -details about where jOOQ is heading with project CURSOR: - -http://blog.jooq.org/2011/07/24/the-power-of-ref-cursor-types/ - -Features and improvements -------------------------- -#679 - Improve H2 NVL2 support as of H2 1.3.156 -#680 - Improve H2 ROUND support as of H2 1.3.156 -#735 - Add README documentation to GitHub -#736 - Add more info regarding number of generated artefacts in - jooq-codegen logging -#750 - Add DataType.isNumeric(), .isString(), .isTemporal(), - .isBinary() -#754 - Log query as executed by JDBC PreparedStatement when - TRACE logging (without inlining variables) -#752 - CURSOR: Add support for selecting from ARRAY types -#762 - Use H2's native support of NVL, instead of COALESCE -#764 - CURSOR: Add support for selecting from ARRAY types - returned from stored functions - -API changes (backwards-incompatible) ------------------------------------- -#639 - Map DECIMAL(n, 0) and NUMBER/NUMERIC(n, 0) data types - to Byte/Short/Integer/Long/BigInteger instead of - BigDecimal in generated source code. Re-generated code - will not be compatible! - -API changes (previous API now deprecated) ------------------------------------------ -#731 - Inconsistent API with Field.lessOrEqualToXXX(). Removed - "To" from method name -#757 - Deprecate Factory.constant() methods - -Test cases ----------- -#731 - Add missing integration tests for equalAll(), equalSome() - and similar methods -#747 - Upgrade H2 to 1.3.158 - -Bug fixes ---------- -#632 - Sybase error : column @p0 not found in nested SELECT -#700 - Restore HSQLDB ARRAY support with INFORMATION_SCHEMA - change in HSQLDB 2.2.3, and some fixes in 2.2.5 -#725 - Cannot insert byte[] data with plain SQL -#733 - H2 changed JDBC type for ResultSet/CURSOR from 0 to -10, - like Oracle -#737 - Compilation errors in generated source code if table - fields contain spaces -#738 - Compilation errors in generated source code if MySQL - procedure parameter type contains two comma-separated - arguments (like DECIMAL(10,2)) -#739 - Postgres navigator methods and keys are not re-generated - in the same order -#740 - Formatting is broken on Result.format() with some special - newline characters -#743 - Make SQL Server INFORMATION_SCHEMA independent from - HSQLDB again, to prevent incompatibility issues -#744 - Ingres REAL and FLOAT4 types are generated as FLOAT/FLOAT8 - which maps to java.lang.Double, instead of java.lang.Float -#753 - Postgres error when binding array that contains null - values -#755 - NullPointerException when converting an array containing - a null value -#766 - Bad decoding of JDBC Types BIGINT (to BigInteger instead - of Long) and REAL (to BigDecimal instead of Float) when - plain SQL tables are involved - -Version 1.6.2 - July 10, 2011 -================================================================= - -This release mainly introduces three new projects. - -Project CURSOR where jOOQ finally supports various RDBMS's TABLE, -CURSOR, and REF CURSOR data types. This is especially useful when -those types are returned from stored procedures and functions. -Cursors are simply mapped to jOOQ Result types and can -thus be used like regular table results - -Project EXPORT aims at exporting data from the database in -various serialisable formats, such as XML, CSV, HTML, Text, JSON. -This project will be continued in the future, to also -deserialise from (some of) these data streams. This will allow -for easy transport of jOOQ Result types over the net. - -Project CODEGEN has finally been started. Many improvements -suggested by jOOQ users will be implemented in the next releases. -In this release, important fixes have been made to prevent -compilation errors in generated artefacts. - -Features and improvements -------------------------- -#61 - EXPORT: Add Result.formatXML() -#166 - CURSOR: Add support for ResultSet type returned from - Oracle stored procedures / functions -#411 - Allow for fetching Map (instead of Record) - and List> (instead of Result) -#549 - Add Factory.function() for plain SQL functions -#611 - Simulate RPAD and LPAD in SQL Server, Sybase -#627 - Add support for Postgres FOR UPDATE OF [table-name] clause -#628 - Add support for REPEAT (SQL Server: REPLICATE) function -#637 - Nicely format time in StopWatch logging output -#640 - Simulate Postgres FOR UPDATE OF [table-name] clause in - other dialects -#649 - CURSOR: Add Cursor.fetch(int) .fetchOne() - .fetchResult(int) .fetchResult() -#653 - Add support for MySQL encryption and compression functions -#660 - Clarify Javadoc of UpdatableRecord to explain its - behaviour when changing the main unique key -#669 - EXPORT: Add Result.formatHTML() -#672 - Add convenience method UpdatableRecord.copy() in order to - reset primary key values for a subsequent INSERT -#675 - EXPORT: Add Result.formatCSV() -#683 - Implement ResultImpl.equals() and .hashCode() -#684 - Implement AbstractStore.equals() and .hashCode() -#685 - Add Store.size() to indicate the maximum index of the - Store -#687 - EXPORT: Add result.formatJSON() -#689 - Create separate builds: jooq-core.zip and - jooq-with-dependencies.zip -#690 - CURSOR: Add support for ResultSet type returned from H2 - stored functions -#695 - CURSOR: Add support for ResultSet type returned from - Postgres stored functions -#697 - Add Factory.fetch(String) for executing plain SQL queries - that return results -#701 - Add ResultQuery.fetchArray() and .fetchOneArray to return - Object[][] and Object[] -#704 - Always add top and bottom line in Result.format() -#705 - Right-align numeric values in Result.format() -#716 - Add SUBSTRING function Field.substring(Field, Field) - taking fields as arguments -#719 - Document risk of SQL injection in plain SQL and literal - factory methods -#726 - Add LENGTH function as a synonym for CHAR_LENGTH - -API changes (backwards-compatible) ----------------------------------- -#698 - Inconsistent API with Factory.fetch(Table [,Condition]) - Let method return Result instead of List -#699 - Let Result extend List - -API changes (previous API now deprecated) ------------------------------------------ -#656 - Decrease verbosity of plain SQL methods. They will just be - called Factory.field() .condition() .table() .query() - -Test cases ----------- -#643 - Add integration test for code generation of invalid and - incomplete types in Oracle -#654 - Add integration tests for master data tables with PK types - other than NUMBER/INT -#655 - Add missing integration tests for TRIM function - -Bug fixes ---------- -#450 - Improve plain SQL integrity checks for bind variables -#610 - CODEGEN: Compilation error in generated source code for - databases with table named 'system' -#646 - An empty Java package is generated for an empty PL/SQL - package. This is unnecessary -#651 - CODEGEN: Avoid importing datatypes in generated source - code to prevent collisions -#657 - NullPointerException when creating a Factory with a null - SchemaMapping -#658 - Master data table code generation is broken for tables - with more or less than 3 columns -#662 - Add support for the missing Postgres data type "bpchar" -#663 - Add support for the missing Sybase data type "int" -#664 - Ingres INTEGER data types are not correctly generated -#665 - HSQLDB Datatype CLOB and BLOB are not supported, when - selecting from plain SQL tables -#666 - The evil bug: Ingres TRIM function only executes RTRIM -#673 - UpdatableRecord.store() doesn't work if called after - .delete() -#702 - Add support for the missing SQLite data type "NULL" -#706 - CURSOR: Ensure that Query.execute() runs in a single - transaction when Postgres refcursor is involved in the - query (this fixes a Postgres JDBC driver flaw) -#724 - NullPointerException when passing a single literal null - bind value to plain SQL methods without casting to Object -#729 - DB2, Derby, Ingres, Oracle cannot bind null values in - plain SQL - -Version 1.6.1 - June 19, 2011 -================================================================= - -In this release, the PORTABILITY project has been implemented. -Finally, the SQLDialect has been removed from most generated -artefacts (Schema, Table, Field, Sequence, etc). Also, the -constructing Factory is not referenced by its created QueryParts -anymore, unless this is really necessary (Query objects, UDT's, -ARRAY types). This leads to higher compatibility between schemata -of different databases, e.g. if users want to use an HSQLDB -development and Oracle productive database. - -Unfortunately, this means that the way stored procedures are -called had to be changed. This is an API break that could not be -avoided. The pre-1.6.1 StoredObject.execute(Connection) method -is deprecated and will be removed in the future. It has been -replaced by StoredObject.execute(Configuration) - -In addition to this project, many more window functions are now -supported, as well as the Oracle-specific CONNECT BY clause for -recursive queries. - -Features --------- -#351 - Add support for Oracle ROWID data type -#452 - PORTABILITY: Create a super-set of RDBMS data types -#453 - PORTABILITY: Don't create dialect-specific QueryParts -#455 - Add support for the Oracle CONNECT BY clause -#587 - Add optional OFFSET clause to form LIMIT .. OFFSET - constructs -#589 - Add extended FOR UDPATE [OF ...] [{WAIT n | NOWAIT | SKIP - LOCKED }] support -#591 - Add support for LEAD() OVER() and LAG() OVER() window - functions -#592 - Add support for the CUME_DIST() OVER() window function -#601 - Add Factory.literal() convenience methods -#602 - Add Factory.val() methods to decrease .constant() - verbosity -#604 - Add support for RESPECT NULLS clause in some window - functions -#605 - Add Factory.use(String) for non-generated schemata -#613 - Add PI function -#616 - Add Factory.two() literal convenience method -#630 - Add support for Oracle CONNECT BY pseudo-columns LEVEL, - CONNECT_BY_ISCYCLE, CONNECT_BY_ISLEAF - -API changes ------------ -#299 - PORTABILITY: Create a dialect-independent meta-model -#588 - Add OVER() keyword to FIRST_VALUE() and LAST_VALUE() API - -Test cases ----------- -#368 - Add integration test for use with schema mapping -#586 - Upgrade H2 to 1.3.155 -#607 - Add integration tests for CRUD / SP's / UDT's / ARRAY's - with SchemaMapping -#612 - Add integration tests for LPAD and RPAD functions -#624 - Add integration test for code generation of invalid/ - incomplete views in Oracle -#631 - PORTABILITY: Add integration tests for using Oracle- - generated schema against an HSQLDB database -#638 - Add missing integration test for DECIMAL data type - -Bugfixes --------- -#176 - Stored procedures / functions in EQUIVALENT schemata - cannot be called -#493 - Bind variable mismatch when constructing bad SQL -#594 - Confusing Javadoc in SELECT DSL API -#603 - Fix DB2 'IGNORE NULLS' clause -#619 - SUBSTRING() function is broken in DB2, Ingres, SQL Server -#623 - SQL syntax error for some MERGE queries in SQL Server and - Sybase -#633 - SchemaMapping is not applied to sequences -#634 - Sequences are not escaped in generated SQL - -Version 1.6.0 - June 05, 2011 -================================================================= - -Apart from supporting various additional standard and non- -standard JOIN constructs, there is now also full support for the -SQL standard MERGE statement and MySQL's ON DUPLICATE KEY variant -thereof. A great number of API enhancements have been added, -which improve the usability of jOOQ. The Ingres database is now -also supported. - -Features --------- -#301 - Add support for Oracle execution hints -#409 - Add support for NATURAL JOIN syntax, where RDBMS allows it -#415 - Make fluent API's underlying SelectQuery objects publicly - available -#429 - Add Ingres support -#475 - Document class-level generic types and in Javadoc -#486 - Add support for SQL MERGE clause -#494 - Allow for omitting schema name in generated SQL -#496 - Automatically update IDENTITY values in UpdatableRecord, - after storing them -#520 - Add support for JOIN ... USING syntax -#524 - Upgrade HSQLDB to 2.2 -#533 - Add ORDER BY [Map] or BY [List] functionality -#534 - Add Result.isEmpty() -#535 - Call upon ConfigurationRegistry.provideFor() before - throwing a DetachedException -#536 - Simulate CASE [value] WHEN [value] THEN [result] END - syntax in Derby -#538 - Add some logging to ConfigurationProvider -#539 - Add possibility to negate numeric values with Field.neg() -#541 - Add support for MySQL ON DUPLICATE KEY clause -#542 - Allow for Collection arguments in INSERT's DSL API -#543 - Allow for creating FUNCTION() OVER() without PARTITION BY - or ORDER BY clause -#546 - Add Factory.use(Schema) -#548 - Add new internal type FieldMap -#550 - Simulate ON DUPLICATE KEY INSERT clause in dialects other - than MySQL -#551 - Add TableMapping, similar to SchemaMapping for mapping - tables -#553 - Add Factory.plainSQLQuery -#554 - Add Factory.plainSQLField with a DataType parameter -#555 - Add UpdateXXX.set(Map) convenience methods to DSL API -#557 - Enhance INSERT DSL API to allow for adding VALUES clause - with InsertXXX.set() syntax -#570 - Add support for the RAND() function -#567 - Add support for Ingres Sequences -#572 - Add support for the ATAN2() function -#573 - Add possibility for additional select() clauses for - convenience -#575 - Add support for the FULL OUTER JOIN syntax, where RDBMS - supports it -#576 - Add support for the CROSS JOIN syntax, where RDBMS - supports it -#581 - Enhance API and allow Collection> - instead of Collection> - -API changes ------------ -#397 - Purge deprecated API - -Bugfixes --------- -#481 - Handle case where an empty record is stored -#522 - Misleading Javadoc in generated stored procedures and - function constructors -#532 - Restore Postgres INFORMATION_SCHEMA -#537 - Prevent null from being added to QueryPartList -#540 - Error when TRACE logging Limit -#544 - Aliased elements are not bound correctly when rendered - with toSQLReference() -#559 - Loosen type safety on overloaded methods to prevent - compilation errors with javac/Netbeans -#560 - HSQLDB DataType REAL is configured incorrectly -#565 - Add integration tests for current_user() function -#569 - ORA-01427 when generating foreign key relations -#571 - Field.trim() not correctly implemented for SQL Server -#583 - Accelerate integration tests: Reset schema only if - necessary - -Version 1.5.9 - May 15, 2011 -================================================================= - -This version ships with lots of new functionality. Finally, the -DSL-style API has been extended to CRUD operations (INSERT, -UPDATE, DELETE)! Also, support for the TRUNCATE TABLE statement -has been added. - -The most important new features include the support for SQL:2003 -standard window functions, which are available in most major -RDBMS. Additionally, basic function support has been widely -extended. - -Features --------- -#148 - Added support for window functions -#204 - Add support for multi-record INSERT's -#416 - Added support for retrieval of IDENTITY values -#433 - Use bind variables for LIMIT and OFFSET -#441 - Added foreign key relationship meta information to the - generated source code -#446 - Beautify ResultImpl.toString() method -#461 - Automatically cast CONCAT parameters to Field if - necessary -#463 - Added support for trigonometric functions -#471 - Added support for the sign function -#472 - Added support for GREATEST/LEAST functions -#474 - Added support for "hyperbolic" functions SINH, COSH, TANH, - and COTH -#482 - Added DSL API for INSERT statements -#483 - Added DSL API for UPDATE statements -#484 - Added DSL API for DELETE statements -#485 - Added "Registry" for client code to provide Configurations - to jOOQ Attachables -#490 - Added support for the TRUNCATE TABLE statement -#495 - Generate source code for IDENTITY columns -#501 - Added support for boolean conversion to Result, Record, - and Store -#503 - Allow for schema navigation via generated artefacts -#518 - Let stored procedures reference owner package - if applicable -#525 - Added NULLS {FIRST | LAST} clause to ORDER BY constructs -#528 - Added Factory.getDataType() convenience method -#530 - Added Factory.zero() and Factory.one() convenience methods - -API changes (jooq) ------------------- -#527 - Weakened type-safety on Field.nvl2() -#529 - Deprecated Factory.select(Object...), added .selectOne() - and .selectZero() instead - -API changes (jooq-meta) ------------------------ -#30 - Add ParameterDefinition for stored procedures, instead of - reusing ColumnDefinition -#499 - Add reference to TableDefinition in ColumnDefinition -#500 - Add AttributeDefinition for UDTDefinition, instead of - reusing ColumnDefinition - -Bug fixes ---------- -#369 - Adapt H2 relations generation to H2's correction of - information_schema.cross_references -#435 - Added integration tests for NESTED SELECTs holding LIMIT - clauses -#460 - Syntax error when using a field with a reserved name -#462 - Fixed Javadoc broken links -#473 - Don't cast when cast is unnecessary -#479 - INSERT statement should not set all fields for a table -#497 - Derby referential code generation is broken, for named - foreign keys -#498 - Oracle package content is generated in arbitrary order -#502 - Syntax error when creating an empty IN condition -#526 - Corrected Javadoc in Field.coalesce() - -Version 1.5.8 - April 29, 2011 -================================================================= - -Finally, jOOQ now supports two important new RDBMS: -SQL Server and Sybase! - -Apart from this great enhancement, there is now also full support -for the non-SQL standard LIMIT clause, even in dialects where the -LIMIT clause is not supported natively (especially Oracle, but -also DB2, SQL Server and Sybase, which have limitations). jOOQ -simulates LIMITs by rendering nested selects filtering on ROWNUM -(Oracle) or on ROW_NUMBER() (DB2, SQL Server and Sybase). - -Other interesting additions are an increasing support for native -mathematical functions. More function support will be added in -future versions. - -Features --------- -#16 - Added support for SQL Server -#21 - Uniform implementation of the LIMIT clause. Implemented - LIMIT clause simulation through analytic functions, where - LIMIT is not supported natively -#97 - Added support for Sybase -#418 - Measure time of various steps in source code generation -#420 - Added support for proprietary SQL extensions "FOR UPDATE" - and "FOR SHARE" -#431 - Added additional statistics to generation log files -#432 - Unified the various "standard" ANSI INFORMATION_SCHEMA - implementations in the jooq-meta artefact -#436 - Added support for the modulo function -#438 - Added floor and ceil functions -#439 - Added support for mathematical functions (logarithms, - exponentials, sqrt) -#447 - Enhanced Field.add() and Field.subtract() to work for date - time fields, also - - -API changes ------------ -#428 - Created new Maven artefact jooq-meta to cleanly separate - database meta-data navigation from code generation -#458 - Decreased DSL verbosity for arithmetic operations and for - ordering - -Bug fixes ---------- -#417 - Restored warning when unknown column type is encountered - in source code generation -#419 - Corrected misleading Select.fetchOne(...) Javadoc -#421 - Optimised AbstractRecord's memory consumption -#448 - Corrected some Javadoc @see links -#449 - Changed Field.concatenate() to accept Field parameters - to avoid generic varargs warnings - -Version 1.5.7 - April 17, 2011 -================================================================= - -This is the first release built with support of Maven thanks to -the help of some jOOQ users! - -The main new features in this release are the improved support -for serialisation/deserialisation of jOOQ objects through use of -the newly introduced "Attachable" interface. - -If using log4j or the newly supported slf4j logging framework -in debug/trace mode, there is the possibility to log query -building/execution time statistics. - -Apart from these new features, fixes were mainly done in the -fields of type casting, HSQLDB 2.1 upgrade support, stored -procedures with OUT, IN/OUT parameters. Please upgrade, if you -are using any of those features. - -If you extend jOOQ as a base implementation for source code -generation, be aware of the fact, that the jOOQ-codegen is -currently undergoing major changes. Expect the code generation -API to stabilise again in one of the next releases. - -Features --------- -#104 - Added maven dependency -#248 - Integrate UDT types with ARRAYs -#295 - Allow for attaching/detaching UpdatableRecords to/from - Configurations -#359 - Added statistics measurement to Query execution for debug - log level -#362 - Added deprecation configuration flag -#364 - Document unknown type in generated source code -#373 - Improve exception handling in code generation -#378 - Added support for Oracle stored functions with OUT - parameters -#382 - Added Factory.attach() methods to re-attach deserialised - Attachables -#394 - Add logging support for SLF4J -#398 - Allow to provide a DataType in Factory.constant() -#399 - Provide access to TypeUtils.convert() methods via DataType -#404 - Added trace logging for measuring the speed of various - query execution steps - -API changes ------------ -#358 - Enhanced DSL API to allow for HAVING clauses without - GROUP BY clauses -#367 - Make Store, Result, QueryPart "Attachable" -#374 - Introduce strategy pattern to code generation for future - support for advanced naming schemes -#375 - Decouple Database from Generator -#381 - Made DataType Serializable -#384 - Deprecated singleton QueryParts -#388 - Unify "internal" API using an Adapter pattern - -Bug fixes ---------- -#187 - Protect generated Record navigation methods against name - clashes -#266 - Added more thorough integration tests for dialect-specific - casting (including some fixes related to varchar types) -#360 - Added more integration tests for the DISTINCT clause -#361 - Add more checks in testInsertUpdateDelete() -#366 - Warn only once per ColumnDefinition, if a data type is - unknown -#377 - NullPointerException when generating invalid stored - function -#380 - Added integration tests to check for proper - serialisability -#386 - Fixed incompatibilities with HSQLDB 2.1.0 -#387 - Fixed unnecessary imports in some Oracle generated - Records -#389 - Fixed javac compiler warning in AbstractStoredObject -#391 - Cannot properly call stored procedures when IN/OUT - parameter is bound to NULL -#392 - Procedures with several OUT parameters may not register - OUT parameters correctly -#410 - Passing null VARRAY values to Oracle stored procedures - causes issues -#412 - limit(int) sets default offset incorrectly in some - dialects - -Version 1.5.6 - March 31, 2011 -================================================================= - -This release consists mainly of code generation bug fixes and -minor API improvements and enhancements. - -The most important improvement is ticket #90, by which lazy -fetching and iteration over data is now supported. jOOQ lets you -keep a reference to a Cursor that has an open JDBC ResultSet, to -fetch data from on-the-fly. - -A few major code generation bugs were reported where the -generated code may cause ambiguity due to an inconsistent API. -This means that you will have to re-generate your schema after -upgrading to version 1.5.6. Some of your code may not compile -anymore, after this upgrade. - -Features --------- -#90 - Added possibility for lazy fetching of data -#208 - Added convenience methods for direct invocation of - sequences' currval() and nextval() attributes -#212 - Created one factory per dialect for better separation of - dialect-specific support -#213 - Generate a factory for each schema -#251 - Opened up base implementations for Field and Condition - to allow for custom implementations by client code -#274 - Integrate H2 ARRAY types with stored procedures -#292 - Documented usage of log4j and java.util.logging -#306 - Added support for the NULLIF function -#319 - Added Field.between(Field, Field) method -#320 - Added trace logging for variable binding and SQL - generation methods -#323 - Added Field.in(Field...) method -#325 - Include release version number in delivered .jar files -#328 - Improved configuration setup documentation page -#333 - Let Result implement Serializable -#334 - Added fetchMap() convenience methods -#335 - Added more functions and aggregate functions examples to - documentation -#338 - Visually improve code generation logging -#339 - Removed skipping of unreferenced UDT's, ENUM's and ARRAY's -#342 - Improved generated referential code by using fetch() and - fetchOne() API -#356 - Let UpdatableRecord.store() and delete() return an int - to indicate whether the record was actually modified - -API changes ------------ -#233 - Allow for joining TableLike instead of Table -#337 - Added generic type > to - InsertSelectQuery -#341 - Fixed API flaw where SelectOnConditionStep.and() methods - and similar ones returned SelectConditionStep, instead of - SelectOnConditionStep - -Bugfixes --------- -#69 - Corrected referential code generation for foreign keys - that reference non-primary unique keys -#85 - Corrected referential code generation for multi-field - foreign keys -#121 - Covered more Factory.executeXXX() methods with integration - tests -#318 - Fixed NullPointerException when executing SELECT * from - aliased tables -#321 - BetweenCondition does not bind left hand side Field - correctly -#322 - InCondition does not bind left hand side Field correctly -#326 - Avoid method overloading where binding to Object - may lead to compile-time ambiguities (with javac) -#343 - Add more foreign key navigation method integration tests -#347 - Add explicit integration tests for schema artefacts - excluded from code generation -#350 - Disambiguate navigation methods if several foreign keys - reference the same entity -#352 - Disambiguate navigation methods if a table ending on S - references itself -#353 - Added integration test for compilation of generated - artefacts with javac (as opposed to the Eclipse compiler) -#355 - Error when storing an UpdatableRecord that has no changed - values - -Version 1.5.5.2 - March 15, 2011 -================================================================= - -A critical bug was reported from the 1.5 release stream where -stored functions did not render their parameters in correct order - -Features --------- -#302 - Map Oracle's NUMBER data type to java.lang.Number in - stored procedures, stored functions - -Bugfixes --------- -#317 - StoredFunctionImpl.asField() renders parameters in wrong - order - -Version 1.5.5.1 - March 13, 2011 -================================================================= - -In version 1.5.5, there was a fatal bug breaking Derby source -code generation. Only the Derby dialect is affected. Please -update immediately, if you are using jOOQ's Derby integration - -Bugfixes --------- -#315 - Generated master data records are not sorted by PK -#316 - Derby code generation fatally broken - -Version 1.5.5 - March 12, 2011 -================================================================= - -This version is released early as there are some important -bugfixes. Additional improvemetns include: - -- Improved DSL related to conditions in HAVING and JOIN clauses -- Support for Oracle-style functions, such as NVL, NVL2, COALESCE - DECODE, etc - -Features --------- -#304 - Add support for Oracle NVL function -#305 - Add support for COALESCE function -#308 - Add support for Oracle NVL2 function -#311 - Add support for Oracle DECODE function - -API changes ------------ -#223 - Enhance DSL to accept and(), or() and similar methods in - JOIN steps -#224 - Enhance DSL to accept and(), or() and similar methods in - HAVING steps - -Bugfixes --------- -#297 - Fixed Factory.concatenate() function -#298 - Added integration tests for nested selects in HAVING - clause -#300 - Added integration tests for nested selects in JOIN clause -#303 - Javadoc correction -#307 - Accelerated integration tests -#309 - Fixed JDBC variable binding issue related to Conditions - where the lhs is a function (e.g. stored function) and the - rhs is a constant -#310 - Fixed issue where fetchOne() methods throw - NullPointerException if no result record is available -#312 - Fixed issue where Field.equal(...) methods rendered - unexpected SQL when rhs null is cast to a type -#313 - Fixed Derby cast type for VARCHAR -#304 - Let the DerbyDataType default for java.lang.String be - VARCHAR, not LONG VARCHAR - -Version 1.5.4 - March 04, 2011 -================================================================= - -Feature #243 required a minor API change in the base classes of -generated source code. This means you have to re-generate all -your jOOQ artifacts in order to migrate to 1.5.4. The artifacts -themselves should be regenerated in a compatible way, such that -your client code should not be affected. If this is not the case, -please report a ticket here: - - https://sourceforge.net/apps/trac/jooq/newticket - -Apart from the Derby RDMBS and some new data type support, there -have been many new convenience methods added all over the API. -For instance, if type-safety is not really a requirement, there -are lots of possibilities to use plain SQL directly in the DSL. -In that case, data can be accessed from Record, Results, not only -through Field, but also through field names or indexes. - -Check out the updated documentation (soon) here: - - https://sourceforge.net/apps/trac/jooq/wiki/Examples - -- Support for the Derby RDBMS -- Support for casting. This allows for even greater flexibility - in cases where jOOQ cannot 100% ensure type-safety -- Support for ARRAY types. Oracle, Postgres, HSQLDB and H2 ARRAY - types are now supported natively as regular bindings in - jOOQ's Field -- Support for dialect-specific data types. CHAR, VARCHAR, CLOB - are no longer treated equally as java.lang.String. Their - type heritage is also generated -- More sequence support -- Lots and lots of bug fixes - -Features --------- -#95 - Support for the Derby RDMBS -#163 - Add support for JDBC type ARRAY (with Postgres) -#209 - Add support for DB2 sequences -#210 - Add support for H2 sequences -#211 - Add support for HSQLDB sequences -#215 - Support for SQL casting using as cast type -#246 - Support for SQL casting using dialect-specific data types -#254 - Add HSQLDB support for ARRAY types -#256 - Add Oracle support for VARRAY types -#257 - Integrate ARRAY types with stored procedures -#261 - Add a global type mapping to the generated Schema object -#267 - Add DataTypeDefinition for further abstraction of data - types in code generation -#269 - Add H2 support for ARRAY types -#290 - If log4j is not on the classpath, use java.util.logging - instead, as fallback - -API Changes ------------ -#156 - Allow for results to be accessed by index, not by field -#218 - Corrected bad method signature: - Record.getValueAsLong(Field, Integer) -#219 - Extended Result and Select API's to be more similar to - that of Record -#232 - Add more convenience plain SQL support to the API -#235 - Add convenience methods to Record, Result and Select for - access of data via field name -#243 - Refactor DataType implementations in order to allow for - the use of generics -#259 - Add field type to database meta data (ColumnDefinition) -#260 - Add field type to database meta data (Field) -#262 - Add default behaviour for Record.getValue(Field) -#276 - Add Javadoc as a ZIP file to the jOOQ distribution - -Bugfixes --------- -#125 - Add more plain SQL integration tests -#191 - Add more integration tests for nested unions -#205 - Implemented workaround for handling Postgres stored - functions with UDT OUT parameters -#214 - Fixed NPE when generating a stored function with an - unknown parameter type -#216 - Fixed some cases where binding of BigInteger is not done - correctly -#220 - Syntax error when using select statement in a CASE clause -#221 - Corrected integration tests for combined update and - select statements -#222 - Added integration test for INSERT statements having - nested SELECT statements for their fields -#225 - Correctly cast array types in Postgres -#230 - Potential misuse of Blob and Clob in H2's JDBC types -#239 - Factory.fetchAny() is not implemented for SQLite -#244 - Fixed peculiar MySQL casting support where cast types do - not match any data types -#245 - Fixed NPE when reading null dates in SQLite -#249 - Added ARRAY type integration tests -#255 - Stored procedure bind variables get mixed up when any - argument is null -#263 - Correctly handle Postgres function overloading -#264 - Ambiguous funciton calls when calling overloaded functions - with null parameter -#281 - Handle compilation errors when generating stored - procedures with > 254 parameters -#283 - Fixed compilation errors in generated source code for - Oracle's UDT table type -#284 - Fixed compilation errors in generated source code for - Oracle procedures in packages, when they have no - parameters -#285 - Fixed compilation errors in generated source code for - Oracle tables with the same name in different schemata -#286 - Fixed name collisions in generated objects with the - java.lang.* package -#288 - Prevent the creation of UNION queries with bad syntax - in MySQL -#289 - Correctly alias fields within UNION queries for some - dialects, which then only require the "AS" keyword -#291 - Cannot create an aliased field called "year" in Postgres - -Version 1.5.3 - January 13, 2011 -================================================================= - -- Lots of stored procedure support was implemented -- Support for sequences was added -- The final decision to postpone support for DB2 UDT's was made -- Some code generation bugfixes - -Features --------- -#36 - Added stored procedure / stored function support for HSQLDB -#140 - Added support for Oracle sequences -#147 - Added support for H2 stored functions -#162 - Correctly integrate UDTs with stored procedures -#170 - Added support for Postgres stored functions -#186 - Added support for more Oracle PL/SQL simple data types -#193 - Simulate support for H2 "stored procedures" -#195 - Simulate support for Postgres "stored procedures" -#206 - Added support for Postgres sequences - -API changes ------------ -#180 - Improved DSL for constant values -#181 - Allow for referencing Field in function argument list -#189 - Renamed convenience methods in org.jooq.Record -#207 - Add fetchOne(Field) method to org.jooq.Select API - -Bugfixes --------- -#182 - Protected generated Record classes against clashes with inherited methods -#183 - Fixed NullPointerException, when generating master data tables with - NULL fields -#184 - Fixed IllegalArgumentException, when a data type is present in the - schema, but unavailable in code generation logic -#185 - Code generation should not fail when single elements cannot be generated -#188 - Improved integration tests for stored procedures / functions / packages -#196 - Increase RDMBS version compatibility by avoiding "SELECT *" in code - generation logic -#199 - Added integration tests for stored procedures in RDBMS that do not - support OUT parameters -#201 - Fixed issue in DB2 where stored procedures without parameters were not - generated. -#202 - Added integration tests for stored procedures / functions without - parameters - -Version 1.5.2 - December 27, 2010 -================================================================= - -- Improved support for stored procedures, also in packages -- A minor API change was inevitable to implement #173. The API change only - concerns the INTERNAL API. Deprecation marks are added and deprecated items - will be removed in 1.6.0 -- Experimental SQLite database support -- Some important bug fixes - -Features --------- -#25 - Added support for Oracle packages -#114 - Added support for Oracle UDTs -#145 - Added support for the SQLite database -#150 - Generate static convenience methods for stored procedures / functions -#151 - Generate static convenience methods for stored function fields -#152 - Generate meaningful serialVersionUID in generated classes -#173 - Added support for EQUIVALENT schemata - -API changes ------------ -#159 - Added convenience method List getValues(Field) to Result -#165 - Added convenience methods for creating EXISTS clauses -#169 - Improved DSL for WHERE clauses - -Bugfixes --------- -#68 - Prevent issues originating from overloaded stored procedure names, - generating identical Java class names -#153 - Fixed issue with generated code for DB2 stored functions -#154 - Fixed issue with generated code for DB2 stored functions -#155 - Fixed issues with database NULL not being mapped correctly to Java NULL - when selecting values that have a primitive type (int, long, etc) -#158 - Potential ClassCastException when using Field -#171 - Corrected issue related to selection of default schema in DB2 -#177 - Fixed issue related to generated code for tables or UDTs without columns - - -Version 1.5.1 - December 13, 2010 -================================================================= - -- H2 database support thanks to Espen Stromsnes -- Improved stored procedure support - -Features --------- -#96 - Added H2 database support -#101 - Added stored procedure / stored function support for Oracle -#138 - Added stored procedure support for DB2 -#146 - Added support for DB2 functions - -API changes ------------ -#143 - Added convenience methods to Record - -Bugfixes --------- -#84 - Implemented referential code generation for foreign keys that do not - match their primary keys' types -#141 - Encoding problem in generated master data classes - -Version 1.5.0 - November 22, 2010 -================================================================= - -- A big one. Major API changes / improvements -- Added lots of convenience methods -- UDT support -- Enum support -- DB2 support thanks to Espen Stromsnes -- "Light" dependency to log4j added. jOOQ will still run without it - -Features --------- -#1 - Create support for UDTs (so far only for PostgreSQL) -#15 - Added DB2 support -#60 - Added support for nested selects in INSERT and UPDATE - statements -#83 - Added log4j logging to code generation and runtime -#87 - Add support for arithmetic expressions -#105 - Added support for ENUM data types, where applicable - (MySQL and PostgreSQL so far) -#110 - Added execute and fetch convenience methods -#111 - Added missing "select distinct" support -#122 - Annotate generated classes with javax.annotation.Generated -#123 - Generate user enum fields from data values (master data) -#124 - Added PlainSQLTable -#127 - Added not() operator to Condition -#135 - Added convenience methods andNot() and orNot() in - Condition - -API changes ------------ -#89 - Removed support for DataSource. jOOQ is not a transaction - manager -#92 - Added SortField type to be used for sorting -#99 - Provide better access to functions (No more FunctionFactory) -#116 - Merge Manager functionality into Factory -#118 - Improve API of org.jooq.Field -#119 - Improve subquery condition API -#132 - Reduced much of the select query API -#134 - Better separation of SelectQuery and SimpleSelectQuery - -Bugfixes --------- -#109 - Error when executing select * if generated schema does not - match actual schema -#115 - Fix various "null" pseudo field issues -#126 - Error when selecting a single field from a union nested - select -#129 - Fixed performance issue in Oracle code generation for - very large databases - - -Version 1.4.4 - November 22, 2010 -================================================================= - -Unreleased version, fixes included in 1.5.0 - -Bugfixes --------- - -#133 - JoinCondition does not take comparison operator - -Version 1.4.3 - October 25, 2010 -================================================================= - -Some more bugfixes - -Bugfixes --------- - -#71 - Generated code does not compile, when foreign key and - primary key have a data type mismatch -#73 - In Oracle generated code, multi-field foreign keys may - generated bad relations code -#82 - Conversion of literals to camelcase fails if numbers are - involved - -Version 1.4.2 - October 22, 2010 -================================================================= - -Various bugfixes and minor improvements - -Features --------- -#66 - Add support for CASE or DECODE expression - -API changes ------------ -#77 - Functions should not extend FieldImpl, but a new - AbstractField -#78 - QueryPart pollutes declared method space of its - implementations. Hide it by indirection - -Bugfixes --------- -#64 - Code generation fails when foreign key references a unique - key that is not the primary key. Code generation for these - cases is omitted -#67 - When loading properties files, a leading / seems to be - mandatory. This is preventing users from correctly setting - up jOOQ the first time -#70 - Add support for Oracle datatype TIMESTAMP(6) -#72 - Name clashes in generated Tables -#75 - Constant does not bind its values. -#76 - Constant should not render strings all the time -#79 - Constants are not properly escaped -#80 - Position function does not bind any variables -#81 - Add cast function to Constants in HSQL - -Version 1.4.1 - October 18, 2010 -================================================================= - -Oracle patch release - -Features --------- -#63 - Generate referential functionality for Oracle - -Version 1.4.0 - October 17, 2010 -================================================================= - -Support for PostGreSQL was added. -Added lots of OR-mapping functionality. -There is a general API change due to various new features. - -Features --------- -#14 - Add PostGreSQL support -#40 - Resolve foreign keys. Allow for navigation between objects. -#42 - Add PlainSQLField -#45 - Add "dirty" flag to Record's values. This allows for - updating only relevant data. -#47 - Complete implementation for UPDATE, INSERT, DELETE - statements. Added some missing functionality. -#48 - Add more support for Date, Time, Timestamp fields. -#51 - Add a org.jooq.impl.Manager class that provides common - utility methods for CRUD operations - -API changes ------------ -#10 - Add second generic type . This is a - prerequisite for many OR-mapping features -#18 - Use org.jooq.Record in InsertQuery and UpdateQuery -#46 - Create UpdatableRecords as a prerequisite for JPA and true - OR-mapping. These records support store() and delete() - methods -#52 - Add default constructor in generated Records. -#53 - Add refresh functionality to UpdatableRecords. See also #46 -#54 - Add a state to the factory class -#56 - Reduce API, remove unnecessary Condition subinterfaces -#57 - Reduce API, remove unnecessary QueryPart interfaces - -Bugfixes --------- -#49 - NullPointerException when generating relations on schema - subset -#58 - Count function renders bad SQL in various dialects -#59 - Exception when selecting unaliased functions in queries - -Version 1.3.0 - August 24, 2010 -================================================================= - -Support for HSQLDB was added. -There is a major API change due to #44. - -Features --------- -#29 - Generate primary keys and foreign keys in Oracle code - generation -#34 - Add support for HSQLDB -#39 - Generate primary keys and foreign keys in HSQLDB code - generation -#41 - Add documentation to QueryFactory and Functions - -API changes ------------ -#23 - Add support for more advanced joins -#32 - Merge SelectQuery and ResultProviderQuery interfaces -#44 - Let Query methods return "this" - -Bugfixes --------- -#35 - Add unit tests for HSQLDB support -#37 - Syntax error in combined select queries! - The usage of combined queries in MySQL may still be a bit - awkward. Keep an eye out for further fixes -#43 - Join with aliased tables doesn't work - -Version 1.2.0 - August 21, 2010 -================================================================= - -The added Oracle support is now unit tested and more stable. -The Oracle NUMBER data type is mapped more precisely to Java -types. - -Features --------- -#12 - Model primary keys and foreign keys in generated code -#22 - Improve mapping of Oracle NUMBER data type -#26 - Add Plain SQL QueryParts -#27 - Add support for HAVING clause - -Bugfixes --------- -#24 - Add Unit tests for oracle database (and fixed bugs) -#31 - Pull up addOrderBy() methods from SelectQuery to - ResultProviderQuery - -Version 1.1.0 - August 17, 2010 -================================================================= - -The main new feature is the Oracle support. Wait for -Version 1.1.1 for that support to be stabilised, as there are no -Oracle unit tests running against an Oracle database yet. - -Features --------- - -#2 - Add support for inner / nested selects -#3 - Add more function support -#4 - Implement filtering functionality for code generation -#6 - Add Oracle Support -#9 - Create true POJO's (implementing org.jooq.Record) with - getters and setters -#17 - Make org.jooq.impl.Parameter independent of Field - -Bugfixes --------- - -#11 - Code generation does not remove files - -Version 1.0.1 - August 14, 2010 -================================================================= - -Features --------- - -#5 - Prevent code regeneration, if no changes were made -#7 - Implement ant task for code generation - -Version 1.0.0 - August 14, 2010 -================================================================================ -Initial Release \ No newline at end of file diff --git a/jOOQ-website/inc/RELEASENOTES-2.6.txt b/jOOQ-website/inc/RELEASENOTES-2.6.txt deleted file mode 100644 index dcf2f743a5..0000000000 --- a/jOOQ-website/inc/RELEASENOTES-2.6.txt +++ /dev/null @@ -1,3090 +0,0 @@ -jOOQ Release notes -================== - -For an interactive overview, see also -http://github.com/jOOQ/jOOQ/issues - -For a formatted text version, see -http://www.jooq.org/notes.php - -For a text version, see -http://www.jooq.org/inc/RELEASENOTES.txt - -Version 2.6.4 - May 25, 2013 -================================================================================ - -This is a patch release with some useful fixes for the 2.6 branch - -Bug fixes ---------- -#1883 - Derby OVERLAPS predicate doesn't work for (DATE, INTERVAL) tuples -#1982 - Change RenderNameStyle.UPPER, LOWER, AS_IS to quote literals if needed -#2271 - jOOQ Unit tests fail when not run in CET / CEST -#2294 - Compilation errors when code generator is configured with - true and false -#2298 - Suppress warnings in generated code (@SuppressWarnings("all") doesn't - work with javac) -#2312 - Annotate org.jooq.Support with java.lang.annotation.Documented to make - it part of the public API (in Javadoc) -#2314 - Outdated GenerationTool Javadoc -#2347 - Let equals() implementations succeed early on identity -#2368 - Table names should be quoted correctly to prevent problems when using - keywords as table names -#2401 - Bad package name generated when contents are not trimmed -#2469 - NullPointerException in AbstractResultQuery.fetchOneMap() - -Version 2.6.3 - February 25, 2013 -================================================================================ - -This is a minor patch release with some useful fixes for the 2.6 branch - -Bug fixes ---------- -#1886 - Query.bind() has no effect when Query.keepStatement(true) and - StatementType.STATIC_STATEMENT are combined -#2165 - Add H2 database definitions to the jOOQ-scala module -#2167 - Convert.convert("xx", boolean.class) returns null, instead of false -#2189 - Change all Javadoc

tags to

-#2190 - ClassCastException when using UNION with selectFrom() -#2214 - "code size too large" in generated SchemaImpl, when the number of tables - exceeds 15k -#2217 - Improve example in the "jOOQ for CRUD" section. Use only columns from - the sample database -#2223 - SQL injection is possible in org.jooq.impl.Val, if client code doesn't - correctly enforce generic typesafety, and bind variables are inlined -#2227 - Field.in(T...) doesn't convert argument values to the Field's type -#2238 - Code generation runs extremely slow for large schemas (Inefficient - DefaultRelations.getUniqueKeys() and getForeignKeys() methods) -#2239 - Code generation runs extremely slow for large schemas (Inefficient - AbstractDatabase.filterSchema() methods) -#2252 - ArrayIndexOutOfBoundsException, when rendering plain SQL that is - terminated by a comment -#2261 - RenderMapping has no effect, if not supplied to the Factory constructor -#2262 - RenderSchema has no effect, if not supplied to the Factory constructor - -Version 2.6.2 - February 5, 2013 -================================================================================ - -This is a minor patch release with some useful fixes for the 2.6 branch - -Bug fixes ---------- -#2055 - MySQL's UPDATE [t1] JOIN [t2] syntax can cause syntax errors as column - references are not fully qualified -#2057 - Cannot properly extract bind values for LIMIT .. OFFSET clause from a - SELECT statement -#2063 - jOOQ-meta loads Firebird composite unique key columns in wrong order -#2073 - The code generator's flag doesn't affect Oracle - VARRAY and TABLE types -#2082 - Oracle PIVOT expression doesn't bind any variables of a derived table - being pivoted -#2085 - java.lang.NoSuchMethodError: org.apache.log4j.Logger.isTraceEnabled()Z - when logger dependency is missing -#2098 - NullPointerException when org.jooq.impl.EnumConverter converts null -#2104 - SQLite code generation treats multi-column primary keys like multiple - single-column unique keys -#2108 - SQLite returns NULL for val(new Date(0)).add(-1) and some other date - time arithmetic expressions -#2125 - Regression in batchStore() for Postgres and jOOQ 2.6.1 -#2130 - Misleading Javadoc in Factory.selectCount() -#2139 - batchStore with composite types incorrectly reuses values from the first - record -#2146 - Improve AbstractField.equals() and AbstractTable.equals() and similar, - as these two are called very often -#2149 - Improve QueryPartList.removeNulls() as this is called very often - -Version 2.6.1 - December 27, 2012 -================================================================================ - -This is a minor patch release with some useful fixes for the 2.6 branch - -Bug fixes ---------- -#1890 - Bad Postgres array serialisation when " or \ characters are contained in - a String[] -#1937 - Inefficient implementations of AbstractDataType.equals() and hashCode() -#1938 - Improve AbstractField.hashCode() and AbstractTable.hashCode() and - similar, as these two are called very often -#1942 - Inefficient call to String.split() in StringUtils.toCamelCase() leads to - non-negligible performance ovrerhead in POJO transformation calls -#1954 - Bad SQL rendered when combining ORDER BY [ some-function ] with LIMIT - .. OFFSET in DB2, SQL Server -#1958 - Bad SQL rendered for OVER (ORDER BY [ some-function ]) for SQL Server - and Sybase -#1979 - Thread safety issue in org.jooq.impl.FieldList -#1992 - Bad reference to org.jooq.debug.[impl].DebugListener in the manual -#1993 - Bad code generated when the same table name exists in multiple schemas - in SQL Server -#1995 - Record.original() values aren't updated after a Record.store() operation -#2007 - Bad type coercion on the right hand side of a comparison predicate, when - the left hand side is Field -#2011 - Implement some micro-optimisations in DefaultRenderContext -#2045 - Bad hashCode calculation when Records contain arrays or byte[] - -Version 2.6.0 - October 26, 2012 -================================================================================ - -This release has a new main feature: the type-safe support for row value -expressions also known as tuples - up to a degree of 8. The API is formed in a -similar way as pre-existing tuple support in languages like C# or Scala. - -jOOQ's Scala integration has also been improved through the new jOOQ-Scala -module, which provides some useful implicit defs for operator overloading. -Future versions of jOOQ-Scala may experiment with Scala 2.10's Macros - -This release also ships with a lot of new deprecation to help you prepare for -the upcoming major release. - -Minor feature improvements include: - -- Lots of new fetchGroups() and intoGroups() methods, thanks to Ivan Dugic -- JDBC execution control support, such as cancel(), maxRows(), queryTimeout() -- Allowing for re-using JDBC PreparedStatement between Query executions -- Support for the SQL standard OVERLAPS predicate -- A new RecordMapper, similar to the existing RecordHandler - -Features and improvements -------------------------- -#385 - Allow for keeping open statements in a Query -#600 - Add support for Oracle / SQL Standard linear regression functions -#1058 - Add Factory.row(T1, T2, .. TN) and Factory.row( - Field, Field ... Field) to allow for creating tuples / rows -#1077 - Add support for the SQL standard OVERLAPS predicate -#1245 - Improve formatting for DECIMAL data types in Result.format(). Nicely - align the decimal point and reserve space on both sides -#1484 - Let XJC-generated artefacts implement Cloneable -#1527 - Support for converting String to java.net.URL, java.net.URI, and - java.io.File -#1674 - Export data types with Result.formatXML() and Result.formatJSON() - exports -#1679 - Add Factory.table(String, QueryPart...) -#1708 - Add Map> ResultQuery.fetchGroups(Field, Class) -#1709 - Add Map> ResultQuery.fetchGroups(Field[]) -#1710 - Add Map> - ResultQuery.fetchGroups(Field[], Class) -#1719 - Make logic from ResultQuery.fetchArray() available in Result.intoArray() -#1728 - Add support for the MySQL COUNT(DISTINCT expr, expr...) aggregate - function syntax -#1744 - Add support for the CUBRID DECR() function -#1756 - Add RecordMapper, similar to RecordHandler, mapping records to - custom types -#1762 - Add package-info.java to add Javadoc documentation to all packages -#1766 - Simulate row comparisons where they are not supported -#1773 - Add a new jOOQ-Scala project and jooq-scala artefactId, to contain jOOQ - extensions in the Scala language -#1782 - Move JAXB bindings out of XSD, in order to support more advanced - bindings -#1783 - Generate @SuppressWarnings("all") in jOOQ-generated artefacts -#1784 - Enhance the BETWEEN predicate, introducing the AND keyword -#1810 - Add Map ResultQuery.fetchMap(Field, Class) and - Result.intoMap(Field, Class) -#1816 - Add support for materialized views in Oracle's code generator -#1828 - Reduce log level for Factory deserialisation to TRACE -#1837 - Add support for @java.beans.ConstructorProperties when fetching into - immutable POJOs -#1841 - Add SortField Field.sort(SortOrder) to allow for dynamic sorting -#1842 - Add Condition Field.compare(Comparator, Field) to allow for dynamic - comparisons -#1844 - Add Table Table.join(TableLike, JoinType) to allow for - dynamic joining -#1845 - Add Factory.schemaByName(String) for plain SQL schemata -#1848 - Add Record.changed() to indicate whether a Record contains "dirty" - values -#1849 - Add Record.original() to obtain the originally fetched values from a - Record -#1854 - Add ResultQuery.maxRows(int) to limit the number of actually fetched - records -#1855 - Add Query.cancel() to support for interrupting statements prematurely -#1856 - Add Query.queryTimeout(int) to support for JDBC's - Statement.setQueryTimeout() - -API changes (backwards-compatible) ----------------------------------- -#1800 - Deprecate AliasProvider -#1807 - Result.intoArray() declares "throws MappingException", which isn't true -#1839 - Deprecate the various Result.getValuesAs[Type] and - Record.getValueAs[Type] methods -#1840 - Deprecate org.jooq.Store -#1866 - Deprecate [Schema-Name]Factory, remove reference to it from the - tutorials -#1869 - Deprecate org.jooq.NamedQueryPart -#1870 - Deprecate org.jooq.NamedTypeProviderQueryPart -#1872 - Improve jOOQ's RenderContext pretty printing behaviour -#1881 - Deprecate ConditionProvider, OrderProvider, LockProvider types - -Bug fixes ---------- -#1593 - Factory.field("{1} + {0} + {0}", val(1), val(2)) doesn't work. Cannot - re-use / re-order placeholders -#1720 - Improve performance by using Record.getValue(int) instead of - Record.getValue(Field) internally, where more than one value is - retrieved from a record -#1751 - Result.intoResultSet() generates wrong ResultSetMetaData if runtime - schema mapping is applied -#1764 - Add missing @Support({ ... FIREBIRD ... }) annotations -#1768 - NullPointerException when DAO.fetchOne() returns no record -#1774 - QueryPart.toString() does not load default settings from classpath -#1786 - Fix SEQUENCE support for Firebird -#1791 - Log a table's input/output names, and PK name when generating code -#1792 - Factory.fieldByName() and tableByName() do not correctly escape quotes -#1797 - SQL syntax errors when plain SQL contains comments with question marks - and SQL is executed as StatementType.STATIC_STATEMENT -#1802 - Result.into(Table) doesn't work correctly, if the same field name - appears twice in Result -#1806 - Let Record.toString() wrap the record in a temporary Result and call - Result.toString() instead -#1819 - MappingException in Record.into(Class), when POJO setters have - applicable names but non-applicable argument types -#1820 - Cannot fetch into non-public POJO classes. Their members / getters / - setters should be made accessible -#1829 - Factory.execute(String) may cause errors when plain SQL returns results -#1830 - Allow for passing null or empty arrays to intoMap(Field[]) and - intoGroups(Field[]) -#1850 - Record.equals() returns true as soon as both records hold a "null" value - for a given field -#1860 - Bad Results returned from plain SQL "select *" queries, if several - selected columns share the same name -#1876 - NULL constraint violation when storing a copied record - -Version 2.5.0 - August 26, 2012 -================================================================================ - -Welcome to another great database integration in jOOQ: Firebird! This is one of -the more popular open source SQL databases out there, with a rich feature set, -including the SQL standard MERGE statement. - -Apart from this, the main new features are: - -- Optimistic locking. jOOQ's UpdatableRecord API transparently implements - optimistic locking on its store() and delete() methods. By default, the - in-memory record is compared with the one in the database at write time. But - you can also let jOOQ handle incremented VERSION or TIMESTAMP columns for you. -- Oracle feature increment. Many nice Oracle features are now supported: - user-defined aggregates, regular expressions, Oracle Text, CONNECT_BY_ROOT and - ORDER SIBLINGS BY clausess, partitioned outer joins and more -- jOOQ's convenience API has been greatly enhanced. This includes many improved - fetch methods and new short forms for equal=eq, notEqual=ne, greaterThan=gt, - etc. to better align jOOQ with JPA, XSL, QueryDSL and many other tools that - abbreviate these keywords -- Many types and methods have been deprecated to help you foresee the upcoming - changes in jOOQ 3.0 - -Please consider also the updated manual with its new, more user-friendly -structure - -Features and improvements -------------------------- -#430 - Add support for the Firebird database -#457 - Add support for Oracle user-defined AGGREGATE functions -#620 - Add support for the SQL:2008 standard LIKE_REGEX operator -#722 - Remove casting of bind values in Ingres -#727 - Simulate RPAD and LPAD in SQLite -#816 - Add support for Oracle Text functions -#1339 - Add option to generate immutable pojos -#1547 - Support "optimistic locking" in UpdatableRecord.store() and delete() -#1552 - Generate fetchBy[ColumnName] methods in generated DAO classes -#1553 - Add some Javadoc to document the difference between using a Factory with - a Connection or with a DataSource -#1556 - Add javax.validation API to full deliverable -#1565 - Add Factory.connectByRoot(Field) to support the Oracle - CONNECT_BY_ROOT pseudo column -#1570 - Add Factory.condition(String, QueryPart...) similar to - Factory.field(String, QueryPart...) -#1582 - Add support for Oracle's ORDER SIBLINGS BY clause, in combination with - CONNECT BY -#1586 - Add missing constructors taking DataSource to dialect-specific factories -#1587 - Generate missing constructors taking DataSource in schema-specific - factories -#1595 - Simulate REPEAT() in SQLite -#1596 - Add support for optimistic locking using generated information about - "timestamp" or "version" columns -#1627 - Handle NULL in CSV imports/exports -#1645 - Add support for Oracle's PARTITION BY clause in OUTER JOINs -#1657 - Reorganise the manual -#1664 - By default, activate in the code generator -#1665 - Add support for the empty GROUP BY () clause -#1675 - Add support for the SQL standard IS [NOT] DISTINCT FROM predicate -#1680 - Overload all plain SQL DSL methods to also accept QueryPart arguments -#1681 - Simulate empty GROUP BY () clause in Sybase ASE and Ingres, joining a - dummy table and grouping by a constant field -#1684 - Add Setting to indicate that fetched records shouldn't - be automatically "attached" -#1685 - Improve Javadoc of Attachable.attach(). Document how "detaching" works -#1688 - Add E Record.into(E) as a complement to E Record.into(Class) -#1692 - Replace Factory.executeInsert(), Factory.executeUpdate() and similar - methods with more succinct variants -#1696 - Add short versions of comparison predicate methods, such as eq, ne, gt, - ge, lt, le -#1698 - Add support for the SQL standard BETWEEN SYMMETRIC predicate -#1701 - Add Factory.not(Condition) as a synonym for Condition.not() -#1704 - Document the behaviour of Factory.newRecord(Table, Object) and - Record.from(Object) with respect to UpdatableRecord.store() -#1707 - Add Map> ResultQuery.fetchGroups(Field) and - Result.intoGroups(Field) -#1712 - Add > Result.sortAsc .sortDesc(Field) -#1713 - Add Result.sortAsc, .sortDesc(Field, Comparator) -#1714 - Add Result.sortAsc, .sortDesc(Comparator) -#1718 - Document usage of InvalidResultException on the ResultQuery.fetchXXX() - Javadocs -#1721 - Add Map> ResultQuery.fetchGroups(Field, Field) - and Result.intoGroups(Field, Field) -#1722 - ResultQuery.fetchArray(int) and .fetchArray(String) should return a - typed array, even if this cannot be checked by the compiler -#1723 - Add Factory.fetchLazy(ResultSet) - -API changes (backwards-compatible) ----------------------------------- -#1544 - Remove Attachable interface from QueryPart hierarchy -#1579 - Deprecate org.jooq.Type -#1580 - Deprecate org.jooq.SchemaProvider -#1638 - Deprecate org.jooq.ArrayRecord.createArray() -#1639 - Deprecate org.jooq.Adapter -#1687 - Let Cursor.fetchInto(Table) return Result instead of List -#1736 - Deprecate TableRecord.{store|refresh|delete}Using() methods as being - part of jOOQ's internal API -#1741 - Deprecate org.jooq.MasterDataType - -Bug fixes ---------- -#1572 - Use Thread.currentThread().getContextClassLoader() to load - ExecuteListener classes as a workaround for experienced class loading - problems when using OSGi -#1584 - Code generation error with Oracle UDT static functions -#1632 - Improve the performance of various DefaultRenderContext methods, by - locally caching Settings values -#1633 - Improve the performance of CursorImpl.CursorIterator by setting Record - values by index rather than by Field -#1635 - Improve the performance of Factory.fetch(ResultSet) by caching data type - normalisation regex in FieldTypeHelper -#1650 - jOOR Fix #16: Can't call Reflect.create(A, B, null) -#1660 - Factory.renderContext().castMode(CastMode.NEVER).render(query) doesn't - work. CastMode is not applied -#1667 - Bad variable binding when NULLS FIRST, NULLS LAST is simulated in SQL - Server and other databases -#1673 - Result.formatXML() and Result.intoXML() do not render namespaces - correctly -#1683 - Oracle code generation regression for 10g. No such column - ALL_PROCEDURES.OBJECT_ID -#1693 - Cannot bind UDT values from other schemata to stored procedures -#1730 - Compilation errors in SQLite generated code when flag - is set to true - -Version 2.4.0 - July 8, 2012 -================================================================================ - -This release's main new feature is jOOQ's added convenience in -Factory initialisation for those users who get their database -connectivity through JDBC DataSources. If supplied with a -DataSource, a jOOQ Factory will handle the Connection lifecycle -internally, closing the Connection when no longer needed. - -The H2 MERGE statement syntax is now supported and simulated in -other databases, for those users that prefer its more intuitive -syntax over the SQL standard. - -The code generator now also allows for generating interfaces and -DAOs per table. DAO generation was previous discussed on the user -group and seen in a competitor product called OneWebSQL. - -The jOOQ Console now supports breakpoints for even more effective -SQL development - -Features and improvements -------------------------- -#1141 - Add Result.intoResultSet() to wrap a Result in a JDBC - ResultSet -#1253 - Avoid JDBC escape syntax for date/time literals -#1280 - Generate DAO classes and interfaces for POJOs -#1404 - Document the lifecycle of an ExecuteListener in the - Javadoc -#1411 - Add support for Postgres "any" data type (with quotes!). - This seems to map well to java.lang.Object -#1418 - Support case-insensitive schema names in code generation -#1419 - Add some WARN-level logging when the source-code - generator doesn't generate any artefacts -#1423 - Add Field.likeIgnoreCase() to support Postgres' ILIKE - operator -#1424 - Add Factory(DataSource) and similar constructors -#1427 - Add Factory.batchStore(Collection>) for convenience -#1428 - Add DataType.convert(Object...) and - DataType.convert(Collection) for convenience -#1431 - Add org.jooq.Name Factory.name(String) to contruct - QueryParts that are escaped according to - Settings.getRenderNameStyle() -#1432 - Add Factory.fetch(String, QueryPart...) and - Factory.execute(String, QueryPart...) and similar methods - to support arbitrary QueryParts in plain SQL -#1434 - Add UniqueKeyDefinition.isPrimaryKey() for completeness -#1438 - Add Result Factory.fetchFromCSV(String) -#1440 - Add top-level pom.xml for jooq-parent artefact (GitHub - Issue #14) -#1446 - Converting arbitrary strings to Number / Date should - return null, instead of throwing an exception -#1449 - Generate some meaningful Javadoc into the generated - [schema-name]Factory classes -#1454 - Add line breaks to generated Javadoc where appropriate -#1463 - Add option to let generated Record / POJO objects - implement a common generated interface -#1470 - Support interface types in ResultQuery.fetchInto(Class), - Result.into(Class), and Record.into(Class) methods, - returning a proxy -#1471 - Upgrade internal jOOR dependency to jOOR 0.9.4 -#1473 - Add IdentityDefinition to jooq-meta -#1501 - Add support for conversion of String to - java.sql.{Date, Time, Timestamp}. GitHub issue #22 -#1504 - Document behaviour of fetch() and fetchOne() in case jOOQ - cannot fetch actual records -#1509 - Minor improvements in the generator source code. GitHub - pull request #23 -#1510 - Generate additional setters for foreign keys, accepting - records as arguments -#1521 - Expose Connection methods, such as commit(), rollback() - and similar transaction-related methods in Factory -#1523 - Support ROW_NUMBER() OVER() for the latest version of - Derby and H2, which support it -#1524 - Simulate ROW_NUMBER() OVER() in HSQLDB using ROWNUM() -#1528 - Let generated interfaces extend Serializable -#1532 - Clarify the lifecycle of Configuration.data in the - Javadoc -#1534 - Generate more meaningful Javadoc where "an uncommented - item" stands now -#1536 - Add documentation to the FOR UPDATE OF clause, indicating - that DB2 may have stricter requirements regarding - updatability of fields -#1541 - Add support for the H2 MERGE syntax - GitHub Issue #18 -#1542 - Simulate the H2 MERGE syntax in other dialects supporting - the SQL standard MERGE statement - GitHub Issue #18 -#1545 - Website and Documentation anchors should be links to - themselves, visually recognisable - -Features and improvements (jOOQ Console) ----------------------------------------- -#1398 - Allow for adding breakpoints in jOOQ Console - -API changes (backwards-compatible) ----------------------------------- -#1408 - Relax bounds of in Factory.truncate() to Record, - instead of TableRecord -#1429 - Change Convert.convert(List, XXX) to accept Collection - instead of List - -Bug fixes ---------- -#1020 - Improve Oracle's LIMIT .. OFFSET clause simulation. - GitHub Issue #16 -#1358 - Compilation errors in generated source code when Oracle - overloaded procedures collide with procedures that end - with numbers -#1437 - Error in Javadoc of FactoryOperations.fetchOne(). This - method may return null -#1441 - Performance issue with AbstractDataType.convert(Object). - Avoid conversions when they're obviously unneeded -#1448 - Handle String to Enum conversion (when Java Enums are - stored as Strings in the database) - GitHub issue #15 -#1459 - Generated Keys.java static class too large (static - initialiser can become bigger than 64kb) -#1460 - Table.getReferencesTo(Table) doesn't work correctly for - aliased tables -#1461 - Exception when rendering of {fn datetimeadd(...)} for - HSQLDB and Derby -#1462 - Document missing GeneratorStrategy features, such as - getJavaClassImplements() -#1465 - Custom generator strategy's printImplements() is called - with Mode == RECORD for tables -#1478 - Caching SQLDialect in AbstractDatabase heavily improves - code generation performance -#1483 - Inefficient cloning of default settings using JAXB - unmarshalling leads to non-negligible overall overhead. - Use serialisation instead (short of a useful XJC clone - plugin) -#1489 - Fix manual where it claims to throw SQLExceptions -#1490 - Compilation error when a SQL Server stored procedure has - a parameter named "value" -#1493 - Bad syntax for SELECT /*+hint*/ DISTINCT ... in Oracle -#1498 - jOOQ does not compile using JDK 7 / JDBC 4.1. GitHub - Issue #24 -#1499 - Generated members of Tables.java are not final -#1505 - Bad exception message when ON DUPLICATE KEY IGNORE cannot - be simulated -#1515 - Splitting of large NOT IN conditions is wrong. The parts - should be connected with AND, not with OR -#1522 - fetch().into(Table) doesn't initialise records correctly, - such that subsequent calls to store() will execute an - INSERT, rather than an UPDATE -#1525 - Generate missing Javadoc to getters for procedure OUT - parameters -#1529 - Factory.batchStore() logs all single statements to DEBUG - output. Find a more accurate log output -#1537 - Factory.batchStore() renders bad SQL for Postgres. The - RETURNING clause is not allowed in batch INSERTs - -Version 2.3.1 - May 11, 2012 -================================================================================ -This is an important patch release fixing some regressions in the -code generator for the Postgres dialect. With 2.3.0, it was no -longer possible to generate schemata of which the database user -was not the owner. - -Bug fixes ---------- -#1334 - Fix inaccurate simulation of TRUNC(number, decimals) for - Derby -#1403 - Documentation bug: ctx.statement() can be replaced in - executeStart(). This is not documented -#1406 - Compilation errors in generated source code when Postgres - stored procedure parameter is called "NAME" -#1407 - Compilation errors in generated source code when Postgres - data-type is "any" (with quotes!) -#1409 - Postgres code generation broken when not connecting with - the owner of a schema - -Version 2.3.0 - May 6, 2012 -================================================================================ - -This is a minor feature increment release, featuring many useful -API enhancements, some new functions, some new syntax support -elements, improved source code generation and a lot of -improvements on the jOOQ Console, thanks to Christopher Deckers. - -The updated jOOQ Console now allows for filtering incoming -statements directly on the server side, using regular expression -filters on statement text and other features. These improvements -are a part of a general strategy to introduce breakpoints and -more sophisticated debugging capability to the jOOQ Console. - -Features and improvements -------------------------- -#597 - Add support for Oracle KEEP (DENSE_RANK FIRST...) - aggregate function clause -#910 - Add ExecuteListener extension to allow for overriding - exception translator to handle vendor-specific error - codes -#1286 - Add "renderSchema" flag to Settings, to completely - disable rendering of schema names -#1293 - Generate setter methods for JAXB annotated configuration - properties -#1295 - Add support for MySQL's INSERT IGNORE clause -#1296 - Simulate the FOR UPDATE clause for SQL Server, CUBRID, - using JDBC's ResultSet.CONCUR_UPDATABLE -#1302 - Add Factory.inline() to allow for flagging inline-only - "bind values" -#1303 - Add connection-less Factory constructors for convenience, - when jOOQ is only used as a SQL query builder -#1304 - Add option to generate JSR-303 @NotNull and @Size - annotations to generated POJO's -#1307 - Let HSQLDB dialect render NVL2() as NVL2() instead of - CASE expression -#1312 - Allow for omitting , and generate all - available schemata in that case -#1315 - Let generated factories use their associated Schema as - the Settings' RenderMapping's defaultSchema -#1319 - Move jooq-spring's FactoryProxy to the core jooq project -#1322 - Add Factory.dateAdd() and timestampAdd() for convenience -#1327 - Add DataType.isLob() -#1328 - Add Field inline(char), inline(Character), - inline(CharSequence) for convenience -#1333 - Add support for the Oracle TRUNC function, for numeric - arithmetic -#1336 - Let Record.into(Class) and similar methods accept - "immutable" classes, i.e. setter-less classes that take - several constructor arguments -#1340 - Use Constructor.setAccessible(true), if no default - constructor is available on the target type of - Record.into(Class) -#1342 - Improve Javadoc on Factory.function(). Document arguments -#1349 - Add support for the CUBRID Click-Counter INCR() -#1352 - Allow for creating syntax-error and SQL-injection safe - qualifiers for org.jooq.Field and org.jooq.Table -#1361 - Add Factory.batchStore(TableRecord...), to allow for - batch UPDATE/INSERTs of many records -#1367 - Make configured ExecuteListeners default constructors - accessible -#1366 - Let org.jooq.Batch extend Serializable -#1378 - Upgrade internal jOOR dependency to jOOR 0.9.3 -#1379 - Upgrade internal jOOU dependency to jOOU 0.9.1 -#1390 - Add RenderContext.qualify() to indicate whether - QueryParts should render qualified versions of themselves - or not - -Features and improvements (jOOQ Console) ----------------------------------------- -#1242 - Upgrade jOOQ Console dependency on RSyntaxTextArea from - 1.5 to 2.0.2 -#1249 - Allow for filtering incoming statements in jOOQ Console -#1393 - Implement a communication protocol between Console server - types and Console client types to allow for more - sophisticated functionality - -API changes (backwards-compatible) ----------------------------------- -#1310 - Deprecate Factory.literal() in favor of Factory.inline(), - and Factory.field() -#1368 - Promote AbstractQuery.isExecutable() to the public API - -Bug fixes ---------- -#989 - INSERT and UPDATE statements always render non-qualified, - escaped field names. This may cause trouble when using - plain SQL fields -#1109 - Standalone TABLE or VARRAY types are not correctly - initialised before referencing tables load them -#1279 - NullPointerException when leaving empty -#1283 - The LIKE escape character needs escaping, too, in - contains(), startsWith(), endsWith() -#1306 - Add missing INTERVAL data types to HSQLDBDataType -#1308 - Oracle's DataTypeDefinition reports the length of a BLOB - / CLOB data type to be 4000 -#1313 - and match only table names, not - fully qualified names -#1323 - Add support for byte[] in Postgres UDTs -#1324 - Code generation error in Oracle 10g when generating - stored procedures -#1326 - Error when deserialising BLOBs from Oracle UDTs -#1329 - NullPointerException when passing null to - timestampDiff(Field, Field) -#1343 - Regression in insertInto(...).values(...). Cannot pass - Field to values() -#1344 - Initialise Result ArrayLists to their expected size, if - that size is known. -#1360 - jOOR issue 12: "Don't reset the accessible flag to false, - if setting it to true is required, to avoid race - conditions in concurrency contexts" -#1371 - Missing conversion when using unsafe Field types in - BATCH statements -#1376 - Oracle UDTs in REF CURSORs are not deserialised correctly - from procedure OUT parameters -#1377 - Oracle UDTs are not deserialised correctly when the same - UDT name is present in multiple schemata -#1394 - NullPointerException when omitting element in - code generation configuration - -Version 2.2.1 - April 12, 2012 -================================================================================ - -This is a minor patch release, fixing some issues related to the -code generation of the new CUBRID integration as well as other, -minor issues. Upgrade if you're using CUBRID - -Bug fixes ---------- -#1287 - Remove oracle.sql dependency also from OSGi information - in pom.xml -#1288 - SQL syntax errors from sequences when using RenderMapping - with defaultSchema -#1289 - DefaultBindContext logs as Util.class -#1297 - Compilation error in CUBRID generated artefacts - referencing OBJECT types -#1298 - Avoid source code generation errors when generating code - for unknown, dialect-specific data types - -Version 2.2.0 - April 09, 2012 -================================================================================ - -Finally, jOOQ has added support for another database, and a very -promising one, that is. http://www.cubrid.org is a surprisingly -original mixture of a relational and object-oriented database -where tables and classes are synonyms, so are records and -instances. The CUBRID database has a high level of compatibility -with MySQL and is aimed at MySQL users wanting more performance -for their web applications. For details, see the slides here: - -http://www.slideshare.net/cubrid/growing-in-the-wild-the-story-by-cubrid-database-developers - -jOOQ is proud to have become a CUBRID partner, looking forward -to further cooperation with CUBRID in the near future. - -Apart from that, jOOQ now fully supports SQL standard INTERVAL -data types. With JDBC and JPA lacking official support for this, -jOOQ aims for becoming the tool of choice for vendor-specific -date time arithmetic. True INTERVAL data type support is given in -HSQLDB, Ingres, Oracle, Postgres databases. Besides that, CUBRID -and MySQL support INTERVAL data type arguments in functions. In -other dialects, jOOQ simulates DATEADD(), TIMESTAMPADD(), -DATEDIFF(), TIMESTAMPDIFF(). - -For jOOQ's OLAP friends, there is now also support for the Oracle -LISTAGG function (LIST() in Sybase, XMLAGG() in DB2, STRING_AGG() -in Postgres, GROUP_CONCAT() in CUBRID, H2, HSQLDB, MySQL). -LISTAGG is an "ordered aggregate function", meaning that the -aggregation is done using a specific ordering. Keep an eye out -for more such function support in future versions. - -Features and improvements -------------------------- -#566 - Add support for INTERVAL data types -#585 - Add support for DATE, TIME and INTERVAL arithmetic -#1183 - Add support for DEFAULT values in Oracle stored procedure - parameters -#1243 - Let generated POJOs (and Records) extend base classes - and implement interfaces -#1252 - Avoid JDBC escape syntax for Oracle stored procedure - calls. Generate PL/SQL syntax, instead -#1255 - Let generated Tables contain a public default constructor - to be able to extend those classes - Github issue #12 -#1257 - Add CUBRID support -#1268 - Add Factory.field(String, QueryPart...) to generate - custom clauses -#1269 - Add YEAR(), MONTH(), DAY(), HOUR(), MINUTE(), SECOND() - function support as shortcuts for EXTRACT() -#1273 - Simulate GROUP_CONCAT() aggregate function using Oracle's - LISTAGG() function, where available -#1274 - Add support for the Oracle LISTAGG(...) WITHIN GROUP - (ORDER BY ..) [ OVER (..) ] aggregate / analytic function -#1275 - Simulate Sybase LIST() aggregate function using Oracle's - LISTAGG() function -#1276 - Simulate Oracle's LISTAGG() in DB2 using XMLAGG(), - SUBSTR() and CONCAT() -#1278 - DEBUG log both executed SQL and SQL with inlined bind - values - -API changes (backwards-compatible) ----------------------------------- -#1262 - Pull up OracleFactory.prior() and other CONNECT BY - related methods to Factory - -Bug fixes ---------- -#1241 - Wrong variable binding when comparing CHAR columns in - Derby and DB2 without explicit casting to VARCHAR -#1244 - Cannot override class name in GeneratorStrategy in - Mode.POJO -#1248 - Setting both false and - true leads to compilation errors -#1256 - Fixed code generation issue with H2 user defined - functions returning VARCHAR -#1263 - Pass fetchsizes <= 0 to the JDBC driver (for vendor- - specific MySQL compatibility) -#1270 - Most databases allow for multiple identical foreign keys. - This leads to compilation errors in generated source code - -Version 2.1.0 - March 18, 2012 -================================================================================ - -With this version, jOOQ attempts to follow versioning rules -imposed by semantic versioning: http://semver.org/ -There will be 1 minor release per month, and a couple of patch -releases per year, depending on popular demand - -The main improvements for this release include - -- The possibility of providing jOOQ with a custom type mapping. - You can now define your own Converter types that are used by - jOOQ to map a database's SQLDataTypes to your custom types. - This is particularly useful for Java's enums. Read more about - custom converters in the manual: - http://www.jooq.org/manual/ADVANCED/CustomTypes/ - -- There are a lot of new runtime configuration options to control - the SQL style of SQL rendered by jOOQ. You can now specify - whether table/column names should be quoted / capitalised / - lower-cased, whether SQL keywords should be capitalised or not, - etc... - -- The handling of NULL has been improved in favour of using jOOQ - as a SQL builder library (e.g. along with Spring for execution) - NULL is no longer inlined, but bound as a variable. - -- jOOQ now supports simulation of the relational division - operation using an intuitive syntax. Read more about the - relational division here: - http://en.wikipedia.org/wiki/Relational_algebra#Division - -Features and improvements -------------------------- -#161 - Add runtime configuration to pretty print rendered SQL -#349 - Add SQLite relations support -#491 - Add runtime configuration for SQL keyword style (upper - case, lower case) -#521 - Add runtime configuration for SQL reference style (upper - case, lower case, as-is, quoted) -#1150 - Add code generation option to disable generation of - records -#1181 - Add support for SQL Server data types timestamp and - rowversion -#1188 - Load default Settings from the classpath at - /jooq-settings.xml, or from -Dorg.jooq.settings -#1193 - Specify main-class in jOOQ Console's manifest.mf and - include dependency in jar file -#1194 - Add ColumnDefinition.isNullable() -#1202 - Add support for the relational division operation: - A.divideBy(B).on(A.ID.equal(B.A_ID)).returning(A.X, ...) -#1207 - Add Factory.batch(Collection) for - convenience -#1208 - Render @javax.persistence.Column(nullable = false) - property, if available -#1209 - Render @javax.persistence.Column(length, precision, - scale) properties, if available -#1215 - Add org.jooq.Converter for custom type mapping -#1216 - Overload Record, Result.getValue() and .setValue() - methods to accept a Converter -#1217 - Add EnumConverter as a base type for custom enum - converters -#1218 - Add code generation options to generate - referencing a Java type and a Converter -#1224 - Add DataTypeDefinition.getLength() to jooq-meta's type - system -#1233 - Support custom JDBC properties for jooq-codegen -#1234 - Add Database.getTable(SchemaDefinition, String, boolean) - to fetch tables case-insensitively -#1239 - Add Factory.fetchLazy(String, Object...) - -API changes (backwards-compatible) ----------------------------------- -#1191 - Deprecate ConfigurationRegistry and replace by equivalent - ExecuteListener feature -#1219 - API Bug: Cannot use LIMIT .. OFFSET along with FOR UPDATE - -Bug fixes ---------- -#625 - Remove dependency from generated Routines to the - generator's SQLDialect -#1128 - NULL is inlined in INSERT statement instead of binding it - as a variable. This can cause issues when using jOOQ with - Spring -#1137 - Exclude MySQL column-level enum types when that column is - overridden by a -#1158 - Derby cannot handle inlined NULL literals in some - contexts -#1180 - Execute BatchMultiple (multi-query batch query), when - executing BatchSimple (single-query, multi-bind-value - query) with StatementType == STATIC_STATEMENT -#1189 - TableMapping regression for SQLite database -#1190 - Cannot store SQLite records when using - StatementType.STATIC_STATEMENT -#1199 - Table.getFields() returns an internal representation of a - table's field list. Make generated tables immutable! -#1200 - Internal API leak exposed through covariance in - AbstractType.getFields() -#1211 - Enforce method name disambiguation also when using custom - strategies in jooq-codegen -#1212 - Enforce identifier disambiguation also when using custom - strategies in jooq-codegen -#1221 - Incorrect ExecuteListener invocation for INSERT .. - RETURNING. executeStart() and executeEnd() are omitted -#1223 - Cache ExecuteListener classes for performance -#1225 - Bind NULL byte[] as java.sql.Types.BINARY instead of - BLOB in Postgres, to avoid errors -#1226 - Bind NULL UDTs with their associated type name in Oracle -#1232 - SQLException when Factory.fetch() does not return a - ResultSet -#1237 - Don't generate enum classes for columns in MySQL tables - that are excluded from code generation - -Version 2.0.5 - February 26, 2012 -================================================================================ - -This release finally introduced basic runtime configuration -features for the jOOQ Factory. This configuration now includes: - -- Execute listener and SQL tracing support. jOOQ allows you to - hook your own listeners into jOOQ's query execution engine to - be notified of all sorts of events -- The existing SchemaMapping features. They are now part of the - runtime configuration -- StatementType settings. Specify whether a Factory should - execute java.sql.PreparedStatements (with bind variables) or - static java.sql.Statements with inlined variables. - -The runtime configuration is documented here: - -http://www.jooq.org/manual/JOOQ/Factory/ - -The listener and tracing support has been requested by -Christopher Deckers, a new jOOQ user who has had the courtesy to -contribute the new jOOQ Console, which is documented here: - -http://www.jooq.org/manual/ADVANCED/ExecuteListener/ - -Apart from that, another long-requested feature is now fully -implemented: The GeneratorStrategy, allowing for custom naming -strategies in generated source code. This will allow for -generating custom table / record class name prefixes / suffixes, -as well as overriding the default behaviour for rendering UPPER, -lower and CamelCase artefacts. See the manual for details: - -http://www.jooq.org/manual/META/Configuration/ - -Features and improvements -------------------------- -#93 - Add Field.equalIgnoreCase(), Field.notEqualIgnoreCase() -#408 - Add class prefixes, suffixes and other options to the - code generator -#492 - Add runtime configuration -#1107 - Let Field.contains() support the Postgres ARRAY @> ARRAY - operator -#1140 - Add ResultQuery.fetchResultSet() to return the underlying - JDBC result set -#1143 - Add Result.isNotEmpty() for convenience -#1145 - Add runtime configuration to specify whether jOOQ should - execute java.sql.PreparedStatement (with bind variables) - or a java.sql.Statement (with inlined parameters) -#1146 - Add Query.getSQL(boolean) to indicate that bind values - should be inlined (as a convenience for - Factory.renderInlined(QueryPart)) -#1148 - Add Cursor.resultSet() to expose the underlying ResultSet -#1149 - Allow for optional - "http://www.jooq.org/xsd/jooq-codegen-2.0.4.xsd" - namespace in jooq-codegen configuration -#1152 - Add & org.jooq.EnumType> - E MySQLFactory.enumType(Class, int) for enum reverse - lookups of MySQL-specific enums -#1159 - Support matching numbers with LIKE, e.g. ID LIKE '%33%' -#1160 - Implement Field.contains(), .startsWith(), .endsWith() - for numeric values, too -#1161 - Use reflection to remove compile-time dependency on - ojdbc for creating ARRAYs -#1162 - Integrate jOOR into jOOQ for simpler reflection -#1164 - Distinguish between Definition.getInputName(), - .getOutputName() -#1165 - Add constraint name to generated javadoc -#1167 - Trivial issue with org.jooq.Factory.exists Javadoc - - GitHub issue #10 -#1169 - Add Configuration.setData(), getData() to convey custom - data in a configuration's lifecycle -#1172 - Add runtime configuration to deactivate JooqLogger -#1177 - Add jOOQ-Console module to jOOQ -#1184 - Add DataType.isArray() - -API changes (backwards-compatible) ----------------------------------- -#1142 - Rename Result.exportXML() to Result.intoXML() to stay - more consistent -#1151 - Deprecate SchemaMapping in favour of new runtime - configuration - -Bug fixes ---------- -#978 - Schema.getTables() and similar methods return empty lists - when Schema is mapped with SchemaMapping -#1153 - Bad inlining of booleans in Sybase ASE / DB2 / Oracle - SQL Server / SQLite -#1154 - Bad inlining of byte[] in most dialects -#1155 - byte[] are erroneously converted to String when using - Record.intoArray() -#1156 - Bad inlining of DATE / TIME / TIMESTAMP data types in - Ingres (and other dialects, when the setting differs from - the default) -#1166 - Some generated Javadoc uses naming strategy or plain - output name, instead of qualified output name -#1168 - Oracle packages are generated as static, instead of - static final -#1175 - Factory.use() seems to render SQL with the Schema name - still present -#1179 - Oracle-generated ArrayRecords need a reference to - org.jooq.Schema to read TABLE of OBJECT from stored - procedures - -Test cases ----------- -#1147 - Add integration tests for executing SQL generated using - Factory.renderInlined() - -Version 2.0.4 - February 12, 2012 -================================================================================ - -This release introduced many improvements to source code -generation. These improvements include: - -- Maven and standalone code generation now use the same XML - configuration, which is read by jOOQ-codegen using JAXB. This - allows for more complex configuration elements in the future -- jOOQ-codegen can now handle multi-schema databases and generate - code for tables referencing tables from other schemata. This - is integration tested against the SQL Server AdventureWorks - database -- jOOQ now allows to generate simple POJOs in addition to Records - and to annotate both POJOs and Records with JPA annotations - such as @Entity, @Table, @Id, @Column, @UniqueConstraint, etc. - -You can migrate your existing .properties configuration by running -> org.jooq.util.GenerationTool /your.properties migrate - -Besides that, there is a lot of ongoing work to improve the -integration of Oracle's TABLE and VARRAY types. - -Features and improvements -------------------------- -#8 - Add JPA annotations to generated POJOs / Records -#282 - Add support for multi-schema databases -#287 - Add support for Oracle TABLE types -#395 - Use XML configuration file instead of properties file -#1089 - Add Field.contains(), .startsWith(), .endsWith() as a - convenience for Field.like() (including escaping) -#1092 - Move master data table configuration from - generator.generate to generator.database namespace -#1093 - Add support for generator.strategy in Maven source code - generation -#1094 - Add support for generator.database.date-as-timestamp in - Maven source code generation -#1095 - Move generator.generate.unsigned-types to - generator.database namespace -#1096 - Add support for generator.generate.unsigned-types in - Maven source code generation -#1103 - Add support for SQL Server data type uniqueidentifier -#1106 - Add Factory.escape(Field, char) for use with LIKE -#1108 - Add support for multi-schema databases using Maven code - generation -#1115 - Add support for Oracle VARRAY/TABLE of OBJECT types -#1127 - Add support for POJO classes generation -#1129 - Allow for using Param in LIMIT .. OFFSET clauses -#1132 - Add RenderContext.castMode() to allow for avoiding casts - where this is not really needed -#1136 - Add generation option to enable/disable generating - navigation methods - -Bug fixes ---------- -#1099 - Derby generated artefacts are not sorted alphabetically -#1101 - Internal API leak exposed through covariance in - AbstractTable.joinXXX() methods -#1110 - VARRAY element type information is lost when unnesting - VARRAY's in Oracle -#1111 - VARRAY element type information is lost when unnesting - VARRAY's returned from functions in Oracle -#1114 - Syntax error when unnesting TABLE of OBJECT in Oracle. - The unnested table contains several columns but jOOQ only - unnests "COLUMN_VALUE" -#1117 - NullPointerException when passing an ArrayRecord - containing a null array to a stored function in Oracle -#1125 - Postgres needs casting for date time data types in - queries like SELECT ? FROM DUAL -#1131 - DB2: [Noauthorized routine named "LIKE" of type - "FUNCTION" having compatible arguments was found] when - using Field.like(concat(x, y)) -#1133 - Compilation errors in generated source code if the same - constraint name exists in several schemata -#1134 - NullPointerException in code generation when a foreign - key constraint references a table from another schema - that is not being generated -#1135 - Generated Javadoc references inputSchema instead of - outputSchema - -Test cases ----------- -#1009 - Add more integration tests for proper handling of - java.sql.Date, Time, Timestamp -#1090 - Run jOOQ tests against AdventureWorks SQL Server sample - database -#1105 - Add integration tests for multi-schema source code - generation and querying -#1122 - The 10k lines of integration test code are too heavy for - the compiler. Create test modules with fewer lines of - code, each. - -Version 2.0.3 - January 29, 2012 -================================================================================ - -This release focuses on increased compatibility between various -SQL dialect integrations as far as ARRAY and JOIN support is -concerned: - -- ARRAY types are only available in H2, HSQLDB, Oracle, Postgres. - Nevertheless, they can be somewhat simulated in other dialects - using nested selects with UNION ALL. Increased compatibility - leads to a nicer API, where ARRAYs are used along with ALL/ANY - quantifiers, for instance. - -- JOIN syntaxes can be quite powerful in SQL. Apart from - simulating NATURAL JOIN, JOIN USING clauses, as well as a - synthetic "KEY JOIN" syntax, jOOQ now also supports nesting - JOIN expressions to create more complex table sources. See a - recent blog post on the subject here: - -http://blog.jooq.org/2012/01/15/lets-revise-the-sql-from-clause/ - -Features and improvements -------------------------- -#578 - Add KEY JOIN syntax to simulate joining using generated - foreign keys -#577 - Simulate NATURAL JOIN syntax, where this is unavailable -#582 - Simulate JOIN USING syntax, where this is unavailable -#671 - Allow for nesting JOIN clauses -#676 - Add Table.join() methods to create more flexible table - sources -#993 - Add Field.equalAny(T[]), .equalAny(Field) methods -#1048 - Simulate (array) syntax for dialects - that do not support arrays -#1051 - Add Factory.execute(String, Object...) as a convenience - method for Factory.query(...).execute() -#1055 - Simulate Factory.table(Object[]) and table(List) using - UNION ALL in dialects that do not support arrays -#1060 - Improve debug logging of H2 arrays. The syntax is not - ARRAY[1, 2], but (1, 2) -#1065 - Add OracleFactory.sysContext(String, String) to support - Oracle's SYS_CONTEXT function -#1069 - Add support for INSERT INTO table(field1, field2, ...) - SELECT syntax - as opposed to the existing INSERT INTO - table SELECT -#1072 - Add support for LIKE .. ESCAPE .. syntax -#1074 - Add Field.notBetween(T, T) for convenience -#1080 - Add support for JDBC's Statement.setFetchSize() in - ResultQuery.fetchLazy() -#1082 - Add some more DEBUG logging in AbstractResultQuery - -API changes (backwards-compatible) ----------------------------------- -#1059 - Change SelectFromStep.from(Collection>) to - from(Collection>) - -API changes (backwards-incompatible) ------------------------------------- -#1087 - Change the NTILE function to return Field - instead of Field - -Bug fixes ---------- -#1071 - Make Sequence Serializable -#1081 - Derby error in NULL handling when simulating unnested - arrays that contain NULL values -#1084 - Bind index mismatch in val(null).equal(null) and in - val(null).notEqual(null) -#1091 - Add missing @Support annotations on Table.crossJoin() - methods - -Test cases ----------- -#1026 - Add integration tests for NTILE window function and - document compatibility -#1073 - Add integration tests for NOT IN queries holding NULL - arguments - -Version 2.0.2 - January 8, 2012 -================================================================================ - -This is a maintenance release for jOOQ 2.0. The main improvements -include - -- The whole jOOQ API is now annotated with a new org.jooq.Support - annotation to help you assess whether a certain SQL clause is - available in your database or not. This is particularly useful - when your application should support several databases at once - (e.g. MySQL, Postgres, Oracle) -- The Oracle PIVOT clause is now formally supported for advanced - statistical queries in Oracle. This clause will be simulated in - other dialects in the future. -- The DATE data type can be mapped to TIMESTAMP. This important - when you query a legacy Oracle database, where DATE columns - can also contain time information -- Several convenience methods have been added for more fluent - syntax, when using plain SQL result queries, subqueries as - tables, or when unnesting arrays in ANY() and ALL() quantifiers - -Further type mapping support is still experimental. An official -cooperation with MinuteProject for source code generation is -being analysed. With MinuteProject, many source code generation -issues could be addressed centrally, as MinuteProject specialises -in source code generation: - -http://minuteproject.wikispaces.com/ - -Features and improvements -------------------------- -#595 - Add support for Oracle's PIVOT clause -#869 - Add support for using ANY, ALL with arrays, not just with - subselects -#1007 - Formally document the API methods to indicate whether - something is supported by any given SQL dialect -#1011 - Add code generation configuration parameter to avoid - generating @Generated annotation -#1019 - Render LIMIT x OFFSET y also for MySQL, instead of - LIMIT y, x -#1022 - Add missing Sybase ASE implementation for Factory.use() -#1024 - Add Factory.resultQuery(String, Object...) to allow for - arbitrary execution modes of plain SQL queries (lazy, - later, into, array, etc) -#1025 - Add missing SQLite implementation for Factory.deg() and - Factory.rad() -#1033 - Generate table comments into generated Tables.java as - Javadoc -#1040 - Add Object[][] Result.intoArray() and - Object[] Record.intoArray() for convenience. Let - E Record.into(Class) also support array types. -#1041 - Add Table Factory.table(Select) convenience - method for more fluency -#1042 - Add support for DISTINCT keyword in SUM, AVG, MIN, MAX - aggregate functions -#1046 - Generate Ingres table and column comments in generated - source code (only Ingres 10) - -API changes (backwards-compatible) ----------------------------------- -#1050 - Deprecate usage of SOME quantifier in predicates, such as - equalSome() - -API changes (backwards-incompatible) ------------------------------------- -#1036 - Fixed API typo in - WindowsRowsStep.rowsBetweenUnboundedFollwing() -#1037 - The fluent API allows for JOIN clauses without FROM - clause - -Bug fixes ---------- -#1010 - The MERGE INTO .. WHEN NOT MATCHED THEN INSERT .. syntax - may cause type-safety issues in some databases. VALUES - should be converted before binding -#1014 - FindBugs: Latent risk of infinite recursion due to typo - in QueryPartList.retainAll(); -#1015 - FindBugs: 7 occurrences of "Bad attempt to compute - absolute value of signed 32-bit hashcode". In extreme - cases, this could lead to SQL syntax errors -#1016 - The Oracle CONNECT BY cond1 AND cond2 syntax erroneously - creates a WHERE cond2 CONNECT BY cond1 statement -#1028 - Syntax errors when using untyped param() in HSQLDB (and - other strongly typed dialects) -#1029 - Postgres can't bind NULL values in cases, where bind type - is Object.class and bind value was created with - Factory.param() -#1030 - UnsupportedOperationException when calling - Query.bind(int, Object) on a query containing plain SQL - fields -#1031 - Incorrect debug logging when plain SQL QueryParts like - field("?") bind null values -#1032 - Incorrect debug logging when plain SQL QueryParts contain - String literals, such as 'Hello? Anyobody out there?' -#1047 - Field.notEqualAny() erroneously renders <> ALL() - -Test cases ----------- -#1021 - Add explicit integration tests for - LEFT|RIGHT|FULL OUTER JOIN - -Version 2.0.1 - December 23, 2011 -================================================================================ - -This is a maintenance release for jOOQ 2.0. The main improvements -include - -- Better integration for using jOOQ with Spring Data. This - includes support for named parameters, as well as allowing to - change bind values on previously constructed Query objects -- The MERGE statement has been enhanced for better integration - with Oracle. -- jOOQ is now ready to use with Scala / Groovy - -For more information about using jOOQ with Scala, see this blog -post: -http://blog.jooq.org/2011/12/11/the-ultimate-sql-dsl-jooq-in-scala/ - -There is now also experimental support for a custom type mapping. -This mapping allows to rewrite data types at code generation time -as well as to specify custom enum data types (e.g. boolean Y/N). -Not all integration tests run smoothly for custom data types, -hence, this feature is not yet fully supported. - -Features and improvements -------------------------- -#691 - Add support for Oracle CURSOR REF IN / INOUT parameters -#677 - Add type-mapping configuration, enforcing types for - columns -#947 - Add custom type mapping support (experimental) -#968 - Allow for custom enum types, configured in the code - generator (experimental) -#974 - Add Schema.getTable(String), getSequence(String), - getUDT(String) for better runtime Schema meta-navigation -#975 - Add Sequence.getName(), getSchema(), getDataType() -#980 - Add support for named parameters, to better interact with - Spring -#991 - Add Query.bind(String, Object) and bind(int, Object) to - easily modify existing bind values -#992 - Document thrown DataTypeException in Convert methods -#998 - Enhance MERGE statement for Oracle extensions: - WHEN MATCHED THEN UPDATE .. WHERE .. DELETE WHERE .. - WHEN NOT MATCHED THEN INSERT .. WHERE .. -#1000 - Add support for MySQL's INSERT INTO .. SET .. syntax in - MERGE statement's WHEN NOT MATCHED THEN INSERT clause - -API changes (backwards-compatible) ----------------------------------- -#981 - Cannot insertInto(table("my_table")), as plain SQL tables - return Table, not Table. Relax - bound on R -#988 - Change Factory.field(String) to return Field - instead of Field -#999 - Make MERGE's WHEN MATCHED .. and WHEN NOT MATCHED .. - clauses optional -#1001 - Identity.getField() should return TableField - instead of Field -#1006 - Add Factory.value(...) as a synonym for Factory.val(...) - for increased Scala / Groovy compatibility - -Bug fixes ---------- -#973 - EnumType renders name() instead of getLiteral() in - formatXXX() methods -#977 - EnumType renders name() instead of getLiteral() in - Convert.convert() method -#979 - Record.from() sets all changed flags to true. That's not - necessarily correct in the event of storing the record - back to the DB -#985 - AbstractRecord.equals() does not correctly compare - arrays. Compare them using Arrays.asList() -#986 - Postgres / DB2 / Sybase ASE foreign-key namespace is - unique-per-table. jOOQ forces all foreign keys from all - tables into the same namespace -#990 - Problems when encoding arbitrary byte[] as String(byte[]) - in inlined SQL. This can cause issues when DEBUG-level - logging is activated -#995 - Routines don't respect SchemaMapping - Github issue #8 -#1002 - TableRecord.storeUsing() doesn't update IDENTITY column - values, if the column is not part of the main unique key -#1003 - Sybase / SQL Server / MySQL / Ingres / H2 / Derby's - INSERT .. RETURNING simulation returns null if a table - has an IDENTITY column, but no primary/unique key -#1005 - The INSERT INTO .. VALUES .. syntax may cause type-safety - issues in some databases. VALUES should be converted - before binding - -Test cases ----------- -#984 - Detach IDENTITY column tests from UNIQUE KEY tests, - create a dedicated test suite instead - -Version 2.0.0 - November 25, 2011 -================================================================================ -This release is a fresh start in many areas of jOOQ, adressing -issues that have been requested by users for a long time. These -release notes docment the most important changes, a detailed -upgrade guide, as well as the detailed list of improvements. - -Most important changes ----------------------- -- The API became more static. This applies to many Factory - methods, such as val(), literal(), as well as to many Field - methods that have been moved over to the Factory. For example, - when before, you wrote this using "postfix function notation": - -
NAME.replace(" ", "_").trim()
- - you will now write (just as in SQL): - -
trim(replace(NAME, " ", "_"))
- - Using static imports of Factory.*, jOOQ makes SQL look even - more like SQL. The current "postfix notation" is maintained for - backwards compatibility. -- By default, jooq-codegen will now generate a "dynamic" meta - model as opposed to the existing static one. Generated tables - covariantly override the as(String) aliasing method, leading - to a much more convenient aliasing style. When before, you - wrote: - -
-Table parent = T.as("parent");
-Table child  = T.as("child");
-Condition join =
-  parent.getField("ID").equal(child.getField("PARENT_ID"))
-
- - You can now write: - -
-T parent = T.as("parent");
-T child  = T.as("child");
-Condition join = parent.ID.equal(child.PARENT_ID)
-
- - Of course, the existing notation still works - -- Exceptions are no longer checked. When previously, the DB's - SQLException was propagated to client code, there is now an - unchecked DataAccessException hierarchy, similar to that of - Spring. This will eventually give way to a standardised error - handling abstraction, in future developments. -- Window functions are now constructed from their underlying - aggregate functions just like in SQL. For example: - -
-sum(AMOUNT)
-sum(AMOUNT).over().partitionBy(ACCOUNT)
-
- - This makes for a more concise API, especially when considering - future extensions, such as Oracle's KEEP (DENSE_RANK FIRST...) - syntax. -- More type safety has been introduced regarding various places - where generic and types are involved. - This is especially true for INSERT / UPDATE / DELETE statements -- Sequences now also have a type -- Unsigned number types are now supported in those databases that - use them. Unsigned numbers are implemented in jOOU, a spin-off - open source project. For convenience, this library is - "internalised" into jOOQ, to avoid adding a dependency - -http://code.google.com/p/joou/ - -Upgrade instructions: ---------------------- -Various of the above changes are incompatible with jOOQ 1.x. In -order to upgrade, please be aware of the following pitfalls: - -- The schema needs to be re-generated. -- Much of the post-fix function notation is replaced by static - methods in the Factory. Today's org.jooq.Field API is - maintained in jOOQ 2.0, for backwards compatibility. It will - be removed, eventually, though. Expect some incompatible - changes, where window functions are involved -- Some Factory instance methods (such as val(), literal()) are - now static. They are compatible, but may cause compiler - warnings. -- The meta model is now an instance model by default. If you - prefer the static meta model, you can configure this in your - jooq-codegen configuration. -- The additional typesafety involving and types may cause - compiler warnings and errors. -- SQLException is no longer part of the API. This can cause - compiler issues, in particular when extending jOOQ -- Some utility classes have moved to org.jooq.tools - -Should these incompatibilities be too significant for your -project, you can still stay on the 1.x branch, which will be -maintained for a while. Be aware that upgrading might be more -difficult, later, though. - -Features and improvements -------------------------- -#55 - Implement improved exception handling -#117 - Improve DSL support for field and table aliasing (decrease - verbosity) -#519 - Add support for MySQL UNSIGNED numeric types -#626 - Create static function access -#661 - Add support for bitwise operators -#718 - Sequences should be mapped to appropriate type (e.g. - SMALLINT, INT, BIGINT, etc) -#734 - Add support for Oracle / SQL Server CUBE() and ROLLUP() - grouping functions -#751 - Add support for Oracle / SQL Server GROUPING SETS() - function -#799 - Add support for Oracle PL/SQL's object-oriented MEMBER - PROCEDURES and MEMBER FUNCTIONS -#804 - Add to Insert, Update, Delete -#835 - Review API typesafety for InsertSetMoreStep - set(Field, T) and similar methods -#890 - Add Factory.selectCount() convenience method -#891 - Let min() max(), etc functions return a new type - AggregateFunction. This type can then be used as an entry- - point for window functions -#892 - Add support for Oracle / SQL Server GROUPING() and - GROUPING_ID() functions to be used along with CUBE() and - ROLLUP() -#893 - Simulate ROLLUP() function for MySQL, using the WITH - ROLLUP grouping modifier -#894 - Move functions from Field to org.jooq.impl.Factory - and make them static -#895 - Add power(..., Field) -#897 - Add (experimental) Spring integration project -#898 - Replace usage of checked SQLException by an unchecked - DataAccessException, similar to that of Spring -#899 - Build jOOQ .jar files as bundles to be deployed into OSGI - environments -#900 - Purge deprecated API - Prior to 2.0 -#901 - Introduce InvalidResultException as a subtype of - DataAccessException for integrity checks in methods like - ResultQuery#fetchOne(), ResultQuery#fetchMap(), etc. -#902 - Make AggregateFunction the base type for constructing - window functions -#904 - Move SQLDialectNotSupportedException into - org.jooq.exception package -#905 - Introduce MappingException as a subtype of - DataAccessException for integrity checks in methods like - ResultQuery#fetchInto(), etc. -#907 - Add missing Field.like(Field), notLike(Field) - methods to overload the existing Field.like(T), notLike(T) -#908 - Change rpad / lpad functions to accept String instead of - char -#912 - Add R newRecord(Table, Object) as - the inverse of various into(Class) methods -#916 - Add > {Record.into(Table) | - Result.into(Table) | ResultQuery.fetchInto(Table) | - Cursor.fetchInto(Table)} -#917 - Add various Cursor.fetchOneInto() convenience methods -#918 - Add CustomTable, CustomRecord as base classes for more - convenience when used with various into(Table) methods -#919 - Allow for accessing non-public constructors of Record - subtypes -#923 - Move some utilities to org.jooq.tools -#924 - Generate a reference to every table in a new Tables.java - class for improved static access -#928 - Add DataTypeException extending DataAccessException in - case something went wrong when converting data types -#930 - Support converting date time types to java.util.Calendar. - This applies to various into(Class) methods, as well as - Result.getValue(xx, Class) -#931 - Allow for conversion between Long and date/time types, and - vice versa -#932 - Let the bound of R in TableRecord extend TableRecord, - in UpdatableRecord to extend UpdatableRecord -#933 - Add support for type Character in Record.into(Class) - methods and similar -#936 - Accept primitive types, such as int.class for type - conversion -#938 - CODEGEN: Add static/instance table field configuration -#939 - Include license.txt and readme.txt in .jar files' META-INF - directory -#953 - Make DefaultGeneratorStrategy methods non-final to allow - for overriding -#954 - Add examples for source code generation of multiple - schemata with Maven -#955 - Generate a reference to every type in a new UDTs.java - class -#957 - Add R Factory.newRecord(UDT) for constructing - attached UDTRecords -#958 - CODEGEN: Add generation-time schema mapping, allowing for - re-writing schemata in jooq-codegen -#960 - CODEGEN: Add code generation configuration parameter to - avoid using the new UByte, UShort, UInteger, ULong wrappers - for UNSIGNED number types -#961 - Use Oracle's SYS.ALL_SEQUENCES.MAX_VALUE to determine the - type of a sequence. -#969 - Add List ResultQuery.fetch(Field, - Class) convenience method - -Bug fixes ---------- -#686 - Reduce the internal API leak by preventing access to - TableFieldImpl, UDTFieldImpl, ParameterImpl -#903 - lag(Field, int, T) erroneously delegates to lead() -#906 - Add more NullPointerException safety to API -#913 - NoClassDefFoundError in JooqUtil.isJPAAvailable() -#920 - Generic type is lost in Cursor.fetchInto(RecordHandler) -#925 - SelectConditionStep should extend SelectConnectByStep, not - SelectGroupByStep -#926 - AbstractRecord.into() fails to convert java.sql.Date into - java.util.Date -#934 - Don't consider static members in reflection utilities when - used with Record.into(Class) and similar methods -#935 - Don't consider final member fields in reflection utilities - when used with Record.into(Class) and similar methods -#937 - In the event of name clash (same name for table and field) - generated code has errors -#945 - Calling UpdatableRecord.setValue() twice with the same - argument causes the changed flag to be reset to false -#948 - Always set the changed flag to true in Record.setValue() -#959 - Compilation errors in generated source code if MySQL enum - values match Java reserved words, such as 'true', 'false', - 'new', etc... -#962 - Postgres ordering of generated enum literals is unstable -#967 - Better document type conversion - -Version 1.7.0 - November 25, 2011 -================================================================================ -This is a maintenance release for the 1.x branch. Some important -bug fixes are merged from version 2.0. These include: - -Bug fixes ---------- -#925 - SelectConditionStep should extend SelectConnectByStep, not - SelectGroupByStep -#926 - AbstractRecord.into() fails to convert java.sql.Date into - java.util.Date -#937 - In the event of name clash (same name for table and field) - generated code has errors -#945 - Calling UpdatableRecord.setValue() twice with the same - argument causes the changed flag to be reset to false -#948 - Always set the changed flag to true in Record.setValue() -#951 - Empty Password for jooq-codegen-maven causes NPE - -Version 1.6.9 - November 7, 2011 -================================================================================ -This is a maintenance release for the 1.x branch. Developments -on this branch will stop after version 1.6.9. Only important bug -fixes are merged to this branch. Developments for release 2.0 -have started. - -The most important functionality in release 1.6.9 is the newly -added support for JDBC batch operations. You can now batch -execute several queries. - -See the official blog for more information: -http://blog.jooq.org/2011/10/25/jdbc-batch-operations-with-jooq/ - -Features and improvements -------------------------- -#621 - Add support for JDBC batch operations -#794 - Add support for ORDER BY [int value] in order to reference - a column index for sorting -#882 - Optimise Field.isTrue() and isFalse(). Take Field's data - type into consideration. -#885 - Add support for INSERT INTO .. VALUES (..) syntax, - omitting explicit field declarations -#887 - Add List Cursor.fetchInto(Class) - -Bug fixes ---------- -#748 - H2 regression in 1.3.158 regarding stored functions, which - return a ResultSet (this was fixed in H2) -#859 - Derby casting of numeric types to BOOLEAN doesn't work -#886 - Regression in date extract function when used in a - subselect -#888 - Derby casting of VARCHAR to FLOAT (and similar) doesn't - work - -Version 1.6.8 - October 22, 2011 -================================================================================ -The main improvement of this release is the re-design of the -stored procedure / function API. With 12 supported RDBMS, which -all have their own idea about what is a stored procedure and what -is a stored function, it has proven to be a better design, to -unite them in one single type: org.jooq.Routine. A routine can -have a return value as well as OUT parameters. It can be embedded -in SQL and used as a field or a table. - -This means, you will need to re-generate your database schema, -when upgrading to jOOQ 1.6.8. After re-generation, you'll need to -fix your client code. These are the package changes: - -- [generated.package].procedures > [generated.package].routines -- [generated.package].functions > [generated.package].routines -- [generated.package].Procedures > [generated.package].Routines -- [generated.package].Functions > [generated.package].Routines - -Oracle generated packages are not re-located. With these -improvements, using stored procedures and functions becomes even -more reliable, especially when cursor types are involved. Read -more about the rationale behind this change: - -http://blog.jooq.org/2011/10/17/what-are-procedures-and-functions-after-all/ - -Apart from that, important improvements have been made in the -area of plain SQL tables. Also, consider a demo integration of -jOOQ with Google Cloud SQL: - -http://blog.jooq.org/2011/10/22/jooq-and-google-cloud-sql-example/ - -Features and improvements -------------------------- -#271 - Don't pre-fetch table meta data when selecting from plain - SQL tables -#489 - Add support for SELECT * (i.e. render SELECT * where - applicable) -#596 - Add support for VARIANCE() and STDDEV() OVER() window - functions -#608 - Add jOOQ version number in generated source code -#670 - Add more Javadoc to Field.xxx() functions -#692 - Add support for ResultSet type returned from HSQLDB - stored functions -#850 - Use http://www.jooq.org as URL for the @Generated - annotation -#854 - Add convenience methods Fields.isTrue(), isFalse() for - conversion of "Y", "YES", "1", "true", "on", etc into a - boolean condition -#870 - Add support for MEDIAN aggregate function -#872 - Add support for STDDEV_POP(), STDDEV_SAMP(), VAR_POP(), - VAR_SAMP() aggregate functions -#874 - Reduce the number of internal classes for dialect-specific - function aliases -#878 - Implement DataType.equals() and hashCode() - -API changes (backwards-compatible) ----------------------------------- -#851 - Change Field.{sortAsc|sortDesc}(List sortList) into - Field.{sortAsc|sortDesc}(Collection sortList) - -API changes (backwards-incompatible) ------------------------------------- -#848 - Purge deprecated API - Prior to 1.6.1 -#849 - Replace Cursor.fetchResult() by Cursor.fetch() -#852 - Review stored procedures / functions concept. Merge them - all into a single "Routine" type - -Bug fixes ---------- -#756 - Error when aliasing HSQLDB and Postgres unnested tables -#761 - Exception when TRACE logging execution with plain SQL - tables involved -#773 - Execute standalone stored functions as CallableStatement - to prevent issues with transactions -#847 - Query.getSQL() doesn't render dialect-specific SQL when - Query is constructed using the fluent API -#853 - DB2 generated convenience methods for stored functions - have unstable ordering -#857 - Derby casting of numeric types to String / VARCHAR does - not work -#858 - SQLDataType.getSQLDataType() should return itself, instead - of null -#860 - SQLite CEIL function is incorrectly simulated. CEIL(2.0) - returns 3.0 instead of 2.0 -#861 - Field.replace(String) generates bad SQL for various RDBMS. - Field.replace(String, String) works, though -#863 - Ingres integration generates illegal SQL when selecting - things like SELECT 1 WHERE 1 = 1 -#866 - Sybase ASE Field.replace(String) function incorrectly - removes the argument string -#873 - Error when selecting two times the same aggregate field -#877 - Compilation error in generated source code when a table - without a primary key has an identity column -#879 - Add Google Cloud SQL Example -#880 - Query.getSQL() does not consider SchemaMapping - -Test cases ----------- -#811 - Loader integration tests fail for SQLite -#812 - CSV Loader test leaves Postgres JDBC connection in an - inconsistent transactional state on error -#856 - Add integration tests for Field.abs() -#865 - Add integration tests for Field.ascii() -#867 - Add integration tests for Field.sum(), avg(), max(), min() -#881 - Re-design H2 stored functions to be pre-compiled, in order - to speed up integration tests - -Version 1.6.7 - September 25, 2011 -================================================================================ - -This release coincides with the launch of the new website at -http://www.jooq.org. Hence, it ships with little additions to the -deliverable itself. - -Apart from new convenience methods, the main addition is a Maven -plugin for jooq-codegen contributed by Sander Plas. - -Features and improvements -------------------------- -#797 - Create Maven plugin for source code generation -#825 - Add List> Factory.fetchMany(String) to - allow for fetching several result sets from stored - procedures, such as Sybase ASE's "sp_help" -#838 - Implement MetaDataFieldProvider.toString() -#841 - Add List Result.getValues(Field, Class) -#842 - Add Query.getBindValues() method to allow for extracting - bind values in the correct order -#843 - Add Factory.fetch(ResultSet) to transform a JDBC ResultSet - into a jOOQ Result - -API changes (backwards-compatible) ----------------------------------- -#837 - Avoid final keyword on Object methods, such as .equals(), - .hashCode(), etc - -Bug fixes ---------- -#836 - Bad syntax when selecting from aliased plain SQL tables -#839 - Boolean conversion in getValueAsBoolean() should trim - String values first -#840 - Numeric conversions in getValueAsXXX() should trim String - values first -#844 - NullPointerException when selecting a column from a Result, - that does not exist - -Version 1.6.6 - September 11, 2011 -================================================================================ - -Finally, support for another RDBMS has been added. Sybase's other -important product Sybase Adaptive Server Enterprise (or simply -Sybase ASE) is now officially supported by jOOQ - -Apart from this, there had been important improvements with the -recently added INSERT .. RETURNING clause, as well as some fixes -related to DECIMAL / NUMERIC data types - -Features and improvements -------------------------- -#796 - Complete missing public org.jooq.impl Javadoc -#800 - Add support for Sybase Adaptive Server Enterprise -#808 - Add support for INSERT .. RETURNING for Ingres -#809 - Add support for INSERT .. RETURNING for Sybase SQL - Anywhere using SELECT @@identity -#810 - Add support for INSERT .. RETURNING for SQLite using - last_inserted_rowid() -#813 - Add DSL support for INSERT .. RETURNING -#814 - Change TableRecord to reload its trigger-initialised main - key in Oracle and other RDBMS that don't support IDENTITY - columns -#818 - Add SQLiteFactory.rowid() -#819 - Support SQLite AUTOINCREMENT columns as IDENTITY -#820 - Add Factory.fetchOne(String) for executing plain SQL - queries that return single records -#826 - Allow for returning several records in the INSERT .. - RETURNING clause. This now works for DB2, HSQLDB, MySQL, - and Postgres -#827 - Support Sybase SQL Anywhere's TOP n START AT m clause - instead of simulating it with nested SELECT's - -API changes (previous API now deprecated) ------------------------------------------ -#817 - Deprecate Factory.lastID(Identity) - -Bug fixes ---------- -#815 - SQL Server fetching of IDENTITY value is broken -#821 - Optimise ResultQuery.fetchAny() executing fetchLazy() - internally, and only fetching one record from the cursor -#822 - Let Constant cast to more precise NUMERIC/DECIMAL types - in those RDBMS where casting is necessary -#823 - Cannot bind SQLite BigDecimal, BigInteger types - bind - them as String instead -#824 - BigInteger values cannot be bound in DB2, Derby -#828 - Document inefficient implementation for GREATEST and LEAST - in some RDBMS - -Version 1.6.5 - August 28, 2011 -================================================================================ - -This release finally adds a loader for CSV data to jOOQ. You can -now load CSV data using a simple fluent API, configuring error -handling, duplicate behaviour and transaction handling, as well -as various CSV parameters. - -This release also changes the way generated keys are retrieved -after INSERT's. Instead of (potentially inconsistently) running -SELECT MAX(pk) immediately after the INSERT, Postgres' INSERT.. -RETURNING clause is used (or simulated), in a single statement. - -Features and improvements -------------------------- -#784 - Add Result.exportXML() to retrieve a DOM document similar - to that of .formatXML() -#792 - Add support for loading of CSV data into tables -#795 - Add List fetch(int, Class) and - fetch(String, Class) convenience methods -#803 - Add support for INSERT .. RETURNING or simulate it where - not available -#805 - Add T[] fetchArray(int, Class) and - fetchArray(String, Class) convenience methods -#806 - Add T fetchOne(int, Class) and - fetchOne(String, Class) convenience methods - -Bug fixes ---------- -#798 - Oracle IN (...) clause with more than 1000 arguments does - not work -#802 - Use "INSERT .. RETURNING" instead of "SELECT MAX(pk)" - to retrieve the primary key of a new record - -Version 1.6.4 - August 07, 2011 -================================================================================ - -This release ships with a couple of useful concepts inspired by -other frameworks. These are: - -- selecting into custom POJO's. Results can be mapped to POJO's - by convention or using JPA @Column annotations -- selecting into custom callbacks. This is already a wide-spread - practice in Spring JdbcTemplates. -- selecting long-running queries asynchronously. This idea has - been inspired by the Avaje Ebean framework - -Apart from these changes and some bugfixes, the internal API has -been completely re-designed. The idea here is that query -rendering and variable binding are even faster (less String -objects), more extensible and more accurate. This is a pre- -requisite for many future developments with even more complex SQL -statements, such as for instance CTE's (Common Table Expressions) - -Features and improvements -------------------------- -#137 - Add support for asynchronous query execution using - FutureResult ResultQuery.fetchLater() similar to - Avaje Ebean -#198 - Add SELECT INTO functionality into POJO's using - T ResultQuery.fetchInto(Class) similar to JPA - CriteriaQuery -#728 - Add .fetchInto(RecordHandler) to ResultQuery, Result, - and Cursor to allow for callbacks similar to Spring's - JdbcTemplate/Ollin Framework -#774 - Add more TRACE logging to .fetchLazy() -#777 - CURSOR: Add function alias: UNNEST for TABLE -#781 - Add E function (Euler number) -#782 - Add T Record.getValue(..., Class) methods - for convenient type conversion -#785 - Allow for storing TableRecord with a provided Field[] - indicating the primary key -#786 - Document thread-safety facts in Factory Javadoc -#788 - Add Key.getFieldsArray() convenience method -#793 - Add support for Oracle's SYS_CONNECT_BY_PATH function - -API changes (backwards-incompatible) ------------------------------------- -#758 - Change internal QueryPart rendering and binding API to use - Configuration and Context as callback parameters. If you - use CustomField or CustomCondition, please correct your - implementations accordingly. Other parts of the API should - not be affected -#778 - Purge deprecated API, deprecation prior to jOOQ 1.5.7 -#790 - Purge deprecated generated code, deprecation prior to - jOOQ 1.5.7 - -API changes (previous API now deprecated) ------------------------------------------ -#776 - Deprecate QueryPart.getSQL(), add Query.getSQL() -#789 - Deprecate Record constructors with Configuration - parameter - -Test cases ----------- -#636 - Add integration tests for more advanced CONNECT BY - example -#772 - Add integration tests for selecting cartesian products - (several tables in FROM clause) - -Bug fixes ---------- -#730 - Sybase cannot bind null values in plain SQL -#759 - Omit the TOP 100 PERCENT clause in SQL Server ordered - top-level queries -#767 - An empty Java package is generated for PL/SQL packages - containing underscores -#771 - Some exotic literals are not properly escaped with quotes - yet, e.g. UDT identifiers, VARRAY types, etc. -#775 - Automatic re-attaching after deserialisation does not work - when used with .fetchLazy() -#787 - The UpdatableRecord's internal changed flags are not - updated after INSERTs / UPDATEs - -Version 1.6.3 - July 31, 2011 -================================================================================ - -This is mainly a maintenance release with lots of bugfixes, -mostly around code generation, plain SQL tables, and data types. -Please note that generated source code may contain incompatible -changes due to #639 (see below for details)! - -Apart from that, project CURSOR is advancing and it is now -possible to unnest arrays into tables. See this article for -details about where jOOQ is heading with project CURSOR: - -http://blog.jooq.org/2011/07/24/the-power-of-ref-cursor-types/ - -Features and improvements -------------------------- -#679 - Improve H2 NVL2 support as of H2 1.3.156 -#680 - Improve H2 ROUND support as of H2 1.3.156 -#735 - Add README documentation to GitHub -#736 - Add more info regarding number of generated artefacts in - jooq-codegen logging -#750 - Add DataType.isNumeric(), .isString(), .isTemporal(), - .isBinary() -#754 - Log query as executed by JDBC PreparedStatement when - TRACE logging (without inlining variables) -#752 - CURSOR: Add support for selecting from ARRAY types -#762 - Use H2's native support of NVL, instead of COALESCE -#764 - CURSOR: Add support for selecting from ARRAY types - returned from stored functions - -API changes (backwards-incompatible) ------------------------------------- -#639 - Map DECIMAL(n, 0) and NUMBER/NUMERIC(n, 0) data types - to Byte/Short/Integer/Long/BigInteger instead of - BigDecimal in generated source code. Re-generated code - will not be compatible! - -API changes (previous API now deprecated) ------------------------------------------ -#731 - Inconsistent API with Field.lessOrEqualToXXX(). Removed - "To" from method name -#757 - Deprecate Factory.constant() methods - -Test cases ----------- -#731 - Add missing integration tests for equalAll(), equalSome() - and similar methods -#747 - Upgrade H2 to 1.3.158 - -Bug fixes ---------- -#632 - Sybase error : column @p0 not found in nested SELECT -#700 - Restore HSQLDB ARRAY support with INFORMATION_SCHEMA - change in HSQLDB 2.2.3, and some fixes in 2.2.5 -#725 - Cannot insert byte[] data with plain SQL -#733 - H2 changed JDBC type for ResultSet/CURSOR from 0 to -10, - like Oracle -#737 - Compilation errors in generated source code if table - fields contain spaces -#738 - Compilation errors in generated source code if MySQL - procedure parameter type contains two comma-separated - arguments (like DECIMAL(10,2)) -#739 - Postgres navigator methods and keys are not re-generated - in the same order -#740 - Formatting is broken on Result.format() with some special - newline characters -#743 - Make SQL Server INFORMATION_SCHEMA independent from - HSQLDB again, to prevent incompatibility issues -#744 - Ingres REAL and FLOAT4 types are generated as FLOAT/FLOAT8 - which maps to java.lang.Double, instead of java.lang.Float -#753 - Postgres error when binding array that contains null - values -#755 - NullPointerException when converting an array containing - a null value -#766 - Bad decoding of JDBC Types BIGINT (to BigInteger instead - of Long) and REAL (to BigDecimal instead of Float) when - plain SQL tables are involved - -Version 1.6.2 - July 10, 2011 -================================================================================ - -This release mainly introduces three new projects. - -Project CURSOR where jOOQ finally supports various RDBMS's TABLE, -CURSOR, and REF CURSOR data types. This is especially useful when -those types are returned from stored procedures and functions. -Cursors are simply mapped to jOOQ Result types and can -thus be used like regular table results - -Project EXPORT aims at exporting data from the database in -various serialisable formats, such as XML, CSV, HTML, Text, JSON. -This project will be continued in the future, to also -deserialise from (some of) these data streams. This will allow -for easy transport of jOOQ Result types over the net. - -Project CODEGEN has finally been started. Many improvements -suggested by jOOQ users will be implemented in the next releases. -In this release, important fixes have been made to prevent -compilation errors in generated artefacts. - -Features and improvements -------------------------- -#61 - EXPORT: Add Result.formatXML() -#166 - CURSOR: Add support for ResultSet type returned from - Oracle stored procedures / functions -#411 - Allow for fetching Map (instead of Record) - and List> (instead of Result) -#549 - Add Factory.function() for plain SQL functions -#611 - Simulate RPAD and LPAD in SQL Server, Sybase -#627 - Add support for Postgres FOR UPDATE OF [table-name] clause -#628 - Add support for REPEAT (SQL Server: REPLICATE) function -#637 - Nicely format time in StopWatch logging output -#640 - Simulate Postgres FOR UPDATE OF [table-name] clause in - other dialects -#649 - CURSOR: Add Cursor.fetch(int) .fetchOne() - .fetchResult(int) .fetchResult() -#653 - Add support for MySQL encryption and compression functions -#660 - Clarify Javadoc of UpdatableRecord to explain its - behaviour when changing the main unique key -#669 - EXPORT: Add Result.formatHTML() -#672 - Add convenience method UpdatableRecord.copy() in order to - reset primary key values for a subsequent INSERT -#675 - EXPORT: Add Result.formatCSV() -#683 - Implement ResultImpl.equals() and .hashCode() -#684 - Implement AbstractStore.equals() and .hashCode() -#685 - Add Store.size() to indicate the maximum index of the - Store -#687 - EXPORT: Add result.formatJSON() -#689 - Create separate builds: jooq-core.zip and - jooq-with-dependencies.zip -#690 - CURSOR: Add support for ResultSet type returned from H2 - stored functions -#695 - CURSOR: Add support for ResultSet type returned from - Postgres stored functions -#697 - Add Factory.fetch(String) for executing plain SQL queries - that return results -#701 - Add ResultQuery.fetchArray() and .fetchOneArray to return - Object[][] and Object[] -#704 - Always add top and bottom line in Result.format() -#705 - Right-align numeric values in Result.format() -#716 - Add SUBSTRING function Field.substring(Field, Field) - taking fields as arguments -#719 - Document risk of SQL injection in plain SQL and literal - factory methods -#726 - Add LENGTH function as a synonym for CHAR_LENGTH - -API changes (backwards-compatible) ----------------------------------- -#698 - Inconsistent API with Factory.fetch(Table [,Condition]) - Let method return Result instead of List -#699 - Let Result extend List - -API changes (previous API now deprecated) ------------------------------------------ -#656 - Decrease verbosity of plain SQL methods. They will just be - called Factory.field() .condition() .table() .query() - -Test cases ----------- -#643 - Add integration test for code generation of invalid and - incomplete types in Oracle -#654 - Add integration tests for master data tables with PK types - other than NUMBER/INT -#655 - Add missing integration tests for TRIM function - -Bug fixes ---------- -#450 - Improve plain SQL integrity checks for bind variables -#610 - CODEGEN: Compilation error in generated source code for - databases with table named 'system' -#646 - An empty Java package is generated for an empty PL/SQL - package. This is unnecessary -#651 - CODEGEN: Avoid importing datatypes in generated source - code to prevent collisions -#657 - NullPointerException when creating a Factory with a null - SchemaMapping -#658 - Master data table code generation is broken for tables - with more or less than 3 columns -#662 - Add support for the missing Postgres data type "bpchar" -#663 - Add support for the missing Sybase data type "int" -#664 - Ingres INTEGER data types are not correctly generated -#665 - HSQLDB Datatype CLOB and BLOB are not supported, when - selecting from plain SQL tables -#666 - The evil bug: Ingres TRIM function only executes RTRIM -#673 - UpdatableRecord.store() doesn't work if called after - .delete() -#702 - Add support for the missing SQLite data type "NULL" -#706 - CURSOR: Ensure that Query.execute() runs in a single - transaction when Postgres refcursor is involved in the - query (this fixes a Postgres JDBC driver flaw) -#724 - NullPointerException when passing a single literal null - bind value to plain SQL methods without casting to Object -#729 - DB2, Derby, Ingres, Oracle cannot bind null values in - plain SQL - -Version 1.6.1 - June 19, 2011 -================================================================================ - -In this release, the PORTABILITY project has been implemented. -Finally, the SQLDialect has been removed from most generated -artefacts (Schema, Table, Field, Sequence, etc). Also, the -constructing Factory is not referenced by its created QueryParts -anymore, unless this is really necessary (Query objects, UDT's, -ARRAY types). This leads to higher compatibility between schemata -of different databases, e.g. if users want to use an HSQLDB -development and Oracle productive database. - -Unfortunately, this means that the way stored procedures are -called had to be changed. This is an API break that could not be -avoided. The pre-1.6.1 StoredObject.execute(Connection) method -is deprecated and will be removed in the future. It has been -replaced by StoredObject.execute(Configuration) - -In addition to this project, many more window functions are now -supported, as well as the Oracle-specific CONNECT BY clause for -recursive queries. - -Features --------- -#351 - Add support for Oracle ROWID data type -#452 - PORTABILITY: Create a super-set of RDBMS data types -#453 - PORTABILITY: Don't create dialect-specific QueryParts -#455 - Add support for the Oracle CONNECT BY clause -#587 - Add optional OFFSET clause to form LIMIT .. OFFSET - constructs -#589 - Add extended FOR UDPATE [OF ...] [{WAIT n | NOWAIT | SKIP - LOCKED }] support -#591 - Add support for LEAD() OVER() and LAG() OVER() window - functions -#592 - Add support for the CUME_DIST() OVER() window function -#601 - Add Factory.literal() convenience methods -#602 - Add Factory.val() methods to decrease .constant() - verbosity -#604 - Add support for RESPECT NULLS clause in some window - functions -#605 - Add Factory.use(String) for non-generated schemata -#613 - Add PI function -#616 - Add Factory.two() literal convenience method -#630 - Add support for Oracle CONNECT BY pseudo-columns LEVEL, - CONNECT_BY_ISCYCLE, CONNECT_BY_ISLEAF - -API changes ------------ -#299 - PORTABILITY: Create a dialect-independent meta-model -#588 - Add OVER() keyword to FIRST_VALUE() and LAST_VALUE() API - -Test cases ----------- -#368 - Add integration test for use with schema mapping -#586 - Upgrade H2 to 1.3.155 -#607 - Add integration tests for CRUD / SP's / UDT's / ARRAY's - with SchemaMapping -#612 - Add integration tests for LPAD and RPAD functions -#624 - Add integration test for code generation of invalid/ - incomplete views in Oracle -#631 - PORTABILITY: Add integration tests for using Oracle- - generated schema against an HSQLDB database -#638 - Add missing integration test for DECIMAL data type - -Bugfixes --------- -#176 - Stored procedures / functions in EQUIVALENT schemata - cannot be called -#493 - Bind variable mismatch when constructing bad SQL -#594 - Confusing Javadoc in SELECT DSL API -#603 - Fix DB2 'IGNORE NULLS' clause -#619 - SUBSTRING() function is broken in DB2, Ingres, SQL Server -#623 - SQL syntax error for some MERGE queries in SQL Server and - Sybase -#633 - SchemaMapping is not applied to sequences -#634 - Sequences are not escaped in generated SQL - -Version 1.6.0 - June 05, 2011 -================================================================================ - -Apart from supporting various additional standard and non- -standard JOIN constructs, there is now also full support for the -SQL standard MERGE statement and MySQL's ON DUPLICATE KEY variant -thereof. A great number of API enhancements have been added, -which improve the usability of jOOQ. The Ingres database is now -also supported. - -Features --------- -#301 - Add support for Oracle execution hints -#409 - Add support for NATURAL JOIN syntax, where RDBMS allows it -#415 - Make fluent API's underlying SelectQuery objects publicly - available -#429 - Add Ingres support -#475 - Document class-level generic types and in Javadoc -#486 - Add support for SQL MERGE clause -#494 - Allow for omitting schema name in generated SQL -#496 - Automatically update IDENTITY values in UpdatableRecord, - after storing them -#520 - Add support for JOIN ... USING syntax -#524 - Upgrade HSQLDB to 2.2 -#533 - Add ORDER BY [Map] or BY [List] functionality -#534 - Add Result.isEmpty() -#535 - Call upon ConfigurationRegistry.provideFor() before - throwing a DetachedException -#536 - Simulate CASE [value] WHEN [value] THEN [result] END - syntax in Derby -#538 - Add some logging to ConfigurationProvider -#539 - Add possibility to negate numeric values with Field.neg() -#541 - Add support for MySQL ON DUPLICATE KEY clause -#542 - Allow for Collection arguments in INSERT's DSL API -#543 - Allow for creating FUNCTION() OVER() without PARTITION BY - or ORDER BY clause -#546 - Add Factory.use(Schema) -#548 - Add new internal type FieldMap -#550 - Simulate ON DUPLICATE KEY INSERT clause in dialects other - than MySQL -#551 - Add TableMapping, similar to SchemaMapping for mapping - tables -#553 - Add Factory.plainSQLQuery -#554 - Add Factory.plainSQLField with a DataType parameter -#555 - Add UpdateXXX.set(Map) convenience methods to DSL API -#557 - Enhance INSERT DSL API to allow for adding VALUES clause - with InsertXXX.set() syntax -#570 - Add support for the RAND() function -#567 - Add support for Ingres Sequences -#572 - Add support for the ATAN2() function -#573 - Add possibility for additional select() clauses for - convenience -#575 - Add support for the FULL OUTER JOIN syntax, where RDBMS - supports it -#576 - Add support for the CROSS JOIN syntax, where RDBMS - supports it -#581 - Enhance API and allow Collection> - instead of Collection> - -API changes ------------ -#397 - Purge deprecated API - -Bugfixes --------- -#481 - Handle case where an empty record is stored -#522 - Misleading Javadoc in generated stored procedures and - function constructors -#532 - Restore Postgres INFORMATION_SCHEMA -#537 - Prevent null from being added to QueryPartList -#540 - Error when TRACE logging Limit -#544 - Aliased elements are not bound correctly when rendered - with toSQLReference() -#559 - Loosen type safety on overloaded methods to prevent - compilation errors with javac/Netbeans -#560 - HSQLDB DataType REAL is configured incorrectly -#565 - Add integration tests for current_user() function -#569 - ORA-01427 when generating foreign key relations -#571 - Field.trim() not correctly implemented for SQL Server -#583 - Accelerate integration tests: Reset schema only if - necessary - -Version 1.5.9 - May 15, 2011 -================================================================================ - -This version ships with lots of new functionality. Finally, the -DSL-style API has been extended to CRUD operations (INSERT, -UPDATE, DELETE)! Also, support for the TRUNCATE TABLE statement -has been added. - -The most important new features include the support for SQL:2003 -standard window functions, which are available in most major -RDBMS. Additionally, basic function support has been widely -extended. - -Features --------- -#148 - Added support for window functions -#204 - Add support for multi-record INSERT's -#416 - Added support for retrieval of IDENTITY values -#433 - Use bind variables for LIMIT and OFFSET -#441 - Added foreign key relationship meta information to the - generated source code -#446 - Beautify ResultImpl.toString() method -#461 - Automatically cast CONCAT parameters to Field if - necessary -#463 - Added support for trigonometric functions -#471 - Added support for the sign function -#472 - Added support for GREATEST/LEAST functions -#474 - Added support for "hyperbolic" functions SINH, COSH, TANH, - and COTH -#482 - Added DSL API for INSERT statements -#483 - Added DSL API for UPDATE statements -#484 - Added DSL API for DELETE statements -#485 - Added "Registry" for client code to provide Configurations - to jOOQ Attachables -#490 - Added support for the TRUNCATE TABLE statement -#495 - Generate source code for IDENTITY columns -#501 - Added support for boolean conversion to Result, Record, - and Store -#503 - Allow for schema navigation via generated artefacts -#518 - Let stored procedures reference owner package - if applicable -#525 - Added NULLS {FIRST | LAST} clause to ORDER BY constructs -#528 - Added Factory.getDataType() convenience method -#530 - Added Factory.zero() and Factory.one() convenience methods - -API changes (jooq) ------------------- -#527 - Weakened type-safety on Field.nvl2() -#529 - Deprecated Factory.select(Object...), added .selectOne() - and .selectZero() instead - -API changes (jooq-meta) ------------------------ -#30 - Add ParameterDefinition for stored procedures, instead of - reusing ColumnDefinition -#499 - Add reference to TableDefinition in ColumnDefinition -#500 - Add AttributeDefinition for UDTDefinition, instead of - reusing ColumnDefinition - -Bug fixes ---------- -#369 - Adapt H2 relations generation to H2's correction of - information_schema.cross_references -#435 - Added integration tests for NESTED SELECTs holding LIMIT - clauses -#460 - Syntax error when using a field with a reserved name -#462 - Fixed Javadoc broken links -#473 - Don't cast when cast is unnecessary -#479 - INSERT statement should not set all fields for a table -#497 - Derby referential code generation is broken, for named - foreign keys -#498 - Oracle package content is generated in arbitrary order -#502 - Syntax error when creating an empty IN condition -#526 - Corrected Javadoc in Field.coalesce() - -Version 1.5.8 - April 29, 2011 -================================================================================ - -Finally, jOOQ now supports two important new RDBMS: -SQL Server and Sybase! - -Apart from this great enhancement, there is now also full support -for the non-SQL standard LIMIT clause, even in dialects where the -LIMIT clause is not supported natively (especially Oracle, but -also DB2, SQL Server and Sybase, which have limitations). jOOQ -simulates LIMITs by rendering nested selects filtering on ROWNUM -(Oracle) or on ROW_NUMBER() (DB2, SQL Server and Sybase). - -Other interesting additions are an increasing support for native -mathematical functions. More function support will be added in -future versions. - -Features --------- -#16 - Added support for SQL Server -#21 - Uniform implementation of the LIMIT clause. Implemented - LIMIT clause simulation through analytic functions, where - LIMIT is not supported natively -#97 - Added support for Sybase -#418 - Measure time of various steps in source code generation -#420 - Added support for proprietary SQL extensions "FOR UPDATE" - and "FOR SHARE" -#431 - Added additional statistics to generation log files -#432 - Unified the various "standard" ANSI INFORMATION_SCHEMA - implementations in the jooq-meta artefact -#436 - Added support for the modulo function -#438 - Added floor and ceil functions -#439 - Added support for mathematical functions (logarithms, - exponentials, sqrt) -#447 - Enhanced Field.add() and Field.subtract() to work for date - time fields, also - - -API changes ------------ -#428 - Created new Maven artefact jooq-meta to cleanly separate - database meta-data navigation from code generation -#458 - Decreased DSL verbosity for arithmetic operations and for - ordering - -Bug fixes ---------- -#417 - Restored warning when unknown column type is encountered - in source code generation -#419 - Corrected misleading Select.fetchOne(...) Javadoc -#421 - Optimised AbstractRecord's memory consumption -#448 - Corrected some Javadoc @see links -#449 - Changed Field.concatenate() to accept Field parameters - to avoid generic varargs warnings - -Version 1.5.7 - April 17, 2011 -================================================================================ - -This is the first release built with support of Maven thanks to -the help of some jOOQ users! - -The main new features in this release are the improved support -for serialisation/deserialisation of jOOQ objects through use of -the newly introduced "Attachable" interface. - -If using log4j or the newly supported slf4j logging framework -in debug/trace mode, there is the possibility to log query -building/execution time statistics. - -Apart from these new features, fixes were mainly done in the -fields of type casting, HSQLDB 2.1 upgrade support, stored -procedures with OUT, IN/OUT parameters. Please upgrade, if you -are using any of those features. - -If you extend jOOQ as a base implementation for source code -generation, be aware of the fact, that the jOOQ-codegen is -currently undergoing major changes. Expect the code generation -API to stabilise again in one of the next releases. - -Features --------- -#104 - Added maven dependency -#248 - Integrate UDT types with ARRAYs -#295 - Allow for attaching/detaching UpdatableRecords to/from - Configurations -#359 - Added statistics measurement to Query execution for debug - log level -#362 - Added deprecation configuration flag -#364 - Document unknown type in generated source code -#373 - Improve exception handling in code generation -#378 - Added support for Oracle stored functions with OUT - parameters -#382 - Added Factory.attach() methods to re-attach deserialised - Attachables -#394 - Add logging support for SLF4J -#398 - Allow to provide a DataType in Factory.constant() -#399 - Provide access to TypeUtils.convert() methods via DataType -#404 - Added trace logging for measuring the speed of various - query execution steps - -API changes ------------ -#358 - Enhanced DSL API to allow for HAVING clauses without - GROUP BY clauses -#367 - Make Store, Result, QueryPart "Attachable" -#374 - Introduce strategy pattern to code generation for future - support for advanced naming schemes -#375 - Decouple Database from Generator -#381 - Made DataType Serializable -#384 - Deprecated singleton QueryParts -#388 - Unify "internal" API using an Adapter pattern - -Bug fixes ---------- -#187 - Protect generated Record navigation methods against name - clashes -#266 - Added more thorough integration tests for dialect-specific - casting (including some fixes related to varchar types) -#360 - Added more integration tests for the DISTINCT clause -#361 - Add more checks in testInsertUpdateDelete() -#366 - Warn only once per ColumnDefinition, if a data type is - unknown -#377 - NullPointerException when generating invalid stored - function -#380 - Added integration tests to check for proper - serialisability -#386 - Fixed incompatibilities with HSQLDB 2.1.0 -#387 - Fixed unnecessary imports in some Oracle generated - Records -#389 - Fixed javac compiler warning in AbstractStoredObject -#391 - Cannot properly call stored procedures when IN/OUT - parameter is bound to NULL -#392 - Procedures with several OUT parameters may not register - OUT parameters correctly -#410 - Passing null VARRAY values to Oracle stored procedures - causes issues -#412 - limit(int) sets default offset incorrectly in some - dialects - -Version 1.5.6 - March 31, 2011 -================================================================================ - -This release consists mainly of code generation bug fixes and -minor API improvements and enhancements. - -The most important improvement is ticket #90, by which lazy -fetching and iteration over data is now supported. jOOQ lets you -keep a reference to a Cursor that has an open JDBC ResultSet, to -fetch data from on-the-fly. - -A few major code generation bugs were reported where the -generated code may cause ambiguity due to an inconsistent API. -This means that you will have to re-generate your schema after -upgrading to version 1.5.6. Some of your code may not compile -anymore, after this upgrade. - -Features --------- -#90 - Added possibility for lazy fetching of data -#208 - Added convenience methods for direct invocation of - sequences' currval() and nextval() attributes -#212 - Created one factory per dialect for better separation of - dialect-specific support -#213 - Generate a factory for each schema -#251 - Opened up base implementations for Field and Condition - to allow for custom implementations by client code -#274 - Integrate H2 ARRAY types with stored procedures -#292 - Documented usage of log4j and java.util.logging -#306 - Added support for the NULLIF function -#319 - Added Field.between(Field, Field) method -#320 - Added trace logging for variable binding and SQL - generation methods -#323 - Added Field.in(Field...) method -#325 - Include release version number in delivered .jar files -#328 - Improved configuration setup documentation page -#333 - Let Result implement Serializable -#334 - Added fetchMap() convenience methods -#335 - Added more functions and aggregate functions examples to - documentation -#338 - Visually improve code generation logging -#339 - Removed skipping of unreferenced UDT's, ENUM's and ARRAY's -#342 - Improved generated referential code by using fetch() and - fetchOne() API -#356 - Let UpdatableRecord.store() and delete() return an int - to indicate whether the record was actually modified - -API changes ------------ -#233 - Allow for joining TableLike instead of Table -#337 - Added generic type > to - InsertSelectQuery -#341 - Fixed API flaw where SelectOnConditionStep.and() methods - and similar ones returned SelectConditionStep, instead of - SelectOnConditionStep - -Bugfixes --------- -#69 - Corrected referential code generation for foreign keys - that reference non-primary unique keys -#85 - Corrected referential code generation for multi-field - foreign keys -#121 - Covered more Factory.executeXXX() methods with integration - tests -#318 - Fixed NullPointerException when executing SELECT * from - aliased tables -#321 - BetweenCondition does not bind left hand side Field - correctly -#322 - InCondition does not bind left hand side Field correctly -#326 - Avoid method overloading where binding to Object - may lead to compile-time ambiguities (with javac) -#343 - Add more foreign key navigation method integration tests -#347 - Add explicit integration tests for schema artefacts - excluded from code generation -#350 - Disambiguate navigation methods if several foreign keys - reference the same entity -#352 - Disambiguate navigation methods if a table ending on S - references itself -#353 - Added integration test for compilation of generated - artefacts with javac (as opposed to the Eclipse compiler) -#355 - Error when storing an UpdatableRecord that has no changed - values - -Version 1.5.5.2 - March 15, 2011 -================================================================================ - -A critical bug was reported from the 1.5 release stream where -stored functions did not render their parameters in correct order - -Features --------- -#302 - Map Oracle's NUMBER data type to java.lang.Number in - stored procedures, stored functions - -Bugfixes --------- -#317 - StoredFunctionImpl.asField() renders parameters in wrong - order - -Version 1.5.5.1 - March 13, 2011 -================================================================================ - -In version 1.5.5, there was a fatal bug breaking Derby source code generation. -Only the Derby dialect is affected. Please update immediately, if you are using -jOOQ's Derby integration - -Bugfixes --------- -#315 - Generated master data records are not sorted by PK -#316 - Derby code generation fatally broken - -Version 1.5.5 - March 12, 2011 -================================================================================ - -This version is released early as there are some important bugfixes. Additional -improvements include: - -- Improved DSL related to conditions in HAVING and JOIN clauses -- Support for Oracle-style functions, such as NVL, NVL2, COALESCE - DECODE, etc - -Features --------- -#304 - Add support for Oracle NVL function -#305 - Add support for COALESCE function -#308 - Add support for Oracle NVL2 function -#311 - Add support for Oracle DECODE function - -API changes ------------ -#223 - Enhance DSL to accept and(), or() and similar methods in JOIN steps -#224 - Enhance DSL to accept and(), or() and similar methods in HAVING steps - -Bugfixes --------- -#297 - Fixed Factory.concatenate() function -#298 - Added integration tests for nested selects in HAVING clause -#300 - Added integration tests for nested selects in JOIN clause -#303 - Javadoc correction -#307 - Accelerated integration tests -#309 - Fixed JDBC variable binding issue related to Conditions where the lhs is - a function (e.g. stored function) and the rhs is a constant -#310 - Fixed issue where fetchOne() methods throw NullPointerException if no - result record is available -#312 - Fixed issue where Field.equal(...) methods rendered unexpected SQL when - rhs null is cast to a type -#313 - Fixed Derby cast type for VARCHAR -#304 - Let the DerbyDataType default for java.lang.String be VARCHAR, not LONG - VARCHAR - -Version 1.5.4 - March 04, 2011 -================================================================================ - -Feature #243 required a minor API change in the base classes of generated source -code. This means you have to re-generate all your jOOQ artifacts in order to -migrate to 1.5.4. The artifacts themselves should be regenerated in a compatible -way, such that your client code should not be affected. If this is not the case, -please report a ticket here: - - https://sourceforge.net/apps/trac/jooq/newticket - -Apart from the Derby RDMBS and some new data type support, there have been many -new convenience methods added all over the API. For instance, if type-safety is -not really a requirement, there are lots of possibilities to use plain SQL -directly in the DSL. In that case, data can be accessed from Record, Results, -not only through Field, but also through field names or indexes. - -Check out the updated documentation (soon) here: - - https://sourceforge.net/apps/trac/jooq/wiki/Examples - -- Support for the Derby RDBMS -- Support for casting. This allows for even greater flexibility - in cases where jOOQ cannot 100% ensure type-safety -- Support for ARRAY types. Oracle, Postgres, HSQLDB and H2 ARRAY - types are now supported natively as regular bindings in - jOOQ's Field -- Support for dialect-specific data types. CHAR, VARCHAR, CLOB - are no longer treated equally as java.lang.String. Their - type heritage is also generated -- More sequence support -- Lots and lots of bug fixes - -Features --------- -#95 - Support for the Derby RDMBS -#163 - Add support for JDBC type ARRAY (with Postgres) -#209 - Add support for DB2 sequences -#210 - Add support for H2 sequences -#211 - Add support for HSQLDB sequences -#215 - Support for SQL casting using as cast type -#246 - Support for SQL casting using dialect-specific data types -#254 - Add HSQLDB support for ARRAY types -#256 - Add Oracle support for VARRAY types -#257 - Integrate ARRAY types with stored procedures -#261 - Add a global type mapping to the generated Schema object -#267 - Add DataTypeDefinition for further abstraction of data types in code - generation -#269 - Add H2 support for ARRAY types -#290 - If log4j is not on the classpath, use java.util.logging instead, as - fallback - -API Changes ------------ -#156 - Allow for results to be accessed by index, not by field -#218 - Corrected bad method signature: Record.getValueAsLong(Field, Integer) -#219 - Extended Result and Select API's to be more similar to that of Record -#232 - Add more convenience plain SQL support to the API -#235 - Add convenience methods to Record, Result and Select for access of data - via field name -#243 - Refactor DataType implementations in order to allow for the use of - generics -#259 - Add field type to database meta data (ColumnDefinition) -#260 - Add field type to database meta data (Field) -#262 - Add default behaviour for Record.getValue(Field) -#276 - Add Javadoc as a ZIP file to the jOOQ distribution - -Bugfixes --------- -#125 - Add more plain SQL integration tests -#191 - Add more integration tests for nested unions -#205 - Implemented workaround for handling Postgres stored functions with UDT - OUT parameters -#214 - Fixed NPE when generating a stored function with an unknown parameter - type -#216 - Fixed some cases where binding of BigInteger is not done correctly -#220 - Syntax error when using select statement in a CASE clause -#221 - Corrected integration tests for combined update and select statements -#222 - Added integration test for INSERT statements having nested SELECT - statements for their fields -#225 - Correctly cast array types in Postgres -#230 - Potential misuse of Blob and Clob in H2's JDBC types -#239 - Factory.fetchAny() is not implemented for SQLite -#244 - Fixed peculiar MySQL casting support where cast types do not match any - data types -#245 - Fixed NPE when reading null dates in SQLite -#249 - Added ARRAY type integration tests -#255 - Stored procedure bind variables get mixed up when any argument is null -#263 - Correctly handle Postgres function overloading -#264 - Ambiguous funciton calls when calling overloaded functions with null - parameter -#281 - Handle compilation errors when generating stored procedures with > 254 - parameters -#283 - Fixed compilation errors in generated source code for Oracle's UDT table - type -#284 - Fixed compilation errors in generated source code for Oracle procedures - in packages, when they have no parameters -#285 - Fixed compilation errors in generated source code for Oracle tables with - the same name in different schemata -#286 - Fixed name collisions in generated objects with the java.lang.* package -#288 - Prevent the creation of UNION queries with bad syntax in MySQL -#289 - Correctly alias fields within UNION queries for some dialects, which then - only require the "AS" keyword -#291 - Cannot create an aliased field called "year" in Postgres - -Version 1.5.3 - January 13, 2011 -================================================================================ - -- Lots of stored procedure support was implemented -- Support for sequences was added -- The final decision to postpone support for DB2 UDT's was made -- Some code generation bugfixes - -Features --------- -#36 - Added stored procedure / stored function support for HSQLDB -#140 - Added support for Oracle sequences -#147 - Added support for H2 stored functions -#162 - Correctly integrate UDTs with stored procedures -#170 - Added support for Postgres stored functions -#186 - Added support for more Oracle PL/SQL simple data types -#193 - Simulate support for H2 "stored procedures" -#195 - Simulate support for Postgres "stored procedures" -#206 - Added support for Postgres sequences - -API changes ------------ -#180 - Improved DSL for constant values -#181 - Allow for referencing Field in function argument list -#189 - Renamed convenience methods in org.jooq.Record -#207 - Add fetchOne(Field) method to org.jooq.Select API - -Bugfixes --------- -#182 - Protected generated Record classes against clashes with inherited methods -#183 - Fixed NullPointerException, when generating master data tables with - NULL fields -#184 - Fixed IllegalArgumentException, when a data type is present in the - schema, but unavailable in code generation logic -#185 - Code generation should not fail when single elements cannot be generated -#188 - Improved integration tests for stored procedures / functions / packages -#196 - Increase RDMBS version compatibility by avoiding "SELECT *" in code - generation logic -#199 - Added integration tests for stored procedures in RDBMS that do not - support OUT parameters -#201 - Fixed issue in DB2 where stored procedures without parameters were not - generated. -#202 - Added integration tests for stored procedures / functions without - parameters - -Version 1.5.2 - December 27, 2010 -================================================================================ - -- Improved support for stored procedures, also in packages -- A minor API change was inevitable to implement #173. The API change only - concerns the INTERNAL API. Deprecation marks are added and deprecated items - will be removed in 1.6.0 -- Experimental SQLite database support -- Some important bug fixes - -Features --------- -#25 - Added support for Oracle packages -#114 - Added support for Oracle UDTs -#145 - Added support for the SQLite database -#150 - Generate static convenience methods for stored procedures / functions -#151 - Generate static convenience methods for stored function fields -#152 - Generate meaningful serialVersionUID in generated classes -#173 - Added support for EQUIVALENT schemata - -API changes ------------ -#159 - Added convenience method List getValues(Field) to Result -#165 - Added convenience methods for creating EXISTS clauses -#169 - Improved DSL for WHERE clauses - -Bugfixes --------- -#68 - Prevent issues originating from overloaded stored procedure names, - generating identical Java class names -#153 - Fixed issue with generated code for DB2 stored functions -#154 - Fixed issue with generated code for DB2 stored functions -#155 - Fixed issues with database NULL not being mapped correctly to Java NULL - when selecting values that have a primitive type (int, long, etc) -#158 - Potential ClassCastException when using Field -#171 - Corrected issue related to selection of default schema in DB2 -#177 - Fixed issue related to generated code for tables or UDTs without columns - - -Version 1.5.1 - December 13, 2010 -================================================================================ - -- H2 database support thanks to Espen Stromsnes -- Improved stored procedure support - -Features --------- -#96 - Added H2 database support -#101 - Added stored procedure / stored function support for Oracle -#138 - Added stored procedure support for DB2 -#146 - Added support for DB2 functions - -API changes ------------ -#143 - Added convenience methods to Record - -Bugfixes --------- -#84 - Implemented referential code generation for foreign keys that do not - match their primary keys' types -#141 - Encoding problem in generated master data classes - -Version 1.5.0 - November 22, 2010 -================================================================================ - -- A big one. Major API changes / improvements -- Added lots of convenience methods -- UDT support -- Enum support -- DB2 support thanks to Espen Stromsnes -- "Light" dependency to log4j added. jOOQ will still run without it - -Features --------- -#1 - Create support for UDTs (so far only for PostgreSQL) -#15 - Added DB2 support -#60 - Added support for nested selects in INSERT and UPDATE statements -#83 - Added log4j logging to code generation and runtime -#87 - Add support for arithmetic expressions -#105 - Added support for ENUM data types, where applicable (MySQL and PostgreSQL - so far) -#110 - Added execute and fetch convenience methods -#111 - Added missing "select distinct" support -#122 - Annotate generated classes with javax.annotation.Generated -#123 - Generate user enum fields from data values (master data) -#124 - Added PlainSQLTable -#127 - Added not() operator to Condition -#135 - Added convenience methods andNot() and orNot() in Condition - -API changes ------------ -#89 - Removed support for DataSource. jOOQ is not a transaction manager -#92 - Added SortField type to be used for sorting -#99 - Provide better access to functions (No more FunctionFactory) -#116 - Merge Manager functionality into Factory -#118 - Improve API of org.jooq.Field -#119 - Improve subquery condition API -#132 - Reduced much of the select query API -#134 - Better separation of SelectQuery and SimpleSelectQuery - -Bugfixes --------- -#109 - Error when executing select * if generated schema does not match actual - schema -#115 - Fix various "null" pseudo field issues -#126 - Error when selecting a single field from a union nested select -#129 - Fixed performance issue in Oracle code generation for very large - databases - - -Version 1.4.4 - November 22, 2010 -================================================================================ - -Unreleased version, fixes included in 1.5.0 - -Bugfixes --------- - -#133 - JoinCondition does not take comparison operator - -Version 1.4.3 - October 25, 2010 -================================================================================ - -Some more bugfixes - -Bugfixes --------- - -#71 - Generated code does not compile, when foreign key and primary key have a - data type mismatch -#73 - In Oracle generated code, multi-field foreign keys may generated bad - relations code -#82 - Conversion of literals to camelcase fails if numbers are involved - -Version 1.4.2 - October 22, 2010 -================================================================================ - -Various bugfixes and minor improvements - -Features --------- -#66 - Add support for CASE or DECODE expression - -API changes ------------ -#77 - Functions should not extend FieldImpl, but a new AbstractField -#78 - QueryPart pollutes declared method space of its implementations. Hide it - by indirection - -Bugfixes --------- -#64 - Code generation fails when foreign key references a unique key that is not - the primary key. Code generation for these cases is omitted -#67 - When loading properties files, a leading / seems to be mandatory. This is - preventing users from correctly setting up jOOQ the first time -#70 - Add support for Oracle datatype TIMESTAMP(6) -#72 - Name clashes in generated Tables -#75 - Constant does not bind its values. -#76 - Constant should not render strings all the time -#79 - Constants are not properly escaped -#80 - Position function does not bind any variables -#81 - Add cast function to Constants in HSQL - -Version 1.4.1 - October 18, 2010 -================================================================================ - -Oracle patch release - -Features --------- -#63 - Generate referential functionality for Oracle - -Version 1.4.0 - October 17, 2010 -================================================================================ - -Support for PostGreSQL was added. -Added lots of OR-mapping functionality. -There is a general API change due to various new features. - -Features --------- -#14 - Add PostGreSQL support -#40 - Resolve foreign keys. Allow for navigation between objects. -#42 - Add PlainSQLField -#45 - Add "dirty" flag to Record's values. This allows for updating only - relevant data. -#47 - Complete implementation for UPDATE, INSERT, DELETE statements. Added some - missing functionality. -#48 - Add more support for Date, Time, Timestamp fields. -#51 - Add a org.jooq.impl.Manager class that provides common utility methods for - CRUD operations - -API changes ------------ -#10 - Add second generic type . This is a prerequisite for - many OR-mapping features -#18 - Use org.jooq.Record in InsertQuery and UpdateQuery -#46 - Create UpdatableRecords as a prerequisite for JPA and true OR-mapping. - These records support store() and delete() methods -#52 - Add default constructor in generated Records. -#53 - Add refresh functionality to UpdatableRecords. See also #46 -#54 - Add a state to the factory class -#56 - Reduce API, remove unnecessary Condition subinterfaces -#57 - Reduce API, remove unnecessary QueryPart interfaces - -Bugfixes --------- -#49 - NullPointerException when generating relations on schema subset -#58 - Count function renders bad SQL in various dialects -#59 - Exception when selecting unaliased functions in queries - -Version 1.3.0 - August 24, 2010 -================================================================================ - -Support for HSQLDB was added. -There is a major API change due to #44. - -Features --------- -#29 - Generate primary keys and foreign keys in Oracle code generation -#34 - Add support for HSQLDB -#39 - Generate primary keys and foreign keys in HSQLDB code generation -#41 - Add documentation to QueryFactory and Functions - -API changes ------------ -#23 - Add support for more advanced joins -#32 - Merge SelectQuery and ResultProviderQuery interfaces -#44 - Let Query methods return "this" - -Bugfixes --------- -#35 - Add unit tests for HSQLDB support -#37 - Syntax error in combined select queries! The usage of combined queries in - MySQL may still be a bit awkward. Keep an eye out for further fixes -#43 - Join with aliased tables doesn't work - -Version 1.2.0 - August 21, 2010 -================================================================================ - -The added Oracle support is now unit tested and more stable. The Oracle NUMBER -data type is mapped more precisely to Java types. - -Features --------- -#12 - Model primary keys and foreign keys in generated code -#22 - Improve mapping of Oracle NUMBER data type -#26 - Add Plain SQL QueryParts -#27 - Add support for HAVING clause - -Bugfixes --------- -#24 - Add Unit tests for oracle database (and fixed bugs) -#31 - Pull up addOrderBy() methods from SelectQuery to ResultProviderQuery - -Version 1.1.0 - August 17, 2010 -================================================================================ - -The main new feature is the Oracle support. Wait for Version 1.1.1 for that -support to be stabilised, as there are no Oracle unit tests running against an -Oracle database yet. - -Features --------- - -#2 - Add support for inner / nested selects -#3 - Add more function support -#4 - Implement filtering functionality for code generation -#6 - Add Oracle Support -#9 - Create true POJO's (implementing org.jooq.Record) with getters and setters -#17 - Make org.jooq.impl.Parameter independent of Field - -Bugfixes --------- - -#11 - Code generation does not remove files - -Version 1.0.1 - August 14, 2010 -================================================================================ - -Features --------- - -#5 - Prevent code regeneration, if no changes were made -#7 - Implement ant task for code generation - -Version 1.0.0 - August 14, 2010 -================================================================================ -Initial Release \ No newline at end of file diff --git a/jOOQ-website/inc/RELEASENOTES-3.0.txt b/jOOQ-website/inc/RELEASENOTES-3.0.txt deleted file mode 100644 index 9ccdb2c848..0000000000 --- a/jOOQ-website/inc/RELEASENOTES-3.0.txt +++ /dev/null @@ -1,3562 +0,0 @@ -jOOQ Release notes -================== - -For an interactive overview, see also -http://github.com/jOOQ/jOOQ/issues - -For a formatted text version, see -http://www.jooq.org/notes.php - -For a text version, see -http://www.jooq.org/inc/RELEASENOTES.txt - -Version 3.0.1 - May 25, 2013 -================================================================================ - -This is a patch release with some useful fixes for the 3.0 branch - -Bug fixes ---------- -#2323 - NullPointerException when calling Schema.getTables() on a meta schema - with SQLite -#2401 - Bad package name generated when contents are not trimmed -#2413 - Suppress warnings in generated code (@SuppressWarnings("all") doesn't - suppress "rawtypes" warnings with javac) -#2418 - RenderContext.data() is not passed on to QueryParts when being rendered -#2424 - Integration-test jOOQ with the SQLite xerial driver -#2432 - Manual refers to a package-private DefaultConfiguration constructor -#2445 - JDBCDatabase doesn't recognise Oracle's VARCHAR2 data type (and other - vendor-specific data types) -#2447 - Tables collected through DSLContext.meta() return duplicate columns if - multi-schema environments contain identical tables -#2448 - DSLContext.meta() returns Table objects for Oracle SYNONYMS, without - providing columns -#2449 - JDBCDatabase doesn't use DataType.length(), precision(), and scale() -#2450 - Cannot set precision on TINYINT, SMALLINT, INT, BIGINT data types -#2464 - Bad SQL rendered from DELETE statements with aliased tables -#2469 - NullPointerException in AbstractResultQuery.fetchOneMap() -#2477 - MySQL's unsigned types cannot be used in other dialects -#2478 - IngresDatabase erroneously joins IIINDEXES to get constraint columns, - rather than using IIKEYS - -Version 3.0.0 - April 28, 2013 -================================================================================ - -This major release is a great move towards better integration of SQL as a -language in Java. Unlike any other database abstraction framework, jOOQ now -formally supports the notion of "row value expressions". The jOOQ API uses -Xtend-generated API types from Row1 .. Row22, as well as Record1 .. Record22 to -bring you even more compile-time typesafety on a record-level. - -In SQL, you can typesafely write - -
-  SELECT * FROM t WHERE (t.a, t.b) = (1, 2)
-  SELECT * FROM t WHERE (t.a, t.b) OVERLAPS (date1, date2)
-  SELECT * FROM t WHERE (t.a, t.b) IN (SELECT x, y FROM t2)
-  UPDATE t SET (a, b) = (SELECT x, y FROM t2 WHERE ...)
-  INSERT INTO t (a, b) VALUES (1, 2)
-
- -In jOOQ, you can now (also typesafely!) write - -
-  select().from(t).where(row(t.a, t.b).eq(1, 2));
-  // Type-check here: ----------------->  ^^^^
-  select().from(t).where(row(t.a, t.b).overlaps(date1, date2));
-  // Type-check here: ------------------------> ^^^^^^^^^^^^
-  select().from(t).where(row(t.a, t.b).in(select(t2.x, t2.y).from(t2)));
-  // Type-check here: -------------------------> ^^^^^^^^^^
-  update(t).set(row(t.a, t.b), select(t2.x, t2.y).where(...));
-  // Type-check here: --------------> ^^^^^^^^^^
-  insertInto(t, t.a, t.b).values(1, 2);
-  // Type-check here: ---------> ^^^^
-
- -This also applies for existing API, which doesn't involve row value expressions: - -
-  select().from(t).where(t.a.eq(select(t2.x).from(t2));
-  // Type-check here: ---------------> ^^^^
-  select().from(t).where(t.a.eq(any(select(t2.x).from(t2)));
-  // Type-check here: -------------------> ^^^^
-  select().from(t).where(t.a.in(select(t2.x).from(t2));
-  // Type-check here: ---------------> ^^^^
-
- -And for UNIONs - -
-  select(t1.a, t1.b).from(t1).union(select(t2.a, t2.b).from(t2));
-  // Type-check here: -------------------> ^^^^^^^^^^
-
- -These type-checks are preformed by your Java compiler, considering the generic -type information of your SQL statement's Record data types. These include: - -- Record1 -- Record2 -- Record3 -- ... -- Record22 - -The highest degree of typesafety was chosen to be 22, to match Scala's Tuple22, -Product22 and Function22 types. Higher degree records are still supported by -jOOQ, just without the additional typesafety. - -This Record typesafety is applied to - -- SELECT statements -- INSERT and MERGE statements: the VALUES() clause -- UPDATE statements: SET A = (SELECT...) -- UPDATE statements with row value expressions: SET (A, B) = (SELECT...) -- Quantified comparison predicates: ANY(SELECT...) and ALL(SELECT...) -- Comparison predicates: = (SELECT...) -- IN predicates: IN (SELECT...) -- BETWEEN predicates: BETWEEN (SELECT...) AND (SELECT...) -- Generated records -- The new VALUES() constructor -- Scala integration for conversion of jOOQ Record[N] to Scala's Tuple[N] - -Apart from this major improvement, there had been many minor changes throughout -the jOOQ API. Here are some important ones: - -- Factory has been split into DSL (static QueryPart construction) and - DSLContext (Query execution, "attached" QueryPart construction). This greatly - improves the overall DSL experience while allowing for more fine-grained - Executor lifecycle control. -- A ConnectionProvider has been introduced as an abstraction of the JDBC - Connection lifecycle. The standalone Connection and pooled DataSource modes - are still supported, but you can now inject your own ConnectionProvider for - more control. -- A lot of performance improvements have been implemented within the jOOQ API - removing most of the overhead caused by jOOQ when fetching data from JDBC -- A JDBC Mock API has been added to help you create simple unit tests for your - application built on top of jOOQ. -- A VALUES() constructor is now supported, and derived column lists to alias - tables and columns in one go. -- The data type API has been greatly simplified. This allowed for the - introduction of runtime precision, scale, and length information. -- CRUD has been improved through many more CRUD batch operations, explicit - INSERT and UPDATE (in addition to store()), and explicit handling of jOOQ's - internal changed flags. - -As this is a major release, some backwards-incompatibilities were inevitable. -For those users among you, migrating from jOOQ 2.x to 3.0, here are a couple of -useful hints: -http://www.jooq.org/doc/3.0/manual/reference/migrating-to-3.0/ - -Note, that for technical reasons, jOOQ 3.0.0 could not yet be integration -tested with DB2, Ingres, and Sybase ASE. Consider using jOOQ 2.6, instead - -Note, that further code generation and model API improvements were postponed to -a later release - -Note, previous release candidates contained more features, improvements and bug -fixes. See their respective sections for details. - -Features and improvements -------------------------- -#2410 - Add some more API usage examples to the section about ResultSet fetching -#2415 - Add Constants.MINOR_VERSION and Constants.FULL_VERSION for internal and - external reuse - -Bug fixes ---------- -#1998 - Wrong screenshots in the manual's section about code generation. - jooq-meta.jar is missing -#2407 - Fix bad references to pre-3.0 Factory in Javadoc - -Version 3.0.0 (RC3) - April 12, 2013 -================================================================================ - -This major release is a great move towards better integration of SQL as a -language in Java. Unlike any other database abstraction framework, jOOQ now -formally supports the notion of "row value expressions". The jOOQ API uses -Xtend-generated API types from Row1 .. Row22, as well as Record1 .. Record22 to -bring you even more compile-time typesafety on a record-level. - -See release 3.0.0 for more information. - -Features and improvements -------------------------- -#2195 - Remove the standalone tutorial, link to the manual -#2321 - Implement various Key.toString() methods -#2329 - Add Javadoc to Configuration.executeListenerProviders() -#2331 - Add hint to the manual about mvn eclipse:clean and eclipse:eclipse when - building jOOQ -#2363 - Change the readme file to use Markdown -#2366 - Add org.jooq.util.example package to jOOQ-codegen with some example - GeneratorStrategies -#2372 - Add aliases for arithmetic operators to be able to use Groovy default - operator overloading -#2389 - Make org.jooq.impl.DefaultConfiguration public -#2392 - Add Configuration.set() methods. They should allow for modifying a - Configuration -#2396 - Add DSL.function(Name, Class, Field...) and - DSL.function(Name, DataType, Field...) to allow for custom, - fully-qualified function references - -API changes (backwards-compatible) ----------------------------------- -#2378 - Allow for overriding getIdentity() and getReferences() in CustomTable - -API changes (backwards-incompatible) ------------------------------------- -#2328 - Remove UpdatableTable marker interface, pulling up methods to Table -#2342 - Change Configuration.data() to return Map -#2343 - Decouple lifecycle of Configuration and ExecuteContext -#2350 - Do not statically reference a Connection from GenerationTool -#2353 - Decouple org.jooq.Context from Configuration. Choose composition over - inheritance -#2362 - Decouple org.jooq.DSLContext from Configuration. Choose composition over - inheritance -#2379 - Replace 3.0-RC1 Executor type by a contextual DSL type constructed from - DSL.using() -#2380 - Rename org.jooq.impl.Factory to org.jooq.impl.DSL -#2382 - Let DAO reference a Configuration instead of a DSLContext -#2388 - Replace Configuration's List with - ExecuteListenerProvider[] to simplify correct and thread-safe client - implementations -#2390 - Change Configuration API to reflect jOOQ-style getter / setter naming -#2391 - Rename dialect-specific Factories [Dialect]Factory to [Dialect]DSL -#2399 - Remove support for the USE statement - -Behaviour changes (backwards-incompatible) ------------------------------------------- -#2351 - Relax ConnectionProvider contract, allowing acquire() to return new - Connections even before release() is called - -Bug fixes ---------- -#1868 - Cursor.close() doesn't terminate the ExecuteListener life cycle -#2325 - "HsqlException: incompatible data type in conversion" when binding a - UUID[] to an HSQLDB prepared statement -#2327 - Compilation error in generated tables, when a table contains a UNIQUE - key but no PRIMARY key -#2332 - Documentation example regarding DSL.concat() does not compile -#2336 - jOOQ 3.0 regression: NoClassDefFoundError caused by missing log4j - dependency -#2338 - Tutorial example unclear: There are three artefacts in Maven, not one -#2346 - org.jooq.Meta's generated Schema and other objects are Serializable, but - their enclosed Meta instance is not -#2347 - Let equals() implementations succeed early on identity -#2354 - Single page manual display errors on Firefox -#2361 - Inaccurate Configuration Javadoc explaining wrong ExecuteListener - lifecycle -#2367 - SQLite identifiers that collide with keywords should be quoted -#2381 - Do not add TableFieldImpl to table in constructor of TableFieldImpl -#2385 - fetchOne() and fetchLazy() don't terminate the ExecuteListener life - cycle when an exception occurs -#2393 - Fully qualified name not used for user-defined aggregate function - -Version 3.0.0 (RC2) - March 8, 2013 -================================================================================ - -This major release is a great move towards better integration of SQL as a -language in Java. Unlike any other database abstraction framework, jOOQ now -formally supports the notion of "row value expressions". The jOOQ API uses -Xtend-generated API types from Row1 .. Row22, as well as Record1 .. Record22 to -bring you even more compile-time typesafety on a record-level. - -See subsequent release candidates or release 3.0.0 for more information. - -Features and improvements -------------------------- -#2200 - Add Executor.fetchCount(Select) and Select.fetchCount() to replace - the projection by a COUNT(*) query -#2244 - Add section to the manual indicating that the jOOQ generator can only - handle schemas of a certain size -#2255 - Add code generation option to avoid the generation of "global object - references" -#2257 - Add List Database.getIdentities(SchemaDefinition) - for convenience to jooq-meta -#2258 - Restore private and deprecated versions of the Factory constructors, - adding some Javadoc about the changes between jOOQ 2.x and 3.0 -#2270 - Add section to the manual indicating how to build jOOQ with Maven -#2272 - Add a paragraph to the manual's preface, explaining "why not just use - SQL"? -#2281 - Add Result Executor.fetchFromStringData(List) in order - to reuse logic from fetchFromCSV -#2285 - Add more verbosity to the code generator, when configured badly -#2290 - Add Database.getUniqueKeys() and getForeignKeys to jOOQ-meta -#2297 - Add section to the manual indicating how the various generator flags - depend on each other -#2308 - Do not generate "final" Tables.java, UniqueKeys.java, etc. - -Bug fixes ---------- -#2212 - "code size too large" in generated SchemaImpl, when the number of tables - exceeds 15k -#2238 - Code generation runs extremely slow for large schemas (Inefficient - DefaultRelations.getUniqueKeys() and getForeignKeys() methods) -#2239 - Code generation runs extremely slow for large schemas (Inefficient - AbstractDatabase.filterSchema() methods) -#2252 - ArrayIndexOutOfBoundsException, when rendering plain SQL that is - terminated by a comment -#2259 - RenderMapping has no effect, if not supplied to the Executor constructor -#2262 - RenderSchema has no effect, if not supplied to the Executor constructor -#2267 - SQLDialectNotSupportedException: Type class org.postgis.PGgeometry is - not supported in dialect null, when binding PG* objects -#2271 - jOOQ Unit tests fail when not run in CET / CEST -#2273 - Tutorial bug, referencing wrong Maven dependency. jOOQ 3.0.0 is not yet - released, only RC1 -#2276 - Wrong MockDataProvider manual example -#2278 - Postgres (UUID and other) ARRAY types aren't correctly inlined as string - literals -#2279 - UUIDs aren't correctly deserialised from Postgres UDTs -#2280 - Improve supported formats for MockFileDatabase -#2283 - Class loading issues in GenerationTool when called by Gradle -#2294 - Compilation errors when code generator is configured with - true and false -#2298 - Suppress warnings in generated code (@SuppressWarnings("all") doesn't - work with javac) -#2312 - Annotate org.jooq.Support with java.lang.annotation.Documented to make - it part of the public API (in Javadoc) -#2314 - Outdated GenerationTool Javadoc - -Version 3.0.0 (RC1) - February 16, 2013 -================================================================================ - -This major release is a great move towards better integration of SQL as a -language in Java. Unlike any other database abstraction framework, jOOQ now -formally supports the notion of "row value expressions". The jOOQ API uses -Xtend-generated API types from Row1 .. Row22, as well as Record1 .. Record22 to -bring you even more compile-time typesafety on a record-level. - -See subsequent release candidates or release 3.0.0 for more information. - -Features and improvements -------------------------- -#456 - Add runtime support for PRECISION, SCALE, and LENGTH attributes -#834 - Add support for the Firebird / Postgres UPDATE .. RETURNING clause -#915 - Add Table> - Factory.values(Row[N]...), to create ad-hoc tables - from data -#1038 - Introduce new type GroupField for cube(), rollup() and groupingSets() - functions. Accept only GroupField... in groupBy() clauses -#1097 - Add org.jooq.Catalog, a type modelling an entity combining several - org.jooq.Schema -#1144 - Overload Executor.fetch[One|Lazy](ResultSet, X...) with X being - Field, DataType, Class -#1178 - Allow for treating Condition as Field -#1583 - Add support for row value expressions in UPDATE statements: UPDATE .. - SET (A, B, C) = (SELECT X, Y, Z) -#1624 - Add support for java.util.UUID as a type -#1663 - Document RenderContext and make it part of the public API -#1686 - Add UpdatableRecord.insert() and update() -#1689 - Generate E into(E) and R from(E) methods to generated records -#1690 - Add UpdatableRecord.key() returning a Record holding PK values -#1695 - Add Factory.all() and Factory.any() to create quantified expressions -#1703 - Add Executor.batchDelete(UpdatableRecord...) to mass-delete a set of - UpdatableRecords -#1801 - Add Table.as(String, String...) to allow for creating a table aliases - (correlation names) with derived column lists -#1874 - Add Record1, Record2, ... Record[N] similar to Row1, Row2, ... Row[N] to - support record type-safety -#1897 - Add a section to the manual about the migration to jOOQ 3.0 -#1899 - Make some JDBC-related utility methods publicly available in - org.jooq.tools.jdbc.JDBCUtils -#1902 - Duplicate SELECT API between Executor and Factory -#1904 - Add Executor.fetch(ResultQuery), Executor.execute(Query), and similar - methods -#1905 - Add Row[N].equal(Select) and similar methods -#1906 - Use Xtend to generate Row[N], Record[N] and other [N]-related API code - artefacts -#1914 - Document the fact that SELECT * is performed by leaving the SELECT list - empty -#1917 - Add support for CUBRID 9.0's window functions and MERGE statement -#1918 - Let generated Records implement Record[N] if applicable -#1919 - Support higher degrees of Row[N] and Record[N] types. Match Scala's max - degree of 22 -#1920 - Add more implicit defs in order to treat Record[N] as Scala's Tuple[N] -#1923 - Add Record.intoResultSet() to create a single-record JDBC ResultSet from - a Record -#1924 - Add support for CUBRID 9.0's ENUM data type -#1932 - Generate Javadocs for Table constructors -#1934 - Improve generated Record Javadoc -#1951 - Add support for the SQL Server WITH (...) table hints -#1966 - Add Row[N].equal(Record[N]) and similar convenience methods -#1967 - Document using MySQL's SQL_CALC_FOUND_ROWS as an Oracle hint -#1968 - Add org.jooq.Meta returned from Executor.meta() to return a wrapped JDBC - DatabaseMetaData object -#1972 - Move MySQLFactory.md5() to Factory and simulate it for Oracle -#1973 - Add Executor.fetchOne(ResultSet) -#1975 - Add Result.sort{Asc|Desc}(int) and (String) to order by field index / - name -#1981 - Add support for DB2 CGTT and MQT -#1983 - Improve the Javadoc on Table.as() and Field.as() to hint at - case-sensitivity and RenderNameStyle -#1984 - Add ResultQuery.fetchOneInto() -#1986 - Add Record.fromMap() as the inverse operation of Record.intoMap() -#1987 - Allow for reading data from arrays, Maps through Record.from() -#1988 - Add Record.fromArray() as the inverse operation of Record.intoArray() -#1989 - Add Record.changed(Field), changed(int), changed(String) to check - whether a single field's value has changed -#1990 - Add T Record.original(Field), original(int), original(String) to - get a Field's original value -#1991 - Reflect changed flag in Result.toString() (and thus also - Record.toString()) -#1999 - Add Record.changed(boolean) changed(Field, boolean) - changed(int, boolean) changed(String, boolean) as setters for the - changed flag -#2000 - Add Record.reset(), reset(Field), reset(int), reset(String) to - restore original values in a record -#2008 - Add elementFormDefault="qualified" to XSD specifications to allow for - XML validation of jOOQ configuration files -#2020 - Let org.jooq.ExecuteListener extend java.util.EventListener -#2021 - Add UpdatableRecord.refresh(Field...) to allow for refreshing a - subset of the Record's values -#2027 - Document semantic versioning rules as understood by jOOQ -#2028 - Add Batch.size() to indicate the number of queries that will be executed - by a batch operation -#2030 - Add reusable wrapper types for JDBC Connection, Statement, ResultSet, - etc. -#2044 - Add various TableRecord.fetchParent(...), fetchChild(...) and - fetchChildren(...) methods to follow foreign key relationships -#2049 - Add gt() / ge() / lt() / le() to Row[N] types -#2052 - Add [not]Between[Symmetric]() to Row[N] types -#2053 - Add is[Not]Null() to Row[N] types -#2066 - Add Executor.extractBindValues(QueryPart), extractParams(QueryPart) to - extract bind values in the context of an Executor (i.e. Configuration) -#2072 - Let UDTRecordImpl and ArrayRecordImpl.toString() return a valid - constructor expression -#2078 - Add Postgres to @Support annotation of SelectForUpdateWaitStep.wait() -#2079 - Support generation of bean validation annotations on records and - interfaces -#2089 - Generate an "empty" DefaultSchema for those databases that do not have - any schema (CUBRID, Firebird, SQLite) -#2094 - Add unit tests for org.jooq.tools.Convert -#2107 - Let Record implement Comparable -#2111 - Improve org.jooq.Record Javadoc, to explain the various Record subtypes -#2112 - Add Row.types() and Row.dataTypes() as a convenience -#2113 - Document Record.hashCode() and equals() through Javadoc -#2133 - Allow for mapping to "" (empty) in order to avoid the - generation of a schema -#2156 - Add Row.type(int), type(String), dataType(int), dataType(String) for - convenience -#2158 - Add Executor.fetchLazy(Table) and fetchLazy(Table, Condition) for - convenience -#2159 - Let ExecuteListener extend Serializable -#2160 - Add Executor.batchUpdate(UpdatableRecord...) to mass-update a set of - UpdatableRecords -#2161 - Add Executor.batchInsert(UpdatableRecord...) to mass-insert a set of - UpdatableRecords -#2162 - Add some more Javadoc to JooqLogger -#2170 - Add 0.0 and 1.0 to Convert.FALSE_VALUES and Convert.TRUE_VALUES -#2171 - Allow for converting booleans to numbers through org.jooq.tools.Convert: - TRUE => 1, FALSE => 0 -#2172 - Add set(Field, Select>) methods to UPDATE, - MERGE and INSERT statements -#2176 - Add hint in code generation, when an unsupported, old database version - is being used (e.g. MS SQL Server 2000) -#2177 - Add ResultQuery.intern() and Result.intern() for string interning in - result sets -#2179 - Add Javadoc to QueryPart.hashCode() and equals() -#2199 - Allow for INSERT and UPDATE of pre-existing records through - SET [ Record ] clauses -#2202 - Add Mock JDBC objects for unit testing with jOOQ -#2203 - Add Executor.map(Schema) and Executor.map(Table) as a convenience to - apply runtime schema mapping -#2204 - Add BatchBindStep.bind(Object[][]) to bind lots of bind values at a time -#2205 - Add Result Executor.newResult(Table) to generate custom - results - -API changes (backwards-compatible) ----------------------------------- -#1309 - Let Factory.val() return Param instead of Field -#2031 - Change union(Select) and similar methods to - union(Select) -#2157 - Change the bounds of various > H - fetchInto(H handler) methods to RecordHandler -#2197 - Relax bounds on Factory.groupingSets(Collection>...) to - Collection>... -#2206 - Relax bounds of R on Executor.newRecord() from TableRecord to Record - -API changes (backwards-incompatible) ------------------------------------- -#1118 - Remove support for the code generation ant task -#1254 - Move org.jooq.tools.unsigned contents to org.jooq.types (along with the - INTERVAL types) -#1374 - Relax usage of generic . Replace by where data types - are involved. -#1533 - Extract Executor API from Factory. Let Factory contain only static - QueryPart factory methods -#1549 - Externalise connection lifecycle through new ConnectionProvider -#1649 - Remove support for code generation from pre-jOOQ 2.0 .properties file -#1740 - Remove support for generated master data enums -#1875 - Add generic type to SelectXXXStep DSL type hierarchy - for increased tuple type-safety -#1887 - Remove all deprecated code -#1894 - Remove constructors from dialect-specific factories -#1907 - Remove FactoryOperations, push its API down to org.jooq.impl.Executor -#1921 - Add InsertValuesStep[N] - Executor.insertInto(Table, Field, Field, ..., Field) -#1926 - Add MergeXXXStep - Executor.mergeInto(Table, Field, Field, ..., Field) -#1977 - Remove the confusing concept of having a "main key" as opposed to a - "primary key" -#2042 - Remove generated setters, setting foreign key values from records -#2043 - Remove generated navigation methods -#2060 - Remove redundant SimpleSelectXXX API -#2117 - Remove the FieldProvider marker interface. Simplify the FieldProvider - API -#2119 - Rename Row.getDegree() to Row.size() - -Behaviour changes (backwards-incompatible) ------------------------------------------- -#1235 - SQLite BIGINT data type erroneously maps to java.math.BigInteger -#1578 - Change configuration of ExecuteListeners in Configuration. Listeners - instances should be provided, not classes -#2076 - Stop "supporting" comma-separated regular expressions in the code - generator configuration -#2088 - Do not treat CUBRID "owner" as schema in generated code - -Bug fixes ---------- -#1170 - Improve performance on jOOQ's reflection usage -#1626 - Explicitly implement hashCode() and equals() in some additional - QueryParts -#1886 - Query.bind() has no effect when Query.keepStatement(true) and - StatementType.STATIC_STATEMENT are combined -#1890 - Bad Postgres array serialisation when " or \ characters are contained in - a String[] -#1938 - Improve AbstractField.hashCode() and AbstractTable.hashCode() and - similar, as these two are called very often -#1942 - Inefficient call to String.split() in StringUtils.toCamelCase() leads to - non-negligible performance overhead in POJO transformation calls -#1937 - Inefficient implementations of AbstractDataType.equals() and hashCode() -#1954 - Bad SQL rendered when combining ORDER BY [ some-function ] with LIMIT .. - OFFSET in DB2, SQL Server -#1958 - Bad SQL rendered for OVER (ORDER BY [ some-function ]) for SQL Server - and Sybase -#1974 - Optimise various Executor.fetchOne() methods, which consume the whole - ResultSet before throwing an InvalidResultException -#1979 - Thread safety issue in org.jooq.impl.FieldList -#1982 - Change RenderNameStyle.UPPER, LOWER, AS_IS to quote literals if needed -#1992 - Bad reference to org.jooq.debug.[impl].DebugListener in the manual -#1993 - Bad code generated when the same table name exists in multiple schemas - in SQL Server -#1995 - Record.original() values aren't updated after a Record.store() operation -#1997 - Review the manual's tutorial for integrity -#2001 - Named Params are treated as null literals on right sides of comparisons -#2007 - Bad type coercion on the right hand side of a comparison predicate, when - the left hand side is Field -#2011 - Implement some micro-optimisations in DefaultRenderContext -#2025 - Correctly handle multiple foreign keys defined on the same column -#2045 - Bad hashCode calculation when Records contain arrays or byte[] -#2055 - MySQL's UPDATE [t1] JOIN [t2] syntax can cause syntax errors as column - references are not fully qualified -#2057 - Cannot properly extract bind values for LIMIT .. OFFSET clause from a - SELECT statement -#2063 - jOOQ-meta loads Firebird composite unique key columns in wrong order -#2073 - The code generator's flag doesn't affect Oracle - VARRAY and TABLE types -#2082 - Oracle PIVOT expression doesn't bind any variables of a derived table - being pivoted -#2085 - java.lang.NoSuchMethodError: org.apache.log4j.Logger.isTraceEnabled()Z - when logger dependency is missing -#2086 - SQL syntax error when aliasing outcome of a relational division -#2091 - CUBRID doesn't really have a NVARCHAR data type -#2098 - NullPointerException when org.jooq.impl.EnumConverter converts null -#2104 - SQLite code generation treats multi-column primary keys like multiple - single-column unique keys -#2108 - SQLite returns NULL for val(new Date(0)).add(-1) and some other date - time arithmetic expressions -#2128 - Misleading Javadoc in Factory / Executor.selectCount() -#2137 - Failure to assign a value to a record pojo for a column with a - composite type when using select into. -#2139 - batchStore with Postgres composite types incorrectly reuses values from - the first record. -#2140 - No table java mapping generated using maven plugin - missing inputSchema - in postgres -#2143 - UnsupportedOperationException when binding UDTRecord in batchStore() for - Oracle -#2144 - Improve AbstractField.equals() and AbstractTable.equals() and similar, - as these two are called very often -#2145 - Improve QueryPartList.removeNulls() as this is called very often -#2154 - Generated Records should access values by index, not by field, for - performance reasons -#2165 - Add H2 database definitions to the jOOQ-scala module (to prevent - compilation errors) -#2167 - Convert.convert("xx", boolean.class) returns null, instead of false -#2178 - Improve FieldList. Avoid creating excessive array lists, where simple - (immutable) Field[] are sufficient -#2180 - Optimise DAOImpl by using the new ReflectionMapper instead of calling - Record.into() all the time -#2187 - Change all Javadoc

tags to

(To fix Java 7 standard Javadoc - style layout issues) -#2210 - Executor.fetchFromCSV() shouldn't mark resulting records as "changed" -#2215 - Improve example in the "jOOQ for CRUD" section. Use only columns from - the sample database -#2223 - SQL injection is possible in org.jooq.impl.Val, if client code doesn't - correctly enforce generic typesafety, and bind variables are inlined -#2227 - Field.in(T...) doesn't convert argument values to the Field's type - -Version 2.6.0 - October 26, 2012 -================================================================================ - -This release has a new main feature: the type-safe support for row value -expressions also known as tuples - up to a degree of 8. The API is formed in a -similar way as pre-existing tuple support in languages like C# or Scala. - -jOOQ's Scala integration has also been improved through the new jOOQ-Scala -module, which provides some useful implicit defs for operator overloading. -Future versions of jOOQ-Scala may experiment with Scala 2.10's Macros - -This release also ships with a lot of new deprecation to help you prepare for -the upcoming major release. - -Minor feature improvements include: - -- Lots of new fetchGroups() and intoGroups() methods, thanks to Ivan Dugic -- JDBC execution control support, such as cancel(), maxRows(), queryTimeout() -- Allowing for re-using JDBC PreparedStatement between Query executions -- Support for the SQL standard OVERLAPS predicate -- A new RecordMapper, similar to the existing RecordHandler - -Features and improvements -------------------------- -#385 - Allow for keeping open statements in a Query -#600 - Add support for Oracle / SQL Standard linear regression functions -#1058 - Add Factory.row(T1, T2, .. TN) and Factory.row( - Field, Field ... Field) to allow for creating tuples / rows -#1077 - Add support for the SQL standard OVERLAPS predicate -#1245 - Improve formatting for DECIMAL data types in Result.format(). Nicely - align the decimal point and reserve space on both sides -#1484 - Let XJC-generated artefacts implement Cloneable -#1527 - Support for converting String to java.net.URL, java.net.URI, and - java.io.File -#1674 - Export data types with Result.formatXML() and Result.formatJSON() - exports -#1679 - Add Factory.table(String, QueryPart...) -#1708 - Add Map> ResultQuery.fetchGroups(Field, Class) -#1709 - Add Map> ResultQuery.fetchGroups(Field[]) -#1710 - Add Map> - ResultQuery.fetchGroups(Field[], Class) -#1719 - Make logic from ResultQuery.fetchArray() available in Result.intoArray() -#1728 - Add support for the MySQL COUNT(DISTINCT expr, expr...) aggregate - function syntax -#1744 - Add support for the CUBRID DECR() function -#1756 - Add RecordMapper, similar to RecordHandler, mapping records to - custom types -#1762 - Add package-info.java to add Javadoc documentation to all packages -#1766 - Simulate row comparisons where they are not supported -#1773 - Add a new jOOQ-Scala project and jooq-scala artefactId, to contain jOOQ - extensions in the Scala language -#1782 - Move JAXB bindings out of XSD, in order to support more advanced - bindings -#1783 - Generate @SuppressWarnings("all") in jOOQ-generated artefacts -#1784 - Enhance the BETWEEN predicate, introducing the AND keyword -#1810 - Add Map ResultQuery.fetchMap(Field, Class) and - Result.intoMap(Field, Class) -#1816 - Add support for materialized views in Oracle's code generator -#1828 - Reduce log level for Factory deserialisation to TRACE -#1837 - Add support for @java.beans.ConstructorProperties when fetching into - immutable POJOs -#1841 - Add SortField Field.sort(SortOrder) to allow for dynamic sorting -#1842 - Add Condition Field.compare(Comparator, Field) to allow for dynamic - comparisons -#1844 - Add Table Table.join(TableLike, JoinType) to allow for - dynamic joining -#1845 - Add Factory.schemaByName(String) for plain SQL schemata -#1848 - Add Record.changed() to indicate whether a Record contains "dirty" - values -#1849 - Add Record.original() to obtain the originally fetched values from a - Record -#1854 - Add ResultQuery.maxRows(int) to limit the number of actually fetched - records -#1855 - Add Query.cancel() to support for interrupting statements prematurely -#1856 - Add Query.queryTimeout(int) to support for JDBC's - Statement.setQueryTimeout() - -API changes (backwards-compatible) ----------------------------------- -#1800 - Deprecate AliasProvider -#1807 - Result.intoArray() declares "throws MappingException", which isn't true -#1839 - Deprecate the various Result.getValuesAs[Type] and - Record.getValueAs[Type] methods -#1840 - Deprecate org.jooq.Store -#1866 - Deprecate [Schema-Name]Factory, remove reference to it from the - tutorials -#1869 - Deprecate org.jooq.NamedQueryPart -#1870 - Deprecate org.jooq.NamedTypeProviderQueryPart -#1872 - Improve jOOQ's RenderContext pretty printing behaviour -#1881 - Deprecate ConditionProvider, OrderProvider, LockProvider types - -Bug fixes ---------- -#1593 - Factory.field("{1} + {0} + {0}", val(1), val(2)) doesn't work. Cannot - re-use / re-order placeholders -#1720 - Improve performance by using Record.getValue(int) instead of - Record.getValue(Field) internally, where more than one value is - retrieved from a record -#1751 - Result.intoResultSet() generates wrong ResultSetMetaData if runtime - schema mapping is applied -#1764 - Add missing @Support({ ... FIREBIRD ... }) annotations -#1768 - NullPointerException when DAO.fetchOne() returns no record -#1774 - QueryPart.toString() does not load default settings from classpath -#1786 - Fix SEQUENCE support for Firebird -#1791 - Log a table's input/output names, and PK name when generating code -#1792 - Factory.fieldByName() and tableByName() do not correctly escape quotes -#1797 - SQL syntax errors when plain SQL contains comments with question marks - and SQL is executed as StatementType.STATIC_STATEMENT -#1802 - Result.into(Table) doesn't work correctly, if the same field name - appears twice in Result -#1806 - Let Record.toString() wrap the record in a temporary Result and call - Result.toString() instead -#1819 - MappingException in Record.into(Class), when POJO setters have - applicable names but non-applicable argument types -#1820 - Cannot fetch into non-public POJO classes. Their members / getters / - setters should be made accessible -#1829 - Factory.execute(String) may cause errors when plain SQL returns results -#1830 - Allow for passing null or empty arrays to intoMap(Field[]) and - intoGroups(Field[]) -#1850 - Record.equals() returns true as soon as both records hold a "null" value - for a given field -#1860 - Bad Results returned from plain SQL "select *" queries, if several - selected columns share the same name -#1876 - NULL constraint violation when storing a copied record - -Version 2.5.0 - August 26, 2012 -================================================================================ - -Welcome to another great database integration in jOOQ: Firebird! This is one of -the more popular open source SQL databases out there, with a rich feature set, -including the SQL standard MERGE statement. - -Apart from this, the main new features are: - -- Optimistic locking. jOOQ's UpdatableRecord API transparently implements - optimistic locking on its store() and delete() methods. By default, the - in-memory record is compared with the one in the database at write time. But - you can also let jOOQ handle incremented VERSION or TIMESTAMP columns for you. -- Oracle feature increment. Many nice Oracle features are now supported: - user-defined aggregates, regular expressions, Oracle Text, CONNECT_BY_ROOT and - ORDER SIBLINGS BY clausess, partitioned outer joins and more -- jOOQ's convenience API has been greatly enhanced. This includes many improved - fetch methods and new short forms for equal=eq, notEqual=ne, greaterThan=gt, - etc. to better align jOOQ with JPA, XSL, QueryDSL and many other tools that - abbreviate these keywords -- Many types and methods have been deprecated to help you foresee the upcoming - changes in jOOQ 3.0 - -Please consider also the updated manual with its new, more user-friendly -structure - -Features and improvements -------------------------- -#430 - Add support for the Firebird database -#457 - Add support for Oracle user-defined AGGREGATE functions -#620 - Add support for the SQL:2008 standard LIKE_REGEX operator -#722 - Remove casting of bind values in Ingres -#727 - Simulate RPAD and LPAD in SQLite -#816 - Add support for Oracle Text functions -#1339 - Add option to generate immutable pojos -#1547 - Support "optimistic locking" in UpdatableRecord.store() and delete() -#1552 - Generate fetchBy[ColumnName] methods in generated DAO classes -#1553 - Add some Javadoc to document the difference between using a Factory with - a Connection or with a DataSource -#1556 - Add javax.validation API to full deliverable -#1565 - Add Factory.connectByRoot(Field) to support the Oracle - CONNECT_BY_ROOT pseudo column -#1570 - Add Factory.condition(String, QueryPart...) similar to - Factory.field(String, QueryPart...) -#1582 - Add support for Oracle's ORDER SIBLINGS BY clause, in combination with - CONNECT BY -#1586 - Add missing constructors taking DataSource to dialect-specific factories -#1587 - Generate missing constructors taking DataSource in schema-specific - factories -#1595 - Simulate REPEAT() in SQLite -#1596 - Add support for optimistic locking using generated information about - "timestamp" or "version" columns -#1627 - Handle NULL in CSV imports/exports -#1645 - Add support for Oracle's PARTITION BY clause in OUTER JOINs -#1657 - Reorganise the manual -#1664 - By default, activate in the code generator -#1665 - Add support for the empty GROUP BY () clause -#1675 - Add support for the SQL standard IS [NOT] DISTINCT FROM predicate -#1680 - Overload all plain SQL DSL methods to also accept QueryPart arguments -#1681 - Simulate empty GROUP BY () clause in Sybase ASE and Ingres, joining a - dummy table and grouping by a constant field -#1684 - Add Setting to indicate that fetched records shouldn't - be automatically "attached" -#1685 - Improve Javadoc of Attachable.attach(). Document how "detaching" works -#1688 - Add E Record.into(E) as a complement to E Record.into(Class) -#1692 - Replace Factory.executeInsert(), Factory.executeUpdate() and similar - methods with more succinct variants -#1696 - Add short versions of comparison predicate methods, such as eq, ne, gt, - ge, lt, le -#1698 - Add support for the SQL standard BETWEEN SYMMETRIC predicate -#1701 - Add Factory.not(Condition) as a synonym for Condition.not() -#1704 - Document the behaviour of Factory.newRecord(Table, Object) and - Record.from(Object) with respect to UpdatableRecord.store() -#1707 - Add Map> ResultQuery.fetchGroups(Field) and - Result.intoGroups(Field) -#1712 - Add > Result.sortAsc .sortDesc(Field) -#1713 - Add Result.sortAsc, .sortDesc(Field, Comparator) -#1714 - Add Result.sortAsc, .sortDesc(Comparator) -#1718 - Document usage of InvalidResultException on the ResultQuery.fetchXXX() - Javadocs -#1721 - Add Map> ResultQuery.fetchGroups(Field, Field) - and Result.intoGroups(Field, Field) -#1722 - ResultQuery.fetchArray(int) and .fetchArray(String) should return a - typed array, even if this cannot be checked by the compiler -#1723 - Add Factory.fetchLazy(ResultSet) - -API changes (backwards-compatible) ----------------------------------- -#1544 - Remove Attachable interface from QueryPart hierarchy -#1579 - Deprecate org.jooq.Type -#1580 - Deprecate org.jooq.SchemaProvider -#1638 - Deprecate org.jooq.ArrayRecord.createArray() -#1639 - Deprecate org.jooq.Adapter -#1687 - Let Cursor.fetchInto(Table) return Result instead of List -#1736 - Deprecate TableRecord.{store|refresh|delete}Using() methods as being - part of jOOQ's internal API -#1741 - Deprecate org.jooq.MasterDataType - -Bug fixes ---------- -#1572 - Use Thread.currentThread().getContextClassLoader() to load - ExecuteListener classes as a workaround for experienced class loading - problems when using OSGi -#1584 - Code generation error with Oracle UDT static functions -#1632 - Improve the performance of various DefaultRenderContext methods, by - locally caching Settings values -#1633 - Improve the performance of CursorImpl.CursorIterator by setting Record - values by index rather than by Field -#1635 - Improve the performance of Factory.fetch(ResultSet) by caching data type - normalisation regex in FieldTypeHelper -#1650 - jOOR Fix #16: Can't call Reflect.create(A, B, null) -#1660 - Factory.renderContext().castMode(CastMode.NEVER).render(query) doesn't - work. CastMode is not applied -#1667 - Bad variable binding when NULLS FIRST, NULLS LAST is simulated in SQL - Server and other databases -#1673 - Result.formatXML() and Result.intoXML() do not render namespaces - correctly -#1683 - Oracle code generation regression for 10g. No such column - ALL_PROCEDURES.OBJECT_ID -#1693 - Cannot bind UDT values from other schemata to stored procedures -#1730 - Compilation errors in SQLite generated code when flag - is set to true - -Version 2.4.0 - July 8, 2012 -================================================================================ - -This release's main new feature is jOOQ's added convenience in -Factory initialisation for those users who get their database -connectivity through JDBC DataSources. If supplied with a -DataSource, a jOOQ Factory will handle the Connection lifecycle -internally, closing the Connection when no longer needed. - -The H2 MERGE statement syntax is now supported and simulated in -other databases, for those users that prefer its more intuitive -syntax over the SQL standard. - -The code generator now also allows for generating interfaces and -DAOs per table. DAO generation was previous discussed on the user -group and seen in a competitor product called OneWebSQL. - -The jOOQ Console now supports breakpoints for even more effective -SQL development - -Features and improvements -------------------------- -#1141 - Add Result.intoResultSet() to wrap a Result in a JDBC - ResultSet -#1253 - Avoid JDBC escape syntax for date/time literals -#1280 - Generate DAO classes and interfaces for POJOs -#1404 - Document the lifecycle of an ExecuteListener in the - Javadoc -#1411 - Add support for Postgres "any" data type (with quotes!). - This seems to map well to java.lang.Object -#1418 - Support case-insensitive schema names in code generation -#1419 - Add some WARN-level logging when the source-code - generator doesn't generate any artefacts -#1423 - Add Field.likeIgnoreCase() to support Postgres' ILIKE - operator -#1424 - Add Factory(DataSource) and similar constructors -#1427 - Add Factory.batchStore(Collection>) for convenience -#1428 - Add DataType.convert(Object...) and - DataType.convert(Collection) for convenience -#1431 - Add org.jooq.Name Factory.name(String) to contruct - QueryParts that are escaped according to - Settings.getRenderNameStyle() -#1432 - Add Factory.fetch(String, QueryPart...) and - Factory.execute(String, QueryPart...) and similar methods - to support arbitrary QueryParts in plain SQL -#1434 - Add UniqueKeyDefinition.isPrimaryKey() for completeness -#1438 - Add Result Factory.fetchFromCSV(String) -#1440 - Add top-level pom.xml for jooq-parent artefact (GitHub - Issue #14) -#1446 - Converting arbitrary strings to Number / Date should - return null, instead of throwing an exception -#1449 - Generate some meaningful Javadoc into the generated - [schema-name]Factory classes -#1454 - Add line breaks to generated Javadoc where appropriate -#1463 - Add option to let generated Record / POJO objects - implement a common generated interface -#1470 - Support interface types in ResultQuery.fetchInto(Class), - Result.into(Class), and Record.into(Class) methods, - returning a proxy -#1471 - Upgrade internal jOOR dependency to jOOR 0.9.4 -#1473 - Add IdentityDefinition to jooq-meta -#1501 - Add support for conversion of String to - java.sql.{Date, Time, Timestamp}. GitHub issue #22 -#1504 - Document behaviour of fetch() and fetchOne() in case jOOQ - cannot fetch actual records -#1509 - Minor improvements in the generator source code. GitHub - pull request #23 -#1510 - Generate additional setters for foreign keys, accepting - records as arguments -#1521 - Expose Connection methods, such as commit(), rollback() - and similar transaction-related methods in Factory -#1523 - Support ROW_NUMBER() OVER() for the latest version of - Derby and H2, which support it -#1524 - Simulate ROW_NUMBER() OVER() in HSQLDB using ROWNUM() -#1528 - Let generated interfaces extend Serializable -#1532 - Clarify the lifecycle of Configuration.data in the - Javadoc -#1534 - Generate more meaningful Javadoc where "an uncommented - item" stands now -#1536 - Add documentation to the FOR UPDATE OF clause, indicating - that DB2 may have stricter requirements regarding - updatability of fields -#1541 - Add support for the H2 MERGE syntax - GitHub Issue #18 -#1542 - Simulate the H2 MERGE syntax in other dialects supporting - the SQL standard MERGE statement - GitHub Issue #18 -#1545 - Website and Documentation anchors should be links to - themselves, visually recognisable - -Features and improvements (jOOQ Console) ----------------------------------------- -#1398 - Allow for adding breakpoints in jOOQ Console - -API changes (backwards-compatible) ----------------------------------- -#1408 - Relax bounds of in Factory.truncate() to Record, - instead of TableRecord -#1429 - Change Convert.convert(List, XXX) to accept Collection - instead of List - -Bug fixes ---------- -#1020 - Improve Oracle's LIMIT .. OFFSET clause simulation. - GitHub Issue #16 -#1358 - Compilation errors in generated source code when Oracle - overloaded procedures collide with procedures that end - with numbers -#1437 - Error in Javadoc of FactoryOperations.fetchOne(). This - method may return null -#1441 - Performance issue with AbstractDataType.convert(Object). - Avoid conversions when they're obviously unneeded -#1448 - Handle String to Enum conversion (when Java Enums are - stored as Strings in the database) - GitHub issue #15 -#1459 - Generated Keys.java static class too large (static - initialiser can become bigger than 64kb) -#1460 - Table.getReferencesTo(Table) doesn't work correctly for - aliased tables -#1461 - Exception when rendering of {fn datetimeadd(...)} for - HSQLDB and Derby -#1462 - Document missing GeneratorStrategy features, such as - getJavaClassImplements() -#1465 - Custom generator strategy's printImplements() is called - with Mode == RECORD for tables -#1478 - Caching SQLDialect in AbstractDatabase heavily improves - code generation performance -#1483 - Inefficient cloning of default settings using JAXB - unmarshalling leads to non-negligible overall overhead. - Use serialisation instead (short of a useful XJC clone - plugin) -#1489 - Fix manual where it claims to throw SQLExceptions -#1490 - Compilation error when a SQL Server stored procedure has - a parameter named "value" -#1493 - Bad syntax for SELECT /*+hint*/ DISTINCT ... in Oracle -#1498 - jOOQ does not compile using JDK 7 / JDBC 4.1. GitHub - Issue #24 -#1499 - Generated members of Tables.java are not final -#1505 - Bad exception message when ON DUPLICATE KEY IGNORE cannot - be simulated -#1515 - Splitting of large NOT IN conditions is wrong. The parts - should be connected with AND, not with OR -#1522 - fetch().into(Table) doesn't initialise records correctly, - such that subsequent calls to store() will execute an - INSERT, rather than an UPDATE -#1525 - Generate missing Javadoc to getters for procedure OUT - parameters -#1529 - Factory.batchStore() logs all single statements to DEBUG - output. Find a more accurate log output -#1537 - Factory.batchStore() renders bad SQL for Postgres. The - RETURNING clause is not allowed in batch INSERTs - -Version 2.3.1 - May 11, 2012 -================================================================================ -This is an important patch release fixing some regressions in the -code generator for the Postgres dialect. With 2.3.0, it was no -longer possible to generate schemata of which the database user -was not the owner. - -Bug fixes ---------- -#1334 - Fix inaccurate simulation of TRUNC(number, decimals) for - Derby -#1403 - Documentation bug: ctx.statement() can be replaced in - executeStart(). This is not documented -#1406 - Compilation errors in generated source code when Postgres - stored procedure parameter is called "NAME" -#1407 - Compilation errors in generated source code when Postgres - data-type is "any" (with quotes!) -#1409 - Postgres code generation broken when not connecting with - the owner of a schema - -Version 2.3.0 - May 6, 2012 -================================================================================ - -This is a minor feature increment release, featuring many useful -API enhancements, some new functions, some new syntax support -elements, improved source code generation and a lot of -improvements on the jOOQ Console, thanks to Christopher Deckers. - -The updated jOOQ Console now allows for filtering incoming -statements directly on the server side, using regular expression -filters on statement text and other features. These improvements -are a part of a general strategy to introduce breakpoints and -more sophisticated debugging capability to the jOOQ Console. - -Features and improvements -------------------------- -#597 - Add support for Oracle KEEP (DENSE_RANK FIRST...) - aggregate function clause -#910 - Add ExecuteListener extension to allow for overriding - exception translator to handle vendor-specific error - codes -#1286 - Add "renderSchema" flag to Settings, to completely - disable rendering of schema names -#1293 - Generate setter methods for JAXB annotated configuration - properties -#1295 - Add support for MySQL's INSERT IGNORE clause -#1296 - Simulate the FOR UPDATE clause for SQL Server, CUBRID, - using JDBC's ResultSet.CONCUR_UPDATABLE -#1302 - Add Factory.inline() to allow for flagging inline-only - "bind values" -#1303 - Add connection-less Factory constructors for convenience, - when jOOQ is only used as a SQL query builder -#1304 - Add option to generate JSR-303 @NotNull and @Size - annotations to generated POJO's -#1307 - Let HSQLDB dialect render NVL2() as NVL2() instead of - CASE expression -#1312 - Allow for omitting , and generate all - available schemata in that case -#1315 - Let generated factories use their associated Schema as - the Settings' RenderMapping's defaultSchema -#1319 - Move jooq-spring's FactoryProxy to the core jooq project -#1322 - Add Factory.dateAdd() and timestampAdd() for convenience -#1327 - Add DataType.isLob() -#1328 - Add Field inline(char), inline(Character), - inline(CharSequence) for convenience -#1333 - Add support for the Oracle TRUNC function, for numeric - arithmetic -#1336 - Let Record.into(Class) and similar methods accept - "immutable" classes, i.e. setter-less classes that take - several constructor arguments -#1340 - Use Constructor.setAccessible(true), if no default - constructor is available on the target type of - Record.into(Class) -#1342 - Improve Javadoc on Factory.function(). Document arguments -#1349 - Add support for the CUBRID Click-Counter INCR() -#1352 - Allow for creating syntax-error and SQL-injection safe - qualifiers for org.jooq.Field and org.jooq.Table -#1361 - Add Factory.batchStore(TableRecord...), to allow for - batch UPDATE/INSERTs of many records -#1367 - Make configured ExecuteListeners default constructors - accessible -#1366 - Let org.jooq.Batch extend Serializable -#1378 - Upgrade internal jOOR dependency to jOOR 0.9.3 -#1379 - Upgrade internal jOOU dependency to jOOU 0.9.1 -#1390 - Add RenderContext.qualify() to indicate whether - QueryParts should render qualified versions of themselves - or not - -Features and improvements (jOOQ Console) ----------------------------------------- -#1242 - Upgrade jOOQ Console dependency on RSyntaxTextArea from - 1.5 to 2.0.2 -#1249 - Allow for filtering incoming statements in jOOQ Console -#1393 - Implement a communication protocol between Console server - types and Console client types to allow for more - sophisticated functionality - -API changes (backwards-compatible) ----------------------------------- -#1310 - Deprecate Factory.literal() in favor of Factory.inline(), - and Factory.field() -#1368 - Promote AbstractQuery.isExecutable() to the public API - -Bug fixes ---------- -#989 - INSERT and UPDATE statements always render non-qualified, - escaped field names. This may cause trouble when using - plain SQL fields -#1109 - Standalone TABLE or VARRAY types are not correctly - initialised before referencing tables load them -#1279 - NullPointerException when leaving empty -#1283 - The LIKE escape character needs escaping, too, in - contains(), startsWith(), endsWith() -#1306 - Add missing INTERVAL data types to HSQLDBDataType -#1308 - Oracle's DataTypeDefinition reports the length of a BLOB - / CLOB data type to be 4000 -#1313 - and match only table names, not - fully qualified names -#1323 - Add support for byte[] in Postgres UDTs -#1324 - Code generation error in Oracle 10g when generating - stored procedures -#1326 - Error when deserialising BLOBs from Oracle UDTs -#1329 - NullPointerException when passing null to - timestampDiff(Field, Field) -#1343 - Regression in insertInto(...).values(...). Cannot pass - Field to values() -#1344 - Initialise Result ArrayLists to their expected size, if - that size is known. -#1360 - jOOR issue 12: "Don't reset the accessible flag to false, - if setting it to true is required, to avoid race - conditions in concurrency contexts" -#1371 - Missing conversion when using unsafe Field types in - BATCH statements -#1376 - Oracle UDTs in REF CURSORs are not deserialised correctly - from procedure OUT parameters -#1377 - Oracle UDTs are not deserialised correctly when the same - UDT name is present in multiple schemata -#1394 - NullPointerException when omitting element in - code generation configuration - -Version 2.2.1 - April 12, 2012 -================================================================================ - -This is a minor patch release, fixing some issues related to the -code generation of the new CUBRID integration as well as other, -minor issues. Upgrade if you're using CUBRID - -Bug fixes ---------- -#1287 - Remove oracle.sql dependency also from OSGi information - in pom.xml -#1288 - SQL syntax errors from sequences when using RenderMapping - with defaultSchema -#1289 - DefaultBindContext logs as Util.class -#1297 - Compilation error in CUBRID generated artefacts - referencing OBJECT types -#1298 - Avoid source code generation errors when generating code - for unknown, dialect-specific data types - -Version 2.2.0 - April 09, 2012 -================================================================================ - -Finally, jOOQ has added support for another database, and a very -promising one, that is. http://www.cubrid.org is a surprisingly -original mixture of a relational and object-oriented database -where tables and classes are synonyms, so are records and -instances. The CUBRID database has a high level of compatibility -with MySQL and is aimed at MySQL users wanting more performance -for their web applications. For details, see the slides here: - -http://www.slideshare.net/cubrid/growing-in-the-wild-the-story-by-cubrid-database-developers - -jOOQ is proud to have become a CUBRID partner, looking forward -to further cooperation with CUBRID in the near future. - -Apart from that, jOOQ now fully supports SQL standard INTERVAL -data types. With JDBC and JPA lacking official support for this, -jOOQ aims for becoming the tool of choice for vendor-specific -date time arithmetic. True INTERVAL data type support is given in -HSQLDB, Ingres, Oracle, Postgres databases. Besides that, CUBRID -and MySQL support INTERVAL data type arguments in functions. In -other dialects, jOOQ simulates DATEADD(), TIMESTAMPADD(), -DATEDIFF(), TIMESTAMPDIFF(). - -For jOOQ's OLAP friends, there is now also support for the Oracle -LISTAGG function (LIST() in Sybase, XMLAGG() in DB2, STRING_AGG() -in Postgres, GROUP_CONCAT() in CUBRID, H2, HSQLDB, MySQL). -LISTAGG is an "ordered aggregate function", meaning that the -aggregation is done using a specific ordering. Keep an eye out -for more such function support in future versions. - -Features and improvements -------------------------- -#566 - Add support for INTERVAL data types -#585 - Add support for DATE, TIME and INTERVAL arithmetic -#1183 - Add support for DEFAULT values in Oracle stored procedure - parameters -#1243 - Let generated POJOs (and Records) extend base classes - and implement interfaces -#1252 - Avoid JDBC escape syntax for Oracle stored procedure - calls. Generate PL/SQL syntax, instead -#1255 - Let generated Tables contain a public default constructor - to be able to extend those classes - Github issue #12 -#1257 - Add CUBRID support -#1268 - Add Factory.field(String, QueryPart...) to generate - custom clauses -#1269 - Add YEAR(), MONTH(), DAY(), HOUR(), MINUTE(), SECOND() - function support as shortcuts for EXTRACT() -#1273 - Simulate GROUP_CONCAT() aggregate function using Oracle's - LISTAGG() function, where available -#1274 - Add support for the Oracle LISTAGG(...) WITHIN GROUP - (ORDER BY ..) [ OVER (..) ] aggregate / analytic function -#1275 - Simulate Sybase LIST() aggregate function using Oracle's - LISTAGG() function -#1276 - Simulate Oracle's LISTAGG() in DB2 using XMLAGG(), - SUBSTR() and CONCAT() -#1278 - DEBUG log both executed SQL and SQL with inlined bind - values - -API changes (backwards-compatible) ----------------------------------- -#1262 - Pull up OracleFactory.prior() and other CONNECT BY - related methods to Factory - -Bug fixes ---------- -#1241 - Wrong variable binding when comparing CHAR columns in - Derby and DB2 without explicit casting to VARCHAR -#1244 - Cannot override class name in GeneratorStrategy in - Mode.POJO -#1248 - Setting both false and - true leads to compilation errors -#1256 - Fixed code generation issue with H2 user defined - functions returning VARCHAR -#1263 - Pass fetchsizes <= 0 to the JDBC driver (for vendor- - specific MySQL compatibility) -#1270 - Most databases allow for multiple identical foreign keys. - This leads to compilation errors in generated source code - -Version 2.1.0 - March 18, 2012 -================================================================================ - -With this version, jOOQ attempts to follow versioning rules -imposed by semantic versioning: http://semver.org/ -There will be 1 minor release per month, and a couple of patch -releases per year, depending on popular demand - -The main improvements for this release include - -- The possibility of providing jOOQ with a custom type mapping. - You can now define your own Converter types that are used by - jOOQ to map a database's SQLDataTypes to your custom types. - This is particularly useful for Java's enums. Read more about - custom converters in the manual: - http://www.jooq.org/manual/ADVANCED/CustomTypes/ - -- There are a lot of new runtime configuration options to control - the SQL style of SQL rendered by jOOQ. You can now specify - whether table/column names should be quoted / capitalised / - lower-cased, whether SQL keywords should be capitalised or not, - etc... - -- The handling of NULL has been improved in favour of using jOOQ - as a SQL builder library (e.g. along with Spring for execution) - NULL is no longer inlined, but bound as a variable. - -- jOOQ now supports simulation of the relational division - operation using an intuitive syntax. Read more about the - relational division here: - http://en.wikipedia.org/wiki/Relational_algebra#Division - -Features and improvements -------------------------- -#161 - Add runtime configuration to pretty print rendered SQL -#349 - Add SQLite relations support -#491 - Add runtime configuration for SQL keyword style (upper - case, lower case) -#521 - Add runtime configuration for SQL reference style (upper - case, lower case, as-is, quoted) -#1150 - Add code generation option to disable generation of - records -#1181 - Add support for SQL Server data types timestamp and - rowversion -#1188 - Load default Settings from the classpath at - /jooq-settings.xml, or from -Dorg.jooq.settings -#1193 - Specify main-class in jOOQ Console's manifest.mf and - include dependency in jar file -#1194 - Add ColumnDefinition.isNullable() -#1202 - Add support for the relational division operation: - A.divideBy(B).on(A.ID.equal(B.A_ID)).returning(A.X, ...) -#1207 - Add Factory.batch(Collection) for - convenience -#1208 - Render @javax.persistence.Column(nullable = false) - property, if available -#1209 - Render @javax.persistence.Column(length, precision, - scale) properties, if available -#1215 - Add org.jooq.Converter for custom type mapping -#1216 - Overload Record, Result.getValue() and .setValue() - methods to accept a Converter -#1217 - Add EnumConverter as a base type for custom enum - converters -#1218 - Add code generation options to generate - referencing a Java type and a Converter -#1224 - Add DataTypeDefinition.getLength() to jooq-meta's type - system -#1233 - Support custom JDBC properties for jooq-codegen -#1234 - Add Database.getTable(SchemaDefinition, String, boolean) - to fetch tables case-insensitively -#1239 - Add Factory.fetchLazy(String, Object...) - -API changes (backwards-compatible) ----------------------------------- -#1191 - Deprecate ConfigurationRegistry and replace by equivalent - ExecuteListener feature -#1219 - API Bug: Cannot use LIMIT .. OFFSET along with FOR UPDATE - -Bug fixes ---------- -#625 - Remove dependency from generated Routines to the - generator's SQLDialect -#1128 - NULL is inlined in INSERT statement instead of binding it - as a variable. This can cause issues when using jOOQ with - Spring -#1137 - Exclude MySQL column-level enum types when that column is - overridden by a -#1158 - Derby cannot handle inlined NULL literals in some - contexts -#1180 - Execute BatchMultiple (multi-query batch query), when - executing BatchSimple (single-query, multi-bind-value - query) with StatementType == STATIC_STATEMENT -#1189 - TableMapping regression for SQLite database -#1190 - Cannot store SQLite records when using - StatementType.STATIC_STATEMENT -#1199 - Table.getFields() returns an internal representation of a - table's field list. Make generated tables immutable! -#1200 - Internal API leak exposed through covariance in - AbstractType.getFields() -#1211 - Enforce method name disambiguation also when using custom - strategies in jooq-codegen -#1212 - Enforce identifier disambiguation also when using custom - strategies in jooq-codegen -#1221 - Incorrect ExecuteListener invocation for INSERT .. - RETURNING. executeStart() and executeEnd() are omitted -#1223 - Cache ExecuteListener classes for performance -#1225 - Bind NULL byte[] as java.sql.Types.BINARY instead of - BLOB in Postgres, to avoid errors -#1226 - Bind NULL UDTs with their associated type name in Oracle -#1232 - SQLException when Factory.fetch() does not return a - ResultSet -#1237 - Don't generate enum classes for columns in MySQL tables - that are excluded from code generation - -Version 2.0.5 - February 26, 2012 -================================================================================ - -This release finally introduced basic runtime configuration -features for the jOOQ Factory. This configuration now includes: - -- Execute listener and SQL tracing support. jOOQ allows you to - hook your own listeners into jOOQ's query execution engine to - be notified of all sorts of events -- The existing SchemaMapping features. They are now part of the - runtime configuration -- StatementType settings. Specify whether a Factory should - execute java.sql.PreparedStatements (with bind variables) or - static java.sql.Statements with inlined variables. - -The runtime configuration is documented here: - -http://www.jooq.org/manual/JOOQ/Factory/ - -The listener and tracing support has been requested by -Christopher Deckers, a new jOOQ user who has had the courtesy to -contribute the new jOOQ Console, which is documented here: - -http://www.jooq.org/manual/ADVANCED/ExecuteListener/ - -Apart from that, another long-requested feature is now fully -implemented: The GeneratorStrategy, allowing for custom naming -strategies in generated source code. This will allow for -generating custom table / record class name prefixes / suffixes, -as well as overriding the default behaviour for rendering UPPER, -lower and CamelCase artefacts. See the manual for details: - -http://www.jooq.org/manual/META/Configuration/ - -Features and improvements -------------------------- -#93 - Add Field.equalIgnoreCase(), Field.notEqualIgnoreCase() -#408 - Add class prefixes, suffixes and other options to the - code generator -#492 - Add runtime configuration -#1107 - Let Field.contains() support the Postgres ARRAY @> ARRAY - operator -#1140 - Add ResultQuery.fetchResultSet() to return the underlying - JDBC result set -#1143 - Add Result.isNotEmpty() for convenience -#1145 - Add runtime configuration to specify whether jOOQ should - execute java.sql.PreparedStatement (with bind variables) - or a java.sql.Statement (with inlined parameters) -#1146 - Add Query.getSQL(boolean) to indicate that bind values - should be inlined (as a convenience for - Factory.renderInlined(QueryPart)) -#1148 - Add Cursor.resultSet() to expose the underlying ResultSet -#1149 - Allow for optional - "http://www.jooq.org/xsd/jooq-codegen-2.0.4.xsd" - namespace in jooq-codegen configuration -#1152 - Add & org.jooq.EnumType> - E MySQLFactory.enumType(Class, int) for enum reverse - lookups of MySQL-specific enums -#1159 - Support matching numbers with LIKE, e.g. ID LIKE '%33%' -#1160 - Implement Field.contains(), .startsWith(), .endsWith() - for numeric values, too -#1161 - Use reflection to remove compile-time dependency on - ojdbc for creating ARRAYs -#1162 - Integrate jOOR into jOOQ for simpler reflection -#1164 - Distinguish between Definition.getInputName(), - .getOutputName() -#1165 - Add constraint name to generated javadoc -#1167 - Trivial issue with org.jooq.Factory.exists Javadoc - - GitHub issue #10 -#1169 - Add Configuration.setData(), getData() to convey custom - data in a configuration's lifecycle -#1172 - Add runtime configuration to deactivate JooqLogger -#1177 - Add jOOQ-Console module to jOOQ -#1184 - Add DataType.isArray() - -API changes (backwards-compatible) ----------------------------------- -#1142 - Rename Result.exportXML() to Result.intoXML() to stay - more consistent -#1151 - Deprecate SchemaMapping in favour of new runtime - configuration - -Bug fixes ---------- -#978 - Schema.getTables() and similar methods return empty lists - when Schema is mapped with SchemaMapping -#1153 - Bad inlining of booleans in Sybase ASE / DB2 / Oracle - SQL Server / SQLite -#1154 - Bad inlining of byte[] in most dialects -#1155 - byte[] are erroneously converted to String when using - Record.intoArray() -#1156 - Bad inlining of DATE / TIME / TIMESTAMP data types in - Ingres (and other dialects, when the setting differs from - the default) -#1166 - Some generated Javadoc uses naming strategy or plain - output name, instead of qualified output name -#1168 - Oracle packages are generated as static, instead of - static final -#1175 - Factory.use() seems to render SQL with the Schema name - still present -#1179 - Oracle-generated ArrayRecords need a reference to - org.jooq.Schema to read TABLE of OBJECT from stored - procedures - -Test cases ----------- -#1147 - Add integration tests for executing SQL generated using - Factory.renderInlined() - -Version 2.0.4 - February 12, 2012 -================================================================================ - -This release introduced many improvements to source code -generation. These improvements include: - -- Maven and standalone code generation now use the same XML - configuration, which is read by jOOQ-codegen using JAXB. This - allows for more complex configuration elements in the future -- jOOQ-codegen can now handle multi-schema databases and generate - code for tables referencing tables from other schemata. This - is integration tested against the SQL Server AdventureWorks - database -- jOOQ now allows to generate simple POJOs in addition to Records - and to annotate both POJOs and Records with JPA annotations - such as @Entity, @Table, @Id, @Column, @UniqueConstraint, etc. - -You can migrate your existing .properties configuration by running -> org.jooq.util.GenerationTool /your.properties migrate - -Besides that, there is a lot of ongoing work to improve the -integration of Oracle's TABLE and VARRAY types. - -Features and improvements -------------------------- -#8 - Add JPA annotations to generated POJOs / Records -#282 - Add support for multi-schema databases -#287 - Add support for Oracle TABLE types -#395 - Use XML configuration file instead of properties file -#1089 - Add Field.contains(), .startsWith(), .endsWith() as a - convenience for Field.like() (including escaping) -#1092 - Move master data table configuration from - generator.generate to generator.database namespace -#1093 - Add support for generator.strategy in Maven source code - generation -#1094 - Add support for generator.database.date-as-timestamp in - Maven source code generation -#1095 - Move generator.generate.unsigned-types to - generator.database namespace -#1096 - Add support for generator.generate.unsigned-types in - Maven source code generation -#1103 - Add support for SQL Server data type uniqueidentifier -#1106 - Add Factory.escape(Field, char) for use with LIKE -#1108 - Add support for multi-schema databases using Maven code - generation -#1115 - Add support for Oracle VARRAY/TABLE of OBJECT types -#1127 - Add support for POJO classes generation -#1129 - Allow for using Param in LIMIT .. OFFSET clauses -#1132 - Add RenderContext.castMode() to allow for avoiding casts - where this is not really needed -#1136 - Add generation option to enable/disable generating - navigation methods - -Bug fixes ---------- -#1099 - Derby generated artefacts are not sorted alphabetically -#1101 - Internal API leak exposed through covariance in - AbstractTable.joinXXX() methods -#1110 - VARRAY element type information is lost when unnesting - VARRAY's in Oracle -#1111 - VARRAY element type information is lost when unnesting - VARRAY's returned from functions in Oracle -#1114 - Syntax error when unnesting TABLE of OBJECT in Oracle. - The unnested table contains several columns but jOOQ only - unnests "COLUMN_VALUE" -#1117 - NullPointerException when passing an ArrayRecord - containing a null array to a stored function in Oracle -#1125 - Postgres needs casting for date time data types in - queries like SELECT ? FROM DUAL -#1131 - DB2: [Noauthorized routine named "LIKE" of type - "FUNCTION" having compatible arguments was found] when - using Field.like(concat(x, y)) -#1133 - Compilation errors in generated source code if the same - constraint name exists in several schemata -#1134 - NullPointerException in code generation when a foreign - key constraint references a table from another schema - that is not being generated -#1135 - Generated Javadoc references inputSchema instead of - outputSchema - -Test cases ----------- -#1009 - Add more integration tests for proper handling of - java.sql.Date, Time, Timestamp -#1090 - Run jOOQ tests against AdventureWorks SQL Server sample - database -#1105 - Add integration tests for multi-schema source code - generation and querying -#1122 - The 10k lines of integration test code are too heavy for - the compiler. Create test modules with fewer lines of - code, each. - -Version 2.0.3 - January 29, 2012 -================================================================================ - -This release focuses on increased compatibility between various -SQL dialect integrations as far as ARRAY and JOIN support is -concerned: - -- ARRAY types are only available in H2, HSQLDB, Oracle, Postgres. - Nevertheless, they can be somewhat simulated in other dialects - using nested selects with UNION ALL. Increased compatibility - leads to a nicer API, where ARRAYs are used along with ALL/ANY - quantifiers, for instance. - -- JOIN syntaxes can be quite powerful in SQL. Apart from - simulating NATURAL JOIN, JOIN USING clauses, as well as a - synthetic "KEY JOIN" syntax, jOOQ now also supports nesting - JOIN expressions to create more complex table sources. See a - recent blog post on the subject here: - -http://blog.jooq.org/2012/01/15/lets-revise-the-sql-from-clause/ - -Features and improvements -------------------------- -#578 - Add KEY JOIN syntax to simulate joining using generated - foreign keys -#577 - Simulate NATURAL JOIN syntax, where this is unavailable -#582 - Simulate JOIN USING syntax, where this is unavailable -#671 - Allow for nesting JOIN clauses -#676 - Add Table.join() methods to create more flexible table - sources -#993 - Add Field.equalAny(T[]), .equalAny(Field) methods -#1048 - Simulate (array) syntax for dialects - that do not support arrays -#1051 - Add Factory.execute(String, Object...) as a convenience - method for Factory.query(...).execute() -#1055 - Simulate Factory.table(Object[]) and table(List) using - UNION ALL in dialects that do not support arrays -#1060 - Improve debug logging of H2 arrays. The syntax is not - ARRAY[1, 2], but (1, 2) -#1065 - Add OracleFactory.sysContext(String, String) to support - Oracle's SYS_CONTEXT function -#1069 - Add support for INSERT INTO table(field1, field2, ...) - SELECT syntax - as opposed to the existing INSERT INTO - table SELECT -#1072 - Add support for LIKE .. ESCAPE .. syntax -#1074 - Add Field.notBetween(T, T) for convenience -#1080 - Add support for JDBC's Statement.setFetchSize() in - ResultQuery.fetchLazy() -#1082 - Add some more DEBUG logging in AbstractResultQuery - -API changes (backwards-compatible) ----------------------------------- -#1059 - Change SelectFromStep.from(Collection>) to - from(Collection>) - -API changes (backwards-incompatible) ------------------------------------- -#1087 - Change the NTILE function to return Field - instead of Field - -Bug fixes ---------- -#1071 - Make Sequence Serializable -#1081 - Derby error in NULL handling when simulating unnested - arrays that contain NULL values -#1084 - Bind index mismatch in val(null).equal(null) and in - val(null).notEqual(null) -#1091 - Add missing @Support annotations on Table.crossJoin() - methods - -Test cases ----------- -#1026 - Add integration tests for NTILE window function and - document compatibility -#1073 - Add integration tests for NOT IN queries holding NULL - arguments - -Version 2.0.2 - January 8, 2012 -================================================================================ - -This is a maintenance release for jOOQ 2.0. The main improvements -include - -- The whole jOOQ API is now annotated with a new org.jooq.Support - annotation to help you assess whether a certain SQL clause is - available in your database or not. This is particularly useful - when your application should support several databases at once - (e.g. MySQL, Postgres, Oracle) -- The Oracle PIVOT clause is now formally supported for advanced - statistical queries in Oracle. This clause will be simulated in - other dialects in the future. -- The DATE data type can be mapped to TIMESTAMP. This important - when you query a legacy Oracle database, where DATE columns - can also contain time information -- Several convenience methods have been added for more fluent - syntax, when using plain SQL result queries, subqueries as - tables, or when unnesting arrays in ANY() and ALL() quantifiers - -Further type mapping support is still experimental. An official -cooperation with MinuteProject for source code generation is -being analysed. With MinuteProject, many source code generation -issues could be addressed centrally, as MinuteProject specialises -in source code generation: - -http://minuteproject.wikispaces.com/ - -Features and improvements -------------------------- -#595 - Add support for Oracle's PIVOT clause -#869 - Add support for using ANY, ALL with arrays, not just with - subselects -#1007 - Formally document the API methods to indicate whether - something is supported by any given SQL dialect -#1011 - Add code generation configuration parameter to avoid - generating @Generated annotation -#1019 - Render LIMIT x OFFSET y also for MySQL, instead of - LIMIT y, x -#1022 - Add missing Sybase ASE implementation for Factory.use() -#1024 - Add Factory.resultQuery(String, Object...) to allow for - arbitrary execution modes of plain SQL queries (lazy, - later, into, array, etc) -#1025 - Add missing SQLite implementation for Factory.deg() and - Factory.rad() -#1033 - Generate table comments into generated Tables.java as - Javadoc -#1040 - Add Object[][] Result.intoArray() and - Object[] Record.intoArray() for convenience. Let - E Record.into(Class) also support array types. -#1041 - Add Table Factory.table(Select) convenience - method for more fluency -#1042 - Add support for DISTINCT keyword in SUM, AVG, MIN, MAX - aggregate functions -#1046 - Generate Ingres table and column comments in generated - source code (only Ingres 10) - -API changes (backwards-compatible) ----------------------------------- -#1050 - Deprecate usage of SOME quantifier in predicates, such as - equalSome() - -API changes (backwards-incompatible) ------------------------------------- -#1036 - Fixed API typo in - WindowsRowsStep.rowsBetweenUnboundedFollwing() -#1037 - The fluent API allows for JOIN clauses without FROM - clause - -Bug fixes ---------- -#1010 - The MERGE INTO .. WHEN NOT MATCHED THEN INSERT .. syntax - may cause type-safety issues in some databases. VALUES - should be converted before binding -#1014 - FindBugs: Latent risk of infinite recursion due to typo - in QueryPartList.retainAll(); -#1015 - FindBugs: 7 occurrences of "Bad attempt to compute - absolute value of signed 32-bit hashcode". In extreme - cases, this could lead to SQL syntax errors -#1016 - The Oracle CONNECT BY cond1 AND cond2 syntax erroneously - creates a WHERE cond2 CONNECT BY cond1 statement -#1028 - Syntax errors when using untyped param() in HSQLDB (and - other strongly typed dialects) -#1029 - Postgres can't bind NULL values in cases, where bind type - is Object.class and bind value was created with - Factory.param() -#1030 - UnsupportedOperationException when calling - Query.bind(int, Object) on a query containing plain SQL - fields -#1031 - Incorrect debug logging when plain SQL QueryParts like - field("?") bind null values -#1032 - Incorrect debug logging when plain SQL QueryParts contain - String literals, such as 'Hello? Anyobody out there?' -#1047 - Field.notEqualAny() erroneously renders <> ALL() - -Test cases ----------- -#1021 - Add explicit integration tests for - LEFT|RIGHT|FULL OUTER JOIN - -Version 2.0.1 - December 23, 2011 -================================================================================ - -This is a maintenance release for jOOQ 2.0. The main improvements -include - -- Better integration for using jOOQ with Spring Data. This - includes support for named parameters, as well as allowing to - change bind values on previously constructed Query objects -- The MERGE statement has been enhanced for better integration - with Oracle. -- jOOQ is now ready to use with Scala / Groovy - -For more information about using jOOQ with Scala, see this blog -post: -http://blog.jooq.org/2011/12/11/the-ultimate-sql-dsl-jooq-in-scala/ - -There is now also experimental support for a custom type mapping. -This mapping allows to rewrite data types at code generation time -as well as to specify custom enum data types (e.g. boolean Y/N). -Not all integration tests run smoothly for custom data types, -hence, this feature is not yet fully supported. - -Features and improvements -------------------------- -#691 - Add support for Oracle CURSOR REF IN / INOUT parameters -#677 - Add type-mapping configuration, enforcing types for - columns -#947 - Add custom type mapping support (experimental) -#968 - Allow for custom enum types, configured in the code - generator (experimental) -#974 - Add Schema.getTable(String), getSequence(String), - getUDT(String) for better runtime Schema meta-navigation -#975 - Add Sequence.getName(), getSchema(), getDataType() -#980 - Add support for named parameters, to better interact with - Spring -#991 - Add Query.bind(String, Object) and bind(int, Object) to - easily modify existing bind values -#992 - Document thrown DataTypeException in Convert methods -#998 - Enhance MERGE statement for Oracle extensions: - WHEN MATCHED THEN UPDATE .. WHERE .. DELETE WHERE .. - WHEN NOT MATCHED THEN INSERT .. WHERE .. -#1000 - Add support for MySQL's INSERT INTO .. SET .. syntax in - MERGE statement's WHEN NOT MATCHED THEN INSERT clause - -API changes (backwards-compatible) ----------------------------------- -#981 - Cannot insertInto(table("my_table")), as plain SQL tables - return Table, not Table. Relax - bound on R -#988 - Change Factory.field(String) to return Field - instead of Field -#999 - Make MERGE's WHEN MATCHED .. and WHEN NOT MATCHED .. - clauses optional -#1001 - Identity.getField() should return TableField - instead of Field -#1006 - Add Factory.value(...) as a synonym for Factory.val(...) - for increased Scala / Groovy compatibility - -Bug fixes ---------- -#973 - EnumType renders name() instead of getLiteral() in - formatXXX() methods -#977 - EnumType renders name() instead of getLiteral() in - Convert.convert() method -#979 - Record.from() sets all changed flags to true. That's not - necessarily correct in the event of storing the record - back to the DB -#985 - AbstractRecord.equals() does not correctly compare - arrays. Compare them using Arrays.asList() -#986 - Postgres / DB2 / Sybase ASE foreign-key namespace is - unique-per-table. jOOQ forces all foreign keys from all - tables into the same namespace -#990 - Problems when encoding arbitrary byte[] as String(byte[]) - in inlined SQL. This can cause issues when DEBUG-level - logging is activated -#995 - Routines don't respect SchemaMapping - Github issue #8 -#1002 - TableRecord.storeUsing() doesn't update IDENTITY column - values, if the column is not part of the main unique key -#1003 - Sybase / SQL Server / MySQL / Ingres / H2 / Derby's - INSERT .. RETURNING simulation returns null if a table - has an IDENTITY column, but no primary/unique key -#1005 - The INSERT INTO .. VALUES .. syntax may cause type-safety - issues in some databases. VALUES should be converted - before binding - -Test cases ----------- -#984 - Detach IDENTITY column tests from UNIQUE KEY tests, - create a dedicated test suite instead - -Version 2.0.0 - November 25, 2011 -================================================================================ -This release is a fresh start in many areas of jOOQ, adressing -issues that have been requested by users for a long time. These -release notes docment the most important changes, a detailed -upgrade guide, as well as the detailed list of improvements. - -Most important changes ----------------------- -- The API became more static. This applies to many Factory - methods, such as val(), literal(), as well as to many Field - methods that have been moved over to the Factory. For example, - when before, you wrote this using "postfix function notation": - -
NAME.replace(" ", "_").trim()
- - you will now write (just as in SQL): - -
trim(replace(NAME, " ", "_"))
- - Using static imports of Factory.*, jOOQ makes SQL look even - more like SQL. The current "postfix notation" is maintained for - backwards compatibility. -- By default, jooq-codegen will now generate a "dynamic" meta - model as opposed to the existing static one. Generated tables - covariantly override the as(String) aliasing method, leading - to a much more convenient aliasing style. When before, you - wrote: - -
-Table parent = T.as("parent");
-Table child  = T.as("child");
-Condition join =
-  parent.getField("ID").equal(child.getField("PARENT_ID"))
-
- - You can now write: - -
-T parent = T.as("parent");
-T child  = T.as("child");
-Condition join = parent.ID.equal(child.PARENT_ID)
-
- - Of course, the existing notation still works - -- Exceptions are no longer checked. When previously, the DB's - SQLException was propagated to client code, there is now an - unchecked DataAccessException hierarchy, similar to that of - Spring. This will eventually give way to a standardised error - handling abstraction, in future developments. -- Window functions are now constructed from their underlying - aggregate functions just like in SQL. For example: - -
-sum(AMOUNT)
-sum(AMOUNT).over().partitionBy(ACCOUNT)
-
- - This makes for a more concise API, especially when considering - future extensions, such as Oracle's KEEP (DENSE_RANK FIRST...) - syntax. -- More type safety has been introduced regarding various places - where generic and types are involved. - This is especially true for INSERT / UPDATE / DELETE statements -- Sequences now also have a type -- Unsigned number types are now supported in those databases that - use them. Unsigned numbers are implemented in jOOU, a spin-off - open source project. For convenience, this library is - "internalised" into jOOQ, to avoid adding a dependency - -http://code.google.com/p/joou/ - -Upgrade instructions: ---------------------- -Various of the above changes are incompatible with jOOQ 1.x. In -order to upgrade, please be aware of the following pitfalls: - -- The schema needs to be re-generated. -- Much of the post-fix function notation is replaced by static - methods in the Factory. Today's org.jooq.Field API is - maintained in jOOQ 2.0, for backwards compatibility. It will - be removed, eventually, though. Expect some incompatible - changes, where window functions are involved -- Some Factory instance methods (such as val(), literal()) are - now static. They are compatible, but may cause compiler - warnings. -- The meta model is now an instance model by default. If you - prefer the static meta model, you can configure this in your - jooq-codegen configuration. -- The additional typesafety involving and types may cause - compiler warnings and errors. -- SQLException is no longer part of the API. This can cause - compiler issues, in particular when extending jOOQ -- Some utility classes have moved to org.jooq.tools - -Should these incompatibilities be too significant for your -project, you can still stay on the 1.x branch, which will be -maintained for a while. Be aware that upgrading might be more -difficult, later, though. - -Features and improvements -------------------------- -#55 - Implement improved exception handling -#117 - Improve DSL support for field and table aliasing (decrease - verbosity) -#519 - Add support for MySQL UNSIGNED numeric types -#626 - Create static function access -#661 - Add support for bitwise operators -#718 - Sequences should be mapped to appropriate type (e.g. - SMALLINT, INT, BIGINT, etc) -#734 - Add support for Oracle / SQL Server CUBE() and ROLLUP() - grouping functions -#751 - Add support for Oracle / SQL Server GROUPING SETS() - function -#799 - Add support for Oracle PL/SQL's object-oriented MEMBER - PROCEDURES and MEMBER FUNCTIONS -#804 - Add to Insert, Update, Delete -#835 - Review API typesafety for InsertSetMoreStep - set(Field, T) and similar methods -#890 - Add Factory.selectCount() convenience method -#891 - Let min() max(), etc functions return a new type - AggregateFunction. This type can then be used as an entry- - point for window functions -#892 - Add support for Oracle / SQL Server GROUPING() and - GROUPING_ID() functions to be used along with CUBE() and - ROLLUP() -#893 - Simulate ROLLUP() function for MySQL, using the WITH - ROLLUP grouping modifier -#894 - Move functions from Field to org.jooq.impl.Factory - and make them static -#895 - Add power(..., Field) -#897 - Add (experimental) Spring integration project -#898 - Replace usage of checked SQLException by an unchecked - DataAccessException, similar to that of Spring -#899 - Build jOOQ .jar files as bundles to be deployed into OSGI - environments -#900 - Purge deprecated API - Prior to 2.0 -#901 - Introduce InvalidResultException as a subtype of - DataAccessException for integrity checks in methods like - ResultQuery#fetchOne(), ResultQuery#fetchMap(), etc. -#902 - Make AggregateFunction the base type for constructing - window functions -#904 - Move SQLDialectNotSupportedException into - org.jooq.exception package -#905 - Introduce MappingException as a subtype of - DataAccessException for integrity checks in methods like - ResultQuery#fetchInto(), etc. -#907 - Add missing Field.like(Field), notLike(Field) - methods to overload the existing Field.like(T), notLike(T) -#908 - Change rpad / lpad functions to accept String instead of - char -#912 - Add R newRecord(Table, Object) as - the inverse of various into(Class) methods -#916 - Add > {Record.into(Table) | - Result.into(Table) | ResultQuery.fetchInto(Table) | - Cursor.fetchInto(Table)} -#917 - Add various Cursor.fetchOneInto() convenience methods -#918 - Add CustomTable, CustomRecord as base classes for more - convenience when used with various into(Table) methods -#919 - Allow for accessing non-public constructors of Record - subtypes -#923 - Move some utilities to org.jooq.tools -#924 - Generate a reference to every table in a new Tables.java - class for improved static access -#928 - Add DataTypeException extending DataAccessException in - case something went wrong when converting data types -#930 - Support converting date time types to java.util.Calendar. - This applies to various into(Class) methods, as well as - Result.getValue(xx, Class) -#931 - Allow for conversion between Long and date/time types, and - vice versa -#932 - Let the bound of R in TableRecord extend TableRecord, - in UpdatableRecord to extend UpdatableRecord -#933 - Add support for type Character in Record.into(Class) - methods and similar -#936 - Accept primitive types, such as int.class for type - conversion -#938 - CODEGEN: Add static/instance table field configuration -#939 - Include license.txt and readme.txt in .jar files' META-INF - directory -#953 - Make DefaultGeneratorStrategy methods non-final to allow - for overriding -#954 - Add examples for source code generation of multiple - schemata with Maven -#955 - Generate a reference to every type in a new UDTs.java - class -#957 - Add R Factory.newRecord(UDT) for constructing - attached UDTRecords -#958 - CODEGEN: Add generation-time schema mapping, allowing for - re-writing schemata in jooq-codegen -#960 - CODEGEN: Add code generation configuration parameter to - avoid using the new UByte, UShort, UInteger, ULong wrappers - for UNSIGNED number types -#961 - Use Oracle's SYS.ALL_SEQUENCES.MAX_VALUE to determine the - type of a sequence. -#969 - Add List ResultQuery.fetch(Field, - Class) convenience method - -Bug fixes ---------- -#686 - Reduce the internal API leak by preventing access to - TableFieldImpl, UDTFieldImpl, ParameterImpl -#903 - lag(Field, int, T) erroneously delegates to lead() -#906 - Add more NullPointerException safety to API -#913 - NoClassDefFoundError in JooqUtil.isJPAAvailable() -#920 - Generic type is lost in Cursor.fetchInto(RecordHandler) -#925 - SelectConditionStep should extend SelectConnectByStep, not - SelectGroupByStep -#926 - AbstractRecord.into() fails to convert java.sql.Date into - java.util.Date -#934 - Don't consider static members in reflection utilities when - used with Record.into(Class) and similar methods -#935 - Don't consider final member fields in reflection utilities - when used with Record.into(Class) and similar methods -#937 - In the event of name clash (same name for table and field) - generated code has errors -#945 - Calling UpdatableRecord.setValue() twice with the same - argument causes the changed flag to be reset to false -#948 - Always set the changed flag to true in Record.setValue() -#959 - Compilation errors in generated source code if MySQL enum - values match Java reserved words, such as 'true', 'false', - 'new', etc... -#962 - Postgres ordering of generated enum literals is unstable -#967 - Better document type conversion - -Version 1.7.0 - November 25, 2011 -================================================================================ -This is a maintenance release for the 1.x branch. Some important -bug fixes are merged from version 2.0. These include: - -Bug fixes ---------- -#925 - SelectConditionStep should extend SelectConnectByStep, not - SelectGroupByStep -#926 - AbstractRecord.into() fails to convert java.sql.Date into - java.util.Date -#937 - In the event of name clash (same name for table and field) - generated code has errors -#945 - Calling UpdatableRecord.setValue() twice with the same - argument causes the changed flag to be reset to false -#948 - Always set the changed flag to true in Record.setValue() -#951 - Empty Password for jooq-codegen-maven causes NPE - -Version 1.6.9 - November 7, 2011 -================================================================================ -This is a maintenance release for the 1.x branch. Developments -on this branch will stop after version 1.6.9. Only important bug -fixes are merged to this branch. Developments for release 2.0 -have started. - -The most important functionality in release 1.6.9 is the newly -added support for JDBC batch operations. You can now batch -execute several queries. - -See the official blog for more information: -http://blog.jooq.org/2011/10/25/jdbc-batch-operations-with-jooq/ - -Features and improvements -------------------------- -#621 - Add support for JDBC batch operations -#794 - Add support for ORDER BY [int value] in order to reference - a column index for sorting -#882 - Optimise Field.isTrue() and isFalse(). Take Field's data - type into consideration. -#885 - Add support for INSERT INTO .. VALUES (..) syntax, - omitting explicit field declarations -#887 - Add List Cursor.fetchInto(Class) - -Bug fixes ---------- -#748 - H2 regression in 1.3.158 regarding stored functions, which - return a ResultSet (this was fixed in H2) -#859 - Derby casting of numeric types to BOOLEAN doesn't work -#886 - Regression in date extract function when used in a - subselect -#888 - Derby casting of VARCHAR to FLOAT (and similar) doesn't - work - -Version 1.6.8 - October 22, 2011 -================================================================================ -The main improvement of this release is the re-design of the -stored procedure / function API. With 12 supported RDBMS, which -all have their own idea about what is a stored procedure and what -is a stored function, it has proven to be a better design, to -unite them in one single type: org.jooq.Routine. A routine can -have a return value as well as OUT parameters. It can be embedded -in SQL and used as a field or a table. - -This means, you will need to re-generate your database schema, -when upgrading to jOOQ 1.6.8. After re-generation, you'll need to -fix your client code. These are the package changes: - -- [generated.package].procedures > [generated.package].routines -- [generated.package].functions > [generated.package].routines -- [generated.package].Procedures > [generated.package].Routines -- [generated.package].Functions > [generated.package].Routines - -Oracle generated packages are not re-located. With these -improvements, using stored procedures and functions becomes even -more reliable, especially when cursor types are involved. Read -more about the rationale behind this change: - -http://blog.jooq.org/2011/10/17/what-are-procedures-and-functions-after-all/ - -Apart from that, important improvements have been made in the -area of plain SQL tables. Also, consider a demo integration of -jOOQ with Google Cloud SQL: - -http://blog.jooq.org/2011/10/22/jooq-and-google-cloud-sql-example/ - -Features and improvements -------------------------- -#271 - Don't pre-fetch table meta data when selecting from plain - SQL tables -#489 - Add support for SELECT * (i.e. render SELECT * where - applicable) -#596 - Add support for VARIANCE() and STDDEV() OVER() window - functions -#608 - Add jOOQ version number in generated source code -#670 - Add more Javadoc to Field.xxx() functions -#692 - Add support for ResultSet type returned from HSQLDB - stored functions -#850 - Use http://www.jooq.org as URL for the @Generated - annotation -#854 - Add convenience methods Fields.isTrue(), isFalse() for - conversion of "Y", "YES", "1", "true", "on", etc into a - boolean condition -#870 - Add support for MEDIAN aggregate function -#872 - Add support for STDDEV_POP(), STDDEV_SAMP(), VAR_POP(), - VAR_SAMP() aggregate functions -#874 - Reduce the number of internal classes for dialect-specific - function aliases -#878 - Implement DataType.equals() and hashCode() - -API changes (backwards-compatible) ----------------------------------- -#851 - Change Field.{sortAsc|sortDesc}(List sortList) into - Field.{sortAsc|sortDesc}(Collection sortList) - -API changes (backwards-incompatible) ------------------------------------- -#848 - Purge deprecated API - Prior to 1.6.1 -#849 - Replace Cursor.fetchResult() by Cursor.fetch() -#852 - Review stored procedures / functions concept. Merge them - all into a single "Routine" type - -Bug fixes ---------- -#756 - Error when aliasing HSQLDB and Postgres unnested tables -#761 - Exception when TRACE logging execution with plain SQL - tables involved -#773 - Execute standalone stored functions as CallableStatement - to prevent issues with transactions -#847 - Query.getSQL() doesn't render dialect-specific SQL when - Query is constructed using the fluent API -#853 - DB2 generated convenience methods for stored functions - have unstable ordering -#857 - Derby casting of numeric types to String / VARCHAR does - not work -#858 - SQLDataType.getSQLDataType() should return itself, instead - of null -#860 - SQLite CEIL function is incorrectly simulated. CEIL(2.0) - returns 3.0 instead of 2.0 -#861 - Field.replace(String) generates bad SQL for various RDBMS. - Field.replace(String, String) works, though -#863 - Ingres integration generates illegal SQL when selecting - things like SELECT 1 WHERE 1 = 1 -#866 - Sybase ASE Field.replace(String) function incorrectly - removes the argument string -#873 - Error when selecting two times the same aggregate field -#877 - Compilation error in generated source code when a table - without a primary key has an identity column -#879 - Add Google Cloud SQL Example -#880 - Query.getSQL() does not consider SchemaMapping - -Test cases ----------- -#811 - Loader integration tests fail for SQLite -#812 - CSV Loader test leaves Postgres JDBC connection in an - inconsistent transactional state on error -#856 - Add integration tests for Field.abs() -#865 - Add integration tests for Field.ascii() -#867 - Add integration tests for Field.sum(), avg(), max(), min() -#881 - Re-design H2 stored functions to be pre-compiled, in order - to speed up integration tests - -Version 1.6.7 - September 25, 2011 -================================================================================ - -This release coincides with the launch of the new website at -http://www.jooq.org. Hence, it ships with little additions to the -deliverable itself. - -Apart from new convenience methods, the main addition is a Maven -plugin for jooq-codegen contributed by Sander Plas. - -Features and improvements -------------------------- -#797 - Create Maven plugin for source code generation -#825 - Add List> Factory.fetchMany(String) to - allow for fetching several result sets from stored - procedures, such as Sybase ASE's "sp_help" -#838 - Implement MetaDataFieldProvider.toString() -#841 - Add List Result.getValues(Field, Class) -#842 - Add Query.getBindValues() method to allow for extracting - bind values in the correct order -#843 - Add Factory.fetch(ResultSet) to transform a JDBC ResultSet - into a jOOQ Result - -API changes (backwards-compatible) ----------------------------------- -#837 - Avoid final keyword on Object methods, such as .equals(), - .hashCode(), etc - -Bug fixes ---------- -#836 - Bad syntax when selecting from aliased plain SQL tables -#839 - Boolean conversion in getValueAsBoolean() should trim - String values first -#840 - Numeric conversions in getValueAsXXX() should trim String - values first -#844 - NullPointerException when selecting a column from a Result, - that does not exist - -Version 1.6.6 - September 11, 2011 -================================================================================ - -Finally, support for another RDBMS has been added. Sybase's other -important product Sybase Adaptive Server Enterprise (or simply -Sybase ASE) is now officially supported by jOOQ - -Apart from this, there had been important improvements with the -recently added INSERT .. RETURNING clause, as well as some fixes -related to DECIMAL / NUMERIC data types - -Features and improvements -------------------------- -#796 - Complete missing public org.jooq.impl Javadoc -#800 - Add support for Sybase Adaptive Server Enterprise -#808 - Add support for INSERT .. RETURNING for Ingres -#809 - Add support for INSERT .. RETURNING for Sybase SQL - Anywhere using SELECT @@identity -#810 - Add support for INSERT .. RETURNING for SQLite using - last_inserted_rowid() -#813 - Add DSL support for INSERT .. RETURNING -#814 - Change TableRecord to reload its trigger-initialised main - key in Oracle and other RDBMS that don't support IDENTITY - columns -#818 - Add SQLiteFactory.rowid() -#819 - Support SQLite AUTOINCREMENT columns as IDENTITY -#820 - Add Factory.fetchOne(String) for executing plain SQL - queries that return single records -#826 - Allow for returning several records in the INSERT .. - RETURNING clause. This now works for DB2, HSQLDB, MySQL, - and Postgres -#827 - Support Sybase SQL Anywhere's TOP n START AT m clause - instead of simulating it with nested SELECT's - -API changes (previous API now deprecated) ------------------------------------------ -#817 - Deprecate Factory.lastID(Identity) - -Bug fixes ---------- -#815 - SQL Server fetching of IDENTITY value is broken -#821 - Optimise ResultQuery.fetchAny() executing fetchLazy() - internally, and only fetching one record from the cursor -#822 - Let Constant cast to more precise NUMERIC/DECIMAL types - in those RDBMS where casting is necessary -#823 - Cannot bind SQLite BigDecimal, BigInteger types - bind - them as String instead -#824 - BigInteger values cannot be bound in DB2, Derby -#828 - Document inefficient implementation for GREATEST and LEAST - in some RDBMS - -Version 1.6.5 - August 28, 2011 -================================================================================ - -This release finally adds a loader for CSV data to jOOQ. You can -now load CSV data using a simple fluent API, configuring error -handling, duplicate behaviour and transaction handling, as well -as various CSV parameters. - -This release also changes the way generated keys are retrieved -after INSERT's. Instead of (potentially inconsistently) running -SELECT MAX(pk) immediately after the INSERT, Postgres' INSERT.. -RETURNING clause is used (or simulated), in a single statement. - -Features and improvements -------------------------- -#784 - Add Result.exportXML() to retrieve a DOM document similar - to that of .formatXML() -#792 - Add support for loading of CSV data into tables -#795 - Add List fetch(int, Class) and - fetch(String, Class) convenience methods -#803 - Add support for INSERT .. RETURNING or simulate it where - not available -#805 - Add T[] fetchArray(int, Class) and - fetchArray(String, Class) convenience methods -#806 - Add T fetchOne(int, Class) and - fetchOne(String, Class) convenience methods - -Bug fixes ---------- -#798 - Oracle IN (...) clause with more than 1000 arguments does - not work -#802 - Use "INSERT .. RETURNING" instead of "SELECT MAX(pk)" - to retrieve the primary key of a new record - -Version 1.6.4 - August 07, 2011 -================================================================================ - -This release ships with a couple of useful concepts inspired by -other frameworks. These are: - -- selecting into custom POJO's. Results can be mapped to POJO's - by convention or using JPA @Column annotations -- selecting into custom callbacks. This is already a wide-spread - practice in Spring JdbcTemplates. -- selecting long-running queries asynchronously. This idea has - been inspired by the Avaje Ebean framework - -Apart from these changes and some bugfixes, the internal API has -been completely re-designed. The idea here is that query -rendering and variable binding are even faster (less String -objects), more extensible and more accurate. This is a pre- -requisite for many future developments with even more complex SQL -statements, such as for instance CTE's (Common Table Expressions) - -Features and improvements -------------------------- -#137 - Add support for asynchronous query execution using - FutureResult ResultQuery.fetchLater() similar to - Avaje Ebean -#198 - Add SELECT INTO functionality into POJO's using - T ResultQuery.fetchInto(Class) similar to JPA - CriteriaQuery -#728 - Add .fetchInto(RecordHandler) to ResultQuery, Result, - and Cursor to allow for callbacks similar to Spring's - JdbcTemplate/Ollin Framework -#774 - Add more TRACE logging to .fetchLazy() -#777 - CURSOR: Add function alias: UNNEST for TABLE -#781 - Add E function (Euler number) -#782 - Add T Record.getValue(..., Class) methods - for convenient type conversion -#785 - Allow for storing TableRecord with a provided Field[] - indicating the primary key -#786 - Document thread-safety facts in Factory Javadoc -#788 - Add Key.getFieldsArray() convenience method -#793 - Add support for Oracle's SYS_CONNECT_BY_PATH function - -API changes (backwards-incompatible) ------------------------------------- -#758 - Change internal QueryPart rendering and binding API to use - Configuration and Context as callback parameters. If you - use CustomField or CustomCondition, please correct your - implementations accordingly. Other parts of the API should - not be affected -#778 - Purge deprecated API, deprecation prior to jOOQ 1.5.7 -#790 - Purge deprecated generated code, deprecation prior to - jOOQ 1.5.7 - -API changes (previous API now deprecated) ------------------------------------------ -#776 - Deprecate QueryPart.getSQL(), add Query.getSQL() -#789 - Deprecate Record constructors with Configuration - parameter - -Test cases ----------- -#636 - Add integration tests for more advanced CONNECT BY - example -#772 - Add integration tests for selecting cartesian products - (several tables in FROM clause) - -Bug fixes ---------- -#730 - Sybase cannot bind null values in plain SQL -#759 - Omit the TOP 100 PERCENT clause in SQL Server ordered - top-level queries -#767 - An empty Java package is generated for PL/SQL packages - containing underscores -#771 - Some exotic literals are not properly escaped with quotes - yet, e.g. UDT identifiers, VARRAY types, etc. -#775 - Automatic re-attaching after deserialisation does not work - when used with .fetchLazy() -#787 - The UpdatableRecord's internal changed flags are not - updated after INSERTs / UPDATEs - -Version 1.6.3 - July 31, 2011 -================================================================================ - -This is mainly a maintenance release with lots of bugfixes, -mostly around code generation, plain SQL tables, and data types. -Please note that generated source code may contain incompatible -changes due to #639 (see below for details)! - -Apart from that, project CURSOR is advancing and it is now -possible to unnest arrays into tables. See this article for -details about where jOOQ is heading with project CURSOR: - -http://blog.jooq.org/2011/07/24/the-power-of-ref-cursor-types/ - -Features and improvements -------------------------- -#679 - Improve H2 NVL2 support as of H2 1.3.156 -#680 - Improve H2 ROUND support as of H2 1.3.156 -#735 - Add README documentation to GitHub -#736 - Add more info regarding number of generated artefacts in - jooq-codegen logging -#750 - Add DataType.isNumeric(), .isString(), .isTemporal(), - .isBinary() -#754 - Log query as executed by JDBC PreparedStatement when - TRACE logging (without inlining variables) -#752 - CURSOR: Add support for selecting from ARRAY types -#762 - Use H2's native support of NVL, instead of COALESCE -#764 - CURSOR: Add support for selecting from ARRAY types - returned from stored functions - -API changes (backwards-incompatible) ------------------------------------- -#639 - Map DECIMAL(n, 0) and NUMBER/NUMERIC(n, 0) data types - to Byte/Short/Integer/Long/BigInteger instead of - BigDecimal in generated source code. Re-generated code - will not be compatible! - -API changes (previous API now deprecated) ------------------------------------------ -#731 - Inconsistent API with Field.lessOrEqualToXXX(). Removed - "To" from method name -#757 - Deprecate Factory.constant() methods - -Test cases ----------- -#731 - Add missing integration tests for equalAll(), equalSome() - and similar methods -#747 - Upgrade H2 to 1.3.158 - -Bug fixes ---------- -#632 - Sybase error : column @p0 not found in nested SELECT -#700 - Restore HSQLDB ARRAY support with INFORMATION_SCHEMA - change in HSQLDB 2.2.3, and some fixes in 2.2.5 -#725 - Cannot insert byte[] data with plain SQL -#733 - H2 changed JDBC type for ResultSet/CURSOR from 0 to -10, - like Oracle -#737 - Compilation errors in generated source code if table - fields contain spaces -#738 - Compilation errors in generated source code if MySQL - procedure parameter type contains two comma-separated - arguments (like DECIMAL(10,2)) -#739 - Postgres navigator methods and keys are not re-generated - in the same order -#740 - Formatting is broken on Result.format() with some special - newline characters -#743 - Make SQL Server INFORMATION_SCHEMA independent from - HSQLDB again, to prevent incompatibility issues -#744 - Ingres REAL and FLOAT4 types are generated as FLOAT/FLOAT8 - which maps to java.lang.Double, instead of java.lang.Float -#753 - Postgres error when binding array that contains null - values -#755 - NullPointerException when converting an array containing - a null value -#766 - Bad decoding of JDBC Types BIGINT (to BigInteger instead - of Long) and REAL (to BigDecimal instead of Float) when - plain SQL tables are involved - -Version 1.6.2 - July 10, 2011 -================================================================================ - -This release mainly introduces three new projects. - -Project CURSOR where jOOQ finally supports various RDBMS's TABLE, -CURSOR, and REF CURSOR data types. This is especially useful when -those types are returned from stored procedures and functions. -Cursors are simply mapped to jOOQ Result types and can -thus be used like regular table results - -Project EXPORT aims at exporting data from the database in -various serialisable formats, such as XML, CSV, HTML, Text, JSON. -This project will be continued in the future, to also -deserialise from (some of) these data streams. This will allow -for easy transport of jOOQ Result types over the net. - -Project CODEGEN has finally been started. Many improvements -suggested by jOOQ users will be implemented in the next releases. -In this release, important fixes have been made to prevent -compilation errors in generated artefacts. - -Features and improvements -------------------------- -#61 - EXPORT: Add Result.formatXML() -#166 - CURSOR: Add support for ResultSet type returned from - Oracle stored procedures / functions -#411 - Allow for fetching Map (instead of Record) - and List> (instead of Result) -#549 - Add Factory.function() for plain SQL functions -#611 - Simulate RPAD and LPAD in SQL Server, Sybase -#627 - Add support for Postgres FOR UPDATE OF [table-name] clause -#628 - Add support for REPEAT (SQL Server: REPLICATE) function -#637 - Nicely format time in StopWatch logging output -#640 - Simulate Postgres FOR UPDATE OF [table-name] clause in - other dialects -#649 - CURSOR: Add Cursor.fetch(int) .fetchOne() - .fetchResult(int) .fetchResult() -#653 - Add support for MySQL encryption and compression functions -#660 - Clarify Javadoc of UpdatableRecord to explain its - behaviour when changing the main unique key -#669 - EXPORT: Add Result.formatHTML() -#672 - Add convenience method UpdatableRecord.copy() in order to - reset primary key values for a subsequent INSERT -#675 - EXPORT: Add Result.formatCSV() -#683 - Implement ResultImpl.equals() and .hashCode() -#684 - Implement AbstractStore.equals() and .hashCode() -#685 - Add Store.size() to indicate the maximum index of the - Store -#687 - EXPORT: Add result.formatJSON() -#689 - Create separate builds: jooq-core.zip and - jooq-with-dependencies.zip -#690 - CURSOR: Add support for ResultSet type returned from H2 - stored functions -#695 - CURSOR: Add support for ResultSet type returned from - Postgres stored functions -#697 - Add Factory.fetch(String) for executing plain SQL queries - that return results -#701 - Add ResultQuery.fetchArray() and .fetchOneArray to return - Object[][] and Object[] -#704 - Always add top and bottom line in Result.format() -#705 - Right-align numeric values in Result.format() -#716 - Add SUBSTRING function Field.substring(Field, Field) - taking fields as arguments -#719 - Document risk of SQL injection in plain SQL and literal - factory methods -#726 - Add LENGTH function as a synonym for CHAR_LENGTH - -API changes (backwards-compatible) ----------------------------------- -#698 - Inconsistent API with Factory.fetch(Table [,Condition]) - Let method return Result instead of List -#699 - Let Result extend List - -API changes (previous API now deprecated) ------------------------------------------ -#656 - Decrease verbosity of plain SQL methods. They will just be - called Factory.field() .condition() .table() .query() - -Test cases ----------- -#643 - Add integration test for code generation of invalid and - incomplete types in Oracle -#654 - Add integration tests for master data tables with PK types - other than NUMBER/INT -#655 - Add missing integration tests for TRIM function - -Bug fixes ---------- -#450 - Improve plain SQL integrity checks for bind variables -#610 - CODEGEN: Compilation error in generated source code for - databases with table named 'system' -#646 - An empty Java package is generated for an empty PL/SQL - package. This is unnecessary -#651 - CODEGEN: Avoid importing datatypes in generated source - code to prevent collisions -#657 - NullPointerException when creating a Factory with a null - SchemaMapping -#658 - Master data table code generation is broken for tables - with more or less than 3 columns -#662 - Add support for the missing Postgres data type "bpchar" -#663 - Add support for the missing Sybase data type "int" -#664 - Ingres INTEGER data types are not correctly generated -#665 - HSQLDB Datatype CLOB and BLOB are not supported, when - selecting from plain SQL tables -#666 - The evil bug: Ingres TRIM function only executes RTRIM -#673 - UpdatableRecord.store() doesn't work if called after - .delete() -#702 - Add support for the missing SQLite data type "NULL" -#706 - CURSOR: Ensure that Query.execute() runs in a single - transaction when Postgres refcursor is involved in the - query (this fixes a Postgres JDBC driver flaw) -#724 - NullPointerException when passing a single literal null - bind value to plain SQL methods without casting to Object -#729 - DB2, Derby, Ingres, Oracle cannot bind null values in - plain SQL - -Version 1.6.1 - June 19, 2011 -================================================================================ - -In this release, the PORTABILITY project has been implemented. -Finally, the SQLDialect has been removed from most generated -artefacts (Schema, Table, Field, Sequence, etc). Also, the -constructing Factory is not referenced by its created QueryParts -anymore, unless this is really necessary (Query objects, UDT's, -ARRAY types). This leads to higher compatibility between schemata -of different databases, e.g. if users want to use an HSQLDB -development and Oracle productive database. - -Unfortunately, this means that the way stored procedures are -called had to be changed. This is an API break that could not be -avoided. The pre-1.6.1 StoredObject.execute(Connection) method -is deprecated and will be removed in the future. It has been -replaced by StoredObject.execute(Configuration) - -In addition to this project, many more window functions are now -supported, as well as the Oracle-specific CONNECT BY clause for -recursive queries. - -Features --------- -#351 - Add support for Oracle ROWID data type -#452 - PORTABILITY: Create a super-set of RDBMS data types -#453 - PORTABILITY: Don't create dialect-specific QueryParts -#455 - Add support for the Oracle CONNECT BY clause -#587 - Add optional OFFSET clause to form LIMIT .. OFFSET - constructs -#589 - Add extended FOR UDPATE [OF ...] [{WAIT n | NOWAIT | SKIP - LOCKED }] support -#591 - Add support for LEAD() OVER() and LAG() OVER() window - functions -#592 - Add support for the CUME_DIST() OVER() window function -#601 - Add Factory.literal() convenience methods -#602 - Add Factory.val() methods to decrease .constant() - verbosity -#604 - Add support for RESPECT NULLS clause in some window - functions -#605 - Add Factory.use(String) for non-generated schemata -#613 - Add PI function -#616 - Add Factory.two() literal convenience method -#630 - Add support for Oracle CONNECT BY pseudo-columns LEVEL, - CONNECT_BY_ISCYCLE, CONNECT_BY_ISLEAF - -API changes ------------ -#299 - PORTABILITY: Create a dialect-independent meta-model -#588 - Add OVER() keyword to FIRST_VALUE() and LAST_VALUE() API - -Test cases ----------- -#368 - Add integration test for use with schema mapping -#586 - Upgrade H2 to 1.3.155 -#607 - Add integration tests for CRUD / SP's / UDT's / ARRAY's - with SchemaMapping -#612 - Add integration tests for LPAD and RPAD functions -#624 - Add integration test for code generation of invalid/ - incomplete views in Oracle -#631 - PORTABILITY: Add integration tests for using Oracle- - generated schema against an HSQLDB database -#638 - Add missing integration test for DECIMAL data type - -Bugfixes --------- -#176 - Stored procedures / functions in EQUIVALENT schemata - cannot be called -#493 - Bind variable mismatch when constructing bad SQL -#594 - Confusing Javadoc in SELECT DSL API -#603 - Fix DB2 'IGNORE NULLS' clause -#619 - SUBSTRING() function is broken in DB2, Ingres, SQL Server -#623 - SQL syntax error for some MERGE queries in SQL Server and - Sybase -#633 - SchemaMapping is not applied to sequences -#634 - Sequences are not escaped in generated SQL - -Version 1.6.0 - June 05, 2011 -================================================================================ - -Apart from supporting various additional standard and non- -standard JOIN constructs, there is now also full support for the -SQL standard MERGE statement and MySQL's ON DUPLICATE KEY variant -thereof. A great number of API enhancements have been added, -which improve the usability of jOOQ. The Ingres database is now -also supported. - -Features --------- -#301 - Add support for Oracle execution hints -#409 - Add support for NATURAL JOIN syntax, where RDBMS allows it -#415 - Make fluent API's underlying SelectQuery objects publicly - available -#429 - Add Ingres support -#475 - Document class-level generic types and in Javadoc -#486 - Add support for SQL MERGE clause -#494 - Allow for omitting schema name in generated SQL -#496 - Automatically update IDENTITY values in UpdatableRecord, - after storing them -#520 - Add support for JOIN ... USING syntax -#524 - Upgrade HSQLDB to 2.2 -#533 - Add ORDER BY [Map] or BY [List] functionality -#534 - Add Result.isEmpty() -#535 - Call upon ConfigurationRegistry.provideFor() before - throwing a DetachedException -#536 - Simulate CASE [value] WHEN [value] THEN [result] END - syntax in Derby -#538 - Add some logging to ConfigurationProvider -#539 - Add possibility to negate numeric values with Field.neg() -#541 - Add support for MySQL ON DUPLICATE KEY clause -#542 - Allow for Collection arguments in INSERT's DSL API -#543 - Allow for creating FUNCTION() OVER() without PARTITION BY - or ORDER BY clause -#546 - Add Factory.use(Schema) -#548 - Add new internal type FieldMap -#550 - Simulate ON DUPLICATE KEY INSERT clause in dialects other - than MySQL -#551 - Add TableMapping, similar to SchemaMapping for mapping - tables -#553 - Add Factory.plainSQLQuery -#554 - Add Factory.plainSQLField with a DataType parameter -#555 - Add UpdateXXX.set(Map) convenience methods to DSL API -#557 - Enhance INSERT DSL API to allow for adding VALUES clause - with InsertXXX.set() syntax -#570 - Add support for the RAND() function -#567 - Add support for Ingres Sequences -#572 - Add support for the ATAN2() function -#573 - Add possibility for additional select() clauses for - convenience -#575 - Add support for the FULL OUTER JOIN syntax, where RDBMS - supports it -#576 - Add support for the CROSS JOIN syntax, where RDBMS - supports it -#581 - Enhance API and allow Collection> - instead of Collection> - -API changes ------------ -#397 - Purge deprecated API - -Bugfixes --------- -#481 - Handle case where an empty record is stored -#522 - Misleading Javadoc in generated stored procedures and - function constructors -#532 - Restore Postgres INFORMATION_SCHEMA -#537 - Prevent null from being added to QueryPartList -#540 - Error when TRACE logging Limit -#544 - Aliased elements are not bound correctly when rendered - with toSQLReference() -#559 - Loosen type safety on overloaded methods to prevent - compilation errors with javac/Netbeans -#560 - HSQLDB DataType REAL is configured incorrectly -#565 - Add integration tests for current_user() function -#569 - ORA-01427 when generating foreign key relations -#571 - Field.trim() not correctly implemented for SQL Server -#583 - Accelerate integration tests: Reset schema only if - necessary - -Version 1.5.9 - May 15, 2011 -================================================================================ - -This version ships with lots of new functionality. Finally, the -DSL-style API has been extended to CRUD operations (INSERT, -UPDATE, DELETE)! Also, support for the TRUNCATE TABLE statement -has been added. - -The most important new features include the support for SQL:2003 -standard window functions, which are available in most major -RDBMS. Additionally, basic function support has been widely -extended. - -Features --------- -#148 - Added support for window functions -#204 - Add support for multi-record INSERT's -#416 - Added support for retrieval of IDENTITY values -#433 - Use bind variables for LIMIT and OFFSET -#441 - Added foreign key relationship meta information to the - generated source code -#446 - Beautify ResultImpl.toString() method -#461 - Automatically cast CONCAT parameters to Field if - necessary -#463 - Added support for trigonometric functions -#471 - Added support for the sign function -#472 - Added support for GREATEST/LEAST functions -#474 - Added support for "hyperbolic" functions SINH, COSH, TANH, - and COTH -#482 - Added DSL API for INSERT statements -#483 - Added DSL API for UPDATE statements -#484 - Added DSL API for DELETE statements -#485 - Added "Registry" for client code to provide Configurations - to jOOQ Attachables -#490 - Added support for the TRUNCATE TABLE statement -#495 - Generate source code for IDENTITY columns -#501 - Added support for boolean conversion to Result, Record, - and Store -#503 - Allow for schema navigation via generated artefacts -#518 - Let stored procedures reference owner package - if applicable -#525 - Added NULLS {FIRST | LAST} clause to ORDER BY constructs -#528 - Added Factory.getDataType() convenience method -#530 - Added Factory.zero() and Factory.one() convenience methods - -API changes (jooq) ------------------- -#527 - Weakened type-safety on Field.nvl2() -#529 - Deprecated Factory.select(Object...), added .selectOne() - and .selectZero() instead - -API changes (jooq-meta) ------------------------ -#30 - Add ParameterDefinition for stored procedures, instead of - reusing ColumnDefinition -#499 - Add reference to TableDefinition in ColumnDefinition -#500 - Add AttributeDefinition for UDTDefinition, instead of - reusing ColumnDefinition - -Bug fixes ---------- -#369 - Adapt H2 relations generation to H2's correction of - information_schema.cross_references -#435 - Added integration tests for NESTED SELECTs holding LIMIT - clauses -#460 - Syntax error when using a field with a reserved name -#462 - Fixed Javadoc broken links -#473 - Don't cast when cast is unnecessary -#479 - INSERT statement should not set all fields for a table -#497 - Derby referential code generation is broken, for named - foreign keys -#498 - Oracle package content is generated in arbitrary order -#502 - Syntax error when creating an empty IN condition -#526 - Corrected Javadoc in Field.coalesce() - -Version 1.5.8 - April 29, 2011 -================================================================================ - -Finally, jOOQ now supports two important new RDBMS: -SQL Server and Sybase! - -Apart from this great enhancement, there is now also full support -for the non-SQL standard LIMIT clause, even in dialects where the -LIMIT clause is not supported natively (especially Oracle, but -also DB2, SQL Server and Sybase, which have limitations). jOOQ -simulates LIMITs by rendering nested selects filtering on ROWNUM -(Oracle) or on ROW_NUMBER() (DB2, SQL Server and Sybase). - -Other interesting additions are an increasing support for native -mathematical functions. More function support will be added in -future versions. - -Features --------- -#16 - Added support for SQL Server -#21 - Uniform implementation of the LIMIT clause. Implemented - LIMIT clause simulation through analytic functions, where - LIMIT is not supported natively -#97 - Added support for Sybase -#418 - Measure time of various steps in source code generation -#420 - Added support for proprietary SQL extensions "FOR UPDATE" - and "FOR SHARE" -#431 - Added additional statistics to generation log files -#432 - Unified the various "standard" ANSI INFORMATION_SCHEMA - implementations in the jooq-meta artefact -#436 - Added support for the modulo function -#438 - Added floor and ceil functions -#439 - Added support for mathematical functions (logarithms, - exponentials, sqrt) -#447 - Enhanced Field.add() and Field.subtract() to work for date - time fields, also - - -API changes ------------ -#428 - Created new Maven artefact jooq-meta to cleanly separate - database meta-data navigation from code generation -#458 - Decreased DSL verbosity for arithmetic operations and for - ordering - -Bug fixes ---------- -#417 - Restored warning when unknown column type is encountered - in source code generation -#419 - Corrected misleading Select.fetchOne(...) Javadoc -#421 - Optimised AbstractRecord's memory consumption -#448 - Corrected some Javadoc @see links -#449 - Changed Field.concatenate() to accept Field parameters - to avoid generic varargs warnings - -Version 1.5.7 - April 17, 2011 -================================================================================ - -This is the first release built with support of Maven thanks to -the help of some jOOQ users! - -The main new features in this release are the improved support -for serialisation/deserialisation of jOOQ objects through use of -the newly introduced "Attachable" interface. - -If using log4j or the newly supported slf4j logging framework -in debug/trace mode, there is the possibility to log query -building/execution time statistics. - -Apart from these new features, fixes were mainly done in the -fields of type casting, HSQLDB 2.1 upgrade support, stored -procedures with OUT, IN/OUT parameters. Please upgrade, if you -are using any of those features. - -If you extend jOOQ as a base implementation for source code -generation, be aware of the fact, that the jOOQ-codegen is -currently undergoing major changes. Expect the code generation -API to stabilise again in one of the next releases. - -Features --------- -#104 - Added maven dependency -#248 - Integrate UDT types with ARRAYs -#295 - Allow for attaching/detaching UpdatableRecords to/from - Configurations -#359 - Added statistics measurement to Query execution for debug - log level -#362 - Added deprecation configuration flag -#364 - Document unknown type in generated source code -#373 - Improve exception handling in code generation -#378 - Added support for Oracle stored functions with OUT - parameters -#382 - Added Factory.attach() methods to re-attach deserialised - Attachables -#394 - Add logging support for SLF4J -#398 - Allow to provide a DataType in Factory.constant() -#399 - Provide access to TypeUtils.convert() methods via DataType -#404 - Added trace logging for measuring the speed of various - query execution steps - -API changes ------------ -#358 - Enhanced DSL API to allow for HAVING clauses without - GROUP BY clauses -#367 - Make Store, Result, QueryPart "Attachable" -#374 - Introduce strategy pattern to code generation for future - support for advanced naming schemes -#375 - Decouple Database from Generator -#381 - Made DataType Serializable -#384 - Deprecated singleton QueryParts -#388 - Unify "internal" API using an Adapter pattern - -Bug fixes ---------- -#187 - Protect generated Record navigation methods against name - clashes -#266 - Added more thorough integration tests for dialect-specific - casting (including some fixes related to varchar types) -#360 - Added more integration tests for the DISTINCT clause -#361 - Add more checks in testInsertUpdateDelete() -#366 - Warn only once per ColumnDefinition, if a data type is - unknown -#377 - NullPointerException when generating invalid stored - function -#380 - Added integration tests to check for proper - serialisability -#386 - Fixed incompatibilities with HSQLDB 2.1.0 -#387 - Fixed unnecessary imports in some Oracle generated - Records -#389 - Fixed javac compiler warning in AbstractStoredObject -#391 - Cannot properly call stored procedures when IN/OUT - parameter is bound to NULL -#392 - Procedures with several OUT parameters may not register - OUT parameters correctly -#410 - Passing null VARRAY values to Oracle stored procedures - causes issues -#412 - limit(int) sets default offset incorrectly in some - dialects - -Version 1.5.6 - March 31, 2011 -================================================================================ - -This release consists mainly of code generation bug fixes and -minor API improvements and enhancements. - -The most important improvement is ticket #90, by which lazy -fetching and iteration over data is now supported. jOOQ lets you -keep a reference to a Cursor that has an open JDBC ResultSet, to -fetch data from on-the-fly. - -A few major code generation bugs were reported where the -generated code may cause ambiguity due to an inconsistent API. -This means that you will have to re-generate your schema after -upgrading to version 1.5.6. Some of your code may not compile -anymore, after this upgrade. - -Features --------- -#90 - Added possibility for lazy fetching of data -#208 - Added convenience methods for direct invocation of - sequences' currval() and nextval() attributes -#212 - Created one factory per dialect for better separation of - dialect-specific support -#213 - Generate a factory for each schema -#251 - Opened up base implementations for Field and Condition - to allow for custom implementations by client code -#274 - Integrate H2 ARRAY types with stored procedures -#292 - Documented usage of log4j and java.util.logging -#306 - Added support for the NULLIF function -#319 - Added Field.between(Field, Field) method -#320 - Added trace logging for variable binding and SQL - generation methods -#323 - Added Field.in(Field...) method -#325 - Include release version number in delivered .jar files -#328 - Improved configuration setup documentation page -#333 - Let Result implement Serializable -#334 - Added fetchMap() convenience methods -#335 - Added more functions and aggregate functions examples to - documentation -#338 - Visually improve code generation logging -#339 - Removed skipping of unreferenced UDT's, ENUM's and ARRAY's -#342 - Improved generated referential code by using fetch() and - fetchOne() API -#356 - Let UpdatableRecord.store() and delete() return an int - to indicate whether the record was actually modified - -API changes ------------ -#233 - Allow for joining TableLike instead of Table -#337 - Added generic type > to - InsertSelectQuery -#341 - Fixed API flaw where SelectOnConditionStep.and() methods - and similar ones returned SelectConditionStep, instead of - SelectOnConditionStep - -Bugfixes --------- -#69 - Corrected referential code generation for foreign keys - that reference non-primary unique keys -#85 - Corrected referential code generation for multi-field - foreign keys -#121 - Covered more Factory.executeXXX() methods with integration - tests -#318 - Fixed NullPointerException when executing SELECT * from - aliased tables -#321 - BetweenCondition does not bind left hand side Field - correctly -#322 - InCondition does not bind left hand side Field correctly -#326 - Avoid method overloading where binding to Object - may lead to compile-time ambiguities (with javac) -#343 - Add more foreign key navigation method integration tests -#347 - Add explicit integration tests for schema artefacts - excluded from code generation -#350 - Disambiguate navigation methods if several foreign keys - reference the same entity -#352 - Disambiguate navigation methods if a table ending on S - references itself -#353 - Added integration test for compilation of generated - artefacts with javac (as opposed to the Eclipse compiler) -#355 - Error when storing an UpdatableRecord that has no changed - values - -Version 1.5.5.2 - March 15, 2011 -================================================================================ - -A critical bug was reported from the 1.5 release stream where -stored functions did not render their parameters in correct order - -Features --------- -#302 - Map Oracle's NUMBER data type to java.lang.Number in - stored procedures, stored functions - -Bugfixes --------- -#317 - StoredFunctionImpl.asField() renders parameters in wrong - order - -Version 1.5.5.1 - March 13, 2011 -================================================================================ - -In version 1.5.5, there was a fatal bug breaking Derby source code generation. -Only the Derby dialect is affected. Please update immediately, if you are using -jOOQ's Derby integration - -Bugfixes --------- -#315 - Generated master data records are not sorted by PK -#316 - Derby code generation fatally broken - -Version 1.5.5 - March 12, 2011 -================================================================================ - -This version is released early as there are some important bugfixes. Additional -improvements include: - -- Improved DSL related to conditions in HAVING and JOIN clauses -- Support for Oracle-style functions, such as NVL, NVL2, COALESCE - DECODE, etc - -Features --------- -#304 - Add support for Oracle NVL function -#305 - Add support for COALESCE function -#308 - Add support for Oracle NVL2 function -#311 - Add support for Oracle DECODE function - -API changes ------------ -#223 - Enhance DSL to accept and(), or() and similar methods in JOIN steps -#224 - Enhance DSL to accept and(), or() and similar methods in HAVING steps - -Bugfixes --------- -#297 - Fixed Factory.concatenate() function -#298 - Added integration tests for nested selects in HAVING clause -#300 - Added integration tests for nested selects in JOIN clause -#303 - Javadoc correction -#307 - Accelerated integration tests -#309 - Fixed JDBC variable binding issue related to Conditions where the lhs is - a function (e.g. stored function) and the rhs is a constant -#310 - Fixed issue where fetchOne() methods throw NullPointerException if no - result record is available -#312 - Fixed issue where Field.equal(...) methods rendered unexpected SQL when - rhs null is cast to a type -#313 - Fixed Derby cast type for VARCHAR -#304 - Let the DerbyDataType default for java.lang.String be VARCHAR, not LONG - VARCHAR - -Version 1.5.4 - March 04, 2011 -================================================================================ - -Feature #243 required a minor API change in the base classes of generated source -code. This means you have to re-generate all your jOOQ artifacts in order to -migrate to 1.5.4. The artifacts themselves should be regenerated in a compatible -way, such that your client code should not be affected. If this is not the case, -please report a ticket here: - - https://sourceforge.net/apps/trac/jooq/newticket - -Apart from the Derby RDMBS and some new data type support, there have been many -new convenience methods added all over the API. For instance, if type-safety is -not really a requirement, there are lots of possibilities to use plain SQL -directly in the DSL. In that case, data can be accessed from Record, Results, -not only through Field, but also through field names or indexes. - -Check out the updated documentation (soon) here: - - https://sourceforge.net/apps/trac/jooq/wiki/Examples - -- Support for the Derby RDBMS -- Support for casting. This allows for even greater flexibility - in cases where jOOQ cannot 100% ensure type-safety -- Support for ARRAY types. Oracle, Postgres, HSQLDB and H2 ARRAY - types are now supported natively as regular bindings in - jOOQ's Field -- Support for dialect-specific data types. CHAR, VARCHAR, CLOB - are no longer treated equally as java.lang.String. Their - type heritage is also generated -- More sequence support -- Lots and lots of bug fixes - -Features --------- -#95 - Support for the Derby RDMBS -#163 - Add support for JDBC type ARRAY (with Postgres) -#209 - Add support for DB2 sequences -#210 - Add support for H2 sequences -#211 - Add support for HSQLDB sequences -#215 - Support for SQL casting using as cast type -#246 - Support for SQL casting using dialect-specific data types -#254 - Add HSQLDB support for ARRAY types -#256 - Add Oracle support for VARRAY types -#257 - Integrate ARRAY types with stored procedures -#261 - Add a global type mapping to the generated Schema object -#267 - Add DataTypeDefinition for further abstraction of data types in code - generation -#269 - Add H2 support for ARRAY types -#290 - If log4j is not on the classpath, use java.util.logging instead, as - fallback - -API Changes ------------ -#156 - Allow for results to be accessed by index, not by field -#218 - Corrected bad method signature: Record.getValueAsLong(Field, Integer) -#219 - Extended Result and Select API's to be more similar to that of Record -#232 - Add more convenience plain SQL support to the API -#235 - Add convenience methods to Record, Result and Select for access of data - via field name -#243 - Refactor DataType implementations in order to allow for the use of - generics -#259 - Add field type to database meta data (ColumnDefinition) -#260 - Add field type to database meta data (Field) -#262 - Add default behaviour for Record.getValue(Field) -#276 - Add Javadoc as a ZIP file to the jOOQ distribution - -Bugfixes --------- -#125 - Add more plain SQL integration tests -#191 - Add more integration tests for nested unions -#205 - Implemented workaround for handling Postgres stored functions with UDT - OUT parameters -#214 - Fixed NPE when generating a stored function with an unknown parameter - type -#216 - Fixed some cases where binding of BigInteger is not done correctly -#220 - Syntax error when using select statement in a CASE clause -#221 - Corrected integration tests for combined update and select statements -#222 - Added integration test for INSERT statements having nested SELECT - statements for their fields -#225 - Correctly cast array types in Postgres -#230 - Potential misuse of Blob and Clob in H2's JDBC types -#239 - Factory.fetchAny() is not implemented for SQLite -#244 - Fixed peculiar MySQL casting support where cast types do not match any - data types -#245 - Fixed NPE when reading null dates in SQLite -#249 - Added ARRAY type integration tests -#255 - Stored procedure bind variables get mixed up when any argument is null -#263 - Correctly handle Postgres function overloading -#264 - Ambiguous funciton calls when calling overloaded functions with null - parameter -#281 - Handle compilation errors when generating stored procedures with > 254 - parameters -#283 - Fixed compilation errors in generated source code for Oracle's UDT table - type -#284 - Fixed compilation errors in generated source code for Oracle procedures - in packages, when they have no parameters -#285 - Fixed compilation errors in generated source code for Oracle tables with - the same name in different schemata -#286 - Fixed name collisions in generated objects with the java.lang.* package -#288 - Prevent the creation of UNION queries with bad syntax in MySQL -#289 - Correctly alias fields within UNION queries for some dialects, which then - only require the "AS" keyword -#291 - Cannot create an aliased field called "year" in Postgres - -Version 1.5.3 - January 13, 2011 -================================================================================ - -- Lots of stored procedure support was implemented -- Support for sequences was added -- The final decision to postpone support for DB2 UDT's was made -- Some code generation bugfixes - -Features --------- -#36 - Added stored procedure / stored function support for HSQLDB -#140 - Added support for Oracle sequences -#147 - Added support for H2 stored functions -#162 - Correctly integrate UDTs with stored procedures -#170 - Added support for Postgres stored functions -#186 - Added support for more Oracle PL/SQL simple data types -#193 - Simulate support for H2 "stored procedures" -#195 - Simulate support for Postgres "stored procedures" -#206 - Added support for Postgres sequences - -API changes ------------ -#180 - Improved DSL for constant values -#181 - Allow for referencing Field in function argument list -#189 - Renamed convenience methods in org.jooq.Record -#207 - Add fetchOne(Field) method to org.jooq.Select API - -Bugfixes --------- -#182 - Protected generated Record classes against clashes with inherited methods -#183 - Fixed NullPointerException, when generating master data tables with - NULL fields -#184 - Fixed IllegalArgumentException, when a data type is present in the - schema, but unavailable in code generation logic -#185 - Code generation should not fail when single elements cannot be generated -#188 - Improved integration tests for stored procedures / functions / packages -#196 - Increase RDMBS version compatibility by avoiding "SELECT *" in code - generation logic -#199 - Added integration tests for stored procedures in RDBMS that do not - support OUT parameters -#201 - Fixed issue in DB2 where stored procedures without parameters were not - generated. -#202 - Added integration tests for stored procedures / functions without - parameters - -Version 1.5.2 - December 27, 2010 -================================================================================ - -- Improved support for stored procedures, also in packages -- A minor API change was inevitable to implement #173. The API change only - concerns the INTERNAL API. Deprecation marks are added and deprecated items - will be removed in 1.6.0 -- Experimental SQLite database support -- Some important bug fixes - -Features --------- -#25 - Added support for Oracle packages -#114 - Added support for Oracle UDTs -#145 - Added support for the SQLite database -#150 - Generate static convenience methods for stored procedures / functions -#151 - Generate static convenience methods for stored function fields -#152 - Generate meaningful serialVersionUID in generated classes -#173 - Added support for EQUIVALENT schemata - -API changes ------------ -#159 - Added convenience method List getValues(Field) to Result -#165 - Added convenience methods for creating EXISTS clauses -#169 - Improved DSL for WHERE clauses - -Bugfixes --------- -#68 - Prevent issues originating from overloaded stored procedure names, - generating identical Java class names -#153 - Fixed issue with generated code for DB2 stored functions -#154 - Fixed issue with generated code for DB2 stored functions -#155 - Fixed issues with database NULL not being mapped correctly to Java NULL - when selecting values that have a primitive type (int, long, etc) -#158 - Potential ClassCastException when using Field -#171 - Corrected issue related to selection of default schema in DB2 -#177 - Fixed issue related to generated code for tables or UDTs without columns - - -Version 1.5.1 - December 13, 2010 -================================================================================ - -- H2 database support thanks to Espen Stromsnes -- Improved stored procedure support - -Features --------- -#96 - Added H2 database support -#101 - Added stored procedure / stored function support for Oracle -#138 - Added stored procedure support for DB2 -#146 - Added support for DB2 functions - -API changes ------------ -#143 - Added convenience methods to Record - -Bugfixes --------- -#84 - Implemented referential code generation for foreign keys that do not - match their primary keys' types -#141 - Encoding problem in generated master data classes - -Version 1.5.0 - November 22, 2010 -================================================================================ - -- A big one. Major API changes / improvements -- Added lots of convenience methods -- UDT support -- Enum support -- DB2 support thanks to Espen Stromsnes -- "Light" dependency to log4j added. jOOQ will still run without it - -Features --------- -#1 - Create support for UDTs (so far only for PostgreSQL) -#15 - Added DB2 support -#60 - Added support for nested selects in INSERT and UPDATE statements -#83 - Added log4j logging to code generation and runtime -#87 - Add support for arithmetic expressions -#105 - Added support for ENUM data types, where applicable (MySQL and PostgreSQL - so far) -#110 - Added execute and fetch convenience methods -#111 - Added missing "select distinct" support -#122 - Annotate generated classes with javax.annotation.Generated -#123 - Generate user enum fields from data values (master data) -#124 - Added PlainSQLTable -#127 - Added not() operator to Condition -#135 - Added convenience methods andNot() and orNot() in Condition - -API changes ------------ -#89 - Removed support for DataSource. jOOQ is not a transaction manager -#92 - Added SortField type to be used for sorting -#99 - Provide better access to functions (No more FunctionFactory) -#116 - Merge Manager functionality into Factory -#118 - Improve API of org.jooq.Field -#119 - Improve subquery condition API -#132 - Reduced much of the select query API -#134 - Better separation of SelectQuery and SimpleSelectQuery - -Bugfixes --------- -#109 - Error when executing select * if generated schema does not match actual - schema -#115 - Fix various "null" pseudo field issues -#126 - Error when selecting a single field from a union nested select -#129 - Fixed performance issue in Oracle code generation for very large - databases - - -Version 1.4.4 - November 22, 2010 -================================================================================ - -Unreleased version, fixes included in 1.5.0 - -Bugfixes --------- - -#133 - JoinCondition does not take comparison operator - -Version 1.4.3 - October 25, 2010 -================================================================================ - -Some more bugfixes - -Bugfixes --------- - -#71 - Generated code does not compile, when foreign key and primary key have a - data type mismatch -#73 - In Oracle generated code, multi-field foreign keys may generated bad - relations code -#82 - Conversion of literals to camelcase fails if numbers are involved - -Version 1.4.2 - October 22, 2010 -================================================================================ - -Various bugfixes and minor improvements - -Features --------- -#66 - Add support for CASE or DECODE expression - -API changes ------------ -#77 - Functions should not extend FieldImpl, but a new AbstractField -#78 - QueryPart pollutes declared method space of its implementations. Hide it - by indirection - -Bugfixes --------- -#64 - Code generation fails when foreign key references a unique key that is not - the primary key. Code generation for these cases is omitted -#67 - When loading properties files, a leading / seems to be mandatory. This is - preventing users from correctly setting up jOOQ the first time -#70 - Add support for Oracle datatype TIMESTAMP(6) -#72 - Name clashes in generated Tables -#75 - Constant does not bind its values. -#76 - Constant should not render strings all the time -#79 - Constants are not properly escaped -#80 - Position function does not bind any variables -#81 - Add cast function to Constants in HSQL - -Version 1.4.1 - October 18, 2010 -================================================================================ - -Oracle patch release - -Features --------- -#63 - Generate referential functionality for Oracle - -Version 1.4.0 - October 17, 2010 -================================================================================ - -Support for PostGreSQL was added. -Added lots of OR-mapping functionality. -There is a general API change due to various new features. - -Features --------- -#14 - Add PostGreSQL support -#40 - Resolve foreign keys. Allow for navigation between objects. -#42 - Add PlainSQLField -#45 - Add "dirty" flag to Record's values. This allows for updating only - relevant data. -#47 - Complete implementation for UPDATE, INSERT, DELETE statements. Added some - missing functionality. -#48 - Add more support for Date, Time, Timestamp fields. -#51 - Add a org.jooq.impl.Manager class that provides common utility methods for - CRUD operations - -API changes ------------ -#10 - Add second generic type . This is a prerequisite for - many OR-mapping features -#18 - Use org.jooq.Record in InsertQuery and UpdateQuery -#46 - Create UpdatableRecords as a prerequisite for JPA and true OR-mapping. - These records support store() and delete() methods -#52 - Add default constructor in generated Records. -#53 - Add refresh functionality to UpdatableRecords. See also #46 -#54 - Add a state to the factory class -#56 - Reduce API, remove unnecessary Condition subinterfaces -#57 - Reduce API, remove unnecessary QueryPart interfaces - -Bugfixes --------- -#49 - NullPointerException when generating relations on schema subset -#58 - Count function renders bad SQL in various dialects -#59 - Exception when selecting unaliased functions in queries - -Version 1.3.0 - August 24, 2010 -================================================================================ - -Support for HSQLDB was added. -There is a major API change due to #44. - -Features --------- -#29 - Generate primary keys and foreign keys in Oracle code generation -#34 - Add support for HSQLDB -#39 - Generate primary keys and foreign keys in HSQLDB code generation -#41 - Add documentation to QueryFactory and Functions - -API changes ------------ -#23 - Add support for more advanced joins -#32 - Merge SelectQuery and ResultProviderQuery interfaces -#44 - Let Query methods return "this" - -Bugfixes --------- -#35 - Add unit tests for HSQLDB support -#37 - Syntax error in combined select queries! The usage of combined queries in - MySQL may still be a bit awkward. Keep an eye out for further fixes -#43 - Join with aliased tables doesn't work - -Version 1.2.0 - August 21, 2010 -================================================================================ - -The added Oracle support is now unit tested and more stable. The Oracle NUMBER -data type is mapped more precisely to Java types. - -Features --------- -#12 - Model primary keys and foreign keys in generated code -#22 - Improve mapping of Oracle NUMBER data type -#26 - Add Plain SQL QueryParts -#27 - Add support for HAVING clause - -Bugfixes --------- -#24 - Add Unit tests for oracle database (and fixed bugs) -#31 - Pull up addOrderBy() methods from SelectQuery to ResultProviderQuery - -Version 1.1.0 - August 17, 2010 -================================================================================ - -The main new feature is the Oracle support. Wait for Version 1.1.1 for that -support to be stabilised, as there are no Oracle unit tests running against an -Oracle database yet. - -Features --------- - -#2 - Add support for inner / nested selects -#3 - Add more function support -#4 - Implement filtering functionality for code generation -#6 - Add Oracle Support -#9 - Create true POJO's (implementing org.jooq.Record) with getters and setters -#17 - Make org.jooq.impl.Parameter independent of Field - -Bugfixes --------- - -#11 - Code generation does not remove files - -Version 1.0.1 - August 14, 2010 -================================================================================ - -Features --------- - -#5 - Prevent code regeneration, if no changes were made -#7 - Implement ant task for code generation - -Version 1.0.0 - August 14, 2010 -================================================================================ -Initial Release \ No newline at end of file diff --git a/jOOQ-website/inc/RELEASENOTES-3.1.txt b/jOOQ-website/inc/RELEASENOTES-3.1.txt deleted file mode 100644 index ce8cd8e8ff..0000000000 --- a/jOOQ-website/inc/RELEASENOTES-3.1.txt +++ /dev/null @@ -1,3691 +0,0 @@ -jOOQ Release notes -================== - -For an interactive overview, see also -http://github.com/jOOQ/jOOQ/issues - -For a formatted text version, see -http://www.jooq.org/notes.php - -For a text version, see -http://www.jooq.org/inc/RELEASENOTES.txt - -Version 3.1.0 - June 30, 2013 -================================================================================ - -With this release, MariaDB is now finally officially supported by jOOQ! MariaDB -is a MySQL fork, which currently has a very similar feature set as its parent. -As such forks tend to evolve into different directions very quickly, it makes -sense to add formal support in jOOQ. - -SQL Server 2012 is another SQL dialect that is now officially supported in jOOQ, -allowing to make use of the newly supported ROWS UNBOUNDED PRECEDING and similar -windowing clauses, as well as the long awaited OFFSET .. FETCH clause. From now -on, jOOQ SQLDialect.family() allows to define a super-set of SQL dialects by the -same vendors with only subtle differences. - -POJO mapping is taken to the next level. jOOQ opened up its internal -DefaultRecordMapper providing useful Record to POJO mapping algorithms. But your -custom domain model might be more complex. Instead of creating the next -impedance mismatch, trying to foresee your own mapping algorithm needs, jOOQ -allows you to inject a RecordMapperProvider into your Configuration, allowing to -override record mapping with arbitrary behaviour. - -This minor release is also a strong step forward towards a more unified SQL -experience, where row value expression IN predicates and comparison predicates -are simulated with an equivalent EXISTS predicate. See this blog post for more -details: -http://blog.jooq.org/2013/05/03/sql-query-transformation-fun-predicates-with-row-value-expressions - -Note, that for technical reasons, jOOQ 3.0.0 could not yet be integration -tested with DB2, Ingres, and Sybase ASE. Consider using jOOQ 2.6, instead - -Features and improvements -------------------------- -#552 - Add SQLDialect.family() to group several SQLDialect versions of the same - RDBMS -#742 - Improve MySQL Stored Procedure support using MySQL 5.5's - INFORMATION_SCHEMA.PARAMETERS dictionary table -#833 - Add integration tests for both jconn3 and jTDS JDBC drivers for Sybase - and SQL Server -#963 - Map SQL Server TINYINT to UByte -#965 - Add support for Sybase SQL Anywhere unsigned number types -#1373 - Add Field DSL.coerce(Field, DataType) and similar methods, - to coerce a field to a given data type (as opposed to casting it) -#1836 - Document using jOOQ with Spring for transaction support -#1885 - Add test to count opening and closing of Statements and ResultSets by - jOOQ -#2022 - Add support for SQL Server 2012 windowing clauses in window functions -#2058 - Add support for the MariaDB database -#2095 - Document 's feature of forcing a column onto a SQL type -#2235 - Add Result DSLContext.fetchFromTXT() to allow for loading results - that were exported using Result.format() -#2236 - Add DSLContext.batch(String...) and batch(String, Object[]...) to easily - create batch statements from SQL strings -#2291 - Add DSLContext.fetchAny(Table, Condition) method and others -#2299 - Allow for setting ResultSet flags (e.g. - ResultSet.TYPE_SCROLL_INSENSITIVE through - ResultQuery.resultSetConcurrency(), resultSetType(), - resultSetHoldability() -#2310 - Add DSL.using(Connection) and DSL.using(Connection, Settings) which - auto-detect the SQLDialect from the jdbc url -#2311 - Add Configuration.recordMapperProvider() to override jOOQ's internal - default ReflectionMapper -#2339 - Support CUBRID 9.1's new features -#2344 - Add a new ControlFlowSignal that is used to explicitly jump out of a - control flow -#2355 - Add support for Postgres / HSQLDB's TRUNCATE [...] RESTART / CONTINUE - IDENTITY -#2357 - Add support for Postgres' TRUNCATE [...] CASCADE statement -#2395 - Simulate row value expression IN predicate using EXISTS -#2414 - Add Setting to influence parameter rendering (indexed, named, inlined) -#2416 - Add Result.intoXML(org.xml.sax.ContentHandler) to generate a SAX event - stream from a jOOQ result -#2423 - Add support for SQL Server 2012 native OFFSET .. FETCH clause -#2424 - Integration-test jOOQ with the SQLite xerial driver -#2426 - Add DSLContext.batch(Query, Object[]...) as a convenience for calling - batch(Query).bind(Object...).bind(Object...) -#2427 - Add more Javadoc to ResultQuery.fetchResultSet() explaining that - underlying PreparedStatements are closed with ResultSet.close() -#2428 - Simulate row value expression comparison predicates using EXISTS -#2430 - Add CustomQueryPart for use with plain SQL and other places -#2434 - Add Field.compare(Comparator, Select) and Field.compare(Comparator, - QuantifiedSelect) to allow for more dynamic SQL -#2437 - Add RenderContext.paramType() and deprecate RenderContext.inline() and - .namedParams() -#2440 - Expose the DataSource contained in the DataSourceConnectionProvider -#2441 - Add DSL.cast(Field, XXX) for increased API consistency -#2446 - Add JDBCUtils.dialect(Connection) to "guess" the jOOQ SQLDialect from a - JDBC Connection -#2466 - Add a public DefaultDSLContext implementation that can be used by users - to override the default behaviour -#2485 - Allow for treating Field as Condition -#2496 - Add support for SQL Server 2012 sequences -#2499 - Add JDBCUtils.safeClose(Connection) -#2509 - Expose CHECK constraints in jOOQ-meta -#2519 - Add Record.from(Object, Field...) from(Object, String...), - from(Object, int...) to copy only a select set of values from a POJO, - Array, Map -#2521 - Add {Row|Record}.fields(Field...), {Row|Record}.fields(String...), - {Row|Record}.fields(int...) to extract Field[] from a row or record -#2527 - Add org.jooq.tools.jdbc.DefaultResultSet to provide a default ResultSet - delegation implementation -#2531 - Add integration tests mapping binary(16) to java.util.UUID -#2532 - Let batch executions debug-log executed queries -#2535 - Convert.convert(Object, Class) should support simple casting -#2547 - Document some SQL language to jOOQ DSL API mapping rules in the manual -#2566 - Upgrade integration test jTDS version to 1.3.1 -#2571 - Add a new RecordType type to make up for the missing - recursive type definition on Record - -API changes (backwards-incompatible) ------------------------------------- -#2468 - API bug: MergeNotMatchedSetStep.set(Field, Select) returns - MergeMatchedSetMoreStep instead of MergeNotMatchedSetMoreStep - -Bug fixes ---------- -#1520 - Handle Ingres', SQLite, SQL Server's, Sybase ASE's limitations of 1024, - 999, 2100 or 2000 maximum bind values per query -#2135 - Postgres ENUM data type isn't supported correctly, if the ENUM needs - full qualification -#2323 - NullPointerException when calling Schema.getTables() on a meta schema - with SQLite -#2401 - Bad package name generated when contents are not trimmed -#2404 - Cannot combine with if both match -#2412 - jOOQ Meta does not recognise non-uppercase IN, OUT, INOUT keywords in - MySQL stored procedures -#2413 - Suppress warnings in generated code (@SuppressWarnings("all") doesn't - suppress "rawtypes" warnings with javac) -#2418 - RenderContext.data() is not passed on to QueryParts when being rendered -#2422 - Upgrade RSyntaxTextArea to 2.0.7 -#2432 - Manual refers to a package-private DefaultConfiguration constructor -#2443 - AbstractStoreQuery.execute() doesn't correctly operate on the - Configuration's ConnectionProvider in SQLite IDENTITY fetching queries -#2445 - JDBCDatabase doesn't recognise Oracle's VARCHAR2 data type (and other - vendor-specific data types) -#2447 - Tables collected through DSLContext.meta() return duplicate columns if - multi-schema environments contain identical tables -#2449 - JDBCDatabase doesn't use DataType.length(), precision(), and scale() -#2450 - Cannot set precision on TINYINT, SMALLINT, INT, BIGINT data types -#2461 - Generator Encoding Error for Database-Objects with Unicode-Names -#2464 - Bad SQL rendered from DELETE statements with aliased tables -#2469 - NullPointerException in AbstractResultQuery.fetchOneMap() -#2477 - MySQL's unsigned types cannot be used in other dialects -#2478 - IngresDatabase erroneously joins IIINDEXES to get constraint columns, - rather than using IIKEYS -#2494 - Possible null pointer passed to ConnectionProvider.release() -#2502 - Code generation fails to generate valid java for stored procedures that - accept parameters named configuration. -#2506 - SQLDialectNotSupportedException on DSL.inline(T, Class), when jOOQ's - internals are not (yet) properly initialised -#2515 - Compilation errors when generating code for artefacts that differ only - by a trailing underscore(s): A and A_ and A__ -#2523 - Statement.close() may be called upon previously closed statements -#2528 - Combining renderFormatted with inlined bind variables will change bind$ - values when they contain newlines -#2562 - Bad SQLDialect reference in Oracle and MySQL package-info.java -#2569 - Error when rendering SQL Server procedures with Settings.renderSchema - == false - -Version 3.0.0 - April 28, 2013 -================================================================================ - -This major release is a great move towards better integration of SQL as a -language in Java. Unlike any other database abstraction framework, jOOQ now -formally supports the notion of "row value expressions". The jOOQ API uses -Xtend-generated API types from Row1 .. Row22, as well as Record1 .. Record22 to -bring you even more compile-time typesafety on a record-level. - -In SQL, you can typesafely write - -
-  SELECT * FROM t WHERE (t.a, t.b) = (1, 2)
-  SELECT * FROM t WHERE (t.a, t.b) OVERLAPS (date1, date2)
-  SELECT * FROM t WHERE (t.a, t.b) IN (SELECT x, y FROM t2)
-  UPDATE t SET (a, b) = (SELECT x, y FROM t2 WHERE ...)
-  INSERT INTO t (a, b) VALUES (1, 2)
-
- -In jOOQ, you can now (also typesafely!) write - -
-  select().from(t).where(row(t.a, t.b).eq(1, 2));
-  // Type-check here: ----------------->  ^^^^
-  select().from(t).where(row(t.a, t.b).overlaps(date1, date2));
-  // Type-check here: ------------------------> ^^^^^^^^^^^^
-  select().from(t).where(row(t.a, t.b).in(select(t2.x, t2.y).from(t2)));
-  // Type-check here: -------------------------> ^^^^^^^^^^
-  update(t).set(row(t.a, t.b), select(t2.x, t2.y).where(...));
-  // Type-check here: --------------> ^^^^^^^^^^
-  insertInto(t, t.a, t.b).values(1, 2);
-  // Type-check here: ---------> ^^^^
-
- -This also applies for existing API, which doesn't involve row value expressions: - -
-  select().from(t).where(t.a.eq(select(t2.x).from(t2));
-  // Type-check here: ---------------> ^^^^
-  select().from(t).where(t.a.eq(any(select(t2.x).from(t2)));
-  // Type-check here: -------------------> ^^^^
-  select().from(t).where(t.a.in(select(t2.x).from(t2));
-  // Type-check here: ---------------> ^^^^
-
- -And for UNIONs - -
-  select(t1.a, t1.b).from(t1).union(select(t2.a, t2.b).from(t2));
-  // Type-check here: -------------------> ^^^^^^^^^^
-
- -These type-checks are preformed by your Java compiler, considering the generic -type information of your SQL statement's Record data types. These include: - -- Record1 -- Record2 -- Record3 -- ... -- Record22 - -The highest degree of typesafety was chosen to be 22, to match Scala's Tuple22, -Product22 and Function22 types. Higher degree records are still supported by -jOOQ, just without the additional typesafety. - -This Record typesafety is applied to - -- SELECT statements -- INSERT and MERGE statements: the VALUES() clause -- UPDATE statements: SET A = (SELECT...) -- UPDATE statements with row value expressions: SET (A, B) = (SELECT...) -- Quantified comparison predicates: ANY(SELECT...) and ALL(SELECT...) -- Comparison predicates: = (SELECT...) -- IN predicates: IN (SELECT...) -- BETWEEN predicates: BETWEEN (SELECT...) AND (SELECT...) -- Generated records -- The new VALUES() constructor -- Scala integration for conversion of jOOQ Record[N] to Scala's Tuple[N] - -Apart from this major improvement, there had been many minor changes throughout -the jOOQ API. Here are some important ones: - -- Factory has been split into DSL (static QueryPart construction) and - DSLContext (Query execution, "attached" QueryPart construction). This greatly - improves the overall DSL experience while allowing for more fine-grained - Executor lifecycle control. -- A ConnectionProvider has been introduced as an abstraction of the JDBC - Connection lifecycle. The standalone Connection and pooled DataSource modes - are still supported, but you can now inject your own ConnectionProvider for - more control. -- A lot of performance improvements have been implemented within the jOOQ API - removing most of the overhead caused by jOOQ when fetching data from JDBC -- A JDBC Mock API has been added to help you create simple unit tests for your - application built on top of jOOQ. -- A VALUES() constructor is now supported, and derived column lists to alias - tables and columns in one go. -- The data type API has been greatly simplified. This allowed for the - introduction of runtime precision, scale, and length information. -- CRUD has been improved through many more CRUD batch operations, explicit - INSERT and UPDATE (in addition to store()), and explicit handling of jOOQ's - internal changed flags. - -As this is a major release, some backwards-incompatibilities were inevitable. -For those users among you, migrating from jOOQ 2.x to 3.0, here are a couple of -useful hints: -http://www.jooq.org/doc/3.0/manual/reference/migrating-to-3.0/ - -Note, that for technical reasons, jOOQ 3.0.0 could not yet be integration -tested with DB2, Ingres, and Sybase ASE. Consider using jOOQ 2.6, instead - -Note, that further code generation and model API improvements were postponed to -a later release - -Note, previous release candidates contained more features, improvements and bug -fixes. See their respective sections for details. - -Features and improvements -------------------------- -#2410 - Add some more API usage examples to the section about ResultSet fetching -#2415 - Add Constants.MINOR_VERSION and Constants.FULL_VERSION for internal and - external reuse - -Bug fixes ---------- -#1998 - Wrong screenshots in the manual's section about code generation. - jooq-meta.jar is missing -#2407 - Fix bad references to pre-3.0 Factory in Javadoc - -Version 3.0.0 (RC3) - April 12, 2013 -================================================================================ - -This major release is a great move towards better integration of SQL as a -language in Java. Unlike any other database abstraction framework, jOOQ now -formally supports the notion of "row value expressions". The jOOQ API uses -Xtend-generated API types from Row1 .. Row22, as well as Record1 .. Record22 to -bring you even more compile-time typesafety on a record-level. - -See release 3.0.0 for more information. - -Features and improvements -------------------------- -#2195 - Remove the standalone tutorial, link to the manual -#2321 - Implement various Key.toString() methods -#2329 - Add Javadoc to Configuration.executeListenerProviders() -#2331 - Add hint to the manual about mvn eclipse:clean and eclipse:eclipse when - building jOOQ -#2363 - Change the readme file to use Markdown -#2366 - Add org.jooq.util.example package to jOOQ-codegen with some example - GeneratorStrategies -#2372 - Add aliases for arithmetic operators to be able to use Groovy default - operator overloading -#2389 - Make org.jooq.impl.DefaultConfiguration public -#2392 - Add Configuration.set() methods. They should allow for modifying a - Configuration -#2396 - Add DSL.function(Name, Class, Field...) and - DSL.function(Name, DataType, Field...) to allow for custom, - fully-qualified function references - -API changes (backwards-compatible) ----------------------------------- -#2378 - Allow for overriding getIdentity() and getReferences() in CustomTable - -API changes (backwards-incompatible) ------------------------------------- -#2328 - Remove UpdatableTable marker interface, pulling up methods to Table -#2342 - Change Configuration.data() to return Map -#2343 - Decouple lifecycle of Configuration and ExecuteContext -#2350 - Do not statically reference a Connection from GenerationTool -#2353 - Decouple org.jooq.Context from Configuration. Choose composition over - inheritance -#2362 - Decouple org.jooq.DSLContext from Configuration. Choose composition over - inheritance -#2379 - Replace 3.0-RC1 Executor type by a contextual DSL type constructed from - DSL.using() -#2380 - Rename org.jooq.impl.Factory to org.jooq.impl.DSL -#2382 - Let DAO reference a Configuration instead of a DSLContext -#2388 - Replace Configuration's List with - ExecuteListenerProvider[] to simplify correct and thread-safe client - implementations -#2390 - Change Configuration API to reflect jOOQ-style getter / setter naming -#2391 - Rename dialect-specific Factories [Dialect]Factory to [Dialect]DSL -#2399 - Remove support for the USE statement - -Behaviour changes (backwards-incompatible) ------------------------------------------- -#2351 - Relax ConnectionProvider contract, allowing acquire() to return new - Connections even before release() is called - -Bug fixes ---------- -#1868 - Cursor.close() doesn't terminate the ExecuteListener life cycle -#2325 - "HsqlException: incompatible data type in conversion" when binding a - UUID[] to an HSQLDB prepared statement -#2327 - Compilation error in generated tables, when a table contains a UNIQUE - key but no PRIMARY key -#2332 - Documentation example regarding DSL.concat() does not compile -#2336 - jOOQ 3.0 regression: NoClassDefFoundError caused by missing log4j - dependency -#2338 - Tutorial example unclear: There are three artefacts in Maven, not one -#2346 - org.jooq.Meta's generated Schema and other objects are Serializable, but - their enclosed Meta instance is not -#2347 - Let equals() implementations succeed early on identity -#2354 - Single page manual display errors on Firefox -#2361 - Inaccurate Configuration Javadoc explaining wrong ExecuteListener - lifecycle -#2367 - SQLite identifiers that collide with keywords should be quoted -#2381 - Do not add TableFieldImpl to table in constructor of TableFieldImpl -#2385 - fetchOne() and fetchLazy() don't terminate the ExecuteListener life - cycle when an exception occurs -#2393 - Fully qualified name not used for user-defined aggregate function - -Version 3.0.0 (RC2) - March 8, 2013 -================================================================================ - -This major release is a great move towards better integration of SQL as a -language in Java. Unlike any other database abstraction framework, jOOQ now -formally supports the notion of "row value expressions". The jOOQ API uses -Xtend-generated API types from Row1 .. Row22, as well as Record1 .. Record22 to -bring you even more compile-time typesafety on a record-level. - -See subsequent release candidates or release 3.0.0 for more information. - -Features and improvements -------------------------- -#2200 - Add Executor.fetchCount(Select) and Select.fetchCount() to replace - the projection by a COUNT(*) query -#2244 - Add section to the manual indicating that the jOOQ generator can only - handle schemas of a certain size -#2255 - Add code generation option to avoid the generation of "global object - references" -#2257 - Add List Database.getIdentities(SchemaDefinition) - for convenience to jooq-meta -#2258 - Restore private and deprecated versions of the Factory constructors, - adding some Javadoc about the changes between jOOQ 2.x and 3.0 -#2270 - Add section to the manual indicating how to build jOOQ with Maven -#2272 - Add a paragraph to the manual's preface, explaining "why not just use - SQL"? -#2281 - Add Result Executor.fetchFromStringData(List) in order - to reuse logic from fetchFromCSV -#2285 - Add more verbosity to the code generator, when configured badly -#2290 - Add Database.getUniqueKeys() and getForeignKeys to jOOQ-meta -#2297 - Add section to the manual indicating how the various generator flags - depend on each other -#2308 - Do not generate "final" Tables.java, UniqueKeys.java, etc. - -Bug fixes ---------- -#2212 - "code size too large" in generated SchemaImpl, when the number of tables - exceeds 15k -#2238 - Code generation runs extremely slow for large schemas (Inefficient - DefaultRelations.getUniqueKeys() and getForeignKeys() methods) -#2239 - Code generation runs extremely slow for large schemas (Inefficient - AbstractDatabase.filterSchema() methods) -#2252 - ArrayIndexOutOfBoundsException, when rendering plain SQL that is - terminated by a comment -#2259 - RenderMapping has no effect, if not supplied to the Executor constructor -#2262 - RenderSchema has no effect, if not supplied to the Executor constructor -#2267 - SQLDialectNotSupportedException: Type class org.postgis.PGgeometry is - not supported in dialect null, when binding PG* objects -#2271 - jOOQ Unit tests fail when not run in CET / CEST -#2273 - Tutorial bug, referencing wrong Maven dependency. jOOQ 3.0.0 is not yet - released, only RC1 -#2276 - Wrong MockDataProvider manual example -#2278 - Postgres (UUID and other) ARRAY types aren't correctly inlined as string - literals -#2279 - UUIDs aren't correctly deserialised from Postgres UDTs -#2280 - Improve supported formats for MockFileDatabase -#2283 - Class loading issues in GenerationTool when called by Gradle -#2294 - Compilation errors when code generator is configured with - true and false -#2298 - Suppress warnings in generated code (@SuppressWarnings("all") doesn't - work with javac) -#2312 - Annotate org.jooq.Support with java.lang.annotation.Documented to make - it part of the public API (in Javadoc) -#2314 - Outdated GenerationTool Javadoc - -Version 3.0.0 (RC1) - February 16, 2013 -================================================================================ - -This major release is a great move towards better integration of SQL as a -language in Java. Unlike any other database abstraction framework, jOOQ now -formally supports the notion of "row value expressions". The jOOQ API uses -Xtend-generated API types from Row1 .. Row22, as well as Record1 .. Record22 to -bring you even more compile-time typesafety on a record-level. - -See subsequent release candidates or release 3.0.0 for more information. - -Features and improvements -------------------------- -#456 - Add runtime support for PRECISION, SCALE, and LENGTH attributes -#834 - Add support for the Firebird / Postgres UPDATE .. RETURNING clause -#915 - Add Table> - Factory.values(Row[N]...), to create ad-hoc tables - from data -#1038 - Introduce new type GroupField for cube(), rollup() and groupingSets() - functions. Accept only GroupField... in groupBy() clauses -#1097 - Add org.jooq.Catalog, a type modelling an entity combining several - org.jooq.Schema -#1144 - Overload Executor.fetch[One|Lazy](ResultSet, X...) with X being - Field, DataType, Class -#1178 - Allow for treating Condition as Field -#1583 - Add support for row value expressions in UPDATE statements: UPDATE .. - SET (A, B, C) = (SELECT X, Y, Z) -#1624 - Add support for java.util.UUID as a type -#1663 - Document RenderContext and make it part of the public API -#1686 - Add UpdatableRecord.insert() and update() -#1689 - Generate E into(E) and R from(E) methods to generated records -#1690 - Add UpdatableRecord.key() returning a Record holding PK values -#1695 - Add Factory.all() and Factory.any() to create quantified expressions -#1703 - Add Executor.batchDelete(UpdatableRecord...) to mass-delete a set of - UpdatableRecords -#1801 - Add Table.as(String, String...) to allow for creating a table aliases - (correlation names) with derived column lists -#1874 - Add Record1, Record2, ... Record[N] similar to Row1, Row2, ... Row[N] to - support record type-safety -#1897 - Add a section to the manual about the migration to jOOQ 3.0 -#1899 - Make some JDBC-related utility methods publicly available in - org.jooq.tools.jdbc.JDBCUtils -#1902 - Duplicate SELECT API between Executor and Factory -#1904 - Add Executor.fetch(ResultQuery), Executor.execute(Query), and similar - methods -#1905 - Add Row[N].equal(Select) and similar methods -#1906 - Use Xtend to generate Row[N], Record[N] and other [N]-related API code - artefacts -#1914 - Document the fact that SELECT * is performed by leaving the SELECT list - empty -#1917 - Add support for CUBRID 9.0's window functions and MERGE statement -#1918 - Let generated Records implement Record[N] if applicable -#1919 - Support higher degrees of Row[N] and Record[N] types. Match Scala's max - degree of 22 -#1920 - Add more implicit defs in order to treat Record[N] as Scala's Tuple[N] -#1923 - Add Record.intoResultSet() to create a single-record JDBC ResultSet from - a Record -#1924 - Add support for CUBRID 9.0's ENUM data type -#1932 - Generate Javadocs for Table constructors -#1934 - Improve generated Record Javadoc -#1951 - Add support for the SQL Server WITH (...) table hints -#1966 - Add Row[N].equal(Record[N]) and similar convenience methods -#1967 - Document using MySQL's SQL_CALC_FOUND_ROWS as an Oracle hint -#1968 - Add org.jooq.Meta returned from Executor.meta() to return a wrapped JDBC - DatabaseMetaData object -#1972 - Move MySQLFactory.md5() to Factory and simulate it for Oracle -#1973 - Add Executor.fetchOne(ResultSet) -#1975 - Add Result.sort{Asc|Desc}(int) and (String) to order by field index / - name -#1981 - Add support for DB2 CGTT and MQT -#1983 - Improve the Javadoc on Table.as() and Field.as() to hint at - case-sensitivity and RenderNameStyle -#1984 - Add ResultQuery.fetchOneInto() -#1986 - Add Record.fromMap() as the inverse operation of Record.intoMap() -#1987 - Allow for reading data from arrays, Maps through Record.from() -#1988 - Add Record.fromArray() as the inverse operation of Record.intoArray() -#1989 - Add Record.changed(Field), changed(int), changed(String) to check - whether a single field's value has changed -#1990 - Add T Record.original(Field), original(int), original(String) to - get a Field's original value -#1991 - Reflect changed flag in Result.toString() (and thus also - Record.toString()) -#1999 - Add Record.changed(boolean) changed(Field, boolean) - changed(int, boolean) changed(String, boolean) as setters for the - changed flag -#2000 - Add Record.reset(), reset(Field), reset(int), reset(String) to - restore original values in a record -#2008 - Add elementFormDefault="qualified" to XSD specifications to allow for - XML validation of jOOQ configuration files -#2020 - Let org.jooq.ExecuteListener extend java.util.EventListener -#2021 - Add UpdatableRecord.refresh(Field...) to allow for refreshing a - subset of the Record's values -#2027 - Document semantic versioning rules as understood by jOOQ -#2028 - Add Batch.size() to indicate the number of queries that will be executed - by a batch operation -#2030 - Add reusable wrapper types for JDBC Connection, Statement, ResultSet, - etc. -#2044 - Add various TableRecord.fetchParent(...), fetchChild(...) and - fetchChildren(...) methods to follow foreign key relationships -#2049 - Add gt() / ge() / lt() / le() to Row[N] types -#2052 - Add [not]Between[Symmetric]() to Row[N] types -#2053 - Add is[Not]Null() to Row[N] types -#2066 - Add Executor.extractBindValues(QueryPart), extractParams(QueryPart) to - extract bind values in the context of an Executor (i.e. Configuration) -#2072 - Let UDTRecordImpl and ArrayRecordImpl.toString() return a valid - constructor expression -#2078 - Add Postgres to @Support annotation of SelectForUpdateWaitStep.wait() -#2079 - Support generation of bean validation annotations on records and - interfaces -#2089 - Generate an "empty" DefaultSchema for those databases that do not have - any schema (CUBRID, Firebird, SQLite) -#2094 - Add unit tests for org.jooq.tools.Convert -#2107 - Let Record implement Comparable -#2111 - Improve org.jooq.Record Javadoc, to explain the various Record subtypes -#2112 - Add Row.types() and Row.dataTypes() as a convenience -#2113 - Document Record.hashCode() and equals() through Javadoc -#2133 - Allow for mapping to "" (empty) in order to avoid the - generation of a schema -#2156 - Add Row.type(int), type(String), dataType(int), dataType(String) for - convenience -#2158 - Add Executor.fetchLazy(Table) and fetchLazy(Table, Condition) for - convenience -#2159 - Let ExecuteListener extend Serializable -#2160 - Add Executor.batchUpdate(UpdatableRecord...) to mass-update a set of - UpdatableRecords -#2161 - Add Executor.batchInsert(UpdatableRecord...) to mass-insert a set of - UpdatableRecords -#2162 - Add some more Javadoc to JooqLogger -#2170 - Add 0.0 and 1.0 to Convert.FALSE_VALUES and Convert.TRUE_VALUES -#2171 - Allow for converting booleans to numbers through org.jooq.tools.Convert: - TRUE => 1, FALSE => 0 -#2172 - Add set(Field, Select>) methods to UPDATE, - MERGE and INSERT statements -#2176 - Add hint in code generation, when an unsupported, old database version - is being used (e.g. MS SQL Server 2000) -#2177 - Add ResultQuery.intern() and Result.intern() for string interning in - result sets -#2179 - Add Javadoc to QueryPart.hashCode() and equals() -#2199 - Allow for INSERT and UPDATE of pre-existing records through - SET [ Record ] clauses -#2202 - Add Mock JDBC objects for unit testing with jOOQ -#2203 - Add Executor.map(Schema) and Executor.map(Table) as a convenience to - apply runtime schema mapping -#2204 - Add BatchBindStep.bind(Object[][]) to bind lots of bind values at a time -#2205 - Add Result Executor.newResult(Table) to generate custom - results - -API changes (backwards-compatible) ----------------------------------- -#1309 - Let Factory.val() return Param instead of Field -#2031 - Change union(Select) and similar methods to - union(Select) -#2157 - Change the bounds of various > H - fetchInto(H handler) methods to RecordHandler -#2197 - Relax bounds on Factory.groupingSets(Collection>...) to - Collection>... -#2206 - Relax bounds of R on Executor.newRecord() from TableRecord to Record - -API changes (backwards-incompatible) ------------------------------------- -#1118 - Remove support for the code generation ant task -#1254 - Move org.jooq.tools.unsigned contents to org.jooq.types (along with the - INTERVAL types) -#1374 - Relax usage of generic . Replace by where data types - are involved. -#1533 - Extract Executor API from Factory. Let Factory contain only static - QueryPart factory methods -#1549 - Externalise connection lifecycle through new ConnectionProvider -#1649 - Remove support for code generation from pre-jOOQ 2.0 .properties file -#1740 - Remove support for generated master data enums -#1875 - Add generic type to SelectXXXStep DSL type hierarchy - for increased tuple type-safety -#1887 - Remove all deprecated code -#1894 - Remove constructors from dialect-specific factories -#1907 - Remove FactoryOperations, push its API down to org.jooq.impl.Executor -#1921 - Add InsertValuesStep[N] - Executor.insertInto(Table, Field, Field, ..., Field) -#1926 - Add MergeXXXStep - Executor.mergeInto(Table, Field, Field, ..., Field) -#1977 - Remove the confusing concept of having a "main key" as opposed to a - "primary key" -#2042 - Remove generated setters, setting foreign key values from records -#2043 - Remove generated navigation methods -#2060 - Remove redundant SimpleSelectXXX API -#2117 - Remove the FieldProvider marker interface. Simplify the FieldProvider - API -#2119 - Rename Row.getDegree() to Row.size() - -Behaviour changes (backwards-incompatible) ------------------------------------------- -#1235 - SQLite BIGINT data type erroneously maps to java.math.BigInteger -#1578 - Change configuration of ExecuteListeners in Configuration. Listeners - instances should be provided, not classes -#2076 - Stop "supporting" comma-separated regular expressions in the code - generator configuration -#2088 - Do not treat CUBRID "owner" as schema in generated code - -Bug fixes ---------- -#1170 - Improve performance on jOOQ's reflection usage -#1626 - Explicitly implement hashCode() and equals() in some additional - QueryParts -#1886 - Query.bind() has no effect when Query.keepStatement(true) and - StatementType.STATIC_STATEMENT are combined -#1890 - Bad Postgres array serialisation when " or \ characters are contained in - a String[] -#1938 - Improve AbstractField.hashCode() and AbstractTable.hashCode() and - similar, as these two are called very often -#1942 - Inefficient call to String.split() in StringUtils.toCamelCase() leads to - non-negligible performance overhead in POJO transformation calls -#1937 - Inefficient implementations of AbstractDataType.equals() and hashCode() -#1954 - Bad SQL rendered when combining ORDER BY [ some-function ] with LIMIT .. - OFFSET in DB2, SQL Server -#1958 - Bad SQL rendered for OVER (ORDER BY [ some-function ]) for SQL Server - and Sybase -#1974 - Optimise various Executor.fetchOne() methods, which consume the whole - ResultSet before throwing an InvalidResultException -#1979 - Thread safety issue in org.jooq.impl.FieldList -#1982 - Change RenderNameStyle.UPPER, LOWER, AS_IS to quote literals if needed -#1992 - Bad reference to org.jooq.debug.[impl].DebugListener in the manual -#1993 - Bad code generated when the same table name exists in multiple schemas - in SQL Server -#1995 - Record.original() values aren't updated after a Record.store() operation -#1997 - Review the manual's tutorial for integrity -#2001 - Named Params are treated as null literals on right sides of comparisons -#2007 - Bad type coercion on the right hand side of a comparison predicate, when - the left hand side is Field -#2011 - Implement some micro-optimisations in DefaultRenderContext -#2025 - Correctly handle multiple foreign keys defined on the same column -#2045 - Bad hashCode calculation when Records contain arrays or byte[] -#2055 - MySQL's UPDATE [t1] JOIN [t2] syntax can cause syntax errors as column - references are not fully qualified -#2057 - Cannot properly extract bind values for LIMIT .. OFFSET clause from a - SELECT statement -#2063 - jOOQ-meta loads Firebird composite unique key columns in wrong order -#2073 - The code generator's flag doesn't affect Oracle - VARRAY and TABLE types -#2082 - Oracle PIVOT expression doesn't bind any variables of a derived table - being pivoted -#2085 - java.lang.NoSuchMethodError: org.apache.log4j.Logger.isTraceEnabled()Z - when logger dependency is missing -#2086 - SQL syntax error when aliasing outcome of a relational division -#2091 - CUBRID doesn't really have a NVARCHAR data type -#2098 - NullPointerException when org.jooq.impl.EnumConverter converts null -#2104 - SQLite code generation treats multi-column primary keys like multiple - single-column unique keys -#2108 - SQLite returns NULL for val(new Date(0)).add(-1) and some other date - time arithmetic expressions -#2128 - Misleading Javadoc in Factory / Executor.selectCount() -#2137 - Failure to assign a value to a record pojo for a column with a - composite type when using select into. -#2139 - batchStore with Postgres composite types incorrectly reuses values from - the first record. -#2140 - No table java mapping generated using maven plugin - missing inputSchema - in postgres -#2143 - UnsupportedOperationException when binding UDTRecord in batchStore() for - Oracle -#2144 - Improve AbstractField.equals() and AbstractTable.equals() and similar, - as these two are called very often -#2145 - Improve QueryPartList.removeNulls() as this is called very often -#2154 - Generated Records should access values by index, not by field, for - performance reasons -#2165 - Add H2 database definitions to the jOOQ-scala module (to prevent - compilation errors) -#2167 - Convert.convert("xx", boolean.class) returns null, instead of false -#2178 - Improve FieldList. Avoid creating excessive array lists, where simple - (immutable) Field[] are sufficient -#2180 - Optimise DAOImpl by using the new ReflectionMapper instead of calling - Record.into() all the time -#2187 - Change all Javadoc

tags to

(To fix Java 7 standard Javadoc - style layout issues) -#2210 - Executor.fetchFromCSV() shouldn't mark resulting records as "changed" -#2215 - Improve example in the "jOOQ for CRUD" section. Use only columns from - the sample database -#2223 - SQL injection is possible in org.jooq.impl.Val, if client code doesn't - correctly enforce generic typesafety, and bind variables are inlined -#2227 - Field.in(T...) doesn't convert argument values to the Field's type - -Version 2.6.0 - October 26, 2012 -================================================================================ - -This release has a new main feature: the type-safe support for row value -expressions also known as tuples - up to a degree of 8. The API is formed in a -similar way as pre-existing tuple support in languages like C# or Scala. - -jOOQ's Scala integration has also been improved through the new jOOQ-Scala -module, which provides some useful implicit defs for operator overloading. -Future versions of jOOQ-Scala may experiment with Scala 2.10's Macros - -This release also ships with a lot of new deprecation to help you prepare for -the upcoming major release. - -Minor feature improvements include: - -- Lots of new fetchGroups() and intoGroups() methods, thanks to Ivan Dugic -- JDBC execution control support, such as cancel(), maxRows(), queryTimeout() -- Allowing for re-using JDBC PreparedStatement between Query executions -- Support for the SQL standard OVERLAPS predicate -- A new RecordMapper, similar to the existing RecordHandler - -Features and improvements -------------------------- -#385 - Allow for keeping open statements in a Query -#600 - Add support for Oracle / SQL Standard linear regression functions -#1058 - Add Factory.row(T1, T2, .. TN) and Factory.row( - Field, Field ... Field) to allow for creating tuples / rows -#1077 - Add support for the SQL standard OVERLAPS predicate -#1245 - Improve formatting for DECIMAL data types in Result.format(). Nicely - align the decimal point and reserve space on both sides -#1484 - Let XJC-generated artefacts implement Cloneable -#1527 - Support for converting String to java.net.URL, java.net.URI, and - java.io.File -#1674 - Export data types with Result.formatXML() and Result.formatJSON() - exports -#1679 - Add Factory.table(String, QueryPart...) -#1708 - Add Map> ResultQuery.fetchGroups(Field, Class) -#1709 - Add Map> ResultQuery.fetchGroups(Field[]) -#1710 - Add Map> - ResultQuery.fetchGroups(Field[], Class) -#1719 - Make logic from ResultQuery.fetchArray() available in Result.intoArray() -#1728 - Add support for the MySQL COUNT(DISTINCT expr, expr...) aggregate - function syntax -#1744 - Add support for the CUBRID DECR() function -#1756 - Add RecordMapper, similar to RecordHandler, mapping records to - custom types -#1762 - Add package-info.java to add Javadoc documentation to all packages -#1766 - Simulate row comparisons where they are not supported -#1773 - Add a new jOOQ-Scala project and jooq-scala artefactId, to contain jOOQ - extensions in the Scala language -#1782 - Move JAXB bindings out of XSD, in order to support more advanced - bindings -#1783 - Generate @SuppressWarnings("all") in jOOQ-generated artefacts -#1784 - Enhance the BETWEEN predicate, introducing the AND keyword -#1810 - Add Map ResultQuery.fetchMap(Field, Class) and - Result.intoMap(Field, Class) -#1816 - Add support for materialized views in Oracle's code generator -#1828 - Reduce log level for Factory deserialisation to TRACE -#1837 - Add support for @java.beans.ConstructorProperties when fetching into - immutable POJOs -#1841 - Add SortField Field.sort(SortOrder) to allow for dynamic sorting -#1842 - Add Condition Field.compare(Comparator, Field) to allow for dynamic - comparisons -#1844 - Add Table Table.join(TableLike, JoinType) to allow for - dynamic joining -#1845 - Add Factory.schemaByName(String) for plain SQL schemata -#1848 - Add Record.changed() to indicate whether a Record contains "dirty" - values -#1849 - Add Record.original() to obtain the originally fetched values from a - Record -#1854 - Add ResultQuery.maxRows(int) to limit the number of actually fetched - records -#1855 - Add Query.cancel() to support for interrupting statements prematurely -#1856 - Add Query.queryTimeout(int) to support for JDBC's - Statement.setQueryTimeout() - -API changes (backwards-compatible) ----------------------------------- -#1800 - Deprecate AliasProvider -#1807 - Result.intoArray() declares "throws MappingException", which isn't true -#1839 - Deprecate the various Result.getValuesAs[Type] and - Record.getValueAs[Type] methods -#1840 - Deprecate org.jooq.Store -#1866 - Deprecate [Schema-Name]Factory, remove reference to it from the - tutorials -#1869 - Deprecate org.jooq.NamedQueryPart -#1870 - Deprecate org.jooq.NamedTypeProviderQueryPart -#1872 - Improve jOOQ's RenderContext pretty printing behaviour -#1881 - Deprecate ConditionProvider, OrderProvider, LockProvider types - -Bug fixes ---------- -#1593 - Factory.field("{1} + {0} + {0}", val(1), val(2)) doesn't work. Cannot - re-use / re-order placeholders -#1720 - Improve performance by using Record.getValue(int) instead of - Record.getValue(Field) internally, where more than one value is - retrieved from a record -#1751 - Result.intoResultSet() generates wrong ResultSetMetaData if runtime - schema mapping is applied -#1764 - Add missing @Support({ ... FIREBIRD ... }) annotations -#1768 - NullPointerException when DAO.fetchOne() returns no record -#1774 - QueryPart.toString() does not load default settings from classpath -#1786 - Fix SEQUENCE support for Firebird -#1791 - Log a table's input/output names, and PK name when generating code -#1792 - Factory.fieldByName() and tableByName() do not correctly escape quotes -#1797 - SQL syntax errors when plain SQL contains comments with question marks - and SQL is executed as StatementType.STATIC_STATEMENT -#1802 - Result.into(Table) doesn't work correctly, if the same field name - appears twice in Result -#1806 - Let Record.toString() wrap the record in a temporary Result and call - Result.toString() instead -#1819 - MappingException in Record.into(Class), when POJO setters have - applicable names but non-applicable argument types -#1820 - Cannot fetch into non-public POJO classes. Their members / getters / - setters should be made accessible -#1829 - Factory.execute(String) may cause errors when plain SQL returns results -#1830 - Allow for passing null or empty arrays to intoMap(Field[]) and - intoGroups(Field[]) -#1850 - Record.equals() returns true as soon as both records hold a "null" value - for a given field -#1860 - Bad Results returned from plain SQL "select *" queries, if several - selected columns share the same name -#1876 - NULL constraint violation when storing a copied record - -Version 2.5.0 - August 26, 2012 -================================================================================ - -Welcome to another great database integration in jOOQ: Firebird! This is one of -the more popular open source SQL databases out there, with a rich feature set, -including the SQL standard MERGE statement. - -Apart from this, the main new features are: - -- Optimistic locking. jOOQ's UpdatableRecord API transparently implements - optimistic locking on its store() and delete() methods. By default, the - in-memory record is compared with the one in the database at write time. But - you can also let jOOQ handle incremented VERSION or TIMESTAMP columns for you. -- Oracle feature increment. Many nice Oracle features are now supported: - user-defined aggregates, regular expressions, Oracle Text, CONNECT_BY_ROOT and - ORDER SIBLINGS BY clausess, partitioned outer joins and more -- jOOQ's convenience API has been greatly enhanced. This includes many improved - fetch methods and new short forms for equal=eq, notEqual=ne, greaterThan=gt, - etc. to better align jOOQ with JPA, XSL, QueryDSL and many other tools that - abbreviate these keywords -- Many types and methods have been deprecated to help you foresee the upcoming - changes in jOOQ 3.0 - -Please consider also the updated manual with its new, more user-friendly -structure - -Features and improvements -------------------------- -#430 - Add support for the Firebird database -#457 - Add support for Oracle user-defined AGGREGATE functions -#620 - Add support for the SQL:2008 standard LIKE_REGEX operator -#722 - Remove casting of bind values in Ingres -#727 - Simulate RPAD and LPAD in SQLite -#816 - Add support for Oracle Text functions -#1339 - Add option to generate immutable pojos -#1547 - Support "optimistic locking" in UpdatableRecord.store() and delete() -#1552 - Generate fetchBy[ColumnName] methods in generated DAO classes -#1553 - Add some Javadoc to document the difference between using a Factory with - a Connection or with a DataSource -#1556 - Add javax.validation API to full deliverable -#1565 - Add Factory.connectByRoot(Field) to support the Oracle - CONNECT_BY_ROOT pseudo column -#1570 - Add Factory.condition(String, QueryPart...) similar to - Factory.field(String, QueryPart...) -#1582 - Add support for Oracle's ORDER SIBLINGS BY clause, in combination with - CONNECT BY -#1586 - Add missing constructors taking DataSource to dialect-specific factories -#1587 - Generate missing constructors taking DataSource in schema-specific - factories -#1595 - Simulate REPEAT() in SQLite -#1596 - Add support for optimistic locking using generated information about - "timestamp" or "version" columns -#1627 - Handle NULL in CSV imports/exports -#1645 - Add support for Oracle's PARTITION BY clause in OUTER JOINs -#1657 - Reorganise the manual -#1664 - By default, activate in the code generator -#1665 - Add support for the empty GROUP BY () clause -#1675 - Add support for the SQL standard IS [NOT] DISTINCT FROM predicate -#1680 - Overload all plain SQL DSL methods to also accept QueryPart arguments -#1681 - Simulate empty GROUP BY () clause in Sybase ASE and Ingres, joining a - dummy table and grouping by a constant field -#1684 - Add Setting to indicate that fetched records shouldn't - be automatically "attached" -#1685 - Improve Javadoc of Attachable.attach(). Document how "detaching" works -#1688 - Add E Record.into(E) as a complement to E Record.into(Class) -#1692 - Replace Factory.executeInsert(), Factory.executeUpdate() and similar - methods with more succinct variants -#1696 - Add short versions of comparison predicate methods, such as eq, ne, gt, - ge, lt, le -#1698 - Add support for the SQL standard BETWEEN SYMMETRIC predicate -#1701 - Add Factory.not(Condition) as a synonym for Condition.not() -#1704 - Document the behaviour of Factory.newRecord(Table, Object) and - Record.from(Object) with respect to UpdatableRecord.store() -#1707 - Add Map> ResultQuery.fetchGroups(Field) and - Result.intoGroups(Field) -#1712 - Add > Result.sortAsc .sortDesc(Field) -#1713 - Add Result.sortAsc, .sortDesc(Field, Comparator) -#1714 - Add Result.sortAsc, .sortDesc(Comparator) -#1718 - Document usage of InvalidResultException on the ResultQuery.fetchXXX() - Javadocs -#1721 - Add Map> ResultQuery.fetchGroups(Field, Field) - and Result.intoGroups(Field, Field) -#1722 - ResultQuery.fetchArray(int) and .fetchArray(String) should return a - typed array, even if this cannot be checked by the compiler -#1723 - Add Factory.fetchLazy(ResultSet) - -API changes (backwards-compatible) ----------------------------------- -#1544 - Remove Attachable interface from QueryPart hierarchy -#1579 - Deprecate org.jooq.Type -#1580 - Deprecate org.jooq.SchemaProvider -#1638 - Deprecate org.jooq.ArrayRecord.createArray() -#1639 - Deprecate org.jooq.Adapter -#1687 - Let Cursor.fetchInto(Table) return Result instead of List -#1736 - Deprecate TableRecord.{store|refresh|delete}Using() methods as being - part of jOOQ's internal API -#1741 - Deprecate org.jooq.MasterDataType - -Bug fixes ---------- -#1572 - Use Thread.currentThread().getContextClassLoader() to load - ExecuteListener classes as a workaround for experienced class loading - problems when using OSGi -#1584 - Code generation error with Oracle UDT static functions -#1632 - Improve the performance of various DefaultRenderContext methods, by - locally caching Settings values -#1633 - Improve the performance of CursorImpl.CursorIterator by setting Record - values by index rather than by Field -#1635 - Improve the performance of Factory.fetch(ResultSet) by caching data type - normalisation regex in FieldTypeHelper -#1650 - jOOR Fix #16: Can't call Reflect.create(A, B, null) -#1660 - Factory.renderContext().castMode(CastMode.NEVER).render(query) doesn't - work. CastMode is not applied -#1667 - Bad variable binding when NULLS FIRST, NULLS LAST is simulated in SQL - Server and other databases -#1673 - Result.formatXML() and Result.intoXML() do not render namespaces - correctly -#1683 - Oracle code generation regression for 10g. No such column - ALL_PROCEDURES.OBJECT_ID -#1693 - Cannot bind UDT values from other schemata to stored procedures -#1730 - Compilation errors in SQLite generated code when flag - is set to true - -Version 2.4.0 - July 8, 2012 -================================================================================ - -This release's main new feature is jOOQ's added convenience in -Factory initialisation for those users who get their database -connectivity through JDBC DataSources. If supplied with a -DataSource, a jOOQ Factory will handle the Connection lifecycle -internally, closing the Connection when no longer needed. - -The H2 MERGE statement syntax is now supported and simulated in -other databases, for those users that prefer its more intuitive -syntax over the SQL standard. - -The code generator now also allows for generating interfaces and -DAOs per table. DAO generation was previous discussed on the user -group and seen in a competitor product called OneWebSQL. - -The jOOQ Console now supports breakpoints for even more effective -SQL development - -Features and improvements -------------------------- -#1141 - Add Result.intoResultSet() to wrap a Result in a JDBC - ResultSet -#1253 - Avoid JDBC escape syntax for date/time literals -#1280 - Generate DAO classes and interfaces for POJOs -#1404 - Document the lifecycle of an ExecuteListener in the - Javadoc -#1411 - Add support for Postgres "any" data type (with quotes!). - This seems to map well to java.lang.Object -#1418 - Support case-insensitive schema names in code generation -#1419 - Add some WARN-level logging when the source-code - generator doesn't generate any artefacts -#1423 - Add Field.likeIgnoreCase() to support Postgres' ILIKE - operator -#1424 - Add Factory(DataSource) and similar constructors -#1427 - Add Factory.batchStore(Collection>) for convenience -#1428 - Add DataType.convert(Object...) and - DataType.convert(Collection) for convenience -#1431 - Add org.jooq.Name Factory.name(String) to contruct - QueryParts that are escaped according to - Settings.getRenderNameStyle() -#1432 - Add Factory.fetch(String, QueryPart...) and - Factory.execute(String, QueryPart...) and similar methods - to support arbitrary QueryParts in plain SQL -#1434 - Add UniqueKeyDefinition.isPrimaryKey() for completeness -#1438 - Add Result Factory.fetchFromCSV(String) -#1440 - Add top-level pom.xml for jooq-parent artefact (GitHub - Issue #14) -#1446 - Converting arbitrary strings to Number / Date should - return null, instead of throwing an exception -#1449 - Generate some meaningful Javadoc into the generated - [schema-name]Factory classes -#1454 - Add line breaks to generated Javadoc where appropriate -#1463 - Add option to let generated Record / POJO objects - implement a common generated interface -#1470 - Support interface types in ResultQuery.fetchInto(Class), - Result.into(Class), and Record.into(Class) methods, - returning a proxy -#1471 - Upgrade internal jOOR dependency to jOOR 0.9.4 -#1473 - Add IdentityDefinition to jooq-meta -#1501 - Add support for conversion of String to - java.sql.{Date, Time, Timestamp}. GitHub issue #22 -#1504 - Document behaviour of fetch() and fetchOne() in case jOOQ - cannot fetch actual records -#1509 - Minor improvements in the generator source code. GitHub - pull request #23 -#1510 - Generate additional setters for foreign keys, accepting - records as arguments -#1521 - Expose Connection methods, such as commit(), rollback() - and similar transaction-related methods in Factory -#1523 - Support ROW_NUMBER() OVER() for the latest version of - Derby and H2, which support it -#1524 - Simulate ROW_NUMBER() OVER() in HSQLDB using ROWNUM() -#1528 - Let generated interfaces extend Serializable -#1532 - Clarify the lifecycle of Configuration.data in the - Javadoc -#1534 - Generate more meaningful Javadoc where "an uncommented - item" stands now -#1536 - Add documentation to the FOR UPDATE OF clause, indicating - that DB2 may have stricter requirements regarding - updatability of fields -#1541 - Add support for the H2 MERGE syntax - GitHub Issue #18 -#1542 - Simulate the H2 MERGE syntax in other dialects supporting - the SQL standard MERGE statement - GitHub Issue #18 -#1545 - Website and Documentation anchors should be links to - themselves, visually recognisable - -Features and improvements (jOOQ Console) ----------------------------------------- -#1398 - Allow for adding breakpoints in jOOQ Console - -API changes (backwards-compatible) ----------------------------------- -#1408 - Relax bounds of in Factory.truncate() to Record, - instead of TableRecord -#1429 - Change Convert.convert(List, XXX) to accept Collection - instead of List - -Bug fixes ---------- -#1020 - Improve Oracle's LIMIT .. OFFSET clause simulation. - GitHub Issue #16 -#1358 - Compilation errors in generated source code when Oracle - overloaded procedures collide with procedures that end - with numbers -#1437 - Error in Javadoc of FactoryOperations.fetchOne(). This - method may return null -#1441 - Performance issue with AbstractDataType.convert(Object). - Avoid conversions when they're obviously unneeded -#1448 - Handle String to Enum conversion (when Java Enums are - stored as Strings in the database) - GitHub issue #15 -#1459 - Generated Keys.java static class too large (static - initialiser can become bigger than 64kb) -#1460 - Table.getReferencesTo(Table) doesn't work correctly for - aliased tables -#1461 - Exception when rendering of {fn datetimeadd(...)} for - HSQLDB and Derby -#1462 - Document missing GeneratorStrategy features, such as - getJavaClassImplements() -#1465 - Custom generator strategy's printImplements() is called - with Mode == RECORD for tables -#1478 - Caching SQLDialect in AbstractDatabase heavily improves - code generation performance -#1483 - Inefficient cloning of default settings using JAXB - unmarshalling leads to non-negligible overall overhead. - Use serialisation instead (short of a useful XJC clone - plugin) -#1489 - Fix manual where it claims to throw SQLExceptions -#1490 - Compilation error when a SQL Server stored procedure has - a parameter named "value" -#1493 - Bad syntax for SELECT /*+hint*/ DISTINCT ... in Oracle -#1498 - jOOQ does not compile using JDK 7 / JDBC 4.1. GitHub - Issue #24 -#1499 - Generated members of Tables.java are not final -#1505 - Bad exception message when ON DUPLICATE KEY IGNORE cannot - be simulated -#1515 - Splitting of large NOT IN conditions is wrong. The parts - should be connected with AND, not with OR -#1522 - fetch().into(Table) doesn't initialise records correctly, - such that subsequent calls to store() will execute an - INSERT, rather than an UPDATE -#1525 - Generate missing Javadoc to getters for procedure OUT - parameters -#1529 - Factory.batchStore() logs all single statements to DEBUG - output. Find a more accurate log output -#1537 - Factory.batchStore() renders bad SQL for Postgres. The - RETURNING clause is not allowed in batch INSERTs - -Version 2.3.1 - May 11, 2012 -================================================================================ -This is an important patch release fixing some regressions in the -code generator for the Postgres dialect. With 2.3.0, it was no -longer possible to generate schemata of which the database user -was not the owner. - -Bug fixes ---------- -#1334 - Fix inaccurate simulation of TRUNC(number, decimals) for - Derby -#1403 - Documentation bug: ctx.statement() can be replaced in - executeStart(). This is not documented -#1406 - Compilation errors in generated source code when Postgres - stored procedure parameter is called "NAME" -#1407 - Compilation errors in generated source code when Postgres - data-type is "any" (with quotes!) -#1409 - Postgres code generation broken when not connecting with - the owner of a schema - -Version 2.3.0 - May 6, 2012 -================================================================================ - -This is a minor feature increment release, featuring many useful -API enhancements, some new functions, some new syntax support -elements, improved source code generation and a lot of -improvements on the jOOQ Console, thanks to Christopher Deckers. - -The updated jOOQ Console now allows for filtering incoming -statements directly on the server side, using regular expression -filters on statement text and other features. These improvements -are a part of a general strategy to introduce breakpoints and -more sophisticated debugging capability to the jOOQ Console. - -Features and improvements -------------------------- -#597 - Add support for Oracle KEEP (DENSE_RANK FIRST...) - aggregate function clause -#910 - Add ExecuteListener extension to allow for overriding - exception translator to handle vendor-specific error - codes -#1286 - Add "renderSchema" flag to Settings, to completely - disable rendering of schema names -#1293 - Generate setter methods for JAXB annotated configuration - properties -#1295 - Add support for MySQL's INSERT IGNORE clause -#1296 - Simulate the FOR UPDATE clause for SQL Server, CUBRID, - using JDBC's ResultSet.CONCUR_UPDATABLE -#1302 - Add Factory.inline() to allow for flagging inline-only - "bind values" -#1303 - Add connection-less Factory constructors for convenience, - when jOOQ is only used as a SQL query builder -#1304 - Add option to generate JSR-303 @NotNull and @Size - annotations to generated POJO's -#1307 - Let HSQLDB dialect render NVL2() as NVL2() instead of - CASE expression -#1312 - Allow for omitting , and generate all - available schemata in that case -#1315 - Let generated factories use their associated Schema as - the Settings' RenderMapping's defaultSchema -#1319 - Move jooq-spring's FactoryProxy to the core jooq project -#1322 - Add Factory.dateAdd() and timestampAdd() for convenience -#1327 - Add DataType.isLob() -#1328 - Add Field inline(char), inline(Character), - inline(CharSequence) for convenience -#1333 - Add support for the Oracle TRUNC function, for numeric - arithmetic -#1336 - Let Record.into(Class) and similar methods accept - "immutable" classes, i.e. setter-less classes that take - several constructor arguments -#1340 - Use Constructor.setAccessible(true), if no default - constructor is available on the target type of - Record.into(Class) -#1342 - Improve Javadoc on Factory.function(). Document arguments -#1349 - Add support for the CUBRID Click-Counter INCR() -#1352 - Allow for creating syntax-error and SQL-injection safe - qualifiers for org.jooq.Field and org.jooq.Table -#1361 - Add Factory.batchStore(TableRecord...), to allow for - batch UPDATE/INSERTs of many records -#1367 - Make configured ExecuteListeners default constructors - accessible -#1366 - Let org.jooq.Batch extend Serializable -#1378 - Upgrade internal jOOR dependency to jOOR 0.9.3 -#1379 - Upgrade internal jOOU dependency to jOOU 0.9.1 -#1390 - Add RenderContext.qualify() to indicate whether - QueryParts should render qualified versions of themselves - or not - -Features and improvements (jOOQ Console) ----------------------------------------- -#1242 - Upgrade jOOQ Console dependency on RSyntaxTextArea from - 1.5 to 2.0.2 -#1249 - Allow for filtering incoming statements in jOOQ Console -#1393 - Implement a communication protocol between Console server - types and Console client types to allow for more - sophisticated functionality - -API changes (backwards-compatible) ----------------------------------- -#1310 - Deprecate Factory.literal() in favor of Factory.inline(), - and Factory.field() -#1368 - Promote AbstractQuery.isExecutable() to the public API - -Bug fixes ---------- -#989 - INSERT and UPDATE statements always render non-qualified, - escaped field names. This may cause trouble when using - plain SQL fields -#1109 - Standalone TABLE or VARRAY types are not correctly - initialised before referencing tables load them -#1279 - NullPointerException when leaving empty -#1283 - The LIKE escape character needs escaping, too, in - contains(), startsWith(), endsWith() -#1306 - Add missing INTERVAL data types to HSQLDBDataType -#1308 - Oracle's DataTypeDefinition reports the length of a BLOB - / CLOB data type to be 4000 -#1313 - and match only table names, not - fully qualified names -#1323 - Add support for byte[] in Postgres UDTs -#1324 - Code generation error in Oracle 10g when generating - stored procedures -#1326 - Error when deserialising BLOBs from Oracle UDTs -#1329 - NullPointerException when passing null to - timestampDiff(Field, Field) -#1343 - Regression in insertInto(...).values(...). Cannot pass - Field to values() -#1344 - Initialise Result ArrayLists to their expected size, if - that size is known. -#1360 - jOOR issue 12: "Don't reset the accessible flag to false, - if setting it to true is required, to avoid race - conditions in concurrency contexts" -#1371 - Missing conversion when using unsafe Field types in - BATCH statements -#1376 - Oracle UDTs in REF CURSORs are not deserialised correctly - from procedure OUT parameters -#1377 - Oracle UDTs are not deserialised correctly when the same - UDT name is present in multiple schemata -#1394 - NullPointerException when omitting element in - code generation configuration - -Version 2.2.1 - April 12, 2012 -================================================================================ - -This is a minor patch release, fixing some issues related to the -code generation of the new CUBRID integration as well as other, -minor issues. Upgrade if you're using CUBRID - -Bug fixes ---------- -#1287 - Remove oracle.sql dependency also from OSGi information - in pom.xml -#1288 - SQL syntax errors from sequences when using RenderMapping - with defaultSchema -#1289 - DefaultBindContext logs as Util.class -#1297 - Compilation error in CUBRID generated artefacts - referencing OBJECT types -#1298 - Avoid source code generation errors when generating code - for unknown, dialect-specific data types - -Version 2.2.0 - April 09, 2012 -================================================================================ - -Finally, jOOQ has added support for another database, and a very -promising one, that is. http://www.cubrid.org is a surprisingly -original mixture of a relational and object-oriented database -where tables and classes are synonyms, so are records and -instances. The CUBRID database has a high level of compatibility -with MySQL and is aimed at MySQL users wanting more performance -for their web applications. For details, see the slides here: - -http://www.slideshare.net/cubrid/growing-in-the-wild-the-story-by-cubrid-database-developers - -jOOQ is proud to have become a CUBRID partner, looking forward -to further cooperation with CUBRID in the near future. - -Apart from that, jOOQ now fully supports SQL standard INTERVAL -data types. With JDBC and JPA lacking official support for this, -jOOQ aims for becoming the tool of choice for vendor-specific -date time arithmetic. True INTERVAL data type support is given in -HSQLDB, Ingres, Oracle, Postgres databases. Besides that, CUBRID -and MySQL support INTERVAL data type arguments in functions. In -other dialects, jOOQ simulates DATEADD(), TIMESTAMPADD(), -DATEDIFF(), TIMESTAMPDIFF(). - -For jOOQ's OLAP friends, there is now also support for the Oracle -LISTAGG function (LIST() in Sybase, XMLAGG() in DB2, STRING_AGG() -in Postgres, GROUP_CONCAT() in CUBRID, H2, HSQLDB, MySQL). -LISTAGG is an "ordered aggregate function", meaning that the -aggregation is done using a specific ordering. Keep an eye out -for more such function support in future versions. - -Features and improvements -------------------------- -#566 - Add support for INTERVAL data types -#585 - Add support for DATE, TIME and INTERVAL arithmetic -#1183 - Add support for DEFAULT values in Oracle stored procedure - parameters -#1243 - Let generated POJOs (and Records) extend base classes - and implement interfaces -#1252 - Avoid JDBC escape syntax for Oracle stored procedure - calls. Generate PL/SQL syntax, instead -#1255 - Let generated Tables contain a public default constructor - to be able to extend those classes - Github issue #12 -#1257 - Add CUBRID support -#1268 - Add Factory.field(String, QueryPart...) to generate - custom clauses -#1269 - Add YEAR(), MONTH(), DAY(), HOUR(), MINUTE(), SECOND() - function support as shortcuts for EXTRACT() -#1273 - Simulate GROUP_CONCAT() aggregate function using Oracle's - LISTAGG() function, where available -#1274 - Add support for the Oracle LISTAGG(...) WITHIN GROUP - (ORDER BY ..) [ OVER (..) ] aggregate / analytic function -#1275 - Simulate Sybase LIST() aggregate function using Oracle's - LISTAGG() function -#1276 - Simulate Oracle's LISTAGG() in DB2 using XMLAGG(), - SUBSTR() and CONCAT() -#1278 - DEBUG log both executed SQL and SQL with inlined bind - values - -API changes (backwards-compatible) ----------------------------------- -#1262 - Pull up OracleFactory.prior() and other CONNECT BY - related methods to Factory - -Bug fixes ---------- -#1241 - Wrong variable binding when comparing CHAR columns in - Derby and DB2 without explicit casting to VARCHAR -#1244 - Cannot override class name in GeneratorStrategy in - Mode.POJO -#1248 - Setting both false and - true leads to compilation errors -#1256 - Fixed code generation issue with H2 user defined - functions returning VARCHAR -#1263 - Pass fetchsizes <= 0 to the JDBC driver (for vendor- - specific MySQL compatibility) -#1270 - Most databases allow for multiple identical foreign keys. - This leads to compilation errors in generated source code - -Version 2.1.0 - March 18, 2012 -================================================================================ - -With this version, jOOQ attempts to follow versioning rules -imposed by semantic versioning: http://semver.org/ -There will be 1 minor release per month, and a couple of patch -releases per year, depending on popular demand - -The main improvements for this release include - -- The possibility of providing jOOQ with a custom type mapping. - You can now define your own Converter types that are used by - jOOQ to map a database's SQLDataTypes to your custom types. - This is particularly useful for Java's enums. Read more about - custom converters in the manual: - http://www.jooq.org/manual/ADVANCED/CustomTypes/ - -- There are a lot of new runtime configuration options to control - the SQL style of SQL rendered by jOOQ. You can now specify - whether table/column names should be quoted / capitalised / - lower-cased, whether SQL keywords should be capitalised or not, - etc... - -- The handling of NULL has been improved in favour of using jOOQ - as a SQL builder library (e.g. along with Spring for execution) - NULL is no longer inlined, but bound as a variable. - -- jOOQ now supports simulation of the relational division - operation using an intuitive syntax. Read more about the - relational division here: - http://en.wikipedia.org/wiki/Relational_algebra#Division - -Features and improvements -------------------------- -#161 - Add runtime configuration to pretty print rendered SQL -#349 - Add SQLite relations support -#491 - Add runtime configuration for SQL keyword style (upper - case, lower case) -#521 - Add runtime configuration for SQL reference style (upper - case, lower case, as-is, quoted) -#1150 - Add code generation option to disable generation of - records -#1181 - Add support for SQL Server data types timestamp and - rowversion -#1188 - Load default Settings from the classpath at - /jooq-settings.xml, or from -Dorg.jooq.settings -#1193 - Specify main-class in jOOQ Console's manifest.mf and - include dependency in jar file -#1194 - Add ColumnDefinition.isNullable() -#1202 - Add support for the relational division operation: - A.divideBy(B).on(A.ID.equal(B.A_ID)).returning(A.X, ...) -#1207 - Add Factory.batch(Collection) for - convenience -#1208 - Render @javax.persistence.Column(nullable = false) - property, if available -#1209 - Render @javax.persistence.Column(length, precision, - scale) properties, if available -#1215 - Add org.jooq.Converter for custom type mapping -#1216 - Overload Record, Result.getValue() and .setValue() - methods to accept a Converter -#1217 - Add EnumConverter as a base type for custom enum - converters -#1218 - Add code generation options to generate - referencing a Java type and a Converter -#1224 - Add DataTypeDefinition.getLength() to jooq-meta's type - system -#1233 - Support custom JDBC properties for jooq-codegen -#1234 - Add Database.getTable(SchemaDefinition, String, boolean) - to fetch tables case-insensitively -#1239 - Add Factory.fetchLazy(String, Object...) - -API changes (backwards-compatible) ----------------------------------- -#1191 - Deprecate ConfigurationRegistry and replace by equivalent - ExecuteListener feature -#1219 - API Bug: Cannot use LIMIT .. OFFSET along with FOR UPDATE - -Bug fixes ---------- -#625 - Remove dependency from generated Routines to the - generator's SQLDialect -#1128 - NULL is inlined in INSERT statement instead of binding it - as a variable. This can cause issues when using jOOQ with - Spring -#1137 - Exclude MySQL column-level enum types when that column is - overridden by a -#1158 - Derby cannot handle inlined NULL literals in some - contexts -#1180 - Execute BatchMultiple (multi-query batch query), when - executing BatchSimple (single-query, multi-bind-value - query) with StatementType == STATIC_STATEMENT -#1189 - TableMapping regression for SQLite database -#1190 - Cannot store SQLite records when using - StatementType.STATIC_STATEMENT -#1199 - Table.getFields() returns an internal representation of a - table's field list. Make generated tables immutable! -#1200 - Internal API leak exposed through covariance in - AbstractType.getFields() -#1211 - Enforce method name disambiguation also when using custom - strategies in jooq-codegen -#1212 - Enforce identifier disambiguation also when using custom - strategies in jooq-codegen -#1221 - Incorrect ExecuteListener invocation for INSERT .. - RETURNING. executeStart() and executeEnd() are omitted -#1223 - Cache ExecuteListener classes for performance -#1225 - Bind NULL byte[] as java.sql.Types.BINARY instead of - BLOB in Postgres, to avoid errors -#1226 - Bind NULL UDTs with their associated type name in Oracle -#1232 - SQLException when Factory.fetch() does not return a - ResultSet -#1237 - Don't generate enum classes for columns in MySQL tables - that are excluded from code generation - -Version 2.0.5 - February 26, 2012 -================================================================================ - -This release finally introduced basic runtime configuration -features for the jOOQ Factory. This configuration now includes: - -- Execute listener and SQL tracing support. jOOQ allows you to - hook your own listeners into jOOQ's query execution engine to - be notified of all sorts of events -- The existing SchemaMapping features. They are now part of the - runtime configuration -- StatementType settings. Specify whether a Factory should - execute java.sql.PreparedStatements (with bind variables) or - static java.sql.Statements with inlined variables. - -The runtime configuration is documented here: - -http://www.jooq.org/manual/JOOQ/Factory/ - -The listener and tracing support has been requested by -Christopher Deckers, a new jOOQ user who has had the courtesy to -contribute the new jOOQ Console, which is documented here: - -http://www.jooq.org/manual/ADVANCED/ExecuteListener/ - -Apart from that, another long-requested feature is now fully -implemented: The GeneratorStrategy, allowing for custom naming -strategies in generated source code. This will allow for -generating custom table / record class name prefixes / suffixes, -as well as overriding the default behaviour for rendering UPPER, -lower and CamelCase artefacts. See the manual for details: - -http://www.jooq.org/manual/META/Configuration/ - -Features and improvements -------------------------- -#93 - Add Field.equalIgnoreCase(), Field.notEqualIgnoreCase() -#408 - Add class prefixes, suffixes and other options to the - code generator -#492 - Add runtime configuration -#1107 - Let Field.contains() support the Postgres ARRAY @> ARRAY - operator -#1140 - Add ResultQuery.fetchResultSet() to return the underlying - JDBC result set -#1143 - Add Result.isNotEmpty() for convenience -#1145 - Add runtime configuration to specify whether jOOQ should - execute java.sql.PreparedStatement (with bind variables) - or a java.sql.Statement (with inlined parameters) -#1146 - Add Query.getSQL(boolean) to indicate that bind values - should be inlined (as a convenience for - Factory.renderInlined(QueryPart)) -#1148 - Add Cursor.resultSet() to expose the underlying ResultSet -#1149 - Allow for optional - "http://www.jooq.org/xsd/jooq-codegen-2.0.4.xsd" - namespace in jooq-codegen configuration -#1152 - Add & org.jooq.EnumType> - E MySQLFactory.enumType(Class, int) for enum reverse - lookups of MySQL-specific enums -#1159 - Support matching numbers with LIKE, e.g. ID LIKE '%33%' -#1160 - Implement Field.contains(), .startsWith(), .endsWith() - for numeric values, too -#1161 - Use reflection to remove compile-time dependency on - ojdbc for creating ARRAYs -#1162 - Integrate jOOR into jOOQ for simpler reflection -#1164 - Distinguish between Definition.getInputName(), - .getOutputName() -#1165 - Add constraint name to generated javadoc -#1167 - Trivial issue with org.jooq.Factory.exists Javadoc - - GitHub issue #10 -#1169 - Add Configuration.setData(), getData() to convey custom - data in a configuration's lifecycle -#1172 - Add runtime configuration to deactivate JooqLogger -#1177 - Add jOOQ-Console module to jOOQ -#1184 - Add DataType.isArray() - -API changes (backwards-compatible) ----------------------------------- -#1142 - Rename Result.exportXML() to Result.intoXML() to stay - more consistent -#1151 - Deprecate SchemaMapping in favour of new runtime - configuration - -Bug fixes ---------- -#978 - Schema.getTables() and similar methods return empty lists - when Schema is mapped with SchemaMapping -#1153 - Bad inlining of booleans in Sybase ASE / DB2 / Oracle - SQL Server / SQLite -#1154 - Bad inlining of byte[] in most dialects -#1155 - byte[] are erroneously converted to String when using - Record.intoArray() -#1156 - Bad inlining of DATE / TIME / TIMESTAMP data types in - Ingres (and other dialects, when the setting differs from - the default) -#1166 - Some generated Javadoc uses naming strategy or plain - output name, instead of qualified output name -#1168 - Oracle packages are generated as static, instead of - static final -#1175 - Factory.use() seems to render SQL with the Schema name - still present -#1179 - Oracle-generated ArrayRecords need a reference to - org.jooq.Schema to read TABLE of OBJECT from stored - procedures - -Test cases ----------- -#1147 - Add integration tests for executing SQL generated using - Factory.renderInlined() - -Version 2.0.4 - February 12, 2012 -================================================================================ - -This release introduced many improvements to source code -generation. These improvements include: - -- Maven and standalone code generation now use the same XML - configuration, which is read by jOOQ-codegen using JAXB. This - allows for more complex configuration elements in the future -- jOOQ-codegen can now handle multi-schema databases and generate - code for tables referencing tables from other schemata. This - is integration tested against the SQL Server AdventureWorks - database -- jOOQ now allows to generate simple POJOs in addition to Records - and to annotate both POJOs and Records with JPA annotations - such as @Entity, @Table, @Id, @Column, @UniqueConstraint, etc. - -You can migrate your existing .properties configuration by running -> org.jooq.util.GenerationTool /your.properties migrate - -Besides that, there is a lot of ongoing work to improve the -integration of Oracle's TABLE and VARRAY types. - -Features and improvements -------------------------- -#8 - Add JPA annotations to generated POJOs / Records -#282 - Add support for multi-schema databases -#287 - Add support for Oracle TABLE types -#395 - Use XML configuration file instead of properties file -#1089 - Add Field.contains(), .startsWith(), .endsWith() as a - convenience for Field.like() (including escaping) -#1092 - Move master data table configuration from - generator.generate to generator.database namespace -#1093 - Add support for generator.strategy in Maven source code - generation -#1094 - Add support for generator.database.date-as-timestamp in - Maven source code generation -#1095 - Move generator.generate.unsigned-types to - generator.database namespace -#1096 - Add support for generator.generate.unsigned-types in - Maven source code generation -#1103 - Add support for SQL Server data type uniqueidentifier -#1106 - Add Factory.escape(Field, char) for use with LIKE -#1108 - Add support for multi-schema databases using Maven code - generation -#1115 - Add support for Oracle VARRAY/TABLE of OBJECT types -#1127 - Add support for POJO classes generation -#1129 - Allow for using Param in LIMIT .. OFFSET clauses -#1132 - Add RenderContext.castMode() to allow for avoiding casts - where this is not really needed -#1136 - Add generation option to enable/disable generating - navigation methods - -Bug fixes ---------- -#1099 - Derby generated artefacts are not sorted alphabetically -#1101 - Internal API leak exposed through covariance in - AbstractTable.joinXXX() methods -#1110 - VARRAY element type information is lost when unnesting - VARRAY's in Oracle -#1111 - VARRAY element type information is lost when unnesting - VARRAY's returned from functions in Oracle -#1114 - Syntax error when unnesting TABLE of OBJECT in Oracle. - The unnested table contains several columns but jOOQ only - unnests "COLUMN_VALUE" -#1117 - NullPointerException when passing an ArrayRecord - containing a null array to a stored function in Oracle -#1125 - Postgres needs casting for date time data types in - queries like SELECT ? FROM DUAL -#1131 - DB2: [Noauthorized routine named "LIKE" of type - "FUNCTION" having compatible arguments was found] when - using Field.like(concat(x, y)) -#1133 - Compilation errors in generated source code if the same - constraint name exists in several schemata -#1134 - NullPointerException in code generation when a foreign - key constraint references a table from another schema - that is not being generated -#1135 - Generated Javadoc references inputSchema instead of - outputSchema - -Test cases ----------- -#1009 - Add more integration tests for proper handling of - java.sql.Date, Time, Timestamp -#1090 - Run jOOQ tests against AdventureWorks SQL Server sample - database -#1105 - Add integration tests for multi-schema source code - generation and querying -#1122 - The 10k lines of integration test code are too heavy for - the compiler. Create test modules with fewer lines of - code, each. - -Version 2.0.3 - January 29, 2012 -================================================================================ - -This release focuses on increased compatibility between various -SQL dialect integrations as far as ARRAY and JOIN support is -concerned: - -- ARRAY types are only available in H2, HSQLDB, Oracle, Postgres. - Nevertheless, they can be somewhat simulated in other dialects - using nested selects with UNION ALL. Increased compatibility - leads to a nicer API, where ARRAYs are used along with ALL/ANY - quantifiers, for instance. - -- JOIN syntaxes can be quite powerful in SQL. Apart from - simulating NATURAL JOIN, JOIN USING clauses, as well as a - synthetic "KEY JOIN" syntax, jOOQ now also supports nesting - JOIN expressions to create more complex table sources. See a - recent blog post on the subject here: - -http://blog.jooq.org/2012/01/15/lets-revise-the-sql-from-clause/ - -Features and improvements -------------------------- -#578 - Add KEY JOIN syntax to simulate joining using generated - foreign keys -#577 - Simulate NATURAL JOIN syntax, where this is unavailable -#582 - Simulate JOIN USING syntax, where this is unavailable -#671 - Allow for nesting JOIN clauses -#676 - Add Table.join() methods to create more flexible table - sources -#993 - Add Field.equalAny(T[]), .equalAny(Field) methods -#1048 - Simulate (array) syntax for dialects - that do not support arrays -#1051 - Add Factory.execute(String, Object...) as a convenience - method for Factory.query(...).execute() -#1055 - Simulate Factory.table(Object[]) and table(List) using - UNION ALL in dialects that do not support arrays -#1060 - Improve debug logging of H2 arrays. The syntax is not - ARRAY[1, 2], but (1, 2) -#1065 - Add OracleFactory.sysContext(String, String) to support - Oracle's SYS_CONTEXT function -#1069 - Add support for INSERT INTO table(field1, field2, ...) - SELECT syntax - as opposed to the existing INSERT INTO - table SELECT -#1072 - Add support for LIKE .. ESCAPE .. syntax -#1074 - Add Field.notBetween(T, T) for convenience -#1080 - Add support for JDBC's Statement.setFetchSize() in - ResultQuery.fetchLazy() -#1082 - Add some more DEBUG logging in AbstractResultQuery - -API changes (backwards-compatible) ----------------------------------- -#1059 - Change SelectFromStep.from(Collection>) to - from(Collection>) - -API changes (backwards-incompatible) ------------------------------------- -#1087 - Change the NTILE function to return Field - instead of Field - -Bug fixes ---------- -#1071 - Make Sequence Serializable -#1081 - Derby error in NULL handling when simulating unnested - arrays that contain NULL values -#1084 - Bind index mismatch in val(null).equal(null) and in - val(null).notEqual(null) -#1091 - Add missing @Support annotations on Table.crossJoin() - methods - -Test cases ----------- -#1026 - Add integration tests for NTILE window function and - document compatibility -#1073 - Add integration tests for NOT IN queries holding NULL - arguments - -Version 2.0.2 - January 8, 2012 -================================================================================ - -This is a maintenance release for jOOQ 2.0. The main improvements -include - -- The whole jOOQ API is now annotated with a new org.jooq.Support - annotation to help you assess whether a certain SQL clause is - available in your database or not. This is particularly useful - when your application should support several databases at once - (e.g. MySQL, Postgres, Oracle) -- The Oracle PIVOT clause is now formally supported for advanced - statistical queries in Oracle. This clause will be simulated in - other dialects in the future. -- The DATE data type can be mapped to TIMESTAMP. This important - when you query a legacy Oracle database, where DATE columns - can also contain time information -- Several convenience methods have been added for more fluent - syntax, when using plain SQL result queries, subqueries as - tables, or when unnesting arrays in ANY() and ALL() quantifiers - -Further type mapping support is still experimental. An official -cooperation with MinuteProject for source code generation is -being analysed. With MinuteProject, many source code generation -issues could be addressed centrally, as MinuteProject specialises -in source code generation: - -http://minuteproject.wikispaces.com/ - -Features and improvements -------------------------- -#595 - Add support for Oracle's PIVOT clause -#869 - Add support for using ANY, ALL with arrays, not just with - subselects -#1007 - Formally document the API methods to indicate whether - something is supported by any given SQL dialect -#1011 - Add code generation configuration parameter to avoid - generating @Generated annotation -#1019 - Render LIMIT x OFFSET y also for MySQL, instead of - LIMIT y, x -#1022 - Add missing Sybase ASE implementation for Factory.use() -#1024 - Add Factory.resultQuery(String, Object...) to allow for - arbitrary execution modes of plain SQL queries (lazy, - later, into, array, etc) -#1025 - Add missing SQLite implementation for Factory.deg() and - Factory.rad() -#1033 - Generate table comments into generated Tables.java as - Javadoc -#1040 - Add Object[][] Result.intoArray() and - Object[] Record.intoArray() for convenience. Let - E Record.into(Class) also support array types. -#1041 - Add Table Factory.table(Select) convenience - method for more fluency -#1042 - Add support for DISTINCT keyword in SUM, AVG, MIN, MAX - aggregate functions -#1046 - Generate Ingres table and column comments in generated - source code (only Ingres 10) - -API changes (backwards-compatible) ----------------------------------- -#1050 - Deprecate usage of SOME quantifier in predicates, such as - equalSome() - -API changes (backwards-incompatible) ------------------------------------- -#1036 - Fixed API typo in - WindowsRowsStep.rowsBetweenUnboundedFollwing() -#1037 - The fluent API allows for JOIN clauses without FROM - clause - -Bug fixes ---------- -#1010 - The MERGE INTO .. WHEN NOT MATCHED THEN INSERT .. syntax - may cause type-safety issues in some databases. VALUES - should be converted before binding -#1014 - FindBugs: Latent risk of infinite recursion due to typo - in QueryPartList.retainAll(); -#1015 - FindBugs: 7 occurrences of "Bad attempt to compute - absolute value of signed 32-bit hashcode". In extreme - cases, this could lead to SQL syntax errors -#1016 - The Oracle CONNECT BY cond1 AND cond2 syntax erroneously - creates a WHERE cond2 CONNECT BY cond1 statement -#1028 - Syntax errors when using untyped param() in HSQLDB (and - other strongly typed dialects) -#1029 - Postgres can't bind NULL values in cases, where bind type - is Object.class and bind value was created with - Factory.param() -#1030 - UnsupportedOperationException when calling - Query.bind(int, Object) on a query containing plain SQL - fields -#1031 - Incorrect debug logging when plain SQL QueryParts like - field("?") bind null values -#1032 - Incorrect debug logging when plain SQL QueryParts contain - String literals, such as 'Hello? Anyobody out there?' -#1047 - Field.notEqualAny() erroneously renders <> ALL() - -Test cases ----------- -#1021 - Add explicit integration tests for - LEFT|RIGHT|FULL OUTER JOIN - -Version 2.0.1 - December 23, 2011 -================================================================================ - -This is a maintenance release for jOOQ 2.0. The main improvements -include - -- Better integration for using jOOQ with Spring Data. This - includes support for named parameters, as well as allowing to - change bind values on previously constructed Query objects -- The MERGE statement has been enhanced for better integration - with Oracle. -- jOOQ is now ready to use with Scala / Groovy - -For more information about using jOOQ with Scala, see this blog -post: -http://blog.jooq.org/2011/12/11/the-ultimate-sql-dsl-jooq-in-scala/ - -There is now also experimental support for a custom type mapping. -This mapping allows to rewrite data types at code generation time -as well as to specify custom enum data types (e.g. boolean Y/N). -Not all integration tests run smoothly for custom data types, -hence, this feature is not yet fully supported. - -Features and improvements -------------------------- -#691 - Add support for Oracle CURSOR REF IN / INOUT parameters -#677 - Add type-mapping configuration, enforcing types for - columns -#947 - Add custom type mapping support (experimental) -#968 - Allow for custom enum types, configured in the code - generator (experimental) -#974 - Add Schema.getTable(String), getSequence(String), - getUDT(String) for better runtime Schema meta-navigation -#975 - Add Sequence.getName(), getSchema(), getDataType() -#980 - Add support for named parameters, to better interact with - Spring -#991 - Add Query.bind(String, Object) and bind(int, Object) to - easily modify existing bind values -#992 - Document thrown DataTypeException in Convert methods -#998 - Enhance MERGE statement for Oracle extensions: - WHEN MATCHED THEN UPDATE .. WHERE .. DELETE WHERE .. - WHEN NOT MATCHED THEN INSERT .. WHERE .. -#1000 - Add support for MySQL's INSERT INTO .. SET .. syntax in - MERGE statement's WHEN NOT MATCHED THEN INSERT clause - -API changes (backwards-compatible) ----------------------------------- -#981 - Cannot insertInto(table("my_table")), as plain SQL tables - return Table, not Table. Relax - bound on R -#988 - Change Factory.field(String) to return Field - instead of Field -#999 - Make MERGE's WHEN MATCHED .. and WHEN NOT MATCHED .. - clauses optional -#1001 - Identity.getField() should return TableField - instead of Field -#1006 - Add Factory.value(...) as a synonym for Factory.val(...) - for increased Scala / Groovy compatibility - -Bug fixes ---------- -#973 - EnumType renders name() instead of getLiteral() in - formatXXX() methods -#977 - EnumType renders name() instead of getLiteral() in - Convert.convert() method -#979 - Record.from() sets all changed flags to true. That's not - necessarily correct in the event of storing the record - back to the DB -#985 - AbstractRecord.equals() does not correctly compare - arrays. Compare them using Arrays.asList() -#986 - Postgres / DB2 / Sybase ASE foreign-key namespace is - unique-per-table. jOOQ forces all foreign keys from all - tables into the same namespace -#990 - Problems when encoding arbitrary byte[] as String(byte[]) - in inlined SQL. This can cause issues when DEBUG-level - logging is activated -#995 - Routines don't respect SchemaMapping - Github issue #8 -#1002 - TableRecord.storeUsing() doesn't update IDENTITY column - values, if the column is not part of the main unique key -#1003 - Sybase / SQL Server / MySQL / Ingres / H2 / Derby's - INSERT .. RETURNING simulation returns null if a table - has an IDENTITY column, but no primary/unique key -#1005 - The INSERT INTO .. VALUES .. syntax may cause type-safety - issues in some databases. VALUES should be converted - before binding - -Test cases ----------- -#984 - Detach IDENTITY column tests from UNIQUE KEY tests, - create a dedicated test suite instead - -Version 2.0.0 - November 25, 2011 -================================================================================ -This release is a fresh start in many areas of jOOQ, adressing -issues that have been requested by users for a long time. These -release notes docment the most important changes, a detailed -upgrade guide, as well as the detailed list of improvements. - -Most important changes ----------------------- -- The API became more static. This applies to many Factory - methods, such as val(), literal(), as well as to many Field - methods that have been moved over to the Factory. For example, - when before, you wrote this using "postfix function notation": - -
NAME.replace(" ", "_").trim()
- - you will now write (just as in SQL): - -
trim(replace(NAME, " ", "_"))
- - Using static imports of Factory.*, jOOQ makes SQL look even - more like SQL. The current "postfix notation" is maintained for - backwards compatibility. -- By default, jooq-codegen will now generate a "dynamic" meta - model as opposed to the existing static one. Generated tables - covariantly override the as(String) aliasing method, leading - to a much more convenient aliasing style. When before, you - wrote: - -
-Table parent = T.as("parent");
-Table child  = T.as("child");
-Condition join =
-  parent.getField("ID").equal(child.getField("PARENT_ID"))
-
- - You can now write: - -
-T parent = T.as("parent");
-T child  = T.as("child");
-Condition join = parent.ID.equal(child.PARENT_ID)
-
- - Of course, the existing notation still works - -- Exceptions are no longer checked. When previously, the DB's - SQLException was propagated to client code, there is now an - unchecked DataAccessException hierarchy, similar to that of - Spring. This will eventually give way to a standardised error - handling abstraction, in future developments. -- Window functions are now constructed from their underlying - aggregate functions just like in SQL. For example: - -
-sum(AMOUNT)
-sum(AMOUNT).over().partitionBy(ACCOUNT)
-
- - This makes for a more concise API, especially when considering - future extensions, such as Oracle's KEEP (DENSE_RANK FIRST...) - syntax. -- More type safety has been introduced regarding various places - where generic and types are involved. - This is especially true for INSERT / UPDATE / DELETE statements -- Sequences now also have a type -- Unsigned number types are now supported in those databases that - use them. Unsigned numbers are implemented in jOOU, a spin-off - open source project. For convenience, this library is - "internalised" into jOOQ, to avoid adding a dependency - -http://code.google.com/p/joou/ - -Upgrade instructions: ---------------------- -Various of the above changes are incompatible with jOOQ 1.x. In -order to upgrade, please be aware of the following pitfalls: - -- The schema needs to be re-generated. -- Much of the post-fix function notation is replaced by static - methods in the Factory. Today's org.jooq.Field API is - maintained in jOOQ 2.0, for backwards compatibility. It will - be removed, eventually, though. Expect some incompatible - changes, where window functions are involved -- Some Factory instance methods (such as val(), literal()) are - now static. They are compatible, but may cause compiler - warnings. -- The meta model is now an instance model by default. If you - prefer the static meta model, you can configure this in your - jooq-codegen configuration. -- The additional typesafety involving and types may cause - compiler warnings and errors. -- SQLException is no longer part of the API. This can cause - compiler issues, in particular when extending jOOQ -- Some utility classes have moved to org.jooq.tools - -Should these incompatibilities be too significant for your -project, you can still stay on the 1.x branch, which will be -maintained for a while. Be aware that upgrading might be more -difficult, later, though. - -Features and improvements -------------------------- -#55 - Implement improved exception handling -#117 - Improve DSL support for field and table aliasing (decrease - verbosity) -#519 - Add support for MySQL UNSIGNED numeric types -#626 - Create static function access -#661 - Add support for bitwise operators -#718 - Sequences should be mapped to appropriate type (e.g. - SMALLINT, INT, BIGINT, etc) -#734 - Add support for Oracle / SQL Server CUBE() and ROLLUP() - grouping functions -#751 - Add support for Oracle / SQL Server GROUPING SETS() - function -#799 - Add support for Oracle PL/SQL's object-oriented MEMBER - PROCEDURES and MEMBER FUNCTIONS -#804 - Add to Insert, Update, Delete -#835 - Review API typesafety for InsertSetMoreStep - set(Field, T) and similar methods -#890 - Add Factory.selectCount() convenience method -#891 - Let min() max(), etc functions return a new type - AggregateFunction. This type can then be used as an entry- - point for window functions -#892 - Add support for Oracle / SQL Server GROUPING() and - GROUPING_ID() functions to be used along with CUBE() and - ROLLUP() -#893 - Simulate ROLLUP() function for MySQL, using the WITH - ROLLUP grouping modifier -#894 - Move functions from Field to org.jooq.impl.Factory - and make them static -#895 - Add power(..., Field) -#897 - Add (experimental) Spring integration project -#898 - Replace usage of checked SQLException by an unchecked - DataAccessException, similar to that of Spring -#899 - Build jOOQ .jar files as bundles to be deployed into OSGI - environments -#900 - Purge deprecated API - Prior to 2.0 -#901 - Introduce InvalidResultException as a subtype of - DataAccessException for integrity checks in methods like - ResultQuery#fetchOne(), ResultQuery#fetchMap(), etc. -#902 - Make AggregateFunction the base type for constructing - window functions -#904 - Move SQLDialectNotSupportedException into - org.jooq.exception package -#905 - Introduce MappingException as a subtype of - DataAccessException for integrity checks in methods like - ResultQuery#fetchInto(), etc. -#907 - Add missing Field.like(Field), notLike(Field) - methods to overload the existing Field.like(T), notLike(T) -#908 - Change rpad / lpad functions to accept String instead of - char -#912 - Add R newRecord(Table, Object) as - the inverse of various into(Class) methods -#916 - Add > {Record.into(Table) | - Result.into(Table) | ResultQuery.fetchInto(Table) | - Cursor.fetchInto(Table)} -#917 - Add various Cursor.fetchOneInto() convenience methods -#918 - Add CustomTable, CustomRecord as base classes for more - convenience when used with various into(Table) methods -#919 - Allow for accessing non-public constructors of Record - subtypes -#923 - Move some utilities to org.jooq.tools -#924 - Generate a reference to every table in a new Tables.java - class for improved static access -#928 - Add DataTypeException extending DataAccessException in - case something went wrong when converting data types -#930 - Support converting date time types to java.util.Calendar. - This applies to various into(Class) methods, as well as - Result.getValue(xx, Class) -#931 - Allow for conversion between Long and date/time types, and - vice versa -#932 - Let the bound of R in TableRecord extend TableRecord, - in UpdatableRecord to extend UpdatableRecord -#933 - Add support for type Character in Record.into(Class) - methods and similar -#936 - Accept primitive types, such as int.class for type - conversion -#938 - CODEGEN: Add static/instance table field configuration -#939 - Include license.txt and readme.txt in .jar files' META-INF - directory -#953 - Make DefaultGeneratorStrategy methods non-final to allow - for overriding -#954 - Add examples for source code generation of multiple - schemata with Maven -#955 - Generate a reference to every type in a new UDTs.java - class -#957 - Add R Factory.newRecord(UDT) for constructing - attached UDTRecords -#958 - CODEGEN: Add generation-time schema mapping, allowing for - re-writing schemata in jooq-codegen -#960 - CODEGEN: Add code generation configuration parameter to - avoid using the new UByte, UShort, UInteger, ULong wrappers - for UNSIGNED number types -#961 - Use Oracle's SYS.ALL_SEQUENCES.MAX_VALUE to determine the - type of a sequence. -#969 - Add List ResultQuery.fetch(Field, - Class) convenience method - -Bug fixes ---------- -#686 - Reduce the internal API leak by preventing access to - TableFieldImpl, UDTFieldImpl, ParameterImpl -#903 - lag(Field, int, T) erroneously delegates to lead() -#906 - Add more NullPointerException safety to API -#913 - NoClassDefFoundError in JooqUtil.isJPAAvailable() -#920 - Generic type is lost in Cursor.fetchInto(RecordHandler) -#925 - SelectConditionStep should extend SelectConnectByStep, not - SelectGroupByStep -#926 - AbstractRecord.into() fails to convert java.sql.Date into - java.util.Date -#934 - Don't consider static members in reflection utilities when - used with Record.into(Class) and similar methods -#935 - Don't consider final member fields in reflection utilities - when used with Record.into(Class) and similar methods -#937 - In the event of name clash (same name for table and field) - generated code has errors -#945 - Calling UpdatableRecord.setValue() twice with the same - argument causes the changed flag to be reset to false -#948 - Always set the changed flag to true in Record.setValue() -#959 - Compilation errors in generated source code if MySQL enum - values match Java reserved words, such as 'true', 'false', - 'new', etc... -#962 - Postgres ordering of generated enum literals is unstable -#967 - Better document type conversion - -Version 1.7.0 - November 25, 2011 -================================================================================ -This is a maintenance release for the 1.x branch. Some important -bug fixes are merged from version 2.0. These include: - -Bug fixes ---------- -#925 - SelectConditionStep should extend SelectConnectByStep, not - SelectGroupByStep -#926 - AbstractRecord.into() fails to convert java.sql.Date into - java.util.Date -#937 - In the event of name clash (same name for table and field) - generated code has errors -#945 - Calling UpdatableRecord.setValue() twice with the same - argument causes the changed flag to be reset to false -#948 - Always set the changed flag to true in Record.setValue() -#951 - Empty Password for jooq-codegen-maven causes NPE - -Version 1.6.9 - November 7, 2011 -================================================================================ -This is a maintenance release for the 1.x branch. Developments -on this branch will stop after version 1.6.9. Only important bug -fixes are merged to this branch. Developments for release 2.0 -have started. - -The most important functionality in release 1.6.9 is the newly -added support for JDBC batch operations. You can now batch -execute several queries. - -See the official blog for more information: -http://blog.jooq.org/2011/10/25/jdbc-batch-operations-with-jooq/ - -Features and improvements -------------------------- -#621 - Add support for JDBC batch operations -#794 - Add support for ORDER BY [int value] in order to reference - a column index for sorting -#882 - Optimise Field.isTrue() and isFalse(). Take Field's data - type into consideration. -#885 - Add support for INSERT INTO .. VALUES (..) syntax, - omitting explicit field declarations -#887 - Add List Cursor.fetchInto(Class) - -Bug fixes ---------- -#748 - H2 regression in 1.3.158 regarding stored functions, which - return a ResultSet (this was fixed in H2) -#859 - Derby casting of numeric types to BOOLEAN doesn't work -#886 - Regression in date extract function when used in a - subselect -#888 - Derby casting of VARCHAR to FLOAT (and similar) doesn't - work - -Version 1.6.8 - October 22, 2011 -================================================================================ -The main improvement of this release is the re-design of the -stored procedure / function API. With 12 supported RDBMS, which -all have their own idea about what is a stored procedure and what -is a stored function, it has proven to be a better design, to -unite them in one single type: org.jooq.Routine. A routine can -have a return value as well as OUT parameters. It can be embedded -in SQL and used as a field or a table. - -This means, you will need to re-generate your database schema, -when upgrading to jOOQ 1.6.8. After re-generation, you'll need to -fix your client code. These are the package changes: - -- [generated.package].procedures > [generated.package].routines -- [generated.package].functions > [generated.package].routines -- [generated.package].Procedures > [generated.package].Routines -- [generated.package].Functions > [generated.package].Routines - -Oracle generated packages are not re-located. With these -improvements, using stored procedures and functions becomes even -more reliable, especially when cursor types are involved. Read -more about the rationale behind this change: - -http://blog.jooq.org/2011/10/17/what-are-procedures-and-functions-after-all/ - -Apart from that, important improvements have been made in the -area of plain SQL tables. Also, consider a demo integration of -jOOQ with Google Cloud SQL: - -http://blog.jooq.org/2011/10/22/jooq-and-google-cloud-sql-example/ - -Features and improvements -------------------------- -#271 - Don't pre-fetch table meta data when selecting from plain - SQL tables -#489 - Add support for SELECT * (i.e. render SELECT * where - applicable) -#596 - Add support for VARIANCE() and STDDEV() OVER() window - functions -#608 - Add jOOQ version number in generated source code -#670 - Add more Javadoc to Field.xxx() functions -#692 - Add support for ResultSet type returned from HSQLDB - stored functions -#850 - Use http://www.jooq.org as URL for the @Generated - annotation -#854 - Add convenience methods Fields.isTrue(), isFalse() for - conversion of "Y", "YES", "1", "true", "on", etc into a - boolean condition -#870 - Add support for MEDIAN aggregate function -#872 - Add support for STDDEV_POP(), STDDEV_SAMP(), VAR_POP(), - VAR_SAMP() aggregate functions -#874 - Reduce the number of internal classes for dialect-specific - function aliases -#878 - Implement DataType.equals() and hashCode() - -API changes (backwards-compatible) ----------------------------------- -#851 - Change Field.{sortAsc|sortDesc}(List sortList) into - Field.{sortAsc|sortDesc}(Collection sortList) - -API changes (backwards-incompatible) ------------------------------------- -#848 - Purge deprecated API - Prior to 1.6.1 -#849 - Replace Cursor.fetchResult() by Cursor.fetch() -#852 - Review stored procedures / functions concept. Merge them - all into a single "Routine" type - -Bug fixes ---------- -#756 - Error when aliasing HSQLDB and Postgres unnested tables -#761 - Exception when TRACE logging execution with plain SQL - tables involved -#773 - Execute standalone stored functions as CallableStatement - to prevent issues with transactions -#847 - Query.getSQL() doesn't render dialect-specific SQL when - Query is constructed using the fluent API -#853 - DB2 generated convenience methods for stored functions - have unstable ordering -#857 - Derby casting of numeric types to String / VARCHAR does - not work -#858 - SQLDataType.getSQLDataType() should return itself, instead - of null -#860 - SQLite CEIL function is incorrectly simulated. CEIL(2.0) - returns 3.0 instead of 2.0 -#861 - Field.replace(String) generates bad SQL for various RDBMS. - Field.replace(String, String) works, though -#863 - Ingres integration generates illegal SQL when selecting - things like SELECT 1 WHERE 1 = 1 -#866 - Sybase ASE Field.replace(String) function incorrectly - removes the argument string -#873 - Error when selecting two times the same aggregate field -#877 - Compilation error in generated source code when a table - without a primary key has an identity column -#879 - Add Google Cloud SQL Example -#880 - Query.getSQL() does not consider SchemaMapping - -Test cases ----------- -#811 - Loader integration tests fail for SQLite -#812 - CSV Loader test leaves Postgres JDBC connection in an - inconsistent transactional state on error -#856 - Add integration tests for Field.abs() -#865 - Add integration tests for Field.ascii() -#867 - Add integration tests for Field.sum(), avg(), max(), min() -#881 - Re-design H2 stored functions to be pre-compiled, in order - to speed up integration tests - -Version 1.6.7 - September 25, 2011 -================================================================================ - -This release coincides with the launch of the new website at -http://www.jooq.org. Hence, it ships with little additions to the -deliverable itself. - -Apart from new convenience methods, the main addition is a Maven -plugin for jooq-codegen contributed by Sander Plas. - -Features and improvements -------------------------- -#797 - Create Maven plugin for source code generation -#825 - Add List> Factory.fetchMany(String) to - allow for fetching several result sets from stored - procedures, such as Sybase ASE's "sp_help" -#838 - Implement MetaDataFieldProvider.toString() -#841 - Add List Result.getValues(Field, Class) -#842 - Add Query.getBindValues() method to allow for extracting - bind values in the correct order -#843 - Add Factory.fetch(ResultSet) to transform a JDBC ResultSet - into a jOOQ Result - -API changes (backwards-compatible) ----------------------------------- -#837 - Avoid final keyword on Object methods, such as .equals(), - .hashCode(), etc - -Bug fixes ---------- -#836 - Bad syntax when selecting from aliased plain SQL tables -#839 - Boolean conversion in getValueAsBoolean() should trim - String values first -#840 - Numeric conversions in getValueAsXXX() should trim String - values first -#844 - NullPointerException when selecting a column from a Result, - that does not exist - -Version 1.6.6 - September 11, 2011 -================================================================================ - -Finally, support for another RDBMS has been added. Sybase's other -important product Sybase Adaptive Server Enterprise (or simply -Sybase ASE) is now officially supported by jOOQ - -Apart from this, there had been important improvements with the -recently added INSERT .. RETURNING clause, as well as some fixes -related to DECIMAL / NUMERIC data types - -Features and improvements -------------------------- -#796 - Complete missing public org.jooq.impl Javadoc -#800 - Add support for Sybase Adaptive Server Enterprise -#808 - Add support for INSERT .. RETURNING for Ingres -#809 - Add support for INSERT .. RETURNING for Sybase SQL - Anywhere using SELECT @@identity -#810 - Add support for INSERT .. RETURNING for SQLite using - last_inserted_rowid() -#813 - Add DSL support for INSERT .. RETURNING -#814 - Change TableRecord to reload its trigger-initialised main - key in Oracle and other RDBMS that don't support IDENTITY - columns -#818 - Add SQLiteFactory.rowid() -#819 - Support SQLite AUTOINCREMENT columns as IDENTITY -#820 - Add Factory.fetchOne(String) for executing plain SQL - queries that return single records -#826 - Allow for returning several records in the INSERT .. - RETURNING clause. This now works for DB2, HSQLDB, MySQL, - and Postgres -#827 - Support Sybase SQL Anywhere's TOP n START AT m clause - instead of simulating it with nested SELECT's - -API changes (previous API now deprecated) ------------------------------------------ -#817 - Deprecate Factory.lastID(Identity) - -Bug fixes ---------- -#815 - SQL Server fetching of IDENTITY value is broken -#821 - Optimise ResultQuery.fetchAny() executing fetchLazy() - internally, and only fetching one record from the cursor -#822 - Let Constant cast to more precise NUMERIC/DECIMAL types - in those RDBMS where casting is necessary -#823 - Cannot bind SQLite BigDecimal, BigInteger types - bind - them as String instead -#824 - BigInteger values cannot be bound in DB2, Derby -#828 - Document inefficient implementation for GREATEST and LEAST - in some RDBMS - -Version 1.6.5 - August 28, 2011 -================================================================================ - -This release finally adds a loader for CSV data to jOOQ. You can -now load CSV data using a simple fluent API, configuring error -handling, duplicate behaviour and transaction handling, as well -as various CSV parameters. - -This release also changes the way generated keys are retrieved -after INSERT's. Instead of (potentially inconsistently) running -SELECT MAX(pk) immediately after the INSERT, Postgres' INSERT.. -RETURNING clause is used (or simulated), in a single statement. - -Features and improvements -------------------------- -#784 - Add Result.exportXML() to retrieve a DOM document similar - to that of .formatXML() -#792 - Add support for loading of CSV data into tables -#795 - Add List fetch(int, Class) and - fetch(String, Class) convenience methods -#803 - Add support for INSERT .. RETURNING or simulate it where - not available -#805 - Add T[] fetchArray(int, Class) and - fetchArray(String, Class) convenience methods -#806 - Add T fetchOne(int, Class) and - fetchOne(String, Class) convenience methods - -Bug fixes ---------- -#798 - Oracle IN (...) clause with more than 1000 arguments does - not work -#802 - Use "INSERT .. RETURNING" instead of "SELECT MAX(pk)" - to retrieve the primary key of a new record - -Version 1.6.4 - August 07, 2011 -================================================================================ - -This release ships with a couple of useful concepts inspired by -other frameworks. These are: - -- selecting into custom POJO's. Results can be mapped to POJO's - by convention or using JPA @Column annotations -- selecting into custom callbacks. This is already a wide-spread - practice in Spring JdbcTemplates. -- selecting long-running queries asynchronously. This idea has - been inspired by the Avaje Ebean framework - -Apart from these changes and some bugfixes, the internal API has -been completely re-designed. The idea here is that query -rendering and variable binding are even faster (less String -objects), more extensible and more accurate. This is a pre- -requisite for many future developments with even more complex SQL -statements, such as for instance CTE's (Common Table Expressions) - -Features and improvements -------------------------- -#137 - Add support for asynchronous query execution using - FutureResult ResultQuery.fetchLater() similar to - Avaje Ebean -#198 - Add SELECT INTO functionality into POJO's using - T ResultQuery.fetchInto(Class) similar to JPA - CriteriaQuery -#728 - Add .fetchInto(RecordHandler) to ResultQuery, Result, - and Cursor to allow for callbacks similar to Spring's - JdbcTemplate/Ollin Framework -#774 - Add more TRACE logging to .fetchLazy() -#777 - CURSOR: Add function alias: UNNEST for TABLE -#781 - Add E function (Euler number) -#782 - Add T Record.getValue(..., Class) methods - for convenient type conversion -#785 - Allow for storing TableRecord with a provided Field[] - indicating the primary key -#786 - Document thread-safety facts in Factory Javadoc -#788 - Add Key.getFieldsArray() convenience method -#793 - Add support for Oracle's SYS_CONNECT_BY_PATH function - -API changes (backwards-incompatible) ------------------------------------- -#758 - Change internal QueryPart rendering and binding API to use - Configuration and Context as callback parameters. If you - use CustomField or CustomCondition, please correct your - implementations accordingly. Other parts of the API should - not be affected -#778 - Purge deprecated API, deprecation prior to jOOQ 1.5.7 -#790 - Purge deprecated generated code, deprecation prior to - jOOQ 1.5.7 - -API changes (previous API now deprecated) ------------------------------------------ -#776 - Deprecate QueryPart.getSQL(), add Query.getSQL() -#789 - Deprecate Record constructors with Configuration - parameter - -Test cases ----------- -#636 - Add integration tests for more advanced CONNECT BY - example -#772 - Add integration tests for selecting cartesian products - (several tables in FROM clause) - -Bug fixes ---------- -#730 - Sybase cannot bind null values in plain SQL -#759 - Omit the TOP 100 PERCENT clause in SQL Server ordered - top-level queries -#767 - An empty Java package is generated for PL/SQL packages - containing underscores -#771 - Some exotic literals are not properly escaped with quotes - yet, e.g. UDT identifiers, VARRAY types, etc. -#775 - Automatic re-attaching after deserialisation does not work - when used with .fetchLazy() -#787 - The UpdatableRecord's internal changed flags are not - updated after INSERTs / UPDATEs - -Version 1.6.3 - July 31, 2011 -================================================================================ - -This is mainly a maintenance release with lots of bugfixes, -mostly around code generation, plain SQL tables, and data types. -Please note that generated source code may contain incompatible -changes due to #639 (see below for details)! - -Apart from that, project CURSOR is advancing and it is now -possible to unnest arrays into tables. See this article for -details about where jOOQ is heading with project CURSOR: - -http://blog.jooq.org/2011/07/24/the-power-of-ref-cursor-types/ - -Features and improvements -------------------------- -#679 - Improve H2 NVL2 support as of H2 1.3.156 -#680 - Improve H2 ROUND support as of H2 1.3.156 -#735 - Add README documentation to GitHub -#736 - Add more info regarding number of generated artefacts in - jooq-codegen logging -#750 - Add DataType.isNumeric(), .isString(), .isTemporal(), - .isBinary() -#754 - Log query as executed by JDBC PreparedStatement when - TRACE logging (without inlining variables) -#752 - CURSOR: Add support for selecting from ARRAY types -#762 - Use H2's native support of NVL, instead of COALESCE -#764 - CURSOR: Add support for selecting from ARRAY types - returned from stored functions - -API changes (backwards-incompatible) ------------------------------------- -#639 - Map DECIMAL(n, 0) and NUMBER/NUMERIC(n, 0) data types - to Byte/Short/Integer/Long/BigInteger instead of - BigDecimal in generated source code. Re-generated code - will not be compatible! - -API changes (previous API now deprecated) ------------------------------------------ -#731 - Inconsistent API with Field.lessOrEqualToXXX(). Removed - "To" from method name -#757 - Deprecate Factory.constant() methods - -Test cases ----------- -#731 - Add missing integration tests for equalAll(), equalSome() - and similar methods -#747 - Upgrade H2 to 1.3.158 - -Bug fixes ---------- -#632 - Sybase error : column @p0 not found in nested SELECT -#700 - Restore HSQLDB ARRAY support with INFORMATION_SCHEMA - change in HSQLDB 2.2.3, and some fixes in 2.2.5 -#725 - Cannot insert byte[] data with plain SQL -#733 - H2 changed JDBC type for ResultSet/CURSOR from 0 to -10, - like Oracle -#737 - Compilation errors in generated source code if table - fields contain spaces -#738 - Compilation errors in generated source code if MySQL - procedure parameter type contains two comma-separated - arguments (like DECIMAL(10,2)) -#739 - Postgres navigator methods and keys are not re-generated - in the same order -#740 - Formatting is broken on Result.format() with some special - newline characters -#743 - Make SQL Server INFORMATION_SCHEMA independent from - HSQLDB again, to prevent incompatibility issues -#744 - Ingres REAL and FLOAT4 types are generated as FLOAT/FLOAT8 - which maps to java.lang.Double, instead of java.lang.Float -#753 - Postgres error when binding array that contains null - values -#755 - NullPointerException when converting an array containing - a null value -#766 - Bad decoding of JDBC Types BIGINT (to BigInteger instead - of Long) and REAL (to BigDecimal instead of Float) when - plain SQL tables are involved - -Version 1.6.2 - July 10, 2011 -================================================================================ - -This release mainly introduces three new projects. - -Project CURSOR where jOOQ finally supports various RDBMS's TABLE, -CURSOR, and REF CURSOR data types. This is especially useful when -those types are returned from stored procedures and functions. -Cursors are simply mapped to jOOQ Result types and can -thus be used like regular table results - -Project EXPORT aims at exporting data from the database in -various serialisable formats, such as XML, CSV, HTML, Text, JSON. -This project will be continued in the future, to also -deserialise from (some of) these data streams. This will allow -for easy transport of jOOQ Result types over the net. - -Project CODEGEN has finally been started. Many improvements -suggested by jOOQ users will be implemented in the next releases. -In this release, important fixes have been made to prevent -compilation errors in generated artefacts. - -Features and improvements -------------------------- -#61 - EXPORT: Add Result.formatXML() -#166 - CURSOR: Add support for ResultSet type returned from - Oracle stored procedures / functions -#411 - Allow for fetching Map (instead of Record) - and List> (instead of Result) -#549 - Add Factory.function() for plain SQL functions -#611 - Simulate RPAD and LPAD in SQL Server, Sybase -#627 - Add support for Postgres FOR UPDATE OF [table-name] clause -#628 - Add support for REPEAT (SQL Server: REPLICATE) function -#637 - Nicely format time in StopWatch logging output -#640 - Simulate Postgres FOR UPDATE OF [table-name] clause in - other dialects -#649 - CURSOR: Add Cursor.fetch(int) .fetchOne() - .fetchResult(int) .fetchResult() -#653 - Add support for MySQL encryption and compression functions -#660 - Clarify Javadoc of UpdatableRecord to explain its - behaviour when changing the main unique key -#669 - EXPORT: Add Result.formatHTML() -#672 - Add convenience method UpdatableRecord.copy() in order to - reset primary key values for a subsequent INSERT -#675 - EXPORT: Add Result.formatCSV() -#683 - Implement ResultImpl.equals() and .hashCode() -#684 - Implement AbstractStore.equals() and .hashCode() -#685 - Add Store.size() to indicate the maximum index of the - Store -#687 - EXPORT: Add result.formatJSON() -#689 - Create separate builds: jooq-core.zip and - jooq-with-dependencies.zip -#690 - CURSOR: Add support for ResultSet type returned from H2 - stored functions -#695 - CURSOR: Add support for ResultSet type returned from - Postgres stored functions -#697 - Add Factory.fetch(String) for executing plain SQL queries - that return results -#701 - Add ResultQuery.fetchArray() and .fetchOneArray to return - Object[][] and Object[] -#704 - Always add top and bottom line in Result.format() -#705 - Right-align numeric values in Result.format() -#716 - Add SUBSTRING function Field.substring(Field, Field) - taking fields as arguments -#719 - Document risk of SQL injection in plain SQL and literal - factory methods -#726 - Add LENGTH function as a synonym for CHAR_LENGTH - -API changes (backwards-compatible) ----------------------------------- -#698 - Inconsistent API with Factory.fetch(Table [,Condition]) - Let method return Result instead of List -#699 - Let Result extend List - -API changes (previous API now deprecated) ------------------------------------------ -#656 - Decrease verbosity of plain SQL methods. They will just be - called Factory.field() .condition() .table() .query() - -Test cases ----------- -#643 - Add integration test for code generation of invalid and - incomplete types in Oracle -#654 - Add integration tests for master data tables with PK types - other than NUMBER/INT -#655 - Add missing integration tests for TRIM function - -Bug fixes ---------- -#450 - Improve plain SQL integrity checks for bind variables -#610 - CODEGEN: Compilation error in generated source code for - databases with table named 'system' -#646 - An empty Java package is generated for an empty PL/SQL - package. This is unnecessary -#651 - CODEGEN: Avoid importing datatypes in generated source - code to prevent collisions -#657 - NullPointerException when creating a Factory with a null - SchemaMapping -#658 - Master data table code generation is broken for tables - with more or less than 3 columns -#662 - Add support for the missing Postgres data type "bpchar" -#663 - Add support for the missing Sybase data type "int" -#664 - Ingres INTEGER data types are not correctly generated -#665 - HSQLDB Datatype CLOB and BLOB are not supported, when - selecting from plain SQL tables -#666 - The evil bug: Ingres TRIM function only executes RTRIM -#673 - UpdatableRecord.store() doesn't work if called after - .delete() -#702 - Add support for the missing SQLite data type "NULL" -#706 - CURSOR: Ensure that Query.execute() runs in a single - transaction when Postgres refcursor is involved in the - query (this fixes a Postgres JDBC driver flaw) -#724 - NullPointerException when passing a single literal null - bind value to plain SQL methods without casting to Object -#729 - DB2, Derby, Ingres, Oracle cannot bind null values in - plain SQL - -Version 1.6.1 - June 19, 2011 -================================================================================ - -In this release, the PORTABILITY project has been implemented. -Finally, the SQLDialect has been removed from most generated -artefacts (Schema, Table, Field, Sequence, etc). Also, the -constructing Factory is not referenced by its created QueryParts -anymore, unless this is really necessary (Query objects, UDT's, -ARRAY types). This leads to higher compatibility between schemata -of different databases, e.g. if users want to use an HSQLDB -development and Oracle productive database. - -Unfortunately, this means that the way stored procedures are -called had to be changed. This is an API break that could not be -avoided. The pre-1.6.1 StoredObject.execute(Connection) method -is deprecated and will be removed in the future. It has been -replaced by StoredObject.execute(Configuration) - -In addition to this project, many more window functions are now -supported, as well as the Oracle-specific CONNECT BY clause for -recursive queries. - -Features --------- -#351 - Add support for Oracle ROWID data type -#452 - PORTABILITY: Create a super-set of RDBMS data types -#453 - PORTABILITY: Don't create dialect-specific QueryParts -#455 - Add support for the Oracle CONNECT BY clause -#587 - Add optional OFFSET clause to form LIMIT .. OFFSET - constructs -#589 - Add extended FOR UDPATE [OF ...] [{WAIT n | NOWAIT | SKIP - LOCKED }] support -#591 - Add support for LEAD() OVER() and LAG() OVER() window - functions -#592 - Add support for the CUME_DIST() OVER() window function -#601 - Add Factory.literal() convenience methods -#602 - Add Factory.val() methods to decrease .constant() - verbosity -#604 - Add support for RESPECT NULLS clause in some window - functions -#605 - Add Factory.use(String) for non-generated schemata -#613 - Add PI function -#616 - Add Factory.two() literal convenience method -#630 - Add support for Oracle CONNECT BY pseudo-columns LEVEL, - CONNECT_BY_ISCYCLE, CONNECT_BY_ISLEAF - -API changes ------------ -#299 - PORTABILITY: Create a dialect-independent meta-model -#588 - Add OVER() keyword to FIRST_VALUE() and LAST_VALUE() API - -Test cases ----------- -#368 - Add integration test for use with schema mapping -#586 - Upgrade H2 to 1.3.155 -#607 - Add integration tests for CRUD / SP's / UDT's / ARRAY's - with SchemaMapping -#612 - Add integration tests for LPAD and RPAD functions -#624 - Add integration test for code generation of invalid/ - incomplete views in Oracle -#631 - PORTABILITY: Add integration tests for using Oracle- - generated schema against an HSQLDB database -#638 - Add missing integration test for DECIMAL data type - -Bugfixes --------- -#176 - Stored procedures / functions in EQUIVALENT schemata - cannot be called -#493 - Bind variable mismatch when constructing bad SQL -#594 - Confusing Javadoc in SELECT DSL API -#603 - Fix DB2 'IGNORE NULLS' clause -#619 - SUBSTRING() function is broken in DB2, Ingres, SQL Server -#623 - SQL syntax error for some MERGE queries in SQL Server and - Sybase -#633 - SchemaMapping is not applied to sequences -#634 - Sequences are not escaped in generated SQL - -Version 1.6.0 - June 05, 2011 -================================================================================ - -Apart from supporting various additional standard and non- -standard JOIN constructs, there is now also full support for the -SQL standard MERGE statement and MySQL's ON DUPLICATE KEY variant -thereof. A great number of API enhancements have been added, -which improve the usability of jOOQ. The Ingres database is now -also supported. - -Features --------- -#301 - Add support for Oracle execution hints -#409 - Add support for NATURAL JOIN syntax, where RDBMS allows it -#415 - Make fluent API's underlying SelectQuery objects publicly - available -#429 - Add Ingres support -#475 - Document class-level generic types and in Javadoc -#486 - Add support for SQL MERGE clause -#494 - Allow for omitting schema name in generated SQL -#496 - Automatically update IDENTITY values in UpdatableRecord, - after storing them -#520 - Add support for JOIN ... USING syntax -#524 - Upgrade HSQLDB to 2.2 -#533 - Add ORDER BY [Map] or BY [List] functionality -#534 - Add Result.isEmpty() -#535 - Call upon ConfigurationRegistry.provideFor() before - throwing a DetachedException -#536 - Simulate CASE [value] WHEN [value] THEN [result] END - syntax in Derby -#538 - Add some logging to ConfigurationProvider -#539 - Add possibility to negate numeric values with Field.neg() -#541 - Add support for MySQL ON DUPLICATE KEY clause -#542 - Allow for Collection arguments in INSERT's DSL API -#543 - Allow for creating FUNCTION() OVER() without PARTITION BY - or ORDER BY clause -#546 - Add Factory.use(Schema) -#548 - Add new internal type FieldMap -#550 - Simulate ON DUPLICATE KEY INSERT clause in dialects other - than MySQL -#551 - Add TableMapping, similar to SchemaMapping for mapping - tables -#553 - Add Factory.plainSQLQuery -#554 - Add Factory.plainSQLField with a DataType parameter -#555 - Add UpdateXXX.set(Map) convenience methods to DSL API -#557 - Enhance INSERT DSL API to allow for adding VALUES clause - with InsertXXX.set() syntax -#570 - Add support for the RAND() function -#567 - Add support for Ingres Sequences -#572 - Add support for the ATAN2() function -#573 - Add possibility for additional select() clauses for - convenience -#575 - Add support for the FULL OUTER JOIN syntax, where RDBMS - supports it -#576 - Add support for the CROSS JOIN syntax, where RDBMS - supports it -#581 - Enhance API and allow Collection> - instead of Collection> - -API changes ------------ -#397 - Purge deprecated API - -Bugfixes --------- -#481 - Handle case where an empty record is stored -#522 - Misleading Javadoc in generated stored procedures and - function constructors -#532 - Restore Postgres INFORMATION_SCHEMA -#537 - Prevent null from being added to QueryPartList -#540 - Error when TRACE logging Limit -#544 - Aliased elements are not bound correctly when rendered - with toSQLReference() -#559 - Loosen type safety on overloaded methods to prevent - compilation errors with javac/Netbeans -#560 - HSQLDB DataType REAL is configured incorrectly -#565 - Add integration tests for current_user() function -#569 - ORA-01427 when generating foreign key relations -#571 - Field.trim() not correctly implemented for SQL Server -#583 - Accelerate integration tests: Reset schema only if - necessary - -Version 1.5.9 - May 15, 2011 -================================================================================ - -This version ships with lots of new functionality. Finally, the -DSL-style API has been extended to CRUD operations (INSERT, -UPDATE, DELETE)! Also, support for the TRUNCATE TABLE statement -has been added. - -The most important new features include the support for SQL:2003 -standard window functions, which are available in most major -RDBMS. Additionally, basic function support has been widely -extended. - -Features --------- -#148 - Added support for window functions -#204 - Add support for multi-record INSERT's -#416 - Added support for retrieval of IDENTITY values -#433 - Use bind variables for LIMIT and OFFSET -#441 - Added foreign key relationship meta information to the - generated source code -#446 - Beautify ResultImpl.toString() method -#461 - Automatically cast CONCAT parameters to Field if - necessary -#463 - Added support for trigonometric functions -#471 - Added support for the sign function -#472 - Added support for GREATEST/LEAST functions -#474 - Added support for "hyperbolic" functions SINH, COSH, TANH, - and COTH -#482 - Added DSL API for INSERT statements -#483 - Added DSL API for UPDATE statements -#484 - Added DSL API for DELETE statements -#485 - Added "Registry" for client code to provide Configurations - to jOOQ Attachables -#490 - Added support for the TRUNCATE TABLE statement -#495 - Generate source code for IDENTITY columns -#501 - Added support for boolean conversion to Result, Record, - and Store -#503 - Allow for schema navigation via generated artefacts -#518 - Let stored procedures reference owner package - if applicable -#525 - Added NULLS {FIRST | LAST} clause to ORDER BY constructs -#528 - Added Factory.getDataType() convenience method -#530 - Added Factory.zero() and Factory.one() convenience methods - -API changes (jooq) ------------------- -#527 - Weakened type-safety on Field.nvl2() -#529 - Deprecated Factory.select(Object...), added .selectOne() - and .selectZero() instead - -API changes (jooq-meta) ------------------------ -#30 - Add ParameterDefinition for stored procedures, instead of - reusing ColumnDefinition -#499 - Add reference to TableDefinition in ColumnDefinition -#500 - Add AttributeDefinition for UDTDefinition, instead of - reusing ColumnDefinition - -Bug fixes ---------- -#369 - Adapt H2 relations generation to H2's correction of - information_schema.cross_references -#435 - Added integration tests for NESTED SELECTs holding LIMIT - clauses -#460 - Syntax error when using a field with a reserved name -#462 - Fixed Javadoc broken links -#473 - Don't cast when cast is unnecessary -#479 - INSERT statement should not set all fields for a table -#497 - Derby referential code generation is broken, for named - foreign keys -#498 - Oracle package content is generated in arbitrary order -#502 - Syntax error when creating an empty IN condition -#526 - Corrected Javadoc in Field.coalesce() - -Version 1.5.8 - April 29, 2011 -================================================================================ - -Finally, jOOQ now supports two important new RDBMS: -SQL Server and Sybase! - -Apart from this great enhancement, there is now also full support -for the non-SQL standard LIMIT clause, even in dialects where the -LIMIT clause is not supported natively (especially Oracle, but -also DB2, SQL Server and Sybase, which have limitations). jOOQ -simulates LIMITs by rendering nested selects filtering on ROWNUM -(Oracle) or on ROW_NUMBER() (DB2, SQL Server and Sybase). - -Other interesting additions are an increasing support for native -mathematical functions. More function support will be added in -future versions. - -Features --------- -#16 - Added support for SQL Server -#21 - Uniform implementation of the LIMIT clause. Implemented - LIMIT clause simulation through analytic functions, where - LIMIT is not supported natively -#97 - Added support for Sybase -#418 - Measure time of various steps in source code generation -#420 - Added support for proprietary SQL extensions "FOR UPDATE" - and "FOR SHARE" -#431 - Added additional statistics to generation log files -#432 - Unified the various "standard" ANSI INFORMATION_SCHEMA - implementations in the jooq-meta artefact -#436 - Added support for the modulo function -#438 - Added floor and ceil functions -#439 - Added support for mathematical functions (logarithms, - exponentials, sqrt) -#447 - Enhanced Field.add() and Field.subtract() to work for date - time fields, also - - -API changes ------------ -#428 - Created new Maven artefact jooq-meta to cleanly separate - database meta-data navigation from code generation -#458 - Decreased DSL verbosity for arithmetic operations and for - ordering - -Bug fixes ---------- -#417 - Restored warning when unknown column type is encountered - in source code generation -#419 - Corrected misleading Select.fetchOne(...) Javadoc -#421 - Optimised AbstractRecord's memory consumption -#448 - Corrected some Javadoc @see links -#449 - Changed Field.concatenate() to accept Field parameters - to avoid generic varargs warnings - -Version 1.5.7 - April 17, 2011 -================================================================================ - -This is the first release built with support of Maven thanks to -the help of some jOOQ users! - -The main new features in this release are the improved support -for serialisation/deserialisation of jOOQ objects through use of -the newly introduced "Attachable" interface. - -If using log4j or the newly supported slf4j logging framework -in debug/trace mode, there is the possibility to log query -building/execution time statistics. - -Apart from these new features, fixes were mainly done in the -fields of type casting, HSQLDB 2.1 upgrade support, stored -procedures with OUT, IN/OUT parameters. Please upgrade, if you -are using any of those features. - -If you extend jOOQ as a base implementation for source code -generation, be aware of the fact, that the jOOQ-codegen is -currently undergoing major changes. Expect the code generation -API to stabilise again in one of the next releases. - -Features --------- -#104 - Added maven dependency -#248 - Integrate UDT types with ARRAYs -#295 - Allow for attaching/detaching UpdatableRecords to/from - Configurations -#359 - Added statistics measurement to Query execution for debug - log level -#362 - Added deprecation configuration flag -#364 - Document unknown type in generated source code -#373 - Improve exception handling in code generation -#378 - Added support for Oracle stored functions with OUT - parameters -#382 - Added Factory.attach() methods to re-attach deserialised - Attachables -#394 - Add logging support for SLF4J -#398 - Allow to provide a DataType in Factory.constant() -#399 - Provide access to TypeUtils.convert() methods via DataType -#404 - Added trace logging for measuring the speed of various - query execution steps - -API changes ------------ -#358 - Enhanced DSL API to allow for HAVING clauses without - GROUP BY clauses -#367 - Make Store, Result, QueryPart "Attachable" -#374 - Introduce strategy pattern to code generation for future - support for advanced naming schemes -#375 - Decouple Database from Generator -#381 - Made DataType Serializable -#384 - Deprecated singleton QueryParts -#388 - Unify "internal" API using an Adapter pattern - -Bug fixes ---------- -#187 - Protect generated Record navigation methods against name - clashes -#266 - Added more thorough integration tests for dialect-specific - casting (including some fixes related to varchar types) -#360 - Added more integration tests for the DISTINCT clause -#361 - Add more checks in testInsertUpdateDelete() -#366 - Warn only once per ColumnDefinition, if a data type is - unknown -#377 - NullPointerException when generating invalid stored - function -#380 - Added integration tests to check for proper - serialisability -#386 - Fixed incompatibilities with HSQLDB 2.1.0 -#387 - Fixed unnecessary imports in some Oracle generated - Records -#389 - Fixed javac compiler warning in AbstractStoredObject -#391 - Cannot properly call stored procedures when IN/OUT - parameter is bound to NULL -#392 - Procedures with several OUT parameters may not register - OUT parameters correctly -#410 - Passing null VARRAY values to Oracle stored procedures - causes issues -#412 - limit(int) sets default offset incorrectly in some - dialects - -Version 1.5.6 - March 31, 2011 -================================================================================ - -This release consists mainly of code generation bug fixes and -minor API improvements and enhancements. - -The most important improvement is ticket #90, by which lazy -fetching and iteration over data is now supported. jOOQ lets you -keep a reference to a Cursor that has an open JDBC ResultSet, to -fetch data from on-the-fly. - -A few major code generation bugs were reported where the -generated code may cause ambiguity due to an inconsistent API. -This means that you will have to re-generate your schema after -upgrading to version 1.5.6. Some of your code may not compile -anymore, after this upgrade. - -Features --------- -#90 - Added possibility for lazy fetching of data -#208 - Added convenience methods for direct invocation of - sequences' currval() and nextval() attributes -#212 - Created one factory per dialect for better separation of - dialect-specific support -#213 - Generate a factory for each schema -#251 - Opened up base implementations for Field and Condition - to allow for custom implementations by client code -#274 - Integrate H2 ARRAY types with stored procedures -#292 - Documented usage of log4j and java.util.logging -#306 - Added support for the NULLIF function -#319 - Added Field.between(Field, Field) method -#320 - Added trace logging for variable binding and SQL - generation methods -#323 - Added Field.in(Field...) method -#325 - Include release version number in delivered .jar files -#328 - Improved configuration setup documentation page -#333 - Let Result implement Serializable -#334 - Added fetchMap() convenience methods -#335 - Added more functions and aggregate functions examples to - documentation -#338 - Visually improve code generation logging -#339 - Removed skipping of unreferenced UDT's, ENUM's and ARRAY's -#342 - Improved generated referential code by using fetch() and - fetchOne() API -#356 - Let UpdatableRecord.store() and delete() return an int - to indicate whether the record was actually modified - -API changes ------------ -#233 - Allow for joining TableLike instead of Table -#337 - Added generic type > to - InsertSelectQuery -#341 - Fixed API flaw where SelectOnConditionStep.and() methods - and similar ones returned SelectConditionStep, instead of - SelectOnConditionStep - -Bugfixes --------- -#69 - Corrected referential code generation for foreign keys - that reference non-primary unique keys -#85 - Corrected referential code generation for multi-field - foreign keys -#121 - Covered more Factory.executeXXX() methods with integration - tests -#318 - Fixed NullPointerException when executing SELECT * from - aliased tables -#321 - BetweenCondition does not bind left hand side Field - correctly -#322 - InCondition does not bind left hand side Field correctly -#326 - Avoid method overloading where binding to Object - may lead to compile-time ambiguities (with javac) -#343 - Add more foreign key navigation method integration tests -#347 - Add explicit integration tests for schema artefacts - excluded from code generation -#350 - Disambiguate navigation methods if several foreign keys - reference the same entity -#352 - Disambiguate navigation methods if a table ending on S - references itself -#353 - Added integration test for compilation of generated - artefacts with javac (as opposed to the Eclipse compiler) -#355 - Error when storing an UpdatableRecord that has no changed - values - -Version 1.5.5.2 - March 15, 2011 -================================================================================ - -A critical bug was reported from the 1.5 release stream where -stored functions did not render their parameters in correct order - -Features --------- -#302 - Map Oracle's NUMBER data type to java.lang.Number in - stored procedures, stored functions - -Bugfixes --------- -#317 - StoredFunctionImpl.asField() renders parameters in wrong - order - -Version 1.5.5.1 - March 13, 2011 -================================================================================ - -In version 1.5.5, there was a fatal bug breaking Derby source code generation. -Only the Derby dialect is affected. Please update immediately, if you are using -jOOQ's Derby integration - -Bugfixes --------- -#315 - Generated master data records are not sorted by PK -#316 - Derby code generation fatally broken - -Version 1.5.5 - March 12, 2011 -================================================================================ - -This version is released early as there are some important bugfixes. Additional -improvements include: - -- Improved DSL related to conditions in HAVING and JOIN clauses -- Support for Oracle-style functions, such as NVL, NVL2, COALESCE - DECODE, etc - -Features --------- -#304 - Add support for Oracle NVL function -#305 - Add support for COALESCE function -#308 - Add support for Oracle NVL2 function -#311 - Add support for Oracle DECODE function - -API changes ------------ -#223 - Enhance DSL to accept and(), or() and similar methods in JOIN steps -#224 - Enhance DSL to accept and(), or() and similar methods in HAVING steps - -Bugfixes --------- -#297 - Fixed Factory.concatenate() function -#298 - Added integration tests for nested selects in HAVING clause -#300 - Added integration tests for nested selects in JOIN clause -#303 - Javadoc correction -#307 - Accelerated integration tests -#309 - Fixed JDBC variable binding issue related to Conditions where the lhs is - a function (e.g. stored function) and the rhs is a constant -#310 - Fixed issue where fetchOne() methods throw NullPointerException if no - result record is available -#312 - Fixed issue where Field.equal(...) methods rendered unexpected SQL when - rhs null is cast to a type -#313 - Fixed Derby cast type for VARCHAR -#304 - Let the DerbyDataType default for java.lang.String be VARCHAR, not LONG - VARCHAR - -Version 1.5.4 - March 04, 2011 -================================================================================ - -Feature #243 required a minor API change in the base classes of generated source -code. This means you have to re-generate all your jOOQ artifacts in order to -migrate to 1.5.4. The artifacts themselves should be regenerated in a compatible -way, such that your client code should not be affected. If this is not the case, -please report a ticket here: - - https://sourceforge.net/apps/trac/jooq/newticket - -Apart from the Derby RDMBS and some new data type support, there have been many -new convenience methods added all over the API. For instance, if type-safety is -not really a requirement, there are lots of possibilities to use plain SQL -directly in the DSL. In that case, data can be accessed from Record, Results, -not only through Field, but also through field names or indexes. - -Check out the updated documentation (soon) here: - - https://sourceforge.net/apps/trac/jooq/wiki/Examples - -- Support for the Derby RDBMS -- Support for casting. This allows for even greater flexibility - in cases where jOOQ cannot 100% ensure type-safety -- Support for ARRAY types. Oracle, Postgres, HSQLDB and H2 ARRAY - types are now supported natively as regular bindings in - jOOQ's Field -- Support for dialect-specific data types. CHAR, VARCHAR, CLOB - are no longer treated equally as java.lang.String. Their - type heritage is also generated -- More sequence support -- Lots and lots of bug fixes - -Features --------- -#95 - Support for the Derby RDMBS -#163 - Add support for JDBC type ARRAY (with Postgres) -#209 - Add support for DB2 sequences -#210 - Add support for H2 sequences -#211 - Add support for HSQLDB sequences -#215 - Support for SQL casting using as cast type -#246 - Support for SQL casting using dialect-specific data types -#254 - Add HSQLDB support for ARRAY types -#256 - Add Oracle support for VARRAY types -#257 - Integrate ARRAY types with stored procedures -#261 - Add a global type mapping to the generated Schema object -#267 - Add DataTypeDefinition for further abstraction of data types in code - generation -#269 - Add H2 support for ARRAY types -#290 - If log4j is not on the classpath, use java.util.logging instead, as - fallback - -API Changes ------------ -#156 - Allow for results to be accessed by index, not by field -#218 - Corrected bad method signature: Record.getValueAsLong(Field, Integer) -#219 - Extended Result and Select API's to be more similar to that of Record -#232 - Add more convenience plain SQL support to the API -#235 - Add convenience methods to Record, Result and Select for access of data - via field name -#243 - Refactor DataType implementations in order to allow for the use of - generics -#259 - Add field type to database meta data (ColumnDefinition) -#260 - Add field type to database meta data (Field) -#262 - Add default behaviour for Record.getValue(Field) -#276 - Add Javadoc as a ZIP file to the jOOQ distribution - -Bugfixes --------- -#125 - Add more plain SQL integration tests -#191 - Add more integration tests for nested unions -#205 - Implemented workaround for handling Postgres stored functions with UDT - OUT parameters -#214 - Fixed NPE when generating a stored function with an unknown parameter - type -#216 - Fixed some cases where binding of BigInteger is not done correctly -#220 - Syntax error when using select statement in a CASE clause -#221 - Corrected integration tests for combined update and select statements -#222 - Added integration test for INSERT statements having nested SELECT - statements for their fields -#225 - Correctly cast array types in Postgres -#230 - Potential misuse of Blob and Clob in H2's JDBC types -#239 - Factory.fetchAny() is not implemented for SQLite -#244 - Fixed peculiar MySQL casting support where cast types do not match any - data types -#245 - Fixed NPE when reading null dates in SQLite -#249 - Added ARRAY type integration tests -#255 - Stored procedure bind variables get mixed up when any argument is null -#263 - Correctly handle Postgres function overloading -#264 - Ambiguous funciton calls when calling overloaded functions with null - parameter -#281 - Handle compilation errors when generating stored procedures with > 254 - parameters -#283 - Fixed compilation errors in generated source code for Oracle's UDT table - type -#284 - Fixed compilation errors in generated source code for Oracle procedures - in packages, when they have no parameters -#285 - Fixed compilation errors in generated source code for Oracle tables with - the same name in different schemata -#286 - Fixed name collisions in generated objects with the java.lang.* package -#288 - Prevent the creation of UNION queries with bad syntax in MySQL -#289 - Correctly alias fields within UNION queries for some dialects, which then - only require the "AS" keyword -#291 - Cannot create an aliased field called "year" in Postgres - -Version 1.5.3 - January 13, 2011 -================================================================================ - -- Lots of stored procedure support was implemented -- Support for sequences was added -- The final decision to postpone support for DB2 UDT's was made -- Some code generation bugfixes - -Features --------- -#36 - Added stored procedure / stored function support for HSQLDB -#140 - Added support for Oracle sequences -#147 - Added support for H2 stored functions -#162 - Correctly integrate UDTs with stored procedures -#170 - Added support for Postgres stored functions -#186 - Added support for more Oracle PL/SQL simple data types -#193 - Simulate support for H2 "stored procedures" -#195 - Simulate support for Postgres "stored procedures" -#206 - Added support for Postgres sequences - -API changes ------------ -#180 - Improved DSL for constant values -#181 - Allow for referencing Field in function argument list -#189 - Renamed convenience methods in org.jooq.Record -#207 - Add fetchOne(Field) method to org.jooq.Select API - -Bugfixes --------- -#182 - Protected generated Record classes against clashes with inherited methods -#183 - Fixed NullPointerException, when generating master data tables with - NULL fields -#184 - Fixed IllegalArgumentException, when a data type is present in the - schema, but unavailable in code generation logic -#185 - Code generation should not fail when single elements cannot be generated -#188 - Improved integration tests for stored procedures / functions / packages -#196 - Increase RDMBS version compatibility by avoiding "SELECT *" in code - generation logic -#199 - Added integration tests for stored procedures in RDBMS that do not - support OUT parameters -#201 - Fixed issue in DB2 where stored procedures without parameters were not - generated. -#202 - Added integration tests for stored procedures / functions without - parameters - -Version 1.5.2 - December 27, 2010 -================================================================================ - -- Improved support for stored procedures, also in packages -- A minor API change was inevitable to implement #173. The API change only - concerns the INTERNAL API. Deprecation marks are added and deprecated items - will be removed in 1.6.0 -- Experimental SQLite database support -- Some important bug fixes - -Features --------- -#25 - Added support for Oracle packages -#114 - Added support for Oracle UDTs -#145 - Added support for the SQLite database -#150 - Generate static convenience methods for stored procedures / functions -#151 - Generate static convenience methods for stored function fields -#152 - Generate meaningful serialVersionUID in generated classes -#173 - Added support for EQUIVALENT schemata - -API changes ------------ -#159 - Added convenience method List getValues(Field) to Result -#165 - Added convenience methods for creating EXISTS clauses -#169 - Improved DSL for WHERE clauses - -Bugfixes --------- -#68 - Prevent issues originating from overloaded stored procedure names, - generating identical Java class names -#153 - Fixed issue with generated code for DB2 stored functions -#154 - Fixed issue with generated code for DB2 stored functions -#155 - Fixed issues with database NULL not being mapped correctly to Java NULL - when selecting values that have a primitive type (int, long, etc) -#158 - Potential ClassCastException when using Field -#171 - Corrected issue related to selection of default schema in DB2 -#177 - Fixed issue related to generated code for tables or UDTs without columns - - -Version 1.5.1 - December 13, 2010 -================================================================================ - -- H2 database support thanks to Espen Stromsnes -- Improved stored procedure support - -Features --------- -#96 - Added H2 database support -#101 - Added stored procedure / stored function support for Oracle -#138 - Added stored procedure support for DB2 -#146 - Added support for DB2 functions - -API changes ------------ -#143 - Added convenience methods to Record - -Bugfixes --------- -#84 - Implemented referential code generation for foreign keys that do not - match their primary keys' types -#141 - Encoding problem in generated master data classes - -Version 1.5.0 - November 22, 2010 -================================================================================ - -- A big one. Major API changes / improvements -- Added lots of convenience methods -- UDT support -- Enum support -- DB2 support thanks to Espen Stromsnes -- "Light" dependency to log4j added. jOOQ will still run without it - -Features --------- -#1 - Create support for UDTs (so far only for PostgreSQL) -#15 - Added DB2 support -#60 - Added support for nested selects in INSERT and UPDATE statements -#83 - Added log4j logging to code generation and runtime -#87 - Add support for arithmetic expressions -#105 - Added support for ENUM data types, where applicable (MySQL and PostgreSQL - so far) -#110 - Added execute and fetch convenience methods -#111 - Added missing "select distinct" support -#122 - Annotate generated classes with javax.annotation.Generated -#123 - Generate user enum fields from data values (master data) -#124 - Added PlainSQLTable -#127 - Added not() operator to Condition -#135 - Added convenience methods andNot() and orNot() in Condition - -API changes ------------ -#89 - Removed support for DataSource. jOOQ is not a transaction manager -#92 - Added SortField type to be used for sorting -#99 - Provide better access to functions (No more FunctionFactory) -#116 - Merge Manager functionality into Factory -#118 - Improve API of org.jooq.Field -#119 - Improve subquery condition API -#132 - Reduced much of the select query API -#134 - Better separation of SelectQuery and SimpleSelectQuery - -Bugfixes --------- -#109 - Error when executing select * if generated schema does not match actual - schema -#115 - Fix various "null" pseudo field issues -#126 - Error when selecting a single field from a union nested select -#129 - Fixed performance issue in Oracle code generation for very large - databases - - -Version 1.4.4 - November 22, 2010 -================================================================================ - -Unreleased version, fixes included in 1.5.0 - -Bugfixes --------- - -#133 - JoinCondition does not take comparison operator - -Version 1.4.3 - October 25, 2010 -================================================================================ - -Some more bugfixes - -Bugfixes --------- - -#71 - Generated code does not compile, when foreign key and primary key have a - data type mismatch -#73 - In Oracle generated code, multi-field foreign keys may generated bad - relations code -#82 - Conversion of literals to camelcase fails if numbers are involved - -Version 1.4.2 - October 22, 2010 -================================================================================ - -Various bugfixes and minor improvements - -Features --------- -#66 - Add support for CASE or DECODE expression - -API changes ------------ -#77 - Functions should not extend FieldImpl, but a new AbstractField -#78 - QueryPart pollutes declared method space of its implementations. Hide it - by indirection - -Bugfixes --------- -#64 - Code generation fails when foreign key references a unique key that is not - the primary key. Code generation for these cases is omitted -#67 - When loading properties files, a leading / seems to be mandatory. This is - preventing users from correctly setting up jOOQ the first time -#70 - Add support for Oracle datatype TIMESTAMP(6) -#72 - Name clashes in generated Tables -#75 - Constant does not bind its values. -#76 - Constant should not render strings all the time -#79 - Constants are not properly escaped -#80 - Position function does not bind any variables -#81 - Add cast function to Constants in HSQL - -Version 1.4.1 - October 18, 2010 -================================================================================ - -Oracle patch release - -Features --------- -#63 - Generate referential functionality for Oracle - -Version 1.4.0 - October 17, 2010 -================================================================================ - -Support for PostGreSQL was added. -Added lots of OR-mapping functionality. -There is a general API change due to various new features. - -Features --------- -#14 - Add PostGreSQL support -#40 - Resolve foreign keys. Allow for navigation between objects. -#42 - Add PlainSQLField -#45 - Add "dirty" flag to Record's values. This allows for updating only - relevant data. -#47 - Complete implementation for UPDATE, INSERT, DELETE statements. Added some - missing functionality. -#48 - Add more support for Date, Time, Timestamp fields. -#51 - Add a org.jooq.impl.Manager class that provides common utility methods for - CRUD operations - -API changes ------------ -#10 - Add second generic type . This is a prerequisite for - many OR-mapping features -#18 - Use org.jooq.Record in InsertQuery and UpdateQuery -#46 - Create UpdatableRecords as a prerequisite for JPA and true OR-mapping. - These records support store() and delete() methods -#52 - Add default constructor in generated Records. -#53 - Add refresh functionality to UpdatableRecords. See also #46 -#54 - Add a state to the factory class -#56 - Reduce API, remove unnecessary Condition subinterfaces -#57 - Reduce API, remove unnecessary QueryPart interfaces - -Bugfixes --------- -#49 - NullPointerException when generating relations on schema subset -#58 - Count function renders bad SQL in various dialects -#59 - Exception when selecting unaliased functions in queries - -Version 1.3.0 - August 24, 2010 -================================================================================ - -Support for HSQLDB was added. -There is a major API change due to #44. - -Features --------- -#29 - Generate primary keys and foreign keys in Oracle code generation -#34 - Add support for HSQLDB -#39 - Generate primary keys and foreign keys in HSQLDB code generation -#41 - Add documentation to QueryFactory and Functions - -API changes ------------ -#23 - Add support for more advanced joins -#32 - Merge SelectQuery and ResultProviderQuery interfaces -#44 - Let Query methods return "this" - -Bugfixes --------- -#35 - Add unit tests for HSQLDB support -#37 - Syntax error in combined select queries! The usage of combined queries in - MySQL may still be a bit awkward. Keep an eye out for further fixes -#43 - Join with aliased tables doesn't work - -Version 1.2.0 - August 21, 2010 -================================================================================ - -The added Oracle support is now unit tested and more stable. The Oracle NUMBER -data type is mapped more precisely to Java types. - -Features --------- -#12 - Model primary keys and foreign keys in generated code -#22 - Improve mapping of Oracle NUMBER data type -#26 - Add Plain SQL QueryParts -#27 - Add support for HAVING clause - -Bugfixes --------- -#24 - Add Unit tests for oracle database (and fixed bugs) -#31 - Pull up addOrderBy() methods from SelectQuery to ResultProviderQuery - -Version 1.1.0 - August 17, 2010 -================================================================================ - -The main new feature is the Oracle support. Wait for Version 1.1.1 for that -support to be stabilised, as there are no Oracle unit tests running against an -Oracle database yet. - -Features --------- - -#2 - Add support for inner / nested selects -#3 - Add more function support -#4 - Implement filtering functionality for code generation -#6 - Add Oracle Support -#9 - Create true POJO's (implementing org.jooq.Record) with getters and setters -#17 - Make org.jooq.impl.Parameter independent of Field - -Bugfixes --------- - -#11 - Code generation does not remove files - -Version 1.0.1 - August 14, 2010 -================================================================================ - -Features --------- - -#5 - Prevent code regeneration, if no changes were made -#7 - Implement ant task for code generation - -Version 1.0.0 - August 14, 2010 -================================================================================ -Initial Release \ No newline at end of file diff --git a/jOOQ-website/inc/RELEASENOTES-3.2.txt b/jOOQ-website/inc/RELEASENOTES-3.2.txt deleted file mode 100644 index ce8cd8e8ff..0000000000 --- a/jOOQ-website/inc/RELEASENOTES-3.2.txt +++ /dev/null @@ -1,3691 +0,0 @@ -jOOQ Release notes -================== - -For an interactive overview, see also -http://github.com/jOOQ/jOOQ/issues - -For a formatted text version, see -http://www.jooq.org/notes.php - -For a text version, see -http://www.jooq.org/inc/RELEASENOTES.txt - -Version 3.1.0 - June 30, 2013 -================================================================================ - -With this release, MariaDB is now finally officially supported by jOOQ! MariaDB -is a MySQL fork, which currently has a very similar feature set as its parent. -As such forks tend to evolve into different directions very quickly, it makes -sense to add formal support in jOOQ. - -SQL Server 2012 is another SQL dialect that is now officially supported in jOOQ, -allowing to make use of the newly supported ROWS UNBOUNDED PRECEDING and similar -windowing clauses, as well as the long awaited OFFSET .. FETCH clause. From now -on, jOOQ SQLDialect.family() allows to define a super-set of SQL dialects by the -same vendors with only subtle differences. - -POJO mapping is taken to the next level. jOOQ opened up its internal -DefaultRecordMapper providing useful Record to POJO mapping algorithms. But your -custom domain model might be more complex. Instead of creating the next -impedance mismatch, trying to foresee your own mapping algorithm needs, jOOQ -allows you to inject a RecordMapperProvider into your Configuration, allowing to -override record mapping with arbitrary behaviour. - -This minor release is also a strong step forward towards a more unified SQL -experience, where row value expression IN predicates and comparison predicates -are simulated with an equivalent EXISTS predicate. See this blog post for more -details: -http://blog.jooq.org/2013/05/03/sql-query-transformation-fun-predicates-with-row-value-expressions - -Note, that for technical reasons, jOOQ 3.0.0 could not yet be integration -tested with DB2, Ingres, and Sybase ASE. Consider using jOOQ 2.6, instead - -Features and improvements -------------------------- -#552 - Add SQLDialect.family() to group several SQLDialect versions of the same - RDBMS -#742 - Improve MySQL Stored Procedure support using MySQL 5.5's - INFORMATION_SCHEMA.PARAMETERS dictionary table -#833 - Add integration tests for both jconn3 and jTDS JDBC drivers for Sybase - and SQL Server -#963 - Map SQL Server TINYINT to UByte -#965 - Add support for Sybase SQL Anywhere unsigned number types -#1373 - Add Field DSL.coerce(Field, DataType) and similar methods, - to coerce a field to a given data type (as opposed to casting it) -#1836 - Document using jOOQ with Spring for transaction support -#1885 - Add test to count opening and closing of Statements and ResultSets by - jOOQ -#2022 - Add support for SQL Server 2012 windowing clauses in window functions -#2058 - Add support for the MariaDB database -#2095 - Document 's feature of forcing a column onto a SQL type -#2235 - Add Result DSLContext.fetchFromTXT() to allow for loading results - that were exported using Result.format() -#2236 - Add DSLContext.batch(String...) and batch(String, Object[]...) to easily - create batch statements from SQL strings -#2291 - Add DSLContext.fetchAny(Table, Condition) method and others -#2299 - Allow for setting ResultSet flags (e.g. - ResultSet.TYPE_SCROLL_INSENSITIVE through - ResultQuery.resultSetConcurrency(), resultSetType(), - resultSetHoldability() -#2310 - Add DSL.using(Connection) and DSL.using(Connection, Settings) which - auto-detect the SQLDialect from the jdbc url -#2311 - Add Configuration.recordMapperProvider() to override jOOQ's internal - default ReflectionMapper -#2339 - Support CUBRID 9.1's new features -#2344 - Add a new ControlFlowSignal that is used to explicitly jump out of a - control flow -#2355 - Add support for Postgres / HSQLDB's TRUNCATE [...] RESTART / CONTINUE - IDENTITY -#2357 - Add support for Postgres' TRUNCATE [...] CASCADE statement -#2395 - Simulate row value expression IN predicate using EXISTS -#2414 - Add Setting to influence parameter rendering (indexed, named, inlined) -#2416 - Add Result.intoXML(org.xml.sax.ContentHandler) to generate a SAX event - stream from a jOOQ result -#2423 - Add support for SQL Server 2012 native OFFSET .. FETCH clause -#2424 - Integration-test jOOQ with the SQLite xerial driver -#2426 - Add DSLContext.batch(Query, Object[]...) as a convenience for calling - batch(Query).bind(Object...).bind(Object...) -#2427 - Add more Javadoc to ResultQuery.fetchResultSet() explaining that - underlying PreparedStatements are closed with ResultSet.close() -#2428 - Simulate row value expression comparison predicates using EXISTS -#2430 - Add CustomQueryPart for use with plain SQL and other places -#2434 - Add Field.compare(Comparator, Select) and Field.compare(Comparator, - QuantifiedSelect) to allow for more dynamic SQL -#2437 - Add RenderContext.paramType() and deprecate RenderContext.inline() and - .namedParams() -#2440 - Expose the DataSource contained in the DataSourceConnectionProvider -#2441 - Add DSL.cast(Field, XXX) for increased API consistency -#2446 - Add JDBCUtils.dialect(Connection) to "guess" the jOOQ SQLDialect from a - JDBC Connection -#2466 - Add a public DefaultDSLContext implementation that can be used by users - to override the default behaviour -#2485 - Allow for treating Field as Condition -#2496 - Add support for SQL Server 2012 sequences -#2499 - Add JDBCUtils.safeClose(Connection) -#2509 - Expose CHECK constraints in jOOQ-meta -#2519 - Add Record.from(Object, Field...) from(Object, String...), - from(Object, int...) to copy only a select set of values from a POJO, - Array, Map -#2521 - Add {Row|Record}.fields(Field...), {Row|Record}.fields(String...), - {Row|Record}.fields(int...) to extract Field[] from a row or record -#2527 - Add org.jooq.tools.jdbc.DefaultResultSet to provide a default ResultSet - delegation implementation -#2531 - Add integration tests mapping binary(16) to java.util.UUID -#2532 - Let batch executions debug-log executed queries -#2535 - Convert.convert(Object, Class) should support simple casting -#2547 - Document some SQL language to jOOQ DSL API mapping rules in the manual -#2566 - Upgrade integration test jTDS version to 1.3.1 -#2571 - Add a new RecordType type to make up for the missing - recursive type definition on Record - -API changes (backwards-incompatible) ------------------------------------- -#2468 - API bug: MergeNotMatchedSetStep.set(Field, Select) returns - MergeMatchedSetMoreStep instead of MergeNotMatchedSetMoreStep - -Bug fixes ---------- -#1520 - Handle Ingres', SQLite, SQL Server's, Sybase ASE's limitations of 1024, - 999, 2100 or 2000 maximum bind values per query -#2135 - Postgres ENUM data type isn't supported correctly, if the ENUM needs - full qualification -#2323 - NullPointerException when calling Schema.getTables() on a meta schema - with SQLite -#2401 - Bad package name generated when contents are not trimmed -#2404 - Cannot combine with if both match -#2412 - jOOQ Meta does not recognise non-uppercase IN, OUT, INOUT keywords in - MySQL stored procedures -#2413 - Suppress warnings in generated code (@SuppressWarnings("all") doesn't - suppress "rawtypes" warnings with javac) -#2418 - RenderContext.data() is not passed on to QueryParts when being rendered -#2422 - Upgrade RSyntaxTextArea to 2.0.7 -#2432 - Manual refers to a package-private DefaultConfiguration constructor -#2443 - AbstractStoreQuery.execute() doesn't correctly operate on the - Configuration's ConnectionProvider in SQLite IDENTITY fetching queries -#2445 - JDBCDatabase doesn't recognise Oracle's VARCHAR2 data type (and other - vendor-specific data types) -#2447 - Tables collected through DSLContext.meta() return duplicate columns if - multi-schema environments contain identical tables -#2449 - JDBCDatabase doesn't use DataType.length(), precision(), and scale() -#2450 - Cannot set precision on TINYINT, SMALLINT, INT, BIGINT data types -#2461 - Generator Encoding Error for Database-Objects with Unicode-Names -#2464 - Bad SQL rendered from DELETE statements with aliased tables -#2469 - NullPointerException in AbstractResultQuery.fetchOneMap() -#2477 - MySQL's unsigned types cannot be used in other dialects -#2478 - IngresDatabase erroneously joins IIINDEXES to get constraint columns, - rather than using IIKEYS -#2494 - Possible null pointer passed to ConnectionProvider.release() -#2502 - Code generation fails to generate valid java for stored procedures that - accept parameters named configuration. -#2506 - SQLDialectNotSupportedException on DSL.inline(T, Class), when jOOQ's - internals are not (yet) properly initialised -#2515 - Compilation errors when generating code for artefacts that differ only - by a trailing underscore(s): A and A_ and A__ -#2523 - Statement.close() may be called upon previously closed statements -#2528 - Combining renderFormatted with inlined bind variables will change bind$ - values when they contain newlines -#2562 - Bad SQLDialect reference in Oracle and MySQL package-info.java -#2569 - Error when rendering SQL Server procedures with Settings.renderSchema - == false - -Version 3.0.0 - April 28, 2013 -================================================================================ - -This major release is a great move towards better integration of SQL as a -language in Java. Unlike any other database abstraction framework, jOOQ now -formally supports the notion of "row value expressions". The jOOQ API uses -Xtend-generated API types from Row1 .. Row22, as well as Record1 .. Record22 to -bring you even more compile-time typesafety on a record-level. - -In SQL, you can typesafely write - -
-  SELECT * FROM t WHERE (t.a, t.b) = (1, 2)
-  SELECT * FROM t WHERE (t.a, t.b) OVERLAPS (date1, date2)
-  SELECT * FROM t WHERE (t.a, t.b) IN (SELECT x, y FROM t2)
-  UPDATE t SET (a, b) = (SELECT x, y FROM t2 WHERE ...)
-  INSERT INTO t (a, b) VALUES (1, 2)
-
- -In jOOQ, you can now (also typesafely!) write - -
-  select().from(t).where(row(t.a, t.b).eq(1, 2));
-  // Type-check here: ----------------->  ^^^^
-  select().from(t).where(row(t.a, t.b).overlaps(date1, date2));
-  // Type-check here: ------------------------> ^^^^^^^^^^^^
-  select().from(t).where(row(t.a, t.b).in(select(t2.x, t2.y).from(t2)));
-  // Type-check here: -------------------------> ^^^^^^^^^^
-  update(t).set(row(t.a, t.b), select(t2.x, t2.y).where(...));
-  // Type-check here: --------------> ^^^^^^^^^^
-  insertInto(t, t.a, t.b).values(1, 2);
-  // Type-check here: ---------> ^^^^
-
- -This also applies for existing API, which doesn't involve row value expressions: - -
-  select().from(t).where(t.a.eq(select(t2.x).from(t2));
-  // Type-check here: ---------------> ^^^^
-  select().from(t).where(t.a.eq(any(select(t2.x).from(t2)));
-  // Type-check here: -------------------> ^^^^
-  select().from(t).where(t.a.in(select(t2.x).from(t2));
-  // Type-check here: ---------------> ^^^^
-
- -And for UNIONs - -
-  select(t1.a, t1.b).from(t1).union(select(t2.a, t2.b).from(t2));
-  // Type-check here: -------------------> ^^^^^^^^^^
-
- -These type-checks are preformed by your Java compiler, considering the generic -type information of your SQL statement's Record data types. These include: - -- Record1 -- Record2 -- Record3 -- ... -- Record22 - -The highest degree of typesafety was chosen to be 22, to match Scala's Tuple22, -Product22 and Function22 types. Higher degree records are still supported by -jOOQ, just without the additional typesafety. - -This Record typesafety is applied to - -- SELECT statements -- INSERT and MERGE statements: the VALUES() clause -- UPDATE statements: SET A = (SELECT...) -- UPDATE statements with row value expressions: SET (A, B) = (SELECT...) -- Quantified comparison predicates: ANY(SELECT...) and ALL(SELECT...) -- Comparison predicates: = (SELECT...) -- IN predicates: IN (SELECT...) -- BETWEEN predicates: BETWEEN (SELECT...) AND (SELECT...) -- Generated records -- The new VALUES() constructor -- Scala integration for conversion of jOOQ Record[N] to Scala's Tuple[N] - -Apart from this major improvement, there had been many minor changes throughout -the jOOQ API. Here are some important ones: - -- Factory has been split into DSL (static QueryPart construction) and - DSLContext (Query execution, "attached" QueryPart construction). This greatly - improves the overall DSL experience while allowing for more fine-grained - Executor lifecycle control. -- A ConnectionProvider has been introduced as an abstraction of the JDBC - Connection lifecycle. The standalone Connection and pooled DataSource modes - are still supported, but you can now inject your own ConnectionProvider for - more control. -- A lot of performance improvements have been implemented within the jOOQ API - removing most of the overhead caused by jOOQ when fetching data from JDBC -- A JDBC Mock API has been added to help you create simple unit tests for your - application built on top of jOOQ. -- A VALUES() constructor is now supported, and derived column lists to alias - tables and columns in one go. -- The data type API has been greatly simplified. This allowed for the - introduction of runtime precision, scale, and length information. -- CRUD has been improved through many more CRUD batch operations, explicit - INSERT and UPDATE (in addition to store()), and explicit handling of jOOQ's - internal changed flags. - -As this is a major release, some backwards-incompatibilities were inevitable. -For those users among you, migrating from jOOQ 2.x to 3.0, here are a couple of -useful hints: -http://www.jooq.org/doc/3.0/manual/reference/migrating-to-3.0/ - -Note, that for technical reasons, jOOQ 3.0.0 could not yet be integration -tested with DB2, Ingres, and Sybase ASE. Consider using jOOQ 2.6, instead - -Note, that further code generation and model API improvements were postponed to -a later release - -Note, previous release candidates contained more features, improvements and bug -fixes. See their respective sections for details. - -Features and improvements -------------------------- -#2410 - Add some more API usage examples to the section about ResultSet fetching -#2415 - Add Constants.MINOR_VERSION and Constants.FULL_VERSION for internal and - external reuse - -Bug fixes ---------- -#1998 - Wrong screenshots in the manual's section about code generation. - jooq-meta.jar is missing -#2407 - Fix bad references to pre-3.0 Factory in Javadoc - -Version 3.0.0 (RC3) - April 12, 2013 -================================================================================ - -This major release is a great move towards better integration of SQL as a -language in Java. Unlike any other database abstraction framework, jOOQ now -formally supports the notion of "row value expressions". The jOOQ API uses -Xtend-generated API types from Row1 .. Row22, as well as Record1 .. Record22 to -bring you even more compile-time typesafety on a record-level. - -See release 3.0.0 for more information. - -Features and improvements -------------------------- -#2195 - Remove the standalone tutorial, link to the manual -#2321 - Implement various Key.toString() methods -#2329 - Add Javadoc to Configuration.executeListenerProviders() -#2331 - Add hint to the manual about mvn eclipse:clean and eclipse:eclipse when - building jOOQ -#2363 - Change the readme file to use Markdown -#2366 - Add org.jooq.util.example package to jOOQ-codegen with some example - GeneratorStrategies -#2372 - Add aliases for arithmetic operators to be able to use Groovy default - operator overloading -#2389 - Make org.jooq.impl.DefaultConfiguration public -#2392 - Add Configuration.set() methods. They should allow for modifying a - Configuration -#2396 - Add DSL.function(Name, Class, Field...) and - DSL.function(Name, DataType, Field...) to allow for custom, - fully-qualified function references - -API changes (backwards-compatible) ----------------------------------- -#2378 - Allow for overriding getIdentity() and getReferences() in CustomTable - -API changes (backwards-incompatible) ------------------------------------- -#2328 - Remove UpdatableTable marker interface, pulling up methods to Table -#2342 - Change Configuration.data() to return Map -#2343 - Decouple lifecycle of Configuration and ExecuteContext -#2350 - Do not statically reference a Connection from GenerationTool -#2353 - Decouple org.jooq.Context from Configuration. Choose composition over - inheritance -#2362 - Decouple org.jooq.DSLContext from Configuration. Choose composition over - inheritance -#2379 - Replace 3.0-RC1 Executor type by a contextual DSL type constructed from - DSL.using() -#2380 - Rename org.jooq.impl.Factory to org.jooq.impl.DSL -#2382 - Let DAO reference a Configuration instead of a DSLContext -#2388 - Replace Configuration's List with - ExecuteListenerProvider[] to simplify correct and thread-safe client - implementations -#2390 - Change Configuration API to reflect jOOQ-style getter / setter naming -#2391 - Rename dialect-specific Factories [Dialect]Factory to [Dialect]DSL -#2399 - Remove support for the USE statement - -Behaviour changes (backwards-incompatible) ------------------------------------------- -#2351 - Relax ConnectionProvider contract, allowing acquire() to return new - Connections even before release() is called - -Bug fixes ---------- -#1868 - Cursor.close() doesn't terminate the ExecuteListener life cycle -#2325 - "HsqlException: incompatible data type in conversion" when binding a - UUID[] to an HSQLDB prepared statement -#2327 - Compilation error in generated tables, when a table contains a UNIQUE - key but no PRIMARY key -#2332 - Documentation example regarding DSL.concat() does not compile -#2336 - jOOQ 3.0 regression: NoClassDefFoundError caused by missing log4j - dependency -#2338 - Tutorial example unclear: There are three artefacts in Maven, not one -#2346 - org.jooq.Meta's generated Schema and other objects are Serializable, but - their enclosed Meta instance is not -#2347 - Let equals() implementations succeed early on identity -#2354 - Single page manual display errors on Firefox -#2361 - Inaccurate Configuration Javadoc explaining wrong ExecuteListener - lifecycle -#2367 - SQLite identifiers that collide with keywords should be quoted -#2381 - Do not add TableFieldImpl to table in constructor of TableFieldImpl -#2385 - fetchOne() and fetchLazy() don't terminate the ExecuteListener life - cycle when an exception occurs -#2393 - Fully qualified name not used for user-defined aggregate function - -Version 3.0.0 (RC2) - March 8, 2013 -================================================================================ - -This major release is a great move towards better integration of SQL as a -language in Java. Unlike any other database abstraction framework, jOOQ now -formally supports the notion of "row value expressions". The jOOQ API uses -Xtend-generated API types from Row1 .. Row22, as well as Record1 .. Record22 to -bring you even more compile-time typesafety on a record-level. - -See subsequent release candidates or release 3.0.0 for more information. - -Features and improvements -------------------------- -#2200 - Add Executor.fetchCount(Select) and Select.fetchCount() to replace - the projection by a COUNT(*) query -#2244 - Add section to the manual indicating that the jOOQ generator can only - handle schemas of a certain size -#2255 - Add code generation option to avoid the generation of "global object - references" -#2257 - Add List Database.getIdentities(SchemaDefinition) - for convenience to jooq-meta -#2258 - Restore private and deprecated versions of the Factory constructors, - adding some Javadoc about the changes between jOOQ 2.x and 3.0 -#2270 - Add section to the manual indicating how to build jOOQ with Maven -#2272 - Add a paragraph to the manual's preface, explaining "why not just use - SQL"? -#2281 - Add Result Executor.fetchFromStringData(List) in order - to reuse logic from fetchFromCSV -#2285 - Add more verbosity to the code generator, when configured badly -#2290 - Add Database.getUniqueKeys() and getForeignKeys to jOOQ-meta -#2297 - Add section to the manual indicating how the various generator flags - depend on each other -#2308 - Do not generate "final" Tables.java, UniqueKeys.java, etc. - -Bug fixes ---------- -#2212 - "code size too large" in generated SchemaImpl, when the number of tables - exceeds 15k -#2238 - Code generation runs extremely slow for large schemas (Inefficient - DefaultRelations.getUniqueKeys() and getForeignKeys() methods) -#2239 - Code generation runs extremely slow for large schemas (Inefficient - AbstractDatabase.filterSchema() methods) -#2252 - ArrayIndexOutOfBoundsException, when rendering plain SQL that is - terminated by a comment -#2259 - RenderMapping has no effect, if not supplied to the Executor constructor -#2262 - RenderSchema has no effect, if not supplied to the Executor constructor -#2267 - SQLDialectNotSupportedException: Type class org.postgis.PGgeometry is - not supported in dialect null, when binding PG* objects -#2271 - jOOQ Unit tests fail when not run in CET / CEST -#2273 - Tutorial bug, referencing wrong Maven dependency. jOOQ 3.0.0 is not yet - released, only RC1 -#2276 - Wrong MockDataProvider manual example -#2278 - Postgres (UUID and other) ARRAY types aren't correctly inlined as string - literals -#2279 - UUIDs aren't correctly deserialised from Postgres UDTs -#2280 - Improve supported formats for MockFileDatabase -#2283 - Class loading issues in GenerationTool when called by Gradle -#2294 - Compilation errors when code generator is configured with - true and false -#2298 - Suppress warnings in generated code (@SuppressWarnings("all") doesn't - work with javac) -#2312 - Annotate org.jooq.Support with java.lang.annotation.Documented to make - it part of the public API (in Javadoc) -#2314 - Outdated GenerationTool Javadoc - -Version 3.0.0 (RC1) - February 16, 2013 -================================================================================ - -This major release is a great move towards better integration of SQL as a -language in Java. Unlike any other database abstraction framework, jOOQ now -formally supports the notion of "row value expressions". The jOOQ API uses -Xtend-generated API types from Row1 .. Row22, as well as Record1 .. Record22 to -bring you even more compile-time typesafety on a record-level. - -See subsequent release candidates or release 3.0.0 for more information. - -Features and improvements -------------------------- -#456 - Add runtime support for PRECISION, SCALE, and LENGTH attributes -#834 - Add support for the Firebird / Postgres UPDATE .. RETURNING clause -#915 - Add Table> - Factory.values(Row[N]...), to create ad-hoc tables - from data -#1038 - Introduce new type GroupField for cube(), rollup() and groupingSets() - functions. Accept only GroupField... in groupBy() clauses -#1097 - Add org.jooq.Catalog, a type modelling an entity combining several - org.jooq.Schema -#1144 - Overload Executor.fetch[One|Lazy](ResultSet, X...) with X being - Field, DataType, Class -#1178 - Allow for treating Condition as Field -#1583 - Add support for row value expressions in UPDATE statements: UPDATE .. - SET (A, B, C) = (SELECT X, Y, Z) -#1624 - Add support for java.util.UUID as a type -#1663 - Document RenderContext and make it part of the public API -#1686 - Add UpdatableRecord.insert() and update() -#1689 - Generate E into(E) and R from(E) methods to generated records -#1690 - Add UpdatableRecord.key() returning a Record holding PK values -#1695 - Add Factory.all() and Factory.any() to create quantified expressions -#1703 - Add Executor.batchDelete(UpdatableRecord...) to mass-delete a set of - UpdatableRecords -#1801 - Add Table.as(String, String...) to allow for creating a table aliases - (correlation names) with derived column lists -#1874 - Add Record1, Record2, ... Record[N] similar to Row1, Row2, ... Row[N] to - support record type-safety -#1897 - Add a section to the manual about the migration to jOOQ 3.0 -#1899 - Make some JDBC-related utility methods publicly available in - org.jooq.tools.jdbc.JDBCUtils -#1902 - Duplicate SELECT API between Executor and Factory -#1904 - Add Executor.fetch(ResultQuery), Executor.execute(Query), and similar - methods -#1905 - Add Row[N].equal(Select) and similar methods -#1906 - Use Xtend to generate Row[N], Record[N] and other [N]-related API code - artefacts -#1914 - Document the fact that SELECT * is performed by leaving the SELECT list - empty -#1917 - Add support for CUBRID 9.0's window functions and MERGE statement -#1918 - Let generated Records implement Record[N] if applicable -#1919 - Support higher degrees of Row[N] and Record[N] types. Match Scala's max - degree of 22 -#1920 - Add more implicit defs in order to treat Record[N] as Scala's Tuple[N] -#1923 - Add Record.intoResultSet() to create a single-record JDBC ResultSet from - a Record -#1924 - Add support for CUBRID 9.0's ENUM data type -#1932 - Generate Javadocs for Table constructors -#1934 - Improve generated Record Javadoc -#1951 - Add support for the SQL Server WITH (...) table hints -#1966 - Add Row[N].equal(Record[N]) and similar convenience methods -#1967 - Document using MySQL's SQL_CALC_FOUND_ROWS as an Oracle hint -#1968 - Add org.jooq.Meta returned from Executor.meta() to return a wrapped JDBC - DatabaseMetaData object -#1972 - Move MySQLFactory.md5() to Factory and simulate it for Oracle -#1973 - Add Executor.fetchOne(ResultSet) -#1975 - Add Result.sort{Asc|Desc}(int) and (String) to order by field index / - name -#1981 - Add support for DB2 CGTT and MQT -#1983 - Improve the Javadoc on Table.as() and Field.as() to hint at - case-sensitivity and RenderNameStyle -#1984 - Add ResultQuery.fetchOneInto() -#1986 - Add Record.fromMap() as the inverse operation of Record.intoMap() -#1987 - Allow for reading data from arrays, Maps through Record.from() -#1988 - Add Record.fromArray() as the inverse operation of Record.intoArray() -#1989 - Add Record.changed(Field), changed(int), changed(String) to check - whether a single field's value has changed -#1990 - Add T Record.original(Field), original(int), original(String) to - get a Field's original value -#1991 - Reflect changed flag in Result.toString() (and thus also - Record.toString()) -#1999 - Add Record.changed(boolean) changed(Field, boolean) - changed(int, boolean) changed(String, boolean) as setters for the - changed flag -#2000 - Add Record.reset(), reset(Field), reset(int), reset(String) to - restore original values in a record -#2008 - Add elementFormDefault="qualified" to XSD specifications to allow for - XML validation of jOOQ configuration files -#2020 - Let org.jooq.ExecuteListener extend java.util.EventListener -#2021 - Add UpdatableRecord.refresh(Field...) to allow for refreshing a - subset of the Record's values -#2027 - Document semantic versioning rules as understood by jOOQ -#2028 - Add Batch.size() to indicate the number of queries that will be executed - by a batch operation -#2030 - Add reusable wrapper types for JDBC Connection, Statement, ResultSet, - etc. -#2044 - Add various TableRecord.fetchParent(...), fetchChild(...) and - fetchChildren(...) methods to follow foreign key relationships -#2049 - Add gt() / ge() / lt() / le() to Row[N] types -#2052 - Add [not]Between[Symmetric]() to Row[N] types -#2053 - Add is[Not]Null() to Row[N] types -#2066 - Add Executor.extractBindValues(QueryPart), extractParams(QueryPart) to - extract bind values in the context of an Executor (i.e. Configuration) -#2072 - Let UDTRecordImpl and ArrayRecordImpl.toString() return a valid - constructor expression -#2078 - Add Postgres to @Support annotation of SelectForUpdateWaitStep.wait() -#2079 - Support generation of bean validation annotations on records and - interfaces -#2089 - Generate an "empty" DefaultSchema for those databases that do not have - any schema (CUBRID, Firebird, SQLite) -#2094 - Add unit tests for org.jooq.tools.Convert -#2107 - Let Record implement Comparable -#2111 - Improve org.jooq.Record Javadoc, to explain the various Record subtypes -#2112 - Add Row.types() and Row.dataTypes() as a convenience -#2113 - Document Record.hashCode() and equals() through Javadoc -#2133 - Allow for mapping to "" (empty) in order to avoid the - generation of a schema -#2156 - Add Row.type(int), type(String), dataType(int), dataType(String) for - convenience -#2158 - Add Executor.fetchLazy(Table) and fetchLazy(Table, Condition) for - convenience -#2159 - Let ExecuteListener extend Serializable -#2160 - Add Executor.batchUpdate(UpdatableRecord...) to mass-update a set of - UpdatableRecords -#2161 - Add Executor.batchInsert(UpdatableRecord...) to mass-insert a set of - UpdatableRecords -#2162 - Add some more Javadoc to JooqLogger -#2170 - Add 0.0 and 1.0 to Convert.FALSE_VALUES and Convert.TRUE_VALUES -#2171 - Allow for converting booleans to numbers through org.jooq.tools.Convert: - TRUE => 1, FALSE => 0 -#2172 - Add set(Field, Select>) methods to UPDATE, - MERGE and INSERT statements -#2176 - Add hint in code generation, when an unsupported, old database version - is being used (e.g. MS SQL Server 2000) -#2177 - Add ResultQuery.intern() and Result.intern() for string interning in - result sets -#2179 - Add Javadoc to QueryPart.hashCode() and equals() -#2199 - Allow for INSERT and UPDATE of pre-existing records through - SET [ Record ] clauses -#2202 - Add Mock JDBC objects for unit testing with jOOQ -#2203 - Add Executor.map(Schema) and Executor.map(Table) as a convenience to - apply runtime schema mapping -#2204 - Add BatchBindStep.bind(Object[][]) to bind lots of bind values at a time -#2205 - Add Result Executor.newResult(Table) to generate custom - results - -API changes (backwards-compatible) ----------------------------------- -#1309 - Let Factory.val() return Param instead of Field -#2031 - Change union(Select) and similar methods to - union(Select) -#2157 - Change the bounds of various > H - fetchInto(H handler) methods to RecordHandler -#2197 - Relax bounds on Factory.groupingSets(Collection>...) to - Collection>... -#2206 - Relax bounds of R on Executor.newRecord() from TableRecord to Record - -API changes (backwards-incompatible) ------------------------------------- -#1118 - Remove support for the code generation ant task -#1254 - Move org.jooq.tools.unsigned contents to org.jooq.types (along with the - INTERVAL types) -#1374 - Relax usage of generic . Replace by where data types - are involved. -#1533 - Extract Executor API from Factory. Let Factory contain only static - QueryPart factory methods -#1549 - Externalise connection lifecycle through new ConnectionProvider -#1649 - Remove support for code generation from pre-jOOQ 2.0 .properties file -#1740 - Remove support for generated master data enums -#1875 - Add generic type to SelectXXXStep DSL type hierarchy - for increased tuple type-safety -#1887 - Remove all deprecated code -#1894 - Remove constructors from dialect-specific factories -#1907 - Remove FactoryOperations, push its API down to org.jooq.impl.Executor -#1921 - Add InsertValuesStep[N] - Executor.insertInto(Table, Field, Field, ..., Field) -#1926 - Add MergeXXXStep - Executor.mergeInto(Table, Field, Field, ..., Field) -#1977 - Remove the confusing concept of having a "main key" as opposed to a - "primary key" -#2042 - Remove generated setters, setting foreign key values from records -#2043 - Remove generated navigation methods -#2060 - Remove redundant SimpleSelectXXX API -#2117 - Remove the FieldProvider marker interface. Simplify the FieldProvider - API -#2119 - Rename Row.getDegree() to Row.size() - -Behaviour changes (backwards-incompatible) ------------------------------------------- -#1235 - SQLite BIGINT data type erroneously maps to java.math.BigInteger -#1578 - Change configuration of ExecuteListeners in Configuration. Listeners - instances should be provided, not classes -#2076 - Stop "supporting" comma-separated regular expressions in the code - generator configuration -#2088 - Do not treat CUBRID "owner" as schema in generated code - -Bug fixes ---------- -#1170 - Improve performance on jOOQ's reflection usage -#1626 - Explicitly implement hashCode() and equals() in some additional - QueryParts -#1886 - Query.bind() has no effect when Query.keepStatement(true) and - StatementType.STATIC_STATEMENT are combined -#1890 - Bad Postgres array serialisation when " or \ characters are contained in - a String[] -#1938 - Improve AbstractField.hashCode() and AbstractTable.hashCode() and - similar, as these two are called very often -#1942 - Inefficient call to String.split() in StringUtils.toCamelCase() leads to - non-negligible performance overhead in POJO transformation calls -#1937 - Inefficient implementations of AbstractDataType.equals() and hashCode() -#1954 - Bad SQL rendered when combining ORDER BY [ some-function ] with LIMIT .. - OFFSET in DB2, SQL Server -#1958 - Bad SQL rendered for OVER (ORDER BY [ some-function ]) for SQL Server - and Sybase -#1974 - Optimise various Executor.fetchOne() methods, which consume the whole - ResultSet before throwing an InvalidResultException -#1979 - Thread safety issue in org.jooq.impl.FieldList -#1982 - Change RenderNameStyle.UPPER, LOWER, AS_IS to quote literals if needed -#1992 - Bad reference to org.jooq.debug.[impl].DebugListener in the manual -#1993 - Bad code generated when the same table name exists in multiple schemas - in SQL Server -#1995 - Record.original() values aren't updated after a Record.store() operation -#1997 - Review the manual's tutorial for integrity -#2001 - Named Params are treated as null literals on right sides of comparisons -#2007 - Bad type coercion on the right hand side of a comparison predicate, when - the left hand side is Field -#2011 - Implement some micro-optimisations in DefaultRenderContext -#2025 - Correctly handle multiple foreign keys defined on the same column -#2045 - Bad hashCode calculation when Records contain arrays or byte[] -#2055 - MySQL's UPDATE [t1] JOIN [t2] syntax can cause syntax errors as column - references are not fully qualified -#2057 - Cannot properly extract bind values for LIMIT .. OFFSET clause from a - SELECT statement -#2063 - jOOQ-meta loads Firebird composite unique key columns in wrong order -#2073 - The code generator's flag doesn't affect Oracle - VARRAY and TABLE types -#2082 - Oracle PIVOT expression doesn't bind any variables of a derived table - being pivoted -#2085 - java.lang.NoSuchMethodError: org.apache.log4j.Logger.isTraceEnabled()Z - when logger dependency is missing -#2086 - SQL syntax error when aliasing outcome of a relational division -#2091 - CUBRID doesn't really have a NVARCHAR data type -#2098 - NullPointerException when org.jooq.impl.EnumConverter converts null -#2104 - SQLite code generation treats multi-column primary keys like multiple - single-column unique keys -#2108 - SQLite returns NULL for val(new Date(0)).add(-1) and some other date - time arithmetic expressions -#2128 - Misleading Javadoc in Factory / Executor.selectCount() -#2137 - Failure to assign a value to a record pojo for a column with a - composite type when using select into. -#2139 - batchStore with Postgres composite types incorrectly reuses values from - the first record. -#2140 - No table java mapping generated using maven plugin - missing inputSchema - in postgres -#2143 - UnsupportedOperationException when binding UDTRecord in batchStore() for - Oracle -#2144 - Improve AbstractField.equals() and AbstractTable.equals() and similar, - as these two are called very often -#2145 - Improve QueryPartList.removeNulls() as this is called very often -#2154 - Generated Records should access values by index, not by field, for - performance reasons -#2165 - Add H2 database definitions to the jOOQ-scala module (to prevent - compilation errors) -#2167 - Convert.convert("xx", boolean.class) returns null, instead of false -#2178 - Improve FieldList. Avoid creating excessive array lists, where simple - (immutable) Field[] are sufficient -#2180 - Optimise DAOImpl by using the new ReflectionMapper instead of calling - Record.into() all the time -#2187 - Change all Javadoc

tags to

(To fix Java 7 standard Javadoc - style layout issues) -#2210 - Executor.fetchFromCSV() shouldn't mark resulting records as "changed" -#2215 - Improve example in the "jOOQ for CRUD" section. Use only columns from - the sample database -#2223 - SQL injection is possible in org.jooq.impl.Val, if client code doesn't - correctly enforce generic typesafety, and bind variables are inlined -#2227 - Field.in(T...) doesn't convert argument values to the Field's type - -Version 2.6.0 - October 26, 2012 -================================================================================ - -This release has a new main feature: the type-safe support for row value -expressions also known as tuples - up to a degree of 8. The API is formed in a -similar way as pre-existing tuple support in languages like C# or Scala. - -jOOQ's Scala integration has also been improved through the new jOOQ-Scala -module, which provides some useful implicit defs for operator overloading. -Future versions of jOOQ-Scala may experiment with Scala 2.10's Macros - -This release also ships with a lot of new deprecation to help you prepare for -the upcoming major release. - -Minor feature improvements include: - -- Lots of new fetchGroups() and intoGroups() methods, thanks to Ivan Dugic -- JDBC execution control support, such as cancel(), maxRows(), queryTimeout() -- Allowing for re-using JDBC PreparedStatement between Query executions -- Support for the SQL standard OVERLAPS predicate -- A new RecordMapper, similar to the existing RecordHandler - -Features and improvements -------------------------- -#385 - Allow for keeping open statements in a Query -#600 - Add support for Oracle / SQL Standard linear regression functions -#1058 - Add Factory.row(T1, T2, .. TN) and Factory.row( - Field, Field ... Field) to allow for creating tuples / rows -#1077 - Add support for the SQL standard OVERLAPS predicate -#1245 - Improve formatting for DECIMAL data types in Result.format(). Nicely - align the decimal point and reserve space on both sides -#1484 - Let XJC-generated artefacts implement Cloneable -#1527 - Support for converting String to java.net.URL, java.net.URI, and - java.io.File -#1674 - Export data types with Result.formatXML() and Result.formatJSON() - exports -#1679 - Add Factory.table(String, QueryPart...) -#1708 - Add Map> ResultQuery.fetchGroups(Field, Class) -#1709 - Add Map> ResultQuery.fetchGroups(Field[]) -#1710 - Add Map> - ResultQuery.fetchGroups(Field[], Class) -#1719 - Make logic from ResultQuery.fetchArray() available in Result.intoArray() -#1728 - Add support for the MySQL COUNT(DISTINCT expr, expr...) aggregate - function syntax -#1744 - Add support for the CUBRID DECR() function -#1756 - Add RecordMapper, similar to RecordHandler, mapping records to - custom types -#1762 - Add package-info.java to add Javadoc documentation to all packages -#1766 - Simulate row comparisons where they are not supported -#1773 - Add a new jOOQ-Scala project and jooq-scala artefactId, to contain jOOQ - extensions in the Scala language -#1782 - Move JAXB bindings out of XSD, in order to support more advanced - bindings -#1783 - Generate @SuppressWarnings("all") in jOOQ-generated artefacts -#1784 - Enhance the BETWEEN predicate, introducing the AND keyword -#1810 - Add Map ResultQuery.fetchMap(Field, Class) and - Result.intoMap(Field, Class) -#1816 - Add support for materialized views in Oracle's code generator -#1828 - Reduce log level for Factory deserialisation to TRACE -#1837 - Add support for @java.beans.ConstructorProperties when fetching into - immutable POJOs -#1841 - Add SortField Field.sort(SortOrder) to allow for dynamic sorting -#1842 - Add Condition Field.compare(Comparator, Field) to allow for dynamic - comparisons -#1844 - Add Table Table.join(TableLike, JoinType) to allow for - dynamic joining -#1845 - Add Factory.schemaByName(String) for plain SQL schemata -#1848 - Add Record.changed() to indicate whether a Record contains "dirty" - values -#1849 - Add Record.original() to obtain the originally fetched values from a - Record -#1854 - Add ResultQuery.maxRows(int) to limit the number of actually fetched - records -#1855 - Add Query.cancel() to support for interrupting statements prematurely -#1856 - Add Query.queryTimeout(int) to support for JDBC's - Statement.setQueryTimeout() - -API changes (backwards-compatible) ----------------------------------- -#1800 - Deprecate AliasProvider -#1807 - Result.intoArray() declares "throws MappingException", which isn't true -#1839 - Deprecate the various Result.getValuesAs[Type] and - Record.getValueAs[Type] methods -#1840 - Deprecate org.jooq.Store -#1866 - Deprecate [Schema-Name]Factory, remove reference to it from the - tutorials -#1869 - Deprecate org.jooq.NamedQueryPart -#1870 - Deprecate org.jooq.NamedTypeProviderQueryPart -#1872 - Improve jOOQ's RenderContext pretty printing behaviour -#1881 - Deprecate ConditionProvider, OrderProvider, LockProvider types - -Bug fixes ---------- -#1593 - Factory.field("{1} + {0} + {0}", val(1), val(2)) doesn't work. Cannot - re-use / re-order placeholders -#1720 - Improve performance by using Record.getValue(int) instead of - Record.getValue(Field) internally, where more than one value is - retrieved from a record -#1751 - Result.intoResultSet() generates wrong ResultSetMetaData if runtime - schema mapping is applied -#1764 - Add missing @Support({ ... FIREBIRD ... }) annotations -#1768 - NullPointerException when DAO.fetchOne() returns no record -#1774 - QueryPart.toString() does not load default settings from classpath -#1786 - Fix SEQUENCE support for Firebird -#1791 - Log a table's input/output names, and PK name when generating code -#1792 - Factory.fieldByName() and tableByName() do not correctly escape quotes -#1797 - SQL syntax errors when plain SQL contains comments with question marks - and SQL is executed as StatementType.STATIC_STATEMENT -#1802 - Result.into(Table) doesn't work correctly, if the same field name - appears twice in Result -#1806 - Let Record.toString() wrap the record in a temporary Result and call - Result.toString() instead -#1819 - MappingException in Record.into(Class), when POJO setters have - applicable names but non-applicable argument types -#1820 - Cannot fetch into non-public POJO classes. Their members / getters / - setters should be made accessible -#1829 - Factory.execute(String) may cause errors when plain SQL returns results -#1830 - Allow for passing null or empty arrays to intoMap(Field[]) and - intoGroups(Field[]) -#1850 - Record.equals() returns true as soon as both records hold a "null" value - for a given field -#1860 - Bad Results returned from plain SQL "select *" queries, if several - selected columns share the same name -#1876 - NULL constraint violation when storing a copied record - -Version 2.5.0 - August 26, 2012 -================================================================================ - -Welcome to another great database integration in jOOQ: Firebird! This is one of -the more popular open source SQL databases out there, with a rich feature set, -including the SQL standard MERGE statement. - -Apart from this, the main new features are: - -- Optimistic locking. jOOQ's UpdatableRecord API transparently implements - optimistic locking on its store() and delete() methods. By default, the - in-memory record is compared with the one in the database at write time. But - you can also let jOOQ handle incremented VERSION or TIMESTAMP columns for you. -- Oracle feature increment. Many nice Oracle features are now supported: - user-defined aggregates, regular expressions, Oracle Text, CONNECT_BY_ROOT and - ORDER SIBLINGS BY clausess, partitioned outer joins and more -- jOOQ's convenience API has been greatly enhanced. This includes many improved - fetch methods and new short forms for equal=eq, notEqual=ne, greaterThan=gt, - etc. to better align jOOQ with JPA, XSL, QueryDSL and many other tools that - abbreviate these keywords -- Many types and methods have been deprecated to help you foresee the upcoming - changes in jOOQ 3.0 - -Please consider also the updated manual with its new, more user-friendly -structure - -Features and improvements -------------------------- -#430 - Add support for the Firebird database -#457 - Add support for Oracle user-defined AGGREGATE functions -#620 - Add support for the SQL:2008 standard LIKE_REGEX operator -#722 - Remove casting of bind values in Ingres -#727 - Simulate RPAD and LPAD in SQLite -#816 - Add support for Oracle Text functions -#1339 - Add option to generate immutable pojos -#1547 - Support "optimistic locking" in UpdatableRecord.store() and delete() -#1552 - Generate fetchBy[ColumnName] methods in generated DAO classes -#1553 - Add some Javadoc to document the difference between using a Factory with - a Connection or with a DataSource -#1556 - Add javax.validation API to full deliverable -#1565 - Add Factory.connectByRoot(Field) to support the Oracle - CONNECT_BY_ROOT pseudo column -#1570 - Add Factory.condition(String, QueryPart...) similar to - Factory.field(String, QueryPart...) -#1582 - Add support for Oracle's ORDER SIBLINGS BY clause, in combination with - CONNECT BY -#1586 - Add missing constructors taking DataSource to dialect-specific factories -#1587 - Generate missing constructors taking DataSource in schema-specific - factories -#1595 - Simulate REPEAT() in SQLite -#1596 - Add support for optimistic locking using generated information about - "timestamp" or "version" columns -#1627 - Handle NULL in CSV imports/exports -#1645 - Add support for Oracle's PARTITION BY clause in OUTER JOINs -#1657 - Reorganise the manual -#1664 - By default, activate in the code generator -#1665 - Add support for the empty GROUP BY () clause -#1675 - Add support for the SQL standard IS [NOT] DISTINCT FROM predicate -#1680 - Overload all plain SQL DSL methods to also accept QueryPart arguments -#1681 - Simulate empty GROUP BY () clause in Sybase ASE and Ingres, joining a - dummy table and grouping by a constant field -#1684 - Add Setting to indicate that fetched records shouldn't - be automatically "attached" -#1685 - Improve Javadoc of Attachable.attach(). Document how "detaching" works -#1688 - Add E Record.into(E) as a complement to E Record.into(Class) -#1692 - Replace Factory.executeInsert(), Factory.executeUpdate() and similar - methods with more succinct variants -#1696 - Add short versions of comparison predicate methods, such as eq, ne, gt, - ge, lt, le -#1698 - Add support for the SQL standard BETWEEN SYMMETRIC predicate -#1701 - Add Factory.not(Condition) as a synonym for Condition.not() -#1704 - Document the behaviour of Factory.newRecord(Table, Object) and - Record.from(Object) with respect to UpdatableRecord.store() -#1707 - Add Map> ResultQuery.fetchGroups(Field) and - Result.intoGroups(Field) -#1712 - Add > Result.sortAsc .sortDesc(Field) -#1713 - Add Result.sortAsc, .sortDesc(Field, Comparator) -#1714 - Add Result.sortAsc, .sortDesc(Comparator) -#1718 - Document usage of InvalidResultException on the ResultQuery.fetchXXX() - Javadocs -#1721 - Add Map> ResultQuery.fetchGroups(Field, Field) - and Result.intoGroups(Field, Field) -#1722 - ResultQuery.fetchArray(int) and .fetchArray(String) should return a - typed array, even if this cannot be checked by the compiler -#1723 - Add Factory.fetchLazy(ResultSet) - -API changes (backwards-compatible) ----------------------------------- -#1544 - Remove Attachable interface from QueryPart hierarchy -#1579 - Deprecate org.jooq.Type -#1580 - Deprecate org.jooq.SchemaProvider -#1638 - Deprecate org.jooq.ArrayRecord.createArray() -#1639 - Deprecate org.jooq.Adapter -#1687 - Let Cursor.fetchInto(Table) return Result instead of List -#1736 - Deprecate TableRecord.{store|refresh|delete}Using() methods as being - part of jOOQ's internal API -#1741 - Deprecate org.jooq.MasterDataType - -Bug fixes ---------- -#1572 - Use Thread.currentThread().getContextClassLoader() to load - ExecuteListener classes as a workaround for experienced class loading - problems when using OSGi -#1584 - Code generation error with Oracle UDT static functions -#1632 - Improve the performance of various DefaultRenderContext methods, by - locally caching Settings values -#1633 - Improve the performance of CursorImpl.CursorIterator by setting Record - values by index rather than by Field -#1635 - Improve the performance of Factory.fetch(ResultSet) by caching data type - normalisation regex in FieldTypeHelper -#1650 - jOOR Fix #16: Can't call Reflect.create(A, B, null) -#1660 - Factory.renderContext().castMode(CastMode.NEVER).render(query) doesn't - work. CastMode is not applied -#1667 - Bad variable binding when NULLS FIRST, NULLS LAST is simulated in SQL - Server and other databases -#1673 - Result.formatXML() and Result.intoXML() do not render namespaces - correctly -#1683 - Oracle code generation regression for 10g. No such column - ALL_PROCEDURES.OBJECT_ID -#1693 - Cannot bind UDT values from other schemata to stored procedures -#1730 - Compilation errors in SQLite generated code when flag - is set to true - -Version 2.4.0 - July 8, 2012 -================================================================================ - -This release's main new feature is jOOQ's added convenience in -Factory initialisation for those users who get their database -connectivity through JDBC DataSources. If supplied with a -DataSource, a jOOQ Factory will handle the Connection lifecycle -internally, closing the Connection when no longer needed. - -The H2 MERGE statement syntax is now supported and simulated in -other databases, for those users that prefer its more intuitive -syntax over the SQL standard. - -The code generator now also allows for generating interfaces and -DAOs per table. DAO generation was previous discussed on the user -group and seen in a competitor product called OneWebSQL. - -The jOOQ Console now supports breakpoints for even more effective -SQL development - -Features and improvements -------------------------- -#1141 - Add Result.intoResultSet() to wrap a Result in a JDBC - ResultSet -#1253 - Avoid JDBC escape syntax for date/time literals -#1280 - Generate DAO classes and interfaces for POJOs -#1404 - Document the lifecycle of an ExecuteListener in the - Javadoc -#1411 - Add support for Postgres "any" data type (with quotes!). - This seems to map well to java.lang.Object -#1418 - Support case-insensitive schema names in code generation -#1419 - Add some WARN-level logging when the source-code - generator doesn't generate any artefacts -#1423 - Add Field.likeIgnoreCase() to support Postgres' ILIKE - operator -#1424 - Add Factory(DataSource) and similar constructors -#1427 - Add Factory.batchStore(Collection>) for convenience -#1428 - Add DataType.convert(Object...) and - DataType.convert(Collection) for convenience -#1431 - Add org.jooq.Name Factory.name(String) to contruct - QueryParts that are escaped according to - Settings.getRenderNameStyle() -#1432 - Add Factory.fetch(String, QueryPart...) and - Factory.execute(String, QueryPart...) and similar methods - to support arbitrary QueryParts in plain SQL -#1434 - Add UniqueKeyDefinition.isPrimaryKey() for completeness -#1438 - Add Result Factory.fetchFromCSV(String) -#1440 - Add top-level pom.xml for jooq-parent artefact (GitHub - Issue #14) -#1446 - Converting arbitrary strings to Number / Date should - return null, instead of throwing an exception -#1449 - Generate some meaningful Javadoc into the generated - [schema-name]Factory classes -#1454 - Add line breaks to generated Javadoc where appropriate -#1463 - Add option to let generated Record / POJO objects - implement a common generated interface -#1470 - Support interface types in ResultQuery.fetchInto(Class), - Result.into(Class), and Record.into(Class) methods, - returning a proxy -#1471 - Upgrade internal jOOR dependency to jOOR 0.9.4 -#1473 - Add IdentityDefinition to jooq-meta -#1501 - Add support for conversion of String to - java.sql.{Date, Time, Timestamp}. GitHub issue #22 -#1504 - Document behaviour of fetch() and fetchOne() in case jOOQ - cannot fetch actual records -#1509 - Minor improvements in the generator source code. GitHub - pull request #23 -#1510 - Generate additional setters for foreign keys, accepting - records as arguments -#1521 - Expose Connection methods, such as commit(), rollback() - and similar transaction-related methods in Factory -#1523 - Support ROW_NUMBER() OVER() for the latest version of - Derby and H2, which support it -#1524 - Simulate ROW_NUMBER() OVER() in HSQLDB using ROWNUM() -#1528 - Let generated interfaces extend Serializable -#1532 - Clarify the lifecycle of Configuration.data in the - Javadoc -#1534 - Generate more meaningful Javadoc where "an uncommented - item" stands now -#1536 - Add documentation to the FOR UPDATE OF clause, indicating - that DB2 may have stricter requirements regarding - updatability of fields -#1541 - Add support for the H2 MERGE syntax - GitHub Issue #18 -#1542 - Simulate the H2 MERGE syntax in other dialects supporting - the SQL standard MERGE statement - GitHub Issue #18 -#1545 - Website and Documentation anchors should be links to - themselves, visually recognisable - -Features and improvements (jOOQ Console) ----------------------------------------- -#1398 - Allow for adding breakpoints in jOOQ Console - -API changes (backwards-compatible) ----------------------------------- -#1408 - Relax bounds of in Factory.truncate() to Record, - instead of TableRecord -#1429 - Change Convert.convert(List, XXX) to accept Collection - instead of List - -Bug fixes ---------- -#1020 - Improve Oracle's LIMIT .. OFFSET clause simulation. - GitHub Issue #16 -#1358 - Compilation errors in generated source code when Oracle - overloaded procedures collide with procedures that end - with numbers -#1437 - Error in Javadoc of FactoryOperations.fetchOne(). This - method may return null -#1441 - Performance issue with AbstractDataType.convert(Object). - Avoid conversions when they're obviously unneeded -#1448 - Handle String to Enum conversion (when Java Enums are - stored as Strings in the database) - GitHub issue #15 -#1459 - Generated Keys.java static class too large (static - initialiser can become bigger than 64kb) -#1460 - Table.getReferencesTo(Table) doesn't work correctly for - aliased tables -#1461 - Exception when rendering of {fn datetimeadd(...)} for - HSQLDB and Derby -#1462 - Document missing GeneratorStrategy features, such as - getJavaClassImplements() -#1465 - Custom generator strategy's printImplements() is called - with Mode == RECORD for tables -#1478 - Caching SQLDialect in AbstractDatabase heavily improves - code generation performance -#1483 - Inefficient cloning of default settings using JAXB - unmarshalling leads to non-negligible overall overhead. - Use serialisation instead (short of a useful XJC clone - plugin) -#1489 - Fix manual where it claims to throw SQLExceptions -#1490 - Compilation error when a SQL Server stored procedure has - a parameter named "value" -#1493 - Bad syntax for SELECT /*+hint*/ DISTINCT ... in Oracle -#1498 - jOOQ does not compile using JDK 7 / JDBC 4.1. GitHub - Issue #24 -#1499 - Generated members of Tables.java are not final -#1505 - Bad exception message when ON DUPLICATE KEY IGNORE cannot - be simulated -#1515 - Splitting of large NOT IN conditions is wrong. The parts - should be connected with AND, not with OR -#1522 - fetch().into(Table) doesn't initialise records correctly, - such that subsequent calls to store() will execute an - INSERT, rather than an UPDATE -#1525 - Generate missing Javadoc to getters for procedure OUT - parameters -#1529 - Factory.batchStore() logs all single statements to DEBUG - output. Find a more accurate log output -#1537 - Factory.batchStore() renders bad SQL for Postgres. The - RETURNING clause is not allowed in batch INSERTs - -Version 2.3.1 - May 11, 2012 -================================================================================ -This is an important patch release fixing some regressions in the -code generator for the Postgres dialect. With 2.3.0, it was no -longer possible to generate schemata of which the database user -was not the owner. - -Bug fixes ---------- -#1334 - Fix inaccurate simulation of TRUNC(number, decimals) for - Derby -#1403 - Documentation bug: ctx.statement() can be replaced in - executeStart(). This is not documented -#1406 - Compilation errors in generated source code when Postgres - stored procedure parameter is called "NAME" -#1407 - Compilation errors in generated source code when Postgres - data-type is "any" (with quotes!) -#1409 - Postgres code generation broken when not connecting with - the owner of a schema - -Version 2.3.0 - May 6, 2012 -================================================================================ - -This is a minor feature increment release, featuring many useful -API enhancements, some new functions, some new syntax support -elements, improved source code generation and a lot of -improvements on the jOOQ Console, thanks to Christopher Deckers. - -The updated jOOQ Console now allows for filtering incoming -statements directly on the server side, using regular expression -filters on statement text and other features. These improvements -are a part of a general strategy to introduce breakpoints and -more sophisticated debugging capability to the jOOQ Console. - -Features and improvements -------------------------- -#597 - Add support for Oracle KEEP (DENSE_RANK FIRST...) - aggregate function clause -#910 - Add ExecuteListener extension to allow for overriding - exception translator to handle vendor-specific error - codes -#1286 - Add "renderSchema" flag to Settings, to completely - disable rendering of schema names -#1293 - Generate setter methods for JAXB annotated configuration - properties -#1295 - Add support for MySQL's INSERT IGNORE clause -#1296 - Simulate the FOR UPDATE clause for SQL Server, CUBRID, - using JDBC's ResultSet.CONCUR_UPDATABLE -#1302 - Add Factory.inline() to allow for flagging inline-only - "bind values" -#1303 - Add connection-less Factory constructors for convenience, - when jOOQ is only used as a SQL query builder -#1304 - Add option to generate JSR-303 @NotNull and @Size - annotations to generated POJO's -#1307 - Let HSQLDB dialect render NVL2() as NVL2() instead of - CASE expression -#1312 - Allow for omitting , and generate all - available schemata in that case -#1315 - Let generated factories use their associated Schema as - the Settings' RenderMapping's defaultSchema -#1319 - Move jooq-spring's FactoryProxy to the core jooq project -#1322 - Add Factory.dateAdd() and timestampAdd() for convenience -#1327 - Add DataType.isLob() -#1328 - Add Field inline(char), inline(Character), - inline(CharSequence) for convenience -#1333 - Add support for the Oracle TRUNC function, for numeric - arithmetic -#1336 - Let Record.into(Class) and similar methods accept - "immutable" classes, i.e. setter-less classes that take - several constructor arguments -#1340 - Use Constructor.setAccessible(true), if no default - constructor is available on the target type of - Record.into(Class) -#1342 - Improve Javadoc on Factory.function(). Document arguments -#1349 - Add support for the CUBRID Click-Counter INCR() -#1352 - Allow for creating syntax-error and SQL-injection safe - qualifiers for org.jooq.Field and org.jooq.Table -#1361 - Add Factory.batchStore(TableRecord...), to allow for - batch UPDATE/INSERTs of many records -#1367 - Make configured ExecuteListeners default constructors - accessible -#1366 - Let org.jooq.Batch extend Serializable -#1378 - Upgrade internal jOOR dependency to jOOR 0.9.3 -#1379 - Upgrade internal jOOU dependency to jOOU 0.9.1 -#1390 - Add RenderContext.qualify() to indicate whether - QueryParts should render qualified versions of themselves - or not - -Features and improvements (jOOQ Console) ----------------------------------------- -#1242 - Upgrade jOOQ Console dependency on RSyntaxTextArea from - 1.5 to 2.0.2 -#1249 - Allow for filtering incoming statements in jOOQ Console -#1393 - Implement a communication protocol between Console server - types and Console client types to allow for more - sophisticated functionality - -API changes (backwards-compatible) ----------------------------------- -#1310 - Deprecate Factory.literal() in favor of Factory.inline(), - and Factory.field() -#1368 - Promote AbstractQuery.isExecutable() to the public API - -Bug fixes ---------- -#989 - INSERT and UPDATE statements always render non-qualified, - escaped field names. This may cause trouble when using - plain SQL fields -#1109 - Standalone TABLE or VARRAY types are not correctly - initialised before referencing tables load them -#1279 - NullPointerException when leaving empty -#1283 - The LIKE escape character needs escaping, too, in - contains(), startsWith(), endsWith() -#1306 - Add missing INTERVAL data types to HSQLDBDataType -#1308 - Oracle's DataTypeDefinition reports the length of a BLOB - / CLOB data type to be 4000 -#1313 - and match only table names, not - fully qualified names -#1323 - Add support for byte[] in Postgres UDTs -#1324 - Code generation error in Oracle 10g when generating - stored procedures -#1326 - Error when deserialising BLOBs from Oracle UDTs -#1329 - NullPointerException when passing null to - timestampDiff(Field, Field) -#1343 - Regression in insertInto(...).values(...). Cannot pass - Field to values() -#1344 - Initialise Result ArrayLists to their expected size, if - that size is known. -#1360 - jOOR issue 12: "Don't reset the accessible flag to false, - if setting it to true is required, to avoid race - conditions in concurrency contexts" -#1371 - Missing conversion when using unsafe Field types in - BATCH statements -#1376 - Oracle UDTs in REF CURSORs are not deserialised correctly - from procedure OUT parameters -#1377 - Oracle UDTs are not deserialised correctly when the same - UDT name is present in multiple schemata -#1394 - NullPointerException when omitting element in - code generation configuration - -Version 2.2.1 - April 12, 2012 -================================================================================ - -This is a minor patch release, fixing some issues related to the -code generation of the new CUBRID integration as well as other, -minor issues. Upgrade if you're using CUBRID - -Bug fixes ---------- -#1287 - Remove oracle.sql dependency also from OSGi information - in pom.xml -#1288 - SQL syntax errors from sequences when using RenderMapping - with defaultSchema -#1289 - DefaultBindContext logs as Util.class -#1297 - Compilation error in CUBRID generated artefacts - referencing OBJECT types -#1298 - Avoid source code generation errors when generating code - for unknown, dialect-specific data types - -Version 2.2.0 - April 09, 2012 -================================================================================ - -Finally, jOOQ has added support for another database, and a very -promising one, that is. http://www.cubrid.org is a surprisingly -original mixture of a relational and object-oriented database -where tables and classes are synonyms, so are records and -instances. The CUBRID database has a high level of compatibility -with MySQL and is aimed at MySQL users wanting more performance -for their web applications. For details, see the slides here: - -http://www.slideshare.net/cubrid/growing-in-the-wild-the-story-by-cubrid-database-developers - -jOOQ is proud to have become a CUBRID partner, looking forward -to further cooperation with CUBRID in the near future. - -Apart from that, jOOQ now fully supports SQL standard INTERVAL -data types. With JDBC and JPA lacking official support for this, -jOOQ aims for becoming the tool of choice for vendor-specific -date time arithmetic. True INTERVAL data type support is given in -HSQLDB, Ingres, Oracle, Postgres databases. Besides that, CUBRID -and MySQL support INTERVAL data type arguments in functions. In -other dialects, jOOQ simulates DATEADD(), TIMESTAMPADD(), -DATEDIFF(), TIMESTAMPDIFF(). - -For jOOQ's OLAP friends, there is now also support for the Oracle -LISTAGG function (LIST() in Sybase, XMLAGG() in DB2, STRING_AGG() -in Postgres, GROUP_CONCAT() in CUBRID, H2, HSQLDB, MySQL). -LISTAGG is an "ordered aggregate function", meaning that the -aggregation is done using a specific ordering. Keep an eye out -for more such function support in future versions. - -Features and improvements -------------------------- -#566 - Add support for INTERVAL data types -#585 - Add support for DATE, TIME and INTERVAL arithmetic -#1183 - Add support for DEFAULT values in Oracle stored procedure - parameters -#1243 - Let generated POJOs (and Records) extend base classes - and implement interfaces -#1252 - Avoid JDBC escape syntax for Oracle stored procedure - calls. Generate PL/SQL syntax, instead -#1255 - Let generated Tables contain a public default constructor - to be able to extend those classes - Github issue #12 -#1257 - Add CUBRID support -#1268 - Add Factory.field(String, QueryPart...) to generate - custom clauses -#1269 - Add YEAR(), MONTH(), DAY(), HOUR(), MINUTE(), SECOND() - function support as shortcuts for EXTRACT() -#1273 - Simulate GROUP_CONCAT() aggregate function using Oracle's - LISTAGG() function, where available -#1274 - Add support for the Oracle LISTAGG(...) WITHIN GROUP - (ORDER BY ..) [ OVER (..) ] aggregate / analytic function -#1275 - Simulate Sybase LIST() aggregate function using Oracle's - LISTAGG() function -#1276 - Simulate Oracle's LISTAGG() in DB2 using XMLAGG(), - SUBSTR() and CONCAT() -#1278 - DEBUG log both executed SQL and SQL with inlined bind - values - -API changes (backwards-compatible) ----------------------------------- -#1262 - Pull up OracleFactory.prior() and other CONNECT BY - related methods to Factory - -Bug fixes ---------- -#1241 - Wrong variable binding when comparing CHAR columns in - Derby and DB2 without explicit casting to VARCHAR -#1244 - Cannot override class name in GeneratorStrategy in - Mode.POJO -#1248 - Setting both false and - true leads to compilation errors -#1256 - Fixed code generation issue with H2 user defined - functions returning VARCHAR -#1263 - Pass fetchsizes <= 0 to the JDBC driver (for vendor- - specific MySQL compatibility) -#1270 - Most databases allow for multiple identical foreign keys. - This leads to compilation errors in generated source code - -Version 2.1.0 - March 18, 2012 -================================================================================ - -With this version, jOOQ attempts to follow versioning rules -imposed by semantic versioning: http://semver.org/ -There will be 1 minor release per month, and a couple of patch -releases per year, depending on popular demand - -The main improvements for this release include - -- The possibility of providing jOOQ with a custom type mapping. - You can now define your own Converter types that are used by - jOOQ to map a database's SQLDataTypes to your custom types. - This is particularly useful for Java's enums. Read more about - custom converters in the manual: - http://www.jooq.org/manual/ADVANCED/CustomTypes/ - -- There are a lot of new runtime configuration options to control - the SQL style of SQL rendered by jOOQ. You can now specify - whether table/column names should be quoted / capitalised / - lower-cased, whether SQL keywords should be capitalised or not, - etc... - -- The handling of NULL has been improved in favour of using jOOQ - as a SQL builder library (e.g. along with Spring for execution) - NULL is no longer inlined, but bound as a variable. - -- jOOQ now supports simulation of the relational division - operation using an intuitive syntax. Read more about the - relational division here: - http://en.wikipedia.org/wiki/Relational_algebra#Division - -Features and improvements -------------------------- -#161 - Add runtime configuration to pretty print rendered SQL -#349 - Add SQLite relations support -#491 - Add runtime configuration for SQL keyword style (upper - case, lower case) -#521 - Add runtime configuration for SQL reference style (upper - case, lower case, as-is, quoted) -#1150 - Add code generation option to disable generation of - records -#1181 - Add support for SQL Server data types timestamp and - rowversion -#1188 - Load default Settings from the classpath at - /jooq-settings.xml, or from -Dorg.jooq.settings -#1193 - Specify main-class in jOOQ Console's manifest.mf and - include dependency in jar file -#1194 - Add ColumnDefinition.isNullable() -#1202 - Add support for the relational division operation: - A.divideBy(B).on(A.ID.equal(B.A_ID)).returning(A.X, ...) -#1207 - Add Factory.batch(Collection) for - convenience -#1208 - Render @javax.persistence.Column(nullable = false) - property, if available -#1209 - Render @javax.persistence.Column(length, precision, - scale) properties, if available -#1215 - Add org.jooq.Converter for custom type mapping -#1216 - Overload Record, Result.getValue() and .setValue() - methods to accept a Converter -#1217 - Add EnumConverter as a base type for custom enum - converters -#1218 - Add code generation options to generate - referencing a Java type and a Converter -#1224 - Add DataTypeDefinition.getLength() to jooq-meta's type - system -#1233 - Support custom JDBC properties for jooq-codegen -#1234 - Add Database.getTable(SchemaDefinition, String, boolean) - to fetch tables case-insensitively -#1239 - Add Factory.fetchLazy(String, Object...) - -API changes (backwards-compatible) ----------------------------------- -#1191 - Deprecate ConfigurationRegistry and replace by equivalent - ExecuteListener feature -#1219 - API Bug: Cannot use LIMIT .. OFFSET along with FOR UPDATE - -Bug fixes ---------- -#625 - Remove dependency from generated Routines to the - generator's SQLDialect -#1128 - NULL is inlined in INSERT statement instead of binding it - as a variable. This can cause issues when using jOOQ with - Spring -#1137 - Exclude MySQL column-level enum types when that column is - overridden by a -#1158 - Derby cannot handle inlined NULL literals in some - contexts -#1180 - Execute BatchMultiple (multi-query batch query), when - executing BatchSimple (single-query, multi-bind-value - query) with StatementType == STATIC_STATEMENT -#1189 - TableMapping regression for SQLite database -#1190 - Cannot store SQLite records when using - StatementType.STATIC_STATEMENT -#1199 - Table.getFields() returns an internal representation of a - table's field list. Make generated tables immutable! -#1200 - Internal API leak exposed through covariance in - AbstractType.getFields() -#1211 - Enforce method name disambiguation also when using custom - strategies in jooq-codegen -#1212 - Enforce identifier disambiguation also when using custom - strategies in jooq-codegen -#1221 - Incorrect ExecuteListener invocation for INSERT .. - RETURNING. executeStart() and executeEnd() are omitted -#1223 - Cache ExecuteListener classes for performance -#1225 - Bind NULL byte[] as java.sql.Types.BINARY instead of - BLOB in Postgres, to avoid errors -#1226 - Bind NULL UDTs with their associated type name in Oracle -#1232 - SQLException when Factory.fetch() does not return a - ResultSet -#1237 - Don't generate enum classes for columns in MySQL tables - that are excluded from code generation - -Version 2.0.5 - February 26, 2012 -================================================================================ - -This release finally introduced basic runtime configuration -features for the jOOQ Factory. This configuration now includes: - -- Execute listener and SQL tracing support. jOOQ allows you to - hook your own listeners into jOOQ's query execution engine to - be notified of all sorts of events -- The existing SchemaMapping features. They are now part of the - runtime configuration -- StatementType settings. Specify whether a Factory should - execute java.sql.PreparedStatements (with bind variables) or - static java.sql.Statements with inlined variables. - -The runtime configuration is documented here: - -http://www.jooq.org/manual/JOOQ/Factory/ - -The listener and tracing support has been requested by -Christopher Deckers, a new jOOQ user who has had the courtesy to -contribute the new jOOQ Console, which is documented here: - -http://www.jooq.org/manual/ADVANCED/ExecuteListener/ - -Apart from that, another long-requested feature is now fully -implemented: The GeneratorStrategy, allowing for custom naming -strategies in generated source code. This will allow for -generating custom table / record class name prefixes / suffixes, -as well as overriding the default behaviour for rendering UPPER, -lower and CamelCase artefacts. See the manual for details: - -http://www.jooq.org/manual/META/Configuration/ - -Features and improvements -------------------------- -#93 - Add Field.equalIgnoreCase(), Field.notEqualIgnoreCase() -#408 - Add class prefixes, suffixes and other options to the - code generator -#492 - Add runtime configuration -#1107 - Let Field.contains() support the Postgres ARRAY @> ARRAY - operator -#1140 - Add ResultQuery.fetchResultSet() to return the underlying - JDBC result set -#1143 - Add Result.isNotEmpty() for convenience -#1145 - Add runtime configuration to specify whether jOOQ should - execute java.sql.PreparedStatement (with bind variables) - or a java.sql.Statement (with inlined parameters) -#1146 - Add Query.getSQL(boolean) to indicate that bind values - should be inlined (as a convenience for - Factory.renderInlined(QueryPart)) -#1148 - Add Cursor.resultSet() to expose the underlying ResultSet -#1149 - Allow for optional - "http://www.jooq.org/xsd/jooq-codegen-2.0.4.xsd" - namespace in jooq-codegen configuration -#1152 - Add & org.jooq.EnumType> - E MySQLFactory.enumType(Class, int) for enum reverse - lookups of MySQL-specific enums -#1159 - Support matching numbers with LIKE, e.g. ID LIKE '%33%' -#1160 - Implement Field.contains(), .startsWith(), .endsWith() - for numeric values, too -#1161 - Use reflection to remove compile-time dependency on - ojdbc for creating ARRAYs -#1162 - Integrate jOOR into jOOQ for simpler reflection -#1164 - Distinguish between Definition.getInputName(), - .getOutputName() -#1165 - Add constraint name to generated javadoc -#1167 - Trivial issue with org.jooq.Factory.exists Javadoc - - GitHub issue #10 -#1169 - Add Configuration.setData(), getData() to convey custom - data in a configuration's lifecycle -#1172 - Add runtime configuration to deactivate JooqLogger -#1177 - Add jOOQ-Console module to jOOQ -#1184 - Add DataType.isArray() - -API changes (backwards-compatible) ----------------------------------- -#1142 - Rename Result.exportXML() to Result.intoXML() to stay - more consistent -#1151 - Deprecate SchemaMapping in favour of new runtime - configuration - -Bug fixes ---------- -#978 - Schema.getTables() and similar methods return empty lists - when Schema is mapped with SchemaMapping -#1153 - Bad inlining of booleans in Sybase ASE / DB2 / Oracle - SQL Server / SQLite -#1154 - Bad inlining of byte[] in most dialects -#1155 - byte[] are erroneously converted to String when using - Record.intoArray() -#1156 - Bad inlining of DATE / TIME / TIMESTAMP data types in - Ingres (and other dialects, when the setting differs from - the default) -#1166 - Some generated Javadoc uses naming strategy or plain - output name, instead of qualified output name -#1168 - Oracle packages are generated as static, instead of - static final -#1175 - Factory.use() seems to render SQL with the Schema name - still present -#1179 - Oracle-generated ArrayRecords need a reference to - org.jooq.Schema to read TABLE of OBJECT from stored - procedures - -Test cases ----------- -#1147 - Add integration tests for executing SQL generated using - Factory.renderInlined() - -Version 2.0.4 - February 12, 2012 -================================================================================ - -This release introduced many improvements to source code -generation. These improvements include: - -- Maven and standalone code generation now use the same XML - configuration, which is read by jOOQ-codegen using JAXB. This - allows for more complex configuration elements in the future -- jOOQ-codegen can now handle multi-schema databases and generate - code for tables referencing tables from other schemata. This - is integration tested against the SQL Server AdventureWorks - database -- jOOQ now allows to generate simple POJOs in addition to Records - and to annotate both POJOs and Records with JPA annotations - such as @Entity, @Table, @Id, @Column, @UniqueConstraint, etc. - -You can migrate your existing .properties configuration by running -> org.jooq.util.GenerationTool /your.properties migrate - -Besides that, there is a lot of ongoing work to improve the -integration of Oracle's TABLE and VARRAY types. - -Features and improvements -------------------------- -#8 - Add JPA annotations to generated POJOs / Records -#282 - Add support for multi-schema databases -#287 - Add support for Oracle TABLE types -#395 - Use XML configuration file instead of properties file -#1089 - Add Field.contains(), .startsWith(), .endsWith() as a - convenience for Field.like() (including escaping) -#1092 - Move master data table configuration from - generator.generate to generator.database namespace -#1093 - Add support for generator.strategy in Maven source code - generation -#1094 - Add support for generator.database.date-as-timestamp in - Maven source code generation -#1095 - Move generator.generate.unsigned-types to - generator.database namespace -#1096 - Add support for generator.generate.unsigned-types in - Maven source code generation -#1103 - Add support for SQL Server data type uniqueidentifier -#1106 - Add Factory.escape(Field, char) for use with LIKE -#1108 - Add support for multi-schema databases using Maven code - generation -#1115 - Add support for Oracle VARRAY/TABLE of OBJECT types -#1127 - Add support for POJO classes generation -#1129 - Allow for using Param in LIMIT .. OFFSET clauses -#1132 - Add RenderContext.castMode() to allow for avoiding casts - where this is not really needed -#1136 - Add generation option to enable/disable generating - navigation methods - -Bug fixes ---------- -#1099 - Derby generated artefacts are not sorted alphabetically -#1101 - Internal API leak exposed through covariance in - AbstractTable.joinXXX() methods -#1110 - VARRAY element type information is lost when unnesting - VARRAY's in Oracle -#1111 - VARRAY element type information is lost when unnesting - VARRAY's returned from functions in Oracle -#1114 - Syntax error when unnesting TABLE of OBJECT in Oracle. - The unnested table contains several columns but jOOQ only - unnests "COLUMN_VALUE" -#1117 - NullPointerException when passing an ArrayRecord - containing a null array to a stored function in Oracle -#1125 - Postgres needs casting for date time data types in - queries like SELECT ? FROM DUAL -#1131 - DB2: [Noauthorized routine named "LIKE" of type - "FUNCTION" having compatible arguments was found] when - using Field.like(concat(x, y)) -#1133 - Compilation errors in generated source code if the same - constraint name exists in several schemata -#1134 - NullPointerException in code generation when a foreign - key constraint references a table from another schema - that is not being generated -#1135 - Generated Javadoc references inputSchema instead of - outputSchema - -Test cases ----------- -#1009 - Add more integration tests for proper handling of - java.sql.Date, Time, Timestamp -#1090 - Run jOOQ tests against AdventureWorks SQL Server sample - database -#1105 - Add integration tests for multi-schema source code - generation and querying -#1122 - The 10k lines of integration test code are too heavy for - the compiler. Create test modules with fewer lines of - code, each. - -Version 2.0.3 - January 29, 2012 -================================================================================ - -This release focuses on increased compatibility between various -SQL dialect integrations as far as ARRAY and JOIN support is -concerned: - -- ARRAY types are only available in H2, HSQLDB, Oracle, Postgres. - Nevertheless, they can be somewhat simulated in other dialects - using nested selects with UNION ALL. Increased compatibility - leads to a nicer API, where ARRAYs are used along with ALL/ANY - quantifiers, for instance. - -- JOIN syntaxes can be quite powerful in SQL. Apart from - simulating NATURAL JOIN, JOIN USING clauses, as well as a - synthetic "KEY JOIN" syntax, jOOQ now also supports nesting - JOIN expressions to create more complex table sources. See a - recent blog post on the subject here: - -http://blog.jooq.org/2012/01/15/lets-revise-the-sql-from-clause/ - -Features and improvements -------------------------- -#578 - Add KEY JOIN syntax to simulate joining using generated - foreign keys -#577 - Simulate NATURAL JOIN syntax, where this is unavailable -#582 - Simulate JOIN USING syntax, where this is unavailable -#671 - Allow for nesting JOIN clauses -#676 - Add Table.join() methods to create more flexible table - sources -#993 - Add Field.equalAny(T[]), .equalAny(Field) methods -#1048 - Simulate (array) syntax for dialects - that do not support arrays -#1051 - Add Factory.execute(String, Object...) as a convenience - method for Factory.query(...).execute() -#1055 - Simulate Factory.table(Object[]) and table(List) using - UNION ALL in dialects that do not support arrays -#1060 - Improve debug logging of H2 arrays. The syntax is not - ARRAY[1, 2], but (1, 2) -#1065 - Add OracleFactory.sysContext(String, String) to support - Oracle's SYS_CONTEXT function -#1069 - Add support for INSERT INTO table(field1, field2, ...) - SELECT syntax - as opposed to the existing INSERT INTO - table SELECT -#1072 - Add support for LIKE .. ESCAPE .. syntax -#1074 - Add Field.notBetween(T, T) for convenience -#1080 - Add support for JDBC's Statement.setFetchSize() in - ResultQuery.fetchLazy() -#1082 - Add some more DEBUG logging in AbstractResultQuery - -API changes (backwards-compatible) ----------------------------------- -#1059 - Change SelectFromStep.from(Collection>) to - from(Collection>) - -API changes (backwards-incompatible) ------------------------------------- -#1087 - Change the NTILE function to return Field - instead of Field - -Bug fixes ---------- -#1071 - Make Sequence Serializable -#1081 - Derby error in NULL handling when simulating unnested - arrays that contain NULL values -#1084 - Bind index mismatch in val(null).equal(null) and in - val(null).notEqual(null) -#1091 - Add missing @Support annotations on Table.crossJoin() - methods - -Test cases ----------- -#1026 - Add integration tests for NTILE window function and - document compatibility -#1073 - Add integration tests for NOT IN queries holding NULL - arguments - -Version 2.0.2 - January 8, 2012 -================================================================================ - -This is a maintenance release for jOOQ 2.0. The main improvements -include - -- The whole jOOQ API is now annotated with a new org.jooq.Support - annotation to help you assess whether a certain SQL clause is - available in your database or not. This is particularly useful - when your application should support several databases at once - (e.g. MySQL, Postgres, Oracle) -- The Oracle PIVOT clause is now formally supported for advanced - statistical queries in Oracle. This clause will be simulated in - other dialects in the future. -- The DATE data type can be mapped to TIMESTAMP. This important - when you query a legacy Oracle database, where DATE columns - can also contain time information -- Several convenience methods have been added for more fluent - syntax, when using plain SQL result queries, subqueries as - tables, or when unnesting arrays in ANY() and ALL() quantifiers - -Further type mapping support is still experimental. An official -cooperation with MinuteProject for source code generation is -being analysed. With MinuteProject, many source code generation -issues could be addressed centrally, as MinuteProject specialises -in source code generation: - -http://minuteproject.wikispaces.com/ - -Features and improvements -------------------------- -#595 - Add support for Oracle's PIVOT clause -#869 - Add support for using ANY, ALL with arrays, not just with - subselects -#1007 - Formally document the API methods to indicate whether - something is supported by any given SQL dialect -#1011 - Add code generation configuration parameter to avoid - generating @Generated annotation -#1019 - Render LIMIT x OFFSET y also for MySQL, instead of - LIMIT y, x -#1022 - Add missing Sybase ASE implementation for Factory.use() -#1024 - Add Factory.resultQuery(String, Object...) to allow for - arbitrary execution modes of plain SQL queries (lazy, - later, into, array, etc) -#1025 - Add missing SQLite implementation for Factory.deg() and - Factory.rad() -#1033 - Generate table comments into generated Tables.java as - Javadoc -#1040 - Add Object[][] Result.intoArray() and - Object[] Record.intoArray() for convenience. Let - E Record.into(Class) also support array types. -#1041 - Add Table Factory.table(Select) convenience - method for more fluency -#1042 - Add support for DISTINCT keyword in SUM, AVG, MIN, MAX - aggregate functions -#1046 - Generate Ingres table and column comments in generated - source code (only Ingres 10) - -API changes (backwards-compatible) ----------------------------------- -#1050 - Deprecate usage of SOME quantifier in predicates, such as - equalSome() - -API changes (backwards-incompatible) ------------------------------------- -#1036 - Fixed API typo in - WindowsRowsStep.rowsBetweenUnboundedFollwing() -#1037 - The fluent API allows for JOIN clauses without FROM - clause - -Bug fixes ---------- -#1010 - The MERGE INTO .. WHEN NOT MATCHED THEN INSERT .. syntax - may cause type-safety issues in some databases. VALUES - should be converted before binding -#1014 - FindBugs: Latent risk of infinite recursion due to typo - in QueryPartList.retainAll(); -#1015 - FindBugs: 7 occurrences of "Bad attempt to compute - absolute value of signed 32-bit hashcode". In extreme - cases, this could lead to SQL syntax errors -#1016 - The Oracle CONNECT BY cond1 AND cond2 syntax erroneously - creates a WHERE cond2 CONNECT BY cond1 statement -#1028 - Syntax errors when using untyped param() in HSQLDB (and - other strongly typed dialects) -#1029 - Postgres can't bind NULL values in cases, where bind type - is Object.class and bind value was created with - Factory.param() -#1030 - UnsupportedOperationException when calling - Query.bind(int, Object) on a query containing plain SQL - fields -#1031 - Incorrect debug logging when plain SQL QueryParts like - field("?") bind null values -#1032 - Incorrect debug logging when plain SQL QueryParts contain - String literals, such as 'Hello? Anyobody out there?' -#1047 - Field.notEqualAny() erroneously renders <> ALL() - -Test cases ----------- -#1021 - Add explicit integration tests for - LEFT|RIGHT|FULL OUTER JOIN - -Version 2.0.1 - December 23, 2011 -================================================================================ - -This is a maintenance release for jOOQ 2.0. The main improvements -include - -- Better integration for using jOOQ with Spring Data. This - includes support for named parameters, as well as allowing to - change bind values on previously constructed Query objects -- The MERGE statement has been enhanced for better integration - with Oracle. -- jOOQ is now ready to use with Scala / Groovy - -For more information about using jOOQ with Scala, see this blog -post: -http://blog.jooq.org/2011/12/11/the-ultimate-sql-dsl-jooq-in-scala/ - -There is now also experimental support for a custom type mapping. -This mapping allows to rewrite data types at code generation time -as well as to specify custom enum data types (e.g. boolean Y/N). -Not all integration tests run smoothly for custom data types, -hence, this feature is not yet fully supported. - -Features and improvements -------------------------- -#691 - Add support for Oracle CURSOR REF IN / INOUT parameters -#677 - Add type-mapping configuration, enforcing types for - columns -#947 - Add custom type mapping support (experimental) -#968 - Allow for custom enum types, configured in the code - generator (experimental) -#974 - Add Schema.getTable(String), getSequence(String), - getUDT(String) for better runtime Schema meta-navigation -#975 - Add Sequence.getName(), getSchema(), getDataType() -#980 - Add support for named parameters, to better interact with - Spring -#991 - Add Query.bind(String, Object) and bind(int, Object) to - easily modify existing bind values -#992 - Document thrown DataTypeException in Convert methods -#998 - Enhance MERGE statement for Oracle extensions: - WHEN MATCHED THEN UPDATE .. WHERE .. DELETE WHERE .. - WHEN NOT MATCHED THEN INSERT .. WHERE .. -#1000 - Add support for MySQL's INSERT INTO .. SET .. syntax in - MERGE statement's WHEN NOT MATCHED THEN INSERT clause - -API changes (backwards-compatible) ----------------------------------- -#981 - Cannot insertInto(table("my_table")), as plain SQL tables - return Table, not Table. Relax - bound on R -#988 - Change Factory.field(String) to return Field - instead of Field -#999 - Make MERGE's WHEN MATCHED .. and WHEN NOT MATCHED .. - clauses optional -#1001 - Identity.getField() should return TableField - instead of Field -#1006 - Add Factory.value(...) as a synonym for Factory.val(...) - for increased Scala / Groovy compatibility - -Bug fixes ---------- -#973 - EnumType renders name() instead of getLiteral() in - formatXXX() methods -#977 - EnumType renders name() instead of getLiteral() in - Convert.convert() method -#979 - Record.from() sets all changed flags to true. That's not - necessarily correct in the event of storing the record - back to the DB -#985 - AbstractRecord.equals() does not correctly compare - arrays. Compare them using Arrays.asList() -#986 - Postgres / DB2 / Sybase ASE foreign-key namespace is - unique-per-table. jOOQ forces all foreign keys from all - tables into the same namespace -#990 - Problems when encoding arbitrary byte[] as String(byte[]) - in inlined SQL. This can cause issues when DEBUG-level - logging is activated -#995 - Routines don't respect SchemaMapping - Github issue #8 -#1002 - TableRecord.storeUsing() doesn't update IDENTITY column - values, if the column is not part of the main unique key -#1003 - Sybase / SQL Server / MySQL / Ingres / H2 / Derby's - INSERT .. RETURNING simulation returns null if a table - has an IDENTITY column, but no primary/unique key -#1005 - The INSERT INTO .. VALUES .. syntax may cause type-safety - issues in some databases. VALUES should be converted - before binding - -Test cases ----------- -#984 - Detach IDENTITY column tests from UNIQUE KEY tests, - create a dedicated test suite instead - -Version 2.0.0 - November 25, 2011 -================================================================================ -This release is a fresh start in many areas of jOOQ, adressing -issues that have been requested by users for a long time. These -release notes docment the most important changes, a detailed -upgrade guide, as well as the detailed list of improvements. - -Most important changes ----------------------- -- The API became more static. This applies to many Factory - methods, such as val(), literal(), as well as to many Field - methods that have been moved over to the Factory. For example, - when before, you wrote this using "postfix function notation": - -
NAME.replace(" ", "_").trim()
- - you will now write (just as in SQL): - -
trim(replace(NAME, " ", "_"))
- - Using static imports of Factory.*, jOOQ makes SQL look even - more like SQL. The current "postfix notation" is maintained for - backwards compatibility. -- By default, jooq-codegen will now generate a "dynamic" meta - model as opposed to the existing static one. Generated tables - covariantly override the as(String) aliasing method, leading - to a much more convenient aliasing style. When before, you - wrote: - -
-Table parent = T.as("parent");
-Table child  = T.as("child");
-Condition join =
-  parent.getField("ID").equal(child.getField("PARENT_ID"))
-
- - You can now write: - -
-T parent = T.as("parent");
-T child  = T.as("child");
-Condition join = parent.ID.equal(child.PARENT_ID)
-
- - Of course, the existing notation still works - -- Exceptions are no longer checked. When previously, the DB's - SQLException was propagated to client code, there is now an - unchecked DataAccessException hierarchy, similar to that of - Spring. This will eventually give way to a standardised error - handling abstraction, in future developments. -- Window functions are now constructed from their underlying - aggregate functions just like in SQL. For example: - -
-sum(AMOUNT)
-sum(AMOUNT).over().partitionBy(ACCOUNT)
-
- - This makes for a more concise API, especially when considering - future extensions, such as Oracle's KEEP (DENSE_RANK FIRST...) - syntax. -- More type safety has been introduced regarding various places - where generic and types are involved. - This is especially true for INSERT / UPDATE / DELETE statements -- Sequences now also have a type -- Unsigned number types are now supported in those databases that - use them. Unsigned numbers are implemented in jOOU, a spin-off - open source project. For convenience, this library is - "internalised" into jOOQ, to avoid adding a dependency - -http://code.google.com/p/joou/ - -Upgrade instructions: ---------------------- -Various of the above changes are incompatible with jOOQ 1.x. In -order to upgrade, please be aware of the following pitfalls: - -- The schema needs to be re-generated. -- Much of the post-fix function notation is replaced by static - methods in the Factory. Today's org.jooq.Field API is - maintained in jOOQ 2.0, for backwards compatibility. It will - be removed, eventually, though. Expect some incompatible - changes, where window functions are involved -- Some Factory instance methods (such as val(), literal()) are - now static. They are compatible, but may cause compiler - warnings. -- The meta model is now an instance model by default. If you - prefer the static meta model, you can configure this in your - jooq-codegen configuration. -- The additional typesafety involving and types may cause - compiler warnings and errors. -- SQLException is no longer part of the API. This can cause - compiler issues, in particular when extending jOOQ -- Some utility classes have moved to org.jooq.tools - -Should these incompatibilities be too significant for your -project, you can still stay on the 1.x branch, which will be -maintained for a while. Be aware that upgrading might be more -difficult, later, though. - -Features and improvements -------------------------- -#55 - Implement improved exception handling -#117 - Improve DSL support for field and table aliasing (decrease - verbosity) -#519 - Add support for MySQL UNSIGNED numeric types -#626 - Create static function access -#661 - Add support for bitwise operators -#718 - Sequences should be mapped to appropriate type (e.g. - SMALLINT, INT, BIGINT, etc) -#734 - Add support for Oracle / SQL Server CUBE() and ROLLUP() - grouping functions -#751 - Add support for Oracle / SQL Server GROUPING SETS() - function -#799 - Add support for Oracle PL/SQL's object-oriented MEMBER - PROCEDURES and MEMBER FUNCTIONS -#804 - Add to Insert, Update, Delete -#835 - Review API typesafety for InsertSetMoreStep - set(Field, T) and similar methods -#890 - Add Factory.selectCount() convenience method -#891 - Let min() max(), etc functions return a new type - AggregateFunction. This type can then be used as an entry- - point for window functions -#892 - Add support for Oracle / SQL Server GROUPING() and - GROUPING_ID() functions to be used along with CUBE() and - ROLLUP() -#893 - Simulate ROLLUP() function for MySQL, using the WITH - ROLLUP grouping modifier -#894 - Move functions from Field to org.jooq.impl.Factory - and make them static -#895 - Add power(..., Field) -#897 - Add (experimental) Spring integration project -#898 - Replace usage of checked SQLException by an unchecked - DataAccessException, similar to that of Spring -#899 - Build jOOQ .jar files as bundles to be deployed into OSGI - environments -#900 - Purge deprecated API - Prior to 2.0 -#901 - Introduce InvalidResultException as a subtype of - DataAccessException for integrity checks in methods like - ResultQuery#fetchOne(), ResultQuery#fetchMap(), etc. -#902 - Make AggregateFunction the base type for constructing - window functions -#904 - Move SQLDialectNotSupportedException into - org.jooq.exception package -#905 - Introduce MappingException as a subtype of - DataAccessException for integrity checks in methods like - ResultQuery#fetchInto(), etc. -#907 - Add missing Field.like(Field), notLike(Field) - methods to overload the existing Field.like(T), notLike(T) -#908 - Change rpad / lpad functions to accept String instead of - char -#912 - Add R newRecord(Table, Object) as - the inverse of various into(Class) methods -#916 - Add > {Record.into(Table) | - Result.into(Table) | ResultQuery.fetchInto(Table) | - Cursor.fetchInto(Table)} -#917 - Add various Cursor.fetchOneInto() convenience methods -#918 - Add CustomTable, CustomRecord as base classes for more - convenience when used with various into(Table) methods -#919 - Allow for accessing non-public constructors of Record - subtypes -#923 - Move some utilities to org.jooq.tools -#924 - Generate a reference to every table in a new Tables.java - class for improved static access -#928 - Add DataTypeException extending DataAccessException in - case something went wrong when converting data types -#930 - Support converting date time types to java.util.Calendar. - This applies to various into(Class) methods, as well as - Result.getValue(xx, Class) -#931 - Allow for conversion between Long and date/time types, and - vice versa -#932 - Let the bound of R in TableRecord extend TableRecord, - in UpdatableRecord to extend UpdatableRecord -#933 - Add support for type Character in Record.into(Class) - methods and similar -#936 - Accept primitive types, such as int.class for type - conversion -#938 - CODEGEN: Add static/instance table field configuration -#939 - Include license.txt and readme.txt in .jar files' META-INF - directory -#953 - Make DefaultGeneratorStrategy methods non-final to allow - for overriding -#954 - Add examples for source code generation of multiple - schemata with Maven -#955 - Generate a reference to every type in a new UDTs.java - class -#957 - Add R Factory.newRecord(UDT) for constructing - attached UDTRecords -#958 - CODEGEN: Add generation-time schema mapping, allowing for - re-writing schemata in jooq-codegen -#960 - CODEGEN: Add code generation configuration parameter to - avoid using the new UByte, UShort, UInteger, ULong wrappers - for UNSIGNED number types -#961 - Use Oracle's SYS.ALL_SEQUENCES.MAX_VALUE to determine the - type of a sequence. -#969 - Add List ResultQuery.fetch(Field, - Class) convenience method - -Bug fixes ---------- -#686 - Reduce the internal API leak by preventing access to - TableFieldImpl, UDTFieldImpl, ParameterImpl -#903 - lag(Field, int, T) erroneously delegates to lead() -#906 - Add more NullPointerException safety to API -#913 - NoClassDefFoundError in JooqUtil.isJPAAvailable() -#920 - Generic type is lost in Cursor.fetchInto(RecordHandler) -#925 - SelectConditionStep should extend SelectConnectByStep, not - SelectGroupByStep -#926 - AbstractRecord.into() fails to convert java.sql.Date into - java.util.Date -#934 - Don't consider static members in reflection utilities when - used with Record.into(Class) and similar methods -#935 - Don't consider final member fields in reflection utilities - when used with Record.into(Class) and similar methods -#937 - In the event of name clash (same name for table and field) - generated code has errors -#945 - Calling UpdatableRecord.setValue() twice with the same - argument causes the changed flag to be reset to false -#948 - Always set the changed flag to true in Record.setValue() -#959 - Compilation errors in generated source code if MySQL enum - values match Java reserved words, such as 'true', 'false', - 'new', etc... -#962 - Postgres ordering of generated enum literals is unstable -#967 - Better document type conversion - -Version 1.7.0 - November 25, 2011 -================================================================================ -This is a maintenance release for the 1.x branch. Some important -bug fixes are merged from version 2.0. These include: - -Bug fixes ---------- -#925 - SelectConditionStep should extend SelectConnectByStep, not - SelectGroupByStep -#926 - AbstractRecord.into() fails to convert java.sql.Date into - java.util.Date -#937 - In the event of name clash (same name for table and field) - generated code has errors -#945 - Calling UpdatableRecord.setValue() twice with the same - argument causes the changed flag to be reset to false -#948 - Always set the changed flag to true in Record.setValue() -#951 - Empty Password for jooq-codegen-maven causes NPE - -Version 1.6.9 - November 7, 2011 -================================================================================ -This is a maintenance release for the 1.x branch. Developments -on this branch will stop after version 1.6.9. Only important bug -fixes are merged to this branch. Developments for release 2.0 -have started. - -The most important functionality in release 1.6.9 is the newly -added support for JDBC batch operations. You can now batch -execute several queries. - -See the official blog for more information: -http://blog.jooq.org/2011/10/25/jdbc-batch-operations-with-jooq/ - -Features and improvements -------------------------- -#621 - Add support for JDBC batch operations -#794 - Add support for ORDER BY [int value] in order to reference - a column index for sorting -#882 - Optimise Field.isTrue() and isFalse(). Take Field's data - type into consideration. -#885 - Add support for INSERT INTO .. VALUES (..) syntax, - omitting explicit field declarations -#887 - Add List Cursor.fetchInto(Class) - -Bug fixes ---------- -#748 - H2 regression in 1.3.158 regarding stored functions, which - return a ResultSet (this was fixed in H2) -#859 - Derby casting of numeric types to BOOLEAN doesn't work -#886 - Regression in date extract function when used in a - subselect -#888 - Derby casting of VARCHAR to FLOAT (and similar) doesn't - work - -Version 1.6.8 - October 22, 2011 -================================================================================ -The main improvement of this release is the re-design of the -stored procedure / function API. With 12 supported RDBMS, which -all have their own idea about what is a stored procedure and what -is a stored function, it has proven to be a better design, to -unite them in one single type: org.jooq.Routine. A routine can -have a return value as well as OUT parameters. It can be embedded -in SQL and used as a field or a table. - -This means, you will need to re-generate your database schema, -when upgrading to jOOQ 1.6.8. After re-generation, you'll need to -fix your client code. These are the package changes: - -- [generated.package].procedures > [generated.package].routines -- [generated.package].functions > [generated.package].routines -- [generated.package].Procedures > [generated.package].Routines -- [generated.package].Functions > [generated.package].Routines - -Oracle generated packages are not re-located. With these -improvements, using stored procedures and functions becomes even -more reliable, especially when cursor types are involved. Read -more about the rationale behind this change: - -http://blog.jooq.org/2011/10/17/what-are-procedures-and-functions-after-all/ - -Apart from that, important improvements have been made in the -area of plain SQL tables. Also, consider a demo integration of -jOOQ with Google Cloud SQL: - -http://blog.jooq.org/2011/10/22/jooq-and-google-cloud-sql-example/ - -Features and improvements -------------------------- -#271 - Don't pre-fetch table meta data when selecting from plain - SQL tables -#489 - Add support for SELECT * (i.e. render SELECT * where - applicable) -#596 - Add support for VARIANCE() and STDDEV() OVER() window - functions -#608 - Add jOOQ version number in generated source code -#670 - Add more Javadoc to Field.xxx() functions -#692 - Add support for ResultSet type returned from HSQLDB - stored functions -#850 - Use http://www.jooq.org as URL for the @Generated - annotation -#854 - Add convenience methods Fields.isTrue(), isFalse() for - conversion of "Y", "YES", "1", "true", "on", etc into a - boolean condition -#870 - Add support for MEDIAN aggregate function -#872 - Add support for STDDEV_POP(), STDDEV_SAMP(), VAR_POP(), - VAR_SAMP() aggregate functions -#874 - Reduce the number of internal classes for dialect-specific - function aliases -#878 - Implement DataType.equals() and hashCode() - -API changes (backwards-compatible) ----------------------------------- -#851 - Change Field.{sortAsc|sortDesc}(List sortList) into - Field.{sortAsc|sortDesc}(Collection sortList) - -API changes (backwards-incompatible) ------------------------------------- -#848 - Purge deprecated API - Prior to 1.6.1 -#849 - Replace Cursor.fetchResult() by Cursor.fetch() -#852 - Review stored procedures / functions concept. Merge them - all into a single "Routine" type - -Bug fixes ---------- -#756 - Error when aliasing HSQLDB and Postgres unnested tables -#761 - Exception when TRACE logging execution with plain SQL - tables involved -#773 - Execute standalone stored functions as CallableStatement - to prevent issues with transactions -#847 - Query.getSQL() doesn't render dialect-specific SQL when - Query is constructed using the fluent API -#853 - DB2 generated convenience methods for stored functions - have unstable ordering -#857 - Derby casting of numeric types to String / VARCHAR does - not work -#858 - SQLDataType.getSQLDataType() should return itself, instead - of null -#860 - SQLite CEIL function is incorrectly simulated. CEIL(2.0) - returns 3.0 instead of 2.0 -#861 - Field.replace(String) generates bad SQL for various RDBMS. - Field.replace(String, String) works, though -#863 - Ingres integration generates illegal SQL when selecting - things like SELECT 1 WHERE 1 = 1 -#866 - Sybase ASE Field.replace(String) function incorrectly - removes the argument string -#873 - Error when selecting two times the same aggregate field -#877 - Compilation error in generated source code when a table - without a primary key has an identity column -#879 - Add Google Cloud SQL Example -#880 - Query.getSQL() does not consider SchemaMapping - -Test cases ----------- -#811 - Loader integration tests fail for SQLite -#812 - CSV Loader test leaves Postgres JDBC connection in an - inconsistent transactional state on error -#856 - Add integration tests for Field.abs() -#865 - Add integration tests for Field.ascii() -#867 - Add integration tests for Field.sum(), avg(), max(), min() -#881 - Re-design H2 stored functions to be pre-compiled, in order - to speed up integration tests - -Version 1.6.7 - September 25, 2011 -================================================================================ - -This release coincides with the launch of the new website at -http://www.jooq.org. Hence, it ships with little additions to the -deliverable itself. - -Apart from new convenience methods, the main addition is a Maven -plugin for jooq-codegen contributed by Sander Plas. - -Features and improvements -------------------------- -#797 - Create Maven plugin for source code generation -#825 - Add List> Factory.fetchMany(String) to - allow for fetching several result sets from stored - procedures, such as Sybase ASE's "sp_help" -#838 - Implement MetaDataFieldProvider.toString() -#841 - Add List Result.getValues(Field, Class) -#842 - Add Query.getBindValues() method to allow for extracting - bind values in the correct order -#843 - Add Factory.fetch(ResultSet) to transform a JDBC ResultSet - into a jOOQ Result - -API changes (backwards-compatible) ----------------------------------- -#837 - Avoid final keyword on Object methods, such as .equals(), - .hashCode(), etc - -Bug fixes ---------- -#836 - Bad syntax when selecting from aliased plain SQL tables -#839 - Boolean conversion in getValueAsBoolean() should trim - String values first -#840 - Numeric conversions in getValueAsXXX() should trim String - values first -#844 - NullPointerException when selecting a column from a Result, - that does not exist - -Version 1.6.6 - September 11, 2011 -================================================================================ - -Finally, support for another RDBMS has been added. Sybase's other -important product Sybase Adaptive Server Enterprise (or simply -Sybase ASE) is now officially supported by jOOQ - -Apart from this, there had been important improvements with the -recently added INSERT .. RETURNING clause, as well as some fixes -related to DECIMAL / NUMERIC data types - -Features and improvements -------------------------- -#796 - Complete missing public org.jooq.impl Javadoc -#800 - Add support for Sybase Adaptive Server Enterprise -#808 - Add support for INSERT .. RETURNING for Ingres -#809 - Add support for INSERT .. RETURNING for Sybase SQL - Anywhere using SELECT @@identity -#810 - Add support for INSERT .. RETURNING for SQLite using - last_inserted_rowid() -#813 - Add DSL support for INSERT .. RETURNING -#814 - Change TableRecord to reload its trigger-initialised main - key in Oracle and other RDBMS that don't support IDENTITY - columns -#818 - Add SQLiteFactory.rowid() -#819 - Support SQLite AUTOINCREMENT columns as IDENTITY -#820 - Add Factory.fetchOne(String) for executing plain SQL - queries that return single records -#826 - Allow for returning several records in the INSERT .. - RETURNING clause. This now works for DB2, HSQLDB, MySQL, - and Postgres -#827 - Support Sybase SQL Anywhere's TOP n START AT m clause - instead of simulating it with nested SELECT's - -API changes (previous API now deprecated) ------------------------------------------ -#817 - Deprecate Factory.lastID(Identity) - -Bug fixes ---------- -#815 - SQL Server fetching of IDENTITY value is broken -#821 - Optimise ResultQuery.fetchAny() executing fetchLazy() - internally, and only fetching one record from the cursor -#822 - Let Constant cast to more precise NUMERIC/DECIMAL types - in those RDBMS where casting is necessary -#823 - Cannot bind SQLite BigDecimal, BigInteger types - bind - them as String instead -#824 - BigInteger values cannot be bound in DB2, Derby -#828 - Document inefficient implementation for GREATEST and LEAST - in some RDBMS - -Version 1.6.5 - August 28, 2011 -================================================================================ - -This release finally adds a loader for CSV data to jOOQ. You can -now load CSV data using a simple fluent API, configuring error -handling, duplicate behaviour and transaction handling, as well -as various CSV parameters. - -This release also changes the way generated keys are retrieved -after INSERT's. Instead of (potentially inconsistently) running -SELECT MAX(pk) immediately after the INSERT, Postgres' INSERT.. -RETURNING clause is used (or simulated), in a single statement. - -Features and improvements -------------------------- -#784 - Add Result.exportXML() to retrieve a DOM document similar - to that of .formatXML() -#792 - Add support for loading of CSV data into tables -#795 - Add List fetch(int, Class) and - fetch(String, Class) convenience methods -#803 - Add support for INSERT .. RETURNING or simulate it where - not available -#805 - Add T[] fetchArray(int, Class) and - fetchArray(String, Class) convenience methods -#806 - Add T fetchOne(int, Class) and - fetchOne(String, Class) convenience methods - -Bug fixes ---------- -#798 - Oracle IN (...) clause with more than 1000 arguments does - not work -#802 - Use "INSERT .. RETURNING" instead of "SELECT MAX(pk)" - to retrieve the primary key of a new record - -Version 1.6.4 - August 07, 2011 -================================================================================ - -This release ships with a couple of useful concepts inspired by -other frameworks. These are: - -- selecting into custom POJO's. Results can be mapped to POJO's - by convention or using JPA @Column annotations -- selecting into custom callbacks. This is already a wide-spread - practice in Spring JdbcTemplates. -- selecting long-running queries asynchronously. This idea has - been inspired by the Avaje Ebean framework - -Apart from these changes and some bugfixes, the internal API has -been completely re-designed. The idea here is that query -rendering and variable binding are even faster (less String -objects), more extensible and more accurate. This is a pre- -requisite for many future developments with even more complex SQL -statements, such as for instance CTE's (Common Table Expressions) - -Features and improvements -------------------------- -#137 - Add support for asynchronous query execution using - FutureResult ResultQuery.fetchLater() similar to - Avaje Ebean -#198 - Add SELECT INTO functionality into POJO's using - T ResultQuery.fetchInto(Class) similar to JPA - CriteriaQuery -#728 - Add .fetchInto(RecordHandler) to ResultQuery, Result, - and Cursor to allow for callbacks similar to Spring's - JdbcTemplate/Ollin Framework -#774 - Add more TRACE logging to .fetchLazy() -#777 - CURSOR: Add function alias: UNNEST for TABLE -#781 - Add E function (Euler number) -#782 - Add T Record.getValue(..., Class) methods - for convenient type conversion -#785 - Allow for storing TableRecord with a provided Field[] - indicating the primary key -#786 - Document thread-safety facts in Factory Javadoc -#788 - Add Key.getFieldsArray() convenience method -#793 - Add support for Oracle's SYS_CONNECT_BY_PATH function - -API changes (backwards-incompatible) ------------------------------------- -#758 - Change internal QueryPart rendering and binding API to use - Configuration and Context as callback parameters. If you - use CustomField or CustomCondition, please correct your - implementations accordingly. Other parts of the API should - not be affected -#778 - Purge deprecated API, deprecation prior to jOOQ 1.5.7 -#790 - Purge deprecated generated code, deprecation prior to - jOOQ 1.5.7 - -API changes (previous API now deprecated) ------------------------------------------ -#776 - Deprecate QueryPart.getSQL(), add Query.getSQL() -#789 - Deprecate Record constructors with Configuration - parameter - -Test cases ----------- -#636 - Add integration tests for more advanced CONNECT BY - example -#772 - Add integration tests for selecting cartesian products - (several tables in FROM clause) - -Bug fixes ---------- -#730 - Sybase cannot bind null values in plain SQL -#759 - Omit the TOP 100 PERCENT clause in SQL Server ordered - top-level queries -#767 - An empty Java package is generated for PL/SQL packages - containing underscores -#771 - Some exotic literals are not properly escaped with quotes - yet, e.g. UDT identifiers, VARRAY types, etc. -#775 - Automatic re-attaching after deserialisation does not work - when used with .fetchLazy() -#787 - The UpdatableRecord's internal changed flags are not - updated after INSERTs / UPDATEs - -Version 1.6.3 - July 31, 2011 -================================================================================ - -This is mainly a maintenance release with lots of bugfixes, -mostly around code generation, plain SQL tables, and data types. -Please note that generated source code may contain incompatible -changes due to #639 (see below for details)! - -Apart from that, project CURSOR is advancing and it is now -possible to unnest arrays into tables. See this article for -details about where jOOQ is heading with project CURSOR: - -http://blog.jooq.org/2011/07/24/the-power-of-ref-cursor-types/ - -Features and improvements -------------------------- -#679 - Improve H2 NVL2 support as of H2 1.3.156 -#680 - Improve H2 ROUND support as of H2 1.3.156 -#735 - Add README documentation to GitHub -#736 - Add more info regarding number of generated artefacts in - jooq-codegen logging -#750 - Add DataType.isNumeric(), .isString(), .isTemporal(), - .isBinary() -#754 - Log query as executed by JDBC PreparedStatement when - TRACE logging (without inlining variables) -#752 - CURSOR: Add support for selecting from ARRAY types -#762 - Use H2's native support of NVL, instead of COALESCE -#764 - CURSOR: Add support for selecting from ARRAY types - returned from stored functions - -API changes (backwards-incompatible) ------------------------------------- -#639 - Map DECIMAL(n, 0) and NUMBER/NUMERIC(n, 0) data types - to Byte/Short/Integer/Long/BigInteger instead of - BigDecimal in generated source code. Re-generated code - will not be compatible! - -API changes (previous API now deprecated) ------------------------------------------ -#731 - Inconsistent API with Field.lessOrEqualToXXX(). Removed - "To" from method name -#757 - Deprecate Factory.constant() methods - -Test cases ----------- -#731 - Add missing integration tests for equalAll(), equalSome() - and similar methods -#747 - Upgrade H2 to 1.3.158 - -Bug fixes ---------- -#632 - Sybase error : column @p0 not found in nested SELECT -#700 - Restore HSQLDB ARRAY support with INFORMATION_SCHEMA - change in HSQLDB 2.2.3, and some fixes in 2.2.5 -#725 - Cannot insert byte[] data with plain SQL -#733 - H2 changed JDBC type for ResultSet/CURSOR from 0 to -10, - like Oracle -#737 - Compilation errors in generated source code if table - fields contain spaces -#738 - Compilation errors in generated source code if MySQL - procedure parameter type contains two comma-separated - arguments (like DECIMAL(10,2)) -#739 - Postgres navigator methods and keys are not re-generated - in the same order -#740 - Formatting is broken on Result.format() with some special - newline characters -#743 - Make SQL Server INFORMATION_SCHEMA independent from - HSQLDB again, to prevent incompatibility issues -#744 - Ingres REAL and FLOAT4 types are generated as FLOAT/FLOAT8 - which maps to java.lang.Double, instead of java.lang.Float -#753 - Postgres error when binding array that contains null - values -#755 - NullPointerException when converting an array containing - a null value -#766 - Bad decoding of JDBC Types BIGINT (to BigInteger instead - of Long) and REAL (to BigDecimal instead of Float) when - plain SQL tables are involved - -Version 1.6.2 - July 10, 2011 -================================================================================ - -This release mainly introduces three new projects. - -Project CURSOR where jOOQ finally supports various RDBMS's TABLE, -CURSOR, and REF CURSOR data types. This is especially useful when -those types are returned from stored procedures and functions. -Cursors are simply mapped to jOOQ Result types and can -thus be used like regular table results - -Project EXPORT aims at exporting data from the database in -various serialisable formats, such as XML, CSV, HTML, Text, JSON. -This project will be continued in the future, to also -deserialise from (some of) these data streams. This will allow -for easy transport of jOOQ Result types over the net. - -Project CODEGEN has finally been started. Many improvements -suggested by jOOQ users will be implemented in the next releases. -In this release, important fixes have been made to prevent -compilation errors in generated artefacts. - -Features and improvements -------------------------- -#61 - EXPORT: Add Result.formatXML() -#166 - CURSOR: Add support for ResultSet type returned from - Oracle stored procedures / functions -#411 - Allow for fetching Map (instead of Record) - and List> (instead of Result) -#549 - Add Factory.function() for plain SQL functions -#611 - Simulate RPAD and LPAD in SQL Server, Sybase -#627 - Add support for Postgres FOR UPDATE OF [table-name] clause -#628 - Add support for REPEAT (SQL Server: REPLICATE) function -#637 - Nicely format time in StopWatch logging output -#640 - Simulate Postgres FOR UPDATE OF [table-name] clause in - other dialects -#649 - CURSOR: Add Cursor.fetch(int) .fetchOne() - .fetchResult(int) .fetchResult() -#653 - Add support for MySQL encryption and compression functions -#660 - Clarify Javadoc of UpdatableRecord to explain its - behaviour when changing the main unique key -#669 - EXPORT: Add Result.formatHTML() -#672 - Add convenience method UpdatableRecord.copy() in order to - reset primary key values for a subsequent INSERT -#675 - EXPORT: Add Result.formatCSV() -#683 - Implement ResultImpl.equals() and .hashCode() -#684 - Implement AbstractStore.equals() and .hashCode() -#685 - Add Store.size() to indicate the maximum index of the - Store -#687 - EXPORT: Add result.formatJSON() -#689 - Create separate builds: jooq-core.zip and - jooq-with-dependencies.zip -#690 - CURSOR: Add support for ResultSet type returned from H2 - stored functions -#695 - CURSOR: Add support for ResultSet type returned from - Postgres stored functions -#697 - Add Factory.fetch(String) for executing plain SQL queries - that return results -#701 - Add ResultQuery.fetchArray() and .fetchOneArray to return - Object[][] and Object[] -#704 - Always add top and bottom line in Result.format() -#705 - Right-align numeric values in Result.format() -#716 - Add SUBSTRING function Field.substring(Field, Field) - taking fields as arguments -#719 - Document risk of SQL injection in plain SQL and literal - factory methods -#726 - Add LENGTH function as a synonym for CHAR_LENGTH - -API changes (backwards-compatible) ----------------------------------- -#698 - Inconsistent API with Factory.fetch(Table [,Condition]) - Let method return Result instead of List -#699 - Let Result extend List - -API changes (previous API now deprecated) ------------------------------------------ -#656 - Decrease verbosity of plain SQL methods. They will just be - called Factory.field() .condition() .table() .query() - -Test cases ----------- -#643 - Add integration test for code generation of invalid and - incomplete types in Oracle -#654 - Add integration tests for master data tables with PK types - other than NUMBER/INT -#655 - Add missing integration tests for TRIM function - -Bug fixes ---------- -#450 - Improve plain SQL integrity checks for bind variables -#610 - CODEGEN: Compilation error in generated source code for - databases with table named 'system' -#646 - An empty Java package is generated for an empty PL/SQL - package. This is unnecessary -#651 - CODEGEN: Avoid importing datatypes in generated source - code to prevent collisions -#657 - NullPointerException when creating a Factory with a null - SchemaMapping -#658 - Master data table code generation is broken for tables - with more or less than 3 columns -#662 - Add support for the missing Postgres data type "bpchar" -#663 - Add support for the missing Sybase data type "int" -#664 - Ingres INTEGER data types are not correctly generated -#665 - HSQLDB Datatype CLOB and BLOB are not supported, when - selecting from plain SQL tables -#666 - The evil bug: Ingres TRIM function only executes RTRIM -#673 - UpdatableRecord.store() doesn't work if called after - .delete() -#702 - Add support for the missing SQLite data type "NULL" -#706 - CURSOR: Ensure that Query.execute() runs in a single - transaction when Postgres refcursor is involved in the - query (this fixes a Postgres JDBC driver flaw) -#724 - NullPointerException when passing a single literal null - bind value to plain SQL methods without casting to Object -#729 - DB2, Derby, Ingres, Oracle cannot bind null values in - plain SQL - -Version 1.6.1 - June 19, 2011 -================================================================================ - -In this release, the PORTABILITY project has been implemented. -Finally, the SQLDialect has been removed from most generated -artefacts (Schema, Table, Field, Sequence, etc). Also, the -constructing Factory is not referenced by its created QueryParts -anymore, unless this is really necessary (Query objects, UDT's, -ARRAY types). This leads to higher compatibility between schemata -of different databases, e.g. if users want to use an HSQLDB -development and Oracle productive database. - -Unfortunately, this means that the way stored procedures are -called had to be changed. This is an API break that could not be -avoided. The pre-1.6.1 StoredObject.execute(Connection) method -is deprecated and will be removed in the future. It has been -replaced by StoredObject.execute(Configuration) - -In addition to this project, many more window functions are now -supported, as well as the Oracle-specific CONNECT BY clause for -recursive queries. - -Features --------- -#351 - Add support for Oracle ROWID data type -#452 - PORTABILITY: Create a super-set of RDBMS data types -#453 - PORTABILITY: Don't create dialect-specific QueryParts -#455 - Add support for the Oracle CONNECT BY clause -#587 - Add optional OFFSET clause to form LIMIT .. OFFSET - constructs -#589 - Add extended FOR UDPATE [OF ...] [{WAIT n | NOWAIT | SKIP - LOCKED }] support -#591 - Add support for LEAD() OVER() and LAG() OVER() window - functions -#592 - Add support for the CUME_DIST() OVER() window function -#601 - Add Factory.literal() convenience methods -#602 - Add Factory.val() methods to decrease .constant() - verbosity -#604 - Add support for RESPECT NULLS clause in some window - functions -#605 - Add Factory.use(String) for non-generated schemata -#613 - Add PI function -#616 - Add Factory.two() literal convenience method -#630 - Add support for Oracle CONNECT BY pseudo-columns LEVEL, - CONNECT_BY_ISCYCLE, CONNECT_BY_ISLEAF - -API changes ------------ -#299 - PORTABILITY: Create a dialect-independent meta-model -#588 - Add OVER() keyword to FIRST_VALUE() and LAST_VALUE() API - -Test cases ----------- -#368 - Add integration test for use with schema mapping -#586 - Upgrade H2 to 1.3.155 -#607 - Add integration tests for CRUD / SP's / UDT's / ARRAY's - with SchemaMapping -#612 - Add integration tests for LPAD and RPAD functions -#624 - Add integration test for code generation of invalid/ - incomplete views in Oracle -#631 - PORTABILITY: Add integration tests for using Oracle- - generated schema against an HSQLDB database -#638 - Add missing integration test for DECIMAL data type - -Bugfixes --------- -#176 - Stored procedures / functions in EQUIVALENT schemata - cannot be called -#493 - Bind variable mismatch when constructing bad SQL -#594 - Confusing Javadoc in SELECT DSL API -#603 - Fix DB2 'IGNORE NULLS' clause -#619 - SUBSTRING() function is broken in DB2, Ingres, SQL Server -#623 - SQL syntax error for some MERGE queries in SQL Server and - Sybase -#633 - SchemaMapping is not applied to sequences -#634 - Sequences are not escaped in generated SQL - -Version 1.6.0 - June 05, 2011 -================================================================================ - -Apart from supporting various additional standard and non- -standard JOIN constructs, there is now also full support for the -SQL standard MERGE statement and MySQL's ON DUPLICATE KEY variant -thereof. A great number of API enhancements have been added, -which improve the usability of jOOQ. The Ingres database is now -also supported. - -Features --------- -#301 - Add support for Oracle execution hints -#409 - Add support for NATURAL JOIN syntax, where RDBMS allows it -#415 - Make fluent API's underlying SelectQuery objects publicly - available -#429 - Add Ingres support -#475 - Document class-level generic types and in Javadoc -#486 - Add support for SQL MERGE clause -#494 - Allow for omitting schema name in generated SQL -#496 - Automatically update IDENTITY values in UpdatableRecord, - after storing them -#520 - Add support for JOIN ... USING syntax -#524 - Upgrade HSQLDB to 2.2 -#533 - Add ORDER BY [Map] or BY [List] functionality -#534 - Add Result.isEmpty() -#535 - Call upon ConfigurationRegistry.provideFor() before - throwing a DetachedException -#536 - Simulate CASE [value] WHEN [value] THEN [result] END - syntax in Derby -#538 - Add some logging to ConfigurationProvider -#539 - Add possibility to negate numeric values with Field.neg() -#541 - Add support for MySQL ON DUPLICATE KEY clause -#542 - Allow for Collection arguments in INSERT's DSL API -#543 - Allow for creating FUNCTION() OVER() without PARTITION BY - or ORDER BY clause -#546 - Add Factory.use(Schema) -#548 - Add new internal type FieldMap -#550 - Simulate ON DUPLICATE KEY INSERT clause in dialects other - than MySQL -#551 - Add TableMapping, similar to SchemaMapping for mapping - tables -#553 - Add Factory.plainSQLQuery -#554 - Add Factory.plainSQLField with a DataType parameter -#555 - Add UpdateXXX.set(Map) convenience methods to DSL API -#557 - Enhance INSERT DSL API to allow for adding VALUES clause - with InsertXXX.set() syntax -#570 - Add support for the RAND() function -#567 - Add support for Ingres Sequences -#572 - Add support for the ATAN2() function -#573 - Add possibility for additional select() clauses for - convenience -#575 - Add support for the FULL OUTER JOIN syntax, where RDBMS - supports it -#576 - Add support for the CROSS JOIN syntax, where RDBMS - supports it -#581 - Enhance API and allow Collection> - instead of Collection> - -API changes ------------ -#397 - Purge deprecated API - -Bugfixes --------- -#481 - Handle case where an empty record is stored -#522 - Misleading Javadoc in generated stored procedures and - function constructors -#532 - Restore Postgres INFORMATION_SCHEMA -#537 - Prevent null from being added to QueryPartList -#540 - Error when TRACE logging Limit -#544 - Aliased elements are not bound correctly when rendered - with toSQLReference() -#559 - Loosen type safety on overloaded methods to prevent - compilation errors with javac/Netbeans -#560 - HSQLDB DataType REAL is configured incorrectly -#565 - Add integration tests for current_user() function -#569 - ORA-01427 when generating foreign key relations -#571 - Field.trim() not correctly implemented for SQL Server -#583 - Accelerate integration tests: Reset schema only if - necessary - -Version 1.5.9 - May 15, 2011 -================================================================================ - -This version ships with lots of new functionality. Finally, the -DSL-style API has been extended to CRUD operations (INSERT, -UPDATE, DELETE)! Also, support for the TRUNCATE TABLE statement -has been added. - -The most important new features include the support for SQL:2003 -standard window functions, which are available in most major -RDBMS. Additionally, basic function support has been widely -extended. - -Features --------- -#148 - Added support for window functions -#204 - Add support for multi-record INSERT's -#416 - Added support for retrieval of IDENTITY values -#433 - Use bind variables for LIMIT and OFFSET -#441 - Added foreign key relationship meta information to the - generated source code -#446 - Beautify ResultImpl.toString() method -#461 - Automatically cast CONCAT parameters to Field if - necessary -#463 - Added support for trigonometric functions -#471 - Added support for the sign function -#472 - Added support for GREATEST/LEAST functions -#474 - Added support for "hyperbolic" functions SINH, COSH, TANH, - and COTH -#482 - Added DSL API for INSERT statements -#483 - Added DSL API for UPDATE statements -#484 - Added DSL API for DELETE statements -#485 - Added "Registry" for client code to provide Configurations - to jOOQ Attachables -#490 - Added support for the TRUNCATE TABLE statement -#495 - Generate source code for IDENTITY columns -#501 - Added support for boolean conversion to Result, Record, - and Store -#503 - Allow for schema navigation via generated artefacts -#518 - Let stored procedures reference owner package - if applicable -#525 - Added NULLS {FIRST | LAST} clause to ORDER BY constructs -#528 - Added Factory.getDataType() convenience method -#530 - Added Factory.zero() and Factory.one() convenience methods - -API changes (jooq) ------------------- -#527 - Weakened type-safety on Field.nvl2() -#529 - Deprecated Factory.select(Object...), added .selectOne() - and .selectZero() instead - -API changes (jooq-meta) ------------------------ -#30 - Add ParameterDefinition for stored procedures, instead of - reusing ColumnDefinition -#499 - Add reference to TableDefinition in ColumnDefinition -#500 - Add AttributeDefinition for UDTDefinition, instead of - reusing ColumnDefinition - -Bug fixes ---------- -#369 - Adapt H2 relations generation to H2's correction of - information_schema.cross_references -#435 - Added integration tests for NESTED SELECTs holding LIMIT - clauses -#460 - Syntax error when using a field with a reserved name -#462 - Fixed Javadoc broken links -#473 - Don't cast when cast is unnecessary -#479 - INSERT statement should not set all fields for a table -#497 - Derby referential code generation is broken, for named - foreign keys -#498 - Oracle package content is generated in arbitrary order -#502 - Syntax error when creating an empty IN condition -#526 - Corrected Javadoc in Field.coalesce() - -Version 1.5.8 - April 29, 2011 -================================================================================ - -Finally, jOOQ now supports two important new RDBMS: -SQL Server and Sybase! - -Apart from this great enhancement, there is now also full support -for the non-SQL standard LIMIT clause, even in dialects where the -LIMIT clause is not supported natively (especially Oracle, but -also DB2, SQL Server and Sybase, which have limitations). jOOQ -simulates LIMITs by rendering nested selects filtering on ROWNUM -(Oracle) or on ROW_NUMBER() (DB2, SQL Server and Sybase). - -Other interesting additions are an increasing support for native -mathematical functions. More function support will be added in -future versions. - -Features --------- -#16 - Added support for SQL Server -#21 - Uniform implementation of the LIMIT clause. Implemented - LIMIT clause simulation through analytic functions, where - LIMIT is not supported natively -#97 - Added support for Sybase -#418 - Measure time of various steps in source code generation -#420 - Added support for proprietary SQL extensions "FOR UPDATE" - and "FOR SHARE" -#431 - Added additional statistics to generation log files -#432 - Unified the various "standard" ANSI INFORMATION_SCHEMA - implementations in the jooq-meta artefact -#436 - Added support for the modulo function -#438 - Added floor and ceil functions -#439 - Added support for mathematical functions (logarithms, - exponentials, sqrt) -#447 - Enhanced Field.add() and Field.subtract() to work for date - time fields, also - - -API changes ------------ -#428 - Created new Maven artefact jooq-meta to cleanly separate - database meta-data navigation from code generation -#458 - Decreased DSL verbosity for arithmetic operations and for - ordering - -Bug fixes ---------- -#417 - Restored warning when unknown column type is encountered - in source code generation -#419 - Corrected misleading Select.fetchOne(...) Javadoc -#421 - Optimised AbstractRecord's memory consumption -#448 - Corrected some Javadoc @see links -#449 - Changed Field.concatenate() to accept Field parameters - to avoid generic varargs warnings - -Version 1.5.7 - April 17, 2011 -================================================================================ - -This is the first release built with support of Maven thanks to -the help of some jOOQ users! - -The main new features in this release are the improved support -for serialisation/deserialisation of jOOQ objects through use of -the newly introduced "Attachable" interface. - -If using log4j or the newly supported slf4j logging framework -in debug/trace mode, there is the possibility to log query -building/execution time statistics. - -Apart from these new features, fixes were mainly done in the -fields of type casting, HSQLDB 2.1 upgrade support, stored -procedures with OUT, IN/OUT parameters. Please upgrade, if you -are using any of those features. - -If you extend jOOQ as a base implementation for source code -generation, be aware of the fact, that the jOOQ-codegen is -currently undergoing major changes. Expect the code generation -API to stabilise again in one of the next releases. - -Features --------- -#104 - Added maven dependency -#248 - Integrate UDT types with ARRAYs -#295 - Allow for attaching/detaching UpdatableRecords to/from - Configurations -#359 - Added statistics measurement to Query execution for debug - log level -#362 - Added deprecation configuration flag -#364 - Document unknown type in generated source code -#373 - Improve exception handling in code generation -#378 - Added support for Oracle stored functions with OUT - parameters -#382 - Added Factory.attach() methods to re-attach deserialised - Attachables -#394 - Add logging support for SLF4J -#398 - Allow to provide a DataType in Factory.constant() -#399 - Provide access to TypeUtils.convert() methods via DataType -#404 - Added trace logging for measuring the speed of various - query execution steps - -API changes ------------ -#358 - Enhanced DSL API to allow for HAVING clauses without - GROUP BY clauses -#367 - Make Store, Result, QueryPart "Attachable" -#374 - Introduce strategy pattern to code generation for future - support for advanced naming schemes -#375 - Decouple Database from Generator -#381 - Made DataType Serializable -#384 - Deprecated singleton QueryParts -#388 - Unify "internal" API using an Adapter pattern - -Bug fixes ---------- -#187 - Protect generated Record navigation methods against name - clashes -#266 - Added more thorough integration tests for dialect-specific - casting (including some fixes related to varchar types) -#360 - Added more integration tests for the DISTINCT clause -#361 - Add more checks in testInsertUpdateDelete() -#366 - Warn only once per ColumnDefinition, if a data type is - unknown -#377 - NullPointerException when generating invalid stored - function -#380 - Added integration tests to check for proper - serialisability -#386 - Fixed incompatibilities with HSQLDB 2.1.0 -#387 - Fixed unnecessary imports in some Oracle generated - Records -#389 - Fixed javac compiler warning in AbstractStoredObject -#391 - Cannot properly call stored procedures when IN/OUT - parameter is bound to NULL -#392 - Procedures with several OUT parameters may not register - OUT parameters correctly -#410 - Passing null VARRAY values to Oracle stored procedures - causes issues -#412 - limit(int) sets default offset incorrectly in some - dialects - -Version 1.5.6 - March 31, 2011 -================================================================================ - -This release consists mainly of code generation bug fixes and -minor API improvements and enhancements. - -The most important improvement is ticket #90, by which lazy -fetching and iteration over data is now supported. jOOQ lets you -keep a reference to a Cursor that has an open JDBC ResultSet, to -fetch data from on-the-fly. - -A few major code generation bugs were reported where the -generated code may cause ambiguity due to an inconsistent API. -This means that you will have to re-generate your schema after -upgrading to version 1.5.6. Some of your code may not compile -anymore, after this upgrade. - -Features --------- -#90 - Added possibility for lazy fetching of data -#208 - Added convenience methods for direct invocation of - sequences' currval() and nextval() attributes -#212 - Created one factory per dialect for better separation of - dialect-specific support -#213 - Generate a factory for each schema -#251 - Opened up base implementations for Field and Condition - to allow for custom implementations by client code -#274 - Integrate H2 ARRAY types with stored procedures -#292 - Documented usage of log4j and java.util.logging -#306 - Added support for the NULLIF function -#319 - Added Field.between(Field, Field) method -#320 - Added trace logging for variable binding and SQL - generation methods -#323 - Added Field.in(Field...) method -#325 - Include release version number in delivered .jar files -#328 - Improved configuration setup documentation page -#333 - Let Result implement Serializable -#334 - Added fetchMap() convenience methods -#335 - Added more functions and aggregate functions examples to - documentation -#338 - Visually improve code generation logging -#339 - Removed skipping of unreferenced UDT's, ENUM's and ARRAY's -#342 - Improved generated referential code by using fetch() and - fetchOne() API -#356 - Let UpdatableRecord.store() and delete() return an int - to indicate whether the record was actually modified - -API changes ------------ -#233 - Allow for joining TableLike instead of Table -#337 - Added generic type > to - InsertSelectQuery -#341 - Fixed API flaw where SelectOnConditionStep.and() methods - and similar ones returned SelectConditionStep, instead of - SelectOnConditionStep - -Bugfixes --------- -#69 - Corrected referential code generation for foreign keys - that reference non-primary unique keys -#85 - Corrected referential code generation for multi-field - foreign keys -#121 - Covered more Factory.executeXXX() methods with integration - tests -#318 - Fixed NullPointerException when executing SELECT * from - aliased tables -#321 - BetweenCondition does not bind left hand side Field - correctly -#322 - InCondition does not bind left hand side Field correctly -#326 - Avoid method overloading where binding to Object - may lead to compile-time ambiguities (with javac) -#343 - Add more foreign key navigation method integration tests -#347 - Add explicit integration tests for schema artefacts - excluded from code generation -#350 - Disambiguate navigation methods if several foreign keys - reference the same entity -#352 - Disambiguate navigation methods if a table ending on S - references itself -#353 - Added integration test for compilation of generated - artefacts with javac (as opposed to the Eclipse compiler) -#355 - Error when storing an UpdatableRecord that has no changed - values - -Version 1.5.5.2 - March 15, 2011 -================================================================================ - -A critical bug was reported from the 1.5 release stream where -stored functions did not render their parameters in correct order - -Features --------- -#302 - Map Oracle's NUMBER data type to java.lang.Number in - stored procedures, stored functions - -Bugfixes --------- -#317 - StoredFunctionImpl.asField() renders parameters in wrong - order - -Version 1.5.5.1 - March 13, 2011 -================================================================================ - -In version 1.5.5, there was a fatal bug breaking Derby source code generation. -Only the Derby dialect is affected. Please update immediately, if you are using -jOOQ's Derby integration - -Bugfixes --------- -#315 - Generated master data records are not sorted by PK -#316 - Derby code generation fatally broken - -Version 1.5.5 - March 12, 2011 -================================================================================ - -This version is released early as there are some important bugfixes. Additional -improvements include: - -- Improved DSL related to conditions in HAVING and JOIN clauses -- Support for Oracle-style functions, such as NVL, NVL2, COALESCE - DECODE, etc - -Features --------- -#304 - Add support for Oracle NVL function -#305 - Add support for COALESCE function -#308 - Add support for Oracle NVL2 function -#311 - Add support for Oracle DECODE function - -API changes ------------ -#223 - Enhance DSL to accept and(), or() and similar methods in JOIN steps -#224 - Enhance DSL to accept and(), or() and similar methods in HAVING steps - -Bugfixes --------- -#297 - Fixed Factory.concatenate() function -#298 - Added integration tests for nested selects in HAVING clause -#300 - Added integration tests for nested selects in JOIN clause -#303 - Javadoc correction -#307 - Accelerated integration tests -#309 - Fixed JDBC variable binding issue related to Conditions where the lhs is - a function (e.g. stored function) and the rhs is a constant -#310 - Fixed issue where fetchOne() methods throw NullPointerException if no - result record is available -#312 - Fixed issue where Field.equal(...) methods rendered unexpected SQL when - rhs null is cast to a type -#313 - Fixed Derby cast type for VARCHAR -#304 - Let the DerbyDataType default for java.lang.String be VARCHAR, not LONG - VARCHAR - -Version 1.5.4 - March 04, 2011 -================================================================================ - -Feature #243 required a minor API change in the base classes of generated source -code. This means you have to re-generate all your jOOQ artifacts in order to -migrate to 1.5.4. The artifacts themselves should be regenerated in a compatible -way, such that your client code should not be affected. If this is not the case, -please report a ticket here: - - https://sourceforge.net/apps/trac/jooq/newticket - -Apart from the Derby RDMBS and some new data type support, there have been many -new convenience methods added all over the API. For instance, if type-safety is -not really a requirement, there are lots of possibilities to use plain SQL -directly in the DSL. In that case, data can be accessed from Record, Results, -not only through Field, but also through field names or indexes. - -Check out the updated documentation (soon) here: - - https://sourceforge.net/apps/trac/jooq/wiki/Examples - -- Support for the Derby RDBMS -- Support for casting. This allows for even greater flexibility - in cases where jOOQ cannot 100% ensure type-safety -- Support for ARRAY types. Oracle, Postgres, HSQLDB and H2 ARRAY - types are now supported natively as regular bindings in - jOOQ's Field -- Support for dialect-specific data types. CHAR, VARCHAR, CLOB - are no longer treated equally as java.lang.String. Their - type heritage is also generated -- More sequence support -- Lots and lots of bug fixes - -Features --------- -#95 - Support for the Derby RDMBS -#163 - Add support for JDBC type ARRAY (with Postgres) -#209 - Add support for DB2 sequences -#210 - Add support for H2 sequences -#211 - Add support for HSQLDB sequences -#215 - Support for SQL casting using as cast type -#246 - Support for SQL casting using dialect-specific data types -#254 - Add HSQLDB support for ARRAY types -#256 - Add Oracle support for VARRAY types -#257 - Integrate ARRAY types with stored procedures -#261 - Add a global type mapping to the generated Schema object -#267 - Add DataTypeDefinition for further abstraction of data types in code - generation -#269 - Add H2 support for ARRAY types -#290 - If log4j is not on the classpath, use java.util.logging instead, as - fallback - -API Changes ------------ -#156 - Allow for results to be accessed by index, not by field -#218 - Corrected bad method signature: Record.getValueAsLong(Field, Integer) -#219 - Extended Result and Select API's to be more similar to that of Record -#232 - Add more convenience plain SQL support to the API -#235 - Add convenience methods to Record, Result and Select for access of data - via field name -#243 - Refactor DataType implementations in order to allow for the use of - generics -#259 - Add field type to database meta data (ColumnDefinition) -#260 - Add field type to database meta data (Field) -#262 - Add default behaviour for Record.getValue(Field) -#276 - Add Javadoc as a ZIP file to the jOOQ distribution - -Bugfixes --------- -#125 - Add more plain SQL integration tests -#191 - Add more integration tests for nested unions -#205 - Implemented workaround for handling Postgres stored functions with UDT - OUT parameters -#214 - Fixed NPE when generating a stored function with an unknown parameter - type -#216 - Fixed some cases where binding of BigInteger is not done correctly -#220 - Syntax error when using select statement in a CASE clause -#221 - Corrected integration tests for combined update and select statements -#222 - Added integration test for INSERT statements having nested SELECT - statements for their fields -#225 - Correctly cast array types in Postgres -#230 - Potential misuse of Blob and Clob in H2's JDBC types -#239 - Factory.fetchAny() is not implemented for SQLite -#244 - Fixed peculiar MySQL casting support where cast types do not match any - data types -#245 - Fixed NPE when reading null dates in SQLite -#249 - Added ARRAY type integration tests -#255 - Stored procedure bind variables get mixed up when any argument is null -#263 - Correctly handle Postgres function overloading -#264 - Ambiguous funciton calls when calling overloaded functions with null - parameter -#281 - Handle compilation errors when generating stored procedures with > 254 - parameters -#283 - Fixed compilation errors in generated source code for Oracle's UDT table - type -#284 - Fixed compilation errors in generated source code for Oracle procedures - in packages, when they have no parameters -#285 - Fixed compilation errors in generated source code for Oracle tables with - the same name in different schemata -#286 - Fixed name collisions in generated objects with the java.lang.* package -#288 - Prevent the creation of UNION queries with bad syntax in MySQL -#289 - Correctly alias fields within UNION queries for some dialects, which then - only require the "AS" keyword -#291 - Cannot create an aliased field called "year" in Postgres - -Version 1.5.3 - January 13, 2011 -================================================================================ - -- Lots of stored procedure support was implemented -- Support for sequences was added -- The final decision to postpone support for DB2 UDT's was made -- Some code generation bugfixes - -Features --------- -#36 - Added stored procedure / stored function support for HSQLDB -#140 - Added support for Oracle sequences -#147 - Added support for H2 stored functions -#162 - Correctly integrate UDTs with stored procedures -#170 - Added support for Postgres stored functions -#186 - Added support for more Oracle PL/SQL simple data types -#193 - Simulate support for H2 "stored procedures" -#195 - Simulate support for Postgres "stored procedures" -#206 - Added support for Postgres sequences - -API changes ------------ -#180 - Improved DSL for constant values -#181 - Allow for referencing Field in function argument list -#189 - Renamed convenience methods in org.jooq.Record -#207 - Add fetchOne(Field) method to org.jooq.Select API - -Bugfixes --------- -#182 - Protected generated Record classes against clashes with inherited methods -#183 - Fixed NullPointerException, when generating master data tables with - NULL fields -#184 - Fixed IllegalArgumentException, when a data type is present in the - schema, but unavailable in code generation logic -#185 - Code generation should not fail when single elements cannot be generated -#188 - Improved integration tests for stored procedures / functions / packages -#196 - Increase RDMBS version compatibility by avoiding "SELECT *" in code - generation logic -#199 - Added integration tests for stored procedures in RDBMS that do not - support OUT parameters -#201 - Fixed issue in DB2 where stored procedures without parameters were not - generated. -#202 - Added integration tests for stored procedures / functions without - parameters - -Version 1.5.2 - December 27, 2010 -================================================================================ - -- Improved support for stored procedures, also in packages -- A minor API change was inevitable to implement #173. The API change only - concerns the INTERNAL API. Deprecation marks are added and deprecated items - will be removed in 1.6.0 -- Experimental SQLite database support -- Some important bug fixes - -Features --------- -#25 - Added support for Oracle packages -#114 - Added support for Oracle UDTs -#145 - Added support for the SQLite database -#150 - Generate static convenience methods for stored procedures / functions -#151 - Generate static convenience methods for stored function fields -#152 - Generate meaningful serialVersionUID in generated classes -#173 - Added support for EQUIVALENT schemata - -API changes ------------ -#159 - Added convenience method List getValues(Field) to Result -#165 - Added convenience methods for creating EXISTS clauses -#169 - Improved DSL for WHERE clauses - -Bugfixes --------- -#68 - Prevent issues originating from overloaded stored procedure names, - generating identical Java class names -#153 - Fixed issue with generated code for DB2 stored functions -#154 - Fixed issue with generated code for DB2 stored functions -#155 - Fixed issues with database NULL not being mapped correctly to Java NULL - when selecting values that have a primitive type (int, long, etc) -#158 - Potential ClassCastException when using Field -#171 - Corrected issue related to selection of default schema in DB2 -#177 - Fixed issue related to generated code for tables or UDTs without columns - - -Version 1.5.1 - December 13, 2010 -================================================================================ - -- H2 database support thanks to Espen Stromsnes -- Improved stored procedure support - -Features --------- -#96 - Added H2 database support -#101 - Added stored procedure / stored function support for Oracle -#138 - Added stored procedure support for DB2 -#146 - Added support for DB2 functions - -API changes ------------ -#143 - Added convenience methods to Record - -Bugfixes --------- -#84 - Implemented referential code generation for foreign keys that do not - match their primary keys' types -#141 - Encoding problem in generated master data classes - -Version 1.5.0 - November 22, 2010 -================================================================================ - -- A big one. Major API changes / improvements -- Added lots of convenience methods -- UDT support -- Enum support -- DB2 support thanks to Espen Stromsnes -- "Light" dependency to log4j added. jOOQ will still run without it - -Features --------- -#1 - Create support for UDTs (so far only for PostgreSQL) -#15 - Added DB2 support -#60 - Added support for nested selects in INSERT and UPDATE statements -#83 - Added log4j logging to code generation and runtime -#87 - Add support for arithmetic expressions -#105 - Added support for ENUM data types, where applicable (MySQL and PostgreSQL - so far) -#110 - Added execute and fetch convenience methods -#111 - Added missing "select distinct" support -#122 - Annotate generated classes with javax.annotation.Generated -#123 - Generate user enum fields from data values (master data) -#124 - Added PlainSQLTable -#127 - Added not() operator to Condition -#135 - Added convenience methods andNot() and orNot() in Condition - -API changes ------------ -#89 - Removed support for DataSource. jOOQ is not a transaction manager -#92 - Added SortField type to be used for sorting -#99 - Provide better access to functions (No more FunctionFactory) -#116 - Merge Manager functionality into Factory -#118 - Improve API of org.jooq.Field -#119 - Improve subquery condition API -#132 - Reduced much of the select query API -#134 - Better separation of SelectQuery and SimpleSelectQuery - -Bugfixes --------- -#109 - Error when executing select * if generated schema does not match actual - schema -#115 - Fix various "null" pseudo field issues -#126 - Error when selecting a single field from a union nested select -#129 - Fixed performance issue in Oracle code generation for very large - databases - - -Version 1.4.4 - November 22, 2010 -================================================================================ - -Unreleased version, fixes included in 1.5.0 - -Bugfixes --------- - -#133 - JoinCondition does not take comparison operator - -Version 1.4.3 - October 25, 2010 -================================================================================ - -Some more bugfixes - -Bugfixes --------- - -#71 - Generated code does not compile, when foreign key and primary key have a - data type mismatch -#73 - In Oracle generated code, multi-field foreign keys may generated bad - relations code -#82 - Conversion of literals to camelcase fails if numbers are involved - -Version 1.4.2 - October 22, 2010 -================================================================================ - -Various bugfixes and minor improvements - -Features --------- -#66 - Add support for CASE or DECODE expression - -API changes ------------ -#77 - Functions should not extend FieldImpl, but a new AbstractField -#78 - QueryPart pollutes declared method space of its implementations. Hide it - by indirection - -Bugfixes --------- -#64 - Code generation fails when foreign key references a unique key that is not - the primary key. Code generation for these cases is omitted -#67 - When loading properties files, a leading / seems to be mandatory. This is - preventing users from correctly setting up jOOQ the first time -#70 - Add support for Oracle datatype TIMESTAMP(6) -#72 - Name clashes in generated Tables -#75 - Constant does not bind its values. -#76 - Constant should not render strings all the time -#79 - Constants are not properly escaped -#80 - Position function does not bind any variables -#81 - Add cast function to Constants in HSQL - -Version 1.4.1 - October 18, 2010 -================================================================================ - -Oracle patch release - -Features --------- -#63 - Generate referential functionality for Oracle - -Version 1.4.0 - October 17, 2010 -================================================================================ - -Support for PostGreSQL was added. -Added lots of OR-mapping functionality. -There is a general API change due to various new features. - -Features --------- -#14 - Add PostGreSQL support -#40 - Resolve foreign keys. Allow for navigation between objects. -#42 - Add PlainSQLField -#45 - Add "dirty" flag to Record's values. This allows for updating only - relevant data. -#47 - Complete implementation for UPDATE, INSERT, DELETE statements. Added some - missing functionality. -#48 - Add more support for Date, Time, Timestamp fields. -#51 - Add a org.jooq.impl.Manager class that provides common utility methods for - CRUD operations - -API changes ------------ -#10 - Add second generic type . This is a prerequisite for - many OR-mapping features -#18 - Use org.jooq.Record in InsertQuery and UpdateQuery -#46 - Create UpdatableRecords as a prerequisite for JPA and true OR-mapping. - These records support store() and delete() methods -#52 - Add default constructor in generated Records. -#53 - Add refresh functionality to UpdatableRecords. See also #46 -#54 - Add a state to the factory class -#56 - Reduce API, remove unnecessary Condition subinterfaces -#57 - Reduce API, remove unnecessary QueryPart interfaces - -Bugfixes --------- -#49 - NullPointerException when generating relations on schema subset -#58 - Count function renders bad SQL in various dialects -#59 - Exception when selecting unaliased functions in queries - -Version 1.3.0 - August 24, 2010 -================================================================================ - -Support for HSQLDB was added. -There is a major API change due to #44. - -Features --------- -#29 - Generate primary keys and foreign keys in Oracle code generation -#34 - Add support for HSQLDB -#39 - Generate primary keys and foreign keys in HSQLDB code generation -#41 - Add documentation to QueryFactory and Functions - -API changes ------------ -#23 - Add support for more advanced joins -#32 - Merge SelectQuery and ResultProviderQuery interfaces -#44 - Let Query methods return "this" - -Bugfixes --------- -#35 - Add unit tests for HSQLDB support -#37 - Syntax error in combined select queries! The usage of combined queries in - MySQL may still be a bit awkward. Keep an eye out for further fixes -#43 - Join with aliased tables doesn't work - -Version 1.2.0 - August 21, 2010 -================================================================================ - -The added Oracle support is now unit tested and more stable. The Oracle NUMBER -data type is mapped more precisely to Java types. - -Features --------- -#12 - Model primary keys and foreign keys in generated code -#22 - Improve mapping of Oracle NUMBER data type -#26 - Add Plain SQL QueryParts -#27 - Add support for HAVING clause - -Bugfixes --------- -#24 - Add Unit tests for oracle database (and fixed bugs) -#31 - Pull up addOrderBy() methods from SelectQuery to ResultProviderQuery - -Version 1.1.0 - August 17, 2010 -================================================================================ - -The main new feature is the Oracle support. Wait for Version 1.1.1 for that -support to be stabilised, as there are no Oracle unit tests running against an -Oracle database yet. - -Features --------- - -#2 - Add support for inner / nested selects -#3 - Add more function support -#4 - Implement filtering functionality for code generation -#6 - Add Oracle Support -#9 - Create true POJO's (implementing org.jooq.Record) with getters and setters -#17 - Make org.jooq.impl.Parameter independent of Field - -Bugfixes --------- - -#11 - Code generation does not remove files - -Version 1.0.1 - August 14, 2010 -================================================================================ - -Features --------- - -#5 - Prevent code regeneration, if no changes were made -#7 - Implement ant task for code generation - -Version 1.0.0 - August 14, 2010 -================================================================================ -Initial Release \ No newline at end of file diff --git a/jOOQ-website/inc/RELEASENOTES.txt b/jOOQ-website/inc/RELEASENOTES.txt deleted file mode 100644 index e980f00bfb..0000000000 --- a/jOOQ-website/inc/RELEASENOTES.txt +++ /dev/null @@ -1,3781 +0,0 @@ -jOOQ Release notes -================== - -For an interactive overview, see also -http://github.com/jOOQ/jOOQ/issues - -For a formatted text version, see -http://www.jooq.org/notes.php - -For a text version, see -http://www.jooq.org/inc/RELEASENOTES.txt - -Version 3.2.0-alpha-01 - August 26, 2013 -================================================================================ - -** This is a preview for the upcoming jOOQ 3.2.0 release, which is due for late -September 2013. Beware that the new SPI might still be undergoing minor changes - -This release mainly features two new SPI elements, which allow jOOQ users to -take even more control of their jOOQ experience. A new rendering SPI called -VisitListener has been introduced, allowing for listening to arbitrary types of -SQL rendering events and for interacting with jOOQ's SQL renderer in order to -perform SQL transformation. An example of such transformation is given here: -https://github.com/jOOQ/jOOQ/blob/master/jOOQ-test/src/org/jooq/test/_/testcases/VisitListenerTests.java - -The above example adds custom "security" predicates to SELECT, UPDATE, DELETE -statements, restricting access to parts of data. It even transforms INSERT -statements adding a CHECK option to prevent "invalid" data insertion. Such SQL -transformation can also be used to implement shared-schema multi-tenancy. More -examples will follow in the manual when 3.2.0 is released. - -The other SPI is called RecordListener and it allows for hooking into a Record's -CRUD lifecycle, possibly modifying records prior to INSERTs, UPDATEs, DELETEs, -etc. An example use-case is the central generation of IDs (e.g. UUIDs) for all -records thus created. - -Features and improvements -------------------------- -#1079 - Add support for Oracle's FLASHBACK QUERY clause -#1903 - Duplicate Query construction API between DSLContext and DSL -#2010 - Add listener API to Record / UpdatableRecord -#2542 - Add an org.jooq.Keyword type and DSL.keyword(String) to construct it -#2593 - Add Meta.getPrimaryKeys() -#2594 - Add primary key and foreign key navigation support in JDBCDatabase -#2595 - Add implicit conversions from Scala functions to RecordMapper -#2603 - Add flag to code generation configuration to - indicate that and shall also match column names -#2606 - Distinguish Oracle10g, Oracle11g, Oracle12c SQLDialects within the - ORACLE family -#2618 - Document the fact that different packages are generated for different - schemas -#2619 - Add an example ExecuteListener to the manual, showing how UPDATE and - DELETE statements without WHERE clause can be aborted -#2630 - Add DSL.queryPart(String, Object...) and similar methods to create - simple plain SQL query parts -#2660 - Add some documentation about jOOQ not supporting operator precedence -#2665 - Implement SPI for RenderContext listening to allow for custom SQL - transformation -#2666 - Pull up RenderContext.sql(QueryPart) and BindContext.bind(QueryPart) - to Context.visit(QueryPart) -#2667 - Add org.jooq.Clause and let org.jooq.Context listen on start(Clause) and - end(Clause) events -#2676 - Add QueryPartInternal.clause() to allow for QueryParts to return Clause - information to org.jooq.Context -#2689 - Expose a DAO's internal RecordMapper through DAO.mapper() -#2696 - Provide default implementation for CustomQueryPart.bind() (for all - Custom QueryParts) -#2699 - Generate DEFAULT and NULL metadata information on generated DataTypes -#2701 - Document the fact that jOOQ sets changed flags to true, even if - Record.setValue() sets the value already present in the record -#2702 - Add DataType.defaulted() and DataType.nullable() -#2706 - Generate "full" constructors in records, allowing to construct a record - with all values set - -API changes (backwards-compatible) ----------------------------------- -#2581 - Deprecate fetchLater() and FutureResult -#2662 - Deprecate the internal method DSLContext.bind(QueryPart, - PreparedStatement) - -Bug fixes ---------- -#2586 - Bad SQL dialect referenced from ASE's and CUBRID's package-info.java -#2591 - Result.intoGroups() and similar methods create key Records with - changed=true -#2592 - Qualified names created using DSL.name(String...) should not render null - or empty string parts -#2596 - Scala tests don't run with Maven -#2608 - Error in code generator when the sqlite_sequence table is missing -#2613 - The batch INSERT query example in the manual is no longer correct with - jOOQ 3.x -#2624 - Wrong SQL Server 2012 detection in jOOQ-Meta -#2628 - Add missing Javadoc to DefaultDSLContext -#2634 - Minor documentation bug: The MockDataProvider uses toLowerCase() but - upper-cases SQL keywords -#2690 - Inaccurate runtime xsd versions in 3.1 manual -#2703 - SQLDialect.getNameLC() and getNameUC() are not NPE-safe -#2707 - PostgreSQL ENUM ordering is inconsistent with the database -#2708 - Wrong SQL rendered for CAST(x AS DECIMAL(y, z)). Precision and scale are - lost - -Version 3.1.0 - June 30, 2013 -================================================================================ - -With this release, MariaDB is now finally officially supported by jOOQ! MariaDB -is a MySQL fork, which currently has a very similar feature set as its parent. -As such forks tend to evolve into different directions very quickly, it makes -sense to add formal support in jOOQ. - -SQL Server 2012 is another SQL dialect that is now officially supported in jOOQ, -allowing to make use of the newly supported ROWS UNBOUNDED PRECEDING and similar -windowing clauses, as well as the long awaited OFFSET .. FETCH clause. From now -on, jOOQ SQLDialect.family() allows to define a super-set of SQL dialects by the -same vendors with only subtle differences. SQL Server users be careful to choose -the right dialect! - -POJO mapping is taken to the next level. jOOQ opened up its internal -DefaultRecordMapper providing useful Record to POJO mapping algorithms. But your -custom domain model might be more complex. Instead of creating the next -impedance mismatch, trying to foresee your own mapping algorithm needs, jOOQ -allows you to inject a RecordMapperProvider into your Configuration, allowing to -override record mapping with arbitrary behaviour. - -This minor release is also a strong step forward towards a more unified SQL -experience, where row value expression IN predicates and comparison predicates -are simulated with an equivalent EXISTS predicate. See this blog post for more -details: -http://blog.jooq.org/2013/05/03/sql-query-transformation-fun-predicates-with-row-value-expressions - -Note, that for technical reasons, jOOQ 3.0.0 could not yet be integration -tested with DB2, Ingres, and Sybase ASE. Consider using jOOQ 2.6, instead - -Features and improvements -------------------------- -#552 - Add SQLDialect.family() to group several SQLDialect versions of the same - RDBMS -#742 - Improve MySQL Stored Procedure support using MySQL 5.5's - INFORMATION_SCHEMA.PARAMETERS dictionary table -#833 - Add integration tests for both jconn3 and jTDS JDBC drivers for Sybase - and SQL Server -#963 - Map SQL Server TINYINT to UByte -#965 - Add support for Sybase SQL Anywhere unsigned number types -#1373 - Add Field DSL.coerce(Field, DataType) and similar methods, - to coerce a field to a given data type (as opposed to casting it) -#1836 - Document using jOOQ with Spring for transaction support -#1885 - Add test to count opening and closing of Statements and ResultSets by - jOOQ -#2022 - Add support for SQL Server 2012 windowing clauses in window functions -#2058 - Add support for the MariaDB database -#2095 - Document 's feature of forcing a column onto a SQL type -#2235 - Add Result DSLContext.fetchFromTXT() to allow for loading results - that were exported using Result.format() -#2236 - Add DSLContext.batch(String...) and batch(String, Object[]...) to easily - create batch statements from SQL strings -#2291 - Add DSLContext.fetchAny(Table, Condition) method and others -#2299 - Allow for setting ResultSet flags (e.g. - ResultSet.TYPE_SCROLL_INSENSITIVE through - ResultQuery.resultSetConcurrency(), resultSetType(), - resultSetHoldability() -#2310 - Add DSL.using(Connection) and DSL.using(Connection, Settings) which - auto-detect the SQLDialect from the jdbc url -#2311 - Add Configuration.recordMapperProvider() to override jOOQ's internal - default ReflectionMapper -#2339 - Support CUBRID 9.1's new features -#2344 - Add a new ControlFlowSignal that is used to explicitly jump out of a - control flow -#2355 - Add support for Postgres / HSQLDB's TRUNCATE [...] RESTART / CONTINUE - IDENTITY -#2357 - Add support for Postgres' TRUNCATE [...] CASCADE statement -#2395 - Simulate row value expression IN predicate using EXISTS -#2414 - Add Setting to influence parameter rendering (indexed, named, inlined) -#2416 - Add Result.intoXML(org.xml.sax.ContentHandler) to generate a SAX event - stream from a jOOQ result -#2423 - Add support for SQL Server 2012 native OFFSET .. FETCH clause -#2424 - Integration-test jOOQ with the SQLite xerial driver -#2426 - Add DSLContext.batch(Query, Object[]...) as a convenience for calling - batch(Query).bind(Object...).bind(Object...) -#2427 - Add more Javadoc to ResultQuery.fetchResultSet() explaining that - underlying PreparedStatements are closed with ResultSet.close() -#2428 - Simulate row value expression comparison predicates using EXISTS -#2430 - Add CustomQueryPart for use with plain SQL and other places -#2434 - Add Field.compare(Comparator, Select) and Field.compare(Comparator, - QuantifiedSelect) to allow for more dynamic SQL -#2437 - Add RenderContext.paramType() and deprecate RenderContext.inline() and - .namedParams() -#2440 - Expose the DataSource contained in the DataSourceConnectionProvider -#2441 - Add DSL.cast(Field, XXX) for increased API consistency -#2446 - Add JDBCUtils.dialect(Connection) to "guess" the jOOQ SQLDialect from a - JDBC Connection -#2466 - Add a public DefaultDSLContext implementation that can be used by users - to override the default behaviour -#2485 - Allow for treating Field as Condition -#2496 - Add support for SQL Server 2012 sequences -#2499 - Add JDBCUtils.safeClose(Connection) -#2509 - Expose CHECK constraints in jOOQ-meta -#2519 - Add Record.from(Object, Field...) from(Object, String...), - from(Object, int...) to copy only a select set of values from a POJO, - Array, Map -#2521 - Add {Row|Record}.fields(Field...), {Row|Record}.fields(String...), - {Row|Record}.fields(int...) to extract Field[] from a row or record -#2527 - Add org.jooq.tools.jdbc.DefaultResultSet to provide a default ResultSet - delegation implementation -#2531 - Add integration tests mapping binary(16) to java.util.UUID -#2532 - Let batch executions debug-log executed queries -#2535 - Convert.convert(Object, Class) should support simple casting -#2547 - Document some SQL language to jOOQ DSL API mapping rules in the manual -#2566 - Upgrade integration test jTDS version to 1.3.1 -#2571 - Add a new RecordType type to make up for the missing - recursive type definition on Record - -API changes (backwards-incompatible) ------------------------------------- -#2468 - API bug: MergeNotMatchedSetStep.set(Field, Select) returns - MergeMatchedSetMoreStep instead of MergeNotMatchedSetMoreStep - -Bug fixes ---------- -#1520 - Handle Ingres', SQLite, SQL Server's, Sybase ASE's limitations of 1024, - 999, 2100 or 2000 maximum bind values per query -#2135 - Postgres ENUM data type isn't supported correctly, if the ENUM needs - full qualification -#2323 - NullPointerException when calling Schema.getTables() on a meta schema - with SQLite -#2401 - Bad package name generated when contents are not trimmed -#2404 - Cannot combine with if both match -#2412 - jOOQ Meta does not recognise non-uppercase IN, OUT, INOUT keywords in - MySQL stored procedures -#2413 - Suppress warnings in generated code (@SuppressWarnings("all") doesn't - suppress "rawtypes" warnings with javac) -#2418 - RenderContext.data() is not passed on to QueryParts when being rendered -#2422 - Upgrade RSyntaxTextArea to 2.0.7 -#2432 - Manual refers to a package-private DefaultConfiguration constructor -#2443 - AbstractStoreQuery.execute() doesn't correctly operate on the - Configuration's ConnectionProvider in SQLite IDENTITY fetching queries -#2445 - JDBCDatabase doesn't recognise Oracle's VARCHAR2 data type (and other - vendor-specific data types) -#2447 - Tables collected through DSLContext.meta() return duplicate columns if - multi-schema environments contain identical tables -#2449 - JDBCDatabase doesn't use DataType.length(), precision(), and scale() -#2450 - Cannot set precision on TINYINT, SMALLINT, INT, BIGINT data types -#2461 - Generator Encoding Error for Database-Objects with Unicode-Names -#2464 - Bad SQL rendered from DELETE statements with aliased tables -#2469 - NullPointerException in AbstractResultQuery.fetchOneMap() -#2477 - MySQL's unsigned types cannot be used in other dialects -#2478 - IngresDatabase erroneously joins IIINDEXES to get constraint columns, - rather than using IIKEYS -#2494 - Possible null pointer passed to ConnectionProvider.release() -#2502 - Code generation fails to generate valid java for stored procedures that - accept parameters named configuration. -#2506 - SQLDialectNotSupportedException on DSL.inline(T, Class), when jOOQ's - internals are not (yet) properly initialised -#2515 - Compilation errors when generating code for artefacts that differ only - by a trailing underscore(s): A and A_ and A__ -#2523 - Statement.close() may be called upon previously closed statements -#2528 - Combining renderFormatted with inlined bind variables will change bind$ - values when they contain newlines -#2562 - Bad SQLDialect reference in Oracle and MySQL package-info.java -#2569 - Error when rendering SQL Server procedures with Settings.renderSchema - == false - -Version 3.0.0 - April 28, 2013 -================================================================================ - -This major release is a great move towards better integration of SQL as a -language in Java. Unlike any other database abstraction framework, jOOQ now -formally supports the notion of "row value expressions". The jOOQ API uses -Xtend-generated API types from Row1 .. Row22, as well as Record1 .. Record22 to -bring you even more compile-time typesafety on a record-level. - -In SQL, you can typesafely write - -
-  SELECT * FROM t WHERE (t.a, t.b) = (1, 2)
-  SELECT * FROM t WHERE (t.a, t.b) OVERLAPS (date1, date2)
-  SELECT * FROM t WHERE (t.a, t.b) IN (SELECT x, y FROM t2)
-  UPDATE t SET (a, b) = (SELECT x, y FROM t2 WHERE ...)
-  INSERT INTO t (a, b) VALUES (1, 2)
-
- -In jOOQ, you can now (also typesafely!) write - -
-  select().from(t).where(row(t.a, t.b).eq(1, 2));
-  // Type-check here: ----------------->  ^^^^
-  select().from(t).where(row(t.a, t.b).overlaps(date1, date2));
-  // Type-check here: ------------------------> ^^^^^^^^^^^^
-  select().from(t).where(row(t.a, t.b).in(select(t2.x, t2.y).from(t2)));
-  // Type-check here: -------------------------> ^^^^^^^^^^
-  update(t).set(row(t.a, t.b), select(t2.x, t2.y).where(...));
-  // Type-check here: --------------> ^^^^^^^^^^
-  insertInto(t, t.a, t.b).values(1, 2);
-  // Type-check here: ---------> ^^^^
-
- -This also applies for existing API, which doesn't involve row value expressions: - -
-  select().from(t).where(t.a.eq(select(t2.x).from(t2));
-  // Type-check here: ---------------> ^^^^
-  select().from(t).where(t.a.eq(any(select(t2.x).from(t2)));
-  // Type-check here: -------------------> ^^^^
-  select().from(t).where(t.a.in(select(t2.x).from(t2));
-  // Type-check here: ---------------> ^^^^
-
- -And for UNIONs - -
-  select(t1.a, t1.b).from(t1).union(select(t2.a, t2.b).from(t2));
-  // Type-check here: -------------------> ^^^^^^^^^^
-
- -These type-checks are preformed by your Java compiler, considering the generic -type information of your SQL statement's Record data types. These include: - -- Record1 -- Record2 -- Record3 -- ... -- Record22 - -The highest degree of typesafety was chosen to be 22, to match Scala's Tuple22, -Product22 and Function22 types. Higher degree records are still supported by -jOOQ, just without the additional typesafety. - -This Record typesafety is applied to - -- SELECT statements -- INSERT and MERGE statements: the VALUES() clause -- UPDATE statements: SET A = (SELECT...) -- UPDATE statements with row value expressions: SET (A, B) = (SELECT...) -- Quantified comparison predicates: ANY(SELECT...) and ALL(SELECT...) -- Comparison predicates: = (SELECT...) -- IN predicates: IN (SELECT...) -- BETWEEN predicates: BETWEEN (SELECT...) AND (SELECT...) -- Generated records -- The new VALUES() constructor -- Scala integration for conversion of jOOQ Record[N] to Scala's Tuple[N] - -Apart from this major improvement, there had been many minor changes throughout -the jOOQ API. Here are some important ones: - -- Factory has been split into DSL (static QueryPart construction) and - DSLContext (Query execution, "attached" QueryPart construction). This greatly - improves the overall DSL experience while allowing for more fine-grained - Executor lifecycle control. -- A ConnectionProvider has been introduced as an abstraction of the JDBC - Connection lifecycle. The standalone Connection and pooled DataSource modes - are still supported, but you can now inject your own ConnectionProvider for - more control. -- A lot of performance improvements have been implemented within the jOOQ API - removing most of the overhead caused by jOOQ when fetching data from JDBC -- A JDBC Mock API has been added to help you create simple unit tests for your - application built on top of jOOQ. -- A VALUES() constructor is now supported, and derived column lists to alias - tables and columns in one go. -- The data type API has been greatly simplified. This allowed for the - introduction of runtime precision, scale, and length information. -- CRUD has been improved through many more CRUD batch operations, explicit - INSERT and UPDATE (in addition to store()), and explicit handling of jOOQ's - internal changed flags. - -As this is a major release, some backwards-incompatibilities were inevitable. -For those users among you, migrating from jOOQ 2.x to 3.0, here are a couple of -useful hints: -http://www.jooq.org/doc/3.0/manual/reference/migrating-to-3.0/ - -Note, that for technical reasons, jOOQ 3.0.0 could not yet be integration -tested with DB2, Ingres, and Sybase ASE. Consider using jOOQ 2.6, instead - -Note, that further code generation and model API improvements were postponed to -a later release - -Note, previous release candidates contained more features, improvements and bug -fixes. See their respective sections for details. - -Features and improvements -------------------------- -#2410 - Add some more API usage examples to the section about ResultSet fetching -#2415 - Add Constants.MINOR_VERSION and Constants.FULL_VERSION for internal and - external reuse - -Bug fixes ---------- -#1998 - Wrong screenshots in the manual's section about code generation. - jooq-meta.jar is missing -#2407 - Fix bad references to pre-3.0 Factory in Javadoc - -Version 3.0.0 (RC3) - April 12, 2013 -================================================================================ - -This major release is a great move towards better integration of SQL as a -language in Java. Unlike any other database abstraction framework, jOOQ now -formally supports the notion of "row value expressions". The jOOQ API uses -Xtend-generated API types from Row1 .. Row22, as well as Record1 .. Record22 to -bring you even more compile-time typesafety on a record-level. - -See release 3.0.0 for more information. - -Features and improvements -------------------------- -#2195 - Remove the standalone tutorial, link to the manual -#2321 - Implement various Key.toString() methods -#2329 - Add Javadoc to Configuration.executeListenerProviders() -#2331 - Add hint to the manual about mvn eclipse:clean and eclipse:eclipse when - building jOOQ -#2363 - Change the readme file to use Markdown -#2366 - Add org.jooq.util.example package to jOOQ-codegen with some example - GeneratorStrategies -#2372 - Add aliases for arithmetic operators to be able to use Groovy default - operator overloading -#2389 - Make org.jooq.impl.DefaultConfiguration public -#2392 - Add Configuration.set() methods. They should allow for modifying a - Configuration -#2396 - Add DSL.function(Name, Class, Field...) and - DSL.function(Name, DataType, Field...) to allow for custom, - fully-qualified function references - -API changes (backwards-compatible) ----------------------------------- -#2378 - Allow for overriding getIdentity() and getReferences() in CustomTable - -API changes (backwards-incompatible) ------------------------------------- -#2328 - Remove UpdatableTable marker interface, pulling up methods to Table -#2342 - Change Configuration.data() to return Map -#2343 - Decouple lifecycle of Configuration and ExecuteContext -#2350 - Do not statically reference a Connection from GenerationTool -#2353 - Decouple org.jooq.Context from Configuration. Choose composition over - inheritance -#2362 - Decouple org.jooq.DSLContext from Configuration. Choose composition over - inheritance -#2379 - Replace 3.0-RC1 Executor type by a contextual DSL type constructed from - DSL.using() -#2380 - Rename org.jooq.impl.Factory to org.jooq.impl.DSL -#2382 - Let DAO reference a Configuration instead of a DSLContext -#2388 - Replace Configuration's List with - ExecuteListenerProvider[] to simplify correct and thread-safe client - implementations -#2390 - Change Configuration API to reflect jOOQ-style getter / setter naming -#2391 - Rename dialect-specific Factories [Dialect]Factory to [Dialect]DSL -#2399 - Remove support for the USE statement - -Behaviour changes (backwards-incompatible) ------------------------------------------- -#2351 - Relax ConnectionProvider contract, allowing acquire() to return new - Connections even before release() is called - -Bug fixes ---------- -#1868 - Cursor.close() doesn't terminate the ExecuteListener life cycle -#2325 - "HsqlException: incompatible data type in conversion" when binding a - UUID[] to an HSQLDB prepared statement -#2327 - Compilation error in generated tables, when a table contains a UNIQUE - key but no PRIMARY key -#2332 - Documentation example regarding DSL.concat() does not compile -#2336 - jOOQ 3.0 regression: NoClassDefFoundError caused by missing log4j - dependency -#2338 - Tutorial example unclear: There are three artefacts in Maven, not one -#2346 - org.jooq.Meta's generated Schema and other objects are Serializable, but - their enclosed Meta instance is not -#2347 - Let equals() implementations succeed early on identity -#2354 - Single page manual display errors on Firefox -#2361 - Inaccurate Configuration Javadoc explaining wrong ExecuteListener - lifecycle -#2367 - SQLite identifiers that collide with keywords should be quoted -#2381 - Do not add TableFieldImpl to table in constructor of TableFieldImpl -#2385 - fetchOne() and fetchLazy() don't terminate the ExecuteListener life - cycle when an exception occurs -#2393 - Fully qualified name not used for user-defined aggregate function - -Version 3.0.0 (RC2) - March 8, 2013 -================================================================================ - -This major release is a great move towards better integration of SQL as a -language in Java. Unlike any other database abstraction framework, jOOQ now -formally supports the notion of "row value expressions". The jOOQ API uses -Xtend-generated API types from Row1 .. Row22, as well as Record1 .. Record22 to -bring you even more compile-time typesafety on a record-level. - -See subsequent release candidates or release 3.0.0 for more information. - -Features and improvements -------------------------- -#2200 - Add Executor.fetchCount(Select) and Select.fetchCount() to replace - the projection by a COUNT(*) query -#2244 - Add section to the manual indicating that the jOOQ generator can only - handle schemas of a certain size -#2255 - Add code generation option to avoid the generation of "global object - references" -#2257 - Add List Database.getIdentities(SchemaDefinition) - for convenience to jooq-meta -#2258 - Restore private and deprecated versions of the Factory constructors, - adding some Javadoc about the changes between jOOQ 2.x and 3.0 -#2270 - Add section to the manual indicating how to build jOOQ with Maven -#2272 - Add a paragraph to the manual's preface, explaining "why not just use - SQL"? -#2281 - Add Result Executor.fetchFromStringData(List) in order - to reuse logic from fetchFromCSV -#2285 - Add more verbosity to the code generator, when configured badly -#2290 - Add Database.getUniqueKeys() and getForeignKeys to jOOQ-meta -#2297 - Add section to the manual indicating how the various generator flags - depend on each other -#2308 - Do not generate "final" Tables.java, UniqueKeys.java, etc. - -Bug fixes ---------- -#2212 - "code size too large" in generated SchemaImpl, when the number of tables - exceeds 15k -#2238 - Code generation runs extremely slow for large schemas (Inefficient - DefaultRelations.getUniqueKeys() and getForeignKeys() methods) -#2239 - Code generation runs extremely slow for large schemas (Inefficient - AbstractDatabase.filterSchema() methods) -#2252 - ArrayIndexOutOfBoundsException, when rendering plain SQL that is - terminated by a comment -#2259 - RenderMapping has no effect, if not supplied to the Executor constructor -#2262 - RenderSchema has no effect, if not supplied to the Executor constructor -#2267 - SQLDialectNotSupportedException: Type class org.postgis.PGgeometry is - not supported in dialect null, when binding PG* objects -#2271 - jOOQ Unit tests fail when not run in CET / CEST -#2273 - Tutorial bug, referencing wrong Maven dependency. jOOQ 3.0.0 is not yet - released, only RC1 -#2276 - Wrong MockDataProvider manual example -#2278 - Postgres (UUID and other) ARRAY types aren't correctly inlined as string - literals -#2279 - UUIDs aren't correctly deserialised from Postgres UDTs -#2280 - Improve supported formats for MockFileDatabase -#2283 - Class loading issues in GenerationTool when called by Gradle -#2294 - Compilation errors when code generator is configured with - true and false -#2298 - Suppress warnings in generated code (@SuppressWarnings("all") doesn't - work with javac) -#2312 - Annotate org.jooq.Support with java.lang.annotation.Documented to make - it part of the public API (in Javadoc) -#2314 - Outdated GenerationTool Javadoc - -Version 3.0.0 (RC1) - February 16, 2013 -================================================================================ - -This major release is a great move towards better integration of SQL as a -language in Java. Unlike any other database abstraction framework, jOOQ now -formally supports the notion of "row value expressions". The jOOQ API uses -Xtend-generated API types from Row1 .. Row22, as well as Record1 .. Record22 to -bring you even more compile-time typesafety on a record-level. - -See subsequent release candidates or release 3.0.0 for more information. - -Features and improvements -------------------------- -#456 - Add runtime support for PRECISION, SCALE, and LENGTH attributes -#834 - Add support for the Firebird / Postgres UPDATE .. RETURNING clause -#915 - Add Table> - Factory.values(Row[N]...), to create ad-hoc tables - from data -#1038 - Introduce new type GroupField for cube(), rollup() and groupingSets() - functions. Accept only GroupField... in groupBy() clauses -#1097 - Add org.jooq.Catalog, a type modelling an entity combining several - org.jooq.Schema -#1144 - Overload Executor.fetch[One|Lazy](ResultSet, X...) with X being - Field, DataType, Class -#1178 - Allow for treating Condition as Field -#1583 - Add support for row value expressions in UPDATE statements: UPDATE .. - SET (A, B, C) = (SELECT X, Y, Z) -#1624 - Add support for java.util.UUID as a type -#1663 - Document RenderContext and make it part of the public API -#1686 - Add UpdatableRecord.insert() and update() -#1689 - Generate E into(E) and R from(E) methods to generated records -#1690 - Add UpdatableRecord.key() returning a Record holding PK values -#1695 - Add Factory.all() and Factory.any() to create quantified expressions -#1703 - Add Executor.batchDelete(UpdatableRecord...) to mass-delete a set of - UpdatableRecords -#1801 - Add Table.as(String, String...) to allow for creating a table aliases - (correlation names) with derived column lists -#1874 - Add Record1, Record2, ... Record[N] similar to Row1, Row2, ... Row[N] to - support record type-safety -#1897 - Add a section to the manual about the migration to jOOQ 3.0 -#1899 - Make some JDBC-related utility methods publicly available in - org.jooq.tools.jdbc.JDBCUtils -#1902 - Duplicate SELECT API between Executor and Factory -#1904 - Add Executor.fetch(ResultQuery), Executor.execute(Query), and similar - methods -#1905 - Add Row[N].equal(Select) and similar methods -#1906 - Use Xtend to generate Row[N], Record[N] and other [N]-related API code - artefacts -#1914 - Document the fact that SELECT * is performed by leaving the SELECT list - empty -#1917 - Add support for CUBRID 9.0's window functions and MERGE statement -#1918 - Let generated Records implement Record[N] if applicable -#1919 - Support higher degrees of Row[N] and Record[N] types. Match Scala's max - degree of 22 -#1920 - Add more implicit defs in order to treat Record[N] as Scala's Tuple[N] -#1923 - Add Record.intoResultSet() to create a single-record JDBC ResultSet from - a Record -#1924 - Add support for CUBRID 9.0's ENUM data type -#1932 - Generate Javadocs for Table constructors -#1934 - Improve generated Record Javadoc -#1951 - Add support for the SQL Server WITH (...) table hints -#1966 - Add Row[N].equal(Record[N]) and similar convenience methods -#1967 - Document using MySQL's SQL_CALC_FOUND_ROWS as an Oracle hint -#1968 - Add org.jooq.Meta returned from Executor.meta() to return a wrapped JDBC - DatabaseMetaData object -#1972 - Move MySQLFactory.md5() to Factory and simulate it for Oracle -#1973 - Add Executor.fetchOne(ResultSet) -#1975 - Add Result.sort{Asc|Desc}(int) and (String) to order by field index / - name -#1981 - Add support for DB2 CGTT and MQT -#1983 - Improve the Javadoc on Table.as() and Field.as() to hint at - case-sensitivity and RenderNameStyle -#1984 - Add ResultQuery.fetchOneInto() -#1986 - Add Record.fromMap() as the inverse operation of Record.intoMap() -#1987 - Allow for reading data from arrays, Maps through Record.from() -#1988 - Add Record.fromArray() as the inverse operation of Record.intoArray() -#1989 - Add Record.changed(Field), changed(int), changed(String) to check - whether a single field's value has changed -#1990 - Add T Record.original(Field), original(int), original(String) to - get a Field's original value -#1991 - Reflect changed flag in Result.toString() (and thus also - Record.toString()) -#1999 - Add Record.changed(boolean) changed(Field, boolean) - changed(int, boolean) changed(String, boolean) as setters for the - changed flag -#2000 - Add Record.reset(), reset(Field), reset(int), reset(String) to - restore original values in a record -#2008 - Add elementFormDefault="qualified" to XSD specifications to allow for - XML validation of jOOQ configuration files -#2020 - Let org.jooq.ExecuteListener extend java.util.EventListener -#2021 - Add UpdatableRecord.refresh(Field...) to allow for refreshing a - subset of the Record's values -#2027 - Document semantic versioning rules as understood by jOOQ -#2028 - Add Batch.size() to indicate the number of queries that will be executed - by a batch operation -#2030 - Add reusable wrapper types for JDBC Connection, Statement, ResultSet, - etc. -#2044 - Add various TableRecord.fetchParent(...), fetchChild(...) and - fetchChildren(...) methods to follow foreign key relationships -#2049 - Add gt() / ge() / lt() / le() to Row[N] types -#2052 - Add [not]Between[Symmetric]() to Row[N] types -#2053 - Add is[Not]Null() to Row[N] types -#2066 - Add Executor.extractBindValues(QueryPart), extractParams(QueryPart) to - extract bind values in the context of an Executor (i.e. Configuration) -#2072 - Let UDTRecordImpl and ArrayRecordImpl.toString() return a valid - constructor expression -#2078 - Add Postgres to @Support annotation of SelectForUpdateWaitStep.wait() -#2079 - Support generation of bean validation annotations on records and - interfaces -#2089 - Generate an "empty" DefaultSchema for those databases that do not have - any schema (CUBRID, Firebird, SQLite) -#2094 - Add unit tests for org.jooq.tools.Convert -#2107 - Let Record implement Comparable -#2111 - Improve org.jooq.Record Javadoc, to explain the various Record subtypes -#2112 - Add Row.types() and Row.dataTypes() as a convenience -#2113 - Document Record.hashCode() and equals() through Javadoc -#2133 - Allow for mapping to "" (empty) in order to avoid the - generation of a schema -#2156 - Add Row.type(int), type(String), dataType(int), dataType(String) for - convenience -#2158 - Add Executor.fetchLazy(Table) and fetchLazy(Table, Condition) for - convenience -#2159 - Let ExecuteListener extend Serializable -#2160 - Add Executor.batchUpdate(UpdatableRecord...) to mass-update a set of - UpdatableRecords -#2161 - Add Executor.batchInsert(UpdatableRecord...) to mass-insert a set of - UpdatableRecords -#2162 - Add some more Javadoc to JooqLogger -#2170 - Add 0.0 and 1.0 to Convert.FALSE_VALUES and Convert.TRUE_VALUES -#2171 - Allow for converting booleans to numbers through org.jooq.tools.Convert: - TRUE => 1, FALSE => 0 -#2172 - Add set(Field, Select>) methods to UPDATE, - MERGE and INSERT statements -#2176 - Add hint in code generation, when an unsupported, old database version - is being used (e.g. MS SQL Server 2000) -#2177 - Add ResultQuery.intern() and Result.intern() for string interning in - result sets -#2179 - Add Javadoc to QueryPart.hashCode() and equals() -#2199 - Allow for INSERT and UPDATE of pre-existing records through - SET [ Record ] clauses -#2202 - Add Mock JDBC objects for unit testing with jOOQ -#2203 - Add Executor.map(Schema) and Executor.map(Table) as a convenience to - apply runtime schema mapping -#2204 - Add BatchBindStep.bind(Object[][]) to bind lots of bind values at a time -#2205 - Add Result Executor.newResult(Table) to generate custom - results - -API changes (backwards-compatible) ----------------------------------- -#1309 - Let Factory.val() return Param instead of Field -#2031 - Change union(Select) and similar methods to - union(Select) -#2157 - Change the bounds of various > H - fetchInto(H handler) methods to RecordHandler -#2197 - Relax bounds on Factory.groupingSets(Collection>...) to - Collection>... -#2206 - Relax bounds of R on Executor.newRecord() from TableRecord to Record - -API changes (backwards-incompatible) ------------------------------------- -#1118 - Remove support for the code generation ant task -#1254 - Move org.jooq.tools.unsigned contents to org.jooq.types (along with the - INTERVAL types) -#1374 - Relax usage of generic . Replace by where data types - are involved. -#1533 - Extract Executor API from Factory. Let Factory contain only static - QueryPart factory methods -#1549 - Externalise connection lifecycle through new ConnectionProvider -#1649 - Remove support for code generation from pre-jOOQ 2.0 .properties file -#1740 - Remove support for generated master data enums -#1875 - Add generic type to SelectXXXStep DSL type hierarchy - for increased tuple type-safety -#1887 - Remove all deprecated code -#1894 - Remove constructors from dialect-specific factories -#1907 - Remove FactoryOperations, push its API down to org.jooq.impl.Executor -#1921 - Add InsertValuesStep[N] - Executor.insertInto(Table, Field, Field, ..., Field) -#1926 - Add MergeXXXStep - Executor.mergeInto(Table, Field, Field, ..., Field) -#1977 - Remove the confusing concept of having a "main key" as opposed to a - "primary key" -#2042 - Remove generated setters, setting foreign key values from records -#2043 - Remove generated navigation methods -#2060 - Remove redundant SimpleSelectXXX API -#2117 - Remove the FieldProvider marker interface. Simplify the FieldProvider - API -#2119 - Rename Row.getDegree() to Row.size() - -Behaviour changes (backwards-incompatible) ------------------------------------------- -#1235 - SQLite BIGINT data type erroneously maps to java.math.BigInteger -#1578 - Change configuration of ExecuteListeners in Configuration. Listeners - instances should be provided, not classes -#2076 - Stop "supporting" comma-separated regular expressions in the code - generator configuration -#2088 - Do not treat CUBRID "owner" as schema in generated code - -Bug fixes ---------- -#1170 - Improve performance on jOOQ's reflection usage -#1626 - Explicitly implement hashCode() and equals() in some additional - QueryParts -#1886 - Query.bind() has no effect when Query.keepStatement(true) and - StatementType.STATIC_STATEMENT are combined -#1890 - Bad Postgres array serialisation when " or \ characters are contained in - a String[] -#1938 - Improve AbstractField.hashCode() and AbstractTable.hashCode() and - similar, as these two are called very often -#1942 - Inefficient call to String.split() in StringUtils.toCamelCase() leads to - non-negligible performance overhead in POJO transformation calls -#1937 - Inefficient implementations of AbstractDataType.equals() and hashCode() -#1954 - Bad SQL rendered when combining ORDER BY [ some-function ] with LIMIT .. - OFFSET in DB2, SQL Server -#1958 - Bad SQL rendered for OVER (ORDER BY [ some-function ]) for SQL Server - and Sybase -#1974 - Optimise various Executor.fetchOne() methods, which consume the whole - ResultSet before throwing an InvalidResultException -#1979 - Thread safety issue in org.jooq.impl.FieldList -#1982 - Change RenderNameStyle.UPPER, LOWER, AS_IS to quote literals if needed -#1992 - Bad reference to org.jooq.debug.[impl].DebugListener in the manual -#1993 - Bad code generated when the same table name exists in multiple schemas - in SQL Server -#1995 - Record.original() values aren't updated after a Record.store() operation -#1997 - Review the manual's tutorial for integrity -#2001 - Named Params are treated as null literals on right sides of comparisons -#2007 - Bad type coercion on the right hand side of a comparison predicate, when - the left hand side is Field -#2011 - Implement some micro-optimisations in DefaultRenderContext -#2025 - Correctly handle multiple foreign keys defined on the same column -#2045 - Bad hashCode calculation when Records contain arrays or byte[] -#2055 - MySQL's UPDATE [t1] JOIN [t2] syntax can cause syntax errors as column - references are not fully qualified -#2057 - Cannot properly extract bind values for LIMIT .. OFFSET clause from a - SELECT statement -#2063 - jOOQ-meta loads Firebird composite unique key columns in wrong order -#2073 - The code generator's flag doesn't affect Oracle - VARRAY and TABLE types -#2082 - Oracle PIVOT expression doesn't bind any variables of a derived table - being pivoted -#2085 - java.lang.NoSuchMethodError: org.apache.log4j.Logger.isTraceEnabled()Z - when logger dependency is missing -#2086 - SQL syntax error when aliasing outcome of a relational division -#2091 - CUBRID doesn't really have a NVARCHAR data type -#2098 - NullPointerException when org.jooq.impl.EnumConverter converts null -#2104 - SQLite code generation treats multi-column primary keys like multiple - single-column unique keys -#2108 - SQLite returns NULL for val(new Date(0)).add(-1) and some other date - time arithmetic expressions -#2128 - Misleading Javadoc in Factory / Executor.selectCount() -#2137 - Failure to assign a value to a record pojo for a column with a - composite type when using select into. -#2139 - batchStore with Postgres composite types incorrectly reuses values from - the first record. -#2140 - No table java mapping generated using maven plugin - missing inputSchema - in postgres -#2143 - UnsupportedOperationException when binding UDTRecord in batchStore() for - Oracle -#2144 - Improve AbstractField.equals() and AbstractTable.equals() and similar, - as these two are called very often -#2145 - Improve QueryPartList.removeNulls() as this is called very often -#2154 - Generated Records should access values by index, not by field, for - performance reasons -#2165 - Add H2 database definitions to the jOOQ-scala module (to prevent - compilation errors) -#2167 - Convert.convert("xx", boolean.class) returns null, instead of false -#2178 - Improve FieldList. Avoid creating excessive array lists, where simple - (immutable) Field[] are sufficient -#2180 - Optimise DAOImpl by using the new ReflectionMapper instead of calling - Record.into() all the time -#2187 - Change all Javadoc

tags to

(To fix Java 7 standard Javadoc - style layout issues) -#2210 - Executor.fetchFromCSV() shouldn't mark resulting records as "changed" -#2215 - Improve example in the "jOOQ for CRUD" section. Use only columns from - the sample database -#2223 - SQL injection is possible in org.jooq.impl.Val, if client code doesn't - correctly enforce generic typesafety, and bind variables are inlined -#2227 - Field.in(T...) doesn't convert argument values to the Field's type - -Version 2.6.0 - October 26, 2012 -================================================================================ - -This release has a new main feature: the type-safe support for row value -expressions also known as tuples - up to a degree of 8. The API is formed in a -similar way as pre-existing tuple support in languages like C# or Scala. - -jOOQ's Scala integration has also been improved through the new jOOQ-Scala -module, which provides some useful implicit defs for operator overloading. -Future versions of jOOQ-Scala may experiment with Scala 2.10's Macros - -This release also ships with a lot of new deprecation to help you prepare for -the upcoming major release. - -Minor feature improvements include: - -- Lots of new fetchGroups() and intoGroups() methods, thanks to Ivan Dugic -- JDBC execution control support, such as cancel(), maxRows(), queryTimeout() -- Allowing for re-using JDBC PreparedStatement between Query executions -- Support for the SQL standard OVERLAPS predicate -- A new RecordMapper, similar to the existing RecordHandler - -Features and improvements -------------------------- -#385 - Allow for keeping open statements in a Query -#600 - Add support for Oracle / SQL Standard linear regression functions -#1058 - Add Factory.row(T1, T2, .. TN) and Factory.row( - Field, Field ... Field) to allow for creating tuples / rows -#1077 - Add support for the SQL standard OVERLAPS predicate -#1245 - Improve formatting for DECIMAL data types in Result.format(). Nicely - align the decimal point and reserve space on both sides -#1484 - Let XJC-generated artefacts implement Cloneable -#1527 - Support for converting String to java.net.URL, java.net.URI, and - java.io.File -#1674 - Export data types with Result.formatXML() and Result.formatJSON() - exports -#1679 - Add Factory.table(String, QueryPart...) -#1708 - Add Map> ResultQuery.fetchGroups(Field, Class) -#1709 - Add Map> ResultQuery.fetchGroups(Field[]) -#1710 - Add Map> - ResultQuery.fetchGroups(Field[], Class) -#1719 - Make logic from ResultQuery.fetchArray() available in Result.intoArray() -#1728 - Add support for the MySQL COUNT(DISTINCT expr, expr...) aggregate - function syntax -#1744 - Add support for the CUBRID DECR() function -#1756 - Add RecordMapper, similar to RecordHandler, mapping records to - custom types -#1762 - Add package-info.java to add Javadoc documentation to all packages -#1766 - Simulate row comparisons where they are not supported -#1773 - Add a new jOOQ-Scala project and jooq-scala artefactId, to contain jOOQ - extensions in the Scala language -#1782 - Move JAXB bindings out of XSD, in order to support more advanced - bindings -#1783 - Generate @SuppressWarnings("all") in jOOQ-generated artefacts -#1784 - Enhance the BETWEEN predicate, introducing the AND keyword -#1810 - Add Map ResultQuery.fetchMap(Field, Class) and - Result.intoMap(Field, Class) -#1816 - Add support for materialized views in Oracle's code generator -#1828 - Reduce log level for Factory deserialisation to TRACE -#1837 - Add support for @java.beans.ConstructorProperties when fetching into - immutable POJOs -#1841 - Add SortField Field.sort(SortOrder) to allow for dynamic sorting -#1842 - Add Condition Field.compare(Comparator, Field) to allow for dynamic - comparisons -#1844 - Add Table Table.join(TableLike, JoinType) to allow for - dynamic joining -#1845 - Add Factory.schemaByName(String) for plain SQL schemata -#1848 - Add Record.changed() to indicate whether a Record contains "dirty" - values -#1849 - Add Record.original() to obtain the originally fetched values from a - Record -#1854 - Add ResultQuery.maxRows(int) to limit the number of actually fetched - records -#1855 - Add Query.cancel() to support for interrupting statements prematurely -#1856 - Add Query.queryTimeout(int) to support for JDBC's - Statement.setQueryTimeout() - -API changes (backwards-compatible) ----------------------------------- -#1800 - Deprecate AliasProvider -#1807 - Result.intoArray() declares "throws MappingException", which isn't true -#1839 - Deprecate the various Result.getValuesAs[Type] and - Record.getValueAs[Type] methods -#1840 - Deprecate org.jooq.Store -#1866 - Deprecate [Schema-Name]Factory, remove reference to it from the - tutorials -#1869 - Deprecate org.jooq.NamedQueryPart -#1870 - Deprecate org.jooq.NamedTypeProviderQueryPart -#1872 - Improve jOOQ's RenderContext pretty printing behaviour -#1881 - Deprecate ConditionProvider, OrderProvider, LockProvider types - -Bug fixes ---------- -#1593 - Factory.field("{1} + {0} + {0}", val(1), val(2)) doesn't work. Cannot - re-use / re-order placeholders -#1720 - Improve performance by using Record.getValue(int) instead of - Record.getValue(Field) internally, where more than one value is - retrieved from a record -#1751 - Result.intoResultSet() generates wrong ResultSetMetaData if runtime - schema mapping is applied -#1764 - Add missing @Support({ ... FIREBIRD ... }) annotations -#1768 - NullPointerException when DAO.fetchOne() returns no record -#1774 - QueryPart.toString() does not load default settings from classpath -#1786 - Fix SEQUENCE support for Firebird -#1791 - Log a table's input/output names, and PK name when generating code -#1792 - Factory.fieldByName() and tableByName() do not correctly escape quotes -#1797 - SQL syntax errors when plain SQL contains comments with question marks - and SQL is executed as StatementType.STATIC_STATEMENT -#1802 - Result.into(Table) doesn't work correctly, if the same field name - appears twice in Result -#1806 - Let Record.toString() wrap the record in a temporary Result and call - Result.toString() instead -#1819 - MappingException in Record.into(Class), when POJO setters have - applicable names but non-applicable argument types -#1820 - Cannot fetch into non-public POJO classes. Their members / getters / - setters should be made accessible -#1829 - Factory.execute(String) may cause errors when plain SQL returns results -#1830 - Allow for passing null or empty arrays to intoMap(Field[]) and - intoGroups(Field[]) -#1850 - Record.equals() returns true as soon as both records hold a "null" value - for a given field -#1860 - Bad Results returned from plain SQL "select *" queries, if several - selected columns share the same name -#1876 - NULL constraint violation when storing a copied record - -Version 2.5.0 - August 26, 2012 -================================================================================ - -Welcome to another great database integration in jOOQ: Firebird! This is one of -the more popular open source SQL databases out there, with a rich feature set, -including the SQL standard MERGE statement. - -Apart from this, the main new features are: - -- Optimistic locking. jOOQ's UpdatableRecord API transparently implements - optimistic locking on its store() and delete() methods. By default, the - in-memory record is compared with the one in the database at write time. But - you can also let jOOQ handle incremented VERSION or TIMESTAMP columns for you. -- Oracle feature increment. Many nice Oracle features are now supported: - user-defined aggregates, regular expressions, Oracle Text, CONNECT_BY_ROOT and - ORDER SIBLINGS BY clausess, partitioned outer joins and more -- jOOQ's convenience API has been greatly enhanced. This includes many improved - fetch methods and new short forms for equal=eq, notEqual=ne, greaterThan=gt, - etc. to better align jOOQ with JPA, XSL, QueryDSL and many other tools that - abbreviate these keywords -- Many types and methods have been deprecated to help you foresee the upcoming - changes in jOOQ 3.0 - -Please consider also the updated manual with its new, more user-friendly -structure - -Features and improvements -------------------------- -#430 - Add support for the Firebird database -#457 - Add support for Oracle user-defined AGGREGATE functions -#620 - Add support for the SQL:2008 standard LIKE_REGEX operator -#722 - Remove casting of bind values in Ingres -#727 - Simulate RPAD and LPAD in SQLite -#816 - Add support for Oracle Text functions -#1339 - Add option to generate immutable pojos -#1547 - Support "optimistic locking" in UpdatableRecord.store() and delete() -#1552 - Generate fetchBy[ColumnName] methods in generated DAO classes -#1553 - Add some Javadoc to document the difference between using a Factory with - a Connection or with a DataSource -#1556 - Add javax.validation API to full deliverable -#1565 - Add Factory.connectByRoot(Field) to support the Oracle - CONNECT_BY_ROOT pseudo column -#1570 - Add Factory.condition(String, QueryPart...) similar to - Factory.field(String, QueryPart...) -#1582 - Add support for Oracle's ORDER SIBLINGS BY clause, in combination with - CONNECT BY -#1586 - Add missing constructors taking DataSource to dialect-specific factories -#1587 - Generate missing constructors taking DataSource in schema-specific - factories -#1595 - Simulate REPEAT() in SQLite -#1596 - Add support for optimistic locking using generated information about - "timestamp" or "version" columns -#1627 - Handle NULL in CSV imports/exports -#1645 - Add support for Oracle's PARTITION BY clause in OUTER JOINs -#1657 - Reorganise the manual -#1664 - By default, activate in the code generator -#1665 - Add support for the empty GROUP BY () clause -#1675 - Add support for the SQL standard IS [NOT] DISTINCT FROM predicate -#1680 - Overload all plain SQL DSL methods to also accept QueryPart arguments -#1681 - Simulate empty GROUP BY () clause in Sybase ASE and Ingres, joining a - dummy table and grouping by a constant field -#1684 - Add Setting to indicate that fetched records shouldn't - be automatically "attached" -#1685 - Improve Javadoc of Attachable.attach(). Document how "detaching" works -#1688 - Add E Record.into(E) as a complement to E Record.into(Class) -#1692 - Replace Factory.executeInsert(), Factory.executeUpdate() and similar - methods with more succinct variants -#1696 - Add short versions of comparison predicate methods, such as eq, ne, gt, - ge, lt, le -#1698 - Add support for the SQL standard BETWEEN SYMMETRIC predicate -#1701 - Add Factory.not(Condition) as a synonym for Condition.not() -#1704 - Document the behaviour of Factory.newRecord(Table, Object) and - Record.from(Object) with respect to UpdatableRecord.store() -#1707 - Add Map> ResultQuery.fetchGroups(Field) and - Result.intoGroups(Field) -#1712 - Add > Result.sortAsc .sortDesc(Field) -#1713 - Add Result.sortAsc, .sortDesc(Field, Comparator) -#1714 - Add Result.sortAsc, .sortDesc(Comparator) -#1718 - Document usage of InvalidResultException on the ResultQuery.fetchXXX() - Javadocs -#1721 - Add Map> ResultQuery.fetchGroups(Field, Field) - and Result.intoGroups(Field, Field) -#1722 - ResultQuery.fetchArray(int) and .fetchArray(String) should return a - typed array, even if this cannot be checked by the compiler -#1723 - Add Factory.fetchLazy(ResultSet) - -API changes (backwards-compatible) ----------------------------------- -#1544 - Remove Attachable interface from QueryPart hierarchy -#1579 - Deprecate org.jooq.Type -#1580 - Deprecate org.jooq.SchemaProvider -#1638 - Deprecate org.jooq.ArrayRecord.createArray() -#1639 - Deprecate org.jooq.Adapter -#1687 - Let Cursor.fetchInto(Table) return Result instead of List -#1736 - Deprecate TableRecord.{store|refresh|delete}Using() methods as being - part of jOOQ's internal API -#1741 - Deprecate org.jooq.MasterDataType - -Bug fixes ---------- -#1572 - Use Thread.currentThread().getContextClassLoader() to load - ExecuteListener classes as a workaround for experienced class loading - problems when using OSGi -#1584 - Code generation error with Oracle UDT static functions -#1632 - Improve the performance of various DefaultRenderContext methods, by - locally caching Settings values -#1633 - Improve the performance of CursorImpl.CursorIterator by setting Record - values by index rather than by Field -#1635 - Improve the performance of Factory.fetch(ResultSet) by caching data type - normalisation regex in FieldTypeHelper -#1650 - jOOR Fix #16: Can't call Reflect.create(A, B, null) -#1660 - Factory.renderContext().castMode(CastMode.NEVER).render(query) doesn't - work. CastMode is not applied -#1667 - Bad variable binding when NULLS FIRST, NULLS LAST is simulated in SQL - Server and other databases -#1673 - Result.formatXML() and Result.intoXML() do not render namespaces - correctly -#1683 - Oracle code generation regression for 10g. No such column - ALL_PROCEDURES.OBJECT_ID -#1693 - Cannot bind UDT values from other schemata to stored procedures -#1730 - Compilation errors in SQLite generated code when flag - is set to true - -Version 2.4.0 - July 8, 2012 -================================================================================ - -This release's main new feature is jOOQ's added convenience in -Factory initialisation for those users who get their database -connectivity through JDBC DataSources. If supplied with a -DataSource, a jOOQ Factory will handle the Connection lifecycle -internally, closing the Connection when no longer needed. - -The H2 MERGE statement syntax is now supported and simulated in -other databases, for those users that prefer its more intuitive -syntax over the SQL standard. - -The code generator now also allows for generating interfaces and -DAOs per table. DAO generation was previous discussed on the user -group and seen in a competitor product called OneWebSQL. - -The jOOQ Console now supports breakpoints for even more effective -SQL development - -Features and improvements -------------------------- -#1141 - Add Result.intoResultSet() to wrap a Result in a JDBC - ResultSet -#1253 - Avoid JDBC escape syntax for date/time literals -#1280 - Generate DAO classes and interfaces for POJOs -#1404 - Document the lifecycle of an ExecuteListener in the - Javadoc -#1411 - Add support for Postgres "any" data type (with quotes!). - This seems to map well to java.lang.Object -#1418 - Support case-insensitive schema names in code generation -#1419 - Add some WARN-level logging when the source-code - generator doesn't generate any artefacts -#1423 - Add Field.likeIgnoreCase() to support Postgres' ILIKE - operator -#1424 - Add Factory(DataSource) and similar constructors -#1427 - Add Factory.batchStore(Collection>) for convenience -#1428 - Add DataType.convert(Object...) and - DataType.convert(Collection) for convenience -#1431 - Add org.jooq.Name Factory.name(String) to contruct - QueryParts that are escaped according to - Settings.getRenderNameStyle() -#1432 - Add Factory.fetch(String, QueryPart...) and - Factory.execute(String, QueryPart...) and similar methods - to support arbitrary QueryParts in plain SQL -#1434 - Add UniqueKeyDefinition.isPrimaryKey() for completeness -#1438 - Add Result Factory.fetchFromCSV(String) -#1440 - Add top-level pom.xml for jooq-parent artefact (GitHub - Issue #14) -#1446 - Converting arbitrary strings to Number / Date should - return null, instead of throwing an exception -#1449 - Generate some meaningful Javadoc into the generated - [schema-name]Factory classes -#1454 - Add line breaks to generated Javadoc where appropriate -#1463 - Add option to let generated Record / POJO objects - implement a common generated interface -#1470 - Support interface types in ResultQuery.fetchInto(Class), - Result.into(Class), and Record.into(Class) methods, - returning a proxy -#1471 - Upgrade internal jOOR dependency to jOOR 0.9.4 -#1473 - Add IdentityDefinition to jooq-meta -#1501 - Add support for conversion of String to - java.sql.{Date, Time, Timestamp}. GitHub issue #22 -#1504 - Document behaviour of fetch() and fetchOne() in case jOOQ - cannot fetch actual records -#1509 - Minor improvements in the generator source code. GitHub - pull request #23 -#1510 - Generate additional setters for foreign keys, accepting - records as arguments -#1521 - Expose Connection methods, such as commit(), rollback() - and similar transaction-related methods in Factory -#1523 - Support ROW_NUMBER() OVER() for the latest version of - Derby and H2, which support it -#1524 - Simulate ROW_NUMBER() OVER() in HSQLDB using ROWNUM() -#1528 - Let generated interfaces extend Serializable -#1532 - Clarify the lifecycle of Configuration.data in the - Javadoc -#1534 - Generate more meaningful Javadoc where "an uncommented - item" stands now -#1536 - Add documentation to the FOR UPDATE OF clause, indicating - that DB2 may have stricter requirements regarding - updatability of fields -#1541 - Add support for the H2 MERGE syntax - GitHub Issue #18 -#1542 - Simulate the H2 MERGE syntax in other dialects supporting - the SQL standard MERGE statement - GitHub Issue #18 -#1545 - Website and Documentation anchors should be links to - themselves, visually recognisable - -Features and improvements (jOOQ Console) ----------------------------------------- -#1398 - Allow for adding breakpoints in jOOQ Console - -API changes (backwards-compatible) ----------------------------------- -#1408 - Relax bounds of in Factory.truncate() to Record, - instead of TableRecord -#1429 - Change Convert.convert(List, XXX) to accept Collection - instead of List - -Bug fixes ---------- -#1020 - Improve Oracle's LIMIT .. OFFSET clause simulation. - GitHub Issue #16 -#1358 - Compilation errors in generated source code when Oracle - overloaded procedures collide with procedures that end - with numbers -#1437 - Error in Javadoc of FactoryOperations.fetchOne(). This - method may return null -#1441 - Performance issue with AbstractDataType.convert(Object). - Avoid conversions when they're obviously unneeded -#1448 - Handle String to Enum conversion (when Java Enums are - stored as Strings in the database) - GitHub issue #15 -#1459 - Generated Keys.java static class too large (static - initialiser can become bigger than 64kb) -#1460 - Table.getReferencesTo(Table) doesn't work correctly for - aliased tables -#1461 - Exception when rendering of {fn datetimeadd(...)} for - HSQLDB and Derby -#1462 - Document missing GeneratorStrategy features, such as - getJavaClassImplements() -#1465 - Custom generator strategy's printImplements() is called - with Mode == RECORD for tables -#1478 - Caching SQLDialect in AbstractDatabase heavily improves - code generation performance -#1483 - Inefficient cloning of default settings using JAXB - unmarshalling leads to non-negligible overall overhead. - Use serialisation instead (short of a useful XJC clone - plugin) -#1489 - Fix manual where it claims to throw SQLExceptions -#1490 - Compilation error when a SQL Server stored procedure has - a parameter named "value" -#1493 - Bad syntax for SELECT /*+hint*/ DISTINCT ... in Oracle -#1498 - jOOQ does not compile using JDK 7 / JDBC 4.1. GitHub - Issue #24 -#1499 - Generated members of Tables.java are not final -#1505 - Bad exception message when ON DUPLICATE KEY IGNORE cannot - be simulated -#1515 - Splitting of large NOT IN conditions is wrong. The parts - should be connected with AND, not with OR -#1522 - fetch().into(Table) doesn't initialise records correctly, - such that subsequent calls to store() will execute an - INSERT, rather than an UPDATE -#1525 - Generate missing Javadoc to getters for procedure OUT - parameters -#1529 - Factory.batchStore() logs all single statements to DEBUG - output. Find a more accurate log output -#1537 - Factory.batchStore() renders bad SQL for Postgres. The - RETURNING clause is not allowed in batch INSERTs - -Version 2.3.1 - May 11, 2012 -================================================================================ -This is an important patch release fixing some regressions in the -code generator for the Postgres dialect. With 2.3.0, it was no -longer possible to generate schemata of which the database user -was not the owner. - -Bug fixes ---------- -#1334 - Fix inaccurate simulation of TRUNC(number, decimals) for - Derby -#1403 - Documentation bug: ctx.statement() can be replaced in - executeStart(). This is not documented -#1406 - Compilation errors in generated source code when Postgres - stored procedure parameter is called "NAME" -#1407 - Compilation errors in generated source code when Postgres - data-type is "any" (with quotes!) -#1409 - Postgres code generation broken when not connecting with - the owner of a schema - -Version 2.3.0 - May 6, 2012 -================================================================================ - -This is a minor feature increment release, featuring many useful -API enhancements, some new functions, some new syntax support -elements, improved source code generation and a lot of -improvements on the jOOQ Console, thanks to Christopher Deckers. - -The updated jOOQ Console now allows for filtering incoming -statements directly on the server side, using regular expression -filters on statement text and other features. These improvements -are a part of a general strategy to introduce breakpoints and -more sophisticated debugging capability to the jOOQ Console. - -Features and improvements -------------------------- -#597 - Add support for Oracle KEEP (DENSE_RANK FIRST...) - aggregate function clause -#910 - Add ExecuteListener extension to allow for overriding - exception translator to handle vendor-specific error - codes -#1286 - Add "renderSchema" flag to Settings, to completely - disable rendering of schema names -#1293 - Generate setter methods for JAXB annotated configuration - properties -#1295 - Add support for MySQL's INSERT IGNORE clause -#1296 - Simulate the FOR UPDATE clause for SQL Server, CUBRID, - using JDBC's ResultSet.CONCUR_UPDATABLE -#1302 - Add Factory.inline() to allow for flagging inline-only - "bind values" -#1303 - Add connection-less Factory constructors for convenience, - when jOOQ is only used as a SQL query builder -#1304 - Add option to generate JSR-303 @NotNull and @Size - annotations to generated POJO's -#1307 - Let HSQLDB dialect render NVL2() as NVL2() instead of - CASE expression -#1312 - Allow for omitting , and generate all - available schemata in that case -#1315 - Let generated factories use their associated Schema as - the Settings' RenderMapping's defaultSchema -#1319 - Move jooq-spring's FactoryProxy to the core jooq project -#1322 - Add Factory.dateAdd() and timestampAdd() for convenience -#1327 - Add DataType.isLob() -#1328 - Add Field inline(char), inline(Character), - inline(CharSequence) for convenience -#1333 - Add support for the Oracle TRUNC function, for numeric - arithmetic -#1336 - Let Record.into(Class) and similar methods accept - "immutable" classes, i.e. setter-less classes that take - several constructor arguments -#1340 - Use Constructor.setAccessible(true), if no default - constructor is available on the target type of - Record.into(Class) -#1342 - Improve Javadoc on Factory.function(). Document arguments -#1349 - Add support for the CUBRID Click-Counter INCR() -#1352 - Allow for creating syntax-error and SQL-injection safe - qualifiers for org.jooq.Field and org.jooq.Table -#1361 - Add Factory.batchStore(TableRecord...), to allow for - batch UPDATE/INSERTs of many records -#1367 - Make configured ExecuteListeners default constructors - accessible -#1366 - Let org.jooq.Batch extend Serializable -#1378 - Upgrade internal jOOR dependency to jOOR 0.9.3 -#1379 - Upgrade internal jOOU dependency to jOOU 0.9.1 -#1390 - Add RenderContext.qualify() to indicate whether - QueryParts should render qualified versions of themselves - or not - -Features and improvements (jOOQ Console) ----------------------------------------- -#1242 - Upgrade jOOQ Console dependency on RSyntaxTextArea from - 1.5 to 2.0.2 -#1249 - Allow for filtering incoming statements in jOOQ Console -#1393 - Implement a communication protocol between Console server - types and Console client types to allow for more - sophisticated functionality - -API changes (backwards-compatible) ----------------------------------- -#1310 - Deprecate Factory.literal() in favor of Factory.inline(), - and Factory.field() -#1368 - Promote AbstractQuery.isExecutable() to the public API - -Bug fixes ---------- -#989 - INSERT and UPDATE statements always render non-qualified, - escaped field names. This may cause trouble when using - plain SQL fields -#1109 - Standalone TABLE or VARRAY types are not correctly - initialised before referencing tables load them -#1279 - NullPointerException when leaving empty -#1283 - The LIKE escape character needs escaping, too, in - contains(), startsWith(), endsWith() -#1306 - Add missing INTERVAL data types to HSQLDBDataType -#1308 - Oracle's DataTypeDefinition reports the length of a BLOB - / CLOB data type to be 4000 -#1313 - and match only table names, not - fully qualified names -#1323 - Add support for byte[] in Postgres UDTs -#1324 - Code generation error in Oracle 10g when generating - stored procedures -#1326 - Error when deserialising BLOBs from Oracle UDTs -#1329 - NullPointerException when passing null to - timestampDiff(Field, Field) -#1343 - Regression in insertInto(...).values(...). Cannot pass - Field to values() -#1344 - Initialise Result ArrayLists to their expected size, if - that size is known. -#1360 - jOOR issue 12: "Don't reset the accessible flag to false, - if setting it to true is required, to avoid race - conditions in concurrency contexts" -#1371 - Missing conversion when using unsafe Field types in - BATCH statements -#1376 - Oracle UDTs in REF CURSORs are not deserialised correctly - from procedure OUT parameters -#1377 - Oracle UDTs are not deserialised correctly when the same - UDT name is present in multiple schemata -#1394 - NullPointerException when omitting element in - code generation configuration - -Version 2.2.1 - April 12, 2012 -================================================================================ - -This is a minor patch release, fixing some issues related to the -code generation of the new CUBRID integration as well as other, -minor issues. Upgrade if you're using CUBRID - -Bug fixes ---------- -#1287 - Remove oracle.sql dependency also from OSGi information - in pom.xml -#1288 - SQL syntax errors from sequences when using RenderMapping - with defaultSchema -#1289 - DefaultBindContext logs as Util.class -#1297 - Compilation error in CUBRID generated artefacts - referencing OBJECT types -#1298 - Avoid source code generation errors when generating code - for unknown, dialect-specific data types - -Version 2.2.0 - April 09, 2012 -================================================================================ - -Finally, jOOQ has added support for another database, and a very -promising one, that is. http://www.cubrid.org is a surprisingly -original mixture of a relational and object-oriented database -where tables and classes are synonyms, so are records and -instances. The CUBRID database has a high level of compatibility -with MySQL and is aimed at MySQL users wanting more performance -for their web applications. For details, see the slides here: - -http://www.slideshare.net/cubrid/growing-in-the-wild-the-story-by-cubrid-database-developers - -jOOQ is proud to have become a CUBRID partner, looking forward -to further cooperation with CUBRID in the near future. - -Apart from that, jOOQ now fully supports SQL standard INTERVAL -data types. With JDBC and JPA lacking official support for this, -jOOQ aims for becoming the tool of choice for vendor-specific -date time arithmetic. True INTERVAL data type support is given in -HSQLDB, Ingres, Oracle, Postgres databases. Besides that, CUBRID -and MySQL support INTERVAL data type arguments in functions. In -other dialects, jOOQ simulates DATEADD(), TIMESTAMPADD(), -DATEDIFF(), TIMESTAMPDIFF(). - -For jOOQ's OLAP friends, there is now also support for the Oracle -LISTAGG function (LIST() in Sybase, XMLAGG() in DB2, STRING_AGG() -in Postgres, GROUP_CONCAT() in CUBRID, H2, HSQLDB, MySQL). -LISTAGG is an "ordered aggregate function", meaning that the -aggregation is done using a specific ordering. Keep an eye out -for more such function support in future versions. - -Features and improvements -------------------------- -#566 - Add support for INTERVAL data types -#585 - Add support for DATE, TIME and INTERVAL arithmetic -#1183 - Add support for DEFAULT values in Oracle stored procedure - parameters -#1243 - Let generated POJOs (and Records) extend base classes - and implement interfaces -#1252 - Avoid JDBC escape syntax for Oracle stored procedure - calls. Generate PL/SQL syntax, instead -#1255 - Let generated Tables contain a public default constructor - to be able to extend those classes - Github issue #12 -#1257 - Add CUBRID support -#1268 - Add Factory.field(String, QueryPart...) to generate - custom clauses -#1269 - Add YEAR(), MONTH(), DAY(), HOUR(), MINUTE(), SECOND() - function support as shortcuts for EXTRACT() -#1273 - Simulate GROUP_CONCAT() aggregate function using Oracle's - LISTAGG() function, where available -#1274 - Add support for the Oracle LISTAGG(...) WITHIN GROUP - (ORDER BY ..) [ OVER (..) ] aggregate / analytic function -#1275 - Simulate Sybase LIST() aggregate function using Oracle's - LISTAGG() function -#1276 - Simulate Oracle's LISTAGG() in DB2 using XMLAGG(), - SUBSTR() and CONCAT() -#1278 - DEBUG log both executed SQL and SQL with inlined bind - values - -API changes (backwards-compatible) ----------------------------------- -#1262 - Pull up OracleFactory.prior() and other CONNECT BY - related methods to Factory - -Bug fixes ---------- -#1241 - Wrong variable binding when comparing CHAR columns in - Derby and DB2 without explicit casting to VARCHAR -#1244 - Cannot override class name in GeneratorStrategy in - Mode.POJO -#1248 - Setting both false and - true leads to compilation errors -#1256 - Fixed code generation issue with H2 user defined - functions returning VARCHAR -#1263 - Pass fetchsizes <= 0 to the JDBC driver (for vendor- - specific MySQL compatibility) -#1270 - Most databases allow for multiple identical foreign keys. - This leads to compilation errors in generated source code - -Version 2.1.0 - March 18, 2012 -================================================================================ - -With this version, jOOQ attempts to follow versioning rules -imposed by semantic versioning: http://semver.org/ -There will be 1 minor release per month, and a couple of patch -releases per year, depending on popular demand - -The main improvements for this release include - -- The possibility of providing jOOQ with a custom type mapping. - You can now define your own Converter types that are used by - jOOQ to map a database's SQLDataTypes to your custom types. - This is particularly useful for Java's enums. Read more about - custom converters in the manual: - http://www.jooq.org/manual/ADVANCED/CustomTypes/ - -- There are a lot of new runtime configuration options to control - the SQL style of SQL rendered by jOOQ. You can now specify - whether table/column names should be quoted / capitalised / - lower-cased, whether SQL keywords should be capitalised or not, - etc... - -- The handling of NULL has been improved in favour of using jOOQ - as a SQL builder library (e.g. along with Spring for execution) - NULL is no longer inlined, but bound as a variable. - -- jOOQ now supports simulation of the relational division - operation using an intuitive syntax. Read more about the - relational division here: - http://en.wikipedia.org/wiki/Relational_algebra#Division - -Features and improvements -------------------------- -#161 - Add runtime configuration to pretty print rendered SQL -#349 - Add SQLite relations support -#491 - Add runtime configuration for SQL keyword style (upper - case, lower case) -#521 - Add runtime configuration for SQL reference style (upper - case, lower case, as-is, quoted) -#1150 - Add code generation option to disable generation of - records -#1181 - Add support for SQL Server data types timestamp and - rowversion -#1188 - Load default Settings from the classpath at - /jooq-settings.xml, or from -Dorg.jooq.settings -#1193 - Specify main-class in jOOQ Console's manifest.mf and - include dependency in jar file -#1194 - Add ColumnDefinition.isNullable() -#1202 - Add support for the relational division operation: - A.divideBy(B).on(A.ID.equal(B.A_ID)).returning(A.X, ...) -#1207 - Add Factory.batch(Collection) for - convenience -#1208 - Render @javax.persistence.Column(nullable = false) - property, if available -#1209 - Render @javax.persistence.Column(length, precision, - scale) properties, if available -#1215 - Add org.jooq.Converter for custom type mapping -#1216 - Overload Record, Result.getValue() and .setValue() - methods to accept a Converter -#1217 - Add EnumConverter as a base type for custom enum - converters -#1218 - Add code generation options to generate - referencing a Java type and a Converter -#1224 - Add DataTypeDefinition.getLength() to jooq-meta's type - system -#1233 - Support custom JDBC properties for jooq-codegen -#1234 - Add Database.getTable(SchemaDefinition, String, boolean) - to fetch tables case-insensitively -#1239 - Add Factory.fetchLazy(String, Object...) - -API changes (backwards-compatible) ----------------------------------- -#1191 - Deprecate ConfigurationRegistry and replace by equivalent - ExecuteListener feature -#1219 - API Bug: Cannot use LIMIT .. OFFSET along with FOR UPDATE - -Bug fixes ---------- -#625 - Remove dependency from generated Routines to the - generator's SQLDialect -#1128 - NULL is inlined in INSERT statement instead of binding it - as a variable. This can cause issues when using jOOQ with - Spring -#1137 - Exclude MySQL column-level enum types when that column is - overridden by a -#1158 - Derby cannot handle inlined NULL literals in some - contexts -#1180 - Execute BatchMultiple (multi-query batch query), when - executing BatchSimple (single-query, multi-bind-value - query) with StatementType == STATIC_STATEMENT -#1189 - TableMapping regression for SQLite database -#1190 - Cannot store SQLite records when using - StatementType.STATIC_STATEMENT -#1199 - Table.getFields() returns an internal representation of a - table's field list. Make generated tables immutable! -#1200 - Internal API leak exposed through covariance in - AbstractType.getFields() -#1211 - Enforce method name disambiguation also when using custom - strategies in jooq-codegen -#1212 - Enforce identifier disambiguation also when using custom - strategies in jooq-codegen -#1221 - Incorrect ExecuteListener invocation for INSERT .. - RETURNING. executeStart() and executeEnd() are omitted -#1223 - Cache ExecuteListener classes for performance -#1225 - Bind NULL byte[] as java.sql.Types.BINARY instead of - BLOB in Postgres, to avoid errors -#1226 - Bind NULL UDTs with their associated type name in Oracle -#1232 - SQLException when Factory.fetch() does not return a - ResultSet -#1237 - Don't generate enum classes for columns in MySQL tables - that are excluded from code generation - -Version 2.0.5 - February 26, 2012 -================================================================================ - -This release finally introduced basic runtime configuration -features for the jOOQ Factory. This configuration now includes: - -- Execute listener and SQL tracing support. jOOQ allows you to - hook your own listeners into jOOQ's query execution engine to - be notified of all sorts of events -- The existing SchemaMapping features. They are now part of the - runtime configuration -- StatementType settings. Specify whether a Factory should - execute java.sql.PreparedStatements (with bind variables) or - static java.sql.Statements with inlined variables. - -The runtime configuration is documented here: - -http://www.jooq.org/manual/JOOQ/Factory/ - -The listener and tracing support has been requested by -Christopher Deckers, a new jOOQ user who has had the courtesy to -contribute the new jOOQ Console, which is documented here: - -http://www.jooq.org/manual/ADVANCED/ExecuteListener/ - -Apart from that, another long-requested feature is now fully -implemented: The GeneratorStrategy, allowing for custom naming -strategies in generated source code. This will allow for -generating custom table / record class name prefixes / suffixes, -as well as overriding the default behaviour for rendering UPPER, -lower and CamelCase artefacts. See the manual for details: - -http://www.jooq.org/manual/META/Configuration/ - -Features and improvements -------------------------- -#93 - Add Field.equalIgnoreCase(), Field.notEqualIgnoreCase() -#408 - Add class prefixes, suffixes and other options to the - code generator -#492 - Add runtime configuration -#1107 - Let Field.contains() support the Postgres ARRAY @> ARRAY - operator -#1140 - Add ResultQuery.fetchResultSet() to return the underlying - JDBC result set -#1143 - Add Result.isNotEmpty() for convenience -#1145 - Add runtime configuration to specify whether jOOQ should - execute java.sql.PreparedStatement (with bind variables) - or a java.sql.Statement (with inlined parameters) -#1146 - Add Query.getSQL(boolean) to indicate that bind values - should be inlined (as a convenience for - Factory.renderInlined(QueryPart)) -#1148 - Add Cursor.resultSet() to expose the underlying ResultSet -#1149 - Allow for optional - "http://www.jooq.org/xsd/jooq-codegen-2.0.4.xsd" - namespace in jooq-codegen configuration -#1152 - Add & org.jooq.EnumType> - E MySQLFactory.enumType(Class, int) for enum reverse - lookups of MySQL-specific enums -#1159 - Support matching numbers with LIKE, e.g. ID LIKE '%33%' -#1160 - Implement Field.contains(), .startsWith(), .endsWith() - for numeric values, too -#1161 - Use reflection to remove compile-time dependency on - ojdbc for creating ARRAYs -#1162 - Integrate jOOR into jOOQ for simpler reflection -#1164 - Distinguish between Definition.getInputName(), - .getOutputName() -#1165 - Add constraint name to generated javadoc -#1167 - Trivial issue with org.jooq.Factory.exists Javadoc - - GitHub issue #10 -#1169 - Add Configuration.setData(), getData() to convey custom - data in a configuration's lifecycle -#1172 - Add runtime configuration to deactivate JooqLogger -#1177 - Add jOOQ-Console module to jOOQ -#1184 - Add DataType.isArray() - -API changes (backwards-compatible) ----------------------------------- -#1142 - Rename Result.exportXML() to Result.intoXML() to stay - more consistent -#1151 - Deprecate SchemaMapping in favour of new runtime - configuration - -Bug fixes ---------- -#978 - Schema.getTables() and similar methods return empty lists - when Schema is mapped with SchemaMapping -#1153 - Bad inlining of booleans in Sybase ASE / DB2 / Oracle - SQL Server / SQLite -#1154 - Bad inlining of byte[] in most dialects -#1155 - byte[] are erroneously converted to String when using - Record.intoArray() -#1156 - Bad inlining of DATE / TIME / TIMESTAMP data types in - Ingres (and other dialects, when the setting differs from - the default) -#1166 - Some generated Javadoc uses naming strategy or plain - output name, instead of qualified output name -#1168 - Oracle packages are generated as static, instead of - static final -#1175 - Factory.use() seems to render SQL with the Schema name - still present -#1179 - Oracle-generated ArrayRecords need a reference to - org.jooq.Schema to read TABLE of OBJECT from stored - procedures - -Test cases ----------- -#1147 - Add integration tests for executing SQL generated using - Factory.renderInlined() - -Version 2.0.4 - February 12, 2012 -================================================================================ - -This release introduced many improvements to source code -generation. These improvements include: - -- Maven and standalone code generation now use the same XML - configuration, which is read by jOOQ-codegen using JAXB. This - allows for more complex configuration elements in the future -- jOOQ-codegen can now handle multi-schema databases and generate - code for tables referencing tables from other schemata. This - is integration tested against the SQL Server AdventureWorks - database -- jOOQ now allows to generate simple POJOs in addition to Records - and to annotate both POJOs and Records with JPA annotations - such as @Entity, @Table, @Id, @Column, @UniqueConstraint, etc. - -You can migrate your existing .properties configuration by running -> org.jooq.util.GenerationTool /your.properties migrate - -Besides that, there is a lot of ongoing work to improve the -integration of Oracle's TABLE and VARRAY types. - -Features and improvements -------------------------- -#8 - Add JPA annotations to generated POJOs / Records -#282 - Add support for multi-schema databases -#287 - Add support for Oracle TABLE types -#395 - Use XML configuration file instead of properties file -#1089 - Add Field.contains(), .startsWith(), .endsWith() as a - convenience for Field.like() (including escaping) -#1092 - Move master data table configuration from - generator.generate to generator.database namespace -#1093 - Add support for generator.strategy in Maven source code - generation -#1094 - Add support for generator.database.date-as-timestamp in - Maven source code generation -#1095 - Move generator.generate.unsigned-types to - generator.database namespace -#1096 - Add support for generator.generate.unsigned-types in - Maven source code generation -#1103 - Add support for SQL Server data type uniqueidentifier -#1106 - Add Factory.escape(Field, char) for use with LIKE -#1108 - Add support for multi-schema databases using Maven code - generation -#1115 - Add support for Oracle VARRAY/TABLE of OBJECT types -#1127 - Add support for POJO classes generation -#1129 - Allow for using Param in LIMIT .. OFFSET clauses -#1132 - Add RenderContext.castMode() to allow for avoiding casts - where this is not really needed -#1136 - Add generation option to enable/disable generating - navigation methods - -Bug fixes ---------- -#1099 - Derby generated artefacts are not sorted alphabetically -#1101 - Internal API leak exposed through covariance in - AbstractTable.joinXXX() methods -#1110 - VARRAY element type information is lost when unnesting - VARRAY's in Oracle -#1111 - VARRAY element type information is lost when unnesting - VARRAY's returned from functions in Oracle -#1114 - Syntax error when unnesting TABLE of OBJECT in Oracle. - The unnested table contains several columns but jOOQ only - unnests "COLUMN_VALUE" -#1117 - NullPointerException when passing an ArrayRecord - containing a null array to a stored function in Oracle -#1125 - Postgres needs casting for date time data types in - queries like SELECT ? FROM DUAL -#1131 - DB2: [Noauthorized routine named "LIKE" of type - "FUNCTION" having compatible arguments was found] when - using Field.like(concat(x, y)) -#1133 - Compilation errors in generated source code if the same - constraint name exists in several schemata -#1134 - NullPointerException in code generation when a foreign - key constraint references a table from another schema - that is not being generated -#1135 - Generated Javadoc references inputSchema instead of - outputSchema - -Test cases ----------- -#1009 - Add more integration tests for proper handling of - java.sql.Date, Time, Timestamp -#1090 - Run jOOQ tests against AdventureWorks SQL Server sample - database -#1105 - Add integration tests for multi-schema source code - generation and querying -#1122 - The 10k lines of integration test code are too heavy for - the compiler. Create test modules with fewer lines of - code, each. - -Version 2.0.3 - January 29, 2012 -================================================================================ - -This release focuses on increased compatibility between various -SQL dialect integrations as far as ARRAY and JOIN support is -concerned: - -- ARRAY types are only available in H2, HSQLDB, Oracle, Postgres. - Nevertheless, they can be somewhat simulated in other dialects - using nested selects with UNION ALL. Increased compatibility - leads to a nicer API, where ARRAYs are used along with ALL/ANY - quantifiers, for instance. - -- JOIN syntaxes can be quite powerful in SQL. Apart from - simulating NATURAL JOIN, JOIN USING clauses, as well as a - synthetic "KEY JOIN" syntax, jOOQ now also supports nesting - JOIN expressions to create more complex table sources. See a - recent blog post on the subject here: - -http://blog.jooq.org/2012/01/15/lets-revise-the-sql-from-clause/ - -Features and improvements -------------------------- -#578 - Add KEY JOIN syntax to simulate joining using generated - foreign keys -#577 - Simulate NATURAL JOIN syntax, where this is unavailable -#582 - Simulate JOIN USING syntax, where this is unavailable -#671 - Allow for nesting JOIN clauses -#676 - Add Table.join() methods to create more flexible table - sources -#993 - Add Field.equalAny(T[]), .equalAny(Field) methods -#1048 - Simulate (array) syntax for dialects - that do not support arrays -#1051 - Add Factory.execute(String, Object...) as a convenience - method for Factory.query(...).execute() -#1055 - Simulate Factory.table(Object[]) and table(List) using - UNION ALL in dialects that do not support arrays -#1060 - Improve debug logging of H2 arrays. The syntax is not - ARRAY[1, 2], but (1, 2) -#1065 - Add OracleFactory.sysContext(String, String) to support - Oracle's SYS_CONTEXT function -#1069 - Add support for INSERT INTO table(field1, field2, ...) - SELECT syntax - as opposed to the existing INSERT INTO - table SELECT -#1072 - Add support for LIKE .. ESCAPE .. syntax -#1074 - Add Field.notBetween(T, T) for convenience -#1080 - Add support for JDBC's Statement.setFetchSize() in - ResultQuery.fetchLazy() -#1082 - Add some more DEBUG logging in AbstractResultQuery - -API changes (backwards-compatible) ----------------------------------- -#1059 - Change SelectFromStep.from(Collection>) to - from(Collection>) - -API changes (backwards-incompatible) ------------------------------------- -#1087 - Change the NTILE function to return Field - instead of Field - -Bug fixes ---------- -#1071 - Make Sequence Serializable -#1081 - Derby error in NULL handling when simulating unnested - arrays that contain NULL values -#1084 - Bind index mismatch in val(null).equal(null) and in - val(null).notEqual(null) -#1091 - Add missing @Support annotations on Table.crossJoin() - methods - -Test cases ----------- -#1026 - Add integration tests for NTILE window function and - document compatibility -#1073 - Add integration tests for NOT IN queries holding NULL - arguments - -Version 2.0.2 - January 8, 2012 -================================================================================ - -This is a maintenance release for jOOQ 2.0. The main improvements -include - -- The whole jOOQ API is now annotated with a new org.jooq.Support - annotation to help you assess whether a certain SQL clause is - available in your database or not. This is particularly useful - when your application should support several databases at once - (e.g. MySQL, Postgres, Oracle) -- The Oracle PIVOT clause is now formally supported for advanced - statistical queries in Oracle. This clause will be simulated in - other dialects in the future. -- The DATE data type can be mapped to TIMESTAMP. This important - when you query a legacy Oracle database, where DATE columns - can also contain time information -- Several convenience methods have been added for more fluent - syntax, when using plain SQL result queries, subqueries as - tables, or when unnesting arrays in ANY() and ALL() quantifiers - -Further type mapping support is still experimental. An official -cooperation with MinuteProject for source code generation is -being analysed. With MinuteProject, many source code generation -issues could be addressed centrally, as MinuteProject specialises -in source code generation: - -http://minuteproject.wikispaces.com/ - -Features and improvements -------------------------- -#595 - Add support for Oracle's PIVOT clause -#869 - Add support for using ANY, ALL with arrays, not just with - subselects -#1007 - Formally document the API methods to indicate whether - something is supported by any given SQL dialect -#1011 - Add code generation configuration parameter to avoid - generating @Generated annotation -#1019 - Render LIMIT x OFFSET y also for MySQL, instead of - LIMIT y, x -#1022 - Add missing Sybase ASE implementation for Factory.use() -#1024 - Add Factory.resultQuery(String, Object...) to allow for - arbitrary execution modes of plain SQL queries (lazy, - later, into, array, etc) -#1025 - Add missing SQLite implementation for Factory.deg() and - Factory.rad() -#1033 - Generate table comments into generated Tables.java as - Javadoc -#1040 - Add Object[][] Result.intoArray() and - Object[] Record.intoArray() for convenience. Let - E Record.into(Class) also support array types. -#1041 - Add Table Factory.table(Select) convenience - method for more fluency -#1042 - Add support for DISTINCT keyword in SUM, AVG, MIN, MAX - aggregate functions -#1046 - Generate Ingres table and column comments in generated - source code (only Ingres 10) - -API changes (backwards-compatible) ----------------------------------- -#1050 - Deprecate usage of SOME quantifier in predicates, such as - equalSome() - -API changes (backwards-incompatible) ------------------------------------- -#1036 - Fixed API typo in - WindowsRowsStep.rowsBetweenUnboundedFollwing() -#1037 - The fluent API allows for JOIN clauses without FROM - clause - -Bug fixes ---------- -#1010 - The MERGE INTO .. WHEN NOT MATCHED THEN INSERT .. syntax - may cause type-safety issues in some databases. VALUES - should be converted before binding -#1014 - FindBugs: Latent risk of infinite recursion due to typo - in QueryPartList.retainAll(); -#1015 - FindBugs: 7 occurrences of "Bad attempt to compute - absolute value of signed 32-bit hashcode". In extreme - cases, this could lead to SQL syntax errors -#1016 - The Oracle CONNECT BY cond1 AND cond2 syntax erroneously - creates a WHERE cond2 CONNECT BY cond1 statement -#1028 - Syntax errors when using untyped param() in HSQLDB (and - other strongly typed dialects) -#1029 - Postgres can't bind NULL values in cases, where bind type - is Object.class and bind value was created with - Factory.param() -#1030 - UnsupportedOperationException when calling - Query.bind(int, Object) on a query containing plain SQL - fields -#1031 - Incorrect debug logging when plain SQL QueryParts like - field("?") bind null values -#1032 - Incorrect debug logging when plain SQL QueryParts contain - String literals, such as 'Hello? Anyobody out there?' -#1047 - Field.notEqualAny() erroneously renders <> ALL() - -Test cases ----------- -#1021 - Add explicit integration tests for - LEFT|RIGHT|FULL OUTER JOIN - -Version 2.0.1 - December 23, 2011 -================================================================================ - -This is a maintenance release for jOOQ 2.0. The main improvements -include - -- Better integration for using jOOQ with Spring Data. This - includes support for named parameters, as well as allowing to - change bind values on previously constructed Query objects -- The MERGE statement has been enhanced for better integration - with Oracle. -- jOOQ is now ready to use with Scala / Groovy - -For more information about using jOOQ with Scala, see this blog -post: -http://blog.jooq.org/2011/12/11/the-ultimate-sql-dsl-jooq-in-scala/ - -There is now also experimental support for a custom type mapping. -This mapping allows to rewrite data types at code generation time -as well as to specify custom enum data types (e.g. boolean Y/N). -Not all integration tests run smoothly for custom data types, -hence, this feature is not yet fully supported. - -Features and improvements -------------------------- -#691 - Add support for Oracle CURSOR REF IN / INOUT parameters -#677 - Add type-mapping configuration, enforcing types for - columns -#947 - Add custom type mapping support (experimental) -#968 - Allow for custom enum types, configured in the code - generator (experimental) -#974 - Add Schema.getTable(String), getSequence(String), - getUDT(String) for better runtime Schema meta-navigation -#975 - Add Sequence.getName(), getSchema(), getDataType() -#980 - Add support for named parameters, to better interact with - Spring -#991 - Add Query.bind(String, Object) and bind(int, Object) to - easily modify existing bind values -#992 - Document thrown DataTypeException in Convert methods -#998 - Enhance MERGE statement for Oracle extensions: - WHEN MATCHED THEN UPDATE .. WHERE .. DELETE WHERE .. - WHEN NOT MATCHED THEN INSERT .. WHERE .. -#1000 - Add support for MySQL's INSERT INTO .. SET .. syntax in - MERGE statement's WHEN NOT MATCHED THEN INSERT clause - -API changes (backwards-compatible) ----------------------------------- -#981 - Cannot insertInto(table("my_table")), as plain SQL tables - return Table, not Table. Relax - bound on R -#988 - Change Factory.field(String) to return Field - instead of Field -#999 - Make MERGE's WHEN MATCHED .. and WHEN NOT MATCHED .. - clauses optional -#1001 - Identity.getField() should return TableField - instead of Field -#1006 - Add Factory.value(...) as a synonym for Factory.val(...) - for increased Scala / Groovy compatibility - -Bug fixes ---------- -#973 - EnumType renders name() instead of getLiteral() in - formatXXX() methods -#977 - EnumType renders name() instead of getLiteral() in - Convert.convert() method -#979 - Record.from() sets all changed flags to true. That's not - necessarily correct in the event of storing the record - back to the DB -#985 - AbstractRecord.equals() does not correctly compare - arrays. Compare them using Arrays.asList() -#986 - Postgres / DB2 / Sybase ASE foreign-key namespace is - unique-per-table. jOOQ forces all foreign keys from all - tables into the same namespace -#990 - Problems when encoding arbitrary byte[] as String(byte[]) - in inlined SQL. This can cause issues when DEBUG-level - logging is activated -#995 - Routines don't respect SchemaMapping - Github issue #8 -#1002 - TableRecord.storeUsing() doesn't update IDENTITY column - values, if the column is not part of the main unique key -#1003 - Sybase / SQL Server / MySQL / Ingres / H2 / Derby's - INSERT .. RETURNING simulation returns null if a table - has an IDENTITY column, but no primary/unique key -#1005 - The INSERT INTO .. VALUES .. syntax may cause type-safety - issues in some databases. VALUES should be converted - before binding - -Test cases ----------- -#984 - Detach IDENTITY column tests from UNIQUE KEY tests, - create a dedicated test suite instead - -Version 2.0.0 - November 25, 2011 -================================================================================ -This release is a fresh start in many areas of jOOQ, adressing -issues that have been requested by users for a long time. These -release notes docment the most important changes, a detailed -upgrade guide, as well as the detailed list of improvements. - -Most important changes ----------------------- -- The API became more static. This applies to many Factory - methods, such as val(), literal(), as well as to many Field - methods that have been moved over to the Factory. For example, - when before, you wrote this using "postfix function notation": - -
NAME.replace(" ", "_").trim()
- - you will now write (just as in SQL): - -
trim(replace(NAME, " ", "_"))
- - Using static imports of Factory.*, jOOQ makes SQL look even - more like SQL. The current "postfix notation" is maintained for - backwards compatibility. -- By default, jooq-codegen will now generate a "dynamic" meta - model as opposed to the existing static one. Generated tables - covariantly override the as(String) aliasing method, leading - to a much more convenient aliasing style. When before, you - wrote: - -
-Table parent = T.as("parent");
-Table child  = T.as("child");
-Condition join =
-  parent.getField("ID").equal(child.getField("PARENT_ID"))
-
- - You can now write: - -
-T parent = T.as("parent");
-T child  = T.as("child");
-Condition join = parent.ID.equal(child.PARENT_ID)
-
- - Of course, the existing notation still works - -- Exceptions are no longer checked. When previously, the DB's - SQLException was propagated to client code, there is now an - unchecked DataAccessException hierarchy, similar to that of - Spring. This will eventually give way to a standardised error - handling abstraction, in future developments. -- Window functions are now constructed from their underlying - aggregate functions just like in SQL. For example: - -
-sum(AMOUNT)
-sum(AMOUNT).over().partitionBy(ACCOUNT)
-
- - This makes for a more concise API, especially when considering - future extensions, such as Oracle's KEEP (DENSE_RANK FIRST...) - syntax. -- More type safety has been introduced regarding various places - where generic and types are involved. - This is especially true for INSERT / UPDATE / DELETE statements -- Sequences now also have a type -- Unsigned number types are now supported in those databases that - use them. Unsigned numbers are implemented in jOOU, a spin-off - open source project. For convenience, this library is - "internalised" into jOOQ, to avoid adding a dependency - -http://code.google.com/p/joou/ - -Upgrade instructions: ---------------------- -Various of the above changes are incompatible with jOOQ 1.x. In -order to upgrade, please be aware of the following pitfalls: - -- The schema needs to be re-generated. -- Much of the post-fix function notation is replaced by static - methods in the Factory. Today's org.jooq.Field API is - maintained in jOOQ 2.0, for backwards compatibility. It will - be removed, eventually, though. Expect some incompatible - changes, where window functions are involved -- Some Factory instance methods (such as val(), literal()) are - now static. They are compatible, but may cause compiler - warnings. -- The meta model is now an instance model by default. If you - prefer the static meta model, you can configure this in your - jooq-codegen configuration. -- The additional typesafety involving and types may cause - compiler warnings and errors. -- SQLException is no longer part of the API. This can cause - compiler issues, in particular when extending jOOQ -- Some utility classes have moved to org.jooq.tools - -Should these incompatibilities be too significant for your -project, you can still stay on the 1.x branch, which will be -maintained for a while. Be aware that upgrading might be more -difficult, later, though. - -Features and improvements -------------------------- -#55 - Implement improved exception handling -#117 - Improve DSL support for field and table aliasing (decrease - verbosity) -#519 - Add support for MySQL UNSIGNED numeric types -#626 - Create static function access -#661 - Add support for bitwise operators -#718 - Sequences should be mapped to appropriate type (e.g. - SMALLINT, INT, BIGINT, etc) -#734 - Add support for Oracle / SQL Server CUBE() and ROLLUP() - grouping functions -#751 - Add support for Oracle / SQL Server GROUPING SETS() - function -#799 - Add support for Oracle PL/SQL's object-oriented MEMBER - PROCEDURES and MEMBER FUNCTIONS -#804 - Add to Insert, Update, Delete -#835 - Review API typesafety for InsertSetMoreStep - set(Field, T) and similar methods -#890 - Add Factory.selectCount() convenience method -#891 - Let min() max(), etc functions return a new type - AggregateFunction. This type can then be used as an entry- - point for window functions -#892 - Add support for Oracle / SQL Server GROUPING() and - GROUPING_ID() functions to be used along with CUBE() and - ROLLUP() -#893 - Simulate ROLLUP() function for MySQL, using the WITH - ROLLUP grouping modifier -#894 - Move functions from Field to org.jooq.impl.Factory - and make them static -#895 - Add power(..., Field) -#897 - Add (experimental) Spring integration project -#898 - Replace usage of checked SQLException by an unchecked - DataAccessException, similar to that of Spring -#899 - Build jOOQ .jar files as bundles to be deployed into OSGI - environments -#900 - Purge deprecated API - Prior to 2.0 -#901 - Introduce InvalidResultException as a subtype of - DataAccessException for integrity checks in methods like - ResultQuery#fetchOne(), ResultQuery#fetchMap(), etc. -#902 - Make AggregateFunction the base type for constructing - window functions -#904 - Move SQLDialectNotSupportedException into - org.jooq.exception package -#905 - Introduce MappingException as a subtype of - DataAccessException for integrity checks in methods like - ResultQuery#fetchInto(), etc. -#907 - Add missing Field.like(Field), notLike(Field) - methods to overload the existing Field.like(T), notLike(T) -#908 - Change rpad / lpad functions to accept String instead of - char -#912 - Add R newRecord(Table, Object) as - the inverse of various into(Class) methods -#916 - Add > {Record.into(Table) | - Result.into(Table) | ResultQuery.fetchInto(Table) | - Cursor.fetchInto(Table)} -#917 - Add various Cursor.fetchOneInto() convenience methods -#918 - Add CustomTable, CustomRecord as base classes for more - convenience when used with various into(Table) methods -#919 - Allow for accessing non-public constructors of Record - subtypes -#923 - Move some utilities to org.jooq.tools -#924 - Generate a reference to every table in a new Tables.java - class for improved static access -#928 - Add DataTypeException extending DataAccessException in - case something went wrong when converting data types -#930 - Support converting date time types to java.util.Calendar. - This applies to various into(Class) methods, as well as - Result.getValue(xx, Class) -#931 - Allow for conversion between Long and date/time types, and - vice versa -#932 - Let the bound of R in TableRecord extend TableRecord, - in UpdatableRecord to extend UpdatableRecord -#933 - Add support for type Character in Record.into(Class) - methods and similar -#936 - Accept primitive types, such as int.class for type - conversion -#938 - CODEGEN: Add static/instance table field configuration -#939 - Include license.txt and readme.txt in .jar files' META-INF - directory -#953 - Make DefaultGeneratorStrategy methods non-final to allow - for overriding -#954 - Add examples for source code generation of multiple - schemata with Maven -#955 - Generate a reference to every type in a new UDTs.java - class -#957 - Add R Factory.newRecord(UDT) for constructing - attached UDTRecords -#958 - CODEGEN: Add generation-time schema mapping, allowing for - re-writing schemata in jooq-codegen -#960 - CODEGEN: Add code generation configuration parameter to - avoid using the new UByte, UShort, UInteger, ULong wrappers - for UNSIGNED number types -#961 - Use Oracle's SYS.ALL_SEQUENCES.MAX_VALUE to determine the - type of a sequence. -#969 - Add List ResultQuery.fetch(Field, - Class) convenience method - -Bug fixes ---------- -#686 - Reduce the internal API leak by preventing access to - TableFieldImpl, UDTFieldImpl, ParameterImpl -#903 - lag(Field, int, T) erroneously delegates to lead() -#906 - Add more NullPointerException safety to API -#913 - NoClassDefFoundError in JooqUtil.isJPAAvailable() -#920 - Generic type is lost in Cursor.fetchInto(RecordHandler) -#925 - SelectConditionStep should extend SelectConnectByStep, not - SelectGroupByStep -#926 - AbstractRecord.into() fails to convert java.sql.Date into - java.util.Date -#934 - Don't consider static members in reflection utilities when - used with Record.into(Class) and similar methods -#935 - Don't consider final member fields in reflection utilities - when used with Record.into(Class) and similar methods -#937 - In the event of name clash (same name for table and field) - generated code has errors -#945 - Calling UpdatableRecord.setValue() twice with the same - argument causes the changed flag to be reset to false -#948 - Always set the changed flag to true in Record.setValue() -#959 - Compilation errors in generated source code if MySQL enum - values match Java reserved words, such as 'true', 'false', - 'new', etc... -#962 - Postgres ordering of generated enum literals is unstable -#967 - Better document type conversion - -Version 1.7.0 - November 25, 2011 -================================================================================ -This is a maintenance release for the 1.x branch. Some important -bug fixes are merged from version 2.0. These include: - -Bug fixes ---------- -#925 - SelectConditionStep should extend SelectConnectByStep, not - SelectGroupByStep -#926 - AbstractRecord.into() fails to convert java.sql.Date into - java.util.Date -#937 - In the event of name clash (same name for table and field) - generated code has errors -#945 - Calling UpdatableRecord.setValue() twice with the same - argument causes the changed flag to be reset to false -#948 - Always set the changed flag to true in Record.setValue() -#951 - Empty Password for jooq-codegen-maven causes NPE - -Version 1.6.9 - November 7, 2011 -================================================================================ -This is a maintenance release for the 1.x branch. Developments -on this branch will stop after version 1.6.9. Only important bug -fixes are merged to this branch. Developments for release 2.0 -have started. - -The most important functionality in release 1.6.9 is the newly -added support for JDBC batch operations. You can now batch -execute several queries. - -See the official blog for more information: -http://blog.jooq.org/2011/10/25/jdbc-batch-operations-with-jooq/ - -Features and improvements -------------------------- -#621 - Add support for JDBC batch operations -#794 - Add support for ORDER BY [int value] in order to reference - a column index for sorting -#882 - Optimise Field.isTrue() and isFalse(). Take Field's data - type into consideration. -#885 - Add support for INSERT INTO .. VALUES (..) syntax, - omitting explicit field declarations -#887 - Add List Cursor.fetchInto(Class) - -Bug fixes ---------- -#748 - H2 regression in 1.3.158 regarding stored functions, which - return a ResultSet (this was fixed in H2) -#859 - Derby casting of numeric types to BOOLEAN doesn't work -#886 - Regression in date extract function when used in a - subselect -#888 - Derby casting of VARCHAR to FLOAT (and similar) doesn't - work - -Version 1.6.8 - October 22, 2011 -================================================================================ -The main improvement of this release is the re-design of the -stored procedure / function API. With 12 supported RDBMS, which -all have their own idea about what is a stored procedure and what -is a stored function, it has proven to be a better design, to -unite them in one single type: org.jooq.Routine. A routine can -have a return value as well as OUT parameters. It can be embedded -in SQL and used as a field or a table. - -This means, you will need to re-generate your database schema, -when upgrading to jOOQ 1.6.8. After re-generation, you'll need to -fix your client code. These are the package changes: - -- [generated.package].procedures > [generated.package].routines -- [generated.package].functions > [generated.package].routines -- [generated.package].Procedures > [generated.package].Routines -- [generated.package].Functions > [generated.package].Routines - -Oracle generated packages are not re-located. With these -improvements, using stored procedures and functions becomes even -more reliable, especially when cursor types are involved. Read -more about the rationale behind this change: - -http://blog.jooq.org/2011/10/17/what-are-procedures-and-functions-after-all/ - -Apart from that, important improvements have been made in the -area of plain SQL tables. Also, consider a demo integration of -jOOQ with Google Cloud SQL: - -http://blog.jooq.org/2011/10/22/jooq-and-google-cloud-sql-example/ - -Features and improvements -------------------------- -#271 - Don't pre-fetch table meta data when selecting from plain - SQL tables -#489 - Add support for SELECT * (i.e. render SELECT * where - applicable) -#596 - Add support for VARIANCE() and STDDEV() OVER() window - functions -#608 - Add jOOQ version number in generated source code -#670 - Add more Javadoc to Field.xxx() functions -#692 - Add support for ResultSet type returned from HSQLDB - stored functions -#850 - Use http://www.jooq.org as URL for the @Generated - annotation -#854 - Add convenience methods Fields.isTrue(), isFalse() for - conversion of "Y", "YES", "1", "true", "on", etc into a - boolean condition -#870 - Add support for MEDIAN aggregate function -#872 - Add support for STDDEV_POP(), STDDEV_SAMP(), VAR_POP(), - VAR_SAMP() aggregate functions -#874 - Reduce the number of internal classes for dialect-specific - function aliases -#878 - Implement DataType.equals() and hashCode() - -API changes (backwards-compatible) ----------------------------------- -#851 - Change Field.{sortAsc|sortDesc}(List sortList) into - Field.{sortAsc|sortDesc}(Collection sortList) - -API changes (backwards-incompatible) ------------------------------------- -#848 - Purge deprecated API - Prior to 1.6.1 -#849 - Replace Cursor.fetchResult() by Cursor.fetch() -#852 - Review stored procedures / functions concept. Merge them - all into a single "Routine" type - -Bug fixes ---------- -#756 - Error when aliasing HSQLDB and Postgres unnested tables -#761 - Exception when TRACE logging execution with plain SQL - tables involved -#773 - Execute standalone stored functions as CallableStatement - to prevent issues with transactions -#847 - Query.getSQL() doesn't render dialect-specific SQL when - Query is constructed using the fluent API -#853 - DB2 generated convenience methods for stored functions - have unstable ordering -#857 - Derby casting of numeric types to String / VARCHAR does - not work -#858 - SQLDataType.getSQLDataType() should return itself, instead - of null -#860 - SQLite CEIL function is incorrectly simulated. CEIL(2.0) - returns 3.0 instead of 2.0 -#861 - Field.replace(String) generates bad SQL for various RDBMS. - Field.replace(String, String) works, though -#863 - Ingres integration generates illegal SQL when selecting - things like SELECT 1 WHERE 1 = 1 -#866 - Sybase ASE Field.replace(String) function incorrectly - removes the argument string -#873 - Error when selecting two times the same aggregate field -#877 - Compilation error in generated source code when a table - without a primary key has an identity column -#879 - Add Google Cloud SQL Example -#880 - Query.getSQL() does not consider SchemaMapping - -Test cases ----------- -#811 - Loader integration tests fail for SQLite -#812 - CSV Loader test leaves Postgres JDBC connection in an - inconsistent transactional state on error -#856 - Add integration tests for Field.abs() -#865 - Add integration tests for Field.ascii() -#867 - Add integration tests for Field.sum(), avg(), max(), min() -#881 - Re-design H2 stored functions to be pre-compiled, in order - to speed up integration tests - -Version 1.6.7 - September 25, 2011 -================================================================================ - -This release coincides with the launch of the new website at -http://www.jooq.org. Hence, it ships with little additions to the -deliverable itself. - -Apart from new convenience methods, the main addition is a Maven -plugin for jooq-codegen contributed by Sander Plas. - -Features and improvements -------------------------- -#797 - Create Maven plugin for source code generation -#825 - Add List> Factory.fetchMany(String) to - allow for fetching several result sets from stored - procedures, such as Sybase ASE's "sp_help" -#838 - Implement MetaDataFieldProvider.toString() -#841 - Add List Result.getValues(Field, Class) -#842 - Add Query.getBindValues() method to allow for extracting - bind values in the correct order -#843 - Add Factory.fetch(ResultSet) to transform a JDBC ResultSet - into a jOOQ Result - -API changes (backwards-compatible) ----------------------------------- -#837 - Avoid final keyword on Object methods, such as .equals(), - .hashCode(), etc - -Bug fixes ---------- -#836 - Bad syntax when selecting from aliased plain SQL tables -#839 - Boolean conversion in getValueAsBoolean() should trim - String values first -#840 - Numeric conversions in getValueAsXXX() should trim String - values first -#844 - NullPointerException when selecting a column from a Result, - that does not exist - -Version 1.6.6 - September 11, 2011 -================================================================================ - -Finally, support for another RDBMS has been added. Sybase's other -important product Sybase Adaptive Server Enterprise (or simply -Sybase ASE) is now officially supported by jOOQ - -Apart from this, there had been important improvements with the -recently added INSERT .. RETURNING clause, as well as some fixes -related to DECIMAL / NUMERIC data types - -Features and improvements -------------------------- -#796 - Complete missing public org.jooq.impl Javadoc -#800 - Add support for Sybase Adaptive Server Enterprise -#808 - Add support for INSERT .. RETURNING for Ingres -#809 - Add support for INSERT .. RETURNING for Sybase SQL - Anywhere using SELECT @@identity -#810 - Add support for INSERT .. RETURNING for SQLite using - last_inserted_rowid() -#813 - Add DSL support for INSERT .. RETURNING -#814 - Change TableRecord to reload its trigger-initialised main - key in Oracle and other RDBMS that don't support IDENTITY - columns -#818 - Add SQLiteFactory.rowid() -#819 - Support SQLite AUTOINCREMENT columns as IDENTITY -#820 - Add Factory.fetchOne(String) for executing plain SQL - queries that return single records -#826 - Allow for returning several records in the INSERT .. - RETURNING clause. This now works for DB2, HSQLDB, MySQL, - and Postgres -#827 - Support Sybase SQL Anywhere's TOP n START AT m clause - instead of simulating it with nested SELECT's - -API changes (previous API now deprecated) ------------------------------------------ -#817 - Deprecate Factory.lastID(Identity) - -Bug fixes ---------- -#815 - SQL Server fetching of IDENTITY value is broken -#821 - Optimise ResultQuery.fetchAny() executing fetchLazy() - internally, and only fetching one record from the cursor -#822 - Let Constant cast to more precise NUMERIC/DECIMAL types - in those RDBMS where casting is necessary -#823 - Cannot bind SQLite BigDecimal, BigInteger types - bind - them as String instead -#824 - BigInteger values cannot be bound in DB2, Derby -#828 - Document inefficient implementation for GREATEST and LEAST - in some RDBMS - -Version 1.6.5 - August 28, 2011 -================================================================================ - -This release finally adds a loader for CSV data to jOOQ. You can -now load CSV data using a simple fluent API, configuring error -handling, duplicate behaviour and transaction handling, as well -as various CSV parameters. - -This release also changes the way generated keys are retrieved -after INSERT's. Instead of (potentially inconsistently) running -SELECT MAX(pk) immediately after the INSERT, Postgres' INSERT.. -RETURNING clause is used (or simulated), in a single statement. - -Features and improvements -------------------------- -#784 - Add Result.exportXML() to retrieve a DOM document similar - to that of .formatXML() -#792 - Add support for loading of CSV data into tables -#795 - Add List fetch(int, Class) and - fetch(String, Class) convenience methods -#803 - Add support for INSERT .. RETURNING or simulate it where - not available -#805 - Add T[] fetchArray(int, Class) and - fetchArray(String, Class) convenience methods -#806 - Add T fetchOne(int, Class) and - fetchOne(String, Class) convenience methods - -Bug fixes ---------- -#798 - Oracle IN (...) clause with more than 1000 arguments does - not work -#802 - Use "INSERT .. RETURNING" instead of "SELECT MAX(pk)" - to retrieve the primary key of a new record - -Version 1.6.4 - August 07, 2011 -================================================================================ - -This release ships with a couple of useful concepts inspired by -other frameworks. These are: - -- selecting into custom POJO's. Results can be mapped to POJO's - by convention or using JPA @Column annotations -- selecting into custom callbacks. This is already a wide-spread - practice in Spring JdbcTemplates. -- selecting long-running queries asynchronously. This idea has - been inspired by the Avaje Ebean framework - -Apart from these changes and some bugfixes, the internal API has -been completely re-designed. The idea here is that query -rendering and variable binding are even faster (less String -objects), more extensible and more accurate. This is a pre- -requisite for many future developments with even more complex SQL -statements, such as for instance CTE's (Common Table Expressions) - -Features and improvements -------------------------- -#137 - Add support for asynchronous query execution using - FutureResult ResultQuery.fetchLater() similar to - Avaje Ebean -#198 - Add SELECT INTO functionality into POJO's using - T ResultQuery.fetchInto(Class) similar to JPA - CriteriaQuery -#728 - Add .fetchInto(RecordHandler) to ResultQuery, Result, - and Cursor to allow for callbacks similar to Spring's - JdbcTemplate/Ollin Framework -#774 - Add more TRACE logging to .fetchLazy() -#777 - CURSOR: Add function alias: UNNEST for TABLE -#781 - Add E function (Euler number) -#782 - Add T Record.getValue(..., Class) methods - for convenient type conversion -#785 - Allow for storing TableRecord with a provided Field[] - indicating the primary key -#786 - Document thread-safety facts in Factory Javadoc -#788 - Add Key.getFieldsArray() convenience method -#793 - Add support for Oracle's SYS_CONNECT_BY_PATH function - -API changes (backwards-incompatible) ------------------------------------- -#758 - Change internal QueryPart rendering and binding API to use - Configuration and Context as callback parameters. If you - use CustomField or CustomCondition, please correct your - implementations accordingly. Other parts of the API should - not be affected -#778 - Purge deprecated API, deprecation prior to jOOQ 1.5.7 -#790 - Purge deprecated generated code, deprecation prior to - jOOQ 1.5.7 - -API changes (previous API now deprecated) ------------------------------------------ -#776 - Deprecate QueryPart.getSQL(), add Query.getSQL() -#789 - Deprecate Record constructors with Configuration - parameter - -Test cases ----------- -#636 - Add integration tests for more advanced CONNECT BY - example -#772 - Add integration tests for selecting cartesian products - (several tables in FROM clause) - -Bug fixes ---------- -#730 - Sybase cannot bind null values in plain SQL -#759 - Omit the TOP 100 PERCENT clause in SQL Server ordered - top-level queries -#767 - An empty Java package is generated for PL/SQL packages - containing underscores -#771 - Some exotic literals are not properly escaped with quotes - yet, e.g. UDT identifiers, VARRAY types, etc. -#775 - Automatic re-attaching after deserialisation does not work - when used with .fetchLazy() -#787 - The UpdatableRecord's internal changed flags are not - updated after INSERTs / UPDATEs - -Version 1.6.3 - July 31, 2011 -================================================================================ - -This is mainly a maintenance release with lots of bugfixes, -mostly around code generation, plain SQL tables, and data types. -Please note that generated source code may contain incompatible -changes due to #639 (see below for details)! - -Apart from that, project CURSOR is advancing and it is now -possible to unnest arrays into tables. See this article for -details about where jOOQ is heading with project CURSOR: - -http://blog.jooq.org/2011/07/24/the-power-of-ref-cursor-types/ - -Features and improvements -------------------------- -#679 - Improve H2 NVL2 support as of H2 1.3.156 -#680 - Improve H2 ROUND support as of H2 1.3.156 -#735 - Add README documentation to GitHub -#736 - Add more info regarding number of generated artefacts in - jooq-codegen logging -#750 - Add DataType.isNumeric(), .isString(), .isTemporal(), - .isBinary() -#754 - Log query as executed by JDBC PreparedStatement when - TRACE logging (without inlining variables) -#752 - CURSOR: Add support for selecting from ARRAY types -#762 - Use H2's native support of NVL, instead of COALESCE -#764 - CURSOR: Add support for selecting from ARRAY types - returned from stored functions - -API changes (backwards-incompatible) ------------------------------------- -#639 - Map DECIMAL(n, 0) and NUMBER/NUMERIC(n, 0) data types - to Byte/Short/Integer/Long/BigInteger instead of - BigDecimal in generated source code. Re-generated code - will not be compatible! - -API changes (previous API now deprecated) ------------------------------------------ -#731 - Inconsistent API with Field.lessOrEqualToXXX(). Removed - "To" from method name -#757 - Deprecate Factory.constant() methods - -Test cases ----------- -#731 - Add missing integration tests for equalAll(), equalSome() - and similar methods -#747 - Upgrade H2 to 1.3.158 - -Bug fixes ---------- -#632 - Sybase error : column @p0 not found in nested SELECT -#700 - Restore HSQLDB ARRAY support with INFORMATION_SCHEMA - change in HSQLDB 2.2.3, and some fixes in 2.2.5 -#725 - Cannot insert byte[] data with plain SQL -#733 - H2 changed JDBC type for ResultSet/CURSOR from 0 to -10, - like Oracle -#737 - Compilation errors in generated source code if table - fields contain spaces -#738 - Compilation errors in generated source code if MySQL - procedure parameter type contains two comma-separated - arguments (like DECIMAL(10,2)) -#739 - Postgres navigator methods and keys are not re-generated - in the same order -#740 - Formatting is broken on Result.format() with some special - newline characters -#743 - Make SQL Server INFORMATION_SCHEMA independent from - HSQLDB again, to prevent incompatibility issues -#744 - Ingres REAL and FLOAT4 types are generated as FLOAT/FLOAT8 - which maps to java.lang.Double, instead of java.lang.Float -#753 - Postgres error when binding array that contains null - values -#755 - NullPointerException when converting an array containing - a null value -#766 - Bad decoding of JDBC Types BIGINT (to BigInteger instead - of Long) and REAL (to BigDecimal instead of Float) when - plain SQL tables are involved - -Version 1.6.2 - July 10, 2011 -================================================================================ - -This release mainly introduces three new projects. - -Project CURSOR where jOOQ finally supports various RDBMS's TABLE, -CURSOR, and REF CURSOR data types. This is especially useful when -those types are returned from stored procedures and functions. -Cursors are simply mapped to jOOQ Result types and can -thus be used like regular table results - -Project EXPORT aims at exporting data from the database in -various serialisable formats, such as XML, CSV, HTML, Text, JSON. -This project will be continued in the future, to also -deserialise from (some of) these data streams. This will allow -for easy transport of jOOQ Result types over the net. - -Project CODEGEN has finally been started. Many improvements -suggested by jOOQ users will be implemented in the next releases. -In this release, important fixes have been made to prevent -compilation errors in generated artefacts. - -Features and improvements -------------------------- -#61 - EXPORT: Add Result.formatXML() -#166 - CURSOR: Add support for ResultSet type returned from - Oracle stored procedures / functions -#411 - Allow for fetching Map (instead of Record) - and List> (instead of Result) -#549 - Add Factory.function() for plain SQL functions -#611 - Simulate RPAD and LPAD in SQL Server, Sybase -#627 - Add support for Postgres FOR UPDATE OF [table-name] clause -#628 - Add support for REPEAT (SQL Server: REPLICATE) function -#637 - Nicely format time in StopWatch logging output -#640 - Simulate Postgres FOR UPDATE OF [table-name] clause in - other dialects -#649 - CURSOR: Add Cursor.fetch(int) .fetchOne() - .fetchResult(int) .fetchResult() -#653 - Add support for MySQL encryption and compression functions -#660 - Clarify Javadoc of UpdatableRecord to explain its - behaviour when changing the main unique key -#669 - EXPORT: Add Result.formatHTML() -#672 - Add convenience method UpdatableRecord.copy() in order to - reset primary key values for a subsequent INSERT -#675 - EXPORT: Add Result.formatCSV() -#683 - Implement ResultImpl.equals() and .hashCode() -#684 - Implement AbstractStore.equals() and .hashCode() -#685 - Add Store.size() to indicate the maximum index of the - Store -#687 - EXPORT: Add result.formatJSON() -#689 - Create separate builds: jooq-core.zip and - jooq-with-dependencies.zip -#690 - CURSOR: Add support for ResultSet type returned from H2 - stored functions -#695 - CURSOR: Add support for ResultSet type returned from - Postgres stored functions -#697 - Add Factory.fetch(String) for executing plain SQL queries - that return results -#701 - Add ResultQuery.fetchArray() and .fetchOneArray to return - Object[][] and Object[] -#704 - Always add top and bottom line in Result.format() -#705 - Right-align numeric values in Result.format() -#716 - Add SUBSTRING function Field.substring(Field, Field) - taking fields as arguments -#719 - Document risk of SQL injection in plain SQL and literal - factory methods -#726 - Add LENGTH function as a synonym for CHAR_LENGTH - -API changes (backwards-compatible) ----------------------------------- -#698 - Inconsistent API with Factory.fetch(Table [,Condition]) - Let method return Result instead of List -#699 - Let Result extend List - -API changes (previous API now deprecated) ------------------------------------------ -#656 - Decrease verbosity of plain SQL methods. They will just be - called Factory.field() .condition() .table() .query() - -Test cases ----------- -#643 - Add integration test for code generation of invalid and - incomplete types in Oracle -#654 - Add integration tests for master data tables with PK types - other than NUMBER/INT -#655 - Add missing integration tests for TRIM function - -Bug fixes ---------- -#450 - Improve plain SQL integrity checks for bind variables -#610 - CODEGEN: Compilation error in generated source code for - databases with table named 'system' -#646 - An empty Java package is generated for an empty PL/SQL - package. This is unnecessary -#651 - CODEGEN: Avoid importing datatypes in generated source - code to prevent collisions -#657 - NullPointerException when creating a Factory with a null - SchemaMapping -#658 - Master data table code generation is broken for tables - with more or less than 3 columns -#662 - Add support for the missing Postgres data type "bpchar" -#663 - Add support for the missing Sybase data type "int" -#664 - Ingres INTEGER data types are not correctly generated -#665 - HSQLDB Datatype CLOB and BLOB are not supported, when - selecting from plain SQL tables -#666 - The evil bug: Ingres TRIM function only executes RTRIM -#673 - UpdatableRecord.store() doesn't work if called after - .delete() -#702 - Add support for the missing SQLite data type "NULL" -#706 - CURSOR: Ensure that Query.execute() runs in a single - transaction when Postgres refcursor is involved in the - query (this fixes a Postgres JDBC driver flaw) -#724 - NullPointerException when passing a single literal null - bind value to plain SQL methods without casting to Object -#729 - DB2, Derby, Ingres, Oracle cannot bind null values in - plain SQL - -Version 1.6.1 - June 19, 2011 -================================================================================ - -In this release, the PORTABILITY project has been implemented. -Finally, the SQLDialect has been removed from most generated -artefacts (Schema, Table, Field, Sequence, etc). Also, the -constructing Factory is not referenced by its created QueryParts -anymore, unless this is really necessary (Query objects, UDT's, -ARRAY types). This leads to higher compatibility between schemata -of different databases, e.g. if users want to use an HSQLDB -development and Oracle productive database. - -Unfortunately, this means that the way stored procedures are -called had to be changed. This is an API break that could not be -avoided. The pre-1.6.1 StoredObject.execute(Connection) method -is deprecated and will be removed in the future. It has been -replaced by StoredObject.execute(Configuration) - -In addition to this project, many more window functions are now -supported, as well as the Oracle-specific CONNECT BY clause for -recursive queries. - -Features --------- -#351 - Add support for Oracle ROWID data type -#452 - PORTABILITY: Create a super-set of RDBMS data types -#453 - PORTABILITY: Don't create dialect-specific QueryParts -#455 - Add support for the Oracle CONNECT BY clause -#587 - Add optional OFFSET clause to form LIMIT .. OFFSET - constructs -#589 - Add extended FOR UDPATE [OF ...] [{WAIT n | NOWAIT | SKIP - LOCKED }] support -#591 - Add support for LEAD() OVER() and LAG() OVER() window - functions -#592 - Add support for the CUME_DIST() OVER() window function -#601 - Add Factory.literal() convenience methods -#602 - Add Factory.val() methods to decrease .constant() - verbosity -#604 - Add support for RESPECT NULLS clause in some window - functions -#605 - Add Factory.use(String) for non-generated schemata -#613 - Add PI function -#616 - Add Factory.two() literal convenience method -#630 - Add support for Oracle CONNECT BY pseudo-columns LEVEL, - CONNECT_BY_ISCYCLE, CONNECT_BY_ISLEAF - -API changes ------------ -#299 - PORTABILITY: Create a dialect-independent meta-model -#588 - Add OVER() keyword to FIRST_VALUE() and LAST_VALUE() API - -Test cases ----------- -#368 - Add integration test for use with schema mapping -#586 - Upgrade H2 to 1.3.155 -#607 - Add integration tests for CRUD / SP's / UDT's / ARRAY's - with SchemaMapping -#612 - Add integration tests for LPAD and RPAD functions -#624 - Add integration test for code generation of invalid/ - incomplete views in Oracle -#631 - PORTABILITY: Add integration tests for using Oracle- - generated schema against an HSQLDB database -#638 - Add missing integration test for DECIMAL data type - -Bugfixes --------- -#176 - Stored procedures / functions in EQUIVALENT schemata - cannot be called -#493 - Bind variable mismatch when constructing bad SQL -#594 - Confusing Javadoc in SELECT DSL API -#603 - Fix DB2 'IGNORE NULLS' clause -#619 - SUBSTRING() function is broken in DB2, Ingres, SQL Server -#623 - SQL syntax error for some MERGE queries in SQL Server and - Sybase -#633 - SchemaMapping is not applied to sequences -#634 - Sequences are not escaped in generated SQL - -Version 1.6.0 - June 05, 2011 -================================================================================ - -Apart from supporting various additional standard and non- -standard JOIN constructs, there is now also full support for the -SQL standard MERGE statement and MySQL's ON DUPLICATE KEY variant -thereof. A great number of API enhancements have been added, -which improve the usability of jOOQ. The Ingres database is now -also supported. - -Features --------- -#301 - Add support for Oracle execution hints -#409 - Add support for NATURAL JOIN syntax, where RDBMS allows it -#415 - Make fluent API's underlying SelectQuery objects publicly - available -#429 - Add Ingres support -#475 - Document class-level generic types and in Javadoc -#486 - Add support for SQL MERGE clause -#494 - Allow for omitting schema name in generated SQL -#496 - Automatically update IDENTITY values in UpdatableRecord, - after storing them -#520 - Add support for JOIN ... USING syntax -#524 - Upgrade HSQLDB to 2.2 -#533 - Add ORDER BY [Map] or BY [List] functionality -#534 - Add Result.isEmpty() -#535 - Call upon ConfigurationRegistry.provideFor() before - throwing a DetachedException -#536 - Simulate CASE [value] WHEN [value] THEN [result] END - syntax in Derby -#538 - Add some logging to ConfigurationProvider -#539 - Add possibility to negate numeric values with Field.neg() -#541 - Add support for MySQL ON DUPLICATE KEY clause -#542 - Allow for Collection arguments in INSERT's DSL API -#543 - Allow for creating FUNCTION() OVER() without PARTITION BY - or ORDER BY clause -#546 - Add Factory.use(Schema) -#548 - Add new internal type FieldMap -#550 - Simulate ON DUPLICATE KEY INSERT clause in dialects other - than MySQL -#551 - Add TableMapping, similar to SchemaMapping for mapping - tables -#553 - Add Factory.plainSQLQuery -#554 - Add Factory.plainSQLField with a DataType parameter -#555 - Add UpdateXXX.set(Map) convenience methods to DSL API -#557 - Enhance INSERT DSL API to allow for adding VALUES clause - with InsertXXX.set() syntax -#570 - Add support for the RAND() function -#567 - Add support for Ingres Sequences -#572 - Add support for the ATAN2() function -#573 - Add possibility for additional select() clauses for - convenience -#575 - Add support for the FULL OUTER JOIN syntax, where RDBMS - supports it -#576 - Add support for the CROSS JOIN syntax, where RDBMS - supports it -#581 - Enhance API and allow Collection> - instead of Collection> - -API changes ------------ -#397 - Purge deprecated API - -Bugfixes --------- -#481 - Handle case where an empty record is stored -#522 - Misleading Javadoc in generated stored procedures and - function constructors -#532 - Restore Postgres INFORMATION_SCHEMA -#537 - Prevent null from being added to QueryPartList -#540 - Error when TRACE logging Limit -#544 - Aliased elements are not bound correctly when rendered - with toSQLReference() -#559 - Loosen type safety on overloaded methods to prevent - compilation errors with javac/Netbeans -#560 - HSQLDB DataType REAL is configured incorrectly -#565 - Add integration tests for current_user() function -#569 - ORA-01427 when generating foreign key relations -#571 - Field.trim() not correctly implemented for SQL Server -#583 - Accelerate integration tests: Reset schema only if - necessary - -Version 1.5.9 - May 15, 2011 -================================================================================ - -This version ships with lots of new functionality. Finally, the -DSL-style API has been extended to CRUD operations (INSERT, -UPDATE, DELETE)! Also, support for the TRUNCATE TABLE statement -has been added. - -The most important new features include the support for SQL:2003 -standard window functions, which are available in most major -RDBMS. Additionally, basic function support has been widely -extended. - -Features --------- -#148 - Added support for window functions -#204 - Add support for multi-record INSERT's -#416 - Added support for retrieval of IDENTITY values -#433 - Use bind variables for LIMIT and OFFSET -#441 - Added foreign key relationship meta information to the - generated source code -#446 - Beautify ResultImpl.toString() method -#461 - Automatically cast CONCAT parameters to Field if - necessary -#463 - Added support for trigonometric functions -#471 - Added support for the sign function -#472 - Added support for GREATEST/LEAST functions -#474 - Added support for "hyperbolic" functions SINH, COSH, TANH, - and COTH -#482 - Added DSL API for INSERT statements -#483 - Added DSL API for UPDATE statements -#484 - Added DSL API for DELETE statements -#485 - Added "Registry" for client code to provide Configurations - to jOOQ Attachables -#490 - Added support for the TRUNCATE TABLE statement -#495 - Generate source code for IDENTITY columns -#501 - Added support for boolean conversion to Result, Record, - and Store -#503 - Allow for schema navigation via generated artefacts -#518 - Let stored procedures reference owner package - if applicable -#525 - Added NULLS {FIRST | LAST} clause to ORDER BY constructs -#528 - Added Factory.getDataType() convenience method -#530 - Added Factory.zero() and Factory.one() convenience methods - -API changes (jooq) ------------------- -#527 - Weakened type-safety on Field.nvl2() -#529 - Deprecated Factory.select(Object...), added .selectOne() - and .selectZero() instead - -API changes (jooq-meta) ------------------------ -#30 - Add ParameterDefinition for stored procedures, instead of - reusing ColumnDefinition -#499 - Add reference to TableDefinition in ColumnDefinition -#500 - Add AttributeDefinition for UDTDefinition, instead of - reusing ColumnDefinition - -Bug fixes ---------- -#369 - Adapt H2 relations generation to H2's correction of - information_schema.cross_references -#435 - Added integration tests for NESTED SELECTs holding LIMIT - clauses -#460 - Syntax error when using a field with a reserved name -#462 - Fixed Javadoc broken links -#473 - Don't cast when cast is unnecessary -#479 - INSERT statement should not set all fields for a table -#497 - Derby referential code generation is broken, for named - foreign keys -#498 - Oracle package content is generated in arbitrary order -#502 - Syntax error when creating an empty IN condition -#526 - Corrected Javadoc in Field.coalesce() - -Version 1.5.8 - April 29, 2011 -================================================================================ - -Finally, jOOQ now supports two important new RDBMS: -SQL Server and Sybase! - -Apart from this great enhancement, there is now also full support -for the non-SQL standard LIMIT clause, even in dialects where the -LIMIT clause is not supported natively (especially Oracle, but -also DB2, SQL Server and Sybase, which have limitations). jOOQ -simulates LIMITs by rendering nested selects filtering on ROWNUM -(Oracle) or on ROW_NUMBER() (DB2, SQL Server and Sybase). - -Other interesting additions are an increasing support for native -mathematical functions. More function support will be added in -future versions. - -Features --------- -#16 - Added support for SQL Server -#21 - Uniform implementation of the LIMIT clause. Implemented - LIMIT clause simulation through analytic functions, where - LIMIT is not supported natively -#97 - Added support for Sybase -#418 - Measure time of various steps in source code generation -#420 - Added support for proprietary SQL extensions "FOR UPDATE" - and "FOR SHARE" -#431 - Added additional statistics to generation log files -#432 - Unified the various "standard" ANSI INFORMATION_SCHEMA - implementations in the jooq-meta artefact -#436 - Added support for the modulo function -#438 - Added floor and ceil functions -#439 - Added support for mathematical functions (logarithms, - exponentials, sqrt) -#447 - Enhanced Field.add() and Field.subtract() to work for date - time fields, also - - -API changes ------------ -#428 - Created new Maven artefact jooq-meta to cleanly separate - database meta-data navigation from code generation -#458 - Decreased DSL verbosity for arithmetic operations and for - ordering - -Bug fixes ---------- -#417 - Restored warning when unknown column type is encountered - in source code generation -#419 - Corrected misleading Select.fetchOne(...) Javadoc -#421 - Optimised AbstractRecord's memory consumption -#448 - Corrected some Javadoc @see links -#449 - Changed Field.concatenate() to accept Field parameters - to avoid generic varargs warnings - -Version 1.5.7 - April 17, 2011 -================================================================================ - -This is the first release built with support of Maven thanks to -the help of some jOOQ users! - -The main new features in this release are the improved support -for serialisation/deserialisation of jOOQ objects through use of -the newly introduced "Attachable" interface. - -If using log4j or the newly supported slf4j logging framework -in debug/trace mode, there is the possibility to log query -building/execution time statistics. - -Apart from these new features, fixes were mainly done in the -fields of type casting, HSQLDB 2.1 upgrade support, stored -procedures with OUT, IN/OUT parameters. Please upgrade, if you -are using any of those features. - -If you extend jOOQ as a base implementation for source code -generation, be aware of the fact, that the jOOQ-codegen is -currently undergoing major changes. Expect the code generation -API to stabilise again in one of the next releases. - -Features --------- -#104 - Added maven dependency -#248 - Integrate UDT types with ARRAYs -#295 - Allow for attaching/detaching UpdatableRecords to/from - Configurations -#359 - Added statistics measurement to Query execution for debug - log level -#362 - Added deprecation configuration flag -#364 - Document unknown type in generated source code -#373 - Improve exception handling in code generation -#378 - Added support for Oracle stored functions with OUT - parameters -#382 - Added Factory.attach() methods to re-attach deserialised - Attachables -#394 - Add logging support for SLF4J -#398 - Allow to provide a DataType in Factory.constant() -#399 - Provide access to TypeUtils.convert() methods via DataType -#404 - Added trace logging for measuring the speed of various - query execution steps - -API changes ------------ -#358 - Enhanced DSL API to allow for HAVING clauses without - GROUP BY clauses -#367 - Make Store, Result, QueryPart "Attachable" -#374 - Introduce strategy pattern to code generation for future - support for advanced naming schemes -#375 - Decouple Database from Generator -#381 - Made DataType Serializable -#384 - Deprecated singleton QueryParts -#388 - Unify "internal" API using an Adapter pattern - -Bug fixes ---------- -#187 - Protect generated Record navigation methods against name - clashes -#266 - Added more thorough integration tests for dialect-specific - casting (including some fixes related to varchar types) -#360 - Added more integration tests for the DISTINCT clause -#361 - Add more checks in testInsertUpdateDelete() -#366 - Warn only once per ColumnDefinition, if a data type is - unknown -#377 - NullPointerException when generating invalid stored - function -#380 - Added integration tests to check for proper - serialisability -#386 - Fixed incompatibilities with HSQLDB 2.1.0 -#387 - Fixed unnecessary imports in some Oracle generated - Records -#389 - Fixed javac compiler warning in AbstractStoredObject -#391 - Cannot properly call stored procedures when IN/OUT - parameter is bound to NULL -#392 - Procedures with several OUT parameters may not register - OUT parameters correctly -#410 - Passing null VARRAY values to Oracle stored procedures - causes issues -#412 - limit(int) sets default offset incorrectly in some - dialects - -Version 1.5.6 - March 31, 2011 -================================================================================ - -This release consists mainly of code generation bug fixes and -minor API improvements and enhancements. - -The most important improvement is ticket #90, by which lazy -fetching and iteration over data is now supported. jOOQ lets you -keep a reference to a Cursor that has an open JDBC ResultSet, to -fetch data from on-the-fly. - -A few major code generation bugs were reported where the -generated code may cause ambiguity due to an inconsistent API. -This means that you will have to re-generate your schema after -upgrading to version 1.5.6. Some of your code may not compile -anymore, after this upgrade. - -Features --------- -#90 - Added possibility for lazy fetching of data -#208 - Added convenience methods for direct invocation of - sequences' currval() and nextval() attributes -#212 - Created one factory per dialect for better separation of - dialect-specific support -#213 - Generate a factory for each schema -#251 - Opened up base implementations for Field and Condition - to allow for custom implementations by client code -#274 - Integrate H2 ARRAY types with stored procedures -#292 - Documented usage of log4j and java.util.logging -#306 - Added support for the NULLIF function -#319 - Added Field.between(Field, Field) method -#320 - Added trace logging for variable binding and SQL - generation methods -#323 - Added Field.in(Field...) method -#325 - Include release version number in delivered .jar files -#328 - Improved configuration setup documentation page -#333 - Let Result implement Serializable -#334 - Added fetchMap() convenience methods -#335 - Added more functions and aggregate functions examples to - documentation -#338 - Visually improve code generation logging -#339 - Removed skipping of unreferenced UDT's, ENUM's and ARRAY's -#342 - Improved generated referential code by using fetch() and - fetchOne() API -#356 - Let UpdatableRecord.store() and delete() return an int - to indicate whether the record was actually modified - -API changes ------------ -#233 - Allow for joining TableLike instead of Table -#337 - Added generic type > to - InsertSelectQuery -#341 - Fixed API flaw where SelectOnConditionStep.and() methods - and similar ones returned SelectConditionStep, instead of - SelectOnConditionStep - -Bugfixes --------- -#69 - Corrected referential code generation for foreign keys - that reference non-primary unique keys -#85 - Corrected referential code generation for multi-field - foreign keys -#121 - Covered more Factory.executeXXX() methods with integration - tests -#318 - Fixed NullPointerException when executing SELECT * from - aliased tables -#321 - BetweenCondition does not bind left hand side Field - correctly -#322 - InCondition does not bind left hand side Field correctly -#326 - Avoid method overloading where binding to Object - may lead to compile-time ambiguities (with javac) -#343 - Add more foreign key navigation method integration tests -#347 - Add explicit integration tests for schema artefacts - excluded from code generation -#350 - Disambiguate navigation methods if several foreign keys - reference the same entity -#352 - Disambiguate navigation methods if a table ending on S - references itself -#353 - Added integration test for compilation of generated - artefacts with javac (as opposed to the Eclipse compiler) -#355 - Error when storing an UpdatableRecord that has no changed - values - -Version 1.5.5.2 - March 15, 2011 -================================================================================ - -A critical bug was reported from the 1.5 release stream where -stored functions did not render their parameters in correct order - -Features --------- -#302 - Map Oracle's NUMBER data type to java.lang.Number in - stored procedures, stored functions - -Bugfixes --------- -#317 - StoredFunctionImpl.asField() renders parameters in wrong - order - -Version 1.5.5.1 - March 13, 2011 -================================================================================ - -In version 1.5.5, there was a fatal bug breaking Derby source code generation. -Only the Derby dialect is affected. Please update immediately, if you are using -jOOQ's Derby integration - -Bugfixes --------- -#315 - Generated master data records are not sorted by PK -#316 - Derby code generation fatally broken - -Version 1.5.5 - March 12, 2011 -================================================================================ - -This version is released early as there are some important bugfixes. Additional -improvements include: - -- Improved DSL related to conditions in HAVING and JOIN clauses -- Support for Oracle-style functions, such as NVL, NVL2, COALESCE - DECODE, etc - -Features --------- -#304 - Add support for Oracle NVL function -#305 - Add support for COALESCE function -#308 - Add support for Oracle NVL2 function -#311 - Add support for Oracle DECODE function - -API changes ------------ -#223 - Enhance DSL to accept and(), or() and similar methods in JOIN steps -#224 - Enhance DSL to accept and(), or() and similar methods in HAVING steps - -Bugfixes --------- -#297 - Fixed Factory.concatenate() function -#298 - Added integration tests for nested selects in HAVING clause -#300 - Added integration tests for nested selects in JOIN clause -#303 - Javadoc correction -#307 - Accelerated integration tests -#309 - Fixed JDBC variable binding issue related to Conditions where the lhs is - a function (e.g. stored function) and the rhs is a constant -#310 - Fixed issue where fetchOne() methods throw NullPointerException if no - result record is available -#312 - Fixed issue where Field.equal(...) methods rendered unexpected SQL when - rhs null is cast to a type -#313 - Fixed Derby cast type for VARCHAR -#304 - Let the DerbyDataType default for java.lang.String be VARCHAR, not LONG - VARCHAR - -Version 1.5.4 - March 04, 2011 -================================================================================ - -Feature #243 required a minor API change in the base classes of generated source -code. This means you have to re-generate all your jOOQ artifacts in order to -migrate to 1.5.4. The artifacts themselves should be regenerated in a compatible -way, such that your client code should not be affected. If this is not the case, -please report a ticket here: - - https://sourceforge.net/apps/trac/jooq/newticket - -Apart from the Derby RDMBS and some new data type support, there have been many -new convenience methods added all over the API. For instance, if type-safety is -not really a requirement, there are lots of possibilities to use plain SQL -directly in the DSL. In that case, data can be accessed from Record, Results, -not only through Field, but also through field names or indexes. - -Check out the updated documentation (soon) here: - - https://sourceforge.net/apps/trac/jooq/wiki/Examples - -- Support for the Derby RDBMS -- Support for casting. This allows for even greater flexibility - in cases where jOOQ cannot 100% ensure type-safety -- Support for ARRAY types. Oracle, Postgres, HSQLDB and H2 ARRAY - types are now supported natively as regular bindings in - jOOQ's Field -- Support for dialect-specific data types. CHAR, VARCHAR, CLOB - are no longer treated equally as java.lang.String. Their - type heritage is also generated -- More sequence support -- Lots and lots of bug fixes - -Features --------- -#95 - Support for the Derby RDMBS -#163 - Add support for JDBC type ARRAY (with Postgres) -#209 - Add support for DB2 sequences -#210 - Add support for H2 sequences -#211 - Add support for HSQLDB sequences -#215 - Support for SQL casting using as cast type -#246 - Support for SQL casting using dialect-specific data types -#254 - Add HSQLDB support for ARRAY types -#256 - Add Oracle support for VARRAY types -#257 - Integrate ARRAY types with stored procedures -#261 - Add a global type mapping to the generated Schema object -#267 - Add DataTypeDefinition for further abstraction of data types in code - generation -#269 - Add H2 support for ARRAY types -#290 - If log4j is not on the classpath, use java.util.logging instead, as - fallback - -API Changes ------------ -#156 - Allow for results to be accessed by index, not by field -#218 - Corrected bad method signature: Record.getValueAsLong(Field, Integer) -#219 - Extended Result and Select API's to be more similar to that of Record -#232 - Add more convenience plain SQL support to the API -#235 - Add convenience methods to Record, Result and Select for access of data - via field name -#243 - Refactor DataType implementations in order to allow for the use of - generics -#259 - Add field type to database meta data (ColumnDefinition) -#260 - Add field type to database meta data (Field) -#262 - Add default behaviour for Record.getValue(Field) -#276 - Add Javadoc as a ZIP file to the jOOQ distribution - -Bugfixes --------- -#125 - Add more plain SQL integration tests -#191 - Add more integration tests for nested unions -#205 - Implemented workaround for handling Postgres stored functions with UDT - OUT parameters -#214 - Fixed NPE when generating a stored function with an unknown parameter - type -#216 - Fixed some cases where binding of BigInteger is not done correctly -#220 - Syntax error when using select statement in a CASE clause -#221 - Corrected integration tests for combined update and select statements -#222 - Added integration test for INSERT statements having nested SELECT - statements for their fields -#225 - Correctly cast array types in Postgres -#230 - Potential misuse of Blob and Clob in H2's JDBC types -#239 - Factory.fetchAny() is not implemented for SQLite -#244 - Fixed peculiar MySQL casting support where cast types do not match any - data types -#245 - Fixed NPE when reading null dates in SQLite -#249 - Added ARRAY type integration tests -#255 - Stored procedure bind variables get mixed up when any argument is null -#263 - Correctly handle Postgres function overloading -#264 - Ambiguous funciton calls when calling overloaded functions with null - parameter -#281 - Handle compilation errors when generating stored procedures with > 254 - parameters -#283 - Fixed compilation errors in generated source code for Oracle's UDT table - type -#284 - Fixed compilation errors in generated source code for Oracle procedures - in packages, when they have no parameters -#285 - Fixed compilation errors in generated source code for Oracle tables with - the same name in different schemata -#286 - Fixed name collisions in generated objects with the java.lang.* package -#288 - Prevent the creation of UNION queries with bad syntax in MySQL -#289 - Correctly alias fields within UNION queries for some dialects, which then - only require the "AS" keyword -#291 - Cannot create an aliased field called "year" in Postgres - -Version 1.5.3 - January 13, 2011 -================================================================================ - -- Lots of stored procedure support was implemented -- Support for sequences was added -- The final decision to postpone support for DB2 UDT's was made -- Some code generation bugfixes - -Features --------- -#36 - Added stored procedure / stored function support for HSQLDB -#140 - Added support for Oracle sequences -#147 - Added support for H2 stored functions -#162 - Correctly integrate UDTs with stored procedures -#170 - Added support for Postgres stored functions -#186 - Added support for more Oracle PL/SQL simple data types -#193 - Simulate support for H2 "stored procedures" -#195 - Simulate support for Postgres "stored procedures" -#206 - Added support for Postgres sequences - -API changes ------------ -#180 - Improved DSL for constant values -#181 - Allow for referencing Field in function argument list -#189 - Renamed convenience methods in org.jooq.Record -#207 - Add fetchOne(Field) method to org.jooq.Select API - -Bugfixes --------- -#182 - Protected generated Record classes against clashes with inherited methods -#183 - Fixed NullPointerException, when generating master data tables with - NULL fields -#184 - Fixed IllegalArgumentException, when a data type is present in the - schema, but unavailable in code generation logic -#185 - Code generation should not fail when single elements cannot be generated -#188 - Improved integration tests for stored procedures / functions / packages -#196 - Increase RDMBS version compatibility by avoiding "SELECT *" in code - generation logic -#199 - Added integration tests for stored procedures in RDBMS that do not - support OUT parameters -#201 - Fixed issue in DB2 where stored procedures without parameters were not - generated. -#202 - Added integration tests for stored procedures / functions without - parameters - -Version 1.5.2 - December 27, 2010 -================================================================================ - -- Improved support for stored procedures, also in packages -- A minor API change was inevitable to implement #173. The API change only - concerns the INTERNAL API. Deprecation marks are added and deprecated items - will be removed in 1.6.0 -- Experimental SQLite database support -- Some important bug fixes - -Features --------- -#25 - Added support for Oracle packages -#114 - Added support for Oracle UDTs -#145 - Added support for the SQLite database -#150 - Generate static convenience methods for stored procedures / functions -#151 - Generate static convenience methods for stored function fields -#152 - Generate meaningful serialVersionUID in generated classes -#173 - Added support for EQUIVALENT schemata - -API changes ------------ -#159 - Added convenience method List getValues(Field) to Result -#165 - Added convenience methods for creating EXISTS clauses -#169 - Improved DSL for WHERE clauses - -Bugfixes --------- -#68 - Prevent issues originating from overloaded stored procedure names, - generating identical Java class names -#153 - Fixed issue with generated code for DB2 stored functions -#154 - Fixed issue with generated code for DB2 stored functions -#155 - Fixed issues with database NULL not being mapped correctly to Java NULL - when selecting values that have a primitive type (int, long, etc) -#158 - Potential ClassCastException when using Field -#171 - Corrected issue related to selection of default schema in DB2 -#177 - Fixed issue related to generated code for tables or UDTs without columns - - -Version 1.5.1 - December 13, 2010 -================================================================================ - -- H2 database support thanks to Espen Stromsnes -- Improved stored procedure support - -Features --------- -#96 - Added H2 database support -#101 - Added stored procedure / stored function support for Oracle -#138 - Added stored procedure support for DB2 -#146 - Added support for DB2 functions - -API changes ------------ -#143 - Added convenience methods to Record - -Bugfixes --------- -#84 - Implemented referential code generation for foreign keys that do not - match their primary keys' types -#141 - Encoding problem in generated master data classes - -Version 1.5.0 - November 22, 2010 -================================================================================ - -- A big one. Major API changes / improvements -- Added lots of convenience methods -- UDT support -- Enum support -- DB2 support thanks to Espen Stromsnes -- "Light" dependency to log4j added. jOOQ will still run without it - -Features --------- -#1 - Create support for UDTs (so far only for PostgreSQL) -#15 - Added DB2 support -#60 - Added support for nested selects in INSERT and UPDATE statements -#83 - Added log4j logging to code generation and runtime -#87 - Add support for arithmetic expressions -#105 - Added support for ENUM data types, where applicable (MySQL and PostgreSQL - so far) -#110 - Added execute and fetch convenience methods -#111 - Added missing "select distinct" support -#122 - Annotate generated classes with javax.annotation.Generated -#123 - Generate user enum fields from data values (master data) -#124 - Added PlainSQLTable -#127 - Added not() operator to Condition -#135 - Added convenience methods andNot() and orNot() in Condition - -API changes ------------ -#89 - Removed support for DataSource. jOOQ is not a transaction manager -#92 - Added SortField type to be used for sorting -#99 - Provide better access to functions (No more FunctionFactory) -#116 - Merge Manager functionality into Factory -#118 - Improve API of org.jooq.Field -#119 - Improve subquery condition API -#132 - Reduced much of the select query API -#134 - Better separation of SelectQuery and SimpleSelectQuery - -Bugfixes --------- -#109 - Error when executing select * if generated schema does not match actual - schema -#115 - Fix various "null" pseudo field issues -#126 - Error when selecting a single field from a union nested select -#129 - Fixed performance issue in Oracle code generation for very large - databases - - -Version 1.4.4 - November 22, 2010 -================================================================================ - -Unreleased version, fixes included in 1.5.0 - -Bugfixes --------- - -#133 - JoinCondition does not take comparison operator - -Version 1.4.3 - October 25, 2010 -================================================================================ - -Some more bugfixes - -Bugfixes --------- - -#71 - Generated code does not compile, when foreign key and primary key have a - data type mismatch -#73 - In Oracle generated code, multi-field foreign keys may generated bad - relations code -#82 - Conversion of literals to camelcase fails if numbers are involved - -Version 1.4.2 - October 22, 2010 -================================================================================ - -Various bugfixes and minor improvements - -Features --------- -#66 - Add support for CASE or DECODE expression - -API changes ------------ -#77 - Functions should not extend FieldImpl, but a new AbstractField -#78 - QueryPart pollutes declared method space of its implementations. Hide it - by indirection - -Bugfixes --------- -#64 - Code generation fails when foreign key references a unique key that is not - the primary key. Code generation for these cases is omitted -#67 - When loading properties files, a leading / seems to be mandatory. This is - preventing users from correctly setting up jOOQ the first time -#70 - Add support for Oracle datatype TIMESTAMP(6) -#72 - Name clashes in generated Tables -#75 - Constant does not bind its values. -#76 - Constant should not render strings all the time -#79 - Constants are not properly escaped -#80 - Position function does not bind any variables -#81 - Add cast function to Constants in HSQL - -Version 1.4.1 - October 18, 2010 -================================================================================ - -Oracle patch release - -Features --------- -#63 - Generate referential functionality for Oracle - -Version 1.4.0 - October 17, 2010 -================================================================================ - -Support for PostGreSQL was added. -Added lots of OR-mapping functionality. -There is a general API change due to various new features. - -Features --------- -#14 - Add PostGreSQL support -#40 - Resolve foreign keys. Allow for navigation between objects. -#42 - Add PlainSQLField -#45 - Add "dirty" flag to Record's values. This allows for updating only - relevant data. -#47 - Complete implementation for UPDATE, INSERT, DELETE statements. Added some - missing functionality. -#48 - Add more support for Date, Time, Timestamp fields. -#51 - Add a org.jooq.impl.Manager class that provides common utility methods for - CRUD operations - -API changes ------------ -#10 - Add second generic type . This is a prerequisite for - many OR-mapping features -#18 - Use org.jooq.Record in InsertQuery and UpdateQuery -#46 - Create UpdatableRecords as a prerequisite for JPA and true OR-mapping. - These records support store() and delete() methods -#52 - Add default constructor in generated Records. -#53 - Add refresh functionality to UpdatableRecords. See also #46 -#54 - Add a state to the factory class -#56 - Reduce API, remove unnecessary Condition subinterfaces -#57 - Reduce API, remove unnecessary QueryPart interfaces - -Bugfixes --------- -#49 - NullPointerException when generating relations on schema subset -#58 - Count function renders bad SQL in various dialects -#59 - Exception when selecting unaliased functions in queries - -Version 1.3.0 - August 24, 2010 -================================================================================ - -Support for HSQLDB was added. -There is a major API change due to #44. - -Features --------- -#29 - Generate primary keys and foreign keys in Oracle code generation -#34 - Add support for HSQLDB -#39 - Generate primary keys and foreign keys in HSQLDB code generation -#41 - Add documentation to QueryFactory and Functions - -API changes ------------ -#23 - Add support for more advanced joins -#32 - Merge SelectQuery and ResultProviderQuery interfaces -#44 - Let Query methods return "this" - -Bugfixes --------- -#35 - Add unit tests for HSQLDB support -#37 - Syntax error in combined select queries! The usage of combined queries in - MySQL may still be a bit awkward. Keep an eye out for further fixes -#43 - Join with aliased tables doesn't work - -Version 1.2.0 - August 21, 2010 -================================================================================ - -The added Oracle support is now unit tested and more stable. The Oracle NUMBER -data type is mapped more precisely to Java types. - -Features --------- -#12 - Model primary keys and foreign keys in generated code -#22 - Improve mapping of Oracle NUMBER data type -#26 - Add Plain SQL QueryParts -#27 - Add support for HAVING clause - -Bugfixes --------- -#24 - Add Unit tests for oracle database (and fixed bugs) -#31 - Pull up addOrderBy() methods from SelectQuery to ResultProviderQuery - -Version 1.1.0 - August 17, 2010 -================================================================================ - -The main new feature is the Oracle support. Wait for Version 1.1.1 for that -support to be stabilised, as there are no Oracle unit tests running against an -Oracle database yet. - -Features --------- - -#2 - Add support for inner / nested selects -#3 - Add more function support -#4 - Implement filtering functionality for code generation -#6 - Add Oracle Support -#9 - Create true POJO's (implementing org.jooq.Record) with getters and setters -#17 - Make org.jooq.impl.Parameter independent of Field - -Bugfixes --------- - -#11 - Code generation does not remove files - -Version 1.0.1 - August 14, 2010 -================================================================================ - -Features --------- - -#5 - Prevent code regeneration, if no changes were made -#7 - Implement ant task for code generation - -Version 1.0.0 - August 14, 2010 -================================================================================ -Initial Release \ No newline at end of file diff --git a/jOOQ-website/inc/feature-matrix.php b/jOOQ-website/inc/feature-matrix.php deleted file mode 100644 index 9259dda671..0000000000 --- a/jOOQ-website/inc/feature-matrix.php +++ /dev/null @@ -1,427 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
SQL statements and features
FeatureASEDB2DerbyH2HSQLDBIngresMySQLOraclePostgresSQLiteSQL ServerSybase
INSERT with VALUESyesyesyesyesyesyesyesyesyesyesyesyes
INSERT with VALUES (multiple records)yesyesyesyesyesyesyesyesyesyesyesyes
INSERT with SELECTyesyesyesyesyesyesyesyesyesyesyesyes
INSERT with ON DUPLICATE KEY UPDATEnoyes [1]nonoyes [1]noyesyes [1]nonoyes [1]yes [1]
INSERT with RETURNINGpartially [3]yes [4]partially [3]partially [3]yes [4]partially [3]yes [3]partially [4]yespartially [2]partially [3]partially [2]
SELECTyesyesyesyesyesyesyesyesyesyesyesyes
SELECT with CONNECT BYnononononononoyesnononono
SELECT with LIMIT .. OFFSETpartially [7]yes [8]yes [9]yes [10]yes [10]yes [9]yes [10]yes [11]yes [10]yes [10]yes [8]yes [12]
SELECT with FOR UPDATEyesyesyesyesyesyesyesyesyesnonoyes
SELECT with FOR UPDATE OF (field-list)noyesyesyesyesyesnoyesnononoyes
SELECT with FOR UPDATE OF (table-list)noyes [13]yes [13]yesyesyes [13]noyes [13]yesnonoyes
SELECT with FOR UPDATE WAIT, NOWAIT, SKIP LOCKEDnononononononoyesnononono
UPDATEyesyesyesyesyesyesyesyesyesyesyesyes
DELETEyesyesyesyesyesyesyesyesyesyesyesyes
MERGEnoyesnono [6]yesnonoyesnonoyesyes
MERGE (Oracle extensions)nononononononoyesnononono
TRUNCATEyesyesyesyesyesyes [14]yesyesyesyes [14]yesyes
Sequence CURRVALnoyesnoyesnoyesnoyesyesnonoyes
Sequence NEXTVALnoyesyesyesyesyesnoyesyesnonoyes
JDBC features
FeatureASEDB2DerbyH2HSQLDBIngresMySQLOraclePostgresSQLiteSQL ServerSybase
batch operationsyesyesyesyesyesyesyesyesyesyesyesyes
jOOQ features
FeatureASEDB2DerbyH2HSQLDBIngresMySQLOraclePostgresSQLiteSQL ServerSybase
CSV Data loaderyes [5]yesyes [5]yes [5]yesyes [5]yesyesyes [5]yes [5]yesyes
Functions
FeatureASEDB2DerbyH2HSQLDBIngresMySQLOraclePostgresSQLiteSQL ServerSybase
Last inserted IDyesnoyesyesyesyesyesnonoyesyesyes
- -
    -
  • [1] MySQL's INSERT .. ON DUPLICATE KEY UPDATE statement is simulated using an equivalent MERGE statement
  • -
  • [2] Postgres' INSERT .. RETURNING statement is simulated by fetching the last inserted ID explicitly with a new statement. Other fields than the ID are fetched with another statement. Client code must ensure transactional integrity between the three statements to prevent race conditions (e.g. set autocommit to off). This does not work for multi-record inserts.
  • -
  • [3] Postgres' INSERT .. RETURNING statement is simulated by using JDBC's PreparedStatement.getGeneratedKeys() functionality. Other fields than the ID are fetched with another statement. Client code must ensure transactional integrity between the two statements to prevent race conditions (e.g. set autocommit to off). This may not work for multi-record inserts in some dialects
  • -
  • [4] Postgres' INSERT .. RETURNING statement is simulated by using JDBC's PreparedStatement.getGeneratedKeys() functionality. All fields can be fetched in a single statement. This may not work for multi-record inserts in some dialects
  • -
  • [5] The loader API has an option to use MySQL's INSERT .. ON DUPLICATE KEY UPDATE statement, which only works in some dialects. See also [1]
  • -
  • [6] H2's MERGE statement is quite different from the SQL:2003 standard MERGE statement. It is currently not supported by jOOQ
  • -
  • [7] Sybase ASE has no means of specifying an OFFSET like other dialects. LIMIT is translated to the TOP clause
  • -
  • [8] DB2 knows a FIRST ROWS clause without OFFSET. SQL Server knows a TOP clause without OFFSET. LIMIT .. OFFSET is simulated using nested SELECT and filtering on ROW_NUMBER() OVER()
  • -
  • [9] Derby knows the OFFSET .. ROWS FETCH NEXT .. ROWS ONLY clause, Ingres has a similar OFFSET .. ROWS FETCH NEXT .. ROWS ONLY clause. They work just the same as [10]
  • -
  • [10] Many databases know the LIMIT .. OFFSET clause as declared in the jOOQ API
  • -
  • [11] Oracle has no native support for LIMIT .. OFFSET clauses. Instead, LIMIT .. OFFSET is simulated using nested SELECT and filtering on ROW_NUMBER() OVER()
  • -
  • [12] Sybase knows a TOP .. START AT .. clause that works just the same as [10]
  • -
  • [13] Some databases do not support a FOR UPDATE OF (table-list) clause. But jOOQ knows all columns in generated tables, hence jOOQ renders an appropriate FOR UPDATE OF (field-list) clause instead
  • -
  • [14] Some databases do not support a TRUNCATE statement. An equivalent DELETE statement is issued instead.
  • -
\ No newline at end of file diff --git a/jOOQ-website/index.php b/jOOQ-website/index.php deleted file mode 100644 index c5c21d9e07..0000000000 --- a/jOOQ-website/index.php +++ /dev/null @@ -1,196 +0,0 @@ - -

# Philosophy

-

SQL was never meant to be abstracted. To be confined in the narrow boundaries - of heavy mappers, hiding the beauty and simplicity of relational data. - SQL was never meant to be object-oriented. SQL was never meant to be - anything other than... SQL!

-

# What does jOOQ code look like?

-

It's simple. With the jOOQ DSL, SQL looks almost as if it were -natively supported by Java. For instance, get all books published in 2011, ordered by title

- - - - - - -
-  SELECT * FROM BOOK
-   WHERE PUBLISHED_IN = 2011
-ORDER BY TITLE
-create.selectFrom(BOOK)
-      .where(PUBLISHED_IN.equal(2011))
-      .orderBy(TITLE)
- -

jOOQ also supports more complex SQL statements. get all authors' - first and last names, and the number of books they've written in - German, if they have written more than five books in German in the last - three years (from 2011), and sort those authors by last names limiting - results to the second and third row, then lock first and last names - columns for update

- - - - - -
-  SELECT AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME, COUNT(*)
-    FROM AUTHOR
-    JOIN BOOK ON AUTHOR.ID = BOOK.AUTHOR_ID
-   WHERE BOOK.LANGUAGE = 'DE'
-     AND BOOK.PUBLISHED > DATE '2008-01-01'
-GROUP BY AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME
-  HAVING COUNT(*) > 5
-ORDER BY AUTHOR.LAST_NAME ASC NULLS FIRST
-   LIMIT 2
-  OFFSET 1
-     FOR UPDATE
-      OF AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME
-create.select(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME, count())
-      .from(AUTHOR)
-      .join(BOOK).on(AUTHOR.ID.equal(BOOK.AUTHOR_ID))
-      .where(BOOK.LANGUAGE.eq("DE"))
-      .and(BOOK.PUBLISHED.gt(date("2008-01-01")))
-      .groupBy(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
-      .having(count().gt(5))
-      .orderBy(AUTHOR.LAST_NAME.asc().nullsFirst())
-      .limit(2)
-      .offset(1)
-      .forUpdate()
-      .of(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
- -

# What does type safety mean to jOOQ?

-

SQL is a very type safe language. So is jOOQ. jOOQ uniquely respects SQL's row value expression typesafety. jOOQ will use your Java compiler to type-check the following:

- -
-select().from(t).where(t.a.eq(select(t2.x).from(t2));
-// Type-check here: ---------------> ^^^^
-select().from(t).where(t.a.eq(any(select(t2.x).from(t2)));
-// Type-check here: -------------------> ^^^^
-select().from(t).where(t.a.in(select(t2.x).from(t2));
-// Type-check here: ---------------> ^^^^
-
- -

And also set operations:

- -
-select(t1.a, t1.b).from(t1).union(select(t2.a, t2.b).from(t2));
-// Type-check here: -------------------> ^^^^^^^^^^
-
- -

And even row value expressions:

- - - - - - -
-SELECT * FROM t WHERE (t.a, t.b) = (1, 2)
-
-SELECT * FROM t WHERE (t.a, t.b) OVERLAPS (date1, date2)
-
-SELECT * FROM t WHERE (t.a, t.b) IN (SELECT x, y FROM t2)
-
-UPDATE t SET (a, b) = (SELECT x, y FROM t2 WHERE ...)
-
-INSERT INTO t (a, b) VALUES (1, 2)
- 
-
-select().from(t).where(row(t.a, t.b).eq(1, 2));
-// Type-check here: ----------------->  ^^^^
-select().from(t).where(row(t.a, t.b).overlaps(date1, date2));
-// Type-check here: ------------------------> ^^^^^^^^^^^^
-select().from(t).where(row(t.a, t.b).in(select(t2.x, t2.y).from(t2)));
-// Type-check here: -------------------------> ^^^^^^^^^^
-update(t).set(row(t.a, t.b), select(t2.x, t2.y).where(...));
-// Type-check here: --------------> ^^^^^^^^^^
-insertInto(t, t.a, t.b).values(1, 2);
-// Type-check here: ---------> ^^^^
-
- -

# What is jOOQ?

-

jOOQ stands for Java Object Oriented Querying. It combines these essential features:

- -
    -
  • Code Generation: jOOQ generates a simple Java representation of your database schema. Every table, view, stored procedure, enum, UDT is a class.
  • -
  • Active records: jOOQ implements an easy-to-use active record pattern. It is NOT an OR-mapper, but provides a 1:1 mapping between tables/views and classes. Between columns and members.
  • -
  • Typesafe SQL: jOOQ allows for writing compile-time typesafe querying using its built-in fluent API.
  • -
  • SQL standard: jOOQ supports all standard SQL language features including the more complex UNION's, nested SELECTs, joins, aliasing
  • -
  • Vendor-specific feature support: jOOQ encourages the use of vendor-specific extensions such as stored procedures, UDT's and ARRAY's, recursive queries, and many more.
  • -
- -

# How does jOOQ help you?

-
    -
  • Your database always comes FIRST! That's where the schema is, not in your Java code or some XML mapping file.
  • -
  • Your schema is generated in Java. You can use auto-completion in your IDE!
  • -
  • Your "value objects" or "data transfer objects" are generated too. This keeps things DRY
  • -
  • Your Java code won't compile anymore when you modify your schema. That means less runtime errors.
  • -
  • You and your DBA can be friends again because you have full control over your SQL.
  • -
  • You can port your SQL to a new database. jOOQ will generate SQL that works on any database.
  • -
  • You won't have syntax errors in your query.
  • -
  • You won't forget to bind variables correctly. No SQL injection, either.
  • -
  • You can forget about JDBC's verbosity (especially useful when dealing with UDTs, ARRAYs and stored procedures).
  • -
-

Or in short:

-
    -
  • You can be productive again!
  • -
- -

# What databases are supported

-

Every RDMBS out there has its own little specialties. - jOOQ considers those specialties as much as possible, while trying to - standardise the behaviour in the API. In order to maintain a very high level of quality, - some 140 unit tests are run for syntax and variable binding verification, - as well as some 300 integration tests with an overall of around 2000 queries for any - of these databases:

-
    -
  • CUBRID 8.4.1 and 9.1.0
  • -
  • DB2 9.7
  • -
  • Derby 10.10
  • -
  • Firebird 2.5.1
  • -
  • H2 1.3.161
  • -
  • HSQLDB 2.2.5
  • -
  • Ingres 10.1.0
  • -
  • MariaDB 5.2.14
  • -
  • MySQL 5.1.41 and 5.5.8
  • -
  • Oracle XE 10.2.0.1.0 and 11g
  • -
  • PostgreSQL 9.0
  • -
  • SQLite (using xerial sqlite-jdbc)
  • -
  • SQL Server 2008 R8 and 2012 (with sqljdbc4 or jTDS JDBC drivers)
  • -
  • Sybase Adaptive Server Enterprise 15.5
  • -
  • Sybase SQL Anywhere 12 (with jconn3 or jTDS JDCB drivers)
  • -
-

These platforms have been observed to work as well, but are not integration-tested

-
    -
  • Google Cloud SQL (MySQL)
  • -
- -

# Other requirements

-

jOOQ runs with Java 1.6+

- -

License

-

jOOQ is licensed under the Apache Software License 2.0

- - -

Thanks

-

YourKit is kindly supporting open source projects with its -full-featured Java Profiler. YourKit, LLC is the creator of innovative -and intelligent tools for profiling Java and .NET applications. Take a -look at YourKit's leading software products: YourKit Java -Profiler and YourKit .NET -Profiler.

- \ No newline at end of file diff --git a/jOOQ-website/js/jquery.cookie.js b/jOOQ-website/js/jquery.cookie.js deleted file mode 100644 index 32badc56d7..0000000000 --- a/jOOQ-website/js/jquery.cookie.js +++ /dev/null @@ -1,95 +0,0 @@ -/*! - * jQuery Cookie Plugin v1.3.1 - * https://github.com/carhartl/jquery-cookie - * - * Copyright 2013 Klaus Hartl - * Released under the MIT license - */ -(function (factory) { - if (typeof define === 'function' && define.amd) { - // AMD. Register as anonymous module. - define(['jquery'], factory); - } else { - // Browser globals. - factory(jQuery); - } -}(function ($) { - - var pluses = /\+/g; - - function raw(s) { - return s; - } - - function decoded(s) { - return decodeURIComponent(s.replace(pluses, ' ')); - } - - function converted(s) { - if (s.indexOf('"') === 0) { - // This is a quoted cookie as according to RFC2068, unescape - s = s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\'); - } - try { - return config.json ? JSON.parse(s) : s; - } catch(er) {} - } - - var config = $.cookie = function (key, value, options) { - - // write - if (value !== undefined) { - options = $.extend({}, config.defaults, options); - - if (typeof options.expires === 'number') { - var days = options.expires, t = options.expires = new Date(); - t.setDate(t.getDate() + days); - } - - value = config.json ? JSON.stringify(value) : String(value); - - return (document.cookie = [ - config.raw ? key : encodeURIComponent(key), - '=', - config.raw ? value : encodeURIComponent(value), - options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE - options.path ? '; path=' + options.path : '', - options.domain ? '; domain=' + options.domain : '', - options.secure ? '; secure' : '' - ].join('')); - } - - // read - var decode = config.raw ? raw : decoded; - var cookies = document.cookie.split('; '); - var result = key ? undefined : {}; - for (var i = 0, l = cookies.length; i < l; i++) { - var parts = cookies[i].split('='); - var name = decode(parts.shift()); - var cookie = decode(parts.join('=')); - - if (key && key === name) { - result = converted(cookie); - break; - } - - if (!key) { - result[name] = converted(cookie); - } - } - - return result; - }; - - config.defaults = {}; - - $.removeCookie = function (key, options) { - if ($.cookie(key) !== undefined) { - // Must not alter options, thus extending a fresh object... - $.cookie(key, '', $.extend({}, options, { expires: -1 })); - return true; - } - return false; - }; - -})); \ No newline at end of file diff --git a/jOOQ-website/js/jquery.js b/jOOQ-website/js/jquery.js deleted file mode 100644 index 45bb4fc1f1..0000000000 --- a/jOOQ-website/js/jquery.js +++ /dev/null @@ -1,4 +0,0 @@ -/*! jQuery v1.7.2 jquery.com | jquery.org/license */ -(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cu(a){if(!cj[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ck||(ck=c.createElement("iframe"),ck.frameBorder=ck.width=ck.height=0),b.appendChild(ck);if(!cl||!ck.createElement)cl=(ck.contentWindow||ck.contentDocument).document,cl.write((f.support.boxModel?"":"")+""),cl.close();d=cl.createElement(a),cl.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ck)}cj[a]=e}return cj[a]}function ct(a,b){var c={};f.each(cp.concat.apply([],cp.slice(0,b)),function(){c[this]=a});return c}function cs(){cq=b}function cr(){setTimeout(cs,0);return cq=f.now()}function ci(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ch(){try{return new a.XMLHttpRequest}catch(b){}}function cb(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){if(c!=="border")for(;e=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?+d:j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){if(typeof c!="string"||!c)return null;var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c
a",d=p.getElementsByTagName("*"),e=p.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=p.getElementsByTagName("input")[0],b={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:p.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,pixelMargin:!0},f.boxModel=b.boxModel=c.compatMode==="CSS1Compat",i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete p.test}catch(r){b.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",function(){b.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),i.setAttribute("name","t"),p.appendChild(i),j=c.createDocumentFragment(),j.appendChild(p.lastChild),b.checkClone=j.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,j.removeChild(i),j.appendChild(p);if(p.attachEvent)for(n in{submit:1,change:1,focusin:1})m="on"+n,o=m in p,o||(p.setAttribute(m,"return;"),o=typeof p[m]=="function"),b[n+"Bubbles"]=o;j.removeChild(p),j=g=h=p=i=null,f(function(){var d,e,g,h,i,j,l,m,n,q,r,s,t,u=c.getElementsByTagName("body")[0];!u||(m=1,t="padding:0;margin:0;border:",r="position:absolute;top:0;left:0;width:1px;height:1px;",s=t+"0;visibility:hidden;",n="style='"+r+t+"5px solid #000;",q="
"+""+"
",d=c.createElement("div"),d.style.cssText=s+"width:0;height:0;position:static;top:0;margin-top:"+m+"px",u.insertBefore(d,u.firstChild),p=c.createElement("div"),d.appendChild(p),p.innerHTML="
t
",k=p.getElementsByTagName("td"),o=k[0].offsetHeight===0,k[0].style.display="",k[1].style.display="none",b.reliableHiddenOffsets=o&&k[0].offsetHeight===0,a.getComputedStyle&&(p.innerHTML="",l=c.createElement("div"),l.style.width="0",l.style.marginRight="0",p.style.width="2px",p.appendChild(l),b.reliableMarginRight=(parseInt((a.getComputedStyle(l,null)||{marginRight:0}).marginRight,10)||0)===0),typeof p.style.zoom!="undefined"&&(p.innerHTML="",p.style.width=p.style.padding="1px",p.style.border=0,p.style.overflow="hidden",p.style.display="inline",p.style.zoom=1,b.inlineBlockNeedsLayout=p.offsetWidth===3,p.style.display="block",p.style.overflow="visible",p.innerHTML="
",b.shrinkWrapBlocks=p.offsetWidth!==3),p.style.cssText=r+s,p.innerHTML=q,e=p.firstChild,g=e.firstChild,i=e.nextSibling.firstChild.firstChild,j={doesNotAddBorder:g.offsetTop!==5,doesAddBorderForTableAndCells:i.offsetTop===5},g.style.position="fixed",g.style.top="20px",j.fixedPosition=g.offsetTop===20||g.offsetTop===15,g.style.position=g.style.top="",e.style.overflow="hidden",e.style.position="relative",j.subtractsBorderForOverflowNotVisible=g.offsetTop===-5,j.doesNotIncludeMarginInBodyOffset=u.offsetTop!==m,a.getComputedStyle&&(p.style.marginTop="1%",b.pixelMargin=(a.getComputedStyle(p,null)||{marginTop:0}).marginTop!=="1%"),typeof d.style.zoom!="undefined"&&(d.style.zoom=1),u.removeChild(d),l=p=d=null,f.extend(b,j))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e1,null,!1)},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){var d=2;typeof a!="string"&&(c=a,a="fx",d--);if(arguments.length1)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,f.prop,a,b,arguments.length>1)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.type]||f.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.type]||f.valHooks[g.nodeName.toLowerCase()];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h,i=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;i=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/(?:^|\s)hover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function( -a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler,g=p.selector),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;le&&j.push({elem:this,matches:d.slice(e)});for(k=0;k0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));o.match.globalPOS=p;var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0)for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/]","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div
","
"]),f.fn.extend({text:function(a){return f.access(this,function(a){return a===b?f.text(this):this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f -.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){return f.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(;d1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||f.isXMLDoc(a)||!bc.test("<"+a.nodeName+">")?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g,h,i,j=[];b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);for(var k=0,l;(l=a[k])!=null;k++){typeof l=="number"&&(l+="");if(!l)continue;if(typeof l=="string")if(!_.test(l))l=b.createTextNode(l);else{l=l.replace(Y,"<$1>");var m=(Z.exec(l)||["",""])[1].toLowerCase(),n=bg[m]||bg._default,o=n[0],p=b.createElement("div"),q=bh.childNodes,r;b===c?bh.appendChild(p):U(b).appendChild(p),p.innerHTML=n[1]+l+n[2];while(o--)p=p.lastChild;if(!f.support.tbody){var s=$.test(l),t=m==="table"&&!s?p.firstChild&&p.firstChild.childNodes:n[1]===""&&!s?p.childNodes:[];for(i=t.length-1;i>=0;--i)f.nodeName(t[i],"tbody")&&!t[i].childNodes.length&&t[i].parentNode.removeChild(t[i])}!f.support.leadingWhitespace&&X.test(l)&&p.insertBefore(b.createTextNode(X.exec(l)[0]),p.firstChild),l=p.childNodes,p&&(p.parentNode.removeChild(p),q.length>0&&(r=q[q.length-1],r&&r.parentNode&&r.parentNode.removeChild(r)))}var u;if(!f.support.appendChecked)if(l[0]&&typeof (u=l.length)=="number")for(i=0;i1)},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=by(a,"opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bu.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(by)return by(a,c)},swap:function(a,b,c){var d={},e,f;for(f in b)d[f]=a.style[f],a.style[f]=b[f];e=c.call(a);for(f in b)a.style[f]=d[f];return e}}),f.curCSS=f.css,c.defaultView&&c.defaultView.getComputedStyle&&(bz=function(a,b){var c,d,e,g,h=a.style;b=b.replace(br,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b))),!f.support.pixelMargin&&e&&bv.test(b)&&bt.test(c)&&(g=h.width,h.width=c,c=e.width,h.width=g);return c}),c.documentElement.currentStyle&&(bA=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f==null&&g&&(e=g[b])&&(f=e),bt.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),by=bz||bA,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0?bB(a,b,d):f.swap(a,bw,function(){return bB(a,b,d)})},set:function(a,b){return bs.test(b)?b+"px":b}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bq.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bp,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bp.test(g)?g.replace(bp,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){return f.swap(a,{display:"inline-block"},function(){return b?by(a,"margin-right"):a.style.marginRight})}})}),f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)}),f.each({margin:"",padding:"",border:"Width"},function(a,b){f.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bx[d]+b]=e[d]||e[d-2]||e[0];return f}}});var bC=/%20/g,bD=/\[\]$/,bE=/\r?\n/g,bF=/#.*$/,bG=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bH=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bI=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bJ=/^(?:GET|HEAD)$/,bK=/^\/\//,bL=/\?/,bM=/)<[^<]*)*<\/script>/gi,bN=/^(?:select|textarea)/i,bO=/\s+/,bP=/([?&])_=[^&]*/,bQ=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bR=f.fn.load,bS={},bT={},bU,bV,bW=["*/"]+["*"];try{bU=e.href}catch(bX){bU=c.createElement("a"),bU.href="",bU=bU.href}bV=bQ.exec(bU.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bR)return bR.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bM,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bN.test(this.nodeName)||bH.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bE,"\r\n")}}):{name:b.name,value:c.replace(bE,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b$(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b$(a,b);return a},ajaxSettings:{url:bU,isLocal:bI.test(bV[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bW},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bY(bS),ajaxTransport:bY(bT),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?ca(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cb(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bG.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bF,"").replace(bK,bV[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bO),d.crossDomain==null&&(r=bQ.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bV[1]&&r[2]==bV[2]&&(r[3]||(r[1]==="http:"?80:443))==(bV[3]||(bV[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bZ(bS,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bJ.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bL.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bP,"$1_="+x);d.url=y+(y===d.url?(bL.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bW+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bZ(bT,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)b_(g,a[g],c,e);return d.join("&").replace(bC,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cc=f.now(),cd=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cc++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=typeof b.data=="string"&&/^application\/x\-www\-form\-urlencoded/.test(b.contentType);if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(cd.test(b.url)||e&&cd.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(cd,l),b.url===j&&(e&&(k=k.replace(cd,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var ce=a.ActiveXObject?function(){for(var a in cg)cg[a](0,1)}:!1,cf=0,cg;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ch()||ci()}:ch,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,ce&&delete cg[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n);try{m.text=h.responseText}catch(a){}try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cf,ce&&(cg||(cg={},f(a).unload(ce)),cg[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cj={},ck,cl,cm=/^(?:toggle|show|hide)$/,cn=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,co,cp=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cq;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(ct("show",3),a,b,c);for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);f.fn[a]=function(e){return f.access(this,function(a,e,g){var h=cy(a);if(g===b)return h?c in h?h[c]:f.support.boxModel&&h.document.documentElement[e]||h.document.body[e]:a[e];h?h.scrollTo(d?f(h).scrollLeft():g,d?g:f(h).scrollTop()):a[e]=g},a,e,arguments.length,null)}}),f.each({Height:"height",Width:"width"},function(a,c){var d="client"+a,e="scroll"+a,g="offset"+a;f.fn["inner"+a]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,c,"padding")):this[c]():null},f.fn["outer"+a]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,c,a?"margin":"border")):this[c]():null},f.fn[c]=function(a){return f.access(this,function(a,c,h){var i,j,k,l;if(f.isWindow(a)){i=a.document,j=i.documentElement[d];return f.support.boxModel&&j||i.body&&i.body[d]||j}if(a.nodeType===9){i=a.documentElement;if(i[d]>=i[e])return i[d];return Math.max(a.body[e],i[e],a.body[g],i[g])}if(h===b){k=f.css(a,c),l=parseFloat(k);return f.isNumeric(l)?l:k}f(a).css(c,h)},c,a,arguments.length,null)}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window); \ No newline at end of file diff --git a/jOOQ-website/js/jquery.modal.js b/jOOQ-website/js/jquery.modal.js deleted file mode 100644 index 130cc65efd..0000000000 --- a/jOOQ-website/js/jquery.modal.js +++ /dev/null @@ -1,187 +0,0 @@ -/* - A simple jQuery modal (http://github.com/kylefox/jquery-modal) - Version 0.5.3 -*/ -(function($) { - - var current = null; - - $.modal = function(el, options) { - $.modal.close(); // Close any open modals. - var remove, target; - this.$body = $('body'); - this.options = $.extend({}, $.modal.defaults, options); - if (el.is('a')) { - target = el.attr('href'); - //Select element by id from href - if (/^#/.test(target)) { - this.$elm = $(target); - if (this.$elm.length !== 1) return null; - this.open(); - //AJAX - } else { - this.$elm = $('
'); - this.$body.append(this.$elm); - remove = function(event, modal) { modal.elm.remove(); }; - this.showSpinner(); - el.trigger($.modal.AJAX_SEND); - $.get(target).done(function(html) { - if (!current) return; - el.trigger($.modal.AJAX_SUCCESS); - current.$elm.empty().append(html).on($.modal.CLOSE, remove); - current.hideSpinner(); - current.open(); - el.trigger($.modal.AJAX_COMPLETE); - }).fail(function() { - el.trigger($.modal.AJAX_FAIL); - current.hideSpinner(); - el.trigger($.modal.AJAX_COMPLETE); - }); - } - } else { - this.$elm = el; - this.open(); - } - }; - - $.modal.prototype = { - constructor: $.modal, - - open: function() { - this.block(); - this.show(); - if (this.options.escapeClose) { - $(document).on('keydown.modal', function(event) { - if (event.which == 27) $.modal.close(); - }); - } - if (this.options.clickClose) this.blocker.click($.modal.close); - }, - - close: function() { - this.unblock(); - this.hide(); - $(document).off('keydown.modal'); - }, - - block: function() { - this.$elm.trigger($.modal.BEFORE_BLOCK, [this._ctx()]); - this.blocker = $('
').css({ - top: 0, right: 0, bottom: 0, left: 0, - width: "100%", height: "100%", - position: "fixed", - zIndex: this.options.zIndex, - background: this.options.overlay, - opacity: this.options.opacity - }); - this.$body.append(this.blocker); - this.$elm.trigger($.modal.BLOCK, [this._ctx()]); - }, - - unblock: function() { - this.blocker.remove(); - }, - - show: function() { - this.$elm.trigger($.modal.BEFORE_OPEN, [this._ctx()]); - if (this.options.showClose) { - this.closeButton = $('' + this.options.closeText + ''); - this.$elm.append(this.closeButton); - } - this.$elm.addClass(this.options.modalClass + ' current'); - this.center(); - this.$elm.show().trigger($.modal.OPEN, [this._ctx()]); - }, - - hide: function() { - this.$elm.trigger($.modal.BEFORE_CLOSE, [this._ctx()]); - if (this.closeButton) this.closeButton.remove(); - this.$elm.removeClass('current').hide(); - this.$elm.trigger($.modal.CLOSE, [this._ctx()]); - }, - - showSpinner: function() { - if (!this.options.showSpinner) return; - this.spinner = this.spinner || $('
') - .append(this.options.spinnerHtml); - this.$body.append(this.spinner); - this.spinner.show(); - }, - - hideSpinner: function() { - if (this.spinner) this.spinner.remove(); - }, - - center: function() { - this.$elm.css({ - position: 'fixed', - top: "50%", - left: "50%", - marginTop: - (this.$elm.outerHeight() / 2), - marginLeft: - (this.$elm.outerWidth() / 2), - zIndex: this.options.zIndex + 1 - }); - }, - - //Return context for custom events - _ctx: function() { - return { elm: this.$elm, blocker: this.blocker, options: this.options }; - } - }; - - //resize is alias for center for now - $.modal.prototype.resize = $.modal.prototype.center; - - $.modal.close = function(event) { - if (!current) return; - if (event) event.preventDefault(); - current.close(); - var that = current.$elm; - current = null; - return that; - }; - - $.modal.resize = function() { - if (!current) return; - current.resize(); - }; - - $.modal.defaults = { - overlay: "#000", - opacity: 0.75, - zIndex: 1, - escapeClose: true, - clickClose: true, - closeText: 'Close', - modalClass: "modal", - spinnerHtml: null, - showSpinner: true, - showClose: true - }; - - // Event constants - $.modal.BEFORE_BLOCK = 'modal:before-block'; - $.modal.BLOCK = 'modal:block'; - $.modal.BEFORE_OPEN = 'modal:before-open'; - $.modal.OPEN = 'modal:open'; - $.modal.BEFORE_CLOSE = 'modal:before-close'; - $.modal.CLOSE = 'modal:close'; - $.modal.AJAX_SEND = 'modal:ajax:send'; - $.modal.AJAX_SUCCESS = 'modal:ajax:success'; - $.modal.AJAX_FAIL = 'modal:ajax:fail'; - $.modal.AJAX_COMPLETE = 'modal:ajax:complete'; - - $.fn.modal = function(options){ - if (this.length === 1) { - current = new $.modal(this, options); - } - return this; - }; - - // Automatically bind links with rel="modal:close" to, well, close the modal. - $(document).on('click.modal', 'a[rel="modal:close"]', $.modal.close); - $(document).on('click.modal', 'a[rel="modal:open"]', function(event) { - event.preventDefault(); - $(this).modal(); - }); -})(jQuery); \ No newline at end of file diff --git a/jOOQ-website/js/prettify/lang-apollo.js b/jOOQ-website/js/prettify/lang-apollo.js deleted file mode 100644 index c834573272..0000000000 --- a/jOOQ-website/js/prettify/lang-apollo.js +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright (C) 2009 Onno Hommes. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - - -/** - * @fileoverview - * Registers a language handler for the AGC/AEA Assembly Language as described - * at http://virtualagc.googlecode.com - *

- * This file could be used by goodle code to allow syntax highlight for - * Virtual AGC SVN repository or if you don't want to commonize - * the header for the agc/aea html assembly listing. - * - * @author ohommes@alumni.cmu.edu - */ - -PR['registerLangHandler']( - PR['createSimpleLexer']( - [ - // A line comment that starts with ; - [PR['PR_COMMENT'], /^#[^\r\n]*/, null, '#'], - // Whitespace - [PR['PR_PLAIN'], /^[\t\n\r \xA0]+/, null, '\t\n\r \xA0'], - // A double quoted, possibly multi-line, string. - [PR['PR_STRING'], /^\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)/, null, '"'] - ], - [ - [PR['PR_KEYWORD'], /^(?:ADS|AD|AUG|BZF|BZMF|CAE|CAF|CA|CCS|COM|CS|DAS|DCA|DCOM|DCS|DDOUBL|DIM|DOUBLE|DTCB|DTCF|DV|DXCH|EDRUPT|EXTEND|INCR|INDEX|NDX|INHINT|LXCH|MASK|MSK|MP|MSU|NOOP|OVSK|QXCH|RAND|READ|RELINT|RESUME|RETURN|ROR|RXOR|SQUARE|SU|TCR|TCAA|OVSK|TCF|TC|TS|WAND|WOR|WRITE|XCH|XLQ|XXALQ|ZL|ZQ|ADD|ADZ|SUB|SUZ|MPY|MPR|MPZ|DVP|COM|ABS|CLA|CLZ|LDQ|STO|STQ|ALS|LLS|LRS|TRA|TSQ|TMI|TOV|AXT|TIX|DLY|INP|OUT)\s/,null], - [PR['PR_TYPE'], /^(?:-?GENADR|=MINUS|2BCADR|VN|BOF|MM|-?2CADR|-?[1-6]DNADR|ADRES|BBCON|[SE]?BANK\=?|BLOCK|BNKSUM|E?CADR|COUNT\*?|2?DEC\*?|-?DNCHAN|-?DNPTR|EQUALS|ERASE|MEMORY|2?OCT|REMADR|SETLOC|SUBRO|ORG|BSS|BES|SYN|EQU|DEFINE|END)\s/,null], - // A single quote possibly followed by a word that optionally ends with - // = ! or ?. - [PR['PR_LITERAL'], - /^\'(?:-*(?:\w|\\[\x21-\x7e])(?:[\w-]*|\\[\x21-\x7e])[=!?]?)?/], - // Any word including labels that optionally ends with = ! or ?. - [PR['PR_PLAIN'], - /^-*(?:[!-z_]|\\[\x21-\x7e])(?:[\w-]*|\\[\x21-\x7e])[=!?]?/i], - // A printable non-space non-special character - [PR['PR_PUNCTUATION'], /^[^\w\t\n\r \xA0()\"\\\';]+/] - ]), - ['apollo', 'agc', 'aea']); diff --git a/jOOQ-website/js/prettify/lang-basic.js b/jOOQ-website/js/prettify/lang-basic.js deleted file mode 100644 index 7072bdb5b5..0000000000 --- a/jOOQ-website/js/prettify/lang-basic.js +++ /dev/null @@ -1,32 +0,0 @@ -// Contributed by peter dot kofler at code minus cop dot org - -/** - * @fileoverview - * Registers a language handler for Basic. - * - * To use, include prettify.js and this file in your HTML page. - * Then put your code in an HTML tag like - *

(my BASIC code)
- * - * @author peter dot kofler at code minus cop dot org - */ - -PR.registerLangHandler( - PR.createSimpleLexer( - [ // shortcutStylePatterns - // "single-line-string" - [PR.PR_STRING, /^(?:"(?:[^\\"\r\n]|\\.)*(?:"|$))/, null, '"'], - // Whitespace - [PR.PR_PLAIN, /^\s+/, null, ' \r\n\t\xA0'] - ], - [ // fallthroughStylePatterns - // A line comment that starts with REM - [PR.PR_COMMENT, /^REM[^\r\n]*/, null], - [PR.PR_KEYWORD, /^\b(?:AND|CLOSE|CLR|CMD|CONT|DATA|DEF ?FN|DIM|END|FOR|GET|GOSUB|GOTO|IF|INPUT|LET|LIST|LOAD|NEW|NEXT|NOT|ON|OPEN|OR|POKE|PRINT|READ|RESTORE|RETURN|RUN|SAVE|STEP|STOP|SYS|THEN|TO|VERIFY|WAIT)\b/, null], - [PR.PR_PLAIN, /^[A-Z][A-Z0-9]?(?:\$|%)?/i, null], - // Literals .0, 0, 0.0 0E13 - [PR.PR_LITERAL, /^(?:\d+(?:\.\d*)?|\.\d+)(?:e[+\-]?\d+)?/i, null, '0123456789'], - [PR.PR_PUNCTUATION, /^.[^\s\w\.$%"]*/, null] - // [PR.PR_PUNCTUATION, /^[-,:;!<>=\+^\/\*]+/] - ]), - ['basic','cbm']); diff --git a/jOOQ-website/js/prettify/lang-clj.js b/jOOQ-website/js/prettify/lang-clj.js deleted file mode 100644 index 24da44a5f7..0000000000 --- a/jOOQ-website/js/prettify/lang-clj.js +++ /dev/null @@ -1,64 +0,0 @@ -/** - * @license Copyright (C) 2011 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview - * Registers a language handler for Clojure. - * - * - * To use, include prettify.js and this file in your HTML page. - * Then put your code in an HTML tag like - *
(my lisp code)
- * The lang-cl class identifies the language as common lisp. - * This file supports the following language extensions: - * lang-clj - Clojure - * - * - * I used lang-lisp.js as the basis for this adding the clojure specific - * keywords and syntax. - * - * "Name" = 'Clojure' - * "Author" = 'Rich Hickey' - * "Version" = '1.2' - * "About" = 'Clojure is a lisp for the jvm with concurrency primitives and a richer set of types.' - * - * - * I used Clojure.org Reference as - * the basis for the reserved word list. - * - * - * @author jwall@google.com - */ - -PR['registerLangHandler']( - PR['createSimpleLexer']( - [ - // clojure has more paren types than minimal lisp. - ['opn', /^[\(\{\[]+/, null, '([{'], - ['clo', /^[\)\}\]]+/, null, ')]}'], - // A line comment that starts with ; - [PR['PR_COMMENT'], /^;[^\r\n]*/, null, ';'], - // Whitespace - [PR['PR_PLAIN'], /^[\t\n\r \xA0]+/, null, '\t\n\r \xA0'], - // A double quoted, possibly multi-line, string. - [PR['PR_STRING'], /^\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)/, null, '"'] - ], - [ - // clojure has a much larger set of keywords - [PR['PR_KEYWORD'], /^(?:def|if|do|let|quote|var|fn|loop|recur|throw|try|monitor-enter|monitor-exit|defmacro|defn|defn-|macroexpand|macroexpand-1|for|doseq|dosync|dotimes|and|or|when|not|assert|doto|proxy|defstruct|first|rest|cons|defprotocol|deftype|defrecord|reify|defmulti|defmethod|meta|with-meta|ns|in-ns|create-ns|import|intern|refer|alias|namespace|resolve|ref|deref|refset|new|set!|memfn|to-array|into-array|aset|gen-class|reduce|map|filter|find|nil?|empty?|hash-map|hash-set|vec|vector|seq|flatten|reverse|assoc|dissoc|list|list?|disj|get|union|difference|intersection|extend|extend-type|extend-protocol|prn)\b/, null], - [PR['PR_TYPE'], /^:[0-9a-zA-Z\-]+/] - ]), - ['clj']); diff --git a/jOOQ-website/js/prettify/lang-css.js b/jOOQ-website/js/prettify/lang-css.js deleted file mode 100644 index 39cbfc2250..0000000000 --- a/jOOQ-website/js/prettify/lang-css.js +++ /dev/null @@ -1,159 +0,0 @@ -// Copyright (C) 2009 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - - - -/** - * @fileoverview - * Registers a language handler for CSS. - * - * - * To use, include prettify.js and this file in your HTML page. - * Then put your code in an HTML tag like - *

- *
- *
- * http://www.w3.org/TR/CSS21/grammar.html Section G2 defines the lexical
- * grammar.  This scheme does not recognize keywords containing escapes.
- *
- * @author mikesamuel@gmail.com
- */
-
-// This file is a call to a function defined in prettify.js which defines a
-// lexical scanner for CSS and maps tokens to styles.
-
-// The call to PR['registerLangHandler'] is quoted so that Closure Compiler
-// will not rename the call so that this language extensions can be
-// compiled/minified separately from one another.  Other symbols defined in
-// prettify.js are similarly quoted.
-
-// The call is structured thus:
-// PR['registerLangHandler'](
-//    PR['createSimpleLexer'](
-//        shortcutPatterns,
-//        fallThroughPatterns),
-//    [languageId0, ..., languageIdN])
-
-// Langugage IDs
-// =============
-// The language IDs are typically the file extensions of source files for
-// that language so that users can syntax highlight arbitrary files based
-// on just the extension.  This is heuristic, but works pretty well in
-// practice.
-
-// Patterns
-// ========
-// Lexers are typically implemented as a set of regular expressions.
-// The SimpleLexer function takes regular expressions, styles, and some
-// pragma-info and produces a lexer.  A token description looks like
-//   [STYLE_NAME, /regular-expression/, pragmas]
-
-// Initially, simple lexer's inner loop looked like:
-
-//    while sourceCode is not empty:
-//      try each regular expression in order until one matches
-//      remove the matched portion from sourceCode
-
-// This was really slow for large files because some JS interpreters
-// do a buffer copy on the matched portion which is O(n*n)
-
-// The current loop now looks like
-
-//    1. use js-modules/combinePrefixPatterns.js to 
-//       combine all regular expressions into one 
-//    2. use a single global regular expresion match to extract all tokens
-//    3. for each token try regular expressions in order until one matches it
-//       and classify it using the associated style
-
-// This is a lot more efficient but it does mean that lookahead and lookbehind
-// can't be used across boundaries to classify tokens.
-
-// Sometimes we need lookahead and lookbehind and sometimes we want to handle
-// embedded language -- JavaScript or CSS embedded in HTML, or inline assembly
-// in C.
-
-// If a particular pattern has a numbered group, and its style pattern starts
-// with "lang-" as in
-//    ['lang-js', /}
- * 
  • define style rules. See the example page for examples. - *
  • mark the {@code
    } and {@code } tags in your source with
    - *    {@code class=prettyprint.}
    - *    You can also use the (html deprecated) {@code } tag, but the pretty
    - *    printer needs to do more substantial DOM manipulations to support that, so
    - *    some css styles may not be preserved.
    - * </ol>
    - * That's it.  I wanted to keep the API as simple as possible, so there's no
    - * need to specify which language the code is in, but if you wish, you can add
    - * another class to the {@code <pre>} or {@code <code>} element to specify the
    - * language, as in {@code <pre class="prettyprint lang-java">}.  Any class that
    - * starts with "lang-" followed by a file extension, specifies the file type.
    - * See the "lang-*.js" files in this directory for code that implements
    - * per-language file handlers.
    - * <p>
    - * Change log:<br>
    - * cbeust, 2006/08/22
    - * <blockquote>
    - *   Java annotations (start with "@") are now captured as literals ("lit")
    - * </blockquote>
    - * @requires console
    - */
    -
    -// JSLint declarations
    -/*global console, document, navigator, setTimeout, window, define */
    -
    -/** @define {boolean} */
    -var IN_GLOBAL_SCOPE = true;
    -
    -/**
    - * Split {@code prettyPrint} into multiple timeouts so as not to interfere with
    - * UI events.
    - * If set to {@code false}, {@code prettyPrint()} is synchronous.
    - */
    -window['PR_SHOULD_USE_CONTINUATION'] = true;
    -
    -/**
    - * Pretty print a chunk of code.
    - * @param {string} sourceCodeHtml The HTML to pretty print.
    - * @param {string} opt_langExtension The language name to use.
    - *     Typically, a filename extension like 'cpp' or 'java'.
    - * @param {number|boolean} opt_numberLines True to number lines,
    - *     or the 1-indexed number of the first line in sourceCodeHtml.
    - * @return {string} code as html, but prettier
    - */
    -var prettyPrintOne;
    -/**
    - * Find all the {@code <pre>} and {@code <code>} tags in the DOM with
    - * {@code class=prettyprint} and prettify them.
    - *
    - * @param {Function} opt_whenDone called when prettifying is done.
    - * @param {HTMLElement|HTMLDocument} opt_root an element or document
    - *   containing all the elements to pretty print.
    - *   Defaults to {@code document.body}.
    - */
    -var prettyPrint;
    -
    -
    -(function () {
    -  var win = window;
    -  // Keyword lists for various languages.
    -  // We use things that coerce to strings to make them compact when minified
    -  // and to defeat aggressive optimizers that fold large string constants.
    -  var FLOW_CONTROL_KEYWORDS = ["break,continue,do,else,for,if,return,while"];
    -  var C_KEYWORDS = [FLOW_CONTROL_KEYWORDS,"auto,case,char,const,default," + 
    -      "double,enum,extern,float,goto,inline,int,long,register,short,signed," +
    -      "sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];
    -  var COMMON_KEYWORDS = [C_KEYWORDS,"catch,class,delete,false,import," +
    -      "new,operator,private,protected,public,this,throw,true,try,typeof"];
    -  var CPP_KEYWORDS = [COMMON_KEYWORDS,"alignof,align_union,asm,axiom,bool," +
    -      "concept,concept_map,const_cast,constexpr,decltype,delegate," +
    -      "dynamic_cast,explicit,export,friend,generic,late_check," +
    -      "mutable,namespace,nullptr,property,reinterpret_cast,static_assert," +
    -      "static_cast,template,typeid,typename,using,virtual,where"];
    -  var JAVA_KEYWORDS = [COMMON_KEYWORDS,
    -      "abstract,assert,boolean,byte,extends,final,finally,implements,import," +
    -      "instanceof,interface,null,native,package,strictfp,super,synchronized," +
    -      "throws,transient"];
    -  var CSHARP_KEYWORDS = [JAVA_KEYWORDS,
    -      "as,base,by,checked,decimal,delegate,descending,dynamic,event," +
    -      "fixed,foreach,from,group,implicit,in,internal,into,is,let," +
    -      "lock,object,out,override,orderby,params,partial,readonly,ref,sbyte," +
    -      "sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort," +
    -      "var,virtual,where"];
    -  var COFFEE_KEYWORDS = "all,and,by,catch,class,else,extends,false,finally," +
    -      "for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then," +
    -      "throw,true,try,unless,until,when,while,yes";
    -  var JSCRIPT_KEYWORDS = [COMMON_KEYWORDS,
    -      "debugger,eval,export,function,get,null,set,undefined,var,with," +
    -      "Infinity,NaN"];
    -  var PERL_KEYWORDS = "caller,delete,die,do,dump,elsif,eval,exit,foreach,for," +
    -      "goto,if,import,last,local,my,next,no,our,print,package,redo,require," +
    -      "sub,undef,unless,until,use,wantarray,while,BEGIN,END";
    -  var PYTHON_KEYWORDS = [FLOW_CONTROL_KEYWORDS, "and,as,assert,class,def,del," +
    -      "elif,except,exec,finally,from,global,import,in,is,lambda," +
    -      "nonlocal,not,or,pass,print,raise,try,with,yield," +
    -      "False,True,None"];
    -  var RUBY_KEYWORDS = [FLOW_CONTROL_KEYWORDS, "alias,and,begin,case,class," +
    -      "def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo," +
    -      "rescue,retry,self,super,then,true,undef,unless,until,when,yield," +
    -      "BEGIN,END"];
    -   var RUST_KEYWORDS = [FLOW_CONTROL_KEYWORDS, "as,assert,const,copy,drop," +
    -      "enum,extern,fail,false,fn,impl,let,log,loop,match,mod,move,mut,priv," +
    -      "pub,pure,ref,self,static,struct,true,trait,type,unsafe,use"];
    -  var SH_KEYWORDS = [FLOW_CONTROL_KEYWORDS, "case,done,elif,esac,eval,fi," +
    -      "function,in,local,set,then,until"];
    -  var ALL_KEYWORDS = [
    -      CPP_KEYWORDS, CSHARP_KEYWORDS, JSCRIPT_KEYWORDS, PERL_KEYWORDS,
    -      PYTHON_KEYWORDS, RUBY_KEYWORDS, SH_KEYWORDS];
    -  var C_TYPES = /^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)\b/;
    -
    -  // token style names.  correspond to css classes
    -  /**
    -   * token style for a string literal
    -   * @const
    -   */
    -  var PR_STRING = 'str';
    -  /**
    -   * token style for a keyword
    -   * @const
    -   */
    -  var PR_KEYWORD = 'kwd';
    -  /**
    -   * token style for a comment
    -   * @const
    -   */
    -  var PR_COMMENT = 'com';
    -  /**
    -   * token style for a type
    -   * @const
    -   */
    -  var PR_TYPE = 'typ';
    -  /**
    -   * token style for a literal value.  e.g. 1, null, true.
    -   * @const
    -   */
    -  var PR_LITERAL = 'lit';
    -  /**
    -   * token style for a punctuation string.
    -   * @const
    -   */
    -  var PR_PUNCTUATION = 'pun';
    -  /**
    -   * token style for plain text.
    -   * @const
    -   */
    -  var PR_PLAIN = 'pln';
    -
    -  /**
    -   * token style for an sgml tag.
    -   * @const
    -   */
    -  var PR_TAG = 'tag';
    -  /**
    -   * token style for a markup declaration such as a DOCTYPE.
    -   * @const
    -   */
    -  var PR_DECLARATION = 'dec';
    -  /**
    -   * token style for embedded source.
    -   * @const
    -   */
    -  var PR_SOURCE = 'src';
    -  /**
    -   * token style for an sgml attribute name.
    -   * @const
    -   */
    -  var PR_ATTRIB_NAME = 'atn';
    -  /**
    -   * token style for an sgml attribute value.
    -   * @const
    -   */
    -  var PR_ATTRIB_VALUE = 'atv';
    -
    -  /**
    -   * A class that indicates a section of markup that is not code, e.g. to allow
    -   * embedding of line numbers within code listings.
    -   * @const
    -   */
    -  var PR_NOCODE = 'nocode';
    -
    -  
    -  
    -  /**
    -   * A set of tokens that can precede a regular expression literal in
    -   * javascript
    -   * http://web.archive.org/web/20070717142515/http://www.mozilla.org/js/language/js20/rationale/syntax.html
    -   * has the full list, but I've removed ones that might be problematic when
    -   * seen in languages that don't support regular expression literals.
    -   *
    -   * <p>Specifically, I've removed any keywords that can't precede a regexp
    -   * literal in a syntactically legal javascript program, and I've removed the
    -   * "in" keyword since it's not a keyword in many languages, and might be used
    -   * as a count of inches.
    -   *
    -   * <p>The link above does not accurately describe EcmaScript rules since
    -   * it fails to distinguish between (a=++/b/i) and (a++/b/i) but it works
    -   * very well in practice.
    -   *
    -   * @private
    -   * @const
    -   */
    -  var REGEXP_PRECEDER_PATTERN = '(?:^^\\.?|[+-]|[!=]=?=?|\\#|%=?|&&?=?|\\(|\\*=?|[+\\-]=|->|\\/=?|::?|<<?=?|>>?>?=?|,|;|\\?|@|\\[|~|{|\\^\\^?=?|\\|\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*';
    -  
    -  // CAVEAT: this does not properly handle the case where a regular
    -  // expression immediately follows another since a regular expression may
    -  // have flags for case-sensitivity and the like.  Having regexp tokens
    -  // adjacent is not valid in any language I'm aware of, so I'm punting.
    -  // TODO: maybe style special characters inside a regexp as punctuation.
    -
    -  /**
    -   * Given a group of {@link RegExp}s, returns a {@code RegExp} that globally
    -   * matches the union of the sets of strings matched by the input RegExp.
    -   * Since it matches globally, if the input strings have a start-of-input
    -   * anchor (/^.../), it is ignored for the purposes of unioning.
    -   * @param {Array.<RegExp>} regexs non multiline, non-global regexs.
    -   * @return {RegExp} a global regex.
    -   */
    -  function combinePrefixPatterns(regexs) {
    -    var capturedGroupIndex = 0;
    -  
    -    var needToFoldCase = false;
    -    var ignoreCase = false;
    -    for (var i = 0, n = regexs.length; i < n; ++i) {
    -      var regex = regexs[i];
    -      if (regex.ignoreCase) {
    -        ignoreCase = true;
    -      } else if (/[a-z]/i.test(regex.source.replace(
    -                     /\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi, ''))) {
    -        needToFoldCase = true;
    -        ignoreCase = false;
    -        break;
    -      }
    -    }
    -  
    -    var escapeCharToCodeUnit = {
    -      'b': 8,
    -      't': 9,
    -      'n': 0xa,
    -      'v': 0xb,
    -      'f': 0xc,
    -      'r': 0xd
    -    };
    -  
    -    function decodeEscape(charsetPart) {
    -      var cc0 = charsetPart.charCodeAt(0);
    -      if (cc0 !== 92 /* \\ */) {
    -        return cc0;
    -      }
    -      var c1 = charsetPart.charAt(1);
    -      cc0 = escapeCharToCodeUnit[c1];
    -      if (cc0) {
    -        return cc0;
    -      } else if ('0' <= c1 && c1 <= '7') {
    -        return parseInt(charsetPart.substring(1), 8);
    -      } else if (c1 === 'u' || c1 === 'x') {
    -        return parseInt(charsetPart.substring(2), 16);
    -      } else {
    -        return charsetPart.charCodeAt(1);
    -      }
    -    }
    -  
    -    function encodeEscape(charCode) {
    -      if (charCode < 0x20) {
    -        return (charCode < 0x10 ? '\\x0' : '\\x') + charCode.toString(16);
    -      }
    -      var ch = String.fromCharCode(charCode);
    -      return (ch === '\\' || ch === '-' || ch === ']' || ch === '^')
    -          ? "\\" + ch : ch;
    -    }
    -  
    -    function caseFoldCharset(charSet) {
    -      var charsetParts = charSet.substring(1, charSet.length - 1).match(
    -          new RegExp(
    -              '\\\\u[0-9A-Fa-f]{4}'
    -              + '|\\\\x[0-9A-Fa-f]{2}'
    -              + '|\\\\[0-3][0-7]{0,2}'
    -              + '|\\\\[0-7]{1,2}'
    -              + '|\\\\[\\s\\S]'
    -              + '|-'
    -              + '|[^-\\\\]',
    -              'g'));
    -      var ranges = [];
    -      var inverse = charsetParts[0] === '^';
    -  
    -      var out = ['['];
    -      if (inverse) { out.push('^'); }
    -  
    -      for (var i = inverse ? 1 : 0, n = charsetParts.length; i < n; ++i) {
    -        var p = charsetParts[i];
    -        if (/\\[bdsw]/i.test(p)) {  // Don't muck with named groups.
    -          out.push(p);
    -        } else {
    -          var start = decodeEscape(p);
    -          var end;
    -          if (i + 2 < n && '-' === charsetParts[i + 1]) {
    -            end = decodeEscape(charsetParts[i + 2]);
    -            i += 2;
    -          } else {
    -            end = start;
    -          }
    -          ranges.push([start, end]);
    -          // If the range might intersect letters, then expand it.
    -          // This case handling is too simplistic.
    -          // It does not deal with non-latin case folding.
    -          // It works for latin source code identifiers though.
    -          if (!(end < 65 || start > 122)) {
    -            if (!(end < 65 || start > 90)) {
    -              ranges.push([Math.max(65, start) | 32, Math.min(end, 90) | 32]);
    -            }
    -            if (!(end < 97 || start > 122)) {
    -              ranges.push([Math.max(97, start) & ~32, Math.min(end, 122) & ~32]);
    -            }
    -          }
    -        }
    -      }
    -  
    -      // [[1, 10], [3, 4], [8, 12], [14, 14], [16, 16], [17, 17]]
    -      // -> [[1, 12], [14, 14], [16, 17]]
    -      ranges.sort(function (a, b) { return (a[0] - b[0]) || (b[1]  - a[1]); });
    -      var consolidatedRanges = [];
    -      var lastRange = [];
    -      for (var i = 0; i < ranges.length; ++i) {
    -        var range = ranges[i];
    -        if (range[0] <= lastRange[1] + 1) {
    -          lastRange[1] = Math.max(lastRange[1], range[1]);
    -        } else {
    -          consolidatedRanges.push(lastRange = range);
    -        }
    -      }
    -  
    -      for (var i = 0; i < consolidatedRanges.length; ++i) {
    -        var range = consolidatedRanges[i];
    -        out.push(encodeEscape(range[0]));
    -        if (range[1] > range[0]) {
    -          if (range[1] + 1 > range[0]) { out.push('-'); }
    -          out.push(encodeEscape(range[1]));
    -        }
    -      }
    -      out.push(']');
    -      return out.join('');
    -    }
    -  
    -    function allowAnywhereFoldCaseAndRenumberGroups(regex) {
    -      // Split into character sets, escape sequences, punctuation strings
    -      // like ('(', '(?:', ')', '^'), and runs of characters that do not
    -      // include any of the above.
    -      var parts = regex.source.match(
    -          new RegExp(
    -              '(?:'
    -              + '\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]'  // a character set
    -              + '|\\\\u[A-Fa-f0-9]{4}'  // a unicode escape
    -              + '|\\\\x[A-Fa-f0-9]{2}'  // a hex escape
    -              + '|\\\\[0-9]+'  // a back-reference or octal escape
    -              + '|\\\\[^ux0-9]'  // other escape sequence
    -              + '|\\(\\?[:!=]'  // start of a non-capturing group
    -              + '|[\\(\\)\\^]'  // start/end of a group, or line start
    -              + '|[^\\x5B\\x5C\\(\\)\\^]+'  // run of other characters
    -              + ')',
    -              'g'));
    -      var n = parts.length;
    -  
    -      // Maps captured group numbers to the number they will occupy in
    -      // the output or to -1 if that has not been determined, or to
    -      // undefined if they need not be capturing in the output.
    -      var capturedGroups = [];
    -  
    -      // Walk over and identify back references to build the capturedGroups
    -      // mapping.
    -      for (var i = 0, groupIndex = 0; i < n; ++i) {
    -        var p = parts[i];
    -        if (p === '(') {
    -          // groups are 1-indexed, so max group index is count of '('
    -          ++groupIndex;
    -        } else if ('\\' === p.charAt(0)) {
    -          var decimalValue = +p.substring(1);
    -          if (decimalValue) {
    -            if (decimalValue <= groupIndex) {
    -              capturedGroups[decimalValue] = -1;
    -            } else {
    -              // Replace with an unambiguous escape sequence so that
    -              // an octal escape sequence does not turn into a backreference
    -              // to a capturing group from an earlier regex.
    -              parts[i] = encodeEscape(decimalValue);
    -            }
    -          }
    -        }
    -      }
    -  
    -      // Renumber groups and reduce capturing groups to non-capturing groups
    -      // where possible.
    -      for (var i = 1; i < capturedGroups.length; ++i) {
    -        if (-1 === capturedGroups[i]) {
    -          capturedGroups[i] = ++capturedGroupIndex;
    -        }
    -      }
    -      for (var i = 0, groupIndex = 0; i < n; ++i) {
    -        var p = parts[i];
    -        if (p === '(') {
    -          ++groupIndex;
    -          if (!capturedGroups[groupIndex]) {
    -            parts[i] = '(?:';
    -          }
    -        } else if ('\\' === p.charAt(0)) {
    -          var decimalValue = +p.substring(1);
    -          if (decimalValue && decimalValue <= groupIndex) {
    -            parts[i] = '\\' + capturedGroups[decimalValue];
    -          }
    -        }
    -      }
    -  
    -      // Remove any prefix anchors so that the output will match anywhere.
    -      // ^^ really does mean an anchored match though.
    -      for (var i = 0; i < n; ++i) {
    -        if ('^' === parts[i] && '^' !== parts[i + 1]) { parts[i] = ''; }
    -      }
    -  
    -      // Expand letters to groups to handle mixing of case-sensitive and
    -      // case-insensitive patterns if necessary.
    -      if (regex.ignoreCase && needToFoldCase) {
    -        for (var i = 0; i < n; ++i) {
    -          var p = parts[i];
    -          var ch0 = p.charAt(0);
    -          if (p.length >= 2 && ch0 === '[') {
    -            parts[i] = caseFoldCharset(p);
    -          } else if (ch0 !== '\\') {
    -            // TODO: handle letters in numeric escapes.
    -            parts[i] = p.replace(
    -                /[a-zA-Z]/g,
    -                function (ch) {
    -                  var cc = ch.charCodeAt(0);
    -                  return '[' + String.fromCharCode(cc & ~32, cc | 32) + ']';
    -                });
    -          }
    -        }
    -      }
    -  
    -      return parts.join('');
    -    }
    -  
    -    var rewritten = [];
    -    for (var i = 0, n = regexs.length; i < n; ++i) {
    -      var regex = regexs[i];
    -      if (regex.global || regex.multiline) { throw new Error('' + regex); }
    -      rewritten.push(
    -          '(?:' + allowAnywhereFoldCaseAndRenumberGroups(regex) + ')');
    -    }
    -  
    -    return new RegExp(rewritten.join('|'), ignoreCase ? 'gi' : 'g');
    -  }
    -
    -  /**
    -   * Split markup into a string of source code and an array mapping ranges in
    -   * that string to the text nodes in which they appear.
    -   *
    -   * <p>
    -   * The HTML DOM structure:</p>
    -   * <pre>
    -   * (Element   "p"
    -   *   (Element "b"
    -   *     (Text  "print "))       ; #1
    -   *   (Text    "'Hello '")      ; #2
    -   *   (Element "br")            ; #3
    -   *   (Text    "  + 'World';")) ; #4
    -   * </pre>
    -   * <p>
    -   * corresponds to the HTML
    -   * {@code <p><b>print </b>'Hello '<br>  + 'World';</p>}.</p>
    -   *
    -   * <p>
    -   * It will produce the output:</p>
    -   * <pre>
    -   * {
    -   *   sourceCode: "print 'Hello '\n  + 'World';",
    -   *   //                     1          2
    -   *   //           012345678901234 5678901234567
    -   *   spans: [0, #1, 6, #2, 14, #3, 15, #4]
    -   * }
    -   * </pre>
    -   * <p>
    -   * where #1 is a reference to the {@code "print "} text node above, and so
    -   * on for the other text nodes.
    -   * </p>
    -   *
    -   * <p>
    -   * The {@code} spans array is an array of pairs.  Even elements are the start
    -   * indices of substrings, and odd elements are the text nodes (or BR elements)
    -   * that contain the text for those substrings.
    -   * Substrings continue until the next index or the end of the source.
    -   * </p>
    -   *
    -   * @param {Node} node an HTML DOM subtree containing source-code.
    -   * @param {boolean} isPreformatted true if white-space in text nodes should
    -   *    be considered significant.
    -   * @return {Object} source code and the text nodes in which they occur.
    -   */
    -  function extractSourceSpans(node, isPreformatted) {
    -    var nocode = /(?:^|\s)nocode(?:\s|$)/;
    -  
    -    var chunks = [];
    -    var length = 0;
    -    var spans = [];
    -    var k = 0;
    -  
    -    function walk(node) {
    -      var type = node.nodeType;
    -      if (type == 1) {  // Element
    -        if (nocode.test(node.className)) { return; }
    -        for (var child = node.firstChild; child; child = child.nextSibling) {
    -          walk(child);
    -        }
    -        var nodeName = node.nodeName.toLowerCase();
    -        if ('br' === nodeName || 'li' === nodeName) {
    -          chunks[k] = '\n';
    -          spans[k << 1] = length++;
    -          spans[(k++ << 1) | 1] = node;
    -        }
    -      } else if (type == 3 || type == 4) {  // Text
    -        var text = node.nodeValue;
    -        if (text.length) {
    -          if (!isPreformatted) {
    -            text = text.replace(/[ \t\r\n]+/g, ' ');
    -          } else {
    -            text = text.replace(/\r\n?/g, '\n');  // Normalize newlines.
    -          }
    -          // TODO: handle tabs here?
    -          chunks[k] = text;
    -          spans[k << 1] = length;
    -          length += text.length;
    -          spans[(k++ << 1) | 1] = node;
    -        }
    -      }
    -    }
    -  
    -    walk(node);
    -  
    -    return {
    -      sourceCode: chunks.join('').replace(/\n$/, ''),
    -      spans: spans
    -    };
    -  }
    -
    -  /**
    -   * Apply the given language handler to sourceCode and add the resulting
    -   * decorations to out.
    -   * @param {number} basePos the index of sourceCode within the chunk of source
    -   *    whose decorations are already present on out.
    -   */
    -  function appendDecorations(basePos, sourceCode, langHandler, out) {
    -    if (!sourceCode) { return; }
    -    var job = {
    -      sourceCode: sourceCode,
    -      basePos: basePos
    -    };
    -    langHandler(job);
    -    out.push.apply(out, job.decorations);
    -  }
    -
    -  var notWs = /\S/;
    -
    -  /**
    -   * Given an element, if it contains only one child element and any text nodes
    -   * it contains contain only space characters, return the sole child element.
    -   * Otherwise returns undefined.
    -   * <p>
    -   * This is meant to return the CODE element in {@code <pre><code ...>} when
    -   * there is a single child element that contains all the non-space textual
    -   * content, but not to return anything where there are multiple child elements
    -   * as in {@code <pre><code>...</code><code>...</code></pre>} or when there
    -   * is textual content.
    -   */
    -  function childContentWrapper(element) {
    -    var wrapper = undefined;
    -    for (var c = element.firstChild; c; c = c.nextSibling) {
    -      var type = c.nodeType;
    -      wrapper = (type === 1)  // Element Node
    -          ? (wrapper ? element : c)
    -          : (type === 3)  // Text Node
    -          ? (notWs.test(c.nodeValue) ? element : wrapper)
    -          : wrapper;
    -    }
    -    return wrapper === element ? undefined : wrapper;
    -  }
    -
    -  /** Given triples of [style, pattern, context] returns a lexing function,
    -    * The lexing function interprets the patterns to find token boundaries and
    -    * returns a decoration list of the form
    -    * [index_0, style_0, index_1, style_1, ..., index_n, style_n]
    -    * where index_n is an index into the sourceCode, and style_n is a style
    -    * constant like PR_PLAIN.  index_n-1 <= index_n, and style_n-1 applies to
    -    * all characters in sourceCode[index_n-1:index_n].
    -    *
    -    * The stylePatterns is a list whose elements have the form
    -    * [style : string, pattern : RegExp, DEPRECATED, shortcut : string].
    -    *
    -    * Style is a style constant like PR_PLAIN, or can be a string of the
    -    * form 'lang-FOO', where FOO is a language extension describing the
    -    * language of the portion of the token in $1 after pattern executes.
    -    * E.g., if style is 'lang-lisp', and group 1 contains the text
    -    * '(hello (world))', then that portion of the token will be passed to the
    -    * registered lisp handler for formatting.
    -    * The text before and after group 1 will be restyled using this decorator
    -    * so decorators should take care that this doesn't result in infinite
    -    * recursion.  For example, the HTML lexer rule for SCRIPT elements looks
    -    * something like ['lang-js', /<[s]cript>(.+?)<\/script>/].  This may match
    -    * '<script>foo()<\/script>', which would cause the current decorator to
    -    * be called with '<script>' which would not match the same rule since
    -    * group 1 must not be empty, so it would be instead styled as PR_TAG by
    -    * the generic tag rule.  The handler registered for the 'js' extension would
    -    * then be called with 'foo()', and finally, the current decorator would
    -    * be called with '<\/script>' which would not match the original rule and
    -    * so the generic tag rule would identify it as a tag.
    -    *
    -    * Pattern must only match prefixes, and if it matches a prefix, then that
    -    * match is considered a token with the same style.
    -    *
    -    * Context is applied to the last non-whitespace, non-comment token
    -    * recognized.
    -    *
    -    * Shortcut is an optional string of characters, any of which, if the first
    -    * character, gurantee that this pattern and only this pattern matches.
    -    *
    -    * @param {Array} shortcutStylePatterns patterns that always start with
    -    *   a known character.  Must have a shortcut string.
    -    * @param {Array} fallthroughStylePatterns patterns that will be tried in
    -    *   order if the shortcut ones fail.  May have shortcuts.
    -    *
    -    * @return {function (Object)} a
    -    *   function that takes source code and returns a list of decorations.
    -    */
    -  function createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns) {
    -    var shortcuts = {};
    -    var tokenizer;
    -    (function () {
    -      var allPatterns = shortcutStylePatterns.concat(fallthroughStylePatterns);
    -      var allRegexs = [];
    -      var regexKeys = {};
    -      for (var i = 0, n = allPatterns.length; i < n; ++i) {
    -        var patternParts = allPatterns[i];
    -        var shortcutChars = patternParts[3];
    -        if (shortcutChars) {
    -          for (var c = shortcutChars.length; --c >= 0;) {
    -            shortcuts[shortcutChars.charAt(c)] = patternParts;
    -          }
    -        }
    -        var regex = patternParts[1];
    -        var k = '' + regex;
    -        if (!regexKeys.hasOwnProperty(k)) {
    -          allRegexs.push(regex);
    -          regexKeys[k] = null;
    -        }
    -      }
    -      allRegexs.push(/[\0-\uffff]/);
    -      tokenizer = combinePrefixPatterns(allRegexs);
    -    })();
    -
    -    var nPatterns = fallthroughStylePatterns.length;
    -
    -    /**
    -     * Lexes job.sourceCode and produces an output array job.decorations of
    -     * style classes preceded by the position at which they start in
    -     * job.sourceCode in order.
    -     *
    -     * @param {Object} job an object like <pre>{
    -     *    sourceCode: {string} sourceText plain text,
    -     *    basePos: {int} position of job.sourceCode in the larger chunk of
    -     *        sourceCode.
    -     * }</pre>
    -     */
    -    var decorate = function (job) {
    -      var sourceCode = job.sourceCode, basePos = job.basePos;
    -      /** Even entries are positions in source in ascending order.  Odd enties
    -        * are style markers (e.g., PR_COMMENT) that run from that position until
    -        * the end.
    -        * @type {Array.<number|string>}
    -        */
    -      var decorations = [basePos, PR_PLAIN];
    -      var pos = 0;  // index into sourceCode
    -      var tokens = sourceCode.match(tokenizer) || [];
    -      var styleCache = {};
    -
    -      for (var ti = 0, nTokens = tokens.length; ti < nTokens; ++ti) {
    -        var token = tokens[ti];
    -        var style = styleCache[token];
    -        var match = void 0;
    -
    -        var isEmbedded;
    -        if (typeof style === 'string') {
    -          isEmbedded = false;
    -        } else {
    -          var patternParts = shortcuts[token.charAt(0)];
    -          if (patternParts) {
    -            match = token.match(patternParts[1]);
    -            style = patternParts[0];
    -          } else {
    -            for (var i = 0; i < nPatterns; ++i) {
    -              patternParts = fallthroughStylePatterns[i];
    -              match = token.match(patternParts[1]);
    -              if (match) {
    -                style = patternParts[0];
    -                break;
    -              }
    -            }
    -
    -            if (!match) {  // make sure that we make progress
    -              style = PR_PLAIN;
    -            }
    -          }
    -
    -          isEmbedded = style.length >= 5 && 'lang-' === style.substring(0, 5);
    -          if (isEmbedded && !(match && typeof match[1] === 'string')) {
    -            isEmbedded = false;
    -            style = PR_SOURCE;
    -          }
    -
    -          if (!isEmbedded) { styleCache[token] = style; }
    -        }
    -
    -        var tokenStart = pos;
    -        pos += token.length;
    -
    -        if (!isEmbedded) {
    -          decorations.push(basePos + tokenStart, style);
    -        } else {  // Treat group 1 as an embedded block of source code.
    -          var embeddedSource = match[1];
    -          var embeddedSourceStart = token.indexOf(embeddedSource);
    -          var embeddedSourceEnd = embeddedSourceStart + embeddedSource.length;
    -          if (match[2]) {
    -            // If embeddedSource can be blank, then it would match at the
    -            // beginning which would cause us to infinitely recurse on the
    -            // entire token, so we catch the right context in match[2].
    -            embeddedSourceEnd = token.length - match[2].length;
    -            embeddedSourceStart = embeddedSourceEnd - embeddedSource.length;
    -          }
    -          var lang = style.substring(5);
    -          // Decorate the left of the embedded source
    -          appendDecorations(
    -              basePos + tokenStart,
    -              token.substring(0, embeddedSourceStart),
    -              decorate, decorations);
    -          // Decorate the embedded source
    -          appendDecorations(
    -              basePos + tokenStart + embeddedSourceStart,
    -              embeddedSource,
    -              langHandlerForExtension(lang, embeddedSource),
    -              decorations);
    -          // Decorate the right of the embedded section
    -          appendDecorations(
    -              basePos + tokenStart + embeddedSourceEnd,
    -              token.substring(embeddedSourceEnd),
    -              decorate, decorations);
    -        }
    -      }
    -      job.decorations = decorations;
    -    };
    -    return decorate;
    -  }
    -
    -  /** returns a function that produces a list of decorations from source text.
    -    *
    -    * This code treats ", ', and ` as string delimiters, and \ as a string
    -    * escape.  It does not recognize perl's qq() style strings.
    -    * It has no special handling for double delimiter escapes as in basic, or
    -    * the tripled delimiters used in python, but should work on those regardless
    -    * although in those cases a single string literal may be broken up into
    -    * multiple adjacent string literals.
    -    *
    -    * It recognizes C, C++, and shell style comments.
    -    *
    -    * @param {Object} options a set of optional parameters.
    -    * @return {function (Object)} a function that examines the source code
    -    *     in the input job and builds the decoration list.
    -    */
    -  function sourceDecorator(options) {
    -    var shortcutStylePatterns = [], fallthroughStylePatterns = [];
    -    if (options['tripleQuotedStrings']) {
    -      // '''multi-line-string''', 'single-line-string', and double-quoted
    -      shortcutStylePatterns.push(
    -          [PR_STRING,  /^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,
    -           null, '\'"']);
    -    } else if (options['multiLineStrings']) {
    -      // 'multi-line-string', "multi-line-string"
    -      shortcutStylePatterns.push(
    -          [PR_STRING,  /^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,
    -           null, '\'"`']);
    -    } else {
    -      // 'single-line-string', "single-line-string"
    -      shortcutStylePatterns.push(
    -          [PR_STRING,
    -           /^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,
    -           null, '"\'']);
    -    }
    -    if (options['verbatimStrings']) {
    -      // verbatim-string-literal production from the C# grammar.  See issue 93.
    -      fallthroughStylePatterns.push(
    -          [PR_STRING, /^@\"(?:[^\"]|\"\")*(?:\"|$)/, null]);
    -    }
    -    var hc = options['hashComments'];
    -    if (hc) {
    -      if (options['cStyleComments']) {
    -        if (hc > 1) {  // multiline hash comments
    -          shortcutStylePatterns.push(
    -              [PR_COMMENT, /^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/, null, '#']);
    -        } else {
    -          // Stop C preprocessor declarations at an unclosed open comment
    -          shortcutStylePatterns.push(
    -              [PR_COMMENT, /^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\b|[^\r\n]*)/,
    -               null, '#']);
    -        }
    -        // #include <stdio.h>
    -        fallthroughStylePatterns.push(
    -            [PR_STRING,
    -             /^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h(?:h|pp|\+\+)?|[a-z]\w*)>/,
    -             null]);
    -      } else {
    -        shortcutStylePatterns.push([PR_COMMENT, /^#[^\r\n]*/, null, '#']);
    -      }
    -    }
    -    if (options['cStyleComments']) {
    -      fallthroughStylePatterns.push([PR_COMMENT, /^\/\/[^\r\n]*/, null]);
    -      fallthroughStylePatterns.push(
    -          [PR_COMMENT, /^\/\*[\s\S]*?(?:\*\/|$)/, null]);
    -    }
    -    var regexLiterals = options['regexLiterals'];
    -    if (regexLiterals) {
    -      /**
    -       * @const
    -       */
    -      var regexExcls = regexLiterals > 1
    -        ? ''  // Multiline regex literals
    -        : '\n\r';
    -      /**
    -       * @const
    -       */
    -      var regexAny = regexExcls ? '.' : '[\\S\\s]';
    -      /**
    -       * @const
    -       */
    -      var REGEX_LITERAL = (
    -          // A regular expression literal starts with a slash that is
    -          // not followed by * or / so that it is not confused with
    -          // comments.
    -          '/(?=[^/*' + regexExcls + '])'
    -          // and then contains any number of raw characters,
    -          + '(?:[^/\\x5B\\x5C' + regexExcls + ']'
    -          // escape sequences (\x5C),
    -          +    '|\\x5C' + regexAny
    -          // or non-nesting character sets (\x5B\x5D);
    -          +    '|\\x5B(?:[^\\x5C\\x5D' + regexExcls + ']'
    -          +             '|\\x5C' + regexAny + ')*(?:\\x5D|$))+'
    -          // finally closed by a /.
    -          + '/');
    -      fallthroughStylePatterns.push(
    -          ['lang-regex',
    -           RegExp('^' + REGEXP_PRECEDER_PATTERN + '(' + REGEX_LITERAL + ')')
    -           ]);
    -    }
    -
    -    var types = options['types'];
    -    if (types) {
    -      fallthroughStylePatterns.push([PR_TYPE, types]);
    -    }
    -
    -    var keywords = ("" + options['keywords']).replace(/^ | $/g, '');
    -    if (keywords.length) {
    -      fallthroughStylePatterns.push(
    -          [PR_KEYWORD,
    -           new RegExp('^(?:' + keywords.replace(/[\s,]+/g, '|') + ')\\b'),
    -           null]);
    -    }
    -
    -    shortcutStylePatterns.push([PR_PLAIN,       /^\s+/, null, ' \r\n\t\xA0']);
    -
    -    var punctuation =
    -      // The Bash man page says
    -
    -      // A word is a sequence of characters considered as a single
    -      // unit by GRUB. Words are separated by metacharacters,
    -      // which are the following plus space, tab, and newline: { }
    -      // | & $ ; < >
    -      // ...
    -      
    -      // A word beginning with # causes that word and all remaining
    -      // characters on that line to be ignored.
    -
    -      // which means that only a '#' after /(?:^|[{}|&$;<>\s])/ starts a
    -      // comment but empirically
    -      // $ echo {#}
    -      // {#}
    -      // $ echo \$#
    -      // $#
    -      // $ echo }#
    -      // }#
    -
    -      // so /(?:^|[|&;<>\s])/ is more appropriate.
    -
    -      // http://gcc.gnu.org/onlinedocs/gcc-2.95.3/cpp_1.html#SEC3
    -      // suggests that this definition is compatible with a
    -      // default mode that tries to use a single token definition
    -      // to recognize both bash/python style comments and C
    -      // preprocessor directives.
    -
    -      // This definition of punctuation does not include # in the list of
    -      // follow-on exclusions, so # will not be broken before if preceeded
    -      // by a punctuation character.  We could try to exclude # after
    -      // [|&;<>] but that doesn't seem to cause many major problems.
    -      // If that does turn out to be a problem, we should change the below
    -      // when hc is truthy to include # in the run of punctuation characters
    -      // only when not followint [|&;<>].
    -      '^.[^\\s\\w.$@\'"`/\\\\]*';
    -    if (options['regexLiterals']) {
    -      punctuation += '(?!\s*\/)';
    -    }
    -
    -    fallthroughStylePatterns.push(
    -        // TODO(mikesamuel): recognize non-latin letters and numerals in idents
    -        [PR_LITERAL,     /^@[a-z_$][a-z_$@0-9]*/i, null],
    -        [PR_TYPE,        /^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/, null],
    -        [PR_PLAIN,       /^[a-z_$][a-z_$@0-9]*/i, null],
    -        [PR_LITERAL,
    -         new RegExp(
    -             '^(?:'
    -             // A hex number
    -             + '0x[a-f0-9]+'
    -             // or an octal or decimal number,
    -             + '|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)'
    -             // possibly in scientific notation
    -             + '(?:e[+\\-]?\\d+)?'
    -             + ')'
    -             // with an optional modifier like UL for unsigned long
    -             + '[a-z]*', 'i'),
    -         null, '0123456789'],
    -        // Don't treat escaped quotes in bash as starting strings.
    -        // See issue 144.
    -        [PR_PLAIN,       /^\\[\s\S]?/, null],
    -        [PR_PUNCTUATION, new RegExp(punctuation), null]);
    -
    -    return createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns);
    -  }
    -
    -  var decorateSource = sourceDecorator({
    -        'keywords': ALL_KEYWORDS,
    -        'hashComments': true,
    -        'cStyleComments': true,
    -        'multiLineStrings': true,
    -        'regexLiterals': true
    -      });
    -
    -  /**
    -   * Given a DOM subtree, wraps it in a list, and puts each line into its own
    -   * list item.
    -   *
    -   * @param {Node} node modified in place.  Its content is pulled into an
    -   *     HTMLOListElement, and each line is moved into a separate list item.
    -   *     This requires cloning elements, so the input might not have unique
    -   *     IDs after numbering.
    -   * @param {boolean} isPreformatted true iff white-space in text nodes should
    -   *     be treated as significant.
    -   */
    -  function numberLines(node, opt_startLineNum, isPreformatted) {
    -    var nocode = /(?:^|\s)nocode(?:\s|$)/;
    -    var lineBreak = /\r\n?|\n/;
    -  
    -    var document = node.ownerDocument;
    -  
    -    var li = document.createElement('li');
    -    while (node.firstChild) {
    -      li.appendChild(node.firstChild);
    -    }
    -    // An array of lines.  We split below, so this is initialized to one
    -    // un-split line.
    -    var listItems = [li];
    -  
    -    function walk(node) {
    -      var type = node.nodeType;
    -      if (type == 1 && !nocode.test(node.className)) {  // Element
    -        if ('br' === node.nodeName) {
    -          breakAfter(node);
    -          // Discard the <BR> since it is now flush against a </LI>.
    -          if (node.parentNode) {
    -            node.parentNode.removeChild(node);
    -          }
    -        } else {
    -          for (var child = node.firstChild; child; child = child.nextSibling) {
    -            walk(child);
    -          }
    -        }
    -      } else if ((type == 3 || type == 4) && isPreformatted) {  // Text
    -        var text = node.nodeValue;
    -        var match = text.match(lineBreak);
    -        if (match) {
    -          var firstLine = text.substring(0, match.index);
    -          node.nodeValue = firstLine;
    -          var tail = text.substring(match.index + match[0].length);
    -          if (tail) {
    -            var parent = node.parentNode;
    -            parent.insertBefore(
    -              document.createTextNode(tail), node.nextSibling);
    -          }
    -          breakAfter(node);
    -          if (!firstLine) {
    -            // Don't leave blank text nodes in the DOM.
    -            node.parentNode.removeChild(node);
    -          }
    -        }
    -      }
    -    }
    -  
    -    // Split a line after the given node.
    -    function breakAfter(lineEndNode) {
    -      // If there's nothing to the right, then we can skip ending the line
    -      // here, and move root-wards since splitting just before an end-tag
    -      // would require us to create a bunch of empty copies.
    -      while (!lineEndNode.nextSibling) {
    -        lineEndNode = lineEndNode.parentNode;
    -        if (!lineEndNode) { return; }
    -      }
    -  
    -      function breakLeftOf(limit, copy) {
    -        // Clone shallowly if this node needs to be on both sides of the break.
    -        var rightSide = copy ? limit.cloneNode(false) : limit;
    -        var parent = limit.parentNode;
    -        if (parent) {
    -          // We clone the parent chain.
    -          // This helps us resurrect important styling elements that cross lines.
    -          // E.g. in <i>Foo<br>Bar</i>
    -          // should be rewritten to <li><i>Foo</i></li><li><i>Bar</i></li>.
    -          var parentClone = breakLeftOf(parent, 1);
    -          // Move the clone and everything to the right of the original
    -          // onto the cloned parent.
    -          var next = limit.nextSibling;
    -          parentClone.appendChild(rightSide);
    -          for (var sibling = next; sibling; sibling = next) {
    -            next = sibling.nextSibling;
    -            parentClone.appendChild(sibling);
    -          }
    -        }
    -        return rightSide;
    -      }
    -  
    -      var copiedListItem = breakLeftOf(lineEndNode.nextSibling, 0);
    -  
    -      // Walk the parent chain until we reach an unattached LI.
    -      for (var parent;
    -           // Check nodeType since IE invents document fragments.
    -           (parent = copiedListItem.parentNode) && parent.nodeType === 1;) {
    -        copiedListItem = parent;
    -      }
    -      // Put it on the list of lines for later processing.
    -      listItems.push(copiedListItem);
    -    }
    -  
    -    // Split lines while there are lines left to split.
    -    for (var i = 0;  // Number of lines that have been split so far.
    -         i < listItems.length;  // length updated by breakAfter calls.
    -         ++i) {
    -      walk(listItems[i]);
    -    }
    -  
    -    // Make sure numeric indices show correctly.
    -    if (opt_startLineNum === (opt_startLineNum|0)) {
    -      listItems[0].setAttribute('value', opt_startLineNum);
    -    }
    -  
    -    var ol = document.createElement('ol');
    -    ol.className = 'linenums';
    -    var offset = Math.max(0, ((opt_startLineNum - 1 /* zero index */)) | 0) || 0;
    -    for (var i = 0, n = listItems.length; i < n; ++i) {
    -      li = listItems[i];
    -      // Stick a class on the LIs so that stylesheets can
    -      // color odd/even rows, or any other row pattern that
    -      // is co-prime with 10.
    -      li.className = 'L' + ((i + offset) % 10);
    -      if (!li.firstChild) {
    -        li.appendChild(document.createTextNode('\xA0'));
    -      }
    -      ol.appendChild(li);
    -    }
    -  
    -    node.appendChild(ol);
    -  }
    -  /**
    -   * Breaks {@code job.sourceCode} around style boundaries in
    -   * {@code job.decorations} and modifies {@code job.sourceNode} in place.
    -   * @param {Object} job like <pre>{
    -   *    sourceCode: {string} source as plain text,
    -   *    sourceNode: {HTMLElement} the element containing the source,
    -   *    spans: {Array.<number|Node>} alternating span start indices into source
    -   *       and the text node or element (e.g. {@code <BR>}) corresponding to that
    -   *       span.
    -   *    decorations: {Array.<number|string} an array of style classes preceded
    -   *       by the position at which they start in job.sourceCode in order
    -   * }</pre>
    -   * @private
    -   */
    -  function recombineTagsAndDecorations(job) {
    -    var isIE8OrEarlier = /\bMSIE\s(\d+)/.exec(navigator.userAgent);
    -    isIE8OrEarlier = isIE8OrEarlier && +isIE8OrEarlier[1] <= 8;
    -    var newlineRe = /\n/g;
    -  
    -    var source = job.sourceCode;
    -    var sourceLength = source.length;
    -    // Index into source after the last code-unit recombined.
    -    var sourceIndex = 0;
    -  
    -    var spans = job.spans;
    -    var nSpans = spans.length;
    -    // Index into spans after the last span which ends at or before sourceIndex.
    -    var spanIndex = 0;
    -  
    -    var decorations = job.decorations;
    -    var nDecorations = decorations.length;
    -    // Index into decorations after the last decoration which ends at or before
    -    // sourceIndex.
    -    var decorationIndex = 0;
    -  
    -    // Remove all zero-length decorations.
    -    decorations[nDecorations] = sourceLength;
    -    var decPos, i;
    -    for (i = decPos = 0; i < nDecorations;) {
    -      if (decorations[i] !== decorations[i + 2]) {
    -        decorations[decPos++] = decorations[i++];
    -        decorations[decPos++] = decorations[i++];
    -      } else {
    -        i += 2;
    -      }
    -    }
    -    nDecorations = decPos;
    -  
    -    // Simplify decorations.
    -    for (i = decPos = 0; i < nDecorations;) {
    -      var startPos = decorations[i];
    -      // Conflate all adjacent decorations that use the same style.
    -      var startDec = decorations[i + 1];
    -      var end = i + 2;
    -      while (end + 2 <= nDecorations && decorations[end + 1] === startDec) {
    -        end += 2;
    -      }
    -      decorations[decPos++] = startPos;
    -      decorations[decPos++] = startDec;
    -      i = end;
    -    }
    -  
    -    nDecorations = decorations.length = decPos;
    -  
    -    var sourceNode = job.sourceNode;
    -    var oldDisplay;
    -    if (sourceNode) {
    -      oldDisplay = sourceNode.style.display;
    -      sourceNode.style.display = 'none';
    -    }
    -    try {
    -      var decoration = null;
    -      while (spanIndex < nSpans) {
    -        var spanStart = spans[spanIndex];
    -        var spanEnd = spans[spanIndex + 2] || sourceLength;
    -  
    -        var decEnd = decorations[decorationIndex + 2] || sourceLength;
    -  
    -        var end = Math.min(spanEnd, decEnd);
    -  
    -        var textNode = spans[spanIndex + 1];
    -        var styledText;
    -        if (textNode.nodeType !== 1  // Don't muck with <BR>s or <LI>s
    -            // Don't introduce spans around empty text nodes.
    -            && (styledText = source.substring(sourceIndex, end))) {
    -          // This may seem bizarre, and it is.  Emitting LF on IE causes the
    -          // code to display with spaces instead of line breaks.
    -          // Emitting Windows standard issue linebreaks (CRLF) causes a blank
    -          // space to appear at the beginning of every line but the first.
    -          // Emitting an old Mac OS 9 line separator makes everything spiffy.
    -          if (isIE8OrEarlier) {
    -            styledText = styledText.replace(newlineRe, '\r');
    -          }
    -          textNode.nodeValue = styledText;
    -          var document = textNode.ownerDocument;
    -          var span = document.createElement('span');
    -          span.className = decorations[decorationIndex + 1];
    -          var parentNode = textNode.parentNode;
    -          parentNode.replaceChild(span, textNode);
    -          span.appendChild(textNode);
    -          if (sourceIndex < spanEnd) {  // Split off a text node.
    -            spans[spanIndex + 1] = textNode
    -                // TODO: Possibly optimize by using '' if there's no flicker.
    -                = document.createTextNode(source.substring(end, spanEnd));
    -            parentNode.insertBefore(textNode, span.nextSibling);
    -          }
    -        }
    -  
    -        sourceIndex = end;
    -  
    -        if (sourceIndex >= spanEnd) {
    -          spanIndex += 2;
    -        }
    -        if (sourceIndex >= decEnd) {
    -          decorationIndex += 2;
    -        }
    -      }
    -    } finally {
    -      if (sourceNode) {
    -        sourceNode.style.display = oldDisplay;
    -      }
    -    }
    -  }
    -
    -  /** Maps language-specific file extensions to handlers. */
    -  var langHandlerRegistry = {};
    -  /** Register a language handler for the given file extensions.
    -    * @param {function (Object)} handler a function from source code to a list
    -    *      of decorations.  Takes a single argument job which describes the
    -    *      state of the computation.   The single parameter has the form
    -    *      {@code {
    -    *        sourceCode: {string} as plain text.
    -    *        decorations: {Array.<number|string>} an array of style classes
    -    *                     preceded by the position at which they start in
    -    *                     job.sourceCode in order.
    -    *                     The language handler should assigned this field.
    -    *        basePos: {int} the position of source in the larger source chunk.
    -    *                 All positions in the output decorations array are relative
    -    *                 to the larger source chunk.
    -    *      } }
    -    * @param {Array.<string>} fileExtensions
    -    */
    -  function registerLangHandler(handler, fileExtensions) {
    -    for (var i = fileExtensions.length; --i >= 0;) {
    -      var ext = fileExtensions[i];
    -      if (!langHandlerRegistry.hasOwnProperty(ext)) {
    -        langHandlerRegistry[ext] = handler;
    -      } else if (win['console']) {
    -        console['warn']('cannot override language handler %s', ext);
    -      }
    -    }
    -  }
    -  function langHandlerForExtension(extension, source) {
    -    if (!(extension && langHandlerRegistry.hasOwnProperty(extension))) {
    -      // Treat it as markup if the first non whitespace character is a < and
    -      // the last non-whitespace character is a >.
    -      extension = /^\s*</.test(source)
    -          ? 'default-markup'
    -          : 'default-code';
    -    }
    -    return langHandlerRegistry[extension];
    -  }
    -  registerLangHandler(decorateSource, ['default-code']);
    -  registerLangHandler(
    -      createSimpleLexer(
    -          [],
    -          [
    -           [PR_PLAIN,       /^[^<?]+/],
    -           [PR_DECLARATION, /^<!\w[^>]*(?:>|$)/],
    -           [PR_COMMENT,     /^<\!--[\s\S]*?(?:-\->|$)/],
    -           // Unescaped content in an unknown language
    -           ['lang-',        /^<\?([\s\S]+?)(?:\?>|$)/],
    -           ['lang-',        /^<%([\s\S]+?)(?:%>|$)/],
    -           [PR_PUNCTUATION, /^(?:<[%?]|[%?]>)/],
    -           ['lang-',        /^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],
    -           // Unescaped content in javascript.  (Or possibly vbscript).
    -           ['lang-js',      /^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],
    -           // Contains unescaped stylesheet content
    -           ['lang-css',     /^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],
    -           ['lang-in.tag',  /^(<\/?[a-z][^<>]*>)/i]
    -          ]),
    -      ['default-markup', 'htm', 'html', 'mxml', 'xhtml', 'xml', 'xsl']);
    -  registerLangHandler(
    -      createSimpleLexer(
    -          [
    -           [PR_PLAIN,        /^[\s]+/, null, ' \t\r\n'],
    -           [PR_ATTRIB_VALUE, /^(?:\"[^\"]*\"?|\'[^\']*\'?)/, null, '\"\'']
    -           ],
    -          [
    -           [PR_TAG,          /^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],
    -           [PR_ATTRIB_NAME,  /^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],
    -           ['lang-uq.val',   /^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],
    -           [PR_PUNCTUATION,  /^[=<>\/]+/],
    -           ['lang-js',       /^on\w+\s*=\s*\"([^\"]+)\"/i],
    -           ['lang-js',       /^on\w+\s*=\s*\'([^\']+)\'/i],
    -           ['lang-js',       /^on\w+\s*=\s*([^\"\'>\s]+)/i],
    -           ['lang-css',      /^style\s*=\s*\"([^\"]+)\"/i],
    -           ['lang-css',      /^style\s*=\s*\'([^\']+)\'/i],
    -           ['lang-css',      /^style\s*=\s*([^\"\'>\s]+)/i]
    -           ]),
    -      ['in.tag']);
    -  registerLangHandler(
    -      createSimpleLexer([], [[PR_ATTRIB_VALUE, /^[\s\S]+/]]), ['uq.val']);
    -  registerLangHandler(sourceDecorator({
    -          'keywords': CPP_KEYWORDS,
    -          'hashComments': true,
    -          'cStyleComments': true,
    -          'types': C_TYPES
    -        }), ['c', 'cc', 'cpp', 'cxx', 'cyc', 'm']);
    -  registerLangHandler(sourceDecorator({
    -          'keywords': 'null,true,false'
    -        }), ['json']);
    -  registerLangHandler(sourceDecorator({
    -          'keywords': CSHARP_KEYWORDS,
    -          'hashComments': true,
    -          'cStyleComments': true,
    -          'verbatimStrings': true,
    -          'types': C_TYPES
    -        }), ['cs']);
    -  registerLangHandler(sourceDecorator({
    -          'keywords': JAVA_KEYWORDS,
    -          'cStyleComments': true
    -        }), ['java']);
    -  registerLangHandler(sourceDecorator({
    -          'keywords': SH_KEYWORDS,
    -          'hashComments': true,
    -          'multiLineStrings': true
    -        }), ['bash', 'bsh', 'csh', 'sh']);
    -  registerLangHandler(sourceDecorator({
    -          'keywords': PYTHON_KEYWORDS,
    -          'hashComments': true,
    -          'multiLineStrings': true,
    -          'tripleQuotedStrings': true
    -        }), ['cv', 'py', 'python']);
    -  registerLangHandler(sourceDecorator({
    -          'keywords': PERL_KEYWORDS,
    -          'hashComments': true,
    -          'multiLineStrings': true,
    -          'regexLiterals': 2  // multiline regex literals
    -        }), ['perl', 'pl', 'pm']);
    -  registerLangHandler(sourceDecorator({
    -          'keywords': RUBY_KEYWORDS,
    -          'hashComments': true,
    -          'multiLineStrings': true,
    -          'regexLiterals': true
    -        }), ['rb', 'ruby']);
    -  registerLangHandler(sourceDecorator({
    -          'keywords': JSCRIPT_KEYWORDS,
    -          'cStyleComments': true,
    -          'regexLiterals': true
    -        }), ['javascript', 'js']);
    -  registerLangHandler(sourceDecorator({
    -          'keywords': COFFEE_KEYWORDS,
    -          'hashComments': 3,  // ### style block comments
    -          'cStyleComments': true,
    -          'multilineStrings': true,
    -          'tripleQuotedStrings': true,
    -          'regexLiterals': true
    -        }), ['coffee']);
    -  registerLangHandler(sourceDecorator({
    -          'keywords': RUST_KEYWORDS,
    -          'cStyleComments': true,
    -          'multilineStrings': true
    -        }), ['rc', 'rs', 'rust']);
    -  registerLangHandler(
    -      createSimpleLexer([], [[PR_STRING, /^[\s\S]+/]]), ['regex']);
    -
    -  function applyDecorator(job) {
    -    var opt_langExtension = job.langExtension;
    -
    -    try {
    -      // Extract tags, and convert the source code to plain text.
    -      var sourceAndSpans = extractSourceSpans(job.sourceNode, job.pre);
    -      /** Plain text. @type {string} */
    -      var source = sourceAndSpans.sourceCode;
    -      job.sourceCode = source;
    -      job.spans = sourceAndSpans.spans;
    -      job.basePos = 0;
    -
    -      // Apply the appropriate language handler
    -      langHandlerForExtension(opt_langExtension, source)(job);
    -
    -      // Integrate the decorations and tags back into the source code,
    -      // modifying the sourceNode in place.
    -      recombineTagsAndDecorations(job);
    -    } catch (e) {
    -      if (win['console']) {
    -        console['log'](e && e['stack'] || e);
    -      }
    -    }
    -  }
    -
    -  /**
    -   * Pretty print a chunk of code.
    -   * @param sourceCodeHtml {string} The HTML to pretty print.
    -   * @param opt_langExtension {string} The language name to use.
    -   *     Typically, a filename extension like 'cpp' or 'java'.
    -   * @param opt_numberLines {number|boolean} True to number lines,
    -   *     or the 1-indexed number of the first line in sourceCodeHtml.
    -   */
    -  function $prettyPrintOne(sourceCodeHtml, opt_langExtension, opt_numberLines) {
    -    var container = document.createElement('div');
    -    // This could cause images to load and onload listeners to fire.
    -    // E.g. <img onerror="alert(1337)" src="nosuchimage.png">.
    -    // We assume that the inner HTML is from a trusted source.
    -    // The pre-tag is required for IE8 which strips newlines from innerHTML
    -    // when it is injected into a <pre> tag.
    -    // http://stackoverflow.com/questions/451486/pre-tag-loses-line-breaks-when-setting-innerhtml-in-ie
    -    // http://stackoverflow.com/questions/195363/inserting-a-newline-into-a-pre-tag-ie-javascript
    -    container.innerHTML = '<pre>' + sourceCodeHtml + '</pre>';
    -    container = container.firstChild;
    -    if (opt_numberLines) {
    -      numberLines(container, opt_numberLines, true);
    -    }
    -
    -    var job = {
    -      langExtension: opt_langExtension,
    -      numberLines: opt_numberLines,
    -      sourceNode: container,
    -      pre: 1
    -    };
    -    applyDecorator(job);
    -    return container.innerHTML;
    -  }
    -
    -   /**
    -    * Find all the {@code <pre>} and {@code <code>} tags in the DOM with
    -    * {@code class=prettyprint} and prettify them.
    -    *
    -    * @param {Function} opt_whenDone called when prettifying is done.
    -    * @param {HTMLElement|HTMLDocument} opt_root an element or document
    -    *   containing all the elements to pretty print.
    -    *   Defaults to {@code document.body}.
    -    */
    -  function $prettyPrint(opt_whenDone, opt_root) {
    -    var root = opt_root || document.body;
    -    var doc = root.ownerDocument || document;
    -    function byTagName(tn) { return root.getElementsByTagName(tn); }
    -    // fetch a list of nodes to rewrite
    -    var codeSegments = [byTagName('pre'), byTagName('code'), byTagName('xmp')];
    -    var elements = [];
    -    for (var i = 0; i < codeSegments.length; ++i) {
    -      for (var j = 0, n = codeSegments[i].length; j < n; ++j) {
    -        elements.push(codeSegments[i][j]);
    -      }
    -    }
    -    codeSegments = null;
    -
    -    var clock = Date;
    -    if (!clock['now']) {
    -      clock = { 'now': function () { return +(new Date); } };
    -    }
    -
    -    // The loop is broken into a series of continuations to make sure that we
    -    // don't make the browser unresponsive when rewriting a large page.
    -    var k = 0;
    -    var prettyPrintingJob;
    -
    -    var langExtensionRe = /\blang(?:uage)?-([\w.]+)(?!\S)/;
    -    var prettyPrintRe = /\bprettyprint\b/;
    -    var prettyPrintedRe = /\bprettyprinted\b/;
    -    var preformattedTagNameRe = /pre|xmp/i;
    -    var codeRe = /^code$/i;
    -    var preCodeXmpRe = /^(?:pre|code|xmp)$/i;
    -    var EMPTY = {};
    -
    -    function doWork() {
    -      var endTime = (win['PR_SHOULD_USE_CONTINUATION'] ?
    -                     clock['now']() + 250 /* ms */ :
    -                     Infinity);
    -      for (; k < elements.length && clock['now']() < endTime; k++) {
    -        var cs = elements[k];
    -
    -        // Look for a preceding comment like
    -        // <?prettify lang="..." linenums="..."?>
    -        var attrs = EMPTY;
    -        {
    -          for (var preceder = cs; (preceder = preceder.previousSibling);) {
    -            var nt = preceder.nodeType;
    -            // <?foo?> is parsed by HTML 5 to a comment node (8)
    -            // like <!--?foo?-->, but in XML is a processing instruction
    -            var value = (nt === 7 || nt === 8) && preceder.nodeValue;
    -            if (value
    -                ? !/^\??prettify\b/.test(value)
    -                : (nt !== 3 || /\S/.test(preceder.nodeValue))) {
    -              // Skip over white-space text nodes but not others.
    -              break;
    -            }
    -            if (value) {
    -              attrs = {};
    -              value.replace(
    -                  /\b(\w+)=([\w:.%+-]+)/g,
    -                function (_, name, value) { attrs[name] = value; });
    -              break;
    -            }
    -          }
    -        }
    -
    -        var className = cs.className;
    -        if ((attrs !== EMPTY || prettyPrintRe.test(className))
    -            // Don't redo this if we've already done it.
    -            // This allows recalling pretty print to just prettyprint elements
    -            // that have been added to the page since last call.
    -            && !prettyPrintedRe.test(className)) {
    -
    -          // make sure this is not nested in an already prettified element
    -          var nested = false;
    -          for (var p = cs.parentNode; p; p = p.parentNode) {
    -            var tn = p.tagName;
    -            if (preCodeXmpRe.test(tn)
    -                && p.className && prettyPrintRe.test(p.className)) {
    -              nested = true;
    -              break;
    -            }
    -          }
    -          if (!nested) {
    -            // Mark done.  If we fail to prettyprint for whatever reason,
    -            // we shouldn't try again.
    -            cs.className += ' prettyprinted';
    -
    -            // If the classes includes a language extensions, use it.
    -            // Language extensions can be specified like
    -            //     <pre class="prettyprint lang-cpp">
    -            // the language extension "cpp" is used to find a language handler
    -            // as passed to PR.registerLangHandler.
    -            // HTML5 recommends that a language be specified using "language-"
    -            // as the prefix instead.  Google Code Prettify supports both.
    -            // http://dev.w3.org/html5/spec-author-view/the-code-element.html
    -            var langExtension = attrs['lang'];
    -            if (!langExtension) {
    -              langExtension = className.match(langExtensionRe);
    -              // Support <pre class="prettyprint"><code class="language-c">
    -              var wrapper;
    -              if (!langExtension && (wrapper = childContentWrapper(cs))
    -                  && codeRe.test(wrapper.tagName)) {
    -                langExtension = wrapper.className.match(langExtensionRe);
    -              }
    -
    -              if (langExtension) { langExtension = langExtension[1]; }
    -            }
    -
    -            var preformatted;
    -            if (preformattedTagNameRe.test(cs.tagName)) {
    -              preformatted = 1;
    -            } else {
    -              var currentStyle = cs['currentStyle'];
    -              var defaultView = doc.defaultView;
    -              var whitespace = (
    -                  currentStyle
    -                  ? currentStyle['whiteSpace']
    -                  : (defaultView
    -                     && defaultView.getComputedStyle)
    -                  ? defaultView.getComputedStyle(cs, null)
    -                  .getPropertyValue('white-space')
    -                  : 0);
    -              preformatted = whitespace
    -                  && 'pre' === whitespace.substring(0, 3);
    -            }
    -
    -            // Look for a class like linenums or linenums:<n> where <n> is the
    -            // 1-indexed number of the first line.
    -            var lineNums = attrs['linenums'];
    -            if (!(lineNums = lineNums === 'true' || +lineNums)) {
    -              lineNums = className.match(/\blinenums\b(?::(\d+))?/);
    -              lineNums =
    -                lineNums
    -                ? lineNums[1] && lineNums[1].length
    -                  ? +lineNums[1] : true
    -                : false;
    -            }
    -            if (lineNums) { numberLines(cs, lineNums, preformatted); }
    -
    -            // do the pretty printing
    -            prettyPrintingJob = {
    -              langExtension: langExtension,
    -              sourceNode: cs,
    -              numberLines: lineNums,
    -              pre: preformatted
    -            };
    -            applyDecorator(prettyPrintingJob);
    -          }
    -        }
    -      }
    -      if (k < elements.length) {
    -        // finish up in a continuation
    -        setTimeout(doWork, 250);
    -      } else if ('function' === typeof opt_whenDone) {
    -        opt_whenDone();
    -      }
    -    }
    -
    -    doWork();
    -  }
    -
    -  /**
    -   * Contains functions for creating and registering new language handlers.
    -   * @type {Object}
    -   */
    -  var PR = win['PR'] = {
    -        'createSimpleLexer': createSimpleLexer,
    -        'registerLangHandler': registerLangHandler,
    -        'sourceDecorator': sourceDecorator,
    -        'PR_ATTRIB_NAME': PR_ATTRIB_NAME,
    -        'PR_ATTRIB_VALUE': PR_ATTRIB_VALUE,
    -        'PR_COMMENT': PR_COMMENT,
    -        'PR_DECLARATION': PR_DECLARATION,
    -        'PR_KEYWORD': PR_KEYWORD,
    -        'PR_LITERAL': PR_LITERAL,
    -        'PR_NOCODE': PR_NOCODE,
    -        'PR_PLAIN': PR_PLAIN,
    -        'PR_PUNCTUATION': PR_PUNCTUATION,
    -        'PR_SOURCE': PR_SOURCE,
    -        'PR_STRING': PR_STRING,
    -        'PR_TAG': PR_TAG,
    -        'PR_TYPE': PR_TYPE,
    -        'prettyPrintOne':
    -           IN_GLOBAL_SCOPE
    -             ? (win['prettyPrintOne'] = $prettyPrintOne)
    -             : (prettyPrintOne = $prettyPrintOne),
    -        'prettyPrint': prettyPrint =
    -           IN_GLOBAL_SCOPE
    -             ? (win['prettyPrint'] = $prettyPrint)
    -             : (prettyPrint = $prettyPrint)
    -      };
    -
    -  // Make PR available via the Asynchronous Module Definition (AMD) API.
    -  // Per https://github.com/amdjs/amdjs-api/wiki/AMD:
    -  // The Asynchronous Module Definition (AMD) API specifies a
    -  // mechanism for defining modules such that the module and its
    -  // dependencies can be asynchronously loaded.
    -  // ...
    -  // To allow a clear indicator that a global define function (as
    -  // needed for script src browser loading) conforms to the AMD API,
    -  // any global define function SHOULD have a property called "amd"
    -  // whose value is an object. This helps avoid conflict with any
    -  // other existing JavaScript code that could have defined a define()
    -  // function that does not conform to the AMD API.
    -  if (typeof define === "function" && define['amd']) {
    -    define("google-code-prettify", [], function () {
    -      return PR; 
    -    });
    -  }
    -})();
    diff --git a/jOOQ-website/json/.htaccess b/jOOQ-website/json/.htaccess
    deleted file mode 100644
    index a7d398c001..0000000000
    --- a/jOOQ-website/json/.htaccess
    +++ /dev/null
    @@ -1 +0,0 @@
    -php_flag allow_url_fopen on
    \ No newline at end of file
    diff --git a/jOOQ-website/json/stats.php b/jOOQ-website/json/stats.php
    deleted file mode 100644
    index 9b1fcc18a5..0000000000
    --- a/jOOQ-website/json/stats.php
    +++ /dev/null
    @@ -1,23 +0,0 @@
    -<?php
    -header("Content-Type: text/javascript");
    -
    -echo '{"sourceforge": ';
    -echo file_get_contents(
    -  "http://sourceforge.net/projects/jooq/files/stats/json?start_date=" .
    -   date('Y-m-d', time() - (390 * 24 * 60 * 60)) .
    -  "&end_date=" .
    -   date('Y-m-d', time() - (30 * 24 * 60 * 60)));
    -
    -// Maven statistics are manually downloaded from oss.sonatype.com:
    -echo ', "maven": {"2011-04":"23",  "2011-05":"30",  "2011-06":"43",' .
    -                 '"2011-07":"73",  "2011-08":"80",  "2011-09":"89",' .
    -                 '"2011-10":"89",  "2011-11":"302", "2011-12":"236",' .
    -                 '"2012-01":"332", "2012-02":"428", "2012-03":"358",' .
    -                 '"2012-04":"461", "2012-05":"573", "2012-06":"659",' .
    -                 '"2012-07":"782", "2012-08":"805", "2012-09":"943",' .
    -                 '"2012-10":"1148","2012-11":"1084","2012-12":"1087",' .
    -                 '"2013-01":"1266","2013-02":"1297","2013-03":"1696",' .
    -                 '"2013-04":"1660","2013-05":"2098","2013-06":"2019",' .
    -                 '"2013-07":"2480","2013-08":"1738"}}';
    -
    -?>
    \ No newline at end of file
    diff --git a/jOOQ-website/launch/Transform.launch b/jOOQ-website/launch/Transform.launch
    deleted file mode 100644
    index 237927b025..0000000000
    --- a/jOOQ-website/launch/Transform.launch
    +++ /dev/null
    @@ -1,13 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8" standalone="no"?>
    -<launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication">
    -<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
    -<listEntry value="/jOOQ-website/src/main/java/Transform.java"/>
    -</listAttribute>
    -<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
    -<listEntry value="1"/>
    -</listAttribute>
    -<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="org.eclipse.m2e.launchconfig.classpathProvider"/>
    -<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="Transform"/>
    -<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="jOOQ-website"/>
    -<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.m2e.launchconfig.sourcepathProvider"/>
    -</launchConfiguration>
    diff --git a/jOOQ-website/learn.php b/jOOQ-website/learn.php
    deleted file mode 100644
    index e4afe4a724..0000000000
    --- a/jOOQ-website/learn.php
    +++ /dev/null
    @@ -1,239 +0,0 @@
    -<?php
    -require 'frame.php';
    -function getH1() {
    -	return 'The manual, tutorials, FAQ, references';
    -}
    -function getActiveMenu() {
    -	return "learn";
    -}
    -function printStep($step) {
    -	global $root;
    -    global $minorVersion;
    -	global $version;
    -	
    -	echo $root . '/doc/' . $minorVersion . '/manual/getting-started/tutorials/jooq-in-7-steps/jooq-in-7-steps-step' . $step;
    -}
    -function printContent() {
    -	global $root;
    -    global $minorVersion;
    -	global $version;
    -?>
    -
    -<table width="100%">
    -<tr>
    -
    -<td valign="top" width="50%">
    -<table width="100%">
    -<tr>
    -<td colspan="3">
    -<h2>3.x Documentation</h2>
    -</td>
    -<tr>
    -<th width="80" class="right">Version</th>
    -<th class="right">Javadoc</th>
    -<th class="right">Manual</th>
    -</tr>
    -<tr>
    -<td class="right">3.1.0</td>
    -<td class="right">
    -	<a style="padding-right: 20px" href="http://www.jooq.org/javadoc/latest/" title="The jOOQ Javadoc">HTML</a>
    -</td>
    -<td class="right">
    -	<a style="padding-right: 20px" href="<?=$root?>/doc/3.1/manual-single-page" title="The jOOQ Manual on one single page">HTML</a>
    -	<a style="padding-right: 20px" href="<?=$root?>/doc/3.1/manual" title="The jOOQ Manual on multiple pages">HTML (multi-page)</a>
    -	<a style="padding-right: 20px" href="<?=$root?>/doc/3.1/manual-pdf/jOOQ-manual-3.1.pdf" title="The jOOQ Manual as a PDF">PDF</a>
    -</td>
    -</tr>
    -
    -<tr>
    -<td class="right">3.0.0</td>
    -<td class="right">
    -	<a style="padding-right: 20px" href="http://www.jooq.org/javadoc/3.0.x/" title="The jOOQ Javadoc">HTML</a>
    -</td>
    -<td class="right">
    -	<a style="padding-right: 20px" href="<?=$root?>/doc/3.0/manual-single-page" title="The jOOQ Manual on one single page">HTML</a>
    -	<a style="padding-right: 20px" href="<?=$root?>/doc/3.0/manual" title="The jOOQ Manual on multiple pages">HTML (multi-page)</a>
    -	<a style="padding-right: 20px" href="<?=$root?>/doc/3.0/manual-pdf/jOOQ-manual-3.0.pdf" title="The jOOQ Manual as a PDF">PDF</a>
    -</td>
    -</tr>
    -
    -<td colspan="3">
    -<h2>2.x Documentation</h2>
    -</td>
    -<tr>
    -<th width="80" class="right">Version</th>
    -<th class="right">Javadoc</th>
    -<th class="right">Manual</th>
    -</tr>
    -
    -<tr>
    -<td class="right">2.6.0</td>
    -<td class="right">
    -	<a style="padding-right: 20px" href="http://www.jooq.org/javadoc/2.6.x/" title="The jOOQ Javadoc">HTML</a>
    -</td>
    -<td class="right">
    -	<a style="padding-right: 20px" href="<?=$root?>/doc/2.6/manual-single-page" title="The jOOQ Manual on one single page">HTML</a>
    -	<a style="padding-right: 20px" href="<?=$root?>/doc/2.6/manual" title="The jOOQ Manual on multiple pages">HTML (multi-page)</a>
    -	<a style="padding-right: 20px" href="<?=$root?>/doc/2.6/manual-pdf/jOOQ-manual-2.6.pdf" title="The jOOQ Manual as a PDF">PDF</a>
    -</td>
    -</tr>
    -
    -<tr>
    -<td class="right">2.5.0</td>
    -<td class="right">
    -	<a style="padding-right: 20px" href="http://www.jooq.org/javadoc/2.5.x/" title="The jOOQ Javadoc">HTML</a>
    -</td>
    -<td class="right">
    -	<a style="padding-right: 20px" href="<?=$root?>/doc/2.5/manual-single-page" title="The jOOQ Manual on one single page">HTML</a>
    -	<a style="padding-right: 20px" href="<?=$root?>/doc/2.5/manual" title="The jOOQ Manual on multiple pages">HTML (multi-page)</a>
    -	<a style="padding-right: 20px" href="<?=$root?>/doc/2.5/manual-pdf/jOOQ-manual-2.5.pdf" title="The jOOQ Manual as a PDF">PDF</a>
    -</td>
    -</tr>
    -
    -<tr>
    -<td class="right">2.4.0</td>
    -<td class="right">
    -	<a style="padding-right: 20px" href="http://www.jooq.org/javadoc/2.4.x/" title="The jOOQ Javadoc">HTML</a>
    -</td>
    -<td class="right">
    -	<a style="padding-right: 20px" href="<?=$root?>/manual-single-page" title="The jOOQ Manual on one single page">HTML</a>
    -	<a style="padding-right: 20px" href="<?=$root?>/manual" title="The jOOQ Manual on multiple pages">HTML (multi-page)</a>
    -	<a style="padding-right: 20px" href="<?=$root?>/manual-pdf/jOOQ-manual.pdf" title="The jOOQ Manual as a PDF">PDF</a>
    -</td>
    -</tr>
    -
    -<tr>
    -<td class="right">2.3.0</td>
    -<td class="right">
    -	<a style="padding-right: 20px" href="http://www.jooq.org/javadoc/2.3.x/" title="The jOOQ Javadoc">HTML</a>
    -</td>
    -<td class="right">
    -</td>
    -</tr>
    -
    -<tr>
    -<td class="right">2.2.0</td>
    -<td class="right">
    -	<a style="padding-right: 20px" href="http://www.jooq.org/javadoc/2.2.x/" title="The jOOQ Javadoc">HTML</a>
    -</td>
    -<td class="right">
    -</td>
    -</tr>
    -
    -<tr>
    -<td class="right">2.1.0</td>
    -<td class="right">
    -	<a style="padding-right: 20px" href="http://www.jooq.org/javadoc/2.1.x/" title="The jOOQ Javadoc">HTML</a>
    -</td>
    -<td class="right">
    -</td>
    -</tr>
    -
    -<tr>
    -<td class="right">2.0.0</td>
    -<td class="right">
    -	<a style="padding-right: 20px" href="http://www.jooq.org/javadoc/2.0.x/" title="The jOOQ Javadoc">HTML</a>
    -</td>
    -<td class="right">
    -</td>
    -</tr>
    -</table>
    -
    -<h2 id="FAQ">FAQ</h2>
    -<p>
    -Before you go on and read the whole manual, there are a couple of interesting questions that you might want to consider:
    -</p>
    -
    -<p>
    -<b class="mono">Q:</b> When I generate source code from MySQL, can I also use it on another database?<br/>
    -<b class="mono">A:</b> Yes! The generated Java code will work for all supported databases, not only for the database driver that you used when you generated the code.
    -</p>
    -
    -<p>
    -<b class="mono">Q:</b> When I generate source code from my developer database, can I also use it on production?<br/>
    -<b class="mono">A:</b> Yes! You can map your schema at code generation time or at run time. <a href="http://www.jooq.org/doc/<?=$minorVersion?>/manual/code-generation/codegen-advanced" title="Schema mapping functionality in jOOQ">See the manual for details.</a>
    -</p>
    -
    -<p>
    -<b class="mono">Q:</b> Can I use jOOQ without code generation?<br/>
    -<b class="mono">A:</b> Yes! You can define tables, fields, conditions using Strings. <a href="http://www.jooq.org/doc/<?=$minorVersion?>/manual/getting-started/use-cases" title="Plain SQL functionality in jOOQ">See the manual for details.</a>
    -</p>
    -
    -<p>
    -<b class="mono">Q:</b> Can I use jOOQ as a query builder and execute queries with Spring?<br/>
    -<b class="mono">A:</b> Yes! This has been done by other users and will be documented soon. <a href="http://stackoverflow.com/questions/4474365/jooq-and-spring" title="Stack Overflow question about using jOOQ with Spring">See this Stack Overflow question for details.</a>
    -</p>
    -</td>
    -
    -
    -<td valign="top" width="50%">
    -<table width="100%">
    -<tr>
    -<td>
    -<h2>Tutorial</h2>
    -<p>
    -Your simplest entry point is probably to get the tutorial
    -running. It shows how to use jOOQ and its code generator with a simple MySQL database
    -</p>
    -<ul>
    -    <li><a href="<?=printStep(1)?>">Preparation: Download jOOQ and your SQL driver</a></li>
    -    <li><a href="<?=printStep(2)?>">Step 1: Create a SQL database and a table</a></li>
    -    <li><a href="<?=printStep(3)?>">Step 2: Generate classes</a></li>
    -    <li><a href="<?=printStep(4)?>">Step 3: Write a main class and establish a MySQL connection</a></li>
    -    <li><a href="<?=printStep(5)?>">Step 4: Write a query using jOOQ's DSL</a></li>
    -    <li><a href="<?=printStep(6)?>">Step 5: Iterate over results</a></li>
    -    <li><a href="<?=printStep(7)?>">Step 6: Explore!</a></li>
    -</ul>
    -</td>
    -</tr>
    -<tr>
    -<td>
    -<h2>Book Recommendation</h2>
    -<p>
    -	With jOOQ, you will write a lot of SQL. Knowing SQL well is important. We highly recommend you read this book to write high-performing SQL:
    -</p>
    -<table width="100%">
    -<tr>
    -<td width="180" valign="top"><a href="http://sql-performance-explained.com/l" title="SQL Performance Explained by Markus Winand, author of Use-The-Index-Luke.com"><img src="<?=$root?>/img/sql-performance-explained-de.png" alt="SQL Performance Explained by Markus Winand, author of Use-The-Index-Luke.com" style="border: 2px solid black"/></a></td>
    -<td valign="top">Markus Winand is the author of the popular website <a href="http://use-the-index-luke.com">Use-The-Index-Luke.com</a>. His book explains nicely how to achieve proper indexing and performance in popular RDBMS:<br/><br/>
    -<table width="100%">
    -<tr>
    -<td>Author</td>
    -<td><a href="http://winand.at">Markus Winand</a></td>
    -</tr>
    -<tr>
    -<td>Title</td>
    -<td>
    -<a href="http://sql-performance-explained.com/l" title="SQL Performance Explained by Markus Winand, author of Use-The-Index-Luke.com">SQL Performance Explained</a></td>
    -</tr>
    -<tr>
    -<td>Available in</td>
    -<td><a href="http://sql-performance-explained.com">English</a>, <a href="http://sql-performance-explained.de">German</a>, <a href="http://sql-au-coeur-des-performances.fr">French</a></td>
    -</tr>
    -</table>
    -<br/><br/>
    -Read this book when writing SQL with jOOQ!
    -</td>
    -</tr>
    -</table>
    -</td>
    -</tr>
    -<tr>
    -<td>
    -<h2>Further readings</h2>
    -<ul>
    -<li><a href="http://tech.pro/tutorial/1555/10-easy-steps-to-a-complete-understanding-of-sql">10 Easy Steps to a Complete Understanding of SQL</a></li>
    -<li><a href="http://blog.jooq.org/2013/07/30/10-common-mistakes-java-developers-make-when-writing-sql/">10 Common Mistakes Java Developers Make When Writing SQL</a></li>
    -<li><a href="http://blog.jooq.org/2013/08/12/10-more-common-mistakes-java-developers-make-when-writing-sql/">10 More Common Mistakes Java Developers Make When Writing SQL</a></li>
    -<li><a href="http://blog.jooq.org/2012/01/05/the-java-fluent-api-designer-crash-course/">The Java Fluent API Designer Crash Course</a></li>
    -</ul>
    -</td>
    -</tr>
    -</table>
    -</td>
    -</tr>
    -</table>
    -
    -<?php
    -}
    -?>
    \ No newline at end of file
    diff --git a/jOOQ-website/licenses.php b/jOOQ-website/licenses.php
    deleted file mode 100644
    index 47e982bff5..0000000000
    --- a/jOOQ-website/licenses.php
    +++ /dev/null
    @@ -1,22 +0,0 @@
    -<?php
    -require 'frame.php';
    -function getH1() {
    -	return 'Licensing';
    -}
    -function getActiveMenu() {
    -	return "support";
    -}
    -function printContent() {
    -	global $root;
    -    global $minorVersion;
    -	global $version;
    -?>
    -
    -<h2>Licensing</h2>
    -<p>
    -	Come back soon to learn how to commercially license jOOQ.
    -</p>
    -
    -<?php
    -}
    -?>
    \ No newline at end of file
    diff --git a/jOOQ-website/news.php b/jOOQ-website/news.php
    deleted file mode 100644
    index 0bd5788fd0..0000000000
    --- a/jOOQ-website/news.php
    +++ /dev/null
    @@ -1,60 +0,0 @@
    -<?php
    -require 'frame.php';
    -function getH1() {
    -	return 'What\'s new around jOOQ';
    -}
    -function getActiveMenu() {
    -	return "news";
    -}
    -function printContent() {
    -	global $root;
    -    global $minorVersion;
    -	global $version;
    -?>
    -
    -
    -<table cellpadding="0" cellspacing="0" border="0" width="100%">
    -<tr>
    -<td colspan="3">
    -    <h2>Upcoming jOOQ events</h2>
    -</td>
    -</tr>
    -<tr>
    -    <th width="200" class="right">Date</th>
    -    <th width="40" class="right">Language</th>
    -    <th class="right">Event</th>
    -</tr>
    -<tr>
    -    <td class="right">October 2013</td>
    -    <td class="right">English</td>
    -    <td class="right">Hear about jOOQ and about lots of other good stuff at the <a href="http://www.medit-symposium.com">MEDIT Symposium</a> in Sicilly.</td>
    -</tr>
    -<td colspan="3">
    -    <h2>Past jOOQ events</h2>
    -</td>
    -<tr>
    -    <td class="right">September 2013</td>
    -    <td class="right">German</td>
    -    <td class="right">Join the jOOQ introductory sessions at the <a href="http://www.jugh.de/display/jugh/2013/08/06/JUGH-Treffen+26.+September+2013">JUGH</a> in Kassel, Germany</td>
    -</tr>
    -<tr>
    -    <td class="right">September 2013</td>
    -    <td class="right">German</td>
    -    <td class="right">Join the jOOQ training sessions at the <a href="http://www.ch-open.ch/wstage/workshop-tage/2013/aktuelles-programm-2013/ws-6-mit-jooq-und-opensource-datenbanken-sofort-produktiv-werden/">/ch/open workshop days</a> in Zurich, Switzerland</td>
    -</tr>
    -<tr>
    -    <td class="right">June 2013</td>
    -    <td class="right">German</td>
    -    <td class="right">Join the jOOQ introductory session at the <a href="http://www.jug.ch/html/events/2013/jooq_lu.html">JUGS</a> in Lucerne, Switzerland</td>
    -</tr>
    -<tr>
    -    <td class="right">July 2012</td>
    -    <td class="right">German</td>
    -    <td class="right">Join the jOOQ introductory session at the <a href="http://www.jug.ch/html/events/2012/jooq.html">JUGS</a> in Zurich, Switzerland</td>
    -</tr>
    -
    -</table>
    -
    -<?php
    -}
    -?>
    \ No newline at end of file
    diff --git a/jOOQ-website/notes.php b/jOOQ-website/notes.php
    deleted file mode 100644
    index 4b3f493b8f..0000000000
    --- a/jOOQ-website/notes.php
    +++ /dev/null
    @@ -1,118 +0,0 @@
    -<?php
    -require 'frame.php';
    -function getH1() {
    -	return 'The history of jOOQ. From 2009 to ' . date('Y');
    -}
    -function getActiveMenu() {
    -	return "download";
    -}
    -function printContent() {
    -    if (isset($_GET['version']) && $_GET['version'] == '2.0') {
    -	  $contents = file('inc/RELEASENOTES-2.0.txt');
    -    }
    -    else if (isset($_GET['version']) && $_GET['version'] == '2.1') {
    -	  $contents = file('inc/RELEASENOTES-2.1.txt');
    -    }
    -    else if (isset($_GET['version']) && $_GET['version'] == '2.2') {
    -	  $contents = file('inc/RELEASENOTES-2.2.txt');
    -    }
    -    else if (isset($_GET['version']) && $_GET['version'] == '2.3') {
    -	  $contents = file('inc/RELEASENOTES-2.3.txt');
    -    }
    -    else if (isset($_GET['version']) && $_GET['version'] == '2.4') {
    -	  $contents = file('inc/RELEASENOTES-2.4.txt');
    -    }
    -    else if (isset($_GET['version']) && $_GET['version'] == '2.5') {
    -	  $contents = file('inc/RELEASENOTES-2.5.txt');
    -    }
    -    else if (isset($_GET['version']) && $_GET['version'] == '2.6') {
    -	  $contents = file('inc/RELEASENOTES-2.6.txt');
    -    }
    -    else if (isset($_GET['version']) && $_GET['version'] == '3.0') {
    -	  $contents = file('inc/RELEASENOTES-3.0.txt');
    -    }
    -    else {
    -      $contents = file('inc/RELEASENOTES.txt');
    -    }
    -
    -	for ($i = 0; $i < count($contents); $i++) {
    -		if ($i + 1 < count($contents) && substr($contents[$i + 1], 0, 3) == '===') {
    -		    $id = trim(preg_replace('%Version (\d+\.\d+\.\d+).*\n?%', '$1', $contents[$i]));
    -			print '<h2 id="' . $id . '"><a href="#' . $id . '" name="' . $id . '">#</a> ';
    -			print $contents[$i];
    -			print '</h2>';
    -		}
    -		else if ($i + 1 < count($contents) && substr($contents[$i + 1], 0, 3) == '---') {
    -			print '<h3>';
    -			print $contents[$i];
    -			print '</h3>';
    -		}
    -
    -		else if (substr($contents[$i], 0, 3) == '===') {
    -			// Skip
    -		}
    -		else if (substr($contents[$i], 0, 3) == '---') {
    -			// Skip
    -		}
    -		else if (trim($contents[$i]) == '' && substr($contents[$i + 1], 0, 1) != '-') {
    -			print '<p>';
    -		}
    -
    -		// Create an <ul> from a list of "dashed" elements
    -		else if (substr($contents[$i], 0, 1) == '-') {
    -			print '<ul>';
    -
    -			while (trim($contents[$i]) != '') {
    -				print '<li>';
    -				print preg_replace('%-\s+(.*)%', '$1', markup($contents[$i]));
    -
    -				while (trim($contents[++$i]) != '' && substr($contents[$i], 0, 1) != '-') {
    -					print markup(htmlentities($contents[$i]));
    -				}
    -
    -				print '</li>';
    -			}
    -
    -			print '</ul><p>';
    -		}
    -
    -		// Create a ticket-table from a list of "hashed" elements
    -		else if (substr($contents[$i], 0, 1) == '#') {
    -			print '<table class="ticket-table">';
    -
    -			while (trim($contents[$i]) != '') {
    -				$ticket = preg_replace('%#(\d+).*%', '$1', $contents[$i]);
    -
    -				print '<tr>';
    -				print '<td width="80">';
    -				print '<a href="https://github.com/jOOQ/jOOQ/issues/' . $ticket . '">#';
    -				print $ticket;
    -				print '</a>';
    -				print '</td>';
    -				print '<td>';
    -				print htmlentities(preg_replace('%#\d+\s+-\s+(.*)%', '$1', $contents[$i]));
    -
    -				while (trim($contents[++$i]) != '' && substr($contents[$i], 0, 1) != '#') {
    -					print htmlentities($contents[$i]);
    -				}
    -
    -				print '</td>';
    -				print '</tr>';
    -			}
    -
    -			print '</table>';
    -		}
    -		else {
    -		    print markup($contents[$i]);
    -		}
    -	}
    -}
    -
    -function markup($value) {
    -	$value = htmlentities($value);
    -	$value = preg_replace('%&lt;pre( class=&quot;(.*?)&quot;)?&gt;%', '<pre class="$2">', $value);
    -	$value = preg_replace('%&lt;/pre&gt;%', '</pre>', $value);
    -	$value = preg_replace('%(https?://\S+)%', '<a href="$1">$1</a>', $value);
    -	return $value;
    -}
    -?>
    \ No newline at end of file
    diff --git a/jOOQ-website/pom.xml b/jOOQ-website/pom.xml
    deleted file mode 100644
    index 44d60e8e65..0000000000
    --- a/jOOQ-website/pom.xml
    +++ /dev/null
    @@ -1,57 +0,0 @@
    -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    -  <modelVersion>4.0.0</modelVersion>
    -  <groupId>jOOQ-website-man-builder</groupId>
    -  <artifactId>jOOQ-website-man-builder</artifactId>
    -  <version>0.0.1-SNAPSHOT</version>
    -  <dependencies>
    -      <dependency>
    -          <groupId>org.jooq</groupId>
    -          <artifactId>joox</artifactId>
    -          <version>0.9.3</version>
    -          <type>jar</type>
    -          <scope>compile</scope>
    -      </dependency>
    -      <dependency>
    -          <groupId>commons-io</groupId>
    -          <artifactId>commons-io</artifactId>
    -          <version>2.1</version>
    -          <type>jar</type>
    -          <scope>compile</scope>
    -      </dependency>
    -      <dependency>
    -          <groupId>org.apache.commons</groupId>
    -          <artifactId>commons-lang3</artifactId>
    -          <version>3.0.1</version>
    -          <type>jar</type>
    -          <scope>compile</scope>
    -      </dependency>
    -      <dependency>
    -          <groupId>xalan</groupId>
    -          <artifactId>xalan</artifactId>
    -          <version>2.7.1</version>
    -          <type>jar</type>
    -          <scope>compile</scope>
    -      </dependency>
    -      <dependency>
    -          <groupId>org.apache.xmlgraphics</groupId>
    -          <artifactId>fop</artifactId>
    -          <version>0.95</version>
    -          <type>jar</type>
    -          <scope>compile</scope>
    -      </dependency>
    -      <dependency>
    -          <groupId>org.apache.avalon.framework</groupId>
    -          <artifactId>avalon-framework-impl</artifactId>
    -          <version>4.3.1</version>
    -          <type>jar</type>
    -          <scope>compile</scope>
    -      </dependency>
    -      <dependency>
    -          <groupId>org.jooq</groupId>
    -          <artifactId>jooq</artifactId>
    -          <version>3.2.0-SNAPSHOT</version>
    -          <type>jar</type>
    -          <scope>compile</scope>
    -      </dependency>
    -  </dependencies>
    -</project>
    \ No newline at end of file
    diff --git a/jOOQ-website/registration-email-save.php b/jOOQ-website/registration-email-save.php
    deleted file mode 100644
    index e6da80871a..0000000000
    --- a/jOOQ-website/registration-email-save.php
    +++ /dev/null
    @@ -1,32 +0,0 @@
    -<?php
    -require 'access.php';
    -require 'MailChimp.class.php';
    -
    -$file = 'users.csv';
    -$handle = fopen('users.csv', 'a');
    -
    -fwrite($handle, 
    -  '"' . str_replace('"', '""', $_POST['name']) . '",' .
    -  '"' . str_replace('"', '""', $_POST['email']) . '",' .
    -  '"' . str_replace('"', '""', $_POST['country']) . '",' .
    -  '"' . str_replace('"', '""', $_POST['company_name']) . '",' .
    -  '"' . str_replace('"', '""', $_POST['company_size']) . '",' .
    -  '"' . str_replace('"', '""', $_POST['newsletter']) . '",' .
    -  '"' . date('Y-m-d H:i:s') . '"' . "\n"
    -);
    -
    -fclose($handle);
    -
    -if ($_POST['newsletter'] == '1' && $_POST['email'] != '') {
    -    $chimp = new MailChimp($access['chimp']);
    -    $result = $chimp->call('lists/subscribe', array(
    -                    'id'                => '24ff762dd2',
    -                    'email'             => array('email'=>$_POST['email']),
    -                    'merge_vars'        => array('FNAME'=>$_POST['name']),
    -                    'double_optin'      => false,
    -                    'update_existing'   => true,
    -                    'replace_interests' => false,
    -                    'send_welcome'      => true,
    -              ));
    -}
    -?>
    \ No newline at end of file
    diff --git a/jOOQ-website/registration-email.php b/jOOQ-website/registration-email.php
    deleted file mode 100644
    index f5a2184861..0000000000
    --- a/jOOQ-website/registration-email.php
    +++ /dev/null
    @@ -1,294 +0,0 @@
    -<form id="registration-email-form" name="registration-email" action="#" method="POST">
    -<div class="row">
    -  <div class="col col-1">Name</div>
    -  <div class="col col-2"><input class="input" name="name"/></div>
    -</div>
    -<div class="row">
    -  <div class="col col-1">E-Mail</div>
    -  <div class="col col-2"><input class="input" name="email"/></div>
    -</div>
    -<div class="row">
    -  <div class="col col-1">Country</div>
    -  <div class="col col-2">
    -    <select name="country">
    -      <option value="">Please select...</option>
    -      <option value="AF">Afghanistan</option>
    -      <option value="AX">Ã…land Islands</option>
    -      <option value="AL">Albania</option>
    -      <option value="DZ">Algeria</option>
    -      <option value="AS">American Samoa</option>
    -      <option value="AD">Andorra</option>
    -      <option value="AO">Angola</option>
    -      <option value="AI">Anguilla</option>
    -      <option value="AQ">Antarctica</option>
    -      <option value="AG">Antigua And Barbuda</option>
    -      <option value="AR">Argentina</option>
    -      <option value="AM">Armenia</option>
    -      <option value="AW">Aruba</option>
    -      <option value="AU">Australia</option>
    -      <option value="AT">Austria</option>
    -      <option value="AZ">Azerbaijan</option>
    -      <option value="BS">Bahamas</option>
    -      <option value="BH">Bahrain</option>
    -      <option value="BD">Bangladesh</option>
    -      <option value="BB">Barbados</option>
    -      <option value="BY">Belarus</option>
    -      <option value="BE">Belgium</option>
    -      <option value="BZ">Belize</option>
    -      <option value="BJ">Benin</option>
    -      <option value="BM">Bermuda</option>
    -      <option value="BT">Bhutan</option>
    -      <option value="BO">Bolivia</option>
    -      <option value="BA">Bosnia And Herzegovina</option>
    -      <option value="BW">Botswana</option>
    -      <option value="BV">Bouvet Island</option>
    -      <option value="BR">Brazil</option>
    -      <option value="IO">British Indian Ocean Territory</option>
    -      <option value="BN">Brunei Darussalam</option>
    -      <option value="BG">Bulgaria</option>
    -      <option value="BF">Burkina Faso</option>
    -      <option value="BI">Burundi</option>
    -      <option value="KH">Cambodia</option>
    -      <option value="CM">Cameroon</option>
    -      <option value="CA">Canada</option>
    -      <option value="CV">Cape Verde</option>
    -      <option value="KY">Cayman Islands</option>
    -      <option value="CF">Central African Republic</option>
    -      <option value="TD">Chad</option>
    -      <option value="CL">Chile</option>
    -      <option value="CN">China</option>
    -      <option value="CX">Christmas Island</option>
    -      <option value="CC">Cocos (Keeling) Islands</option>
    -      <option value="CO">Colombia</option>
    -      <option value="KM">Comoros</option>
    -      <option value="CG">Congo</option>
    -      <option value="CD">Congo, Democratic Republic</option>
    -      <option value="CK">Cook Islands</option>
    -      <option value="CR">Costa Rica</option>
    -      <option value="CI">Côte D'Ivoire</option>
    -      <option value="HR">Croatia</option>
    -      <option value="CU">Cuba</option>
    -      <option value="CY">Cyprus</option>
    -      <option value="CZ">Czech Republic</option>
    -      <option value="DK">Denmark</option>
    -      <option value="DJ">Djibouti</option>
    -      <option value="DM">Dominica</option>
    -      <option value="DO">Dominican Republic</option>
    -      <option value="EC">Ecuador</option>
    -      <option value="EG">Egypt</option>
    -      <option value="SV">El Salvador</option>
    -      <option value="GQ">Equatorial Guinea</option>
    -      <option value="ER">Eritrea</option>
    -      <option value="EE">Estonia</option>
    -      <option value="ET">Ethiopia</option>
    -      <option value="FK">Falkland Islands (Malvinas)</option>
    -      <option value="FO">Faroe Islands</option>
    -      <option value="FJ">Fiji</option>
    -      <option value="FI">Finland</option>
    -      <option value="FR">France</option>
    -      <option value="GF">French Guiana</option>
    -      <option value="PF">French Polynesia</option>
    -      <option value="TF">French Southern Territories</option>
    -      <option value="GA">Gabon</option>
    -      <option value="GM">Gambia</option>
    -      <option value="GE">Georgia</option>
    -      <option value="DE">Germany</option>
    -      <option value="GH">Ghana</option>
    -      <option value="GI">Gibraltar</option>
    -      <option value="GR">Greece</option>
    -      <option value="GL">Greenland</option>
    -      <option value="GD">Grenada</option>
    -      <option value="GP">Guadeloupe</option>
    -      <option value="GU">Guam</option>
    -      <option value="GT">Guatemala</option>
    -      <option value="GN">Guinea</option>
    -      <option value="GW">Guinea-Bissau</option>
    -      <option value="GY">Guyana</option>
    -      <option value="HT">Haiti</option>
    -      <option value="HM">Heard Island And Mcdonald Islands</option>
    -      <option value="VA">Holy See (Vatican City State)</option>
    -      <option value="HN">Honduras</option>
    -      <option value="HK">Hong Kong</option>
    -      <option value="HU">Hungary</option>
    -      <option value="IS">Iceland</option>
    -      <option value="IN">India</option>
    -      <option value="ID">Indonesia</option>
    -      <option value="IR">Iran, Islamic Republic Of</option>
    -      <option value="IQ">Iraq</option>
    -      <option value="IE">Ireland</option>
    -      <option value="IL">Israel</option>
    -      <option value="IT">Italy</option>
    -      <option value="JM">Jamaica</option>
    -      <option value="JP">Japan</option>
    -      <option value="JO">Jordan</option>
    -      <option value="KZ">Kazakhstan</option>
    -      <option value="KE">Kenya</option>
    -      <option value="KI">Kiribati</option>
    -      <option value="KP">Korea, North</option>
    -      <option value="KR">Korea, South</option>
    -      <option value="KW">Kuwait</option>
    -      <option value="KG">Kyrgyzstan</option>
    -      <option value="LA">Lao People's Democratic Republic</option>
    -      <option value="LV">Latvia</option>
    -      <option value="LB">Lebanon</option>
    -      <option value="LS">Lesotho</option>
    -      <option value="LR">Liberia</option>
    -      <option value="LY">Libyan Arab Jamahiriya</option>
    -      <option value="LI">Liechtenstein</option>
    -      <option value="LT">Lithuania</option>
    -      <option value="LU">Luxembourg</option>
    -      <option value="MO">Macao</option>
    -      <option value="MK">Macedonia</option>
    -      <option value="MG">Madagascar</option>
    -      <option value="MW">Malawi</option>
    -      <option value="MY">Malaysia</option>
    -      <option value="MV">Maldives</option>
    -      <option value="ML">Mali</option>
    -      <option value="MT">Malta</option>
    -      <option value="MH">Marshall Islands</option>
    -      <option value="MQ">Martinique</option>
    -      <option value="MR">Mauritania</option>
    -      <option value="MU">Mauritius</option>
    -      <option value="YT">Mayotte</option>
    -      <option value="MX">Mexico</option>
    -      <option value="FM">Micronesia</option>
    -      <option value="MD">Moldova, Republic Of</option>
    -      <option value="MC">Monaco</option>
    -      <option value="MN">Mongolia</option>
    -      <option value="ME">Montenegro</option>
    -      <option value="MS">Montserrat</option>
    -      <option value="MA">Morocco</option>
    -      <option value="MZ">Mozambique</option>
    -      <option value="MM">Myanmar</option>
    -      <option value="NA">Namibia</option>
    -      <option value="NR">Nauru</option>
    -      <option value="NP">Nepal</option>
    -      <option value="NL">Netherlands</option>
    -      <option value="AN">Netherlands Antilles</option>
    -      <option value="NC">New Caledonia</option>
    -      <option value="NZ">New Zealand</option>
    -      <option value="NI">Nicaragua</option>
    -      <option value="NE">Niger</option>
    -      <option value="NG">Nigeria</option>
    -      <option value="NU">Niue</option>
    -      <option value="NF">Norfolk Island</option>
    -      <option value="MP">Northern Mariana Islands</option>
    -      <option value="NO">Norway</option>
    -      <option value="OM">Oman</option>
    -      <option value="PK">Pakistan</option>
    -      <option value="PW">Palau</option>
    -      <option value="PS">Palestinian Territory, Occupied</option>
    -      <option value="PA">Panama</option>
    -      <option value="PG">Papua New Guinea</option>
    -      <option value="PY">Paraguay</option>
    -      <option value="PE">Peru</option>
    -      <option value="PH">Philippines</option>
    -      <option value="PN">Pitcairn</option>
    -      <option value="PL">Poland</option>
    -      <option value="PT">Portugal</option>
    -      <option value="PR">Puerto Rico</option>
    -      <option value="QA">Qatar</option>
    -      <option value="RE">Reunion</option>
    -      <option value="RO">Romania</option>
    -      <option value="RU">Russian Federation</option>
    -      <option value="RW">Rwanda</option>
    -      <option value="SH">Saint Helena</option>
    -      <option value="KN">Saint Kitts And Nevis</option>
    -      <option value="LC">Saint Lucia</option>
    -      <option value="PM">Saint Pierre And Miquelon</option>
    -      <option value="VC">Saint Vincent And The Grenadines</option>
    -      <option value="WS">Samoa</option>
    -      <option value="SM">San Marino</option>
    -      <option value="ST">São Tome And Principe</option>
    -      <option value="SA">Saudi Arabia</option>
    -      <option value="SN">Senegal</option>
    -      <option value="RS">Serbia</option>
    -      <option value="SC">Seychelles</option>
    -      <option value="SL">Sierra Leone</option>
    -      <option value="SG">Singapore</option>
    -      <option value="SK">Slovakia</option>
    -      <option value="SI">Slovenia</option>
    -      <option value="SB">Solomon Islands</option>
    -      <option value="SO">Somalia</option>
    -      <option value="ZA">South Africa</option>
    -      <option value="GS">South Georgia</option>
    -      <option value="ES">Spain</option>
    -      <option value="LK">Sri Lanka</option>
    -      <option value="SD">Sudan</option>
    -      <option value="SR">Suriname</option>
    -      <option value="SJ">Svalbard And Jan Mayen</option>
    -      <option value="SZ">Swaziland</option>
    -      <option value="SE">Sweden</option>
    -      <option value="CH">Switzerland</option>
    -      <option value="SY">Syrian Arab Republic</option>
    -      <option value="TW">Taiwan</option>
    -      <option value="TJ">Tajikistan</option>
    -      <option value="TZ">Tanzania, United Republic Of</option>
    -      <option value="TH">Thailand</option>
    -      <option value="TL">Timor-Leste</option>
    -      <option value="TG">Togo</option>
    -      <option value="TK">Tokelau</option>
    -      <option value="TO">Tonga</option>
    -      <option value="TT">Trinidad And Tobago</option>
    -      <option value="TN">Tunisia</option>
    -      <option value="TR">Turkey</option>
    -      <option value="TM">Turkmenistan</option>
    -      <option value="TC">Turks And Caicos Islands</option>
    -      <option value="TV">Tuvalu</option>
    -      <option value="UG">Uganda</option>
    -      <option value="UA">Ukraine</option>
    -      <option value="AE">United Arab Emirates</option>
    -      <option value="GB">United Kingdom</option>
    -      <option value="US">United States</option>
    -      <option value="UM">United States Minor Outlying Islands</option>
    -      <option value="UY">Uruguay</option>
    -      <option value="UZ">Uzbekistan</option>
    -      <option value="VU">Vanuatu</option>
    -      <option value="VE">Venezuela</option>
    -      <option value="VN">Viet Nam</option>
    -      <option value="VG">Virgin Islands, British</option>
    -      <option value="VI">Virgin Islands, U.S.</option>
    -      <option value="WF">Wallis And Futuna</option>
    -      <option value="EH">Western Sahara</option>
    -      <option value="YE">Yemen</option>
    -      <option value="ZM">Zambia</option>
    -      <option value="ZW">Zimbabwe</option>
    -    </select>
    -  </div>
    -</div>
    -<div class="row">
    -  <div class="col col-1">Company Name</div>
    -  <div class="col col-2"><input class="input" name="company_name"/></div>
    -</div>
    -<div class="row">
    -  <div class="col col-1">Company Size</div>
    -  <div class="col col-2">
    -    <select name="company_size">
    -      <option value="">Please select...</option>
    -      <option value="1">Only me</option>
    -      <option value="10">Less than 10</option>
    -      <option value="100">Less than 100</option>
    -      <option value="1000">Less than 1000</option>
    -      <option value="10000">Less than 10000</option>
    -      <option value="99999">More than 10000</option>
    -    </select>
    -  </div>
    -</div>
    -<div class="row">
    -  <div class="col col-1">Newsletter</div>
    -  <div class="col col-2"><input type="checkbox" id="newsletter" name="newsletter" value="1" checked="checked"/><label for="newsletter">Receive our monthly newsletter</label></div>
    -</div>
    -<div class="row">
    -  <div class="col col-1">&#160;</div>
    -  <div class="col col-1">
    -    <button class="save">
    -      Save
    -    </button>
    -  </div>
    -  <div class="col col-1">
    -    <button class="no-thanks" data-cookie="jooq-registration-email" data-fade="email">
    -      No thanks
    -    </button>  
    -  </div>
    -</div>
    -</form>
    \ No newline at end of file
    diff --git a/jOOQ-website/robots.txt b/jOOQ-website/robots.txt
    deleted file mode 100644
    index bc1164092c..0000000000
    --- a/jOOQ-website/robots.txt
    +++ /dev/null
    @@ -1,3 +0,0 @@
    -User-agent: *
    -Allow: /
    -
    diff --git a/jOOQ-website/sql-as-seen-by-jooq.svg b/jOOQ-website/sql-as-seen-by-jooq.svg
    deleted file mode 100644
    index 2f871cd000..0000000000
    --- a/jOOQ-website/sql-as-seen-by-jooq.svg
    +++ /dev/null
    @@ -1,537 +0,0 @@
    -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" http-equiv="Content-Type" content="application/xhtml+xml"></xhtml:meta><xhtml:link xmlns:xhtml="http://www.w3.org/1999/xhtml" rel="shortcut icon" href="/favicon.ico"></xhtml:link><xhtml:title xmlns:xhtml="http://www.w3.org/1999/xhtml">Railroad Diagram Generator</xhtml:title><style type="text/css">
    -    ::-moz-selection
    -    {
    -      color: #FFFCF0;
    -      background: #4D3D00;
    -    }
    -    ::selection
    -    {
    -      color: #FFFCF0;
    -      background: #4D3D00;
    -    }      
    -    body
    -    {
    -      font: normal 12px Verdana, sans-serif;
    -      color: #4D3D00;
    -      background: #FFFCF0;
    -    }
    -    a:link, a:visited
    -    {
    -      color: #4D3D00;
    -    }
    -    a.button, #tabs li a
    -    {
    -      padding: 0.25em 0.5em;
    -      border: 1px solid #806600;
    -      background: #F1E8C6;
    -      color: #806600;
    -      text-decoration: none;
    -      font-weight: bold;
    -    }
    -    a:hover, #tabs li a:hover
    -    {
    -      color: #1A1400;
    -      background: #FFF4C7;
    -      border-color: #1A1400;       
    -    }     
    -    #tabs
    -    {
    -      padding: 3px 10px;
    -      margin-left: 0;
    -      margin-top: 58px;
    -      border-bottom: 1px solid #4D3D00;
    -    }  
    -    #tabs li
    -    {
    -      list-style: none;
    -      margin-left: 5px;
    -      display: inline;
    -    }
    -    #tabs li a
    -    {     
    -      border-bottom: 1px solid #4D3D00;
    -    }
    -    #tabs li a.active
    -    {
    -      color: #4D3D00;
    -      background: #FFFCF0;
    -      border-color: #4D3D00;
    -      border-bottom: 1px solid #FFFCF0;
    -      outline: none;
    -    }
    -    #divs div
    -    {
    -      display: none;
    -      overflow:auto;
    -    }
    -    #divs div.active
    -    {
    -      display: block;
    -    }
    -    #text
    -    {
    -      border-color: #806600;
    -      background: #FFFEFA;
    -      color: #1A1400;
    -    }
    -    td.time
    -    {
    -      vertical-align: top;
    -    }
    -    span.time
    -    {
    -      font-size: 9px;
    -      visibility: hidden;
    -    }
    -    td.time:hover span.time
    -    {
    -      visibility: visible;
    -    }
    -  </style><svg xmlns="http://www.w3.org/2000/svg"><defs><style type="text/css">
    -    @namespace "http://www.w3.org/2000/svg";
    -    .line                 {fill: none; stroke: #332900;}
    -    filled                {fill: #332900; stroke: none;}
    -    text                  {font-family: Verdana, Sans-serif;
    -                            font-size: 12px;
    -                            fill: #4D3D00;
    -                          }
    -    text.terminal         {font-family: Verdana, Sans-serif;
    -                            font-size: 12px;
    -                            fill: #4D3D00;
    -                            font-weight: bold;
    -                          }
    -    rect, circle, polygon {fill: #332900; stroke: #332900;}
    -    rect.terminal         {fill: #FFCC00; stroke: #332900;}
    -    rect.nonterminal      {fill: #FFEB99; stroke: #332900;}
    -    rect.text             {fill: none; stroke: none;}    
    -    polygon.regexp        {fill: #FFF5CC; stroke: #332900;}
    -  </style></defs></svg></head><body><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml" style="font-size: 14px; font-weight:bold"><xhtml:a name="QUERY">QUERY:</xhtml:a></xhtml:p><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="220" height="344"><defs><style type="text/css">
    -    @namespace "http://www.w3.org/2000/svg";
    -    .line                 {fill: none; stroke: #332900;}
    -    filled                {fill: #332900; stroke: none;}
    -    text                  {font-family: Verdana, Sans-serif;
    -                            font-size: 12px;
    -                            fill: #4D3D00;
    -                          }
    -    text.terminal         {font-family: Verdana, Sans-serif;
    -                            font-size: 12px;
    -                            fill: #4D3D00;
    -                            font-weight: bold;
    -                          }
    -    rect, circle, polygon {fill: #332900; stroke: #332900;}
    -    rect.terminal         {fill: #FFCC00; stroke: #332900;}
    -    rect.nonterminal      {fill: #FFEB99; stroke: #332900;}
    -    rect.text             {fill: none; stroke: none;}    
    -    polygon.regexp        {fill: #FFF5CC; stroke: #332900;}
    -  </style></defs><polygon points="9 17 1 13 1 21" class="filled"></polygon><polygon points="17 17 9 13 9 21" class="filled"></polygon><line x1="17" y1="17" x2="19" y2="17" class="line"></line><a xlink:href="#SELECT" xlink:title="SELECT"><rect x="51" y="3" width="66" height="32"></rect><rect x="49" y="1" width="66" height="32" class="nonterminal"></rect><text class="nonterminal" x="59" y="21">SELECT</text></a><line x1="39" y1="17" x2="49" y2="17" class="line"></line><line x1="115" y1="17" x2="125" y2="17" class="line"></line><line x1="125" y1="17" x2="181" y2="17" class="line"></line><line x1="19" y1="17" x2="39" y2="17" class="line"></line><line x1="181" y1="17" x2="201" y2="17" class="line"></line><path d="M19 17 Q29 17 29 27" class="line"></path><path d="M191 27 Q191 17 201 17" class="line"></path><line x1="29" y1="27" x2="29" y2="51" class="line"></line><line x1="191" y1="51" x2="191" y2="27" class="line"></line><path d="M29 51 Q29 61 39 61" class="line"></path><path d="M181 61 Q191 61 191 51" class="line"></path><a xlink:href="#RESULT_QUERY" xlink:title="RESULT_QUERY"><rect x="51" y="47" width="116" height="32"></rect><rect x="49" y="45" width="116" height="32" class="nonterminal"></rect><text class="nonterminal" x="59" y="65">RESULT_QUERY</text></a><line x1="39" y1="61" x2="49" y2="61" class="line"></line><line x1="165" y1="61" x2="175" y2="61" class="line"></line><line x1="175" y1="61" x2="181" y2="61" class="line"></line><line x1="29" y1="51" x2="29" y2="71" class="line"></line><line x1="191" y1="71" x2="191" y2="51" class="line"></line><line x1="29" y1="71" x2="29" y2="95" class="line"></line><line x1="191" y1="95" x2="191" y2="71" class="line"></line><path d="M29 95 Q29 105 39 105" class="line"></path><path d="M181 105 Q191 105 191 95" class="line"></path><a xlink:href="#UPDATE" xlink:title="UPDATE"><rect x="51" y="91" width="68" height="32"></rect><rect x="49" y="89" width="68" height="32" class="nonterminal"></rect><text class="nonterminal" x="59" y="109">UPDATE</text></a><line x1="39" y1="105" x2="49" y2="105" class="line"></line><line x1="117" y1="105" x2="127" y2="105" class="line"></line><line x1="127" y1="105" x2="181" y2="105" class="line"></line><line x1="29" y1="95" x2="29" y2="115" class="line"></line><line x1="191" y1="115" x2="191" y2="95" class="line"></line><line x1="29" y1="115" x2="29" y2="139" class="line"></line><line x1="191" y1="139" x2="191" y2="115" class="line"></line><path d="M29 139 Q29 149 39 149" class="line"></path><path d="M181 149 Q191 149 191 139" class="line"></path><a xlink:href="#INSERT" xlink:title="INSERT"><rect x="51" y="135" width="64" height="32"></rect><rect x="49" y="133" width="64" height="32" class="nonterminal"></rect><text class="nonterminal" x="59" y="153">INSERT</text></a><line x1="39" y1="149" x2="49" y2="149" class="line"></line><line x1="113" y1="149" x2="123" y2="149" class="line"></line><line x1="123" y1="149" x2="181" y2="149" class="line"></line><line x1="29" y1="139" x2="29" y2="159" class="line"></line><line x1="191" y1="159" x2="191" y2="139" class="line"></line><line x1="29" y1="159" x2="29" y2="183" class="line"></line><line x1="191" y1="183" x2="191" y2="159" class="line"></line><path d="M29 183 Q29 193 39 193" class="line"></path><path d="M181 193 Q191 193 191 183" class="line"></path><a xlink:href="#DELETE" xlink:title="DELETE"><rect x="51" y="179" width="66" height="32"></rect><rect x="49" y="177" width="66" height="32" class="nonterminal"></rect><text class="nonterminal" x="59" y="197">DELETE</text></a><line x1="39" y1="193" x2="49" y2="193" class="line"></line><line x1="115" y1="193" x2="125" y2="193" class="line"></line><line x1="125" y1="193" x2="181" y2="193" class="line"></line><line x1="29" y1="183" x2="29" y2="203" class="line"></line><line x1="191" y1="203" x2="191" y2="183" class="line"></line><line x1="29" y1="203" x2="29" y2="227" class="line"></line><line x1="191" y1="227" x2="191" y2="203" class="line"></line><path d="M29 227 Q29 237 39 237" class="line"></path><path d="M181 237 Q191 237 191 227" class="line"></path><a xlink:href="#MERGE" xlink:title="MERGE"><rect x="51" y="223" width="62" height="32"></rect><rect x="49" y="221" width="62" height="32" class="nonterminal"></rect><text class="nonterminal" x="59" y="241">MERGE</text></a><line x1="39" y1="237" x2="49" y2="237" class="line"></line><line x1="111" y1="237" x2="121" y2="237" class="line"></line><line x1="121" y1="237" x2="181" y2="237" class="line"></line><line x1="29" y1="227" x2="29" y2="247" class="line"></line><line x1="191" y1="247" x2="191" y2="227" class="line"></line><line x1="29" y1="247" x2="29" y2="271" class="line"></line><line x1="191" y1="271" x2="191" y2="247" class="line"></line><path d="M29 271 Q29 281 39 281" class="line"></path><path d="M181 281 Q191 281 191 271" class="line"></path><a xlink:href="#TRUNCATE" xlink:title="TRUNCATE"><rect x="51" y="267" width="84" height="32"></rect><rect x="49" y="265" width="84" height="32" class="nonterminal"></rect><text class="nonterminal" x="59" y="285">TRUNCATE</text></a><line x1="39" y1="281" x2="49" y2="281" class="line"></line><line x1="133" y1="281" x2="143" y2="281" class="line"></line><line x1="143" y1="281" x2="181" y2="281" class="line"></line><line x1="29" y1="271" x2="29" y2="291" class="line"></line><line x1="191" y1="291" x2="191" y2="271" class="line"></line><line x1="29" y1="291" x2="29" y2="315" class="line"></line><line x1="191" y1="315" x2="191" y2="291" class="line"></line><path d="M29 315 Q29 325 39 325" class="line"></path><path d="M181 325 Q191 325 191 315" class="line"></path><rect x="51" y="311" width="58" height="32" rx="10"></rect><rect x="49" y="309" width="58" height="32" class="terminal" rx="10"></rect><text class="terminal" x="59" y="329">query</text><line x1="39" y1="325" x2="49" y2="325" class="line"></line><line x1="107" y1="325" x2="117" y2="325" class="line"></line><a xlink:href="#SQL" xlink:title="SQL"><rect x="129" y="311" width="44" height="32"></rect><rect x="127" y="309" width="44" height="32" class="nonterminal"></rect><text class="nonterminal" x="137" y="329">SQL</text></a><line x1="117" y1="325" x2="127" y2="325" class="line"></line><line x1="171" y1="325" x2="181" y2="325" class="line"></line><line x1="204" y1="17" x2="201" y2="17" class="line"></line><polygon points="211 17 219 13 219 21" class="filled"></polygon><polygon points="211 17 203 13 203 21" class="filled"></polygon></svg><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml">no references</xhtml:p><xhtml:br xmlns:xhtml="http://www.w3.org/1999/xhtml"></xhtml:br><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml" style="font-size: 14px; font-weight:bold"><xhtml:a name="RESULT_QUERY">RESULT_QUERY:</xhtml:a></xhtml:p><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="260" height="80"><defs><style type="text/css">
    -
    -    @namespace "http://www.w3.org/2000/svg";
    -    .line                 {fill: none; stroke: #332900;}
    -    filled                {fill: #332900; stroke: none;}
    -    text                  {font-family: Verdana, Sans-serif;
    -                            font-size: 12px;
    -                            fill: #4D3D00;
    -                          }
    -    text.terminal         {font-family: Verdana, Sans-serif;
    -                            font-size: 12px;
    -                            fill: #4D3D00;
    -                            font-weight: bold;
    -                          }
    -    rect, circle, polygon {fill: #332900; stroke: #332900;}
    -    rect.terminal         {fill: #FFCC00; stroke: #332900;}
    -    rect.nonterminal      {fill: #FFEB99; stroke: #332900;}
    -    rect.text             {fill: none; stroke: none;}    
    -    polygon.regexp        {fill: #FFF5CC; stroke: #332900;}
    -  </style></defs><polygon points="9 17 1 13 1 21" class="filled"></polygon><polygon points="17 17 9 13 9 21" class="filled"></polygon><line x1="17" y1="17" x2="19" y2="17" class="line"></line><a xlink:href="#SELECT" xlink:title="SELECT"><rect x="51" y="3" width="66" height="32"></rect><rect x="49" y="1" width="66" height="32" class="nonterminal"></rect><text class="nonterminal" x="59" y="21">SELECT</text></a><line x1="39" y1="17" x2="49" y2="17" class="line"></line><line x1="115" y1="17" x2="125" y2="17" class="line"></line><line x1="125" y1="17" x2="221" y2="17" class="line"></line><line x1="19" y1="17" x2="39" y2="17" class="line"></line><line x1="221" y1="17" x2="241" y2="17" class="line"></line><path d="M19 17 Q29 17 29 27" class="line"></path><path d="M231 27 Q231 17 241 17" class="line"></path><line x1="29" y1="27" x2="29" y2="51" class="line"></line><line x1="231" y1="51" x2="231" y2="27" class="line"></line><path d="M29 51 Q29 61 39 61" class="line"></path><path d="M221 61 Q231 61 231 51" class="line"></path><rect x="51" y="47" width="98" height="32" rx="10"></rect><rect x="49" y="45" width="98" height="32" class="terminal" rx="10"></rect><text class="terminal" x="59" y="65">resultQuery</text><line x1="39" y1="61" x2="49" y2="61" class="line"></line><line x1="147" y1="61" x2="157" y2="61" class="line"></line><a xlink:href="#SQL" xlink:title="SQL"><rect x="169" y="47" width="44" height="32"></rect><rect x="167" y="45" width="44" height="32" class="nonterminal"></rect><text class="nonterminal" x="177" y="65">SQL</text></a><line x1="157" y1="61" x2="167" y2="61" class="line"></line><line x1="211" y1="61" x2="221" y2="61" class="line"></line><line x1="244" y1="17" x2="241" y2="17" class="line"></line><polygon points="251 17 259 13 259 21" class="filled"></polygon><polygon points="251 17 243 13 243 21" class="filled"></polygon></svg><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml">referenced by:<xhtml:ul><xhtml:li><xhtml:a href="#CURSOR" title="CURSOR">CURSOR</xhtml:a></xhtml:li><xhtml:li><xhtml:a href="#QUERY" title="QUERY">QUERY</xhtml:a></xhtml:li><xhtml:li><xhtml:a href="#RESULT" title="RESULT">RESULT</xhtml:a></xhtml:li></xhtml:ul></xhtml:p><xhtml:br xmlns:xhtml="http://www.w3.org/1999/xhtml"></xhtml:br><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml" style="font-size: 14px; font-weight:bold"><xhtml:a name="RESULT">RESULT:</xhtml:a></xhtml:p><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="448" height="872"><defs><style type="text/css">
    -    @namespace "http://www.w3.org/2000/svg";
    -    .line                 {fill: none; stroke: #332900;}
    -    filled                {fill: #332900; stroke: none;}
    -    text                  {font-family: Verdana, Sans-serif;
    -                            font-size: 12px;
    -                            fill: #4D3D00;
    -                          }
    -    text.terminal         {font-family: Verdana, Sans-serif;
    -                            font-size: 12px;
    -                            fill: #4D3D00;
    -                            font-weight: bold;
    -                          }
    -    rect, circle, polygon {fill: #332900; stroke: #332900;}
    -    rect.terminal         {fill: #FFCC00; stroke: #332900;}
    -    rect.nonterminal      {fill: #FFEB99; stroke: #332900;}
    -    rect.text             {fill: none; stroke: none;}    
    -    polygon.regexp        {fill: #FFF5CC; stroke: #332900;}
    -  </style></defs><polygon points="9 17 1 13 1 21" class="filled"></polygon><polygon points="17 17 9 13 9 21" class="filled"></polygon><line x1="17" y1="17" x2="19" y2="17" class="line"></line><rect x="71" y="3" width="52" height="32" rx="10"></rect><rect x="69" y="1" width="52" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="21">fetch</text><line x1="59" y1="17" x2="69" y2="17" class="line"></line><line x1="121" y1="17" x2="131" y2="17" class="line"></line><line x1="131" y1="17" x2="167" y2="17" class="line"></line><line x1="39" y1="17" x2="59" y2="17" class="line"></line><line x1="167" y1="17" x2="187" y2="17" class="line"></line><path d="M39 17 Q49 17 49 27" class="line"></path><path d="M177 27 Q177 17 187 17" class="line"></path><line x1="49" y1="27" x2="49" y2="51" class="line"></line><line x1="177" y1="51" x2="177" y2="27" class="line"></line><path d="M49 51 Q49 61 59 61" class="line"></path><path d="M167 61 Q177 61 177 51" class="line"></path><rect x="71" y="47" width="88" height="32" rx="10"></rect><rect x="69" y="45" width="88" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="65">fetchMany</text><line x1="59" y1="61" x2="69" y2="61" class="line"></line><line x1="157" y1="61" x2="167" y2="61" class="line"></line><line x1="49" y1="51" x2="49" y2="71" class="line"></line><line x1="177" y1="71" x2="177" y2="51" class="line"></line><line x1="49" y1="71" x2="49" y2="95" class="line"></line><line x1="177" y1="95" x2="177" y2="71" class="line"></line><path d="M49 95 Q49 105 59 105" class="line"></path><path d="M167 105 Q177 105 177 95" class="line"></path><rect x="71" y="91" width="80" height="32" rx="10"></rect><rect x="69" y="89" width="80" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="109">fetchOne</text><line x1="59" y1="105" x2="69" y2="105" class="line"></line><line x1="149" y1="105" x2="159" y2="105" class="line"></line><line x1="159" y1="105" x2="167" y2="105" class="line"></line><a xlink:href="#SQL" xlink:title="SQL"><rect x="199" y="3" width="44" height="32"></rect><rect x="197" y="1" width="44" height="32" class="nonterminal"></rect><text class="nonterminal" x="207" y="21">SQL</text></a><line x1="187" y1="17" x2="197" y2="17" class="line"></line><line x1="241" y1="17" x2="251" y2="17" class="line"></line><line x1="251" y1="17" x2="409" y2="17" class="line"></line><line x1="19" y1="17" x2="39" y2="17" class="line"></line><line x1="409" y1="17" x2="429" y2="17" class="line"></line><path d="M19 17 Q29 17 29 27" class="line"></path><path d="M419 27 Q419 17 429 17" class="line"></path><line x1="29" y1="27" x2="29" y2="139" class="line"></line><line x1="419" y1="139" x2="419" y2="27" class="line"></line><path d="M29 139 Q29 149 39 149" class="line"></path><path d="M409 149 Q419 149 419 139" class="line"></path><rect x="71" y="135" width="52" height="32" rx="10"></rect><rect x="69" y="133" width="52" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="153">fetch</text><line x1="59" y1="149" x2="69" y2="149" class="line"></line><line x1="121" y1="149" x2="131" y2="149" class="line"></line><line x1="131" y1="149" x2="159" y2="149" class="line"></line><line x1="39" y1="149" x2="59" y2="149" class="line"></line><line x1="159" y1="149" x2="179" y2="149" class="line"></line><path d="M39 149 Q49 149 49 159" class="line"></path><path d="M169 159 Q169 149 179 149" class="line"></path><line x1="49" y1="159" x2="49" y2="183" class="line"></line><line x1="169" y1="183" x2="169" y2="159" class="line"></line><path d="M49 183 Q49 193 59 193" class="line"></path><path d="M159 193 Q169 193 169 183" class="line"></path><rect x="71" y="179" width="80" height="32" rx="10"></rect><rect x="69" y="177" width="80" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="197">fetchOne</text><line x1="59" y1="193" x2="69" y2="193" class="line"></line><line x1="149" y1="193" x2="159" y2="193" class="line"></line><a xlink:href="#TABLE" xlink:title="TABLE"><rect x="191" y="135" width="58" height="32"></rect><rect x="189" y="133" width="58" height="32" class="nonterminal"></rect><text class="nonterminal" x="199" y="153">TABLE</text></a><line x1="179" y1="149" x2="189" y2="149" class="line"></line><line x1="247" y1="149" x2="257" y2="149" class="line"></line><a xlink:href="#CONDITION" xlink:title="CONDITION"><rect x="289" y="135" width="92" height="32"></rect><rect x="287" y="133" width="92" height="32" class="nonterminal"></rect><text class="nonterminal" x="297" y="153">CONDITION</text></a><line x1="277" y1="149" x2="287" y2="149" class="line"></line><line x1="379" y1="149" x2="389" y2="149" class="line"></line><line x1="257" y1="149" x2="277" y2="149" class="line"></line><line x1="389" y1="149" x2="409" y2="149" class="line"></line><path d="M257 149 Q267 149 267 159" class="line"></path><path d="M399 159 Q399 149 409 149" class="line"></path><line x1="267" y1="159" x2="267" y2="173" class="line"></line><line x1="399" y1="173" x2="399" y2="159" class="line"></line><path d="M267 173 Q267 183 277 183" class="line"></path><path d="M389 183 Q399 183 399 173" class="line"></path><line x1="277" y1="183" x2="287" y2="183" class="line"></line><line x1="287" y1="183" x2="389" y2="183" class="line"></line><line x1="29" y1="139" x2="29" y2="159" class="line"></line><line x1="419" y1="159" x2="419" y2="139" class="line"></line><line x1="29" y1="159" x2="29" y2="227" class="line"></line><line x1="419" y1="227" x2="419" y2="159" class="line"></line><path d="M29 227 Q29 237 39 237" class="line"></path><path d="M409 237 Q419 237 419 227" class="line"></path><rect x="51" y="223" width="78" height="32" rx="10"></rect><rect x="49" y="221" width="78" height="32" class="terminal" rx="10"></rect><text class="terminal" x="59" y="241">fetchAny</text><line x1="39" y1="237" x2="49" y2="237" class="line"></line><line x1="127" y1="237" x2="137" y2="237" class="line"></line><a xlink:href="#TABLE" xlink:title="TABLE"><rect x="149" y="223" width="58" height="32"></rect><rect x="147" y="221" width="58" height="32" class="nonterminal"></rect><text class="nonterminal" x="157" y="241">TABLE</text></a><line x1="137" y1="237" x2="147" y2="237" class="line"></line><line x1="205" y1="237" x2="215" y2="237" class="line"></line><line x1="215" y1="237" x2="409" y2="237" class="line"></line><line x1="29" y1="227" x2="29" y2="247" class="line"></line><line x1="419" y1="247" x2="419" y2="227" class="line"></line><line x1="29" y1="247" x2="29" y2="271" class="line"></line><line x1="419" y1="271" x2="419" y2="247" class="line"></line><path d="M29 271 Q29 281 39 281" class="line"></path><path d="M409 281 Q419 281 419 271" class="line"></path><rect x="51" y="267" width="52" height="32" rx="10"></rect><rect x="49" y="265" width="52" height="32" class="terminal" rx="10"></rect><text class="terminal" x="59" y="285">fetch</text><line x1="39" y1="281" x2="49" y2="281" class="line"></line><line x1="101" y1="281" x2="111" y2="281" class="line"></line><rect x="123" y="267" width="122" height="32" rx="10"></rect><rect x="121" y="265" width="122" height="32" class="terminal" rx="10"></rect><text class="terminal" x="131" y="285">JDBC ResultSet</text><line x1="111" y1="281" x2="121" y2="281" class="line"></line><line x1="243" y1="281" x2="253" y2="281" class="line"></line><line x1="253" y1="281" x2="409" y2="281" class="line"></line><line x1="29" y1="271" x2="29" y2="291" class="line"></line><line x1="419" y1="291" x2="419" y2="271" class="line"></line><line x1="29" y1="291" x2="29" y2="315" class="line"></line><line x1="419" y1="315" x2="419" y2="291" class="line"></line><path d="M29 315 Q29 325 39 325" class="line"></path><path d="M409 325 Q419 325 419 315" class="line"></path><a xlink:href="#RESULT_QUERY" xlink:title="RESULT_QUERY"><rect x="51" y="311" width="116" height="32"></rect><rect x="49" y="309" width="116" height="32" class="nonterminal"></rect><text class="nonterminal" x="59" y="329">RESULT_QUERY</text></a><line x1="39" y1="325" x2="49" y2="325" class="line"></line><line x1="165" y1="325" x2="175" y2="325" class="line"></line><rect x="207" y="311" width="52" height="32" rx="10"></rect><rect x="205" y="309" width="52" height="32" class="terminal" rx="10"></rect><text class="terminal" x="215" y="329">fetch</text><line x1="195" y1="325" x2="205" y2="325" class="line"></line><line x1="257" y1="325" x2="267" y2="325" class="line"></line><line x1="267" y1="325" x2="389" y2="325" class="line"></line><line x1="175" y1="325" x2="195" y2="325" class="line"></line><line x1="389" y1="325" x2="409" y2="325" class="line"></line><path d="M175 325 Q185 325 185 335" class="line"></path><path d="M399 335 Q399 325 409 325" class="line"></path><line x1="185" y1="335" x2="185" y2="359" class="line"></line><line x1="399" y1="359" x2="399" y2="335" class="line"></line><path d="M185 359 Q185 369 195 369" class="line"></path><path d="M389 369 Q399 369 399 359" class="line"></path><rect x="207" y="355" width="88" height="32" rx="10"></rect><rect x="205" y="353" width="88" height="32" class="terminal" rx="10"></rect><text class="terminal" x="215" y="373">fetchMany</text><line x1="195" y1="369" x2="205" y2="369" class="line"></line><line x1="293" y1="369" x2="303" y2="369" class="line"></line><line x1="303" y1="369" x2="389" y2="369" class="line"></line><line x1="185" y1="359" x2="185" y2="379" class="line"></line><line x1="399" y1="379" x2="399" y2="359" class="line"></line><line x1="185" y1="379" x2="185" y2="403" class="line"></line><line x1="399" y1="403" x2="399" y2="379" class="line"></line><path d="M185 403 Q185 413 195 413" class="line"></path><path d="M389 413 Q399 413 399 403" class="line"></path><rect x="207" y="399" width="80" height="32" rx="10"></rect><rect x="205" y="397" width="80" height="32" class="terminal" rx="10"></rect><text class="terminal" x="215" y="417">fetchOne</text><line x1="195" y1="413" x2="205" y2="413" class="line"></line><line x1="285" y1="413" x2="295" y2="413" class="line"></line><line x1="295" y1="413" x2="389" y2="413" class="line"></line><line x1="185" y1="403" x2="185" y2="423" class="line"></line><line x1="399" y1="423" x2="399" y2="403" class="line"></line><line x1="185" y1="423" x2="185" y2="447" class="line"></line><line x1="399" y1="447" x2="399" y2="423" class="line"></line><path d="M185 447 Q185 457 195 457" class="line"></path><path d="M389 457 Q399 457 399 447" class="line"></path><rect x="207" y="443" width="78" height="32" rx="10"></rect><rect x="205" y="441" width="78" height="32" class="terminal" rx="10"></rect><text class="terminal" x="215" y="461">fetchAny</text><line x1="195" y1="457" x2="205" y2="457" class="line"></line><line x1="283" y1="457" x2="293" y2="457" class="line"></line><line x1="293" y1="457" x2="389" y2="457" class="line"></line><line x1="185" y1="447" x2="185" y2="467" class="line"></line><line x1="399" y1="467" x2="399" y2="447" class="line"></line><line x1="185" y1="467" x2="185" y2="491" class="line"></line><line x1="399" y1="491" x2="399" y2="467" class="line"></line><path d="M185 491 Q185 501 195 501" class="line"></path><path d="M389 501 Q399 501 399 491" class="line"></path><rect x="207" y="487" width="86" height="32" rx="10"></rect><rect x="205" y="485" width="86" height="32" class="terminal" rx="10"></rect><text class="terminal" x="215" y="505">fetchMaps</text><line x1="195" y1="501" x2="205" y2="501" class="line"></line><line x1="291" y1="501" x2="301" y2="501" class="line"></line><line x1="301" y1="501" x2="389" y2="501" class="line"></line><line x1="185" y1="491" x2="185" y2="511" class="line"></line><line x1="399" y1="511" x2="399" y2="491" class="line"></line><line x1="185" y1="511" x2="185" y2="535" class="line"></line><line x1="399" y1="535" x2="399" y2="511" class="line"></line><path d="M185 535 Q185 545 195 545" class="line"></path><path d="M389 545 Q399 545 399 535" class="line"></path><rect x="207" y="531" width="106" height="32" rx="10"></rect><rect x="205" y="529" width="106" height="32" class="terminal" rx="10"></rect><text class="terminal" x="215" y="549">fetchOneMap</text><line x1="195" y1="545" x2="205" y2="545" class="line"></line><line x1="311" y1="545" x2="321" y2="545" class="line"></line><line x1="321" y1="545" x2="389" y2="545" class="line"></line><line x1="185" y1="535" x2="185" y2="555" class="line"></line><line x1="399" y1="555" x2="399" y2="535" class="line"></line><line x1="185" y1="555" x2="185" y2="579" class="line"></line><line x1="399" y1="579" x2="399" y2="555" class="line"></line><path d="M185 579 Q185 589 195 589" class="line"></path><path d="M389 589 Q399 589 399 579" class="line"></path><rect x="207" y="575" width="80" height="32" rx="10"></rect><rect x="205" y="573" width="80" height="32" class="terminal" rx="10"></rect><text class="terminal" x="215" y="593">fetchMap</text><line x1="195" y1="589" x2="205" y2="589" class="line"></line><line x1="285" y1="589" x2="295" y2="589" class="line"></line><line x1="295" y1="589" x2="389" y2="589" class="line"></line><line x1="185" y1="579" x2="185" y2="599" class="line"></line><line x1="399" y1="599" x2="399" y2="579" class="line"></line><line x1="185" y1="599" x2="185" y2="623" class="line"></line><line x1="399" y1="623" x2="399" y2="599" class="line"></line><path d="M185 623 Q185 633 195 633" class="line"></path><path d="M389 633 Q399 633 399 623" class="line"></path><rect x="207" y="619" width="96" height="32" rx="10"></rect><rect x="205" y="617" width="96" height="32" class="terminal" rx="10"></rect><text class="terminal" x="215" y="637">fetchArrays</text><line x1="195" y1="633" x2="205" y2="633" class="line"></line><line x1="301" y1="633" x2="311" y2="633" class="line"></line><line x1="311" y1="633" x2="389" y2="633" class="line"></line><line x1="185" y1="623" x2="185" y2="643" class="line"></line><line x1="399" y1="643" x2="399" y2="623" class="line"></line><line x1="185" y1="643" x2="185" y2="667" class="line"></line><line x1="399" y1="667" x2="399" y2="643" class="line"></line><path d="M185 667 Q185 677 195 677" class="line"></path><path d="M389 677 Q399 677 399 667" class="line"></path><rect x="207" y="663" width="90" height="32" rx="10"></rect><rect x="205" y="661" width="90" height="32" class="terminal" rx="10"></rect><text class="terminal" x="215" y="681">fetchArray</text><line x1="195" y1="677" x2="205" y2="677" class="line"></line><line x1="295" y1="677" x2="305" y2="677" class="line"></line><line x1="305" y1="677" x2="389" y2="677" class="line"></line><line x1="185" y1="667" x2="185" y2="687" class="line"></line><line x1="399" y1="687" x2="399" y2="667" class="line"></line><line x1="185" y1="687" x2="185" y2="711" class="line"></line><line x1="399" y1="711" x2="399" y2="687" class="line"></line><path d="M185 711 Q185 721 195 721" class="line"></path><path d="M389 721 Q399 721 399 711" class="line"></path><rect x="207" y="707" width="116" height="32" rx="10"></rect><rect x="205" y="705" width="116" height="32" class="terminal" rx="10"></rect><text class="terminal" x="215" y="725">fetchOneArray</text><line x1="195" y1="721" x2="205" y2="721" class="line"></line><line x1="321" y1="721" x2="331" y2="721" class="line"></line><line x1="331" y1="721" x2="389" y2="721" class="line"></line><line x1="185" y1="711" x2="185" y2="731" class="line"></line><line x1="399" y1="731" x2="399" y2="711" class="line"></line><line x1="185" y1="731" x2="185" y2="755" class="line"></line><line x1="399" y1="755" x2="399" y2="731" class="line"></line><path d="M185 755 Q185 765 195 765" class="line"></path><path d="M389 765 Q399 765 399 755" class="line"></path><rect x="207" y="751" width="80" height="32" rx="10"></rect><rect x="205" y="749" width="80" height="32" class="terminal" rx="10"></rect><text class="terminal" x="215" y="769">fetchInto</text><line x1="195" y1="765" x2="205" y2="765" class="line"></line><line x1="285" y1="765" x2="295" y2="765" class="line"></line><line x1="295" y1="765" x2="389" y2="765" class="line"></line><line x1="185" y1="755" x2="185" y2="775" class="line"></line><line x1="399" y1="775" x2="399" y2="755" class="line"></line><line x1="185" y1="775" x2="185" y2="799" class="line"></line><line x1="399" y1="799" x2="399" y2="775" class="line"></line><path d="M185 799 Q185 809 195 809" class="line"></path><path d="M389 809 Q399 809 399 799" class="line"></path><rect x="207" y="795" width="88" height="32" rx="10"></rect><rect x="205" y="793" width="88" height="32" class="terminal" rx="10"></rect><text class="terminal" x="215" y="813">fetchLater</text><line x1="195" y1="809" x2="205" y2="809" class="line"></line><line x1="293" y1="809" x2="303" y2="809" class="line"></line><line x1="303" y1="809" x2="389" y2="809" class="line"></line><line x1="185" y1="799" x2="185" y2="819" class="line"></line><line x1="399" y1="819" x2="399" y2="799" class="line"></line><line x1="185" y1="819" x2="185" y2="843" class="line"></line><line x1="399" y1="843" x2="399" y2="819" class="line"></line><path d="M185 843 Q185 853 195 853" class="line"></path><path d="M389 853 Q399 853 399 843" class="line"></path><rect x="207" y="839" width="72" height="32" rx="10"></rect><rect x="205" y="837" width="72" height="32" class="terminal" rx="10"></rect><text class="terminal" x="215" y="857">execute</text><line x1="195" y1="853" x2="205" y2="853" class="line"></line><line x1="277" y1="853" x2="287" y2="853" class="line"></line><rect x="299" y="839" width="82" height="32" rx="10"></rect><rect x="297" y="837" width="82" height="32" class="terminal" rx="10"></rect><text class="terminal" x="307" y="857">getResult</text><line x1="287" y1="853" x2="297" y2="853" class="line"></line><line x1="379" y1="853" x2="389" y2="853" class="line"></line><line x1="432" y1="17" x2="429" y2="17" class="line"></line><polygon points="439 17 447 13 447 21" class="filled"></polygon><polygon points="439 17 431 13 431 21" class="filled"></polygon></svg><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml">no references</xhtml:p><xhtml:br xmlns:xhtml="http://www.w3.org/1999/xhtml"></xhtml:br><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml" style="font-size: 14px; font-weight:bold"><xhtml:a name="CURSOR">CURSOR:</xhtml:a></xhtml:p><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="278" height="36"><defs><style type="text/css">
    -
    -    @namespace "http://www.w3.org/2000/svg";
    -    .line                 {fill: none; stroke: #332900;}
    -    filled                {fill: #332900; stroke: none;}
    -    text                  {font-family: Verdana, Sans-serif;
    -                            font-size: 12px;
    -                            fill: #4D3D00;
    -                          }
    -    text.terminal         {font-family: Verdana, Sans-serif;
    -                            font-size: 12px;
    -                            fill: #4D3D00;
    -                            font-weight: bold;
    -                          }
    -    rect, circle, polygon {fill: #332900; stroke: #332900;}
    -    rect.terminal         {fill: #FFCC00; stroke: #332900;}
    -    rect.nonterminal      {fill: #FFEB99; stroke: #332900;}
    -    rect.text             {fill: none; stroke: none;}    
    -    polygon.regexp        {fill: #FFF5CC; stroke: #332900;}
    -  </style></defs><polygon points="9 17 1 13 1 21" class="filled"></polygon><polygon points="17 17 9 13 9 21" class="filled"></polygon><line x1="17" y1="17" x2="19" y2="17" class="line"></line><a xlink:href="#RESULT_QUERY" xlink:title="RESULT_QUERY"><rect x="31" y="3" width="116" height="32"></rect><rect x="29" y="1" width="116" height="32" class="nonterminal"></rect><text class="nonterminal" x="39" y="21">RESULT_QUERY</text></a><line x1="19" y1="17" x2="29" y2="17" class="line"></line><line x1="145" y1="17" x2="155" y2="17" class="line"></line><rect x="167" y="3" width="84" height="32" rx="10"></rect><rect x="165" y="1" width="84" height="32" class="terminal" rx="10"></rect><text class="terminal" x="175" y="21">fetchLazy</text><line x1="155" y1="17" x2="165" y2="17" class="line"></line><line x1="249" y1="17" x2="259" y2="17" class="line"></line><line x1="262" y1="17" x2="259" y2="17" class="line"></line><polygon points="269 17 277 13 277 21" class="filled"></polygon><polygon points="269 17 261 13 261 21" class="filled"></polygon></svg><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml">no references</xhtml:p><xhtml:br xmlns:xhtml="http://www.w3.org/1999/xhtml"></xhtml:br><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml" style="font-size: 14px; font-weight:bold"><xhtml:a name="SELECT">SELECT:</xhtml:a></xhtml:p><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1200" height="1848"><defs><style type="text/css">
    -    @namespace "http://www.w3.org/2000/svg";
    -    .line                 {fill: none; stroke: #332900;}
    -    filled                {fill: #332900; stroke: none;}
    -    text                  {font-family: Verdana, Sans-serif;
    -                            font-size: 12px;
    -                            fill: #4D3D00;
    -                          }
    -    text.terminal         {font-family: Verdana, Sans-serif;
    -                            font-size: 12px;
    -                            fill: #4D3D00;
    -                            font-weight: bold;
    -                          }
    -    rect, circle, polygon {fill: #332900; stroke: #332900;}
    -    rect.terminal         {fill: #FFCC00; stroke: #332900;}
    -    rect.nonterminal      {fill: #FFEB99; stroke: #332900;}
    -    rect.text             {fill: none; stroke: none;}    
    -    polygon.regexp        {fill: #FFF5CC; stroke: #332900;}
    -  </style></defs><polygon points="9 49 1 45 1 53" class="filled"></polygon><polygon points="17 49 9 45 9 53" class="filled"></polygon><line x1="17" y1="49" x2="19" y2="49" class="line"></line><rect x="71" y="35" width="58" height="32" rx="10"></rect><rect x="69" y="33" width="58" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="53">select</text><line x1="59" y1="49" x2="69" y2="49" class="line"></line><line x1="127" y1="49" x2="137" y2="49" class="line"></line><line x1="137" y1="49" x2="187" y2="49" class="line"></line><line x1="39" y1="49" x2="59" y2="49" class="line"></line><line x1="187" y1="49" x2="207" y2="49" class="line"></line><path d="M39 49 Q49 49 49 59" class="line"></path><path d="M197 59 Q197 49 207 49" class="line"></path><line x1="49" y1="59" x2="49" y2="83" class="line"></line><line x1="197" y1="83" x2="197" y2="59" class="line"></line><path d="M49 83 Q49 93 59 93" class="line"></path><path d="M187 93 Q197 93 197 83" class="line"></path><rect x="71" y="79" width="108" height="32" rx="10"></rect><rect x="69" y="77" width="108" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="97">selectDistinct</text><line x1="59" y1="93" x2="69" y2="93" class="line"></line><line x1="177" y1="93" x2="187" y2="93" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="259" y="35" width="56" height="32"></rect><rect x="257" y="33" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="267" y="53">FIELD</text></a><line x1="247" y1="49" x2="257" y2="49" class="line"></line><line x1="313" y1="49" x2="323" y2="49" class="line"></line><path d="M227 49 L247 49 M246 49 Q237 49 237 39 L237 27 Q237 17 247 17" class="line"></path><path d="M323 49 L343 49 M323 49 Q333 49 333 39 L333 27 Q333 17 323 17" class="line"></path><line x1="247" y1="17" x2="257" y2="17" class="line"></line><line x1="257" y1="17" x2="323" y2="17" class="line"></line><line x1="207" y1="49" x2="227" y2="49" class="line"></line><line x1="343" y1="49" x2="363" y2="49" class="line"></line><path d="M207 49 Q217 49 217 59" class="line"></path><path d="M353 59 Q353 49 363 49" class="line"></path><line x1="217" y1="59" x2="217" y2="73" class="line"></line><line x1="353" y1="73" x2="353" y2="59" class="line"></line><path d="M217 73 Q217 83 227 83" class="line"></path><path d="M343 83 Q353 83 353 73" class="line"></path><line x1="227" y1="83" x2="237" y2="83" class="line"></line><line x1="237" y1="83" x2="343" y2="83" class="line"></line><line x1="19" y1="49" x2="39" y2="49" class="line"></line><line x1="363" y1="49" x2="383" y2="49" class="line"></line><path d="M19 49 Q29 49 29 59" class="line"></path><path d="M373 59 Q373 49 383 49" class="line"></path><line x1="29" y1="59" x2="29" y2="127" class="line"></line><line x1="373" y1="127" x2="373" y2="59" class="line"></line><path d="M29 127 Q29 137 39 137" class="line"></path><path d="M363 137 Q373 137 373 127" class="line"></path><rect x="51" y="123" width="86" height="32" rx="10"></rect><rect x="49" y="121" width="86" height="32" class="terminal" rx="10"></rect><text class="terminal" x="59" y="141">selectOne</text><line x1="39" y1="137" x2="49" y2="137" class="line"></line><line x1="135" y1="137" x2="145" y2="137" class="line"></line><line x1="145" y1="137" x2="363" y2="137" class="line"></line><line x1="29" y1="127" x2="29" y2="147" class="line"></line><line x1="373" y1="147" x2="373" y2="127" class="line"></line><line x1="29" y1="147" x2="29" y2="171" class="line"></line><line x1="373" y1="171" x2="373" y2="147" class="line"></line><path d="M29 171 Q29 181 39 181" class="line"></path><path d="M363 181 Q373 181 373 171" class="line"></path><rect x="51" y="167" width="88" height="32" rx="10"></rect><rect x="49" y="165" width="88" height="32" class="terminal" rx="10"></rect><text class="terminal" x="59" y="185">selectZero</text><line x1="39" y1="181" x2="49" y2="181" class="line"></line><line x1="137" y1="181" x2="147" y2="181" class="line"></line><line x1="147" y1="181" x2="363" y2="181" class="line"></line><line x1="29" y1="171" x2="29" y2="191" class="line"></line><line x1="373" y1="191" x2="373" y2="171" class="line"></line><line x1="29" y1="191" x2="29" y2="215" class="line"></line><line x1="373" y1="215" x2="373" y2="191" class="line"></line><path d="M29 215 Q29 225 39 225" class="line"></path><path d="M363 225 Q373 225 373 215" class="line"></path><rect x="51" y="211" width="96" height="32" rx="10"></rect><rect x="49" y="209" width="96" height="32" class="terminal" rx="10"></rect><text class="terminal" x="59" y="229">selectCount</text><line x1="39" y1="225" x2="49" y2="225" class="line"></line><line x1="145" y1="225" x2="155" y2="225" class="line"></line><line x1="155" y1="225" x2="363" y2="225" class="line"></line><rect x="435" y="35" width="58" height="32" rx="10"></rect><rect x="433" y="33" width="58" height="32" class="terminal" rx="10"></rect><text class="terminal" x="443" y="53">select</text><line x1="423" y1="49" x2="433" y2="49" class="line"></line><line x1="491" y1="49" x2="501" y2="49" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="553" y="35" width="56" height="32"></rect><rect x="551" y="33" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="561" y="53">FIELD</text></a><line x1="541" y1="49" x2="551" y2="49" class="line"></line><line x1="607" y1="49" x2="617" y2="49" class="line"></line><path d="M521 49 L541 49 M540 49 Q531 49 531 39 L531 27 Q531 17 541 17" class="line"></path><path d="M617 49 L637 49 M617 49 Q627 49 627 39 L627 27 Q627 17 617 17" class="line"></path><line x1="541" y1="17" x2="551" y2="17" class="line"></line><line x1="551" y1="17" x2="617" y2="17" class="line"></line><line x1="501" y1="49" x2="521" y2="49" class="line"></line><line x1="637" y1="49" x2="657" y2="49" class="line"></line><path d="M501 49 Q511 49 511 59" class="line"></path><path d="M647 59 Q647 49 657 49" class="line"></path><line x1="511" y1="59" x2="511" y2="73" class="line"></line><line x1="647" y1="73" x2="647" y2="59" class="line"></line><path d="M511 73 Q511 83 521 83" class="line"></path><path d="M637 83 Q647 83 647 73" class="line"></path><line x1="521" y1="83" x2="531" y2="83" class="line"></line><line x1="531" y1="83" x2="637" y2="83" class="line"></line><path d="M403 49 L423 49 M422 49 Q413 49 413 39 L413 11 Q413 1 423 1" class="line"></path><path d="M657 49 L677 49 M657 49 Q667 49 667 39 L667 11 Q667 1 657 1" class="line"></path><line x1="423" y1="1" x2="433" y2="1" class="line"></line><line x1="433" y1="1" x2="657" y2="1" class="line"></line><line x1="383" y1="49" x2="403" y2="49" class="line"></line><line x1="677" y1="49" x2="697" y2="49" class="line"></line><path d="M383 49 Q393 49 393 59" class="line"></path><path d="M687 59 Q687 49 697 49" class="line"></path><line x1="393" y1="59" x2="393" y2="89" class="line"></line><line x1="687" y1="89" x2="687" y2="59" class="line"></line><path d="M393 89 Q393 99 403 99" class="line"></path><path d="M677 99 Q687 99 687 89" class="line"></path><line x1="403" y1="99" x2="413" y2="99" class="line"></line><line x1="413" y1="99" x2="677" y2="99" class="line"></line><rect x="749" y="35" width="44" height="32" rx="10"></rect><rect x="747" y="33" width="44" height="32" class="terminal" rx="10"></rect><text class="terminal" x="757" y="53">hint</text><line x1="737" y1="49" x2="747" y2="49" class="line"></line><line x1="791" y1="49" x2="801" y2="49" class="line"></line><a xlink:href="#SQL" xlink:title="SQL"><rect x="813" y="35" width="44" height="32"></rect><rect x="811" y="33" width="44" height="32" class="nonterminal"></rect><text class="nonterminal" x="821" y="53">SQL</text></a><line x1="801" y1="49" x2="811" y2="49" class="line"></line><line x1="855" y1="49" x2="865" y2="49" class="line"></line><path d="M717 49 L737 49 M736 49 Q727 49 727 39 L727 27 Q727 17 737 17" class="line"></path><path d="M865 49 L885 49 M865 49 Q875 49 875 39 L875 27 Q875 17 865 17" class="line"></path><line x1="737" y1="17" x2="747" y2="17" class="line"></line><line x1="747" y1="17" x2="865" y2="17" class="line"></line><line x1="697" y1="49" x2="717" y2="49" class="line"></line><line x1="885" y1="49" x2="905" y2="49" class="line"></line><path d="M697 49 Q707 49 707 59" class="line"></path><path d="M895 59 Q895 49 905 49" class="line"></path><line x1="707" y1="59" x2="707" y2="73" class="line"></line><line x1="895" y1="73" x2="895" y2="59" class="line"></line><path d="M707 73 Q707 83 717 83" class="line"></path><path d="M885 83 Q895 83 895 73" class="line"></path><line x1="717" y1="83" x2="727" y2="83" class="line"></line><line x1="727" y1="83" x2="885" y2="83" class="line"></line><path class="line" d="M907 49 L909 49 M911 49 L913 49 M915 49 L917 49 M1 323 L3 323 M5 323 L7 323 M9 323 L11 323"></path><rect x="45" y="309" width="50" height="32" rx="10"></rect><rect x="43" y="307" width="50" height="32" class="terminal" rx="10"></rect><text class="terminal" x="53" y="327">from</text><line x1="33" y1="323" x2="43" y2="323" class="line"></line><line x1="93" y1="323" x2="103" y2="323" class="line"></line><a xlink:href="#TABLE" xlink:title="TABLE"><rect x="155" y="309" width="58" height="32"></rect><rect x="153" y="307" width="58" height="32" class="nonterminal"></rect><text class="nonterminal" x="163" y="327">TABLE</text></a><line x1="143" y1="323" x2="153" y2="323" class="line"></line><line x1="211" y1="323" x2="221" y2="323" class="line"></line><path d="M123 323 L143 323 M142 323 Q133 323 133 313 L133 301 Q133 291 143 291" class="line"></path><path d="M221 323 L241 323 M221 323 Q231 323 231 313 L231 301 Q231 291 221 291" class="line"></path><line x1="143" y1="291" x2="153" y2="291" class="line"></line><line x1="153" y1="291" x2="221" y2="291" class="line"></line><line x1="103" y1="323" x2="123" y2="323" class="line"></line><line x1="241" y1="323" x2="261" y2="323" class="line"></line><path d="M103 323 Q113 323 113 333" class="line"></path><path d="M251 333 Q251 323 261 323" class="line"></path><line x1="113" y1="333" x2="113" y2="357" class="line"></line><line x1="251" y1="357" x2="251" y2="333" class="line"></line><path d="M113 357 Q113 367 123 367" class="line"></path><path d="M241 367 Q251 367 251 357" class="line"></path><a xlink:href="#SQL" xlink:title="SQL"><rect x="135" y="353" width="44" height="32"></rect><rect x="133" y="351" width="44" height="32" class="nonterminal"></rect><text class="nonterminal" x="143" y="371">SQL</text></a><line x1="123" y1="367" x2="133" y2="367" class="line"></line><line x1="177" y1="367" x2="187" y2="367" class="line"></line><line x1="187" y1="367" x2="241" y2="367" class="line"></line><rect x="353" y="309" width="44" height="32" rx="10"></rect><rect x="351" y="307" width="44" height="32" class="terminal" rx="10"></rect><text class="terminal" x="361" y="327">join</text><line x1="341" y1="323" x2="351" y2="323" class="line"></line><line x1="395" y1="323" x2="405" y2="323" class="line"></line><line x1="405" y1="323" x2="477" y2="323" class="line"></line><line x1="321" y1="323" x2="341" y2="323" class="line"></line><line x1="477" y1="323" x2="497" y2="323" class="line"></line><path d="M321 323 Q331 323 331 333" class="line"></path><path d="M487 333 Q487 323 497 323" class="line"></path><line x1="331" y1="333" x2="331" y2="357" class="line"></line><line x1="487" y1="357" x2="487" y2="333" class="line"></line><path d="M331 357 Q331 367 341 367" class="line"></path><path d="M477 367 Q487 367 487 357" class="line"></path><rect x="353" y="353" width="106" height="32" rx="10"></rect><rect x="351" y="351" width="106" height="32" class="terminal" rx="10"></rect><text class="terminal" x="361" y="371">leftOuterJoin</text><line x1="341" y1="367" x2="351" y2="367" class="line"></line><line x1="457" y1="367" x2="467" y2="367" class="line"></line><line x1="467" y1="367" x2="477" y2="367" class="line"></line><line x1="331" y1="357" x2="331" y2="377" class="line"></line><line x1="487" y1="377" x2="487" y2="357" class="line"></line><line x1="331" y1="377" x2="331" y2="401" class="line"></line><line x1="487" y1="401" x2="487" y2="377" class="line"></line><path d="M331 401 Q331 411 341 411" class="line"></path><path d="M477 411 Q487 411 487 401" class="line"></path><rect x="353" y="397" width="116" height="32" rx="10"></rect><rect x="351" y="395" width="116" height="32" class="terminal" rx="10"></rect><text class="terminal" x="361" y="415">rightOuterJoin</text><line x1="341" y1="411" x2="351" y2="411" class="line"></line><line x1="467" y1="411" x2="477" y2="411" class="line"></line><line x1="331" y1="401" x2="331" y2="421" class="line"></line><line x1="487" y1="421" x2="487" y2="401" class="line"></line><line x1="331" y1="421" x2="331" y2="445" class="line"></line><line x1="487" y1="445" x2="487" y2="421" class="line"></line><path d="M331 445 Q331 455 341 455" class="line"></path><path d="M477 455 Q487 455 487 445" class="line"></path><rect x="353" y="441" width="106" height="32" rx="10"></rect><rect x="351" y="439" width="106" height="32" class="terminal" rx="10"></rect><text class="terminal" x="361" y="459">fullOuterJoin</text><line x1="341" y1="455" x2="351" y2="455" class="line"></line><line x1="457" y1="455" x2="467" y2="455" class="line"></line><line x1="467" y1="455" x2="477" y2="455" class="line"></line><a xlink:href="#TABLE" xlink:title="TABLE"><rect x="529" y="309" width="58" height="32"></rect><rect x="527" y="307" width="58" height="32" class="nonterminal"></rect><text class="nonterminal" x="537" y="327">TABLE</text></a><line x1="517" y1="323" x2="527" y2="323" class="line"></line><line x1="585" y1="323" x2="595" y2="323" class="line"></line><line x1="497" y1="323" x2="517" y2="323" class="line"></line><line x1="595" y1="323" x2="615" y2="323" class="line"></line><path d="M497 323 Q507 323 507 333" class="line"></path><path d="M605 333 Q605 323 615 323" class="line"></path><line x1="507" y1="333" x2="507" y2="357" class="line"></line><line x1="605" y1="357" x2="605" y2="333" class="line"></line><path d="M507 357 Q507 367 517 367" class="line"></path><path d="M595 367 Q605 367 605 357" class="line"></path><a xlink:href="#SQL" xlink:title="SQL"><rect x="529" y="353" width="44" height="32"></rect><rect x="527" y="351" width="44" height="32" class="nonterminal"></rect><text class="nonterminal" x="537" y="371">SQL</text></a><line x1="517" y1="367" x2="527" y2="367" class="line"></line><line x1="571" y1="367" x2="581" y2="367" class="line"></line><line x1="581" y1="367" x2="595" y2="367" class="line"></line><rect x="647" y="309" width="36" height="32" rx="10"></rect><rect x="645" y="307" width="36" height="32" class="terminal" rx="10"></rect><text class="terminal" x="655" y="327">on</text><line x1="635" y1="323" x2="645" y2="323" class="line"></line><line x1="681" y1="323" x2="691" y2="323" class="line"></line><a xlink:href="#CONDITION" xlink:title="CONDITION"><rect x="743" y="309" width="92" height="32"></rect><rect x="741" y="307" width="92" height="32" class="nonterminal"></rect><text class="nonterminal" x="751" y="327">CONDITION</text></a><line x1="731" y1="323" x2="741" y2="323" class="line"></line><line x1="833" y1="323" x2="843" y2="323" class="line"></line><path d="M711 323 L731 323 M730 323 Q721 323 721 313 L721 301 Q721 291 731 291" class="line"></path><path d="M843 323 L863 323 M843 323 Q853 323 853 313 L853 301 Q853 291 843 291" class="line"></path><line x1="731" y1="291" x2="741" y2="291" class="line"></line><line x1="741" y1="291" x2="843" y2="291" class="line"></line><line x1="691" y1="323" x2="711" y2="323" class="line"></line><line x1="863" y1="323" x2="883" y2="323" class="line"></line><path d="M691 323 Q701 323 701 333" class="line"></path><path d="M873 333 Q873 323 883 323" class="line"></path><line x1="701" y1="333" x2="701" y2="357" class="line"></line><line x1="873" y1="357" x2="873" y2="333" class="line"></line><path d="M701 357 Q701 367 711 367" class="line"></path><path d="M863 367 Q873 367 873 357" class="line"></path><a xlink:href="#SQL" xlink:title="SQL"><rect x="723" y="353" width="44" height="32"></rect><rect x="721" y="351" width="44" height="32" class="nonterminal"></rect><text class="nonterminal" x="731" y="371">SQL</text></a><line x1="711" y1="367" x2="721" y2="367" class="line"></line><line x1="765" y1="367" x2="775" y2="367" class="line"></line><line x1="775" y1="367" x2="863" y2="367" class="line"></line><a xlink:href="#MORE_CONDITIONS" xlink:title="MORE_CONDITIONS"><rect x="915" y="309" width="144" height="32"></rect><rect x="913" y="307" width="144" height="32" class="nonterminal"></rect><text class="nonterminal" x="923" y="327">MORE_CONDITIONS</text></a><line x1="903" y1="323" x2="913" y2="323" class="line"></line><line x1="1057" y1="323" x2="1067" y2="323" class="line"></line><line x1="883" y1="323" x2="903" y2="323" class="line"></line><line x1="1067" y1="323" x2="1087" y2="323" class="line"></line><path d="M883 323 Q893 323 893 333" class="line"></path><path d="M1077 333 Q1077 323 1087 323" class="line"></path><line x1="893" y1="333" x2="893" y2="347" class="line"></line><line x1="1077" y1="347" x2="1077" y2="333" class="line"></line><path d="M893 347 Q893 357 903 357" class="line"></path><path d="M1067 357 Q1077 357 1077 347" class="line"></path><line x1="903" y1="357" x2="913" y2="357" class="line"></line><line x1="913" y1="357" x2="1067" y2="357" class="line"></line><line x1="615" y1="323" x2="635" y2="323" class="line"></line><line x1="1087" y1="323" x2="1107" y2="323" class="line"></line><path d="M615 323 Q625 323 625 333" class="line"></path><path d="M1097 333 Q1097 323 1107 323" class="line"></path><line x1="625" y1="333" x2="625" y2="423" class="line"></line><line x1="1097" y1="423" x2="1097" y2="333" class="line"></line><path d="M625 423 Q625 433 635 433" class="line"></path><path d="M1087 433 Q1097 433 1097 423" class="line"></path><rect x="647" y="419" width="54" height="32" rx="10"></rect><rect x="645" y="417" width="54" height="32" class="terminal" rx="10"></rect><text class="terminal" x="655" y="437">using</text><line x1="635" y1="433" x2="645" y2="433" class="line"></line><line x1="699" y1="433" x2="709" y2="433" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="741" y="419" width="56" height="32"></rect><rect x="739" y="417" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="749" y="437">FIELD</text></a><line x1="729" y1="433" x2="739" y2="433" class="line"></line><line x1="795" y1="433" x2="805" y2="433" class="line"></line><path d="M709 433 L729 433 M728 433 Q719 433 719 423 L719 411 Q719 401 729 401" class="line"></path><path d="M805 433 L825 433 M805 433 Q815 433 815 423 L815 411 Q815 401 805 401" class="line"></path><line x1="729" y1="401" x2="739" y2="401" class="line"></line><line x1="739" y1="401" x2="805" y2="401" class="line"></line><line x1="825" y1="433" x2="1087" y2="433" class="line"></line><line x1="301" y1="323" x2="321" y2="323" class="line"></line><line x1="1107" y1="323" x2="1127" y2="323" class="line"></line><path d="M301 323 Q311 323 311 333" class="line"></path><path d="M1117 333 Q1117 323 1127 323" class="line"></path><line x1="311" y1="333" x2="311" y2="489" class="line"></line><line x1="1117" y1="489" x2="1117" y2="333" class="line"></line><path d="M311 489 Q311 499 321 499" class="line"></path><path d="M1107 499 Q1117 499 1117 489" class="line"></path><rect x="353" y="485" width="82" height="32" rx="10"></rect><rect x="351" y="483" width="82" height="32" class="terminal" rx="10"></rect><text class="terminal" x="361" y="503">crossJoin</text><line x1="341" y1="499" x2="351" y2="499" class="line"></line><line x1="433" y1="499" x2="443" y2="499" class="line"></line><line x1="443" y1="499" x2="527" y2="499" class="line"></line><line x1="321" y1="499" x2="341" y2="499" class="line"></line><line x1="527" y1="499" x2="547" y2="499" class="line"></line><path d="M321 499 Q331 499 331 509" class="line"></path><path d="M537 509 Q537 499 547 499" class="line"></path><line x1="331" y1="509" x2="331" y2="533" class="line"></line><line x1="537" y1="533" x2="537" y2="509" class="line"></line><path d="M331 533 Q331 543 341 543" class="line"></path><path d="M527 543 Q537 543 537 533" class="line"></path><rect x="353" y="529" width="94" height="32" rx="10"></rect><rect x="351" y="527" width="94" height="32" class="terminal" rx="10"></rect><text class="terminal" x="361" y="547">naturalJoin</text><line x1="341" y1="543" x2="351" y2="543" class="line"></line><line x1="445" y1="543" x2="455" y2="543" class="line"></line><line x1="455" y1="543" x2="527" y2="543" class="line"></line><line x1="331" y1="533" x2="331" y2="553" class="line"></line><line x1="537" y1="553" x2="537" y2="533" class="line"></line><line x1="331" y1="553" x2="331" y2="577" class="line"></line><line x1="537" y1="577" x2="537" y2="553" class="line"></line><path d="M331 577 Q331 587 341 587" class="line"></path><path d="M527 587 Q537 587 537 577" class="line"></path><rect x="353" y="573" width="158" height="32" rx="10"></rect><rect x="351" y="571" width="158" height="32" class="terminal" rx="10"></rect><text class="terminal" x="361" y="591">naturalLeftOuterJoin</text><line x1="341" y1="587" x2="351" y2="587" class="line"></line><line x1="509" y1="587" x2="519" y2="587" class="line"></line><line x1="519" y1="587" x2="527" y2="587" class="line"></line><line x1="331" y1="577" x2="331" y2="597" class="line"></line><line x1="537" y1="597" x2="537" y2="577" class="line"></line><line x1="331" y1="597" x2="331" y2="621" class="line"></line><line x1="537" y1="621" x2="537" y2="597" class="line"></line><path d="M331 621 Q331 631 341 631" class="line"></path><path d="M527 631 Q537 631 537 621" class="line"></path><rect x="353" y="617" width="166" height="32" rx="10"></rect><rect x="351" y="615" width="166" height="32" class="terminal" rx="10"></rect><text class="terminal" x="361" y="635">naturalRightOuterJoin</text><line x1="341" y1="631" x2="351" y2="631" class="line"></line><line x1="517" y1="631" x2="527" y2="631" class="line"></line><a xlink:href="#TABLE" xlink:title="TABLE"><rect x="579" y="485" width="58" height="32"></rect><rect x="577" y="483" width="58" height="32" class="nonterminal"></rect><text class="nonterminal" x="587" y="503">TABLE</text></a><line x1="567" y1="499" x2="577" y2="499" class="line"></line><line x1="635" y1="499" x2="645" y2="499" class="line"></line><line x1="547" y1="499" x2="567" y2="499" class="line"></line><line x1="645" y1="499" x2="665" y2="499" class="line"></line><path d="M547 499 Q557 499 557 509" class="line"></path><path d="M655 509 Q655 499 665 499" class="line"></path><line x1="557" y1="509" x2="557" y2="533" class="line"></line><line x1="655" y1="533" x2="655" y2="509" class="line"></line><path d="M557 533 Q557 543 567 543" class="line"></path><path d="M645 543 Q655 543 655 533" class="line"></path><a xlink:href="#SQL" xlink:title="SQL"><rect x="579" y="529" width="44" height="32"></rect><rect x="577" y="527" width="44" height="32" class="nonterminal"></rect><text class="nonterminal" x="587" y="547">SQL</text></a><line x1="567" y1="543" x2="577" y2="543" class="line"></line><line x1="621" y1="543" x2="631" y2="543" class="line"></line><line x1="631" y1="543" x2="645" y2="543" class="line"></line><line x1="665" y1="499" x2="1107" y2="499" class="line"></line><path d="M281 323 L301 323 M300 323 Q291 323 291 313 L291 285 Q291 275 301 275" class="line"></path><path d="M1127 323 L1147 323 M1127 323 Q1137 323 1137 313 L1137 285 Q1137 275 1127 275" class="line"></path><line x1="301" y1="275" x2="311" y2="275" class="line"></line><line x1="311" y1="275" x2="1127" y2="275" class="line"></line><line x1="261" y1="323" x2="281" y2="323" class="line"></line><line x1="1147" y1="323" x2="1167" y2="323" class="line"></line><path d="M261 323 Q271 323 271 333" class="line"></path><path d="M1157 333 Q1157 323 1167 323" class="line"></path><line x1="271" y1="333" x2="271" y2="655" class="line"></line><line x1="1157" y1="655" x2="1157" y2="333" class="line"></line><path d="M271 655 Q271 665 281 665" class="line"></path><path d="M1147 665 Q1157 665 1157 655" class="line"></path><line x1="281" y1="665" x2="291" y2="665" class="line"></line><line x1="291" y1="665" x2="1147" y2="665" class="line"></line><line x1="13" y1="323" x2="33" y2="323" class="line"></line><line x1="1167" y1="323" x2="1187" y2="323" class="line"></line><path d="M13 323 Q23 323 23 333" class="line"></path><path d="M1177 333 Q1177 323 1187 323" class="line"></path><line x1="23" y1="333" x2="23" y2="671" class="line"></line><line x1="1177" y1="671" x2="1177" y2="333" class="line"></line><path d="M23 671 Q23 681 33 681" class="line"></path><path d="M1167 681 Q1177 681 1177 671" class="line"></path><line x1="33" y1="681" x2="43" y2="681" class="line"></line><line x1="43" y1="681" x2="1167" y2="681" class="line"></line><path class="line" d="M1189 323 L1191 323 M1193 323 L1195 323 M1197 323 L1199 323 M309 745 L311 745 M313 745 L315 745 M317 745 L319 745"></path><rect x="373" y="731" width="62" height="32" rx="10"></rect><rect x="371" y="729" width="62" height="32" class="terminal" rx="10"></rect><text class="terminal" x="381" y="749">where</text><line x1="361" y1="745" x2="371" y2="745" class="line"></line><line x1="433" y1="745" x2="443" y2="745" class="line"></line><a xlink:href="#CONDITION" xlink:title="CONDITION"><rect x="495" y="731" width="92" height="32"></rect><rect x="493" y="729" width="92" height="32" class="nonterminal"></rect><text class="nonterminal" x="503" y="749">CONDITION</text></a><line x1="483" y1="745" x2="493" y2="745" class="line"></line><line x1="585" y1="745" x2="595" y2="745" class="line"></line><path d="M463 745 L483 745 M482 745 Q473 745 473 735 L473 723 Q473 713 483 713" class="line"></path><path d="M595 745 L615 745 M595 745 Q605 745 605 735 L605 723 Q605 713 595 713" class="line"></path><line x1="483" y1="713" x2="493" y2="713" class="line"></line><line x1="493" y1="713" x2="595" y2="713" class="line"></line><line x1="443" y1="745" x2="463" y2="745" class="line"></line><line x1="615" y1="745" x2="635" y2="745" class="line"></line><path d="M443 745 Q453 745 453 755" class="line"></path><path d="M625 755 Q625 745 635 745" class="line"></path><line x1="453" y1="755" x2="453" y2="779" class="line"></line><line x1="625" y1="779" x2="625" y2="755" class="line"></line><path d="M453 779 Q453 789 463 789" class="line"></path><path d="M615 789 Q625 789 625 779" class="line"></path><a xlink:href="#SQL" xlink:title="SQL"><rect x="475" y="775" width="44" height="32"></rect><rect x="473" y="773" width="44" height="32" class="nonterminal"></rect><text class="nonterminal" x="483" y="793">SQL</text></a><line x1="463" y1="789" x2="473" y2="789" class="line"></line><line x1="517" y1="789" x2="527" y2="789" class="line"></line><line x1="527" y1="789" x2="615" y2="789" class="line"></line><line x1="341" y1="745" x2="361" y2="745" class="line"></line><line x1="635" y1="745" x2="655" y2="745" class="line"></line><path d="M341 745 Q351 745 351 755" class="line"></path><path d="M645 755 Q645 745 655 745" class="line"></path><line x1="351" y1="755" x2="351" y2="823" class="line"></line><line x1="645" y1="823" x2="645" y2="755" class="line"></line><path d="M351 823 Q351 833 361 833" class="line"></path><path d="M635 833 Q645 833 645 823" class="line"></path><rect x="393" y="819" width="100" height="32" rx="10"></rect><rect x="391" y="817" width="100" height="32" class="terminal" rx="10"></rect><text class="terminal" x="401" y="837">whereExists</text><line x1="381" y1="833" x2="391" y2="833" class="line"></line><line x1="491" y1="833" x2="501" y2="833" class="line"></line><line x1="501" y1="833" x2="525" y2="833" class="line"></line><line x1="361" y1="833" x2="381" y2="833" class="line"></line><line x1="525" y1="833" x2="545" y2="833" class="line"></line><path d="M361 833 Q371 833 371 843" class="line"></path><path d="M535 843 Q535 833 545 833" class="line"></path><line x1="371" y1="843" x2="371" y2="867" class="line"></line><line x1="535" y1="867" x2="535" y2="843" class="line"></line><path d="M371 867 Q371 877 381 877" class="line"></path><path d="M525 877 Q535 877 535 867" class="line"></path><rect x="393" y="863" width="124" height="32" rx="10"></rect><rect x="391" y="861" width="124" height="32" class="terminal" rx="10"></rect><text class="terminal" x="401" y="881">whereNotExists</text><line x1="381" y1="877" x2="391" y2="877" class="line"></line><line x1="515" y1="877" x2="525" y2="877" class="line"></line><a xlink:href="#SELECT" xlink:title="SELECT"><rect x="557" y="819" width="66" height="32"></rect><rect x="555" y="817" width="66" height="32" class="nonterminal"></rect><text class="nonterminal" x="565" y="837">SELECT</text></a><line x1="545" y1="833" x2="555" y2="833" class="line"></line><line x1="621" y1="833" x2="631" y2="833" class="line"></line><line x1="631" y1="833" x2="635" y2="833" class="line"></line><a xlink:href="#MORE_CONDITIONS" xlink:title="MORE_CONDITIONS"><rect x="687" y="731" width="144" height="32"></rect><rect x="685" y="729" width="144" height="32" class="nonterminal"></rect><text class="nonterminal" x="695" y="749">MORE_CONDITIONS</text></a><line x1="675" y1="745" x2="685" y2="745" class="line"></line><line x1="829" y1="745" x2="839" y2="745" class="line"></line><line x1="655" y1="745" x2="675" y2="745" class="line"></line><line x1="839" y1="745" x2="859" y2="745" class="line"></line><path d="M655 745 Q665 745 665 755" class="line"></path><path d="M849 755 Q849 745 859 745" class="line"></path><line x1="665" y1="755" x2="665" y2="769" class="line"></line><line x1="849" y1="769" x2="849" y2="755" class="line"></line><path d="M665 769 Q665 779 675 779" class="line"></path><path d="M839 779 Q849 779 849 769" class="line"></path><line x1="675" y1="779" x2="685" y2="779" class="line"></line><line x1="685" y1="779" x2="839" y2="779" class="line"></line><line x1="321" y1="745" x2="341" y2="745" class="line"></line><line x1="859" y1="745" x2="879" y2="745" class="line"></line><path d="M321 745 Q331 745 331 755" class="line"></path><path d="M869 755 Q869 745 879 745" class="line"></path><line x1="331" y1="755" x2="331" y2="901" class="line"></line><line x1="869" y1="901" x2="869" y2="755" class="line"></line><path d="M331 901 Q331 911 341 911" class="line"></path><path d="M859 911 Q869 911 869 901" class="line"></path><line x1="341" y1="911" x2="351" y2="911" class="line"></line><line x1="351" y1="911" x2="859" y2="911" class="line"></line><path class="line" d="M881 745 L883 745 M885 745 L887 745 M889 745 L891 745 M224 1003 L226 1003 M228 1003 L230 1003 M232 1003 L234 1003"></path><rect x="288" y="989" width="88" height="32" rx="10"></rect><rect x="286" y="987" width="88" height="32" class="terminal" rx="10"></rect><text class="terminal" x="296" y="1007">connectBy</text><line x1="276" y1="1003" x2="286" y2="1003" class="line"></line><line x1="374" y1="1003" x2="384" y2="1003" class="line"></line><line x1="384" y1="1003" x2="438" y2="1003" class="line"></line><line x1="256" y1="1003" x2="276" y2="1003" class="line"></line><line x1="438" y1="1003" x2="458" y2="1003" class="line"></line><path d="M256 1003 Q266 1003 266 1013" class="line"></path><path d="M448 1013 Q448 1003 458 1003" class="line"></path><line x1="266" y1="1013" x2="266" y2="1037" class="line"></line><line x1="448" y1="1037" x2="448" y2="1013" class="line"></line><path d="M266 1037 Q266 1047 276 1047" class="line"></path><path d="M438 1047 Q448 1047 448 1037" class="line"></path><rect x="288" y="1033" width="142" height="32" rx="10"></rect><rect x="286" y="1031" width="142" height="32" class="terminal" rx="10"></rect><text class="terminal" x="296" y="1051">connectByNoCycle</text><line x1="276" y1="1047" x2="286" y2="1047" class="line"></line><line x1="428" y1="1047" x2="438" y2="1047" class="line"></line><a xlink:href="#CONDITION" xlink:title="CONDITION"><rect x="510" y="989" width="92" height="32"></rect><rect x="508" y="987" width="92" height="32" class="nonterminal"></rect><text class="nonterminal" x="518" y="1007">CONDITION</text></a><line x1="498" y1="1003" x2="508" y2="1003" class="line"></line><line x1="600" y1="1003" x2="610" y2="1003" class="line"></line><line x1="478" y1="1003" x2="498" y2="1003" class="line"></line><line x1="610" y1="1003" x2="630" y2="1003" class="line"></line><path d="M478 1003 Q488 1003 488 1013" class="line"></path><path d="M620 1013 Q620 1003 630 1003" class="line"></path><line x1="488" y1="1013" x2="488" y2="1037" class="line"></line><line x1="620" y1="1037" x2="620" y2="1013" class="line"></line><path d="M488 1037 Q488 1047 498 1047" class="line"></path><path d="M610 1047 Q620 1047 620 1037" class="line"></path><a xlink:href="#SQL" xlink:title="SQL"><rect x="510" y="1033" width="44" height="32"></rect><rect x="508" y="1031" width="44" height="32" class="nonterminal"></rect><text class="nonterminal" x="518" y="1051">SQL</text></a><line x1="498" y1="1047" x2="508" y2="1047" class="line"></line><line x1="552" y1="1047" x2="562" y2="1047" class="line"></line><line x1="562" y1="1047" x2="610" y2="1047" class="line"></line><path d="M458 1003 L478 1003 M477 1003 Q468 1003 468 993 L468 969 Q468 959 478 959" class="line"></path><path d="M630 1003 L650 1003 M630 1003 Q640 1003 640 993 L640 969 Q640 959 630 959" class="line"></path><rect x="490" y="945" width="44" height="32" rx="10"></rect><rect x="488" y="943" width="44" height="32" class="terminal" rx="10"></rect><text class="terminal" x="498" y="963">and</text><line x1="478" y1="959" x2="488" y2="959" class="line"></line><line x1="532" y1="959" x2="542" y2="959" class="line"></line><line x1="542" y1="959" x2="630" y2="959" class="line"></line><rect x="682" y="989" width="82" height="32" rx="10"></rect><rect x="680" y="987" width="82" height="32" class="terminal" rx="10"></rect><text class="terminal" x="690" y="1007">startWith</text><line x1="670" y1="1003" x2="680" y2="1003" class="line"></line><line x1="762" y1="1003" x2="772" y2="1003" class="line"></line><a xlink:href="#CONDITION" xlink:title="CONDITION"><rect x="804" y="989" width="92" height="32"></rect><rect x="802" y="987" width="92" height="32" class="nonterminal"></rect><text class="nonterminal" x="812" y="1007">CONDITION</text></a><line x1="792" y1="1003" x2="802" y2="1003" class="line"></line><line x1="894" y1="1003" x2="904" y2="1003" class="line"></line><line x1="772" y1="1003" x2="792" y2="1003" class="line"></line><line x1="904" y1="1003" x2="924" y2="1003" class="line"></line><path d="M772 1003 Q782 1003 782 1013" class="line"></path><path d="M914 1013 Q914 1003 924 1003" class="line"></path><line x1="782" y1="1013" x2="782" y2="1037" class="line"></line><line x1="914" y1="1037" x2="914" y2="1013" class="line"></line><path d="M782 1037 Q782 1047 792 1047" class="line"></path><path d="M904 1047 Q914 1047 914 1037" class="line"></path><a xlink:href="#SQL" xlink:title="SQL"><rect x="804" y="1033" width="44" height="32"></rect><rect x="802" y="1031" width="44" height="32" class="nonterminal"></rect><text class="nonterminal" x="812" y="1051">SQL</text></a><line x1="792" y1="1047" x2="802" y2="1047" class="line"></line><line x1="846" y1="1047" x2="856" y2="1047" class="line"></line><line x1="856" y1="1047" x2="904" y2="1047" class="line"></line><line x1="650" y1="1003" x2="670" y2="1003" class="line"></line><line x1="924" y1="1003" x2="944" y2="1003" class="line"></line><path d="M650 1003 Q660 1003 660 1013" class="line"></path><path d="M934 1013 Q934 1003 944 1003" class="line"></path><line x1="660" y1="1013" x2="660" y2="1071" class="line"></line><line x1="934" y1="1071" x2="934" y2="1013" class="line"></line><path d="M660 1071 Q660 1081 670 1081" class="line"></path><path d="M924 1081 Q934 1081 934 1071" class="line"></path><line x1="670" y1="1081" x2="680" y2="1081" class="line"></line><line x1="680" y1="1081" x2="924" y2="1081" class="line"></line><line x1="236" y1="1003" x2="256" y2="1003" class="line"></line><line x1="944" y1="1003" x2="964" y2="1003" class="line"></line><path d="M236 1003 Q246 1003 246 1013" class="line"></path><path d="M954 1013 Q954 1003 964 1003" class="line"></path><line x1="246" y1="1013" x2="246" y2="1087" class="line"></line><line x1="954" y1="1087" x2="954" y2="1013" class="line"></line><path d="M246 1087 Q246 1097 256 1097" class="line"></path><path d="M944 1097 Q954 1097 954 1087" class="line"></path><line x1="256" y1="1097" x2="266" y2="1097" class="line"></line><line x1="266" y1="1097" x2="944" y2="1097" class="line"></line><path class="line" d="M966 1003 L968 1003 M970 1003 L972 1003 M974 1003 L976 1003 M177 1161 L179 1161 M181 1161 L183 1161 M185 1161 L187 1161"></path><rect x="221" y="1147" width="74" height="32" rx="10"></rect><rect x="219" y="1145" width="74" height="32" class="terminal" rx="10"></rect><text class="terminal" x="229" y="1165">groupBy</text><line x1="209" y1="1161" x2="219" y2="1161" class="line"></line><line x1="293" y1="1161" x2="303" y2="1161" class="line"></line><a xlink:href="#GROUP_FIELD" xlink:title="GROUP_FIELD"><rect x="335" y="1147" width="108" height="32"></rect><rect x="333" y="1145" width="108" height="32" class="nonterminal"></rect><text class="nonterminal" x="343" y="1165">GROUP_FIELD</text></a><line x1="323" y1="1161" x2="333" y2="1161" class="line"></line><line x1="441" y1="1161" x2="451" y2="1161" class="line"></line><path d="M303 1161 L323 1161 M322 1161 Q313 1161 313 1151 L313 1139 Q313 1129 323 1129" class="line"></path><path d="M451 1161 L471 1161 M451 1161 Q461 1161 461 1151 L461 1139 Q461 1129 451 1129" class="line"></path><line x1="323" y1="1129" x2="333" y2="1129" class="line"></line><line x1="333" y1="1129" x2="451" y2="1129" class="line"></line><line x1="189" y1="1161" x2="209" y2="1161" class="line"></line><line x1="471" y1="1161" x2="491" y2="1161" class="line"></line><path d="M189 1161 Q199 1161 199 1171" class="line"></path><path d="M481 1171 Q481 1161 491 1161" class="line"></path><line x1="199" y1="1171" x2="199" y2="1185" class="line"></line><line x1="481" y1="1185" x2="481" y2="1171" class="line"></line><path d="M199 1185 Q199 1195 209 1195" class="line"></path><path d="M471 1195 Q481 1195 481 1185" class="line"></path><line x1="209" y1="1195" x2="219" y2="1195" class="line"></line><line x1="219" y1="1195" x2="471" y2="1195" class="line"></line><rect x="523" y="1147" width="64" height="32" rx="10"></rect><rect x="521" y="1145" width="64" height="32" class="terminal" rx="10"></rect><text class="terminal" x="531" y="1165">having</text><line x1="511" y1="1161" x2="521" y2="1161" class="line"></line><line x1="585" y1="1161" x2="595" y2="1161" class="line"></line><a xlink:href="#CONDITION" xlink:title="CONDITION"><rect x="647" y="1147" width="92" height="32"></rect><rect x="645" y="1145" width="92" height="32" class="nonterminal"></rect><text class="nonterminal" x="655" y="1165">CONDITION</text></a><line x1="635" y1="1161" x2="645" y2="1161" class="line"></line><line x1="737" y1="1161" x2="747" y2="1161" class="line"></line><path d="M615 1161 L635 1161 M634 1161 Q625 1161 625 1151 L625 1139 Q625 1129 635 1129" class="line"></path><path d="M747 1161 L767 1161 M747 1161 Q757 1161 757 1151 L757 1139 Q757 1129 747 1129" class="line"></path><line x1="635" y1="1129" x2="645" y2="1129" class="line"></line><line x1="645" y1="1129" x2="747" y2="1129" class="line"></line><line x1="595" y1="1161" x2="615" y2="1161" class="line"></line><line x1="767" y1="1161" x2="787" y2="1161" class="line"></line><path d="M595 1161 Q605 1161 605 1171" class="line"></path><path d="M777 1171 Q777 1161 787 1161" class="line"></path><line x1="605" y1="1171" x2="605" y2="1195" class="line"></line><line x1="777" y1="1195" x2="777" y2="1171" class="line"></line><path d="M605 1195 Q605 1205 615 1205" class="line"></path><path d="M767 1205 Q777 1205 777 1195" class="line"></path><a xlink:href="#SQL" xlink:title="SQL"><rect x="627" y="1191" width="44" height="32"></rect><rect x="625" y="1189" width="44" height="32" class="nonterminal"></rect><text class="nonterminal" x="635" y="1209">SQL</text></a><line x1="615" y1="1205" x2="625" y2="1205" class="line"></line><line x1="669" y1="1205" x2="679" y2="1205" class="line"></line><line x1="679" y1="1205" x2="767" y2="1205" class="line"></line><a xlink:href="#MORE_CONDITIONS" xlink:title="MORE_CONDITIONS"><rect x="819" y="1147" width="144" height="32"></rect><rect x="817" y="1145" width="144" height="32" class="nonterminal"></rect><text class="nonterminal" x="827" y="1165">MORE_CONDITIONS</text></a><line x1="807" y1="1161" x2="817" y2="1161" class="line"></line><line x1="961" y1="1161" x2="971" y2="1161" class="line"></line><line x1="787" y1="1161" x2="807" y2="1161" class="line"></line><line x1="971" y1="1161" x2="991" y2="1161" class="line"></line><path d="M787 1161 Q797 1161 797 1171" class="line"></path><path d="M981 1171 Q981 1161 991 1161" class="line"></path><line x1="797" y1="1171" x2="797" y2="1185" class="line"></line><line x1="981" y1="1185" x2="981" y2="1171" class="line"></line><path d="M797 1185 Q797 1195 807 1195" class="line"></path><path d="M971 1195 Q981 1195 981 1185" class="line"></path><line x1="807" y1="1195" x2="817" y2="1195" class="line"></line><line x1="817" y1="1195" x2="971" y2="1195" class="line"></line><line x1="491" y1="1161" x2="511" y2="1161" class="line"></line><line x1="991" y1="1161" x2="1011" y2="1161" class="line"></line><path d="M491 1161 Q501 1161 501 1171" class="line"></path><path d="M1001 1171 Q1001 1161 1011 1161" class="line"></path><line x1="501" y1="1171" x2="501" y2="1229" class="line"></line><line x1="1001" y1="1229" x2="1001" y2="1171" class="line"></line><path d="M501 1229 Q501 1239 511 1239" class="line"></path><path d="M991 1239 Q1001 1239 1001 1229" class="line"></path><line x1="511" y1="1239" x2="521" y2="1239" class="line"></line><line x1="521" y1="1239" x2="991" y2="1239" class="line"></line><path class="line" d="M1013 1161 L1015 1161 M1017 1161 L1019 1161 M1021 1161 L1023 1161 M142 1303 L144 1303 M146 1303 L148 1303 M150 1303 L152 1303"></path><rect x="186" y="1289" width="72" height="32" rx="10"></rect><rect x="184" y="1287" width="72" height="32" class="terminal" rx="10"></rect><text class="terminal" x="194" y="1307">orderBy</text><line x1="174" y1="1303" x2="184" y2="1303" class="line"></line><line x1="256" y1="1303" x2="266" y2="1303" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="318" y="1289" width="56" height="32"></rect><rect x="316" y="1287" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="326" y="1307">FIELD</text></a><line x1="306" y1="1303" x2="316" y2="1303" class="line"></line><line x1="372" y1="1303" x2="382" y2="1303" class="line"></line><path d="M286 1303 L306 1303 M305 1303 Q296 1303 296 1293 L296 1281 Q296 1271 306 1271" class="line"></path><path d="M382 1303 L402 1303 M382 1303 Q392 1303 392 1293 L392 1281 Q392 1271 382 1271" class="line"></path><line x1="306" y1="1271" x2="316" y2="1271" class="line"></line><line x1="316" y1="1271" x2="382" y2="1271" class="line"></line><line x1="402" y1="1303" x2="442" y2="1303" class="line"></line><line x1="266" y1="1303" x2="286" y2="1303" class="line"></line><line x1="442" y1="1303" x2="462" y2="1303" class="line"></line><path d="M266 1303 Q276 1303 276 1313" class="line"></path><path d="M452 1313 Q452 1303 462 1303" class="line"></path><line x1="276" y1="1313" x2="276" y2="1359" class="line"></line><line x1="452" y1="1359" x2="452" y2="1313" class="line"></line><path d="M276 1359 Q276 1369 286 1369" class="line"></path><path d="M442 1369 Q452 1369 452 1359" class="line"></path><a xlink:href="#SORT_FIELD" xlink:title="SORT_FIELD"><rect x="318" y="1355" width="96" height="32"></rect><rect x="316" y="1353" width="96" height="32" class="nonterminal"></rect><text class="nonterminal" x="326" y="1373">SORT_FIELD</text></a><line x1="306" y1="1369" x2="316" y2="1369" class="line"></line><line x1="412" y1="1369" x2="422" y2="1369" class="line"></line><path d="M286 1369 L306 1369 M305 1369 Q296 1369 296 1359 L296 1347 Q296 1337 306 1337" class="line"></path><path d="M422 1369 L442 1369 M422 1369 Q432 1369 432 1359 L432 1347 Q432 1337 422 1337" class="line"></path><line x1="306" y1="1337" x2="316" y2="1337" class="line"></line><line x1="316" y1="1337" x2="422" y2="1337" class="line"></line><line x1="276" y1="1359" x2="276" y2="1379" class="line"></line><line x1="452" y1="1379" x2="452" y2="1359" class="line"></line><line x1="276" y1="1379" x2="276" y2="1425" class="line"></line><line x1="452" y1="1425" x2="452" y2="1379" class="line"></line><path d="M276 1425 Q276 1435 286 1435" class="line"></path><path d="M442 1435 Q452 1435 452 1425" class="line"></path><a xlink:href="#INT" xlink:title="INT"><rect x="318" y="1421" width="40" height="32"></rect><rect x="316" y="1419" width="40" height="32" class="nonterminal"></rect><text class="nonterminal" x="326" y="1439">INT</text></a><line x1="306" y1="1435" x2="316" y2="1435" class="line"></line><line x1="356" y1="1435" x2="366" y2="1435" class="line"></line><path d="M286 1435 L306 1435 M305 1435 Q296 1435 296 1425 L296 1413 Q296 1403 306 1403" class="line"></path><path d="M366 1435 L386 1435 M366 1435 Q376 1435 376 1425 L376 1413 Q376 1403 366 1403" class="line"></path><line x1="306" y1="1403" x2="316" y2="1403" class="line"></line><line x1="316" y1="1403" x2="366" y2="1403" class="line"></line><line x1="386" y1="1435" x2="442" y2="1435" class="line"></line><line x1="154" y1="1303" x2="174" y2="1303" class="line"></line><line x1="462" y1="1303" x2="482" y2="1303" class="line"></line><path d="M154 1303 Q164 1303 164 1313" class="line"></path><path d="M472 1313 Q472 1303 482 1303" class="line"></path><line x1="164" y1="1313" x2="164" y2="1459" class="line"></line><line x1="472" y1="1459" x2="472" y2="1313" class="line"></line><path d="M164 1459 Q164 1469 174 1469" class="line"></path><path d="M462 1469 Q472 1469 472 1459" class="line"></path><line x1="174" y1="1469" x2="184" y2="1469" class="line"></line><line x1="184" y1="1469" x2="462" y2="1469" class="line"></line><rect x="514" y="1289" width="48" height="32" rx="10"></rect><rect x="512" y="1287" width="48" height="32" class="terminal" rx="10"></rect><text class="terminal" x="522" y="1307">limit</text><line x1="502" y1="1303" x2="512" y2="1303" class="line"></line><line x1="560" y1="1303" x2="570" y2="1303" class="line"></line><a xlink:href="#INT" xlink:title="INT"><rect x="582" y="1289" width="40" height="32"></rect><rect x="580" y="1287" width="40" height="32" class="nonterminal"></rect><text class="nonterminal" x="590" y="1307">INT</text></a><line x1="570" y1="1303" x2="580" y2="1303" class="line"></line><line x1="620" y1="1303" x2="630" y2="1303" class="line"></line><rect x="662" y="1289" width="58" height="32" rx="10"></rect><rect x="660" y="1287" width="58" height="32" class="terminal" rx="10"></rect><text class="terminal" x="670" y="1307">offset</text><line x1="650" y1="1303" x2="660" y2="1303" class="line"></line><line x1="718" y1="1303" x2="728" y2="1303" class="line"></line><a xlink:href="#INT" xlink:title="INT"><rect x="740" y="1289" width="40" height="32"></rect><rect x="738" y="1287" width="40" height="32" class="nonterminal"></rect><text class="nonterminal" x="748" y="1307">INT</text></a><line x1="728" y1="1303" x2="738" y2="1303" class="line"></line><line x1="778" y1="1303" x2="788" y2="1303" class="line"></line><line x1="630" y1="1303" x2="650" y2="1303" class="line"></line><line x1="788" y1="1303" x2="808" y2="1303" class="line"></line><path d="M630 1303 Q640 1303 640 1313" class="line"></path><path d="M798 1313 Q798 1303 808 1303" class="line"></path><line x1="640" y1="1313" x2="640" y2="1337" class="line"></line><line x1="798" y1="1337" x2="798" y2="1313" class="line"></line><path d="M640 1337 Q640 1347 650 1347" class="line"></path><path d="M788 1347 Q798 1347 798 1337" class="line"></path><a xlink:href="#INT" xlink:title="INT"><rect x="662" y="1333" width="40" height="32"></rect><rect x="660" y="1331" width="40" height="32" class="nonterminal"></rect><text class="nonterminal" x="670" y="1351">INT</text></a><line x1="650" y1="1347" x2="660" y2="1347" class="line"></line><line x1="700" y1="1347" x2="710" y2="1347" class="line"></line><line x1="710" y1="1347" x2="788" y2="1347" class="line"></line><line x1="640" y1="1337" x2="640" y2="1357" class="line"></line><line x1="798" y1="1357" x2="798" y2="1337" class="line"></line><line x1="640" y1="1357" x2="640" y2="1371" class="line"></line><line x1="798" y1="1371" x2="798" y2="1357" class="line"></line><path d="M640 1371 Q640 1381 650 1381" class="line"></path><path d="M788 1381 Q798 1381 798 1371" class="line"></path><line x1="650" y1="1381" x2="660" y2="1381" class="line"></line><line x1="660" y1="1381" x2="788" y2="1381" class="line"></line><line x1="808" y1="1303" x2="1026" y2="1303" class="line"></line><line x1="482" y1="1303" x2="502" y2="1303" class="line"></line><line x1="1026" y1="1303" x2="1046" y2="1303" class="line"></line><path d="M482 1303 Q492 1303 492 1313" class="line"></path><path d="M1036 1313 Q1036 1303 1046 1303" class="line"></path><line x1="492" y1="1313" x2="492" y2="1419" class="line"></line><line x1="1036" y1="1419" x2="1036" y2="1313" class="line"></line><path d="M492 1419 Q492 1429 502 1429" class="line"></path><path d="M1026 1429 Q1036 1429 1036 1419" class="line"></path><rect x="514" y="1415" width="86" height="32" rx="10"></rect><rect x="512" y="1413" width="86" height="32" class="terminal" rx="10"></rect><text class="terminal" x="522" y="1433">forUpdate</text><line x1="502" y1="1429" x2="512" y2="1429" class="line"></line><line x1="598" y1="1429" x2="608" y2="1429" class="line"></line><rect x="640" y="1415" width="32" height="32" rx="10"></rect><rect x="638" y="1413" width="32" height="32" class="terminal" rx="10"></rect><text class="terminal" x="648" y="1433">of</text><line x1="628" y1="1429" x2="638" y2="1429" class="line"></line><line x1="670" y1="1429" x2="680" y2="1429" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="732" y="1415" width="56" height="32"></rect><rect x="730" y="1413" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="740" y="1433">FIELD</text></a><line x1="720" y1="1429" x2="730" y2="1429" class="line"></line><line x1="786" y1="1429" x2="796" y2="1429" class="line"></line><path d="M700 1429 L720 1429 M719 1429 Q710 1429 710 1419 L710 1407 Q710 1397 720 1397" class="line"></path><path d="M796 1429 L816 1429 M796 1429 Q806 1429 806 1419 L806 1407 Q806 1397 796 1397" class="line"></path><line x1="720" y1="1397" x2="730" y2="1397" class="line"></line><line x1="730" y1="1397" x2="796" y2="1397" class="line"></line><line x1="816" y1="1429" x2="818" y2="1429" class="line"></line><line x1="680" y1="1429" x2="700" y2="1429" class="line"></line><line x1="818" y1="1429" x2="838" y2="1429" class="line"></line><path d="M680 1429 Q690 1429 690 1439" class="line"></path><path d="M828 1439 Q828 1429 838 1429" class="line"></path><line x1="690" y1="1439" x2="690" y2="1485" class="line"></line><line x1="828" y1="1485" x2="828" y2="1439" class="line"></line><path d="M690 1485 Q690 1495 700 1495" class="line"></path><path d="M818 1495 Q828 1495 828 1485" class="line"></path><a xlink:href="#TABLE" xlink:title="TABLE"><rect x="732" y="1481" width="58" height="32"></rect><rect x="730" y="1479" width="58" height="32" class="nonterminal"></rect><text class="nonterminal" x="740" y="1499">TABLE</text></a><line x1="720" y1="1495" x2="730" y2="1495" class="line"></line><line x1="788" y1="1495" x2="798" y2="1495" class="line"></line><path d="M700 1495 L720 1495 M719 1495 Q710 1495 710 1485 L710 1473 Q710 1463 720 1463" class="line"></path><path d="M798 1495 L818 1495 M798 1495 Q808 1495 808 1485 L808 1473 Q808 1463 798 1463" class="line"></path><line x1="720" y1="1463" x2="730" y2="1463" class="line"></line><line x1="730" y1="1463" x2="798" y2="1463" class="line"></line><line x1="608" y1="1429" x2="628" y2="1429" class="line"></line><line x1="838" y1="1429" x2="858" y2="1429" class="line"></line><path d="M608 1429 Q618 1429 618 1439" class="line"></path><path d="M848 1439 Q848 1429 858 1429" class="line"></path><line x1="618" y1="1439" x2="618" y2="1519" class="line"></line><line x1="848" y1="1519" x2="848" y2="1439" class="line"></line><path d="M618 1519 Q618 1529 628 1529" class="line"></path><path d="M838 1529 Q848 1529 848 1519" class="line"></path><line x1="628" y1="1529" x2="638" y2="1529" class="line"></line><line x1="638" y1="1529" x2="838" y2="1529" class="line"></line><rect x="890" y="1415" width="48" height="32" rx="10"></rect><rect x="888" y="1413" width="48" height="32" class="terminal" rx="10"></rect><text class="terminal" x="898" y="1433">wait</text><line x1="878" y1="1429" x2="888" y2="1429" class="line"></line><line x1="936" y1="1429" x2="946" y2="1429" class="line"></line><a xlink:href="#INT" xlink:title="INT"><rect x="958" y="1415" width="40" height="32"></rect><rect x="956" y="1413" width="40" height="32" class="nonterminal"></rect><text class="nonterminal" x="966" y="1433">INT</text></a><line x1="946" y1="1429" x2="956" y2="1429" class="line"></line><line x1="996" y1="1429" x2="1006" y2="1429" class="line"></line><line x1="858" y1="1429" x2="878" y2="1429" class="line"></line><line x1="1006" y1="1429" x2="1026" y2="1429" class="line"></line><path d="M858 1429 Q868 1429 868 1439" class="line"></path><path d="M1016 1439 Q1016 1429 1026 1429" class="line"></path><line x1="868" y1="1439" x2="868" y2="1463" class="line"></line><line x1="1016" y1="1463" x2="1016" y2="1439" class="line"></line><path d="M868 1463 Q868 1473 878 1473" class="line"></path><path d="M1006 1473 Q1016 1473 1016 1463" class="line"></path><rect x="890" y="1459" width="66" height="32" rx="10"></rect><rect x="888" y="1457" width="66" height="32" class="terminal" rx="10"></rect><text class="terminal" x="898" y="1477">noWait</text><line x1="878" y1="1473" x2="888" y2="1473" class="line"></line><line x1="954" y1="1473" x2="964" y2="1473" class="line"></line><line x1="964" y1="1473" x2="1006" y2="1473" class="line"></line><line x1="868" y1="1463" x2="868" y2="1483" class="line"></line><line x1="1016" y1="1483" x2="1016" y2="1463" class="line"></line><line x1="868" y1="1483" x2="868" y2="1507" class="line"></line><line x1="1016" y1="1507" x2="1016" y2="1483" class="line"></line><path d="M868 1507 Q868 1517 878 1517" class="line"></path><path d="M1006 1517 Q1016 1517 1016 1507" class="line"></path><rect x="890" y="1503" width="94" height="32" rx="10"></rect><rect x="888" y="1501" width="94" height="32" class="terminal" rx="10"></rect><text class="terminal" x="898" y="1521">skipLocked</text><line x1="878" y1="1517" x2="888" y2="1517" class="line"></line><line x1="982" y1="1517" x2="992" y2="1517" class="line"></line><line x1="992" y1="1517" x2="1006" y2="1517" class="line"></line><line x1="868" y1="1507" x2="868" y2="1527" class="line"></line><line x1="1016" y1="1527" x2="1016" y2="1507" class="line"></line><line x1="868" y1="1527" x2="868" y2="1541" class="line"></line><line x1="1016" y1="1541" x2="1016" y2="1527" class="line"></line><path d="M868 1541 Q868 1551 878 1551" class="line"></path><path d="M1006 1551 Q1016 1551 1016 1541" class="line"></path><line x1="878" y1="1551" x2="888" y2="1551" class="line"></line><line x1="888" y1="1551" x2="1006" y2="1551" class="line"></line><line x1="492" y1="1419" x2="492" y2="1439" class="line"></line><line x1="1036" y1="1439" x2="1036" y2="1419" class="line"></line><line x1="492" y1="1439" x2="492" y2="1573" class="line"></line><line x1="1036" y1="1573" x2="1036" y2="1439" class="line"></line><path d="M492 1573 Q492 1583 502 1583" class="line"></path><path d="M1026 1583 Q1036 1583 1036 1573" class="line"></path><rect x="514" y="1569" width="78" height="32" rx="10"></rect><rect x="512" y="1567" width="78" height="32" class="terminal" rx="10"></rect><text class="terminal" x="522" y="1587">forShare</text><line x1="502" y1="1583" x2="512" y2="1583" class="line"></line><line x1="590" y1="1583" x2="600" y2="1583" class="line"></line><line x1="600" y1="1583" x2="1026" y2="1583" class="line"></line><line x1="492" y1="1573" x2="492" y2="1593" class="line"></line><line x1="1036" y1="1593" x2="1036" y2="1573" class="line"></line><line x1="492" y1="1593" x2="492" y2="1607" class="line"></line><line x1="1036" y1="1607" x2="1036" y2="1593" class="line"></line><path d="M492 1607 Q492 1617 502 1617" class="line"></path><path d="M1026 1617 Q1036 1617 1036 1607" class="line"></path><line x1="502" y1="1617" x2="512" y2="1617" class="line"></line><line x1="512" y1="1617" x2="1026" y2="1617" class="line"></line><path class="line" d="M1048 1303 L1050 1303 M1052 1303 L1054 1303 M1056 1303 L1058 1303 M865 1681 L867 1681 M869 1681 L871 1681 M873 1681 L875 1681"></path><rect x="949" y="1667" width="56" height="32" rx="10"></rect><rect x="947" y="1665" width="56" height="32" class="terminal" rx="10"></rect><text class="terminal" x="957" y="1685">union</text><line x1="937" y1="1681" x2="947" y2="1681" class="line"></line><line x1="1003" y1="1681" x2="1013" y2="1681" class="line"></line><line x1="1013" y1="1681" x2="1035" y2="1681" class="line"></line><line x1="917" y1="1681" x2="937" y2="1681" class="line"></line><line x1="1035" y1="1681" x2="1055" y2="1681" class="line"></line><path d="M917 1681 Q927 1681 927 1691" class="line"></path><path d="M1045 1691 Q1045 1681 1055 1681" class="line"></path><line x1="927" y1="1691" x2="927" y2="1715" class="line"></line><line x1="1045" y1="1715" x2="1045" y2="1691" class="line"></line><path d="M927 1715 Q927 1725 937 1725" class="line"></path><path d="M1035 1725 Q1045 1725 1045 1715" class="line"></path><rect x="949" y="1711" width="72" height="32" rx="10"></rect><rect x="947" y="1709" width="72" height="32" class="terminal" rx="10"></rect><text class="terminal" x="957" y="1729">unionAll</text><line x1="937" y1="1725" x2="947" y2="1725" class="line"></line><line x1="1019" y1="1725" x2="1029" y2="1725" class="line"></line><line x1="1029" y1="1725" x2="1035" y2="1725" class="line"></line><line x1="927" y1="1715" x2="927" y2="1735" class="line"></line><line x1="1045" y1="1735" x2="1045" y2="1715" class="line"></line><line x1="927" y1="1735" x2="927" y2="1759" class="line"></line><line x1="1045" y1="1759" x2="1045" y2="1735" class="line"></line><path d="M927 1759 Q927 1769 937 1769" class="line"></path><path d="M1035 1769 Q1045 1769 1045 1759" class="line"></path><rect x="949" y="1755" width="64" height="32" rx="10"></rect><rect x="947" y="1753" width="64" height="32" class="terminal" rx="10"></rect><text class="terminal" x="957" y="1773">except</text><line x1="937" y1="1769" x2="947" y2="1769" class="line"></line><line x1="1011" y1="1769" x2="1021" y2="1769" class="line"></line><line x1="1021" y1="1769" x2="1035" y2="1769" class="line"></line><line x1="927" y1="1759" x2="927" y2="1779" class="line"></line><line x1="1045" y1="1779" x2="1045" y2="1759" class="line"></line><line x1="927" y1="1779" x2="927" y2="1803" class="line"></line><line x1="1045" y1="1803" x2="1045" y2="1779" class="line"></line><path d="M927 1803 Q927 1813 937 1813" class="line"></path><path d="M1035 1813 Q1045 1813 1045 1803" class="line"></path><rect x="949" y="1799" width="78" height="32" rx="10"></rect><rect x="947" y="1797" width="78" height="32" class="terminal" rx="10"></rect><text class="terminal" x="957" y="1817">intersect</text><line x1="937" y1="1813" x2="947" y2="1813" class="line"></line><line x1="1025" y1="1813" x2="1035" y2="1813" class="line"></line><a xlink:href="#SELECT" xlink:title="SELECT"><rect x="1067" y="1667" width="66" height="32"></rect><rect x="1065" y="1665" width="66" height="32" class="nonterminal"></rect><text class="nonterminal" x="1075" y="1685">SELECT</text></a><line x1="1055" y1="1681" x2="1065" y2="1681" class="line"></line><line x1="1131" y1="1681" x2="1141" y2="1681" class="line"></line><path d="M897 1681 L917 1681 M916 1681 Q907 1681 907 1671 L907 1659 Q907 1649 917 1649" class="line"></path><path d="M1141 1681 L1161 1681 M1141 1681 Q1151 1681 1151 1671 L1151 1659 Q1151 1649 1141 1649" class="line"></path><line x1="917" y1="1649" x2="927" y2="1649" class="line"></line><line x1="927" y1="1649" x2="1141" y2="1649" class="line"></line><line x1="877" y1="1681" x2="897" y2="1681" class="line"></line><line x1="1161" y1="1681" x2="1181" y2="1681" class="line"></line><path d="M877 1681 Q887 1681 887 1691" class="line"></path><path d="M1171 1691 Q1171 1681 1181 1681" class="line"></path><line x1="887" y1="1691" x2="887" y2="1837" class="line"></line><line x1="1171" y1="1837" x2="1171" y2="1691" class="line"></line><path d="M887 1837 Q887 1847 897 1847" class="line"></path><path d="M1161 1847 Q1171 1847 1171 1837" class="line"></path><line x1="897" y1="1847" x2="907" y2="1847" class="line"></line><line x1="907" y1="1847" x2="1161" y2="1847" class="line"></line><line x1="1184" y1="1681" x2="1181" y2="1681" class="line"></line><polygon points="1191 1681 1199 1677 1199 1685" class="filled"></polygon><polygon points="1191 1681 1183 1677 1183 1685" class="filled"></polygon></svg><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml">referenced by:<xhtml:ul><xhtml:li><xhtml:a href="#CONDITION" title="CONDITION">CONDITION</xhtml:a></xhtml:li><xhtml:li><xhtml:a href="#DELETE" title="DELETE">DELETE</xhtml:a></xhtml:li><xhtml:li><xhtml:a href="#INSERT" title="INSERT">INSERT</xhtml:a></xhtml:li><xhtml:li><xhtml:a href="#MORE_CONDITIONS" title="MORE_CONDITIONS">MORE_CONDITIONS</xhtml:a></xhtml:li><xhtml:li><xhtml:a href="#QUERY" title="QUERY">QUERY</xhtml:a></xhtml:li><xhtml:li><xhtml:a href="#RESULT_QUERY" title="RESULT_QUERY">RESULT_QUERY</xhtml:a></xhtml:li><xhtml:li><xhtml:a href="#SELECT" title="SELECT">SELECT</xhtml:a></xhtml:li><xhtml:li><xhtml:a href="#TABLE" title="TABLE">TABLE</xhtml:a></xhtml:li><xhtml:li><xhtml:a href="#UPDATE" title="UPDATE">UPDATE</xhtml:a></xhtml:li></xhtml:ul></xhtml:p><xhtml:br xmlns:xhtml="http://www.w3.org/1999/xhtml"></xhtml:br><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml" style="font-size: 14px; font-weight:bold"><xhtml:a name="UPDATE">UPDATE:</xhtml:a></xhtml:p><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="590" height="282"><defs><style type="text/css">
    -
    -    @namespace "http://www.w3.org/2000/svg";
    -    .line                 {fill: none; stroke: #332900;}
    -    filled                {fill: #332900; stroke: none;}
    -    text                  {font-family: Verdana, Sans-serif;
    -                            font-size: 12px;
    -                            fill: #4D3D00;
    -                          }
    -    text.terminal         {font-family: Verdana, Sans-serif;
    -                            font-size: 12px;
    -                            fill: #4D3D00;
    -                            font-weight: bold;
    -                          }
    -    rect, circle, polygon {fill: #332900; stroke: #332900;}
    -    rect.terminal         {fill: #FFCC00; stroke: #332900;}
    -    rect.nonterminal      {fill: #FFEB99; stroke: #332900;}
    -    rect.text             {fill: none; stroke: none;}    
    -    polygon.regexp        {fill: #FFF5CC; stroke: #332900;}
    -  </style></defs><polygon points="11 33 3 29 3 37" class="filled"></polygon><polygon points="19 33 11 29 11 37" class="filled"></polygon><line x1="19" y1="33" x2="21" y2="33" class="line"></line><rect x="33" y="19" width="64" height="32" rx="10"></rect><rect x="31" y="17" width="64" height="32" class="terminal" rx="10"></rect><text class="terminal" x="41" y="37">update</text><line x1="21" y1="33" x2="31" y2="33" class="line"></line><line x1="95" y1="33" x2="105" y2="33" class="line"></line><a xlink:href="#TABLE" xlink:title="TABLE"><rect x="117" y="19" width="58" height="32"></rect><rect x="115" y="17" width="58" height="32" class="nonterminal"></rect><text class="nonterminal" x="125" y="37">TABLE</text></a><line x1="105" y1="33" x2="115" y2="33" class="line"></line><line x1="173" y1="33" x2="183" y2="33" class="line"></line><rect x="215" y="19" width="40" height="32" rx="10"></rect><rect x="213" y="17" width="40" height="32" class="terminal" rx="10"></rect><text class="terminal" x="223" y="37">set</text><line x1="203" y1="33" x2="213" y2="33" class="line"></line><line x1="253" y1="33" x2="263" y2="33" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="275" y="19" width="56" height="32"></rect><rect x="273" y="17" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="283" y="37">FIELD</text></a><line x1="263" y1="33" x2="273" y2="33" class="line"></line><line x1="329" y1="33" x2="339" y2="33" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="351" y="19" width="56" height="32"></rect><rect x="349" y="17" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="359" y="37">FIELD</text></a><line x1="339" y1="33" x2="349" y2="33" class="line"></line><line x1="405" y1="33" x2="415" y2="33" class="line"></line><path d="M183 33 L203 33 M202 33 Q193 33 193 23 L193 11 Q193 1 203 1" class="line"></path><path d="M415 33 L435 33 M415 33 Q425 33 425 23 L425 11 Q425 1 415 1" class="line"></path><line x1="203" y1="1" x2="213" y2="1" class="line"></line><line x1="213" y1="1" x2="415" y2="1" class="line"></line><path class="line" d="M437 33 L439 33 M441 33 L443 33 M445 33 L447 33 M1 115 L3 115 M5 115 L7 115 M9 115 L11 115"></path><rect x="65" y="101" width="62" height="32" rx="10"></rect><rect x="63" y="99" width="62" height="32" class="terminal" rx="10"></rect><text class="terminal" x="73" y="119">where</text><line x1="53" y1="115" x2="63" y2="115" class="line"></line><line x1="125" y1="115" x2="135" y2="115" class="line"></line><a xlink:href="#CONDITION" xlink:title="CONDITION"><rect x="187" y="101" width="92" height="32"></rect><rect x="185" y="99" width="92" height="32" class="nonterminal"></rect><text class="nonterminal" x="195" y="119">CONDITION</text></a><line x1="175" y1="115" x2="185" y2="115" class="line"></line><line x1="277" y1="115" x2="287" y2="115" class="line"></line><path d="M155 115 L175 115 M174 115 Q165 115 165 105 L165 93 Q165 83 175 83" class="line"></path><path d="M287 115 L307 115 M287 115 Q297 115 297 105 L297 93 Q297 83 287 83" class="line"></path><line x1="175" y1="83" x2="185" y2="83" class="line"></line><line x1="185" y1="83" x2="287" y2="83" class="line"></line><line x1="135" y1="115" x2="155" y2="115" class="line"></line><line x1="307" y1="115" x2="327" y2="115" class="line"></line><path d="M135 115 Q145 115 145 125" class="line"></path><path d="M317 125 Q317 115 327 115" class="line"></path><line x1="145" y1="125" x2="145" y2="149" class="line"></line><line x1="317" y1="149" x2="317" y2="125" class="line"></line><path d="M145 149 Q145 159 155 159" class="line"></path><path d="M307 159 Q317 159 317 149" class="line"></path><a xlink:href="#SQL" xlink:title="SQL"><rect x="167" y="145" width="44" height="32"></rect><rect x="165" y="143" width="44" height="32" class="nonterminal"></rect><text class="nonterminal" x="175" y="163">SQL</text></a><line x1="155" y1="159" x2="165" y2="159" class="line"></line><line x1="209" y1="159" x2="219" y2="159" class="line"></line><line x1="219" y1="159" x2="307" y2="159" class="line"></line><line x1="33" y1="115" x2="53" y2="115" class="line"></line><line x1="327" y1="115" x2="347" y2="115" class="line"></line><path d="M33 115 Q43 115 43 125" class="line"></path><path d="M337 125 Q337 115 347 115" class="line"></path><line x1="43" y1="125" x2="43" y2="193" class="line"></line><line x1="337" y1="193" x2="337" y2="125" class="line"></line><path d="M43 193 Q43 203 53 203" class="line"></path><path d="M327 203 Q337 203 337 193" class="line"></path><rect x="85" y="189" width="100" height="32" rx="10"></rect><rect x="83" y="187" width="100" height="32" class="terminal" rx="10"></rect><text class="terminal" x="93" y="207">whereExists</text><line x1="73" y1="203" x2="83" y2="203" class="line"></line><line x1="183" y1="203" x2="193" y2="203" class="line"></line><line x1="193" y1="203" x2="217" y2="203" class="line"></line><line x1="53" y1="203" x2="73" y2="203" class="line"></line><line x1="217" y1="203" x2="237" y2="203" class="line"></line><path d="M53 203 Q63 203 63 213" class="line"></path><path d="M227 213 Q227 203 237 203" class="line"></path><line x1="63" y1="213" x2="63" y2="237" class="line"></line><line x1="227" y1="237" x2="227" y2="213" class="line"></line><path d="M63 237 Q63 247 73 247" class="line"></path><path d="M217 247 Q227 247 227 237" class="line"></path><rect x="85" y="233" width="124" height="32" rx="10"></rect><rect x="83" y="231" width="124" height="32" class="terminal" rx="10"></rect><text class="terminal" x="93" y="251">whereNotExists</text><line x1="73" y1="247" x2="83" y2="247" class="line"></line><line x1="207" y1="247" x2="217" y2="247" class="line"></line><a xlink:href="#SELECT" xlink:title="SELECT"><rect x="249" y="189" width="66" height="32"></rect><rect x="247" y="187" width="66" height="32" class="nonterminal"></rect><text class="nonterminal" x="257" y="207">SELECT</text></a><line x1="237" y1="203" x2="247" y2="203" class="line"></line><line x1="313" y1="203" x2="323" y2="203" class="line"></line><line x1="323" y1="203" x2="327" y2="203" class="line"></line><a xlink:href="#MORE_CONDITIONS" xlink:title="MORE_CONDITIONS"><rect x="379" y="101" width="144" height="32"></rect><rect x="377" y="99" width="144" height="32" class="nonterminal"></rect><text class="nonterminal" x="387" y="119">MORE_CONDITIONS</text></a><line x1="367" y1="115" x2="377" y2="115" class="line"></line><line x1="521" y1="115" x2="531" y2="115" class="line"></line><line x1="347" y1="115" x2="367" y2="115" class="line"></line><line x1="531" y1="115" x2="551" y2="115" class="line"></line><path d="M347 115 Q357 115 357 125" class="line"></path><path d="M541 125 Q541 115 551 115" class="line"></path><line x1="357" y1="125" x2="357" y2="139" class="line"></line><line x1="541" y1="139" x2="541" y2="125" class="line"></line><path d="M357 139 Q357 149 367 149" class="line"></path><path d="M531 149 Q541 149 541 139" class="line"></path><line x1="367" y1="149" x2="377" y2="149" class="line"></line><line x1="377" y1="149" x2="531" y2="149" class="line"></line><line x1="13" y1="115" x2="33" y2="115" class="line"></line><line x1="551" y1="115" x2="571" y2="115" class="line"></line><path d="M13 115 Q23 115 23 125" class="line"></path><path d="M561 125 Q561 115 571 115" class="line"></path><line x1="23" y1="125" x2="23" y2="271" class="line"></line><line x1="561" y1="271" x2="561" y2="125" class="line"></line><path d="M23 271 Q23 281 33 281" class="line"></path><path d="M551 281 Q561 281 561 271" class="line"></path><line x1="33" y1="281" x2="43" y2="281" class="line"></line><line x1="43" y1="281" x2="551" y2="281" class="line"></line><line x1="574" y1="115" x2="571" y2="115" class="line"></line><polygon points="581 115 589 111 589 119" class="filled"></polygon><polygon points="581 115 573 111 573 119" class="filled"></polygon></svg><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml">referenced by:<xhtml:ul><xhtml:li><xhtml:a href="#QUERY" title="QUERY">QUERY</xhtml:a></xhtml:li></xhtml:ul></xhtml:p><xhtml:br xmlns:xhtml="http://www.w3.org/1999/xhtml"></xhtml:br><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml" style="font-size: 14px; font-weight:bold"><xhtml:a name="INSERT">INSERT:</xhtml:a></xhtml:p><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1026" height="376"><defs><style type="text/css">
    -
    -    @namespace "http://www.w3.org/2000/svg";
    -    .line                 {fill: none; stroke: #332900;}
    -    filled                {fill: #332900; stroke: none;}
    -    text                  {font-family: Verdana, Sans-serif;
    -                            font-size: 12px;
    -                            fill: #4D3D00;
    -                          }
    -    text.terminal         {font-family: Verdana, Sans-serif;
    -                            font-size: 12px;
    -                            fill: #4D3D00;
    -                            font-weight: bold;
    -                          }
    -    rect, circle, polygon {fill: #332900; stroke: #332900;}
    -    rect.terminal         {fill: #FFCC00; stroke: #332900;}
    -    rect.nonterminal      {fill: #FFEB99; stroke: #332900;}
    -    rect.text             {fill: none; stroke: none;}    
    -    polygon.regexp        {fill: #FFF5CC; stroke: #332900;}
    -  </style></defs><polygon points="11 17 3 13 3 21" class="filled"></polygon><polygon points="19 17 11 13 11 21" class="filled"></polygon><line x1="19" y1="17" x2="21" y2="17" class="line"></line><rect x="33" y="3" width="84" height="32" rx="10"></rect><rect x="31" y="1" width="84" height="32" class="terminal" rx="10"></rect><text class="terminal" x="41" y="21">insertInto</text><line x1="21" y1="17" x2="31" y2="17" class="line"></line><line x1="115" y1="17" x2="125" y2="17" class="line"></line><path class="line" d="M127 17 L129 17 M131 17 L133 17 M135 17 L137 17 M1 83 L3 83 M5 83 L7 83 M9 83 L11 83"></path><a xlink:href="#SELECT" xlink:title="SELECT"><rect x="45" y="69" width="66" height="32"></rect><rect x="43" y="67" width="66" height="32" class="nonterminal"></rect><text class="nonterminal" x="53" y="87">SELECT</text></a><line x1="33" y1="83" x2="43" y2="83" class="line"></line><line x1="109" y1="83" x2="119" y2="83" class="line"></line><line x1="119" y1="83" x2="987" y2="83" class="line"></line><line x1="13" y1="83" x2="33" y2="83" class="line"></line><line x1="987" y1="83" x2="1007" y2="83" class="line"></line><path d="M13 83 Q23 83 23 93" class="line"></path><path d="M997 93 Q997 83 1007 83" class="line"></path><line x1="23" y1="93" x2="23" y2="183" class="line"></line><line x1="997" y1="183" x2="997" y2="93" class="line"></line><path d="M23 183 Q23 193 33 193" class="line"></path><path d="M987 193 Q997 193 997 183" class="line"></path><a xlink:href="#TABLE" xlink:title="TABLE"><rect x="45" y="179" width="58" height="32"></rect><rect x="43" y="177" width="58" height="32" class="nonterminal"></rect><text class="nonterminal" x="53" y="197">TABLE</text></a><line x1="33" y1="193" x2="43" y2="193" class="line"></line><line x1="101" y1="193" x2="111" y2="193" class="line"></line><rect x="183" y="179" width="40" height="32" rx="10"></rect><rect x="181" y="177" width="40" height="32" class="terminal" rx="10"></rect><text class="terminal" x="191" y="197">set</text><line x1="171" y1="193" x2="181" y2="193" class="line"></line><line x1="221" y1="193" x2="231" y2="193" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="243" y="179" width="56" height="32"></rect><rect x="241" y="177" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="251" y="197">FIELD</text></a><line x1="231" y1="193" x2="241" y2="193" class="line"></line><line x1="297" y1="193" x2="307" y2="193" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="319" y="179" width="56" height="32"></rect><rect x="317" y="177" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="327" y="197">FIELD</text></a><line x1="307" y1="193" x2="317" y2="193" class="line"></line><line x1="373" y1="193" x2="383" y2="193" class="line"></line><path d="M151 193 L171 193 M170 193 Q161 193 161 183 L161 171 Q161 161 171 161" class="line"></path><path d="M383 193 L403 193 M383 193 Q393 193 393 183 L393 171 Q393 161 383 161" class="line"></path><line x1="171" y1="161" x2="181" y2="161" class="line"></line><line x1="181" y1="161" x2="383" y2="161" class="line"></line><path d="M131 193 L151 193 M150 193 Q141 193 141 183 L141 137 Q141 127 151 127" class="line"></path><path d="M403 193 L423 193 M403 193 Q413 193 413 183 L413 137 Q413 127 403 127" class="line"></path><rect x="163" y="113" width="94" height="32" rx="10"></rect><rect x="161" y="111" width="94" height="32" class="terminal" rx="10"></rect><text class="terminal" x="171" y="131">newRecord</text><line x1="151" y1="127" x2="161" y2="127" class="line"></line><line x1="255" y1="127" x2="265" y2="127" class="line"></line><line x1="265" y1="127" x2="403" y2="127" class="line"></line><line x1="423" y1="193" x2="485" y2="193" class="line"></line><line x1="111" y1="193" x2="131" y2="193" class="line"></line><line x1="485" y1="193" x2="505" y2="193" class="line"></line><path d="M111 193 Q121 193 121 203" class="line"></path><path d="M495 203 Q495 193 505 193" class="line"></path><line x1="121" y1="203" x2="121" y2="265" class="line"></line><line x1="495" y1="265" x2="495" y2="203" class="line"></line><path d="M121 265 Q121 275 131 275" class="line"></path><path d="M485 275 Q495 275 495 265" class="line"></path><rect x="163" y="261" width="62" height="32" rx="10"></rect><rect x="161" y="259" width="62" height="32" class="terminal" rx="10"></rect><text class="terminal" x="171" y="279">values</text><line x1="151" y1="275" x2="161" y2="275" class="line"></line><line x1="223" y1="275" x2="233" y2="275" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="265" y="261" width="56" height="32"></rect><rect x="263" y="259" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="273" y="279">FIELD</text></a><line x1="253" y1="275" x2="263" y2="275" class="line"></line><line x1="319" y1="275" x2="329" y2="275" class="line"></line><path d="M233 275 L253 275 M252 275 Q243 275 243 265 L243 253 Q243 243 253 243" class="line"></path><path d="M329 275 L349 275 M329 275 Q339 275 339 265 L339 253 Q339 243 329 243" class="line"></path><line x1="253" y1="243" x2="263" y2="243" class="line"></line><line x1="263" y1="243" x2="329" y2="243" class="line"></line><path d="M131 275 L151 275 M150 275 Q141 275 141 265 L141 237 Q141 227 151 227" class="line"></path><path d="M349 275 L369 275 M349 275 Q359 275 359 265 L359 237 Q359 227 349 227" class="line"></path><line x1="151" y1="227" x2="161" y2="227" class="line"></line><line x1="161" y1="227" x2="349" y2="227" class="line"></line><line x1="369" y1="275" x2="485" y2="275" class="line"></line><line x1="121" y1="265" x2="121" y2="285" class="line"></line><line x1="495" y1="285" x2="495" y2="265" class="line"></line><line x1="121" y1="285" x2="121" y2="347" class="line"></line><line x1="495" y1="347" x2="495" y2="285" class="line"></line><path d="M121 347 Q121 357 131 357" class="line"></path><path d="M485 357 Q495 357 495 347" class="line"></path><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="163" y="343" width="56" height="32"></rect><rect x="161" y="341" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="171" y="361">FIELD</text></a><line x1="151" y1="357" x2="161" y2="357" class="line"></line><line x1="217" y1="357" x2="227" y2="357" class="line"></line><path d="M131 357 L151 357 M150 357 Q141 357 141 347 L141 335 Q141 325 151 325" class="line"></path><path d="M227 357 L247 357 M227 357 Q237 357 237 347 L237 335 Q237 325 227 325" class="line"></path><line x1="151" y1="325" x2="161" y2="325" class="line"></line><line x1="161" y1="325" x2="227" y2="325" class="line"></line><rect x="279" y="343" width="62" height="32" rx="10"></rect><rect x="277" y="341" width="62" height="32" class="terminal" rx="10"></rect><text class="terminal" x="287" y="361">values</text><line x1="267" y1="357" x2="277" y2="357" class="line"></line><line x1="339" y1="357" x2="349" y2="357" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="381" y="343" width="56" height="32"></rect><rect x="379" y="341" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="389" y="361">FIELD</text></a><line x1="369" y1="357" x2="379" y2="357" class="line"></line><line x1="435" y1="357" x2="445" y2="357" class="line"></line><path d="M349 357 L369 357 M368 357 Q359 357 359 347 L359 335 Q359 325 369 325" class="line"></path><path d="M445 357 L465 357 M445 357 Q455 357 455 347 L455 335 Q455 325 445 325" class="line"></path><line x1="369" y1="325" x2="379" y2="325" class="line"></line><line x1="379" y1="325" x2="445" y2="325" class="line"></line><path d="M247 357 L267 357 M266 357 Q257 357 257 347 L257 319 Q257 309 267 309" class="line"></path><path d="M465 357 L485 357 M465 357 Q475 357 475 347 L475 319 Q475 309 465 309" class="line"></path><line x1="267" y1="309" x2="277" y2="309" class="line"></line><line x1="277" y1="309" x2="465" y2="309" class="line"></line><rect x="537" y="179" width="170" height="32" rx="10"></rect><rect x="535" y="177" width="170" height="32" class="terminal" rx="10"></rect><text class="terminal" x="545" y="197">onDuplicateKeyUpdate</text><line x1="525" y1="193" x2="535" y2="193" class="line"></line><line x1="705" y1="193" x2="715" y2="193" class="line"></line><rect x="747" y="179" width="40" height="32" rx="10"></rect><rect x="745" y="177" width="40" height="32" class="terminal" rx="10"></rect><text class="terminal" x="755" y="197">set</text><line x1="735" y1="193" x2="745" y2="193" class="line"></line><line x1="785" y1="193" x2="795" y2="193" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="807" y="179" width="56" height="32"></rect><rect x="805" y="177" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="815" y="197">FIELD</text></a><line x1="795" y1="193" x2="805" y2="193" class="line"></line><line x1="861" y1="193" x2="871" y2="193" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="883" y="179" width="56" height="32"></rect><rect x="881" y="177" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="891" y="197">FIELD</text></a><line x1="871" y1="193" x2="881" y2="193" class="line"></line><line x1="937" y1="193" x2="947" y2="193" class="line"></line><path d="M715 193 L735 193 M734 193 Q725 193 725 183 L725 171 Q725 161 735 161" class="line"></path><path d="M947 193 L967 193 M947 193 Q957 193 957 183 L957 171 Q957 161 947 161" class="line"></path><line x1="735" y1="161" x2="745" y2="161" class="line"></line><line x1="745" y1="161" x2="947" y2="161" class="line"></line><line x1="505" y1="193" x2="525" y2="193" class="line"></line><line x1="967" y1="193" x2="987" y2="193" class="line"></line><path d="M505 193 Q515 193 515 203" class="line"></path><path d="M977 203 Q977 193 987 193" class="line"></path><line x1="515" y1="203" x2="515" y2="249" class="line"></line><line x1="977" y1="249" x2="977" y2="203" class="line"></line><path d="M515 249 Q515 259 525 259" class="line"></path><path d="M967 259 Q977 259 977 249" class="line"></path><rect x="537" y="245" width="80" height="32" rx="10"></rect><rect x="535" y="243" width="80" height="32" class="terminal" rx="10"></rect><text class="terminal" x="545" y="263">returning</text><line x1="525" y1="259" x2="535" y2="259" class="line"></line><line x1="615" y1="259" x2="625" y2="259" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="677" y="245" width="56" height="32"></rect><rect x="675" y="243" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="685" y="263">FIELD</text></a><line x1="665" y1="259" x2="675" y2="259" class="line"></line><line x1="731" y1="259" x2="741" y2="259" class="line"></line><path d="M645 259 L665 259 M664 259 Q655 259 655 249 L655 237 Q655 227 665 227" class="line"></path><path d="M741 259 L761 259 M741 259 Q751 259 751 249 L751 237 Q751 227 741 227" class="line"></path><line x1="665" y1="227" x2="675" y2="227" class="line"></line><line x1="675" y1="227" x2="741" y2="227" class="line"></line><line x1="625" y1="259" x2="645" y2="259" class="line"></line><line x1="761" y1="259" x2="781" y2="259" class="line"></line><path d="M625 259 Q635 259 635 269" class="line"></path><path d="M771 269 Q771 259 781 259" class="line"></path><line x1="635" y1="269" x2="635" y2="283" class="line"></line><line x1="771" y1="283" x2="771" y2="269" class="line"></line><path d="M635 283 Q635 293 645 293" class="line"></path><path d="M761 293 Q771 293 771 283" class="line"></path><line x1="645" y1="293" x2="655" y2="293" class="line"></line><line x1="655" y1="293" x2="761" y2="293" class="line"></line><line x1="781" y1="259" x2="967" y2="259" class="line"></line><line x1="515" y1="249" x2="515" y2="269" class="line"></line><line x1="977" y1="269" x2="977" y2="249" class="line"></line><line x1="515" y1="269" x2="515" y2="299" class="line"></line><line x1="977" y1="299" x2="977" y2="269" class="line"></line><path d="M515 299 Q515 309 525 309" class="line"></path><path d="M967 309 Q977 309 977 299" class="line"></path><line x1="525" y1="309" x2="535" y2="309" class="line"></line><line x1="535" y1="309" x2="967" y2="309" class="line"></line><line x1="1010" y1="83" x2="1007" y2="83" class="line"></line><polygon points="1017 83 1025 79 1025 87" class="filled"></polygon><polygon points="1017 83 1009 79 1009 87" class="filled"></polygon></svg><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml">referenced by:<xhtml:ul><xhtml:li><xhtml:a href="#QUERY" title="QUERY">QUERY</xhtml:a></xhtml:li></xhtml:ul></xhtml:p><xhtml:br xmlns:xhtml="http://www.w3.org/1999/xhtml"></xhtml:br><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml" style="font-size: 14px; font-weight:bold"><xhtml:a name="DELETE">DELETE:</xhtml:a></xhtml:p><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="754" height="200"><defs><style type="text/css">
    -
    -    @namespace "http://www.w3.org/2000/svg";
    -    .line                 {fill: none; stroke: #332900;}
    -    filled                {fill: #332900; stroke: none;}
    -    text                  {font-family: Verdana, Sans-serif;
    -                            font-size: 12px;
    -                            fill: #4D3D00;
    -                          }
    -    text.terminal         {font-family: Verdana, Sans-serif;
    -                            font-size: 12px;
    -                            fill: #4D3D00;
    -                            font-weight: bold;
    -                          }
    -    rect, circle, polygon {fill: #332900; stroke: #332900;}
    -    rect.terminal         {fill: #FFCC00; stroke: #332900;}
    -    rect.nonterminal      {fill: #FFEB99; stroke: #332900;}
    -    rect.text             {fill: none; stroke: none;}    
    -    polygon.regexp        {fill: #FFF5CC; stroke: #332900;}
    -  </style></defs><polygon points="9 33 1 29 1 37" class="filled"></polygon><polygon points="17 33 9 29 9 37" class="filled"></polygon><line x1="17" y1="33" x2="19" y2="33" class="line"></line><rect x="31" y="19" width="60" height="32" rx="10"></rect><rect x="29" y="17" width="60" height="32" class="terminal" rx="10"></rect><text class="terminal" x="39" y="37">delete</text><line x1="19" y1="33" x2="29" y2="33" class="line"></line><line x1="89" y1="33" x2="99" y2="33" class="line"></line><a xlink:href="#TABLE" xlink:title="TABLE"><rect x="111" y="19" width="58" height="32"></rect><rect x="109" y="17" width="58" height="32" class="nonterminal"></rect><text class="nonterminal" x="119" y="37">TABLE</text></a><line x1="99" y1="33" x2="109" y2="33" class="line"></line><line x1="167" y1="33" x2="177" y2="33" class="line"></line><rect x="229" y="19" width="62" height="32" rx="10"></rect><rect x="227" y="17" width="62" height="32" class="terminal" rx="10"></rect><text class="terminal" x="237" y="37">where</text><line x1="217" y1="33" x2="227" y2="33" class="line"></line><line x1="289" y1="33" x2="299" y2="33" class="line"></line><a xlink:href="#CONDITION" xlink:title="CONDITION"><rect x="351" y="19" width="92" height="32"></rect><rect x="349" y="17" width="92" height="32" class="nonterminal"></rect><text class="nonterminal" x="359" y="37">CONDITION</text></a><line x1="339" y1="33" x2="349" y2="33" class="line"></line><line x1="441" y1="33" x2="451" y2="33" class="line"></line><path d="M319 33 L339 33 M338 33 Q329 33 329 23 L329 11 Q329 1 339 1" class="line"></path><path d="M451 33 L471 33 M451 33 Q461 33 461 23 L461 11 Q461 1 451 1" class="line"></path><line x1="339" y1="1" x2="349" y2="1" class="line"></line><line x1="349" y1="1" x2="451" y2="1" class="line"></line><line x1="299" y1="33" x2="319" y2="33" class="line"></line><line x1="471" y1="33" x2="491" y2="33" class="line"></line><path d="M299 33 Q309 33 309 43" class="line"></path><path d="M481 43 Q481 33 491 33" class="line"></path><line x1="309" y1="43" x2="309" y2="67" class="line"></line><line x1="481" y1="67" x2="481" y2="43" class="line"></line><path d="M309 67 Q309 77 319 77" class="line"></path><path d="M471 77 Q481 77 481 67" class="line"></path><a xlink:href="#SQL" xlink:title="SQL"><rect x="331" y="63" width="44" height="32"></rect><rect x="329" y="61" width="44" height="32" class="nonterminal"></rect><text class="nonterminal" x="339" y="81">SQL</text></a><line x1="319" y1="77" x2="329" y2="77" class="line"></line><line x1="373" y1="77" x2="383" y2="77" class="line"></line><line x1="383" y1="77" x2="471" y2="77" class="line"></line><line x1="197" y1="33" x2="217" y2="33" class="line"></line><line x1="491" y1="33" x2="511" y2="33" class="line"></line><path d="M197 33 Q207 33 207 43" class="line"></path><path d="M501 43 Q501 33 511 33" class="line"></path><line x1="207" y1="43" x2="207" y2="111" class="line"></line><line x1="501" y1="111" x2="501" y2="43" class="line"></line><path d="M207 111 Q207 121 217 121" class="line"></path><path d="M491 121 Q501 121 501 111" class="line"></path><rect x="249" y="107" width="100" height="32" rx="10"></rect><rect x="247" y="105" width="100" height="32" class="terminal" rx="10"></rect><text class="terminal" x="257" y="125">whereExists</text><line x1="237" y1="121" x2="247" y2="121" class="line"></line><line x1="347" y1="121" x2="357" y2="121" class="line"></line><line x1="357" y1="121" x2="381" y2="121" class="line"></line><line x1="217" y1="121" x2="237" y2="121" class="line"></line><line x1="381" y1="121" x2="401" y2="121" class="line"></line><path d="M217 121 Q227 121 227 131" class="line"></path><path d="M391 131 Q391 121 401 121" class="line"></path><line x1="227" y1="131" x2="227" y2="155" class="line"></line><line x1="391" y1="155" x2="391" y2="131" class="line"></line><path d="M227 155 Q227 165 237 165" class="line"></path><path d="M381 165 Q391 165 391 155" class="line"></path><rect x="249" y="151" width="124" height="32" rx="10"></rect><rect x="247" y="149" width="124" height="32" class="terminal" rx="10"></rect><text class="terminal" x="257" y="169">whereNotExists</text><line x1="237" y1="165" x2="247" y2="165" class="line"></line><line x1="371" y1="165" x2="381" y2="165" class="line"></line><a xlink:href="#SELECT" xlink:title="SELECT"><rect x="413" y="107" width="66" height="32"></rect><rect x="411" y="105" width="66" height="32" class="nonterminal"></rect><text class="nonterminal" x="421" y="125">SELECT</text></a><line x1="401" y1="121" x2="411" y2="121" class="line"></line><line x1="477" y1="121" x2="487" y2="121" class="line"></line><line x1="487" y1="121" x2="491" y2="121" class="line"></line><a xlink:href="#MORE_CONDITIONS" xlink:title="MORE_CONDITIONS"><rect x="543" y="19" width="144" height="32"></rect><rect x="541" y="17" width="144" height="32" class="nonterminal"></rect><text class="nonterminal" x="551" y="37">MORE_CONDITIONS</text></a><line x1="531" y1="33" x2="541" y2="33" class="line"></line><line x1="685" y1="33" x2="695" y2="33" class="line"></line><line x1="511" y1="33" x2="531" y2="33" class="line"></line><line x1="695" y1="33" x2="715" y2="33" class="line"></line><path d="M511 33 Q521 33 521 43" class="line"></path><path d="M705 43 Q705 33 715 33" class="line"></path><line x1="521" y1="43" x2="521" y2="57" class="line"></line><line x1="705" y1="57" x2="705" y2="43" class="line"></line><path d="M521 57 Q521 67 531 67" class="line"></path><path d="M695 67 Q705 67 705 57" class="line"></path><line x1="531" y1="67" x2="541" y2="67" class="line"></line><line x1="541" y1="67" x2="695" y2="67" class="line"></line><line x1="177" y1="33" x2="197" y2="33" class="line"></line><line x1="715" y1="33" x2="735" y2="33" class="line"></line><path d="M177 33 Q187 33 187 43" class="line"></path><path d="M725 43 Q725 33 735 33" class="line"></path><line x1="187" y1="43" x2="187" y2="189" class="line"></line><line x1="725" y1="189" x2="725" y2="43" class="line"></line><path d="M187 189 Q187 199 197 199" class="line"></path><path d="M715 199 Q725 199 725 189" class="line"></path><line x1="197" y1="199" x2="207" y2="199" class="line"></line><line x1="207" y1="199" x2="715" y2="199" class="line"></line><line x1="738" y1="33" x2="735" y2="33" class="line"></line><polygon points="745 33 753 29 753 37" class="filled"></polygon><polygon points="745 33 737 29 737 37" class="filled"></polygon></svg><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml">referenced by:<xhtml:ul><xhtml:li><xhtml:a href="#QUERY" title="QUERY">QUERY</xhtml:a></xhtml:li></xhtml:ul></xhtml:p><xhtml:br xmlns:xhtml="http://www.w3.org/1999/xhtml"></xhtml:br><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml" style="font-size: 14px; font-weight:bold"><xhtml:a name="MERGE">MERGE:</xhtml:a></xhtml:p><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1038" height="390"><defs><style type="text/css">
    -    @namespace "http://www.w3.org/2000/svg";
    -    .line                 {fill: none; stroke: #332900;}
    -    filled                {fill: #332900; stroke: none;}
    -    text                  {font-family: Verdana, Sans-serif;
    -                            font-size: 12px;
    -                            fill: #4D3D00;
    -                          }
    -    text.terminal         {font-family: Verdana, Sans-serif;
    -                            font-size: 12px;
    -                            fill: #4D3D00;
    -                            font-weight: bold;
    -                          }
    -    rect, circle, polygon {fill: #332900; stroke: #332900;}
    -    rect.terminal         {fill: #FFCC00; stroke: #332900;}
    -    rect.nonterminal      {fill: #FFEB99; stroke: #332900;}
    -    rect.text             {fill: none; stroke: none;}    
    -    polygon.regexp        {fill: #FFF5CC; stroke: #332900;}
    -  </style></defs><polygon points="9 33 1 29 1 37" class="filled"></polygon><polygon points="17 33 9 29 9 37" class="filled"></polygon><line x1="17" y1="33" x2="19" y2="33" class="line"></line><rect x="31" y="19" width="88" height="32" rx="10"></rect><rect x="29" y="17" width="88" height="32" class="terminal" rx="10"></rect><text class="terminal" x="39" y="37">mergeInto</text><line x1="19" y1="33" x2="29" y2="33" class="line"></line><line x1="117" y1="33" x2="127" y2="33" class="line"></line><a xlink:href="#TABLE" xlink:title="TABLE"><rect x="139" y="19" width="58" height="32"></rect><rect x="137" y="17" width="58" height="32" class="nonterminal"></rect><text class="nonterminal" x="147" y="37">TABLE</text></a><line x1="127" y1="33" x2="137" y2="33" class="line"></line><line x1="195" y1="33" x2="205" y2="33" class="line"></line><rect x="237" y="19" width="54" height="32" rx="10"></rect><rect x="235" y="17" width="54" height="32" class="terminal" rx="10"></rect><text class="terminal" x="245" y="37">using</text><line x1="225" y1="33" x2="235" y2="33" class="line"></line><line x1="289" y1="33" x2="299" y2="33" class="line"></line><a xlink:href="#TABLE" xlink:title="TABLE"><rect x="311" y="19" width="58" height="32"></rect><rect x="309" y="17" width="58" height="32" class="nonterminal"></rect><text class="nonterminal" x="319" y="37">TABLE</text></a><line x1="299" y1="33" x2="309" y2="33" class="line"></line><line x1="367" y1="33" x2="377" y2="33" class="line"></line><line x1="205" y1="33" x2="225" y2="33" class="line"></line><line x1="377" y1="33" x2="397" y2="33" class="line"></line><path d="M205 33 Q215 33 215 43" class="line"></path><path d="M387 43 Q387 33 397 33" class="line"></path><line x1="215" y1="43" x2="215" y2="67" class="line"></line><line x1="387" y1="67" x2="387" y2="43" class="line"></line><path d="M215 67 Q215 77 225 77" class="line"></path><path d="M377 77 Q387 77 387 67" class="line"></path><rect x="237" y="63" width="84" height="32" rx="10"></rect><rect x="235" y="61" width="84" height="32" class="terminal" rx="10"></rect><text class="terminal" x="245" y="81">usingDual</text><line x1="225" y1="77" x2="235" y2="77" class="line"></line><line x1="319" y1="77" x2="329" y2="77" class="line"></line><line x1="329" y1="77" x2="377" y2="77" class="line"></line><rect x="409" y="19" width="36" height="32" rx="10"></rect><rect x="407" y="17" width="36" height="32" class="terminal" rx="10"></rect><text class="terminal" x="417" y="37">on</text><line x1="397" y1="33" x2="407" y2="33" class="line"></line><line x1="443" y1="33" x2="453" y2="33" class="line"></line><a xlink:href="#CONDITION" xlink:title="CONDITION"><rect x="505" y="19" width="92" height="32"></rect><rect x="503" y="17" width="92" height="32" class="nonterminal"></rect><text class="nonterminal" x="513" y="37">CONDITION</text></a><line x1="493" y1="33" x2="503" y2="33" class="line"></line><line x1="595" y1="33" x2="605" y2="33" class="line"></line><path d="M473 33 L493 33 M492 33 Q483 33 483 23 L483 11 Q483 1 493 1" class="line"></path><path d="M605 33 L625 33 M605 33 Q615 33 615 23 L615 11 Q615 1 605 1" class="line"></path><line x1="493" y1="1" x2="503" y2="1" class="line"></line><line x1="503" y1="1" x2="605" y2="1" class="line"></line><line x1="453" y1="33" x2="473" y2="33" class="line"></line><line x1="625" y1="33" x2="645" y2="33" class="line"></line><path d="M453 33 Q463 33 463 43" class="line"></path><path d="M635 43 Q635 33 645 33" class="line"></path><line x1="463" y1="43" x2="463" y2="67" class="line"></line><line x1="635" y1="67" x2="635" y2="43" class="line"></line><path d="M463 67 Q463 77 473 77" class="line"></path><path d="M625 77 Q635 77 635 67" class="line"></path><a xlink:href="#SQL" xlink:title="SQL"><rect x="485" y="63" width="44" height="32"></rect><rect x="483" y="61" width="44" height="32" class="nonterminal"></rect><text class="nonterminal" x="493" y="81">SQL</text></a><line x1="473" y1="77" x2="483" y2="77" class="line"></line><line x1="527" y1="77" x2="537" y2="77" class="line"></line><line x1="537" y1="77" x2="625" y2="77" class="line"></line><a xlink:href="#MORE_CONDITIONS" xlink:title="MORE_CONDITIONS"><rect x="677" y="19" width="144" height="32"></rect><rect x="675" y="17" width="144" height="32" class="nonterminal"></rect><text class="nonterminal" x="685" y="37">MORE_CONDITIONS</text></a><line x1="665" y1="33" x2="675" y2="33" class="line"></line><line x1="819" y1="33" x2="829" y2="33" class="line"></line><line x1="645" y1="33" x2="665" y2="33" class="line"></line><line x1="829" y1="33" x2="849" y2="33" class="line"></line><path d="M645 33 Q655 33 655 43" class="line"></path><path d="M839 43 Q839 33 849 33" class="line"></path><line x1="655" y1="43" x2="655" y2="57" class="line"></line><line x1="839" y1="57" x2="839" y2="43" class="line"></line><path d="M655 57 Q655 67 665 67" class="line"></path><path d="M829 67 Q839 67 839 57" class="line"></path><line x1="665" y1="67" x2="675" y2="67" class="line"></line><line x1="675" y1="67" x2="829" y2="67" class="line"></line><path class="line" d="M851 33 L853 33 M855 33 L857 33 M859 33 L861 33 M1 159 L3 159 M5 159 L7 159 M9 159 L11 159"></path><rect x="45" y="145" width="190" height="32" rx="10"></rect><rect x="43" y="143" width="190" height="32" class="terminal" rx="10"></rect><text class="terminal" x="53" y="163">whenMatchedThenUpdate</text><line x1="33" y1="159" x2="43" y2="159" class="line"></line><line x1="233" y1="159" x2="243" y2="159" class="line"></line><rect x="275" y="145" width="40" height="32" rx="10"></rect><rect x="273" y="143" width="40" height="32" class="terminal" rx="10"></rect><text class="terminal" x="283" y="163">set</text><line x1="263" y1="159" x2="273" y2="159" class="line"></line><line x1="313" y1="159" x2="323" y2="159" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="335" y="145" width="56" height="32"></rect><rect x="333" y="143" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="343" y="163">FIELD</text></a><line x1="323" y1="159" x2="333" y2="159" class="line"></line><line x1="389" y1="159" x2="399" y2="159" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="411" y="145" width="56" height="32"></rect><rect x="409" y="143" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="419" y="163">FIELD</text></a><line x1="399" y1="159" x2="409" y2="159" class="line"></line><line x1="465" y1="159" x2="475" y2="159" class="line"></line><path d="M243 159 L263 159 M262 159 Q253 159 253 149 L253 137 Q253 127 263 127" class="line"></path><path d="M475 159 L495 159 M475 159 Q485 159 485 149 L485 137 Q485 127 475 127" class="line"></path><line x1="263" y1="127" x2="273" y2="127" class="line"></line><line x1="273" y1="127" x2="475" y2="127" class="line"></line><rect x="527" y="145" width="62" height="32" rx="10"></rect><rect x="525" y="143" width="62" height="32" class="terminal" rx="10"></rect><text class="terminal" x="535" y="163">where</text><line x1="515" y1="159" x2="525" y2="159" class="line"></line><line x1="587" y1="159" x2="597" y2="159" class="line"></line><a xlink:href="#CONDITION" xlink:title="CONDITION"><rect x="609" y="145" width="92" height="32"></rect><rect x="607" y="143" width="92" height="32" class="nonterminal"></rect><text class="nonterminal" x="617" y="163">CONDITION</text></a><line x1="597" y1="159" x2="607" y2="159" class="line"></line><line x1="699" y1="159" x2="709" y2="159" class="line"></line><rect x="741" y="145" width="104" height="32" rx="10"></rect><rect x="739" y="143" width="104" height="32" class="terminal" rx="10"></rect><text class="terminal" x="749" y="163">deleteWhere</text><line x1="729" y1="159" x2="739" y2="159" class="line"></line><line x1="843" y1="159" x2="853" y2="159" class="line"></line><a xlink:href="#CONDITION" xlink:title="CONDITION"><rect x="865" y="145" width="92" height="32"></rect><rect x="863" y="143" width="92" height="32" class="nonterminal"></rect><text class="nonterminal" x="873" y="163">CONDITION</text></a><line x1="853" y1="159" x2="863" y2="159" class="line"></line><line x1="955" y1="159" x2="965" y2="159" class="line"></line><line x1="709" y1="159" x2="729" y2="159" class="line"></line><line x1="965" y1="159" x2="985" y2="159" class="line"></line><path d="M709 159 Q719 159 719 169" class="line"></path><path d="M975 169 Q975 159 985 159" class="line"></path><line x1="719" y1="169" x2="719" y2="183" class="line"></line><line x1="975" y1="183" x2="975" y2="169" class="line"></line><path d="M719 183 Q719 193 729 193" class="line"></path><path d="M965 193 Q975 193 975 183" class="line"></path><line x1="729" y1="193" x2="739" y2="193" class="line"></line><line x1="739" y1="193" x2="965" y2="193" class="line"></line><line x1="495" y1="159" x2="515" y2="159" class="line"></line><line x1="985" y1="159" x2="1005" y2="159" class="line"></line><path d="M495 159 Q505 159 505 169" class="line"></path><path d="M995 169 Q995 159 1005 159" class="line"></path><line x1="505" y1="169" x2="505" y2="199" class="line"></line><line x1="995" y1="199" x2="995" y2="169" class="line"></line><path d="M505 199 Q505 209 515 209" class="line"></path><path d="M985 209 Q995 209 995 199" class="line"></path><line x1="515" y1="209" x2="525" y2="209" class="line"></line><line x1="525" y1="209" x2="985" y2="209" class="line"></line><line x1="13" y1="159" x2="33" y2="159" class="line"></line><line x1="1005" y1="159" x2="1025" y2="159" class="line"></line><path d="M13 159 Q23 159 23 169" class="line"></path><path d="M1015 169 Q1015 159 1025 159" class="line"></path><line x1="23" y1="169" x2="23" y2="215" class="line"></line><line x1="1015" y1="215" x2="1015" y2="169" class="line"></line><path d="M23 215 Q23 225 33 225" class="line"></path><path d="M1005 225 Q1015 225 1015 215" class="line"></path><line x1="33" y1="225" x2="43" y2="225" class="line"></line><line x1="43" y1="225" x2="1005" y2="225" class="line"></line><path class="line" d="M1027 159 L1029 159 M1031 159 L1033 159 M1035 159 L1037 159 M153 289 L155 289 M157 289 L159 289 M161 289 L163 289"></path><rect x="197" y="275" width="206" height="32" rx="10"></rect><rect x="195" y="273" width="206" height="32" class="terminal" rx="10"></rect><text class="terminal" x="205" y="293">whenNotMatchedThenInsert</text><line x1="185" y1="289" x2="195" y2="289" class="line"></line><line x1="401" y1="289" x2="411" y2="289" class="line"></line><rect x="463" y="275" width="40" height="32" rx="10"></rect><rect x="461" y="273" width="40" height="32" class="terminal" rx="10"></rect><text class="terminal" x="471" y="293">set</text><line x1="451" y1="289" x2="461" y2="289" class="line"></line><line x1="501" y1="289" x2="511" y2="289" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="523" y="275" width="56" height="32"></rect><rect x="521" y="273" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="531" y="293">FIELD</text></a><line x1="511" y1="289" x2="521" y2="289" class="line"></line><line x1="577" y1="289" x2="587" y2="289" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="599" y="275" width="56" height="32"></rect><rect x="597" y="273" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="607" y="293">FIELD</text></a><line x1="587" y1="289" x2="597" y2="289" class="line"></line><line x1="653" y1="289" x2="663" y2="289" class="line"></line><path d="M431 289 L451 289 M450 289 Q441 289 441 279 L441 267 Q441 257 451 257" class="line"></path><path d="M663 289 L683 289 M663 289 Q673 289 673 279 L673 267 Q673 257 663 257" class="line"></path><line x1="451" y1="257" x2="461" y2="257" class="line"></line><line x1="461" y1="257" x2="663" y2="257" class="line"></line><line x1="683" y1="289" x2="745" y2="289" class="line"></line><line x1="411" y1="289" x2="431" y2="289" class="line"></line><line x1="745" y1="289" x2="765" y2="289" class="line"></line><path d="M411 289 Q421 289 421 299" class="line"></path><path d="M755 299 Q755 289 765 289" class="line"></path><line x1="421" y1="299" x2="421" y2="345" class="line"></line><line x1="755" y1="345" x2="755" y2="299" class="line"></line><path d="M421 345 Q421 355 431 355" class="line"></path><path d="M745 355 Q755 355 755 345" class="line"></path><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="463" y="341" width="56" height="32"></rect><rect x="461" y="339" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="471" y="359">FIELD</text></a><line x1="451" y1="355" x2="461" y2="355" class="line"></line><line x1="517" y1="355" x2="527" y2="355" class="line"></line><path d="M431 355 L451 355 M450 355 Q441 355 441 345 L441 333 Q441 323 451 323" class="line"></path><path d="M527 355 L547 355 M527 355 Q537 355 537 345 L537 333 Q537 323 527 323" class="line"></path><line x1="451" y1="323" x2="461" y2="323" class="line"></line><line x1="461" y1="323" x2="527" y2="323" class="line"></line><rect x="559" y="341" width="62" height="32" rx="10"></rect><rect x="557" y="339" width="62" height="32" class="terminal" rx="10"></rect><text class="terminal" x="567" y="359">values</text><line x1="547" y1="355" x2="557" y2="355" class="line"></line><line x1="619" y1="355" x2="629" y2="355" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="661" y="341" width="56" height="32"></rect><rect x="659" y="339" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="669" y="359">FIELD</text></a><line x1="649" y1="355" x2="659" y2="355" class="line"></line><line x1="715" y1="355" x2="725" y2="355" class="line"></line><path d="M629 355 L649 355 M648 355 Q639 355 639 345 L639 333 Q639 323 649 323" class="line"></path><path d="M725 355 L745 355 M725 355 Q735 355 735 345 L735 333 Q735 323 725 323" class="line"></path><line x1="649" y1="323" x2="659" y2="323" class="line"></line><line x1="659" y1="323" x2="725" y2="323" class="line"></line><rect x="797" y="275" width="62" height="32" rx="10"></rect><rect x="795" y="273" width="62" height="32" class="terminal" rx="10"></rect><text class="terminal" x="805" y="293">where</text><line x1="785" y1="289" x2="795" y2="289" class="line"></line><line x1="857" y1="289" x2="867" y2="289" class="line"></line><a xlink:href="#CONDITION" xlink:title="CONDITION"><rect x="879" y="275" width="92" height="32"></rect><rect x="877" y="273" width="92" height="32" class="nonterminal"></rect><text class="nonterminal" x="887" y="293">CONDITION</text></a><line x1="867" y1="289" x2="877" y2="289" class="line"></line><line x1="969" y1="289" x2="979" y2="289" class="line"></line><line x1="765" y1="289" x2="785" y2="289" class="line"></line><line x1="979" y1="289" x2="999" y2="289" class="line"></line><path d="M765 289 Q775 289 775 299" class="line"></path><path d="M989 299 Q989 289 999 289" class="line"></path><line x1="775" y1="299" x2="775" y2="313" class="line"></line><line x1="989" y1="313" x2="989" y2="299" class="line"></line><path d="M775 313 Q775 323 785 323" class="line"></path><path d="M979 323 Q989 323 989 313" class="line"></path><line x1="785" y1="323" x2="795" y2="323" class="line"></line><line x1="795" y1="323" x2="979" y2="323" class="line"></line><line x1="165" y1="289" x2="185" y2="289" class="line"></line><line x1="999" y1="289" x2="1019" y2="289" class="line"></line><path d="M165 289 Q175 289 175 299" class="line"></path><path d="M1009 299 Q1009 289 1019 289" class="line"></path><line x1="175" y1="299" x2="175" y2="379" class="line"></line><line x1="1009" y1="379" x2="1009" y2="299" class="line"></line><path d="M175 379 Q175 389 185 389" class="line"></path><path d="M999 389 Q1009 389 1009 379" class="line"></path><line x1="185" y1="389" x2="195" y2="389" class="line"></line><line x1="195" y1="389" x2="999" y2="389" class="line"></line><line x1="1022" y1="289" x2="1019" y2="289" class="line"></line><polygon points="1029 289 1037 285 1037 293" class="filled"></polygon><polygon points="1029 289 1021 285 1021 293" class="filled"></polygon></svg><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml">referenced by:<xhtml:ul><xhtml:li><xhtml:a href="#QUERY" title="QUERY">QUERY</xhtml:a></xhtml:li></xhtml:ul></xhtml:p><xhtml:br xmlns:xhtml="http://www.w3.org/1999/xhtml"></xhtml:br><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml" style="font-size: 14px; font-weight:bold"><xhtml:a name="TRUNCATE">TRUNCATE:</xhtml:a></xhtml:p><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="210" height="36"><defs><style type="text/css">
    -
    -    @namespace "http://www.w3.org/2000/svg";
    -    .line                 {fill: none; stroke: #332900;}
    -    filled                {fill: #332900; stroke: none;}
    -    text                  {font-family: Verdana, Sans-serif;
    -                            font-size: 12px;
    -                            fill: #4D3D00;
    -                          }
    -    text.terminal         {font-family: Verdana, Sans-serif;
    -                            font-size: 12px;
    -                            fill: #4D3D00;
    -                            font-weight: bold;
    -                          }
    -    rect, circle, polygon {fill: #332900; stroke: #332900;}
    -    rect.terminal         {fill: #FFCC00; stroke: #332900;}
    -    rect.nonterminal      {fill: #FFEB99; stroke: #332900;}
    -    rect.text             {fill: none; stroke: none;}    
    -    polygon.regexp        {fill: #FFF5CC; stroke: #332900;}
    -  </style></defs><polygon points="9 17 1 13 1 21" class="filled"></polygon><polygon points="17 17 9 13 9 21" class="filled"></polygon><line x1="17" y1="17" x2="19" y2="17" class="line"></line><rect x="31" y="3" width="74" height="32" rx="10"></rect><rect x="29" y="1" width="74" height="32" class="terminal" rx="10"></rect><text class="terminal" x="39" y="21">truncate</text><line x1="19" y1="17" x2="29" y2="17" class="line"></line><line x1="103" y1="17" x2="113" y2="17" class="line"></line><a xlink:href="#TABLE" xlink:title="TABLE"><rect x="125" y="3" width="58" height="32"></rect><rect x="123" y="1" width="58" height="32" class="nonterminal"></rect><text class="nonterminal" x="133" y="21">TABLE</text></a><line x1="113" y1="17" x2="123" y2="17" class="line"></line><line x1="181" y1="17" x2="191" y2="17" class="line"></line><line x1="194" y1="17" x2="191" y2="17" class="line"></line><polygon points="201 17 209 13 209 21" class="filled"></polygon><polygon points="201 17 193 13 193 21" class="filled"></polygon></svg><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml">referenced by:<xhtml:ul><xhtml:li><xhtml:a href="#QUERY" title="QUERY">QUERY</xhtml:a></xhtml:li></xhtml:ul></xhtml:p><xhtml:br xmlns:xhtml="http://www.w3.org/1999/xhtml"></xhtml:br><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml" style="font-size: 14px; font-weight:bold"><xhtml:a name="SQL">SQL:</xhtml:a></xhtml:p><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="324" height="68"><defs><style type="text/css">
    -    @namespace "http://www.w3.org/2000/svg";
    -    .line                 {fill: none; stroke: #332900;}
    -    filled                {fill: #332900; stroke: none;}
    -    text                  {font-family: Verdana, Sans-serif;
    -                            font-size: 12px;
    -                            fill: #4D3D00;
    -                          }
    -    text.terminal         {font-family: Verdana, Sans-serif;
    -                            font-size: 12px;
    -                            fill: #4D3D00;
    -                            font-weight: bold;
    -                          }
    -    rect, circle, polygon {fill: #332900; stroke: #332900;}
    -    rect.terminal         {fill: #FFCC00; stroke: #332900;}
    -    rect.nonterminal      {fill: #FFEB99; stroke: #332900;}
    -    rect.text             {fill: none; stroke: none;}    
    -    polygon.regexp        {fill: #FFF5CC; stroke: #332900;}
    -  </style></defs><polygon points="9 33 1 29 1 37" class="filled"></polygon><polygon points="17 33 9 29 9 37" class="filled"></polygon><line x1="17" y1="33" x2="19" y2="33" class="line"></line><rect x="31" y="19" width="92" height="32" rx="10"></rect><rect x="29" y="17" width="92" height="32" class="terminal" rx="10"></rect><text class="terminal" x="39" y="37">SQL String</text><line x1="19" y1="33" x2="29" y2="33" class="line"></line><line x1="121" y1="33" x2="131" y2="33" class="line"></line><a xlink:href="#BINDING" xlink:title="BINDING"><rect x="183" y="19" width="74" height="32"></rect><rect x="181" y="17" width="74" height="32" class="nonterminal"></rect><text class="nonterminal" x="191" y="37">BINDING</text></a><line x1="171" y1="33" x2="181" y2="33" class="line"></line><line x1="255" y1="33" x2="265" y2="33" class="line"></line><path d="M151 33 L171 33 M170 33 Q161 33 161 23 L161 11 Q161 1 171 1" class="line"></path><path d="M265 33 L285 33 M265 33 Q275 33 275 23 L275 11 Q275 1 265 1" class="line"></path><line x1="171" y1="1" x2="181" y2="1" class="line"></line><line x1="181" y1="1" x2="265" y2="1" class="line"></line><line x1="131" y1="33" x2="151" y2="33" class="line"></line><line x1="285" y1="33" x2="305" y2="33" class="line"></line><path d="M131 33 Q141 33 141 43" class="line"></path><path d="M295 43 Q295 33 305 33" class="line"></path><line x1="141" y1="43" x2="141" y2="57" class="line"></line><line x1="295" y1="57" x2="295" y2="43" class="line"></line><path d="M141 57 Q141 67 151 67" class="line"></path><path d="M285 67 Q295 67 295 57" class="line"></path><line x1="151" y1="67" x2="161" y2="67" class="line"></line><line x1="161" y1="67" x2="285" y2="67" class="line"></line><line x1="308" y1="33" x2="305" y2="33" class="line"></line><polygon points="315 33 323 29 323 37" class="filled"></polygon><polygon points="315 33 307 29 307 37" class="filled"></polygon></svg><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml">referenced by:<xhtml:ul><xhtml:li><xhtml:a href="#CONDITION" title="CONDITION">CONDITION</xhtml:a></xhtml:li><xhtml:li><xhtml:a href="#DELETE" title="DELETE">DELETE</xhtml:a></xhtml:li><xhtml:li><xhtml:a href="#FIELD" title="FIELD">FIELD</xhtml:a></xhtml:li><xhtml:li><xhtml:a href="#MERGE" title="MERGE">MERGE</xhtml:a></xhtml:li><xhtml:li><xhtml:a href="#MORE_CONDITIONS" title="MORE_CONDITIONS">MORE_CONDITIONS</xhtml:a></xhtml:li><xhtml:li><xhtml:a href="#QUERY" title="QUERY">QUERY</xhtml:a></xhtml:li><xhtml:li><xhtml:a href="#RESULT" title="RESULT">RESULT</xhtml:a></xhtml:li><xhtml:li><xhtml:a href="#RESULT_QUERY" title="RESULT_QUERY">RESULT_QUERY</xhtml:a></xhtml:li><xhtml:li><xhtml:a href="#SELECT" title="SELECT">SELECT</xhtml:a></xhtml:li><xhtml:li><xhtml:a href="#TABLE" title="TABLE">TABLE</xhtml:a></xhtml:li><xhtml:li><xhtml:a href="#UPDATE" title="UPDATE">UPDATE</xhtml:a></xhtml:li></xhtml:ul></xhtml:p><xhtml:br xmlns:xhtml="http://www.w3.org/1999/xhtml"></xhtml:br><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml" style="font-size: 14px; font-weight:bold"><xhtml:a name="BINDING">BINDING:</xhtml:a></xhtml:p><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="186" height="36"><defs><style type="text/css">
    -
    -    @namespace "http://www.w3.org/2000/svg";
    -    .line                 {fill: none; stroke: #332900;}
    -    filled                {fill: #332900; stroke: none;}
    -    text                  {font-family: Verdana, Sans-serif;
    -                            font-size: 12px;
    -                            fill: #4D3D00;
    -                          }
    -    text.terminal         {font-family: Verdana, Sans-serif;
    -                            font-size: 12px;
    -                            fill: #4D3D00;
    -                            font-weight: bold;
    -                          }
    -    rect, circle, polygon {fill: #332900; stroke: #332900;}
    -    rect.terminal         {fill: #FFCC00; stroke: #332900;}
    -    rect.nonterminal      {fill: #FFEB99; stroke: #332900;}
    -    rect.text             {fill: none; stroke: none;}    
    -    polygon.regexp        {fill: #FFF5CC; stroke: #332900;}
    -  </style></defs><polygon points="9 17 1 13 1 21" class="filled"></polygon><polygon points="17 17 9 13 9 21" class="filled"></polygon><line x1="17" y1="17" x2="19" y2="17" class="line"></line><rect x="31" y="3" width="128" height="32" rx="10"></rect><rect x="29" y="1" width="128" height="32" class="terminal" rx="10"></rect><text class="terminal" x="39" y="21">Any Java Object</text><line x1="19" y1="17" x2="29" y2="17" class="line"></line><line x1="157" y1="17" x2="167" y2="17" class="line"></line><line x1="170" y1="17" x2="167" y2="17" class="line"></line><polygon points="177 17 185 13 185 21" class="filled"></polygon><polygon points="177 17 169 13 169 21" class="filled"></polygon></svg><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml">referenced by:<xhtml:ul><xhtml:li><xhtml:a href="#FIELD" title="FIELD">FIELD</xhtml:a></xhtml:li><xhtml:li><xhtml:a href="#SORT_FIELD" title="SORT_FIELD">SORT_FIELD</xhtml:a></xhtml:li><xhtml:li><xhtml:a href="#SQL" title="SQL">SQL</xhtml:a></xhtml:li><xhtml:li><xhtml:a href="#TABLE" title="TABLE">TABLE</xhtml:a></xhtml:li></xhtml:ul></xhtml:p><xhtml:br xmlns:xhtml="http://www.w3.org/1999/xhtml"></xhtml:br><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml" style="font-size: 14px; font-weight:bold"><xhtml:a name="BINDING_MAP">BINDING_MAP:</xhtml:a></xhtml:p><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="214" height="36"><defs><style type="text/css">
    -    @namespace "http://www.w3.org/2000/svg";
    -    .line                 {fill: none; stroke: #332900;}
    -    filled                {fill: #332900; stroke: none;}
    -    text                  {font-family: Verdana, Sans-serif;
    -                            font-size: 12px;
    -                            fill: #4D3D00;
    -                          }
    -    text.terminal         {font-family: Verdana, Sans-serif;
    -                            font-size: 12px;
    -                            fill: #4D3D00;
    -                            font-weight: bold;
    -                          }
    -    rect, circle, polygon {fill: #332900; stroke: #332900;}
    -    rect.terminal         {fill: #FFCC00; stroke: #332900;}
    -    rect.nonterminal      {fill: #FFEB99; stroke: #332900;}
    -    rect.text             {fill: none; stroke: none;}    
    -    polygon.regexp        {fill: #FFF5CC; stroke: #332900;}
    -  </style></defs><polygon points="9 17 1 13 1 21" class="filled"></polygon><polygon points="17 17 9 13 9 21" class="filled"></polygon><line x1="17" y1="17" x2="19" y2="17" class="line"></line><rect x="31" y="3" width="156" height="32" rx="10"></rect><rect x="29" y="1" width="156" height="32" class="terminal" rx="10"></rect><text class="terminal" x="39" y="21">A map of bind values</text><line x1="19" y1="17" x2="29" y2="17" class="line"></line><line x1="185" y1="17" x2="195" y2="17" class="line"></line><line x1="198" y1="17" x2="195" y2="17" class="line"></line><polygon points="205 17 213 13 213 21" class="filled"></polygon><polygon points="205 17 197 13 197 21" class="filled"></polygon></svg><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml">referenced by:<xhtml:ul><xhtml:li><xhtml:a href="#SORT_FIELD" title="SORT_FIELD">SORT_FIELD</xhtml:a></xhtml:li></xhtml:ul></xhtml:p><xhtml:br xmlns:xhtml="http://www.w3.org/1999/xhtml"></xhtml:br><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml" style="font-size: 14px; font-weight:bold"><xhtml:a name="FIELD">FIELD:</xhtml:a></xhtml:p><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="886" height="4248"><defs><style type="text/css">
    -
    -    @namespace "http://www.w3.org/2000/svg";
    -    .line                 {fill: none; stroke: #332900;}
    -    filled                {fill: #332900; stroke: none;}
    -    text                  {font-family: Verdana, Sans-serif;
    -                            font-size: 12px;
    -                            fill: #4D3D00;
    -                          }
    -    text.terminal         {font-family: Verdana, Sans-serif;
    -                            font-size: 12px;
    -                            fill: #4D3D00;
    -                            font-weight: bold;
    -                          }
    -    rect, circle, polygon {fill: #332900; stroke: #332900;}
    -    rect.terminal         {fill: #FFCC00; stroke: #332900;}
    -    rect.nonterminal      {fill: #FFEB99; stroke: #332900;}
    -    rect.text             {fill: none; stroke: none;}    
    -    polygon.regexp        {fill: #FFF5CC; stroke: #332900;}
    -  </style></defs><polygon points="9 17 1 13 1 21" class="filled"></polygon><polygon points="17 17 9 13 9 21" class="filled"></polygon><line x1="17" y1="17" x2="19" y2="17" class="line"></line><rect x="51" y="3" width="164" height="32" rx="10"></rect><rect x="49" y="1" width="164" height="32" class="terminal" rx="10"></rect><text class="terminal" x="59" y="21">jOOQ generated Field</text><line x1="39" y1="17" x2="49" y2="17" class="line"></line><line x1="213" y1="17" x2="223" y2="17" class="line"></line><line x1="223" y1="17" x2="847" y2="17" class="line"></line><line x1="19" y1="17" x2="39" y2="17" class="line"></line><line x1="847" y1="17" x2="867" y2="17" class="line"></line><path d="M19 17 Q29 17 29 27" class="line"></path><path d="M857 27 Q857 17 867 17" class="line"></path><line x1="29" y1="27" x2="29" y2="51" class="line"></line><line x1="857" y1="51" x2="857" y2="27" class="line"></line><path d="M29 51 Q29 61 39 61" class="line"></path><path d="M847 61 Q857 61 857 51" class="line"></path><rect x="51" y="47" width="100" height="32" rx="10"></rect><rect x="49" y="45" width="100" height="32" class="terminal" rx="10"></rect><text class="terminal" x="59" y="65">CustomField</text><line x1="39" y1="61" x2="49" y2="61" class="line"></line><line x1="149" y1="61" x2="159" y2="61" class="line"></line><line x1="159" y1="61" x2="847" y2="61" class="line"></line><line x1="29" y1="51" x2="29" y2="71" class="line"></line><line x1="857" y1="71" x2="857" y2="51" class="line"></line><line x1="29" y1="71" x2="29" y2="95" class="line"></line><line x1="857" y1="95" x2="857" y2="71" class="line"></line><path d="M29 95 Q29 105 39 105" class="line"></path><path d="M847 105 Q857 105 857 95" class="line"></path><rect x="71" y="91" width="40" height="32" rx="10"></rect><rect x="69" y="89" width="40" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="109">val</text><line x1="59" y1="105" x2="69" y2="105" class="line"></line><line x1="109" y1="105" x2="119" y2="105" class="line"></line><line x1="119" y1="105" x2="135" y2="105" class="line"></line><line x1="39" y1="105" x2="59" y2="105" class="line"></line><line x1="135" y1="105" x2="155" y2="105" class="line"></line><path d="M39 105 Q49 105 49 115" class="line"></path><path d="M145 115 Q145 105 155 105" class="line"></path><line x1="49" y1="115" x2="49" y2="139" class="line"></line><line x1="145" y1="139" x2="145" y2="115" class="line"></line><path d="M49 139 Q49 149 59 149" class="line"></path><path d="M135 149 Q145 149 145 139" class="line"></path><rect x="71" y="135" width="56" height="32" rx="10"></rect><rect x="69" y="133" width="56" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="153">value</text><line x1="59" y1="149" x2="69" y2="149" class="line"></line><line x1="125" y1="149" x2="135" y2="149" class="line"></line><a xlink:href="#BINDING" xlink:title="BINDING"><rect x="167" y="91" width="74" height="32"></rect><rect x="165" y="89" width="74" height="32" class="nonterminal"></rect><text class="nonterminal" x="175" y="109">BINDING</text></a><line x1="155" y1="105" x2="165" y2="105" class="line"></line><line x1="239" y1="105" x2="249" y2="105" class="line"></line><line x1="249" y1="105" x2="847" y2="105" class="line"></line><line x1="29" y1="95" x2="29" y2="115" class="line"></line><line x1="857" y1="115" x2="857" y2="95" class="line"></line><line x1="29" y1="115" x2="29" y2="183" class="line"></line><line x1="857" y1="183" x2="857" y2="115" class="line"></line><path d="M29 183 Q29 193 39 193" class="line"></path><path d="M847 193 Q857 193 857 183" class="line"></path><rect x="51" y="179" width="62" height="32" rx="10"></rect><rect x="49" y="177" width="62" height="32" class="terminal" rx="10"></rect><text class="terminal" x="59" y="197">param</text><line x1="39" y1="193" x2="49" y2="193" class="line"></line><line x1="111" y1="193" x2="121" y2="193" class="line"></line><a xlink:href="#NAME" xlink:title="NAME"><rect x="133" y="179" width="54" height="32"></rect><rect x="131" y="177" width="54" height="32" class="nonterminal"></rect><text class="nonterminal" x="141" y="197">NAME</text></a><line x1="121" y1="193" x2="131" y2="193" class="line"></line><line x1="185" y1="193" x2="195" y2="193" class="line"></line><a xlink:href="#BINDING" xlink:title="BINDING"><rect x="227" y="179" width="74" height="32"></rect><rect x="225" y="177" width="74" height="32" class="nonterminal"></rect><text class="nonterminal" x="235" y="197">BINDING</text></a><line x1="215" y1="193" x2="225" y2="193" class="line"></line><line x1="299" y1="193" x2="309" y2="193" class="line"></line><line x1="195" y1="193" x2="215" y2="193" class="line"></line><line x1="309" y1="193" x2="329" y2="193" class="line"></line><path d="M195 193 Q205 193 205 203" class="line"></path><path d="M319 203 Q319 193 329 193" class="line"></path><line x1="205" y1="203" x2="205" y2="217" class="line"></line><line x1="319" y1="217" x2="319" y2="203" class="line"></line><path d="M205 217 Q205 227 215 227" class="line"></path><path d="M309 227 Q319 227 319 217" class="line"></path><line x1="215" y1="227" x2="225" y2="227" class="line"></line><line x1="225" y1="227" x2="309" y2="227" class="line"></line><line x1="329" y1="193" x2="847" y2="193" class="line"></line><line x1="29" y1="183" x2="29" y2="203" class="line"></line><line x1="857" y1="203" x2="857" y2="183" class="line"></line><line x1="29" y1="203" x2="29" y2="249" class="line"></line><line x1="857" y1="249" x2="857" y2="203" class="line"></line><path d="M29 249 Q29 259 39 259" class="line"></path><path d="M847 259 Q857 259 857 249" class="line"></path><rect x="51" y="245" width="58" height="32" rx="10"></rect><rect x="49" y="243" width="58" height="32" class="terminal" rx="10"></rect><text class="terminal" x="59" y="263">literal</text><line x1="39" y1="259" x2="49" y2="259" class="line"></line><line x1="107" y1="259" x2="117" y2="259" class="line"></line><a xlink:href="#BINDING" xlink:title="BINDING"><rect x="129" y="245" width="74" height="32"></rect><rect x="127" y="243" width="74" height="32" class="nonterminal"></rect><text class="nonterminal" x="137" y="263">BINDING</text></a><line x1="117" y1="259" x2="127" y2="259" class="line"></line><line x1="201" y1="259" x2="211" y2="259" class="line"></line><line x1="211" y1="259" x2="847" y2="259" class="line"></line><line x1="29" y1="249" x2="29" y2="269" class="line"></line><line x1="857" y1="269" x2="857" y2="249" class="line"></line><line x1="29" y1="269" x2="29" y2="293" class="line"></line><line x1="857" y1="293" x2="857" y2="269" class="line"></line><path d="M29 293 Q29 303 39 303" class="line"></path><path d="M847 303 Q857 303 857 293" class="line"></path><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="51" y="289" width="56" height="32"></rect><rect x="49" y="287" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="59" y="307">FIELD</text></a><line x1="39" y1="303" x2="49" y2="303" class="line"></line><line x1="105" y1="303" x2="115" y2="303" class="line"></line><rect x="127" y="289" width="34" height="32" rx="10"></rect><rect x="125" y="287" width="34" height="32" class="terminal" rx="10"></rect><text class="terminal" x="135" y="307">as</text><line x1="115" y1="303" x2="125" y2="303" class="line"></line><line x1="159" y1="303" x2="169" y2="303" class="line"></line><a xlink:href="#NAME" xlink:title="NAME"><rect x="181" y="289" width="54" height="32"></rect><rect x="179" y="287" width="54" height="32" class="nonterminal"></rect><text class="nonterminal" x="189" y="307">NAME</text></a><line x1="169" y1="303" x2="179" y2="303" class="line"></line><line x1="233" y1="303" x2="243" y2="303" class="line"></line><line x1="243" y1="303" x2="847" y2="303" class="line"></line><line x1="29" y1="293" x2="29" y2="313" class="line"></line><line x1="857" y1="313" x2="857" y2="293" class="line"></line><line x1="29" y1="313" x2="29" y2="337" class="line"></line><line x1="857" y1="337" x2="857" y2="313" class="line"></line><path d="M29 337 Q29 347 39 347" class="line"></path><path d="M847 347 Q857 347 857 337" class="line"></path><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="51" y="333" width="56" height="32"></rect><rect x="49" y="331" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="59" y="351">FIELD</text></a><line x1="39" y1="347" x2="49" y2="347" class="line"></line><line x1="105" y1="347" x2="115" y2="347" class="line"></line><rect x="127" y="333" width="46" height="32" rx="10"></rect><rect x="125" y="331" width="46" height="32" class="terminal" rx="10"></rect><text class="terminal" x="135" y="351">cast</text><line x1="115" y1="347" x2="125" y2="347" class="line"></line><line x1="171" y1="347" x2="181" y2="347" class="line"></line><a xlink:href="#TYPE" xlink:title="TYPE"><rect x="193" y="333" width="50" height="32"></rect><rect x="191" y="331" width="50" height="32" class="nonterminal"></rect><text class="nonterminal" x="201" y="351">TYPE</text></a><line x1="181" y1="347" x2="191" y2="347" class="line"></line><line x1="241" y1="347" x2="251" y2="347" class="line"></line><line x1="251" y1="347" x2="847" y2="347" class="line"></line><line x1="29" y1="337" x2="29" y2="357" class="line"></line><line x1="857" y1="357" x2="857" y2="337" class="line"></line><line x1="29" y1="357" x2="29" y2="381" class="line"></line><line x1="857" y1="381" x2="857" y2="357" class="line"></line><path d="M29 381 Q29 391 39 391" class="line"></path><path d="M847 391 Q857 391 857 381" class="line"></path><rect x="51" y="377" width="48" height="32" rx="10"></rect><rect x="49" y="375" width="48" height="32" class="terminal" rx="10"></rect><text class="terminal" x="59" y="395">zero</text><line x1="39" y1="391" x2="49" y2="391" class="line"></line><line x1="97" y1="391" x2="107" y2="391" class="line"></line><line x1="107" y1="391" x2="847" y2="391" class="line"></line><line x1="29" y1="381" x2="29" y2="401" class="line"></line><line x1="857" y1="401" x2="857" y2="381" class="line"></line><line x1="29" y1="401" x2="29" y2="425" class="line"></line><line x1="857" y1="425" x2="857" y2="401" class="line"></line><path d="M29 425 Q29 435 39 435" class="line"></path><path d="M847 435 Q857 435 857 425" class="line"></path><rect x="51" y="421" width="44" height="32" rx="10"></rect><rect x="49" y="419" width="44" height="32" class="terminal" rx="10"></rect><text class="terminal" x="59" y="439">one</text><line x1="39" y1="435" x2="49" y2="435" class="line"></line><line x1="93" y1="435" x2="103" y2="435" class="line"></line><line x1="103" y1="435" x2="847" y2="435" class="line"></line><line x1="29" y1="425" x2="29" y2="445" class="line"></line><line x1="857" y1="445" x2="857" y2="425" class="line"></line><line x1="29" y1="445" x2="29" y2="469" class="line"></line><line x1="857" y1="469" x2="857" y2="445" class="line"></line><path d="M29 469 Q29 479 39 479" class="line"></path><path d="M847 479 Q857 479 857 469" class="line"></path><rect x="51" y="465" width="44" height="32" rx="10"></rect><rect x="49" y="463" width="44" height="32" class="terminal" rx="10"></rect><text class="terminal" x="59" y="483">two</text><line x1="39" y1="479" x2="49" y2="479" class="line"></line><line x1="93" y1="479" x2="103" y2="479" class="line"></line><line x1="103" y1="479" x2="847" y2="479" class="line"></line><line x1="29" y1="469" x2="29" y2="489" class="line"></line><line x1="857" y1="489" x2="857" y2="469" class="line"></line><line x1="29" y1="489" x2="29" y2="513" class="line"></line><line x1="857" y1="513" x2="857" y2="489" class="line"></line><path d="M29 513 Q29 523 39 523" class="line"></path><path d="M847 523 Q857 523 857 513" class="line"></path><rect x="51" y="509" width="32" height="32" rx="10"></rect><rect x="49" y="507" width="32" height="32" class="terminal" rx="10"></rect><text class="terminal" x="59" y="527">pi</text><line x1="39" y1="523" x2="49" y2="523" class="line"></line><line x1="81" y1="523" x2="91" y2="523" class="line"></line><line x1="91" y1="523" x2="847" y2="523" class="line"></line><line x1="29" y1="513" x2="29" y2="533" class="line"></line><line x1="857" y1="533" x2="857" y2="513" class="line"></line><line x1="29" y1="533" x2="29" y2="557" class="line"></line><line x1="857" y1="557" x2="857" y2="533" class="line"></line><path d="M29 557 Q29 567 39 567" class="line"></path><path d="M847 567 Q857 567 857 557" class="line"></path><rect x="51" y="553" width="28" height="32" rx="10"></rect><rect x="49" y="551" width="28" height="32" class="terminal" rx="10"></rect><text class="terminal" x="59" y="571">e</text><line x1="39" y1="567" x2="49" y2="567" class="line"></line><line x1="77" y1="567" x2="87" y2="567" class="line"></line><line x1="87" y1="567" x2="847" y2="567" class="line"></line><line x1="29" y1="557" x2="29" y2="577" class="line"></line><line x1="857" y1="577" x2="857" y2="557" class="line"></line><line x1="29" y1="577" x2="29" y2="601" class="line"></line><line x1="857" y1="601" x2="857" y2="577" class="line"></line><path d="M29 601 Q29 611 39 611" class="line"></path><path d="M847 611 Q857 611 857 601" class="line"></path><rect x="51" y="597" width="98" height="32" rx="10"></rect><rect x="49" y="595" width="98" height="32" class="terminal" rx="10"></rect><text class="terminal" x="59" y="615">currentDate</text><line x1="39" y1="611" x2="49" y2="611" class="line"></line><line x1="147" y1="611" x2="157" y2="611" class="line"></line><line x1="157" y1="611" x2="847" y2="611" class="line"></line><line x1="29" y1="601" x2="29" y2="621" class="line"></line><line x1="857" y1="621" x2="857" y2="601" class="line"></line><line x1="29" y1="621" x2="29" y2="645" class="line"></line><line x1="857" y1="645" x2="857" y2="621" class="line"></line><path d="M29 645 Q29 655 39 655" class="line"></path><path d="M847 655 Q857 655 857 645" class="line"></path><rect x="51" y="641" width="100" height="32" rx="10"></rect><rect x="49" y="639" width="100" height="32" class="terminal" rx="10"></rect><text class="terminal" x="59" y="659">currentTime</text><line x1="39" y1="655" x2="49" y2="655" class="line"></line><line x1="149" y1="655" x2="159" y2="655" class="line"></line><line x1="159" y1="655" x2="847" y2="655" class="line"></line><line x1="29" y1="645" x2="29" y2="665" class="line"></line><line x1="857" y1="665" x2="857" y2="645" class="line"></line><line x1="29" y1="665" x2="29" y2="689" class="line"></line><line x1="857" y1="689" x2="857" y2="665" class="line"></line><path d="M29 689 Q29 699 39 699" class="line"></path><path d="M847 699 Q857 699 857 689" class="line"></path><rect x="51" y="685" width="140" height="32" rx="10"></rect><rect x="49" y="683" width="140" height="32" class="terminal" rx="10"></rect><text class="terminal" x="59" y="703">currentTimestamp</text><line x1="39" y1="699" x2="49" y2="699" class="line"></line><line x1="189" y1="699" x2="199" y2="699" class="line"></line><line x1="199" y1="699" x2="847" y2="699" class="line"></line><line x1="29" y1="689" x2="29" y2="709" class="line"></line><line x1="857" y1="709" x2="857" y2="689" class="line"></line><line x1="29" y1="709" x2="29" y2="733" class="line"></line><line x1="857" y1="733" x2="857" y2="709" class="line"></line><path d="M29 733 Q29 743 39 743" class="line"></path><path d="M847 743 Q857 743 857 733" class="line"></path><rect x="51" y="729" width="98" height="32" rx="10"></rect><rect x="49" y="727" width="98" height="32" class="terminal" rx="10"></rect><text class="terminal" x="59" y="747">currentUser</text><line x1="39" y1="743" x2="49" y2="743" class="line"></line><line x1="147" y1="743" x2="157" y2="743" class="line"></line><line x1="157" y1="743" x2="847" y2="743" class="line"></line><line x1="29" y1="733" x2="29" y2="753" class="line"></line><line x1="857" y1="753" x2="857" y2="733" class="line"></line><line x1="29" y1="753" x2="29" y2="777" class="line"></line><line x1="857" y1="777" x2="857" y2="753" class="line"></line><path d="M29 777 Q29 787 39 787" class="line"></path><path d="M847 787 Q857 787 857 777" class="line"></path><rect x="51" y="773" width="50" height="32" rx="10"></rect><rect x="49" y="771" width="50" height="32" class="terminal" rx="10"></rect><text class="terminal" x="59" y="791">rand</text><line x1="39" y1="787" x2="49" y2="787" class="line"></line><line x1="99" y1="787" x2="109" y2="787" class="line"></line><line x1="109" y1="787" x2="847" y2="787" class="line"></line><line x1="29" y1="777" x2="29" y2="797" class="line"></line><line x1="857" y1="797" x2="857" y2="777" class="line"></line><line x1="29" y1="797" x2="29" y2="821" class="line"></line><line x1="857" y1="821" x2="857" y2="797" class="line"></line><path d="M29 821 Q29 831 39 831" class="line"></path><path d="M847 831 Q857 831 857 821" class="line"></path><rect x="51" y="817" width="48" height="32" rx="10"></rect><rect x="49" y="815" width="48" height="32" class="terminal" rx="10"></rect><text class="terminal" x="59" y="835">field</text><line x1="39" y1="831" x2="49" y2="831" class="line"></line><line x1="97" y1="831" x2="107" y2="831" class="line"></line><a xlink:href="#SQL" xlink:title="SQL"><rect x="119" y="817" width="44" height="32"></rect><rect x="117" y="815" width="44" height="32" class="nonterminal"></rect><text class="nonterminal" x="127" y="835">SQL</text></a><line x1="107" y1="831" x2="117" y2="831" class="line"></line><line x1="161" y1="831" x2="171" y2="831" class="line"></line><line x1="171" y1="831" x2="847" y2="831" class="line"></line><line x1="29" y1="821" x2="29" y2="841" class="line"></line><line x1="857" y1="841" x2="857" y2="821" class="line"></line><line x1="29" y1="841" x2="29" y2="887" class="line"></line><line x1="857" y1="887" x2="857" y2="841" class="line"></line><path d="M29 887 Q29 897 39 897" class="line"></path><path d="M847 897 Q857 897 857 887" class="line"></path><rect x="51" y="883" width="72" height="32" rx="10"></rect><rect x="49" y="881" width="72" height="32" class="terminal" rx="10"></rect><text class="terminal" x="59" y="901">function</text><line x1="39" y1="897" x2="49" y2="897" class="line"></line><line x1="121" y1="897" x2="131" y2="897" class="line"></line><a xlink:href="#NAME" xlink:title="NAME"><rect x="143" y="883" width="54" height="32"></rect><rect x="141" y="881" width="54" height="32" class="nonterminal"></rect><text class="nonterminal" x="151" y="901">NAME</text></a><line x1="131" y1="897" x2="141" y2="897" class="line"></line><line x1="195" y1="897" x2="205" y2="897" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="257" y="883" width="56" height="32"></rect><rect x="255" y="881" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="265" y="901">FIELD</text></a><line x1="245" y1="897" x2="255" y2="897" class="line"></line><line x1="311" y1="897" x2="321" y2="897" class="line"></line><path d="M225 897 L245 897 M244 897 Q235 897 235 887 L235 875 Q235 865 245 865" class="line"></path><path d="M321 897 L341 897 M321 897 Q331 897 331 887 L331 875 Q331 865 321 865" class="line"></path><line x1="245" y1="865" x2="255" y2="865" class="line"></line><line x1="255" y1="865" x2="321" y2="865" class="line"></line><line x1="205" y1="897" x2="225" y2="897" class="line"></line><line x1="341" y1="897" x2="361" y2="897" class="line"></line><path d="M205 897 Q215 897 215 907" class="line"></path><path d="M351 907 Q351 897 361 897" class="line"></path><line x1="215" y1="907" x2="215" y2="921" class="line"></line><line x1="351" y1="921" x2="351" y2="907" class="line"></line><path d="M215 921 Q215 931 225 931" class="line"></path><path d="M341 931 Q351 931 351 921" class="line"></path><line x1="225" y1="931" x2="235" y2="931" class="line"></line><line x1="235" y1="931" x2="341" y2="931" class="line"></line><line x1="361" y1="897" x2="847" y2="897" class="line"></line><line x1="29" y1="887" x2="29" y2="907" class="line"></line><line x1="857" y1="907" x2="857" y2="887" class="line"></line><line x1="29" y1="907" x2="29" y2="969" class="line"></line><line x1="857" y1="969" x2="857" y2="907" class="line"></line><path d="M29 969 Q29 979 39 979" class="line"></path><path d="M847 979 Q857 979 857 969" class="line"></path><rect x="51" y="965" width="66" height="32" rx="10"></rect><rect x="49" y="963" width="66" height="32" class="terminal" rx="10"></rect><text class="terminal" x="59" y="983">decode</text><line x1="39" y1="979" x2="49" y2="979" class="line"></line><line x1="115" y1="979" x2="125" y2="979" class="line"></line><rect x="177" y="965" width="56" height="32" rx="10"></rect><rect x="175" y="963" width="56" height="32" class="terminal" rx="10"></rect><text class="terminal" x="185" y="983">value</text><line x1="165" y1="979" x2="175" y2="979" class="line"></line><line x1="231" y1="979" x2="241" y2="979" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="253" y="965" width="56" height="32"></rect><rect x="251" y="963" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="261" y="983">FIELD</text></a><line x1="241" y1="979" x2="251" y2="979" class="line"></line><line x1="307" y1="979" x2="317" y2="979" class="line"></line><rect x="349" y="965" width="56" height="32" rx="10"></rect><rect x="347" y="963" width="56" height="32" class="terminal" rx="10"></rect><text class="terminal" x="357" y="983">when</text><line x1="337" y1="979" x2="347" y2="979" class="line"></line><line x1="403" y1="979" x2="413" y2="979" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="425" y="965" width="56" height="32"></rect><rect x="423" y="963" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="433" y="983">FIELD</text></a><line x1="413" y1="979" x2="423" y2="979" class="line"></line><line x1="479" y1="979" x2="489" y2="979" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="501" y="965" width="56" height="32"></rect><rect x="499" y="963" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="509" y="983">FIELD</text></a><line x1="489" y1="979" x2="499" y2="979" class="line"></line><line x1="555" y1="979" x2="565" y2="979" class="line"></line><path d="M317 979 L337 979 M336 979 Q327 979 327 969 L327 957 Q327 947 337 947" class="line"></path><path d="M565 979 L585 979 M565 979 Q575 979 575 969 L575 957 Q575 947 565 947" class="line"></path><line x1="337" y1="947" x2="347" y2="947" class="line"></line><line x1="347" y1="947" x2="565" y2="947" class="line"></line><line x1="145" y1="979" x2="165" y2="979" class="line"></line><line x1="585" y1="979" x2="605" y2="979" class="line"></line><path d="M145 979 Q155 979 155 989" class="line"></path><path d="M595 989 Q595 979 605 979" class="line"></path><line x1="155" y1="989" x2="155" y2="1035" class="line"></line><line x1="595" y1="1035" x2="595" y2="989" class="line"></line><path d="M155 1035 Q155 1045 165 1045" class="line"></path><path d="M585 1045 Q595 1045 595 1035" class="line"></path><rect x="197" y="1031" width="56" height="32" rx="10"></rect><rect x="195" y="1029" width="56" height="32" class="terminal" rx="10"></rect><text class="terminal" x="205" y="1049">when</text><line x1="185" y1="1045" x2="195" y2="1045" class="line"></line><line x1="251" y1="1045" x2="261" y2="1045" class="line"></line><a xlink:href="#CONDITION" xlink:title="CONDITION"><rect x="273" y="1031" width="92" height="32"></rect><rect x="271" y="1029" width="92" height="32" class="nonterminal"></rect><text class="nonterminal" x="281" y="1049">CONDITION</text></a><line x1="261" y1="1045" x2="271" y2="1045" class="line"></line><line x1="363" y1="1045" x2="373" y2="1045" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="385" y="1031" width="56" height="32"></rect><rect x="383" y="1029" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="393" y="1049">FIELD</text></a><line x1="373" y1="1045" x2="383" y2="1045" class="line"></line><line x1="439" y1="1045" x2="449" y2="1045" class="line"></line><path d="M165 1045 L185 1045 M184 1045 Q175 1045 175 1035 L175 1023 Q175 1013 185 1013" class="line"></path><path d="M449 1045 L469 1045 M449 1045 Q459 1045 459 1035 L459 1023 Q459 1013 449 1013" class="line"></path><line x1="185" y1="1013" x2="195" y2="1013" class="line"></line><line x1="195" y1="1013" x2="449" y2="1013" class="line"></line><line x1="469" y1="1045" x2="585" y2="1045" class="line"></line><rect x="637" y="965" width="86" height="32" rx="10"></rect><rect x="635" y="963" width="86" height="32" class="terminal" rx="10"></rect><text class="terminal" x="645" y="983">otherwise</text><line x1="625" y1="979" x2="635" y2="979" class="line"></line><line x1="721" y1="979" x2="731" y2="979" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="743" y="965" width="56" height="32"></rect><rect x="741" y="963" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="751" y="983">FIELD</text></a><line x1="731" y1="979" x2="741" y2="979" class="line"></line><line x1="797" y1="979" x2="807" y2="979" class="line"></line><line x1="605" y1="979" x2="625" y2="979" class="line"></line><line x1="807" y1="979" x2="827" y2="979" class="line"></line><path d="M605 979 Q615 979 615 989" class="line"></path><path d="M817 989 Q817 979 827 979" class="line"></path><line x1="615" y1="989" x2="615" y2="1003" class="line"></line><line x1="817" y1="1003" x2="817" y2="989" class="line"></line><path d="M615 1003 Q615 1013 625 1013" class="line"></path><path d="M807 1013 Q817 1013 817 1003" class="line"></path><line x1="625" y1="1013" x2="635" y2="1013" class="line"></line><line x1="635" y1="1013" x2="807" y2="1013" class="line"></line><line x1="125" y1="979" x2="145" y2="979" class="line"></line><line x1="827" y1="979" x2="847" y2="979" class="line"></line><path d="M125 979 Q135 979 135 989" class="line"></path><path d="M837 989 Q837 979 847 979" class="line"></path><line x1="135" y1="989" x2="135" y2="1101" class="line"></line><line x1="837" y1="1101" x2="837" y2="989" class="line"></line><path d="M135 1101 Q135 1111 145 1111" class="line"></path><path d="M827 1111 Q837 1111 837 1101" class="line"></path><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="177" y="1097" width="56" height="32"></rect><rect x="175" y="1095" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="185" y="1115">FIELD</text></a><line x1="165" y1="1111" x2="175" y2="1111" class="line"></line><line x1="231" y1="1111" x2="241" y2="1111" class="line"></line><path d="M145 1111 L165 1111 M164 1111 Q155 1111 155 1101 L155 1089 Q155 1079 165 1079" class="line"></path><path d="M241 1111 L261 1111 M241 1111 Q251 1111 251 1101 L251 1089 Q251 1079 241 1079" class="line"></path><line x1="165" y1="1079" x2="175" y2="1079" class="line"></line><line x1="175" y1="1079" x2="241" y2="1079" class="line"></line><line x1="261" y1="1111" x2="827" y2="1111" class="line"></line><line x1="29" y1="969" x2="29" y2="989" class="line"></line><line x1="857" y1="989" x2="857" y2="969" class="line"></line><line x1="29" y1="989" x2="29" y2="1145" class="line"></line><line x1="857" y1="1145" x2="857" y2="989" class="line"></line><path d="M29 1145 Q29 1155 39 1155" class="line"></path><path d="M847 1155 Q857 1155 857 1145" class="line"></path><rect x="51" y="1141" width="78" height="32" rx="10"></rect><rect x="49" y="1139" width="78" height="32" class="terminal" rx="10"></rect><text class="terminal" x="59" y="1159">grouping</text><line x1="39" y1="1155" x2="49" y2="1155" class="line"></line><line x1="127" y1="1155" x2="137" y2="1155" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="149" y="1141" width="56" height="32"></rect><rect x="147" y="1139" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="157" y="1159">FIELD</text></a><line x1="137" y1="1155" x2="147" y2="1155" class="line"></line><line x1="203" y1="1155" x2="213" y2="1155" class="line"></line><line x1="213" y1="1155" x2="847" y2="1155" class="line"></line><line x1="29" y1="1145" x2="29" y2="1165" class="line"></line><line x1="857" y1="1165" x2="857" y2="1145" class="line"></line><line x1="29" y1="1165" x2="29" y2="1211" class="line"></line><line x1="857" y1="1211" x2="857" y2="1165" class="line"></line><path d="M29 1211 Q29 1221 39 1221" class="line"></path><path d="M847 1221 Q857 1221 857 1211" class="line"></path><rect x="51" y="1207" width="92" height="32" rx="10"></rect><rect x="49" y="1205" width="92" height="32" class="terminal" rx="10"></rect><text class="terminal" x="59" y="1225">groupingId</text><line x1="39" y1="1221" x2="49" y2="1221" class="line"></line><line x1="141" y1="1221" x2="151" y2="1221" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="183" y="1207" width="56" height="32"></rect><rect x="181" y="1205" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="191" y="1225">FIELD</text></a><line x1="171" y1="1221" x2="181" y2="1221" class="line"></line><line x1="237" y1="1221" x2="247" y2="1221" class="line"></line><path d="M151 1221 L171 1221 M170 1221 Q161 1221 161 1211 L161 1199 Q161 1189 171 1189" class="line"></path><path d="M247 1221 L267 1221 M247 1221 Q257 1221 257 1211 L257 1199 Q257 1189 247 1189" class="line"></path><line x1="171" y1="1189" x2="181" y2="1189" class="line"></line><line x1="181" y1="1189" x2="247" y2="1189" class="line"></line><line x1="267" y1="1221" x2="847" y2="1221" class="line"></line><line x1="29" y1="1211" x2="29" y2="1231" class="line"></line><line x1="857" y1="1231" x2="857" y2="1211" class="line"></line><line x1="29" y1="1231" x2="29" y2="1255" class="line"></line><line x1="857" y1="1255" x2="857" y2="1231" class="line"></line><path d="M29 1255 Q29 1265 39 1265" class="line"></path><path d="M847 1265 Q857 1265 857 1255" class="line"></path><rect x="51" y="1251" width="46" height="32" rx="10"></rect><rect x="49" y="1249" width="46" height="32" class="terminal" rx="10"></rect><text class="terminal" x="59" y="1269">cast</text><line x1="39" y1="1265" x2="49" y2="1265" class="line"></line><line x1="95" y1="1265" x2="105" y2="1265" class="line"></line><a xlink:href="#BINDING" xlink:title="BINDING"><rect x="117" y="1251" width="74" height="32"></rect><rect x="115" y="1249" width="74" height="32" class="nonterminal"></rect><text class="nonterminal" x="125" y="1269">BINDING</text></a><line x1="105" y1="1265" x2="115" y2="1265" class="line"></line><line x1="189" y1="1265" x2="199" y2="1265" class="line"></line><a xlink:href="#TYPE" xlink:title="TYPE"><rect x="211" y="1251" width="50" height="32"></rect><rect x="209" y="1249" width="50" height="32" class="nonterminal"></rect><text class="nonterminal" x="219" y="1269">TYPE</text></a><line x1="199" y1="1265" x2="209" y2="1265" class="line"></line><line x1="259" y1="1265" x2="269" y2="1265" class="line"></line><line x1="269" y1="1265" x2="847" y2="1265" class="line"></line><line x1="29" y1="1255" x2="29" y2="1275" class="line"></line><line x1="857" y1="1275" x2="857" y2="1255" class="line"></line><line x1="29" y1="1275" x2="29" y2="1299" class="line"></line><line x1="857" y1="1299" x2="857" y2="1275" class="line"></line><path d="M29 1299 Q29 1309 39 1309" class="line"></path><path d="M847 1309 Q857 1309 857 1299" class="line"></path><rect x="51" y="1295" width="72" height="32" rx="10"></rect><rect x="49" y="1293" width="72" height="32" class="terminal" rx="10"></rect><text class="terminal" x="59" y="1313">castNull</text><line x1="39" y1="1309" x2="49" y2="1309" class="line"></line><line x1="121" y1="1309" x2="131" y2="1309" class="line"></line><a xlink:href="#TYPE" xlink:title="TYPE"><rect x="143" y="1295" width="50" height="32"></rect><rect x="141" y="1293" width="50" height="32" class="nonterminal"></rect><text class="nonterminal" x="151" y="1313">TYPE</text></a><line x1="131" y1="1309" x2="141" y2="1309" class="line"></line><line x1="191" y1="1309" x2="201" y2="1309" class="line"></line><line x1="201" y1="1309" x2="847" y2="1309" class="line"></line><line x1="29" y1="1299" x2="29" y2="1319" class="line"></line><line x1="857" y1="1319" x2="857" y2="1299" class="line"></line><line x1="29" y1="1319" x2="29" y2="1365" class="line"></line><line x1="857" y1="1365" x2="857" y2="1319" class="line"></line><path d="M29 1365 Q29 1375 39 1375" class="line"></path><path d="M847 1375 Q857 1375 857 1365" class="line"></path><rect x="71" y="1361" width="76" height="32" rx="10"></rect><rect x="69" y="1359" width="76" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="1379">coalesce</text><line x1="59" y1="1375" x2="69" y2="1375" class="line"></line><line x1="145" y1="1375" x2="155" y2="1375" class="line"></line><line x1="39" y1="1375" x2="59" y2="1375" class="line"></line><line x1="155" y1="1375" x2="175" y2="1375" class="line"></line><path d="M39 1375 Q49 1375 49 1385" class="line"></path><path d="M165 1385 Q165 1375 175 1375" class="line"></path><line x1="49" y1="1385" x2="49" y2="1409" class="line"></line><line x1="165" y1="1409" x2="165" y2="1385" class="line"></line><path d="M49 1409 Q49 1419 59 1419" class="line"></path><path d="M155 1419 Q165 1419 165 1409" class="line"></path><rect x="71" y="1405" width="62" height="32" rx="10"></rect><rect x="69" y="1403" width="62" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="1423">concat</text><line x1="59" y1="1419" x2="69" y2="1419" class="line"></line><line x1="131" y1="1419" x2="141" y2="1419" class="line"></line><line x1="141" y1="1419" x2="155" y2="1419" class="line"></line><line x1="49" y1="1409" x2="49" y2="1429" class="line"></line><line x1="165" y1="1429" x2="165" y2="1409" class="line"></line><line x1="49" y1="1429" x2="49" y2="1453" class="line"></line><line x1="165" y1="1453" x2="165" y2="1429" class="line"></line><path d="M49 1453 Q49 1463 59 1463" class="line"></path><path d="M155 1463 Q165 1463 165 1453" class="line"></path><rect x="71" y="1449" width="74" height="32" rx="10"></rect><rect x="69" y="1447" width="74" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="1467">greatest</text><line x1="59" y1="1463" x2="69" y2="1463" class="line"></line><line x1="143" y1="1463" x2="153" y2="1463" class="line"></line><line x1="153" y1="1463" x2="155" y2="1463" class="line"></line><line x1="49" y1="1453" x2="49" y2="1473" class="line"></line><line x1="165" y1="1473" x2="165" y2="1453" class="line"></line><line x1="49" y1="1473" x2="49" y2="1497" class="line"></line><line x1="165" y1="1497" x2="165" y2="1473" class="line"></line><path d="M49 1497 Q49 1507 59 1507" class="line"></path><path d="M155 1507 Q165 1507 165 1497" class="line"></path><rect x="71" y="1493" width="52" height="32" rx="10"></rect><rect x="69" y="1491" width="52" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="1511">least</text><line x1="59" y1="1507" x2="69" y2="1507" class="line"></line><line x1="121" y1="1507" x2="131" y2="1507" class="line"></line><line x1="131" y1="1507" x2="155" y2="1507" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="207" y="1361" width="56" height="32"></rect><rect x="205" y="1359" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="215" y="1379">FIELD</text></a><line x1="195" y1="1375" x2="205" y2="1375" class="line"></line><line x1="261" y1="1375" x2="271" y2="1375" class="line"></line><path d="M175 1375 L195 1375 M194 1375 Q185 1375 185 1365 L185 1353 Q185 1343 195 1343" class="line"></path><path d="M271 1375 L291 1375 M271 1375 Q281 1375 281 1365 L281 1353 Q281 1343 271 1343" class="line"></path><line x1="195" y1="1343" x2="205" y2="1343" class="line"></line><line x1="205" y1="1343" x2="271" y2="1343" class="line"></line><line x1="291" y1="1375" x2="847" y2="1375" class="line"></line><line x1="29" y1="1365" x2="29" y2="1385" class="line"></line><line x1="857" y1="1385" x2="857" y2="1365" class="line"></line><line x1="29" y1="1385" x2="29" y2="1541" class="line"></line><line x1="857" y1="1541" x2="857" y2="1385" class="line"></line><path d="M29 1541 Q29 1551 39 1551" class="line"></path><path d="M847 1551 Q857 1551 857 1541" class="line"></path><rect x="71" y="1537" width="40" height="32" rx="10"></rect><rect x="69" y="1535" width="40" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="1555">nvl</text><line x1="59" y1="1551" x2="69" y2="1551" class="line"></line><line x1="109" y1="1551" x2="119" y2="1551" class="line"></line><line x1="119" y1="1551" x2="131" y2="1551" class="line"></line><line x1="39" y1="1551" x2="59" y2="1551" class="line"></line><line x1="131" y1="1551" x2="151" y2="1551" class="line"></line><path d="M39 1551 Q49 1551 49 1561" class="line"></path><path d="M141 1561 Q141 1551 151 1551" class="line"></path><line x1="49" y1="1561" x2="49" y2="1585" class="line"></line><line x1="141" y1="1585" x2="141" y2="1561" class="line"></line><path d="M49 1585 Q49 1595 59 1595" class="line"></path><path d="M131 1595 Q141 1595 141 1585" class="line"></path><rect x="71" y="1581" width="52" height="32" rx="10"></rect><rect x="69" y="1579" width="52" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="1599">nullif</text><line x1="59" y1="1595" x2="69" y2="1595" class="line"></line><line x1="121" y1="1595" x2="131" y2="1595" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="163" y="1537" width="56" height="32"></rect><rect x="161" y="1535" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="171" y="1555">FIELD</text></a><line x1="151" y1="1551" x2="161" y2="1551" class="line"></line><line x1="217" y1="1551" x2="227" y2="1551" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="239" y="1537" width="56" height="32"></rect><rect x="237" y="1535" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="247" y="1555">FIELD</text></a><line x1="227" y1="1551" x2="237" y2="1551" class="line"></line><line x1="293" y1="1551" x2="303" y2="1551" class="line"></line><line x1="303" y1="1551" x2="847" y2="1551" class="line"></line><line x1="29" y1="1541" x2="29" y2="1561" class="line"></line><line x1="857" y1="1561" x2="857" y2="1541" class="line"></line><line x1="29" y1="1561" x2="29" y2="1629" class="line"></line><line x1="857" y1="1629" x2="857" y2="1561" class="line"></line><path d="M29 1629 Q29 1639 39 1639" class="line"></path><path d="M847 1639 Q857 1639 857 1629" class="line"></path><rect x="51" y="1625" width="48" height="32" rx="10"></rect><rect x="49" y="1623" width="48" height="32" class="terminal" rx="10"></rect><text class="terminal" x="59" y="1643">nvl2</text><line x1="39" y1="1639" x2="49" y2="1639" class="line"></line><line x1="97" y1="1639" x2="107" y2="1639" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="119" y="1625" width="56" height="32"></rect><rect x="117" y="1623" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="127" y="1643">FIELD</text></a><line x1="107" y1="1639" x2="117" y2="1639" class="line"></line><line x1="173" y1="1639" x2="183" y2="1639" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="195" y="1625" width="56" height="32"></rect><rect x="193" y="1623" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="203" y="1643">FIELD</text></a><line x1="183" y1="1639" x2="193" y2="1639" class="line"></line><line x1="249" y1="1639" x2="259" y2="1639" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="271" y="1625" width="56" height="32"></rect><rect x="269" y="1623" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="279" y="1643">FIELD</text></a><line x1="259" y1="1639" x2="269" y2="1639" class="line"></line><line x1="325" y1="1639" x2="335" y2="1639" class="line"></line><line x1="335" y1="1639" x2="847" y2="1639" class="line"></line><line x1="29" y1="1629" x2="29" y2="1649" class="line"></line><line x1="857" y1="1649" x2="857" y2="1629" class="line"></line><line x1="29" y1="1649" x2="29" y2="1673" class="line"></line><line x1="857" y1="1673" x2="857" y2="1649" class="line"></line><path d="M29 1673 Q29 1683 39 1683" class="line"></path><path d="M847 1683 Q857 1683 857 1673" class="line"></path><rect x="71" y="1669" width="58" height="32" rx="10"></rect><rect x="69" y="1667" width="58" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="1687">upper</text><line x1="59" y1="1683" x2="69" y2="1683" class="line"></line><line x1="127" y1="1683" x2="137" y2="1683" class="line"></line><line x1="137" y1="1683" x2="177" y2="1683" class="line"></line><line x1="39" y1="1683" x2="59" y2="1683" class="line"></line><line x1="177" y1="1683" x2="197" y2="1683" class="line"></line><path d="M39 1683 Q49 1683 49 1693" class="line"></path><path d="M187 1693 Q187 1683 197 1683" class="line"></path><line x1="49" y1="1693" x2="49" y2="1717" class="line"></line><line x1="187" y1="1717" x2="187" y2="1693" class="line"></line><path d="M49 1717 Q49 1727 59 1727" class="line"></path><path d="M177 1727 Q187 1727 187 1717" class="line"></path><rect x="71" y="1713" width="58" height="32" rx="10"></rect><rect x="69" y="1711" width="58" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="1731">lower</text><line x1="59" y1="1727" x2="69" y2="1727" class="line"></line><line x1="127" y1="1727" x2="137" y2="1727" class="line"></line><line x1="137" y1="1727" x2="177" y2="1727" class="line"></line><line x1="49" y1="1717" x2="49" y2="1737" class="line"></line><line x1="187" y1="1737" x2="187" y2="1717" class="line"></line><line x1="49" y1="1737" x2="49" y2="1761" class="line"></line><line x1="187" y1="1761" x2="187" y2="1737" class="line"></line><path d="M49 1761 Q49 1771 59 1771" class="line"></path><path d="M177 1771 Q187 1771 187 1761" class="line"></path><rect x="71" y="1757" width="46" height="32" rx="10"></rect><rect x="69" y="1755" width="46" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="1775">trim</text><line x1="59" y1="1771" x2="69" y2="1771" class="line"></line><line x1="115" y1="1771" x2="125" y2="1771" class="line"></line><line x1="125" y1="1771" x2="177" y2="1771" class="line"></line><line x1="49" y1="1761" x2="49" y2="1781" class="line"></line><line x1="187" y1="1781" x2="187" y2="1761" class="line"></line><line x1="49" y1="1781" x2="49" y2="1805" class="line"></line><line x1="187" y1="1805" x2="187" y2="1781" class="line"></line><path d="M49 1805 Q49 1815 59 1815" class="line"></path><path d="M177 1815 Q187 1815 187 1805" class="line"></path><rect x="71" y="1801" width="52" height="32" rx="10"></rect><rect x="69" y="1799" width="52" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="1819">rtrim</text><line x1="59" y1="1815" x2="69" y2="1815" class="line"></line><line x1="121" y1="1815" x2="131" y2="1815" class="line"></line><line x1="131" y1="1815" x2="177" y2="1815" class="line"></line><line x1="49" y1="1805" x2="49" y2="1825" class="line"></line><line x1="187" y1="1825" x2="187" y2="1805" class="line"></line><line x1="49" y1="1825" x2="49" y2="1849" class="line"></line><line x1="187" y1="1849" x2="187" y2="1825" class="line"></line><path d="M49 1849 Q49 1859 59 1859" class="line"></path><path d="M177 1859 Q187 1859 187 1849" class="line"></path><rect x="71" y="1845" width="50" height="32" rx="10"></rect><rect x="69" y="1843" width="50" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="1863">ltrim</text><line x1="59" y1="1859" x2="69" y2="1859" class="line"></line><line x1="119" y1="1859" x2="129" y2="1859" class="line"></line><line x1="129" y1="1859" x2="177" y2="1859" class="line"></line><line x1="49" y1="1849" x2="49" y2="1869" class="line"></line><line x1="187" y1="1869" x2="187" y2="1849" class="line"></line><line x1="49" y1="1869" x2="49" y2="1893" class="line"></line><line x1="187" y1="1893" x2="187" y2="1869" class="line"></line><path d="M49 1893 Q49 1903 59 1903" class="line"></path><path d="M177 1903 Q187 1903 187 1893" class="line"></path><rect x="71" y="1889" width="50" height="32" rx="10"></rect><rect x="69" y="1887" width="50" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="1907">ascii</text><line x1="59" y1="1903" x2="69" y2="1903" class="line"></line><line x1="119" y1="1903" x2="129" y2="1903" class="line"></line><line x1="129" y1="1903" x2="177" y2="1903" class="line"></line><line x1="49" y1="1893" x2="49" y2="1913" class="line"></line><line x1="187" y1="1913" x2="187" y2="1893" class="line"></line><line x1="49" y1="1913" x2="49" y2="1937" class="line"></line><line x1="187" y1="1937" x2="187" y2="1913" class="line"></line><path d="M49 1937 Q49 1947 59 1947" class="line"></path><path d="M177 1947 Q187 1947 187 1937" class="line"></path><rect x="71" y="1933" width="60" height="32" rx="10"></rect><rect x="69" y="1931" width="60" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="1951">length</text><line x1="59" y1="1947" x2="69" y2="1947" class="line"></line><line x1="129" y1="1947" x2="139" y2="1947" class="line"></line><line x1="139" y1="1947" x2="177" y2="1947" class="line"></line><line x1="49" y1="1937" x2="49" y2="1957" class="line"></line><line x1="187" y1="1957" x2="187" y2="1937" class="line"></line><line x1="49" y1="1957" x2="49" y2="1981" class="line"></line><line x1="187" y1="1981" x2="187" y2="1957" class="line"></line><path d="M49 1981 Q49 1991 59 1991" class="line"></path><path d="M177 1991 Q187 1991 187 1981" class="line"></path><rect x="71" y="1977" width="94" height="32" rx="10"></rect><rect x="69" y="1975" width="94" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="1995">charLength</text><line x1="59" y1="1991" x2="69" y2="1991" class="line"></line><line x1="163" y1="1991" x2="173" y2="1991" class="line"></line><line x1="173" y1="1991" x2="177" y2="1991" class="line"></line><line x1="49" y1="1981" x2="49" y2="2001" class="line"></line><line x1="187" y1="2001" x2="187" y2="1981" class="line"></line><line x1="49" y1="2001" x2="49" y2="2025" class="line"></line><line x1="187" y1="2025" x2="187" y2="2001" class="line"></line><path d="M49 2025 Q49 2035 59 2035" class="line"></path><path d="M177 2035 Q187 2035 187 2025" class="line"></path><rect x="71" y="2021" width="82" height="32" rx="10"></rect><rect x="69" y="2019" width="82" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="2039">bitLength</text><line x1="59" y1="2035" x2="69" y2="2035" class="line"></line><line x1="151" y1="2035" x2="161" y2="2035" class="line"></line><line x1="161" y1="2035" x2="177" y2="2035" class="line"></line><line x1="49" y1="2025" x2="49" y2="2045" class="line"></line><line x1="187" y1="2045" x2="187" y2="2025" class="line"></line><line x1="49" y1="2045" x2="49" y2="2069" class="line"></line><line x1="187" y1="2069" x2="187" y2="2045" class="line"></line><path d="M49 2069 Q49 2079 59 2079" class="line"></path><path d="M177 2079 Q187 2079 187 2069" class="line"></path><rect x="71" y="2065" width="98" height="32" rx="10"></rect><rect x="69" y="2063" width="98" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="2083">octetLength</text><line x1="59" y1="2079" x2="69" y2="2079" class="line"></line><line x1="167" y1="2079" x2="177" y2="2079" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="209" y="1669" width="56" height="32"></rect><rect x="207" y="1667" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="217" y="1687">FIELD</text></a><line x1="197" y1="1683" x2="207" y2="1683" class="line"></line><line x1="263" y1="1683" x2="273" y2="1683" class="line"></line><line x1="273" y1="1683" x2="847" y2="1683" class="line"></line><line x1="29" y1="1673" x2="29" y2="1693" class="line"></line><line x1="857" y1="1693" x2="857" y2="1673" class="line"></line><line x1="29" y1="1693" x2="29" y2="2113" class="line"></line><line x1="857" y1="2113" x2="857" y2="1693" class="line"></line><path d="M29 2113 Q29 2123 39 2123" class="line"></path><path d="M847 2123 Q857 2123 857 2113" class="line"></path><rect x="71" y="2109" width="50" height="32" rx="10"></rect><rect x="69" y="2107" width="50" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="2127">rpad</text><line x1="59" y1="2123" x2="69" y2="2123" class="line"></line><line x1="119" y1="2123" x2="129" y2="2123" class="line"></line><line x1="129" y1="2123" x2="159" y2="2123" class="line"></line><line x1="39" y1="2123" x2="59" y2="2123" class="line"></line><line x1="159" y1="2123" x2="179" y2="2123" class="line"></line><path d="M39 2123 Q49 2123 49 2133" class="line"></path><path d="M169 2133 Q169 2123 179 2123" class="line"></path><line x1="49" y1="2133" x2="49" y2="2157" class="line"></line><line x1="169" y1="2157" x2="169" y2="2133" class="line"></line><path d="M49 2157 Q49 2167 59 2167" class="line"></path><path d="M159 2167 Q169 2167 169 2157" class="line"></path><rect x="71" y="2153" width="48" height="32" rx="10"></rect><rect x="69" y="2151" width="48" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="2171">lpad</text><line x1="59" y1="2167" x2="69" y2="2167" class="line"></line><line x1="117" y1="2167" x2="127" y2="2167" class="line"></line><line x1="127" y1="2167" x2="159" y2="2167" class="line"></line><line x1="49" y1="2157" x2="49" y2="2177" class="line"></line><line x1="169" y1="2177" x2="169" y2="2157" class="line"></line><line x1="49" y1="2177" x2="49" y2="2201" class="line"></line><line x1="169" y1="2201" x2="169" y2="2177" class="line"></line><path d="M49 2201 Q49 2211 59 2211" class="line"></path><path d="M159 2211 Q169 2211 169 2201" class="line"></path><rect x="71" y="2197" width="68" height="32" rx="10"></rect><rect x="69" y="2195" width="68" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="2215">replace</text><line x1="59" y1="2211" x2="69" y2="2211" class="line"></line><line x1="137" y1="2211" x2="147" y2="2211" class="line"></line><line x1="147" y1="2211" x2="159" y2="2211" class="line"></line><line x1="49" y1="2201" x2="49" y2="2221" class="line"></line><line x1="169" y1="2221" x2="169" y2="2201" class="line"></line><line x1="49" y1="2221" x2="49" y2="2245" class="line"></line><line x1="169" y1="2245" x2="169" y2="2221" class="line"></line><path d="M49 2245 Q49 2255 59 2255" class="line"></path><path d="M159 2255 Q169 2255 169 2245" class="line"></path><rect x="71" y="2241" width="80" height="32" rx="10"></rect><rect x="69" y="2239" width="80" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="2259">substring</text><line x1="59" y1="2255" x2="69" y2="2255" class="line"></line><line x1="149" y1="2255" x2="159" y2="2255" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="191" y="2109" width="56" height="32"></rect><rect x="189" y="2107" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="199" y="2127">FIELD</text></a><line x1="179" y1="2123" x2="189" y2="2123" class="line"></line><line x1="245" y1="2123" x2="255" y2="2123" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="267" y="2109" width="56" height="32"></rect><rect x="265" y="2107" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="275" y="2127">FIELD</text></a><line x1="255" y1="2123" x2="265" y2="2123" class="line"></line><line x1="321" y1="2123" x2="331" y2="2123" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="363" y="2109" width="56" height="32"></rect><rect x="361" y="2107" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="371" y="2127">FIELD</text></a><line x1="351" y1="2123" x2="361" y2="2123" class="line"></line><line x1="417" y1="2123" x2="427" y2="2123" class="line"></line><line x1="331" y1="2123" x2="351" y2="2123" class="line"></line><line x1="427" y1="2123" x2="447" y2="2123" class="line"></line><path d="M331 2123 Q341 2123 341 2133" class="line"></path><path d="M437 2133 Q437 2123 447 2123" class="line"></path><line x1="341" y1="2133" x2="341" y2="2147" class="line"></line><line x1="437" y1="2147" x2="437" y2="2133" class="line"></line><path d="M341 2147 Q341 2157 351 2157" class="line"></path><path d="M427 2157 Q437 2157 437 2147" class="line"></path><line x1="351" y1="2157" x2="361" y2="2157" class="line"></line><line x1="361" y1="2157" x2="427" y2="2157" class="line"></line><line x1="447" y1="2123" x2="847" y2="2123" class="line"></line><line x1="29" y1="2113" x2="29" y2="2133" class="line"></line><line x1="857" y1="2133" x2="857" y2="2113" class="line"></line><line x1="29" y1="2133" x2="29" y2="2289" class="line"></line><line x1="857" y1="2289" x2="857" y2="2133" class="line"></line><path d="M29 2289 Q29 2299 39 2299" class="line"></path><path d="M847 2299 Q857 2299 857 2289" class="line"></path><rect x="71" y="2285" width="62" height="32" rx="10"></rect><rect x="69" y="2283" width="62" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="2303">repeat</text><line x1="59" y1="2299" x2="69" y2="2299" class="line"></line><line x1="131" y1="2299" x2="141" y2="2299" class="line"></line><line x1="141" y1="2299" x2="151" y2="2299" class="line"></line><line x1="39" y1="2299" x2="59" y2="2299" class="line"></line><line x1="151" y1="2299" x2="171" y2="2299" class="line"></line><path d="M39 2299 Q49 2299 49 2309" class="line"></path><path d="M161 2309 Q161 2299 171 2299" class="line"></path><line x1="49" y1="2309" x2="49" y2="2333" class="line"></line><line x1="161" y1="2333" x2="161" y2="2309" class="line"></line><path d="M49 2333 Q49 2343 59 2343" class="line"></path><path d="M151 2343 Q161 2343 161 2333" class="line"></path><rect x="71" y="2329" width="72" height="32" rx="10"></rect><rect x="69" y="2327" width="72" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="2347">position</text><line x1="59" y1="2343" x2="69" y2="2343" class="line"></line><line x1="141" y1="2343" x2="151" y2="2343" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="183" y="2285" width="56" height="32"></rect><rect x="181" y="2283" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="191" y="2303">FIELD</text></a><line x1="171" y1="2299" x2="181" y2="2299" class="line"></line><line x1="237" y1="2299" x2="247" y2="2299" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="259" y="2285" width="56" height="32"></rect><rect x="257" y="2283" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="267" y="2303">FIELD</text></a><line x1="247" y1="2299" x2="257" y2="2299" class="line"></line><line x1="313" y1="2299" x2="323" y2="2299" class="line"></line><line x1="323" y1="2299" x2="847" y2="2299" class="line"></line><line x1="29" y1="2289" x2="29" y2="2309" class="line"></line><line x1="857" y1="2309" x2="857" y2="2289" class="line"></line><line x1="29" y1="2309" x2="29" y2="2377" class="line"></line><line x1="857" y1="2377" x2="857" y2="2309" class="line"></line><path d="M29 2377 Q29 2387 39 2387" class="line"></path><path d="M847 2387 Q857 2387 857 2377" class="line"></path><rect x="51" y="2373" width="66" height="32" rx="10"></rect><rect x="49" y="2371" width="66" height="32" class="terminal" rx="10"></rect><text class="terminal" x="59" y="2391">extract</text><line x1="39" y1="2387" x2="49" y2="2387" class="line"></line><line x1="115" y1="2387" x2="125" y2="2387" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="137" y="2373" width="56" height="32"></rect><rect x="135" y="2371" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="145" y="2391">FIELD</text></a><line x1="125" y1="2387" x2="135" y2="2387" class="line"></line><line x1="191" y1="2387" x2="201" y2="2387" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="213" y="2373" width="56" height="32"></rect><rect x="211" y="2371" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="221" y="2391">FIELD</text></a><line x1="201" y1="2387" x2="211" y2="2387" class="line"></line><line x1="267" y1="2387" x2="277" y2="2387" class="line"></line><line x1="277" y1="2387" x2="847" y2="2387" class="line"></line><line x1="29" y1="2377" x2="29" y2="2397" class="line"></line><line x1="857" y1="2397" x2="857" y2="2377" class="line"></line><line x1="29" y1="2397" x2="29" y2="2421" class="line"></line><line x1="857" y1="2421" x2="857" y2="2397" class="line"></line><path d="M29 2421 Q29 2431 39 2431" class="line"></path><path d="M847 2431 Q857 2431 857 2421" class="line"></path><rect x="71" y="2417" width="74" height="32" rx="10"></rect><rect x="69" y="2415" width="74" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="2435">bitCount</text><line x1="59" y1="2431" x2="69" y2="2431" class="line"></line><line x1="143" y1="2431" x2="153" y2="2431" class="line"></line><line x1="39" y1="2431" x2="59" y2="2431" class="line"></line><line x1="153" y1="2431" x2="173" y2="2431" class="line"></line><path d="M39 2431 Q49 2431 49 2441" class="line"></path><path d="M163 2441 Q163 2431 173 2431" class="line"></path><line x1="49" y1="2441" x2="49" y2="2465" class="line"></line><line x1="163" y1="2465" x2="163" y2="2441" class="line"></line><path d="M49 2465 Q49 2475 59 2475" class="line"></path><path d="M153 2475 Q163 2475 163 2465" class="line"></path><rect x="71" y="2461" width="60" height="32" rx="10"></rect><rect x="69" y="2459" width="60" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="2479">bitNot</text><line x1="59" y1="2475" x2="69" y2="2475" class="line"></line><line x1="129" y1="2475" x2="139" y2="2475" class="line"></line><line x1="139" y1="2475" x2="153" y2="2475" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="185" y="2417" width="56" height="32"></rect><rect x="183" y="2415" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="193" y="2435">FIELD</text></a><line x1="173" y1="2431" x2="183" y2="2431" class="line"></line><line x1="239" y1="2431" x2="249" y2="2431" class="line"></line><line x1="249" y1="2431" x2="847" y2="2431" class="line"></line><line x1="29" y1="2421" x2="29" y2="2441" class="line"></line><line x1="857" y1="2441" x2="857" y2="2421" class="line"></line><line x1="29" y1="2441" x2="29" y2="2509" class="line"></line><line x1="857" y1="2509" x2="857" y2="2441" class="line"></line><path d="M29 2509 Q29 2519 39 2519" class="line"></path><path d="M847 2519 Q857 2519 857 2509" class="line"></path><rect x="71" y="2505" width="62" height="32" rx="10"></rect><rect x="69" y="2503" width="62" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="2523">bitAnd</text><line x1="59" y1="2519" x2="69" y2="2519" class="line"></line><line x1="131" y1="2519" x2="141" y2="2519" class="line"></line><line x1="141" y1="2519" x2="149" y2="2519" class="line"></line><line x1="39" y1="2519" x2="59" y2="2519" class="line"></line><line x1="149" y1="2519" x2="169" y2="2519" class="line"></line><path d="M39 2519 Q49 2519 49 2529" class="line"></path><path d="M159 2529 Q159 2519 169 2519" class="line"></path><line x1="49" y1="2529" x2="49" y2="2553" class="line"></line><line x1="159" y1="2553" x2="159" y2="2529" class="line"></line><path d="M49 2553 Q49 2563 59 2563" class="line"></path><path d="M149 2563 Q159 2563 159 2553" class="line"></path><rect x="71" y="2549" width="70" height="32" rx="10"></rect><rect x="69" y="2547" width="70" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="2567">bitNand</text><line x1="59" y1="2563" x2="69" y2="2563" class="line"></line><line x1="139" y1="2563" x2="149" y2="2563" class="line"></line><line x1="49" y1="2553" x2="49" y2="2573" class="line"></line><line x1="159" y1="2573" x2="159" y2="2553" class="line"></line><line x1="49" y1="2573" x2="49" y2="2597" class="line"></line><line x1="159" y1="2597" x2="159" y2="2573" class="line"></line><path d="M49 2597 Q49 2607 59 2607" class="line"></path><path d="M149 2607 Q159 2607 159 2597" class="line"></path><rect x="71" y="2593" width="54" height="32" rx="10"></rect><rect x="69" y="2591" width="54" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="2611">bitOr</text><line x1="59" y1="2607" x2="69" y2="2607" class="line"></line><line x1="123" y1="2607" x2="133" y2="2607" class="line"></line><line x1="133" y1="2607" x2="149" y2="2607" class="line"></line><line x1="49" y1="2597" x2="49" y2="2617" class="line"></line><line x1="159" y1="2617" x2="159" y2="2597" class="line"></line><line x1="49" y1="2617" x2="49" y2="2641" class="line"></line><line x1="159" y1="2641" x2="159" y2="2617" class="line"></line><path d="M49 2641 Q49 2651 59 2651" class="line"></path><path d="M149 2651 Q159 2651 159 2641" class="line"></path><rect x="71" y="2637" width="60" height="32" rx="10"></rect><rect x="69" y="2635" width="60" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="2655">bitNor</text><line x1="59" y1="2651" x2="69" y2="2651" class="line"></line><line x1="129" y1="2651" x2="139" y2="2651" class="line"></line><line x1="139" y1="2651" x2="149" y2="2651" class="line"></line><line x1="49" y1="2641" x2="49" y2="2661" class="line"></line><line x1="159" y1="2661" x2="159" y2="2641" class="line"></line><line x1="49" y1="2661" x2="49" y2="2685" class="line"></line><line x1="159" y1="2685" x2="159" y2="2661" class="line"></line><path d="M49 2685 Q49 2695 59 2695" class="line"></path><path d="M149 2695 Q159 2695 159 2685" class="line"></path><rect x="71" y="2681" width="60" height="32" rx="10"></rect><rect x="69" y="2679" width="60" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="2699">bitXor</text><line x1="59" y1="2695" x2="69" y2="2695" class="line"></line><line x1="129" y1="2695" x2="139" y2="2695" class="line"></line><line x1="139" y1="2695" x2="149" y2="2695" class="line"></line><line x1="49" y1="2685" x2="49" y2="2705" class="line"></line><line x1="159" y1="2705" x2="159" y2="2685" class="line"></line><line x1="49" y1="2705" x2="49" y2="2729" class="line"></line><line x1="159" y1="2729" x2="159" y2="2705" class="line"></line><path d="M49 2729 Q49 2739 59 2739" class="line"></path><path d="M149 2739 Q159 2739 159 2729" class="line"></path><rect x="71" y="2725" width="70" height="32" rx="10"></rect><rect x="69" y="2723" width="70" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="2743">bitXNor</text><line x1="59" y1="2739" x2="69" y2="2739" class="line"></line><line x1="139" y1="2739" x2="149" y2="2739" class="line"></line><line x1="49" y1="2729" x2="49" y2="2749" class="line"></line><line x1="159" y1="2749" x2="159" y2="2729" class="line"></line><line x1="49" y1="2749" x2="49" y2="2773" class="line"></line><line x1="159" y1="2773" x2="159" y2="2749" class="line"></line><path d="M49 2773 Q49 2783 59 2783" class="line"></path><path d="M149 2783 Q159 2783 159 2773" class="line"></path><rect x="71" y="2769" width="38" height="32" rx="10"></rect><rect x="69" y="2767" width="38" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="2787">shl</text><line x1="59" y1="2783" x2="69" y2="2783" class="line"></line><line x1="107" y1="2783" x2="117" y2="2783" class="line"></line><line x1="117" y1="2783" x2="149" y2="2783" class="line"></line><line x1="49" y1="2773" x2="49" y2="2793" class="line"></line><line x1="159" y1="2793" x2="159" y2="2773" class="line"></line><line x1="49" y1="2793" x2="49" y2="2817" class="line"></line><line x1="159" y1="2817" x2="159" y2="2793" class="line"></line><path d="M49 2817 Q49 2827 59 2827" class="line"></path><path d="M149 2827 Q159 2827 159 2817" class="line"></path><rect x="71" y="2813" width="40" height="32" rx="10"></rect><rect x="69" y="2811" width="40" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="2831">shr</text><line x1="59" y1="2827" x2="69" y2="2827" class="line"></line><line x1="109" y1="2827" x2="119" y2="2827" class="line"></line><line x1="119" y1="2827" x2="149" y2="2827" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="181" y="2505" width="56" height="32"></rect><rect x="179" y="2503" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="189" y="2523">FIELD</text></a><line x1="169" y1="2519" x2="179" y2="2519" class="line"></line><line x1="235" y1="2519" x2="245" y2="2519" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="257" y="2505" width="56" height="32"></rect><rect x="255" y="2503" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="265" y="2523">FIELD</text></a><line x1="245" y1="2519" x2="255" y2="2519" class="line"></line><line x1="311" y1="2519" x2="321" y2="2519" class="line"></line><line x1="321" y1="2519" x2="847" y2="2519" class="line"></line><line x1="29" y1="2509" x2="29" y2="2529" class="line"></line><line x1="857" y1="2529" x2="857" y2="2509" class="line"></line><line x1="29" y1="2529" x2="29" y2="2861" class="line"></line><line x1="857" y1="2861" x2="857" y2="2529" class="line"></line><path d="M29 2861 Q29 2871 39 2871" class="line"></path><path d="M847 2871 Q857 2871 857 2861" class="line"></path><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="51" y="2857" width="56" height="32"></rect><rect x="49" y="2855" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="59" y="2875">FIELD</text></a><line x1="39" y1="2871" x2="49" y2="2871" class="line"></line><line x1="105" y1="2871" x2="115" y2="2871" class="line"></line><rect x="127" y="2857" width="44" height="32" rx="10"></rect><rect x="125" y="2855" width="44" height="32" class="terminal" rx="10"></rect><text class="terminal" x="135" y="2875">neg</text><line x1="115" y1="2871" x2="125" y2="2871" class="line"></line><line x1="169" y1="2871" x2="179" y2="2871" class="line"></line><line x1="179" y1="2871" x2="847" y2="2871" class="line"></line><line x1="29" y1="2861" x2="29" y2="2881" class="line"></line><line x1="857" y1="2881" x2="857" y2="2861" class="line"></line><line x1="29" y1="2881" x2="29" y2="2905" class="line"></line><line x1="857" y1="2905" x2="857" y2="2881" class="line"></line><path d="M29 2905 Q29 2915 39 2915" class="line"></path><path d="M847 2915 Q857 2915 857 2905" class="line"></path><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="51" y="2901" width="56" height="32"></rect><rect x="49" y="2899" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="59" y="2919">FIELD</text></a><line x1="39" y1="2915" x2="49" y2="2915" class="line"></line><line x1="105" y1="2915" x2="115" y2="2915" class="line"></line><rect x="147" y="2901" width="44" height="32" rx="10"></rect><rect x="145" y="2899" width="44" height="32" class="terminal" rx="10"></rect><text class="terminal" x="155" y="2919">add</text><line x1="135" y1="2915" x2="145" y2="2915" class="line"></line><line x1="189" y1="2915" x2="199" y2="2915" class="line"></line><line x1="199" y1="2915" x2="203" y2="2915" class="line"></line><line x1="115" y1="2915" x2="135" y2="2915" class="line"></line><line x1="203" y1="2915" x2="223" y2="2915" class="line"></line><path d="M115 2915 Q125 2915 125 2925" class="line"></path><path d="M213 2925 Q213 2915 223 2915" class="line"></path><line x1="125" y1="2925" x2="125" y2="2949" class="line"></line><line x1="213" y1="2949" x2="213" y2="2925" class="line"></line><path d="M125 2949 Q125 2959 135 2959" class="line"></path><path d="M203 2959 Q213 2959 213 2949" class="line"></path><rect x="147" y="2945" width="42" height="32" rx="10"></rect><rect x="145" y="2943" width="42" height="32" class="terminal" rx="10"></rect><text class="terminal" x="155" y="2963">sub</text><line x1="135" y1="2959" x2="145" y2="2959" class="line"></line><line x1="187" y1="2959" x2="197" y2="2959" class="line"></line><line x1="197" y1="2959" x2="203" y2="2959" class="line"></line><line x1="125" y1="2949" x2="125" y2="2969" class="line"></line><line x1="213" y1="2969" x2="213" y2="2949" class="line"></line><line x1="125" y1="2969" x2="125" y2="2993" class="line"></line><line x1="213" y1="2993" x2="213" y2="2969" class="line"></line><path d="M125 2993 Q125 3003 135 3003" class="line"></path><path d="M203 3003 Q213 3003 213 2993" class="line"></path><rect x="147" y="2989" width="44" height="32" rx="10"></rect><rect x="145" y="2987" width="44" height="32" class="terminal" rx="10"></rect><text class="terminal" x="155" y="3007">mul</text><line x1="135" y1="3003" x2="145" y2="3003" class="line"></line><line x1="189" y1="3003" x2="199" y2="3003" class="line"></line><line x1="199" y1="3003" x2="203" y2="3003" class="line"></line><line x1="125" y1="2993" x2="125" y2="3013" class="line"></line><line x1="213" y1="3013" x2="213" y2="2993" class="line"></line><line x1="125" y1="3013" x2="125" y2="3037" class="line"></line><line x1="213" y1="3037" x2="213" y2="3013" class="line"></line><path d="M125 3037 Q125 3047 135 3047" class="line"></path><path d="M203 3047 Q213 3047 213 3037" class="line"></path><rect x="147" y="3033" width="40" height="32" rx="10"></rect><rect x="145" y="3031" width="40" height="32" class="terminal" rx="10"></rect><text class="terminal" x="155" y="3051">div</text><line x1="135" y1="3047" x2="145" y2="3047" class="line"></line><line x1="185" y1="3047" x2="195" y2="3047" class="line"></line><line x1="195" y1="3047" x2="203" y2="3047" class="line"></line><line x1="125" y1="3037" x2="125" y2="3057" class="line"></line><line x1="213" y1="3057" x2="213" y2="3037" class="line"></line><line x1="125" y1="3057" x2="125" y2="3081" class="line"></line><line x1="213" y1="3081" x2="213" y2="3057" class="line"></line><path d="M125 3081 Q125 3091 135 3091" class="line"></path><path d="M203 3091 Q213 3091 213 3081" class="line"></path><rect x="147" y="3077" width="48" height="32" rx="10"></rect><rect x="145" y="3075" width="48" height="32" class="terminal" rx="10"></rect><text class="terminal" x="155" y="3095">mod</text><line x1="135" y1="3091" x2="145" y2="3091" class="line"></line><line x1="193" y1="3091" x2="203" y2="3091" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="235" y="2901" width="56" height="32"></rect><rect x="233" y="2899" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="243" y="2919">FIELD</text></a><line x1="223" y1="2915" x2="233" y2="2915" class="line"></line><line x1="289" y1="2915" x2="299" y2="2915" class="line"></line><line x1="299" y1="2915" x2="847" y2="2915" class="line"></line><line x1="29" y1="2905" x2="29" y2="2925" class="line"></line><line x1="857" y1="2925" x2="857" y2="2905" class="line"></line><line x1="29" y1="2925" x2="29" y2="3125" class="line"></line><line x1="857" y1="3125" x2="857" y2="2925" class="line"></line><path d="M29 3125 Q29 3135 39 3135" class="line"></path><path d="M847 3135 Q857 3135 857 3125" class="line"></path><rect x="71" y="3121" width="46" height="32" rx="10"></rect><rect x="69" y="3119" width="46" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="3139">sign</text><line x1="59" y1="3135" x2="69" y2="3135" class="line"></line><line x1="115" y1="3135" x2="125" y2="3135" class="line"></line><line x1="125" y1="3135" x2="129" y2="3135" class="line"></line><line x1="39" y1="3135" x2="59" y2="3135" class="line"></line><line x1="129" y1="3135" x2="149" y2="3135" class="line"></line><path d="M39 3135 Q49 3135 49 3145" class="line"></path><path d="M139 3145 Q139 3135 149 3135" class="line"></path><line x1="49" y1="3145" x2="49" y2="3169" class="line"></line><line x1="139" y1="3169" x2="139" y2="3145" class="line"></line><path d="M49 3169 Q49 3179 59 3179" class="line"></path><path d="M129 3179 Q139 3179 139 3169" class="line"></path><rect x="71" y="3165" width="42" height="32" rx="10"></rect><rect x="69" y="3163" width="42" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="3183">abs</text><line x1="59" y1="3179" x2="69" y2="3179" class="line"></line><line x1="111" y1="3179" x2="121" y2="3179" class="line"></line><line x1="121" y1="3179" x2="129" y2="3179" class="line"></line><line x1="49" y1="3169" x2="49" y2="3189" class="line"></line><line x1="139" y1="3189" x2="139" y2="3169" class="line"></line><line x1="49" y1="3189" x2="49" y2="3213" class="line"></line><line x1="139" y1="3213" x2="139" y2="3189" class="line"></line><path d="M49 3213 Q49 3223 59 3223" class="line"></path><path d="M129 3223 Q139 3223 139 3213" class="line"></path><rect x="71" y="3209" width="50" height="32" rx="10"></rect><rect x="69" y="3207" width="50" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="3227">floor</text><line x1="59" y1="3223" x2="69" y2="3223" class="line"></line><line x1="119" y1="3223" x2="129" y2="3223" class="line"></line><line x1="49" y1="3213" x2="49" y2="3233" class="line"></line><line x1="139" y1="3233" x2="139" y2="3213" class="line"></line><line x1="49" y1="3233" x2="49" y2="3257" class="line"></line><line x1="139" y1="3257" x2="139" y2="3233" class="line"></line><path d="M49 3257 Q49 3267 59 3267" class="line"></path><path d="M129 3267 Q139 3267 139 3257" class="line"></path><rect x="71" y="3253" width="42" height="32" rx="10"></rect><rect x="69" y="3251" width="42" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="3271">ceil</text><line x1="59" y1="3267" x2="69" y2="3267" class="line"></line><line x1="111" y1="3267" x2="121" y2="3267" class="line"></line><line x1="121" y1="3267" x2="129" y2="3267" class="line"></line><line x1="49" y1="3257" x2="49" y2="3277" class="line"></line><line x1="139" y1="3277" x2="139" y2="3257" class="line"></line><line x1="49" y1="3277" x2="49" y2="3301" class="line"></line><line x1="139" y1="3301" x2="139" y2="3277" class="line"></line><path d="M49 3301 Q49 3311 59 3311" class="line"></path><path d="M129 3311 Q139 3311 139 3301" class="line"></path><rect x="71" y="3297" width="46" height="32" rx="10"></rect><rect x="69" y="3295" width="46" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="3315">sqrt</text><line x1="59" y1="3311" x2="69" y2="3311" class="line"></line><line x1="115" y1="3311" x2="125" y2="3311" class="line"></line><line x1="125" y1="3311" x2="129" y2="3311" class="line"></line><line x1="49" y1="3301" x2="49" y2="3321" class="line"></line><line x1="139" y1="3321" x2="139" y2="3301" class="line"></line><line x1="49" y1="3321" x2="49" y2="3345" class="line"></line><line x1="139" y1="3345" x2="139" y2="3321" class="line"></line><path d="M49 3345 Q49 3355 59 3355" class="line"></path><path d="M129 3355 Q139 3355 139 3345" class="line"></path><rect x="71" y="3341" width="44" height="32" rx="10"></rect><rect x="69" y="3339" width="44" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="3359">exp</text><line x1="59" y1="3355" x2="69" y2="3355" class="line"></line><line x1="113" y1="3355" x2="123" y2="3355" class="line"></line><line x1="123" y1="3355" x2="129" y2="3355" class="line"></line><line x1="49" y1="3345" x2="49" y2="3365" class="line"></line><line x1="139" y1="3365" x2="139" y2="3345" class="line"></line><line x1="49" y1="3365" x2="49" y2="3389" class="line"></line><line x1="139" y1="3389" x2="139" y2="3365" class="line"></line><path d="M49 3389 Q49 3399 59 3399" class="line"></path><path d="M129 3399 Q139 3399 139 3389" class="line"></path><rect x="71" y="3385" width="32" height="32" rx="10"></rect><rect x="69" y="3383" width="32" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="3403">ln</text><line x1="59" y1="3399" x2="69" y2="3399" class="line"></line><line x1="101" y1="3399" x2="111" y2="3399" class="line"></line><line x1="111" y1="3399" x2="129" y2="3399" class="line"></line><line x1="49" y1="3389" x2="49" y2="3409" class="line"></line><line x1="139" y1="3409" x2="139" y2="3389" class="line"></line><line x1="49" y1="3409" x2="49" y2="3433" class="line"></line><line x1="139" y1="3433" x2="139" y2="3409" class="line"></line><path d="M49 3433 Q49 3443 59 3443" class="line"></path><path d="M129 3443 Q139 3443 139 3433" class="line"></path><rect x="71" y="3429" width="50" height="32" rx="10"></rect><rect x="69" y="3427" width="50" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="3447">acos</text><line x1="59" y1="3443" x2="69" y2="3443" class="line"></line><line x1="119" y1="3443" x2="129" y2="3443" class="line"></line><line x1="49" y1="3433" x2="49" y2="3453" class="line"></line><line x1="139" y1="3453" x2="139" y2="3433" class="line"></line><line x1="49" y1="3453" x2="49" y2="3477" class="line"></line><line x1="139" y1="3477" x2="139" y2="3453" class="line"></line><path d="M49 3477 Q49 3487 59 3487" class="line"></path><path d="M129 3487 Q139 3487 139 3477" class="line"></path><rect x="71" y="3473" width="46" height="32" rx="10"></rect><rect x="69" y="3471" width="46" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="3491">asin</text><line x1="59" y1="3487" x2="69" y2="3487" class="line"></line><line x1="115" y1="3487" x2="125" y2="3487" class="line"></line><line x1="125" y1="3487" x2="129" y2="3487" class="line"></line><line x1="49" y1="3477" x2="49" y2="3497" class="line"></line><line x1="139" y1="3497" x2="139" y2="3477" class="line"></line><line x1="49" y1="3497" x2="49" y2="3521" class="line"></line><line x1="139" y1="3521" x2="139" y2="3497" class="line"></line><path d="M49 3521 Q49 3531 59 3531" class="line"></path><path d="M129 3531 Q139 3531 139 3521" class="line"></path><rect x="71" y="3517" width="48" height="32" rx="10"></rect><rect x="69" y="3515" width="48" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="3535">atan</text><line x1="59" y1="3531" x2="69" y2="3531" class="line"></line><line x1="117" y1="3531" x2="127" y2="3531" class="line"></line><line x1="127" y1="3531" x2="129" y2="3531" class="line"></line><line x1="49" y1="3521" x2="49" y2="3541" class="line"></line><line x1="139" y1="3541" x2="139" y2="3521" class="line"></line><line x1="49" y1="3541" x2="49" y2="3565" class="line"></line><line x1="139" y1="3565" x2="139" y2="3541" class="line"></line><path d="M49 3565 Q49 3575 59 3575" class="line"></path><path d="M129 3575 Q139 3575 139 3565" class="line"></path><rect x="71" y="3561" width="42" height="32" rx="10"></rect><rect x="69" y="3559" width="42" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="3579">cos</text><line x1="59" y1="3575" x2="69" y2="3575" class="line"></line><line x1="111" y1="3575" x2="121" y2="3575" class="line"></line><line x1="121" y1="3575" x2="129" y2="3575" class="line"></line><line x1="49" y1="3565" x2="49" y2="3585" class="line"></line><line x1="139" y1="3585" x2="139" y2="3565" class="line"></line><line x1="49" y1="3585" x2="49" y2="3609" class="line"></line><line x1="139" y1="3609" x2="139" y2="3585" class="line"></line><path d="M49 3609 Q49 3619 59 3619" class="line"></path><path d="M129 3619 Q139 3619 139 3609" class="line"></path><rect x="71" y="3605" width="38" height="32" rx="10"></rect><rect x="69" y="3603" width="38" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="3623">sin</text><line x1="59" y1="3619" x2="69" y2="3619" class="line"></line><line x1="107" y1="3619" x2="117" y2="3619" class="line"></line><line x1="117" y1="3619" x2="129" y2="3619" class="line"></line><line x1="49" y1="3609" x2="49" y2="3629" class="line"></line><line x1="139" y1="3629" x2="139" y2="3609" class="line"></line><line x1="49" y1="3629" x2="49" y2="3653" class="line"></line><line x1="139" y1="3653" x2="139" y2="3629" class="line"></line><path d="M49 3653 Q49 3663 59 3663" class="line"></path><path d="M129 3663 Q139 3663 139 3653" class="line"></path><rect x="71" y="3649" width="40" height="32" rx="10"></rect><rect x="69" y="3647" width="40" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="3667">tan</text><line x1="59" y1="3663" x2="69" y2="3663" class="line"></line><line x1="109" y1="3663" x2="119" y2="3663" class="line"></line><line x1="119" y1="3663" x2="129" y2="3663" class="line"></line><line x1="49" y1="3653" x2="49" y2="3673" class="line"></line><line x1="139" y1="3673" x2="139" y2="3653" class="line"></line><line x1="49" y1="3673" x2="49" y2="3697" class="line"></line><line x1="139" y1="3697" x2="139" y2="3673" class="line"></line><path d="M49 3697 Q49 3707 59 3707" class="line"></path><path d="M129 3707 Q139 3707 139 3697" class="line"></path><rect x="71" y="3693" width="40" height="32" rx="10"></rect><rect x="69" y="3691" width="40" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="3711">cot</text><line x1="59" y1="3707" x2="69" y2="3707" class="line"></line><line x1="109" y1="3707" x2="119" y2="3707" class="line"></line><line x1="119" y1="3707" x2="129" y2="3707" class="line"></line><line x1="49" y1="3697" x2="49" y2="3717" class="line"></line><line x1="139" y1="3717" x2="139" y2="3697" class="line"></line><line x1="49" y1="3717" x2="49" y2="3741" class="line"></line><line x1="139" y1="3741" x2="139" y2="3717" class="line"></line><path d="M49 3741 Q49 3751 59 3751" class="line"></path><path d="M129 3751 Q139 3751 139 3741" class="line"></path><rect x="71" y="3737" width="46" height="32" rx="10"></rect><rect x="69" y="3735" width="46" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="3755">sinh</text><line x1="59" y1="3751" x2="69" y2="3751" class="line"></line><line x1="115" y1="3751" x2="125" y2="3751" class="line"></line><line x1="125" y1="3751" x2="129" y2="3751" class="line"></line><line x1="49" y1="3741" x2="49" y2="3761" class="line"></line><line x1="139" y1="3761" x2="139" y2="3741" class="line"></line><line x1="49" y1="3761" x2="49" y2="3785" class="line"></line><line x1="139" y1="3785" x2="139" y2="3761" class="line"></line><path d="M49 3785 Q49 3795 59 3795" class="line"></path><path d="M129 3795 Q139 3795 139 3785" class="line"></path><rect x="71" y="3781" width="50" height="32" rx="10"></rect><rect x="69" y="3779" width="50" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="3799">cosh</text><line x1="59" y1="3795" x2="69" y2="3795" class="line"></line><line x1="119" y1="3795" x2="129" y2="3795" class="line"></line><line x1="49" y1="3785" x2="49" y2="3805" class="line"></line><line x1="139" y1="3805" x2="139" y2="3785" class="line"></line><line x1="49" y1="3805" x2="49" y2="3829" class="line"></line><line x1="139" y1="3829" x2="139" y2="3805" class="line"></line><path d="M49 3829 Q49 3839 59 3839" class="line"></path><path d="M129 3839 Q139 3839 139 3829" class="line"></path><rect x="71" y="3825" width="48" height="32" rx="10"></rect><rect x="69" y="3823" width="48" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="3843">tanh</text><line x1="59" y1="3839" x2="69" y2="3839" class="line"></line><line x1="117" y1="3839" x2="127" y2="3839" class="line"></line><line x1="127" y1="3839" x2="129" y2="3839" class="line"></line><line x1="49" y1="3829" x2="49" y2="3849" class="line"></line><line x1="139" y1="3849" x2="139" y2="3829" class="line"></line><line x1="49" y1="3849" x2="49" y2="3873" class="line"></line><line x1="139" y1="3873" x2="139" y2="3849" class="line"></line><path d="M49 3873 Q49 3883 59 3883" class="line"></path><path d="M129 3883 Q139 3883 139 3873" class="line"></path><rect x="71" y="3869" width="48" height="32" rx="10"></rect><rect x="69" y="3867" width="48" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="3887">coth</text><line x1="59" y1="3883" x2="69" y2="3883" class="line"></line><line x1="117" y1="3883" x2="127" y2="3883" class="line"></line><line x1="127" y1="3883" x2="129" y2="3883" class="line"></line><line x1="49" y1="3873" x2="49" y2="3893" class="line"></line><line x1="139" y1="3893" x2="139" y2="3873" class="line"></line><line x1="49" y1="3893" x2="49" y2="3917" class="line"></line><line x1="139" y1="3917" x2="139" y2="3893" class="line"></line><path d="M49 3917 Q49 3927 59 3927" class="line"></path><path d="M129 3927 Q139 3927 139 3917" class="line"></path><rect x="71" y="3913" width="44" height="32" rx="10"></rect><rect x="69" y="3911" width="44" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="3931">deg</text><line x1="59" y1="3927" x2="69" y2="3927" class="line"></line><line x1="113" y1="3927" x2="123" y2="3927" class="line"></line><line x1="123" y1="3927" x2="129" y2="3927" class="line"></line><line x1="49" y1="3917" x2="49" y2="3937" class="line"></line><line x1="139" y1="3937" x2="139" y2="3917" class="line"></line><line x1="49" y1="3937" x2="49" y2="3961" class="line"></line><line x1="139" y1="3961" x2="139" y2="3937" class="line"></line><path d="M49 3961 Q49 3971 59 3971" class="line"></path><path d="M129 3971 Q139 3971 139 3961" class="line"></path><rect x="71" y="3957" width="42" height="32" rx="10"></rect><rect x="69" y="3955" width="42" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="3975">rad</text><line x1="59" y1="3971" x2="69" y2="3971" class="line"></line><line x1="111" y1="3971" x2="121" y2="3971" class="line"></line><line x1="121" y1="3971" x2="129" y2="3971" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="161" y="3121" width="56" height="32"></rect><rect x="159" y="3119" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="169" y="3139">FIELD</text></a><line x1="149" y1="3135" x2="159" y2="3135" class="line"></line><line x1="215" y1="3135" x2="225" y2="3135" class="line"></line><line x1="225" y1="3135" x2="847" y2="3135" class="line"></line><line x1="29" y1="3125" x2="29" y2="3145" class="line"></line><line x1="857" y1="3145" x2="857" y2="3125" class="line"></line><line x1="29" y1="3145" x2="29" y2="4005" class="line"></line><line x1="857" y1="4005" x2="857" y2="3145" class="line"></line><path d="M29 4005 Q29 4015 39 4015" class="line"></path><path d="M847 4015 Q857 4015 857 4005" class="line"></path><rect x="71" y="4001" width="40" height="32" rx="10"></rect><rect x="69" y="3999" width="40" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="4019">log</text><line x1="59" y1="4015" x2="69" y2="4015" class="line"></line><line x1="109" y1="4015" x2="119" y2="4015" class="line"></line><line x1="119" y1="4015" x2="141" y2="4015" class="line"></line><line x1="39" y1="4015" x2="59" y2="4015" class="line"></line><line x1="141" y1="4015" x2="161" y2="4015" class="line"></line><path d="M39 4015 Q49 4015 49 4025" class="line"></path><path d="M151 4025 Q151 4015 161 4015" class="line"></path><line x1="49" y1="4025" x2="49" y2="4049" class="line"></line><line x1="151" y1="4049" x2="151" y2="4025" class="line"></line><path d="M49 4049 Q49 4059 59 4059" class="line"></path><path d="M141 4059 Q151 4059 151 4049" class="line"></path><rect x="71" y="4045" width="62" height="32" rx="10"></rect><rect x="69" y="4043" width="62" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="4063">power</text><line x1="59" y1="4059" x2="69" y2="4059" class="line"></line><line x1="131" y1="4059" x2="141" y2="4059" class="line"></line><line x1="49" y1="4049" x2="49" y2="4069" class="line"></line><line x1="151" y1="4069" x2="151" y2="4049" class="line"></line><line x1="49" y1="4069" x2="49" y2="4093" class="line"></line><line x1="151" y1="4093" x2="151" y2="4069" class="line"></line><path d="M49 4093 Q49 4103 59 4103" class="line"></path><path d="M141 4103 Q151 4103 151 4093" class="line"></path><rect x="71" y="4089" width="58" height="32" rx="10"></rect><rect x="69" y="4087" width="58" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="4107">atan2</text><line x1="59" y1="4103" x2="69" y2="4103" class="line"></line><line x1="127" y1="4103" x2="137" y2="4103" class="line"></line><line x1="137" y1="4103" x2="141" y2="4103" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="173" y="4001" width="56" height="32"></rect><rect x="171" y="3999" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="181" y="4019">FIELD</text></a><line x1="161" y1="4015" x2="171" y2="4015" class="line"></line><line x1="227" y1="4015" x2="237" y2="4015" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="249" y="4001" width="56" height="32"></rect><rect x="247" y="3999" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="257" y="4019">FIELD</text></a><line x1="237" y1="4015" x2="247" y2="4015" class="line"></line><line x1="303" y1="4015" x2="313" y2="4015" class="line"></line><line x1="313" y1="4015" x2="847" y2="4015" class="line"></line><line x1="29" y1="4005" x2="29" y2="4025" class="line"></line><line x1="857" y1="4025" x2="857" y2="4005" class="line"></line><line x1="29" y1="4025" x2="29" y2="4137" class="line"></line><line x1="857" y1="4137" x2="857" y2="4025" class="line"></line><path d="M29 4137 Q29 4147 39 4147" class="line"></path><path d="M847 4147 Q857 4147 857 4137" class="line"></path><rect x="51" y="4133" width="58" height="32" rx="10"></rect><rect x="49" y="4131" width="58" height="32" class="terminal" rx="10"></rect><text class="terminal" x="59" y="4151">round</text><line x1="39" y1="4147" x2="49" y2="4147" class="line"></line><line x1="107" y1="4147" x2="117" y2="4147" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="129" y="4133" width="56" height="32"></rect><rect x="127" y="4131" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="137" y="4151">FIELD</text></a><line x1="117" y1="4147" x2="127" y2="4147" class="line"></line><line x1="183" y1="4147" x2="193" y2="4147" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="225" y="4133" width="56" height="32"></rect><rect x="223" y="4131" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="233" y="4151">FIELD</text></a><line x1="213" y1="4147" x2="223" y2="4147" class="line"></line><line x1="279" y1="4147" x2="289" y2="4147" class="line"></line><line x1="193" y1="4147" x2="213" y2="4147" class="line"></line><line x1="289" y1="4147" x2="309" y2="4147" class="line"></line><path d="M193 4147 Q203 4147 203 4157" class="line"></path><path d="M299 4157 Q299 4147 309 4147" class="line"></path><line x1="203" y1="4157" x2="203" y2="4171" class="line"></line><line x1="299" y1="4171" x2="299" y2="4157" class="line"></line><path d="M203 4171 Q203 4181 213 4181" class="line"></path><path d="M289 4181 Q299 4181 299 4171" class="line"></path><line x1="213" y1="4181" x2="223" y2="4181" class="line"></line><line x1="223" y1="4181" x2="289" y2="4181" class="line"></line><line x1="309" y1="4147" x2="847" y2="4147" class="line"></line><line x1="29" y1="4137" x2="29" y2="4157" class="line"></line><line x1="857" y1="4157" x2="857" y2="4137" class="line"></line><line x1="29" y1="4157" x2="29" y2="4203" class="line"></line><line x1="857" y1="4203" x2="857" y2="4157" class="line"></line><path d="M29 4203 Q29 4213 39 4213" class="line"></path><path d="M847 4213 Q857 4213 857 4203" class="line"></path><a xlink:href="#AGGREGATE_FUNCTION" xlink:title="AGGREGATE_FUNCTION"><rect x="51" y="4199" width="166" height="32"></rect><rect x="49" y="4197" width="166" height="32" class="nonterminal"></rect><text class="nonterminal" x="59" y="4217">AGGREGATE_FUNCTION</text></a><line x1="39" y1="4213" x2="49" y2="4213" class="line"></line><line x1="215" y1="4213" x2="225" y2="4213" class="line"></line><rect x="257" y="4199" width="50" height="32" rx="10"></rect><rect x="255" y="4197" width="50" height="32" class="terminal" rx="10"></rect><text class="terminal" x="265" y="4217">over</text><line x1="245" y1="4213" x2="255" y2="4213" class="line"></line><line x1="305" y1="4213" x2="315" y2="4213" class="line"></line><a xlink:href="#PARTITION_CLAUSE" xlink:title="PARTITION_CLAUSE"><rect x="327" y="4199" width="144" height="32"></rect><rect x="325" y="4197" width="144" height="32" class="nonterminal"></rect><text class="nonterminal" x="335" y="4217">PARTITION_CLAUSE</text></a><line x1="315" y1="4213" x2="325" y2="4213" class="line"></line><line x1="469" y1="4213" x2="479" y2="4213" class="line"></line><line x1="225" y1="4213" x2="245" y2="4213" class="line"></line><line x1="479" y1="4213" x2="499" y2="4213" class="line"></line><path d="M225 4213 Q235 4213 235 4223" class="line"></path><path d="M489 4223 Q489 4213 499 4213" class="line"></path><line x1="235" y1="4223" x2="235" y2="4237" class="line"></line><line x1="489" y1="4237" x2="489" y2="4223" class="line"></line><path d="M235 4237 Q235 4247 245 4247" class="line"></path><path d="M479 4247 Q489 4247 489 4237" class="line"></path><line x1="245" y1="4247" x2="255" y2="4247" class="line"></line><line x1="255" y1="4247" x2="479" y2="4247" class="line"></line><line x1="499" y1="4213" x2="847" y2="4213" class="line"></line><line x1="870" y1="17" x2="867" y2="17" class="line"></line><polygon points="877 17 885 13 885 21" class="filled"></polygon><polygon points="877 17 869 13 869 21" class="filled"></polygon></svg><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml">referenced by:<xhtml:ul><xhtml:li><xhtml:a href="#AGGREGATE_FUNCTION" title="AGGREGATE_FUNCTION">AGGREGATE_FUNCTION</xhtml:a></xhtml:li><xhtml:li><xhtml:a href="#CONDITION" title="CONDITION">CONDITION</xhtml:a></xhtml:li><xhtml:li><xhtml:a href="#FIELD" title="FIELD">FIELD</xhtml:a></xhtml:li><xhtml:li><xhtml:a href="#GROUP_FIELD" title="GROUP_FIELD">GROUP_FIELD</xhtml:a></xhtml:li><xhtml:li><xhtml:a href="#INSERT" title="INSERT">INSERT</xhtml:a></xhtml:li><xhtml:li><xhtml:a href="#MERGE" title="MERGE">MERGE</xhtml:a></xhtml:li><xhtml:li><xhtml:a href="#PARTITION_CLAUSE" title="PARTITION_CLAUSE">PARTITION_CLAUSE</xhtml:a></xhtml:li><xhtml:li><xhtml:a href="#SELECT" title="SELECT">SELECT</xhtml:a></xhtml:li><xhtml:li><xhtml:a href="#SORT_FIELD" title="SORT_FIELD">SORT_FIELD</xhtml:a></xhtml:li><xhtml:li><xhtml:a href="#TABLE" title="TABLE">TABLE</xhtml:a></xhtml:li><xhtml:li><xhtml:a href="#UPDATE" title="UPDATE">UPDATE</xhtml:a></xhtml:li></xhtml:ul></xhtml:p><xhtml:br xmlns:xhtml="http://www.w3.org/1999/xhtml"></xhtml:br><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml" style="font-size: 14px; font-weight:bold"><xhtml:a name="AGGREGATE_FUNCTION">AGGREGATE_FUNCTION:</xhtml:a></xhtml:p><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="680" height="960"><defs><style type="text/css">
    -
    -    @namespace "http://www.w3.org/2000/svg";
    -    .line                 {fill: none; stroke: #332900;}
    -    filled                {fill: #332900; stroke: none;}
    -    text                  {font-family: Verdana, Sans-serif;
    -                            font-size: 12px;
    -                            fill: #4D3D00;
    -                          }
    -    text.terminal         {font-family: Verdana, Sans-serif;
    -                            font-size: 12px;
    -                            fill: #4D3D00;
    -                            font-weight: bold;
    -                          }
    -    rect, circle, polygon {fill: #332900; stroke: #332900;}
    -    rect.terminal         {fill: #FFCC00; stroke: #332900;}
    -    rect.nonterminal      {fill: #FFEB99; stroke: #332900;}
    -    rect.text             {fill: none; stroke: none;}    
    -    polygon.regexp        {fill: #FFF5CC; stroke: #332900;}
    -  </style></defs><polygon points="9 17 1 13 1 21" class="filled"></polygon><polygon points="17 17 9 13 9 21" class="filled"></polygon><line x1="17" y1="17" x2="19" y2="17" class="line"></line><rect x="51" y="3" width="56" height="32" rx="10"></rect><rect x="49" y="1" width="56" height="32" class="terminal" rx="10"></rect><text class="terminal" x="59" y="21">count</text><line x1="39" y1="17" x2="49" y2="17" class="line"></line><line x1="105" y1="17" x2="115" y2="17" class="line"></line><line x1="115" y1="17" x2="641" y2="17" class="line"></line><line x1="19" y1="17" x2="39" y2="17" class="line"></line><line x1="641" y1="17" x2="661" y2="17" class="line"></line><path d="M19 17 Q29 17 29 27" class="line"></path><path d="M651 27 Q651 17 661 17" class="line"></path><line x1="29" y1="27" x2="29" y2="51" class="line"></line><line x1="651" y1="51" x2="651" y2="27" class="line"></line><path d="M29 51 Q29 61 39 61" class="line"></path><path d="M641 61 Q651 61 651 51" class="line"></path><rect x="51" y="47" width="98" height="32" rx="10"></rect><rect x="49" y="45" width="98" height="32" class="terminal" rx="10"></rect><text class="terminal" x="59" y="65">rowNumber</text><line x1="39" y1="61" x2="49" y2="61" class="line"></line><line x1="147" y1="61" x2="157" y2="61" class="line"></line><line x1="157" y1="61" x2="641" y2="61" class="line"></line><line x1="29" y1="51" x2="29" y2="71" class="line"></line><line x1="651" y1="71" x2="651" y2="51" class="line"></line><line x1="29" y1="71" x2="29" y2="95" class="line"></line><line x1="651" y1="95" x2="651" y2="71" class="line"></line><path d="M29 95 Q29 105 39 105" class="line"></path><path d="M641 105 Q651 105 651 95" class="line"></path><rect x="51" y="91" width="50" height="32" rx="10"></rect><rect x="49" y="89" width="50" height="32" class="terminal" rx="10"></rect><text class="terminal" x="59" y="109">rank</text><line x1="39" y1="105" x2="49" y2="105" class="line"></line><line x1="99" y1="105" x2="109" y2="105" class="line"></line><line x1="109" y1="105" x2="641" y2="105" class="line"></line><line x1="29" y1="95" x2="29" y2="115" class="line"></line><line x1="651" y1="115" x2="651" y2="95" class="line"></line><line x1="29" y1="115" x2="29" y2="139" class="line"></line><line x1="651" y1="139" x2="651" y2="115" class="line"></line><path d="M29 139 Q29 149 39 149" class="line"></path><path d="M641 149 Q651 149 651 139" class="line"></path><rect x="51" y="135" width="92" height="32" rx="10"></rect><rect x="49" y="133" width="92" height="32" class="terminal" rx="10"></rect><text class="terminal" x="59" y="153">denseRank</text><line x1="39" y1="149" x2="49" y2="149" class="line"></line><line x1="141" y1="149" x2="151" y2="149" class="line"></line><line x1="151" y1="149" x2="641" y2="149" class="line"></line><line x1="29" y1="139" x2="29" y2="159" class="line"></line><line x1="651" y1="159" x2="651" y2="139" class="line"></line><line x1="29" y1="159" x2="29" y2="183" class="line"></line><line x1="651" y1="183" x2="651" y2="159" class="line"></line><path d="M29 183 Q29 193 39 193" class="line"></path><path d="M641 193 Q651 193 651 183" class="line"></path><rect x="51" y="179" width="102" height="32" rx="10"></rect><rect x="49" y="177" width="102" height="32" class="terminal" rx="10"></rect><text class="terminal" x="59" y="197">percentRank</text><line x1="39" y1="193" x2="49" y2="193" class="line"></line><line x1="151" y1="193" x2="161" y2="193" class="line"></line><line x1="161" y1="193" x2="641" y2="193" class="line"></line><line x1="29" y1="183" x2="29" y2="203" class="line"></line><line x1="651" y1="203" x2="651" y2="183" class="line"></line><line x1="29" y1="203" x2="29" y2="227" class="line"></line><line x1="651" y1="227" x2="651" y2="203" class="line"></line><path d="M29 227 Q29 237 39 237" class="line"></path><path d="M641 237 Q651 237 651 227" class="line"></path><rect x="51" y="223" width="80" height="32" rx="10"></rect><rect x="49" y="221" width="80" height="32" class="terminal" rx="10"></rect><text class="terminal" x="59" y="241">cumeDist</text><line x1="39" y1="237" x2="49" y2="237" class="line"></line><line x1="129" y1="237" x2="139" y2="237" class="line"></line><line x1="139" y1="237" x2="641" y2="237" class="line"></line><line x1="29" y1="227" x2="29" y2="247" class="line"></line><line x1="651" y1="247" x2="651" y2="227" class="line"></line><line x1="29" y1="247" x2="29" y2="271" class="line"></line><line x1="651" y1="271" x2="651" y2="247" class="line"></line><path d="M29 271 Q29 281 39 281" class="line"></path><path d="M641 281 Q651 281 651 271" class="line"></path><rect x="71" y="267" width="56" height="32" rx="10"></rect><rect x="69" y="265" width="56" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="285">count</text><line x1="59" y1="281" x2="69" y2="281" class="line"></line><line x1="125" y1="281" x2="135" y2="281" class="line"></line><line x1="135" y1="281" x2="185" y2="281" class="line"></line><line x1="39" y1="281" x2="59" y2="281" class="line"></line><line x1="185" y1="281" x2="205" y2="281" class="line"></line><path d="M39 281 Q49 281 49 291" class="line"></path><path d="M195 291 Q195 281 205 281" class="line"></path><line x1="49" y1="291" x2="49" y2="315" class="line"></line><line x1="195" y1="315" x2="195" y2="291" class="line"></line><path d="M49 315 Q49 325 59 325" class="line"></path><path d="M185 325 Q195 325 195 315" class="line"></path><rect x="71" y="311" width="106" height="32" rx="10"></rect><rect x="69" y="309" width="106" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="329">countDistinct</text><line x1="59" y1="325" x2="69" y2="325" class="line"></line><line x1="175" y1="325" x2="185" y2="325" class="line"></line><line x1="49" y1="315" x2="49" y2="335" class="line"></line><line x1="195" y1="335" x2="195" y2="315" class="line"></line><line x1="49" y1="335" x2="49" y2="359" class="line"></line><line x1="195" y1="359" x2="195" y2="335" class="line"></line><path d="M49 359 Q49 369 59 369" class="line"></path><path d="M185 369 Q195 369 195 359" class="line"></path><rect x="71" y="355" width="48" height="32" rx="10"></rect><rect x="69" y="353" width="48" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="373">max</text><line x1="59" y1="369" x2="69" y2="369" class="line"></line><line x1="117" y1="369" x2="127" y2="369" class="line"></line><line x1="127" y1="369" x2="185" y2="369" class="line"></line><line x1="49" y1="359" x2="49" y2="379" class="line"></line><line x1="195" y1="379" x2="195" y2="359" class="line"></line><line x1="49" y1="379" x2="49" y2="403" class="line"></line><line x1="195" y1="403" x2="195" y2="379" class="line"></line><path d="M49 403 Q49 413 59 413" class="line"></path><path d="M185 413 Q195 413 195 403" class="line"></path><rect x="71" y="399" width="44" height="32" rx="10"></rect><rect x="69" y="397" width="44" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="417">min</text><line x1="59" y1="413" x2="69" y2="413" class="line"></line><line x1="113" y1="413" x2="123" y2="413" class="line"></line><line x1="123" y1="413" x2="185" y2="413" class="line"></line><line x1="49" y1="403" x2="49" y2="423" class="line"></line><line x1="195" y1="423" x2="195" y2="403" class="line"></line><line x1="49" y1="423" x2="49" y2="447" class="line"></line><line x1="195" y1="447" x2="195" y2="423" class="line"></line><path d="M49 447 Q49 457 59 457" class="line"></path><path d="M185 457 Q195 457 195 447" class="line"></path><rect x="71" y="443" width="46" height="32" rx="10"></rect><rect x="69" y="441" width="46" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="461">sum</text><line x1="59" y1="457" x2="69" y2="457" class="line"></line><line x1="115" y1="457" x2="125" y2="457" class="line"></line><line x1="125" y1="457" x2="185" y2="457" class="line"></line><line x1="49" y1="447" x2="49" y2="467" class="line"></line><line x1="195" y1="467" x2="195" y2="447" class="line"></line><line x1="49" y1="467" x2="49" y2="491" class="line"></line><line x1="195" y1="491" x2="195" y2="467" class="line"></line><path d="M49 491 Q49 501 59 501" class="line"></path><path d="M185 501 Q195 501 195 491" class="line"></path><rect x="71" y="487" width="44" height="32" rx="10"></rect><rect x="69" y="485" width="44" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="505">avg</text><line x1="59" y1="501" x2="69" y2="501" class="line"></line><line x1="113" y1="501" x2="123" y2="501" class="line"></line><line x1="123" y1="501" x2="185" y2="501" class="line"></line><line x1="49" y1="491" x2="49" y2="511" class="line"></line><line x1="195" y1="511" x2="195" y2="491" class="line"></line><line x1="49" y1="511" x2="49" y2="535" class="line"></line><line x1="195" y1="535" x2="195" y2="511" class="line"></line><path d="M49 535 Q49 545 59 545" class="line"></path><path d="M185 545 Q195 545 195 535" class="line"></path><rect x="71" y="531" width="68" height="32" rx="10"></rect><rect x="69" y="529" width="68" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="549">median</text><line x1="59" y1="545" x2="69" y2="545" class="line"></line><line x1="137" y1="545" x2="147" y2="545" class="line"></line><line x1="147" y1="545" x2="185" y2="545" class="line"></line><line x1="49" y1="535" x2="49" y2="555" class="line"></line><line x1="195" y1="555" x2="195" y2="535" class="line"></line><line x1="49" y1="555" x2="49" y2="579" class="line"></line><line x1="195" y1="579" x2="195" y2="555" class="line"></line><path d="M49 579 Q49 589 59 589" class="line"></path><path d="M185 589 Q195 589 195 579" class="line"></path><rect x="71" y="575" width="88" height="32" rx="10"></rect><rect x="69" y="573" width="88" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="593">stddevPop</text><line x1="59" y1="589" x2="69" y2="589" class="line"></line><line x1="157" y1="589" x2="167" y2="589" class="line"></line><line x1="167" y1="589" x2="185" y2="589" class="line"></line><line x1="49" y1="579" x2="49" y2="599" class="line"></line><line x1="195" y1="599" x2="195" y2="579" class="line"></line><line x1="49" y1="599" x2="49" y2="623" class="line"></line><line x1="195" y1="623" x2="195" y2="599" class="line"></line><path d="M49 623 Q49 633 59 633" class="line"></path><path d="M185 633 Q195 633 195 623" class="line"></path><rect x="71" y="619" width="100" height="32" rx="10"></rect><rect x="69" y="617" width="100" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="637">stddevSamp</text><line x1="59" y1="633" x2="69" y2="633" class="line"></line><line x1="169" y1="633" x2="179" y2="633" class="line"></line><line x1="179" y1="633" x2="185" y2="633" class="line"></line><line x1="49" y1="623" x2="49" y2="643" class="line"></line><line x1="195" y1="643" x2="195" y2="623" class="line"></line><line x1="49" y1="643" x2="49" y2="667" class="line"></line><line x1="195" y1="667" x2="195" y2="643" class="line"></line><path d="M49 667 Q49 677 59 677" class="line"></path><path d="M185 677 Q195 677 195 667" class="line"></path><rect x="71" y="663" width="66" height="32" rx="10"></rect><rect x="69" y="661" width="66" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="681">varPop</text><line x1="59" y1="677" x2="69" y2="677" class="line"></line><line x1="135" y1="677" x2="145" y2="677" class="line"></line><line x1="145" y1="677" x2="185" y2="677" class="line"></line><line x1="49" y1="667" x2="49" y2="687" class="line"></line><line x1="195" y1="687" x2="195" y2="667" class="line"></line><line x1="49" y1="687" x2="49" y2="711" class="line"></line><line x1="195" y1="711" x2="195" y2="687" class="line"></line><path d="M49 711 Q49 721 59 721" class="line"></path><path d="M185 721 Q195 721 195 711" class="line"></path><rect x="71" y="707" width="78" height="32" rx="10"></rect><rect x="69" y="705" width="78" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="725">varSamp</text><line x1="59" y1="721" x2="69" y2="721" class="line"></line><line x1="147" y1="721" x2="157" y2="721" class="line"></line><line x1="157" y1="721" x2="185" y2="721" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="217" y="267" width="56" height="32"></rect><rect x="215" y="265" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="225" y="285">FIELD</text></a><line x1="205" y1="281" x2="215" y2="281" class="line"></line><line x1="271" y1="281" x2="281" y2="281" class="line"></line><line x1="281" y1="281" x2="641" y2="281" class="line"></line><line x1="29" y1="271" x2="29" y2="291" class="line"></line><line x1="651" y1="291" x2="651" y2="271" class="line"></line><line x1="29" y1="291" x2="29" y2="755" class="line"></line><line x1="651" y1="755" x2="651" y2="291" class="line"></line><path d="M29 755 Q29 765 39 765" class="line"></path><path d="M641 765 Q651 765 651 755" class="line"></path><rect x="51" y="751" width="48" height="32" rx="10"></rect><rect x="49" y="749" width="48" height="32" class="terminal" rx="10"></rect><text class="terminal" x="59" y="769">ntile</text><line x1="39" y1="765" x2="49" y2="765" class="line"></line><line x1="97" y1="765" x2="107" y2="765" class="line"></line><a xlink:href="#INT" xlink:title="INT"><rect x="119" y="751" width="40" height="32"></rect><rect x="117" y="749" width="40" height="32" class="nonterminal"></rect><text class="nonterminal" x="127" y="769">INT</text></a><line x1="107" y1="765" x2="117" y2="765" class="line"></line><line x1="157" y1="765" x2="167" y2="765" class="line"></line><line x1="167" y1="765" x2="641" y2="765" class="line"></line><line x1="29" y1="755" x2="29" y2="775" class="line"></line><line x1="651" y1="775" x2="651" y2="755" class="line"></line><line x1="29" y1="775" x2="29" y2="799" class="line"></line><line x1="651" y1="799" x2="651" y2="775" class="line"></line><path d="M29 799 Q29 809 39 809" class="line"></path><path d="M641 809 Q651 809 651 799" class="line"></path><rect x="91" y="795" width="84" height="32" rx="10"></rect><rect x="89" y="793" width="84" height="32" class="terminal" rx="10"></rect><text class="terminal" x="99" y="813">firstValue</text><line x1="79" y1="809" x2="89" y2="809" class="line"></line><line x1="173" y1="809" x2="183" y2="809" class="line"></line><line x1="59" y1="809" x2="79" y2="809" class="line"></line><line x1="183" y1="809" x2="203" y2="809" class="line"></line><path d="M59 809 Q69 809 69 819" class="line"></path><path d="M193 819 Q193 809 203 809" class="line"></path><line x1="69" y1="819" x2="69" y2="843" class="line"></line><line x1="193" y1="843" x2="193" y2="819" class="line"></line><path d="M69 843 Q69 853 79 853" class="line"></path><path d="M183 853 Q193 853 193 843" class="line"></path><rect x="91" y="839" width="80" height="32" rx="10"></rect><rect x="89" y="837" width="80" height="32" class="terminal" rx="10"></rect><text class="terminal" x="99" y="857">lastValue</text><line x1="79" y1="853" x2="89" y2="853" class="line"></line><line x1="169" y1="853" x2="179" y2="853" class="line"></line><line x1="179" y1="853" x2="183" y2="853" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="215" y="795" width="56" height="32"></rect><rect x="213" y="793" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="223" y="813">FIELD</text></a><line x1="203" y1="809" x2="213" y2="809" class="line"></line><line x1="269" y1="809" x2="279" y2="809" class="line"></line><line x1="279" y1="809" x2="459" y2="809" class="line"></line><line x1="39" y1="809" x2="59" y2="809" class="line"></line><line x1="459" y1="809" x2="479" y2="809" class="line"></line><path d="M39 809 Q49 809 49 819" class="line"></path><path d="M469 819 Q469 809 479 809" class="line"></path><line x1="49" y1="819" x2="49" y2="887" class="line"></line><line x1="469" y1="887" x2="469" y2="819" class="line"></line><path d="M49 887 Q49 897 59 897" class="line"></path><path d="M459 897 Q469 897 469 887" class="line"></path><rect x="91" y="883" width="48" height="32" rx="10"></rect><rect x="89" y="881" width="48" height="32" class="terminal" rx="10"></rect><text class="terminal" x="99" y="901">lead</text><line x1="79" y1="897" x2="89" y2="897" class="line"></line><line x1="137" y1="897" x2="147" y2="897" class="line"></line><line x1="59" y1="897" x2="79" y2="897" class="line"></line><line x1="147" y1="897" x2="167" y2="897" class="line"></line><path d="M59 897 Q69 897 69 907" class="line"></path><path d="M157 907 Q157 897 167 897" class="line"></path><line x1="69" y1="907" x2="69" y2="931" class="line"></line><line x1="157" y1="931" x2="157" y2="907" class="line"></line><path d="M69 931 Q69 941 79 941" class="line"></path><path d="M147 941 Q157 941 157 931" class="line"></path><rect x="91" y="927" width="40" height="32" rx="10"></rect><rect x="89" y="925" width="40" height="32" class="terminal" rx="10"></rect><text class="terminal" x="99" y="945">lag</text><line x1="79" y1="941" x2="89" y2="941" class="line"></line><line x1="129" y1="941" x2="139" y2="941" class="line"></line><line x1="139" y1="941" x2="147" y2="941" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="179" y="883" width="56" height="32"></rect><rect x="177" y="881" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="187" y="901">FIELD</text></a><line x1="167" y1="897" x2="177" y2="897" class="line"></line><line x1="233" y1="897" x2="243" y2="897" class="line"></line><a xlink:href="#INT" xlink:title="INT"><rect x="275" y="883" width="40" height="32"></rect><rect x="273" y="881" width="40" height="32" class="nonterminal"></rect><text class="nonterminal" x="283" y="901">INT</text></a><line x1="263" y1="897" x2="273" y2="897" class="line"></line><line x1="313" y1="897" x2="323" y2="897" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="355" y="883" width="56" height="32"></rect><rect x="353" y="881" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="363" y="901">FIELD</text></a><line x1="343" y1="897" x2="353" y2="897" class="line"></line><line x1="409" y1="897" x2="419" y2="897" class="line"></line><line x1="323" y1="897" x2="343" y2="897" class="line"></line><line x1="419" y1="897" x2="439" y2="897" class="line"></line><path d="M323 897 Q333 897 333 907" class="line"></path><path d="M429 907 Q429 897 439 897" class="line"></path><line x1="333" y1="907" x2="333" y2="921" class="line"></line><line x1="429" y1="921" x2="429" y2="907" class="line"></line><path d="M333 921 Q333 931 343 931" class="line"></path><path d="M419 931 Q429 931 429 921" class="line"></path><line x1="343" y1="931" x2="353" y2="931" class="line"></line><line x1="353" y1="931" x2="419" y2="931" class="line"></line><line x1="243" y1="897" x2="263" y2="897" class="line"></line><line x1="439" y1="897" x2="459" y2="897" class="line"></line><path d="M243 897 Q253 897 253 907" class="line"></path><path d="M449 907 Q449 897 459 897" class="line"></path><line x1="253" y1="907" x2="253" y2="937" class="line"></line><line x1="449" y1="937" x2="449" y2="907" class="line"></line><path d="M253 937 Q253 947 263 947" class="line"></path><path d="M439 947 Q449 947 449 937" class="line"></path><line x1="263" y1="947" x2="273" y2="947" class="line"></line><line x1="273" y1="947" x2="439" y2="947" class="line"></line><rect x="511" y="795" width="94" height="32" rx="10"></rect><rect x="509" y="793" width="94" height="32" class="terminal" rx="10"></rect><text class="terminal" x="519" y="813">ignoreNulls</text><line x1="499" y1="809" x2="509" y2="809" class="line"></line><line x1="603" y1="809" x2="613" y2="809" class="line"></line><line x1="613" y1="809" x2="621" y2="809" class="line"></line><line x1="479" y1="809" x2="499" y2="809" class="line"></line><line x1="621" y1="809" x2="641" y2="809" class="line"></line><path d="M479 809 Q489 809 489 819" class="line"></path><path d="M631 819 Q631 809 641 809" class="line"></path><line x1="489" y1="819" x2="489" y2="843" class="line"></line><line x1="631" y1="843" x2="631" y2="819" class="line"></line><path d="M489 843 Q489 853 499 853" class="line"></path><path d="M621 853 Q631 853 631 843" class="line"></path><rect x="511" y="839" width="102" height="32" rx="10"></rect><rect x="509" y="837" width="102" height="32" class="terminal" rx="10"></rect><text class="terminal" x="519" y="857">respectNulls</text><line x1="499" y1="853" x2="509" y2="853" class="line"></line><line x1="611" y1="853" x2="621" y2="853" class="line"></line><line x1="489" y1="843" x2="489" y2="863" class="line"></line><line x1="631" y1="863" x2="631" y2="843" class="line"></line><line x1="489" y1="863" x2="489" y2="877" class="line"></line><line x1="631" y1="877" x2="631" y2="863" class="line"></line><path d="M489 877 Q489 887 499 887" class="line"></path><path d="M621 887 Q631 887 631 877" class="line"></path><line x1="499" y1="887" x2="509" y2="887" class="line"></line><line x1="509" y1="887" x2="621" y2="887" class="line"></line><line x1="664" y1="17" x2="661" y2="17" class="line"></line><polygon points="671 17 679 13 679 21" class="filled"></polygon><polygon points="671 17 663 13 663 21" class="filled"></polygon></svg><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml">referenced by:<xhtml:ul><xhtml:li><xhtml:a href="#FIELD" title="FIELD">FIELD</xhtml:a></xhtml:li><xhtml:li><xhtml:a href="#TABLE" title="TABLE">TABLE</xhtml:a></xhtml:li></xhtml:ul></xhtml:p><xhtml:br xmlns:xhtml="http://www.w3.org/1999/xhtml"></xhtml:br><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml" style="font-size: 14px; font-weight:bold"><xhtml:a name="PARTITION_CLAUSE">PARTITION_CLAUSE:</xhtml:a></xhtml:p><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="954" height="622"><defs><style type="text/css">
    -
    -    @namespace "http://www.w3.org/2000/svg";
    -    .line                 {fill: none; stroke: #332900;}
    -    filled                {fill: #332900; stroke: none;}
    -    text                  {font-family: Verdana, Sans-serif;
    -                            font-size: 12px;
    -                            fill: #4D3D00;
    -                          }
    -    text.terminal         {font-family: Verdana, Sans-serif;
    -                            font-size: 12px;
    -                            fill: #4D3D00;
    -                            font-weight: bold;
    -                          }
    -    rect, circle, polygon {fill: #332900; stroke: #332900;}
    -    rect.terminal         {fill: #FFCC00; stroke: #332900;}
    -    rect.nonterminal      {fill: #FFEB99; stroke: #332900;}
    -    rect.text             {fill: none; stroke: none;}    
    -    polygon.regexp        {fill: #FFF5CC; stroke: #332900;}
    -  </style></defs><polygon points="11 33 3 29 3 37" class="filled"></polygon><polygon points="19 33 11 29 11 37" class="filled"></polygon><line x1="19" y1="33" x2="21" y2="33" class="line"></line><rect x="53" y="19" width="92" height="32" rx="10"></rect><rect x="51" y="17" width="92" height="32" class="terminal" rx="10"></rect><text class="terminal" x="61" y="37">partitionBy</text><line x1="41" y1="33" x2="51" y2="33" class="line"></line><line x1="143" y1="33" x2="153" y2="33" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="185" y="19" width="56" height="32"></rect><rect x="183" y="17" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="193" y="37">FIELD</text></a><line x1="173" y1="33" x2="183" y2="33" class="line"></line><line x1="239" y1="33" x2="249" y2="33" class="line"></line><path d="M153 33 L173 33 M172 33 Q163 33 163 23 L163 11 Q163 1 173 1" class="line"></path><path d="M249 33 L269 33 M249 33 Q259 33 259 23 L259 11 Q259 1 249 1" class="line"></path><line x1="173" y1="1" x2="183" y2="1" class="line"></line><line x1="183" y1="1" x2="249" y2="1" class="line"></line><line x1="21" y1="33" x2="41" y2="33" class="line"></line><line x1="269" y1="33" x2="289" y2="33" class="line"></line><path d="M21 33 Q31 33 31 43" class="line"></path><path d="M279 43 Q279 33 289 33" class="line"></path><line x1="31" y1="43" x2="31" y2="67" class="line"></line><line x1="279" y1="67" x2="279" y2="43" class="line"></line><path d="M31 67 Q31 77 41 77" class="line"></path><path d="M269 77 Q279 77 279 67" class="line"></path><rect x="53" y="63" width="120" height="32" rx="10"></rect><rect x="51" y="61" width="120" height="32" class="terminal" rx="10"></rect><text class="terminal" x="61" y="81">partitionByOne</text><line x1="41" y1="77" x2="51" y2="77" class="line"></line><line x1="171" y1="77" x2="181" y2="77" class="line"></line><line x1="181" y1="77" x2="269" y2="77" class="line"></line><line x1="31" y1="67" x2="31" y2="87" class="line"></line><line x1="279" y1="87" x2="279" y2="67" class="line"></line><line x1="31" y1="87" x2="31" y2="101" class="line"></line><line x1="279" y1="101" x2="279" y2="87" class="line"></line><path d="M31 101 Q31 111 41 111" class="line"></path><path d="M269 111 Q279 111 279 101" class="line"></path><line x1="41" y1="111" x2="51" y2="111" class="line"></line><line x1="51" y1="111" x2="269" y2="111" class="line"></line><path class="line" d="M291 33 L293 33 M295 33 L297 33 M299 33 L301 33 M1 175 L3 175 M5 175 L7 175 M9 175 L11 175"></path><rect x="45" y="161" width="72" height="32" rx="10"></rect><rect x="43" y="159" width="72" height="32" class="terminal" rx="10"></rect><text class="terminal" x="53" y="179">orderBy</text><line x1="33" y1="175" x2="43" y2="175" class="line"></line><line x1="115" y1="175" x2="125" y2="175" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="177" y="161" width="56" height="32"></rect><rect x="175" y="159" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="185" y="179">FIELD</text></a><line x1="165" y1="175" x2="175" y2="175" class="line"></line><line x1="231" y1="175" x2="241" y2="175" class="line"></line><path d="M145 175 L165 175 M164 175 Q155 175 155 165 L155 153 Q155 143 165 143" class="line"></path><path d="M241 175 L261 175 M241 175 Q251 175 251 165 L251 153 Q251 143 241 143" class="line"></path><line x1="165" y1="143" x2="175" y2="143" class="line"></line><line x1="175" y1="143" x2="241" y2="143" class="line"></line><line x1="261" y1="175" x2="301" y2="175" class="line"></line><line x1="125" y1="175" x2="145" y2="175" class="line"></line><line x1="301" y1="175" x2="321" y2="175" class="line"></line><path d="M125 175 Q135 175 135 185" class="line"></path><path d="M311 185 Q311 175 321 175" class="line"></path><line x1="135" y1="185" x2="135" y2="231" class="line"></line><line x1="311" y1="231" x2="311" y2="185" class="line"></line><path d="M135 231 Q135 241 145 241" class="line"></path><path d="M301 241 Q311 241 311 231" class="line"></path><a xlink:href="#SORT_FIELD" xlink:title="SORT_FIELD"><rect x="177" y="227" width="96" height="32"></rect><rect x="175" y="225" width="96" height="32" class="nonterminal"></rect><text class="nonterminal" x="185" y="245">SORT_FIELD</text></a><line x1="165" y1="241" x2="175" y2="241" class="line"></line><line x1="271" y1="241" x2="281" y2="241" class="line"></line><path d="M145 241 L165 241 M164 241 Q155 241 155 231 L155 219 Q155 209 165 209" class="line"></path><path d="M281 241 L301 241 M281 241 Q291 241 291 231 L291 219 Q291 209 281 209" class="line"></path><line x1="165" y1="209" x2="175" y2="209" class="line"></line><line x1="175" y1="209" x2="281" y2="209" class="line"></line><rect x="353" y="161" width="192" height="32" rx="10"></rect><rect x="351" y="159" width="192" height="32" class="terminal" rx="10"></rect><text class="terminal" x="361" y="179">rowsUnboundedPreceding</text><line x1="341" y1="175" x2="351" y2="175" class="line"></line><line x1="543" y1="175" x2="553" y2="175" class="line"></line><line x1="553" y1="175" x2="895" y2="175" class="line"></line><line x1="321" y1="175" x2="341" y2="175" class="line"></line><line x1="895" y1="175" x2="915" y2="175" class="line"></line><path d="M321 175 Q331 175 331 185" class="line"></path><path d="M905 185 Q905 175 915 175" class="line"></path><line x1="331" y1="185" x2="331" y2="209" class="line"></line><line x1="905" y1="209" x2="905" y2="185" class="line"></line><path d="M331 209 Q331 219 341 219" class="line"></path><path d="M895 219 Q905 219 905 209" class="line"></path><rect x="353" y="205" width="118" height="32" rx="10"></rect><rect x="351" y="203" width="118" height="32" class="terminal" rx="10"></rect><text class="terminal" x="361" y="223">rowsPreceding</text><line x1="341" y1="219" x2="351" y2="219" class="line"></line><line x1="469" y1="219" x2="479" y2="219" class="line"></line><a xlink:href="#INT" xlink:title="INT"><rect x="491" y="205" width="40" height="32"></rect><rect x="489" y="203" width="40" height="32" class="nonterminal"></rect><text class="nonterminal" x="499" y="223">INT</text></a><line x1="479" y1="219" x2="489" y2="219" class="line"></line><line x1="529" y1="219" x2="539" y2="219" class="line"></line><line x1="539" y1="219" x2="895" y2="219" class="line"></line><line x1="331" y1="209" x2="331" y2="229" class="line"></line><line x1="905" y1="229" x2="905" y2="209" class="line"></line><line x1="331" y1="229" x2="331" y2="253" class="line"></line><line x1="905" y1="253" x2="905" y2="229" class="line"></line><path d="M331 253 Q331 263 341 263" class="line"></path><path d="M895 263 Q905 263 905 253" class="line"></path><rect x="353" y="249" width="132" height="32" rx="10"></rect><rect x="351" y="247" width="132" height="32" class="terminal" rx="10"></rect><text class="terminal" x="361" y="267">rowsCurrentRow</text><line x1="341" y1="263" x2="351" y2="263" class="line"></line><line x1="483" y1="263" x2="493" y2="263" class="line"></line><line x1="493" y1="263" x2="895" y2="263" class="line"></line><line x1="331" y1="253" x2="331" y2="273" class="line"></line><line x1="905" y1="273" x2="905" y2="253" class="line"></line><line x1="331" y1="273" x2="331" y2="297" class="line"></line><line x1="905" y1="297" x2="905" y2="273" class="line"></line><path d="M331 297 Q331 307 341 307" class="line"></path><path d="M895 307 Q905 307 905 297" class="line"></path><rect x="353" y="293" width="190" height="32" rx="10"></rect><rect x="351" y="291" width="190" height="32" class="terminal" rx="10"></rect><text class="terminal" x="361" y="311">rowsUnboundedFollowing</text><line x1="341" y1="307" x2="351" y2="307" class="line"></line><line x1="541" y1="307" x2="551" y2="307" class="line"></line><line x1="551" y1="307" x2="895" y2="307" class="line"></line><line x1="331" y1="297" x2="331" y2="317" class="line"></line><line x1="905" y1="317" x2="905" y2="297" class="line"></line><line x1="331" y1="317" x2="331" y2="341" class="line"></line><line x1="905" y1="341" x2="905" y2="317" class="line"></line><path d="M331 341 Q331 351 341 351" class="line"></path><path d="M895 351 Q905 351 905 341" class="line"></path><rect x="353" y="337" width="116" height="32" rx="10"></rect><rect x="351" y="335" width="116" height="32" class="terminal" rx="10"></rect><text class="terminal" x="361" y="355">rowsFollowing</text><line x1="341" y1="351" x2="351" y2="351" class="line"></line><line x1="467" y1="351" x2="477" y2="351" class="line"></line><a xlink:href="#INT" xlink:title="INT"><rect x="489" y="337" width="40" height="32"></rect><rect x="487" y="335" width="40" height="32" class="nonterminal"></rect><text class="nonterminal" x="497" y="355">INT</text></a><line x1="477" y1="351" x2="487" y2="351" class="line"></line><line x1="527" y1="351" x2="537" y2="351" class="line"></line><line x1="537" y1="351" x2="895" y2="351" class="line"></line><line x1="331" y1="341" x2="331" y2="361" class="line"></line><line x1="905" y1="361" x2="905" y2="341" class="line"></line><line x1="331" y1="361" x2="331" y2="385" class="line"></line><line x1="905" y1="385" x2="905" y2="361" class="line"></line><path d="M331 385 Q331 395 341 395" class="line"></path><path d="M895 395 Q905 395 905 385" class="line"></path><rect x="373" y="381" width="250" height="32" rx="10"></rect><rect x="371" y="379" width="250" height="32" class="terminal" rx="10"></rect><text class="terminal" x="381" y="399">rowsBetweenUnboundedPreceding</text><line x1="361" y1="395" x2="371" y2="395" class="line"></line><line x1="621" y1="395" x2="631" y2="395" class="line"></line><line x1="341" y1="395" x2="361" y2="395" class="line"></line><line x1="631" y1="395" x2="651" y2="395" class="line"></line><path d="M341 395 Q351 395 351 405" class="line"></path><path d="M641 405 Q641 395 651 395" class="line"></path><line x1="351" y1="405" x2="351" y2="429" class="line"></line><line x1="641" y1="429" x2="641" y2="405" class="line"></line><path d="M351 429 Q351 439 361 439" class="line"></path><path d="M631 439 Q641 439 641 429" class="line"></path><rect x="373" y="425" width="176" height="32" rx="10"></rect><rect x="371" y="423" width="176" height="32" class="terminal" rx="10"></rect><text class="terminal" x="381" y="443">rowsBetweenPreceding</text><line x1="361" y1="439" x2="371" y2="439" class="line"></line><line x1="547" y1="439" x2="557" y2="439" class="line"></line><a xlink:href="#INT" xlink:title="INT"><rect x="569" y="425" width="40" height="32"></rect><rect x="567" y="423" width="40" height="32" class="nonterminal"></rect><text class="nonterminal" x="577" y="443">INT</text></a><line x1="557" y1="439" x2="567" y2="439" class="line"></line><line x1="607" y1="439" x2="617" y2="439" class="line"></line><line x1="617" y1="439" x2="631" y2="439" class="line"></line><line x1="351" y1="429" x2="351" y2="449" class="line"></line><line x1="641" y1="449" x2="641" y2="429" class="line"></line><line x1="351" y1="449" x2="351" y2="473" class="line"></line><line x1="641" y1="473" x2="641" y2="449" class="line"></line><path d="M351 473 Q351 483 361 483" class="line"></path><path d="M631 483 Q641 483 641 473" class="line"></path><rect x="373" y="469" width="190" height="32" rx="10"></rect><rect x="371" y="467" width="190" height="32" class="terminal" rx="10"></rect><text class="terminal" x="381" y="487">rowsBetweenCurrentRow</text><line x1="361" y1="483" x2="371" y2="483" class="line"></line><line x1="561" y1="483" x2="571" y2="483" class="line"></line><line x1="571" y1="483" x2="631" y2="483" class="line"></line><line x1="351" y1="473" x2="351" y2="493" class="line"></line><line x1="641" y1="493" x2="641" y2="473" class="line"></line><line x1="351" y1="493" x2="351" y2="517" class="line"></line><line x1="641" y1="517" x2="641" y2="493" class="line"></line><path d="M351 517 Q351 527 361 527" class="line"></path><path d="M631 527 Q641 527 641 517" class="line"></path><rect x="373" y="513" width="248" height="32" rx="10"></rect><rect x="371" y="511" width="248" height="32" class="terminal" rx="10"></rect><text class="terminal" x="381" y="531">rowsBetweenUnboundedFollowing</text><line x1="361" y1="527" x2="371" y2="527" class="line"></line><line x1="619" y1="527" x2="629" y2="527" class="line"></line><line x1="629" y1="527" x2="631" y2="527" class="line"></line><line x1="351" y1="517" x2="351" y2="537" class="line"></line><line x1="641" y1="537" x2="641" y2="517" class="line"></line><line x1="351" y1="537" x2="351" y2="561" class="line"></line><line x1="641" y1="561" x2="641" y2="537" class="line"></line><path d="M351 561 Q351 571 361 571" class="line"></path><path d="M631 571 Q641 571 641 561" class="line"></path><rect x="373" y="557" width="174" height="32" rx="10"></rect><rect x="371" y="555" width="174" height="32" class="terminal" rx="10"></rect><text class="terminal" x="381" y="575">rowsBetweenFollowing</text><line x1="361" y1="571" x2="371" y2="571" class="line"></line><line x1="545" y1="571" x2="555" y2="571" class="line"></line><a xlink:href="#INT" xlink:title="INT"><rect x="567" y="557" width="40" height="32"></rect><rect x="565" y="555" width="40" height="32" class="nonterminal"></rect><text class="nonterminal" x="575" y="575">INT</text></a><line x1="555" y1="571" x2="565" y2="571" class="line"></line><line x1="605" y1="571" x2="615" y2="571" class="line"></line><line x1="615" y1="571" x2="631" y2="571" class="line"></line><rect x="683" y="381" width="184" height="32" rx="10"></rect><rect x="681" y="379" width="184" height="32" class="terminal" rx="10"></rect><text class="terminal" x="691" y="399">andUnboundedPreceding</text><line x1="671" y1="395" x2="681" y2="395" class="line"></line><line x1="865" y1="395" x2="875" y2="395" class="line"></line><line x1="651" y1="395" x2="671" y2="395" class="line"></line><line x1="875" y1="395" x2="895" y2="395" class="line"></line><path d="M651 395 Q661 395 661 405" class="line"></path><path d="M885 405 Q885 395 895 395" class="line"></path><line x1="661" y1="405" x2="661" y2="429" class="line"></line><line x1="885" y1="429" x2="885" y2="405" class="line"></line><path d="M661 429 Q661 439 671 439" class="line"></path><path d="M875 439 Q885 439 885 429" class="line"></path><rect x="683" y="425" width="110" height="32" rx="10"></rect><rect x="681" y="423" width="110" height="32" class="terminal" rx="10"></rect><text class="terminal" x="691" y="443">andPreceding</text><line x1="671" y1="439" x2="681" y2="439" class="line"></line><line x1="791" y1="439" x2="801" y2="439" class="line"></line><a xlink:href="#INT" xlink:title="INT"><rect x="813" y="425" width="40" height="32"></rect><rect x="811" y="423" width="40" height="32" class="nonterminal"></rect><text class="nonterminal" x="821" y="443">INT</text></a><line x1="801" y1="439" x2="811" y2="439" class="line"></line><line x1="851" y1="439" x2="861" y2="439" class="line"></line><line x1="861" y1="439" x2="875" y2="439" class="line"></line><line x1="661" y1="429" x2="661" y2="449" class="line"></line><line x1="885" y1="449" x2="885" y2="429" class="line"></line><line x1="661" y1="449" x2="661" y2="473" class="line"></line><line x1="885" y1="473" x2="885" y2="449" class="line"></line><path d="M661 473 Q661 483 671 483" class="line"></path><path d="M875 483 Q885 483 885 473" class="line"></path><rect x="683" y="469" width="122" height="32" rx="10"></rect><rect x="681" y="467" width="122" height="32" class="terminal" rx="10"></rect><text class="terminal" x="691" y="487">andCurrentRow</text><line x1="671" y1="483" x2="681" y2="483" class="line"></line><line x1="803" y1="483" x2="813" y2="483" class="line"></line><line x1="813" y1="483" x2="875" y2="483" class="line"></line><line x1="661" y1="473" x2="661" y2="493" class="line"></line><line x1="885" y1="493" x2="885" y2="473" class="line"></line><line x1="661" y1="493" x2="661" y2="517" class="line"></line><line x1="885" y1="517" x2="885" y2="493" class="line"></line><path d="M661 517 Q661 527 671 527" class="line"></path><path d="M875 527 Q885 527 885 517" class="line"></path><rect x="683" y="513" width="182" height="32" rx="10"></rect><rect x="681" y="511" width="182" height="32" class="terminal" rx="10"></rect><text class="terminal" x="691" y="531">andUnboundedFollowing</text><line x1="671" y1="527" x2="681" y2="527" class="line"></line><line x1="863" y1="527" x2="873" y2="527" class="line"></line><line x1="873" y1="527" x2="875" y2="527" class="line"></line><line x1="661" y1="517" x2="661" y2="537" class="line"></line><line x1="885" y1="537" x2="885" y2="517" class="line"></line><line x1="661" y1="537" x2="661" y2="561" class="line"></line><line x1="885" y1="561" x2="885" y2="537" class="line"></line><path d="M661 561 Q661 571 671 571" class="line"></path><path d="M875 571 Q885 571 885 561" class="line"></path><rect x="683" y="557" width="108" height="32" rx="10"></rect><rect x="681" y="555" width="108" height="32" class="terminal" rx="10"></rect><text class="terminal" x="691" y="575">andFollowing</text><line x1="671" y1="571" x2="681" y2="571" class="line"></line><line x1="789" y1="571" x2="799" y2="571" class="line"></line><a xlink:href="#INT" xlink:title="INT"><rect x="811" y="557" width="40" height="32"></rect><rect x="809" y="555" width="40" height="32" class="nonterminal"></rect><text class="nonterminal" x="819" y="575">INT</text></a><line x1="799" y1="571" x2="809" y2="571" class="line"></line><line x1="849" y1="571" x2="859" y2="571" class="line"></line><line x1="859" y1="571" x2="875" y2="571" class="line"></line><line x1="331" y1="385" x2="331" y2="405" class="line"></line><line x1="905" y1="405" x2="905" y2="385" class="line"></line><line x1="331" y1="405" x2="331" y2="595" class="line"></line><line x1="905" y1="595" x2="905" y2="405" class="line"></line><path d="M331 595 Q331 605 341 605" class="line"></path><path d="M895 605 Q905 605 905 595" class="line"></path><line x1="341" y1="605" x2="351" y2="605" class="line"></line><line x1="351" y1="605" x2="895" y2="605" class="line"></line><line x1="13" y1="175" x2="33" y2="175" class="line"></line><line x1="915" y1="175" x2="935" y2="175" class="line"></line><path d="M13 175 Q23 175 23 185" class="line"></path><path d="M925 185 Q925 175 935 175" class="line"></path><line x1="23" y1="185" x2="23" y2="611" class="line"></line><line x1="925" y1="611" x2="925" y2="185" class="line"></line><path d="M23 611 Q23 621 33 621" class="line"></path><path d="M915 621 Q925 621 925 611" class="line"></path><line x1="33" y1="621" x2="43" y2="621" class="line"></line><line x1="43" y1="621" x2="915" y2="621" class="line"></line><line x1="938" y1="175" x2="935" y2="175" class="line"></line><polygon points="945 175 953 171 953 179" class="filled"></polygon><polygon points="945 175 937 171 937 179" class="filled"></polygon></svg><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml">referenced by:<xhtml:ul><xhtml:li><xhtml:a href="#FIELD" title="FIELD">FIELD</xhtml:a></xhtml:li></xhtml:ul></xhtml:p><xhtml:br xmlns:xhtml="http://www.w3.org/1999/xhtml"></xhtml:br><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml" style="font-size: 14px; font-weight:bold"><xhtml:a name="GROUP_FIELD">GROUP_FIELD:</xhtml:a></xhtml:p><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="492" height="316"><defs><style type="text/css">
    -
    -    @namespace "http://www.w3.org/2000/svg";
    -    .line                 {fill: none; stroke: #332900;}
    -    filled                {fill: #332900; stroke: none;}
    -    text                  {font-family: Verdana, Sans-serif;
    -                            font-size: 12px;
    -                            fill: #4D3D00;
    -                          }
    -    text.terminal         {font-family: Verdana, Sans-serif;
    -                            font-size: 12px;
    -                            fill: #4D3D00;
    -                            font-weight: bold;
    -                          }
    -    rect, circle, polygon {fill: #332900; stroke: #332900;}
    -    rect.terminal         {fill: #FFCC00; stroke: #332900;}
    -    rect.nonterminal      {fill: #FFEB99; stroke: #332900;}
    -    rect.text             {fill: none; stroke: none;}    
    -    polygon.regexp        {fill: #FFF5CC; stroke: #332900;}
    -  </style></defs><polygon points="9 17 1 13 1 21" class="filled"></polygon><polygon points="17 17 9 13 9 21" class="filled"></polygon><line x1="17" y1="17" x2="19" y2="17" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="51" y="3" width="56" height="32"></rect><rect x="49" y="1" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="59" y="21">FIELD</text></a><line x1="39" y1="17" x2="49" y2="17" class="line"></line><line x1="105" y1="17" x2="115" y2="17" class="line"></line><line x1="115" y1="17" x2="453" y2="17" class="line"></line><line x1="19" y1="17" x2="39" y2="17" class="line"></line><line x1="453" y1="17" x2="473" y2="17" class="line"></line><path d="M19 17 Q29 17 29 27" class="line"></path><path d="M463 27 Q463 17 473 17" class="line"></path><line x1="29" y1="27" x2="29" y2="73" class="line"></line><line x1="463" y1="73" x2="463" y2="27" class="line"></line><path d="M29 73 Q29 83 39 83" class="line"></path><path d="M453 83 Q463 83 463 73" class="line"></path><rect x="51" y="69" width="58" height="32" rx="10"></rect><rect x="49" y="67" width="58" height="32" class="terminal" rx="10"></rect><text class="terminal" x="59" y="87">rollup</text><line x1="39" y1="83" x2="49" y2="83" class="line"></line><line x1="107" y1="83" x2="117" y2="83" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="149" y="69" width="56" height="32"></rect><rect x="147" y="67" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="157" y="87">FIELD</text></a><line x1="137" y1="83" x2="147" y2="83" class="line"></line><line x1="203" y1="83" x2="213" y2="83" class="line"></line><path d="M117 83 L137 83 M136 83 Q127 83 127 73 L127 61 Q127 51 137 51" class="line"></path><path d="M213 83 L233 83 M213 83 Q223 83 223 73 L223 61 Q223 51 213 51" class="line"></path><line x1="137" y1="51" x2="147" y2="51" class="line"></line><line x1="147" y1="51" x2="213" y2="51" class="line"></line><line x1="233" y1="83" x2="453" y2="83" class="line"></line><line x1="29" y1="73" x2="29" y2="93" class="line"></line><line x1="463" y1="93" x2="463" y2="73" class="line"></line><line x1="29" y1="93" x2="29" y2="139" class="line"></line><line x1="463" y1="139" x2="463" y2="93" class="line"></line><path d="M29 139 Q29 149 39 149" class="line"></path><path d="M453 149 Q463 149 463 139" class="line"></path><rect x="51" y="135" width="50" height="32" rx="10"></rect><rect x="49" y="133" width="50" height="32" class="terminal" rx="10"></rect><text class="terminal" x="59" y="153">cube</text><line x1="39" y1="149" x2="49" y2="149" class="line"></line><line x1="99" y1="149" x2="109" y2="149" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="141" y="135" width="56" height="32"></rect><rect x="139" y="133" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="149" y="153">FIELD</text></a><line x1="129" y1="149" x2="139" y2="149" class="line"></line><line x1="195" y1="149" x2="205" y2="149" class="line"></line><path d="M109 149 L129 149 M128 149 Q119 149 119 139 L119 127 Q119 117 129 117" class="line"></path><path d="M205 149 L225 149 M205 149 Q215 149 215 139 L215 127 Q215 117 205 117" class="line"></path><line x1="129" y1="117" x2="139" y2="117" class="line"></line><line x1="139" y1="117" x2="205" y2="117" class="line"></line><line x1="225" y1="149" x2="453" y2="149" class="line"></line><line x1="29" y1="139" x2="29" y2="159" class="line"></line><line x1="463" y1="159" x2="463" y2="139" class="line"></line><line x1="29" y1="159" x2="29" y2="205" class="line"></line><line x1="463" y1="205" x2="463" y2="159" class="line"></line><path d="M29 205 Q29 215 39 215" class="line"></path><path d="M453 215 Q463 215 463 205" class="line"></path><rect x="51" y="201" width="106" height="32" rx="10"></rect><rect x="49" y="199" width="106" height="32" class="terminal" rx="10"></rect><text class="terminal" x="59" y="219">groupingSets</text><line x1="39" y1="215" x2="49" y2="215" class="line"></line><line x1="155" y1="215" x2="165" y2="215" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="217" y="201" width="56" height="32"></rect><rect x="215" y="199" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="225" y="219">FIELD</text></a><line x1="205" y1="215" x2="215" y2="215" class="line"></line><line x1="271" y1="215" x2="281" y2="215" class="line"></line><path d="M185 215 L205 215 M204 215 Q195 215 195 205 L195 193 Q195 183 205 183" class="line"></path><path d="M281 215 L301 215 M281 215 Q291 215 291 205 L291 193 Q291 183 281 183" class="line"></path><line x1="205" y1="183" x2="215" y2="183" class="line"></line><line x1="215" y1="183" x2="281" y2="183" class="line"></line><line x1="301" y1="215" x2="433" y2="215" class="line"></line><line x1="165" y1="215" x2="185" y2="215" class="line"></line><line x1="433" y1="215" x2="453" y2="215" class="line"></line><path d="M165 215 Q175 215 175 225" class="line"></path><path d="M443 225 Q443 215 453 215" class="line"></path><line x1="175" y1="225" x2="175" y2="287" class="line"></line><line x1="443" y1="287" x2="443" y2="225" class="line"></line><path d="M175 287 Q175 297 185 297" class="line"></path><path d="M433 297 Q443 297 443 287" class="line"></path><rect x="217" y="283" width="26" height="32" rx="10"></rect><rect x="215" y="281" width="26" height="32" class="terminal" rx="10"></rect><text class="terminal" x="225" y="301">[</text><line x1="205" y1="297" x2="215" y2="297" class="line"></line><line x1="241" y1="297" x2="251" y2="297" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="283" y="283" width="56" height="32"></rect><rect x="281" y="281" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="291" y="301">FIELD</text></a><line x1="271" y1="297" x2="281" y2="297" class="line"></line><line x1="337" y1="297" x2="347" y2="297" class="line"></line><path d="M251 297 L271 297 M270 297 Q261 297 261 287 L261 275 Q261 265 271 265" class="line"></path><path d="M347 297 L367 297 M347 297 Q357 297 357 287 L357 275 Q357 265 347 265" class="line"></path><line x1="271" y1="265" x2="281" y2="265" class="line"></line><line x1="281" y1="265" x2="347" y2="265" class="line"></line><rect x="379" y="283" width="26" height="32" rx="10"></rect><rect x="377" y="281" width="26" height="32" class="terminal" rx="10"></rect><text class="terminal" x="387" y="301">]</text><line x1="367" y1="297" x2="377" y2="297" class="line"></line><line x1="403" y1="297" x2="413" y2="297" class="line"></line><path d="M185 297 L205 297 M204 297 Q195 297 195 287 L195 259 Q195 249 205 249" class="line"></path><path d="M413 297 L433 297 M413 297 Q423 297 423 287 L423 259 Q423 249 413 249" class="line"></path><line x1="205" y1="249" x2="215" y2="249" class="line"></line><line x1="215" y1="249" x2="413" y2="249" class="line"></line><line x1="476" y1="17" x2="473" y2="17" class="line"></line><polygon points="483 17 491 13 491 21" class="filled"></polygon><polygon points="483 17 475 13 475 21" class="filled"></polygon></svg><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml">referenced by:<xhtml:ul><xhtml:li><xhtml:a href="#SELECT" title="SELECT">SELECT</xhtml:a></xhtml:li></xhtml:ul></xhtml:p><xhtml:br xmlns:xhtml="http://www.w3.org/1999/xhtml"></xhtml:br><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml" style="font-size: 14px; font-weight:bold"><xhtml:a name="SORT_FIELD">SORT_FIELD:</xhtml:a></xhtml:p><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="526" height="256"><defs><style type="text/css">
    -    @namespace "http://www.w3.org/2000/svg";
    -    .line                 {fill: none; stroke: #332900;}
    -    filled                {fill: #332900; stroke: none;}
    -    text                  {font-family: Verdana, Sans-serif;
    -                            font-size: 12px;
    -                            fill: #4D3D00;
    -                          }
    -    text.terminal         {font-family: Verdana, Sans-serif;
    -                            font-size: 12px;
    -                            fill: #4D3D00;
    -                            font-weight: bold;
    -                          }
    -    rect, circle, polygon {fill: #332900; stroke: #332900;}
    -    rect.terminal         {fill: #FFCC00; stroke: #332900;}
    -    rect.nonterminal      {fill: #FFEB99; stroke: #332900;}
    -    rect.text             {fill: none; stroke: none;}    
    -    polygon.regexp        {fill: #FFF5CC; stroke: #332900;}
    -  </style></defs><polygon points="9 17 1 13 1 21" class="filled"></polygon><polygon points="17 17 9 13 9 21" class="filled"></polygon><line x1="17" y1="17" x2="19" y2="17" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="31" y="3" width="56" height="32"></rect><rect x="29" y="1" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="39" y="21">FIELD</text></a><line x1="19" y1="17" x2="29" y2="17" class="line"></line><line x1="85" y1="17" x2="95" y2="17" class="line"></line><rect x="127" y="3" width="42" height="32" rx="10"></rect><rect x="125" y="1" width="42" height="32" class="terminal" rx="10"></rect><text class="terminal" x="135" y="21">asc</text><line x1="115" y1="17" x2="125" y2="17" class="line"></line><line x1="167" y1="17" x2="177" y2="17" class="line"></line><line x1="177" y1="17" x2="347" y2="17" class="line"></line><line x1="95" y1="17" x2="115" y2="17" class="line"></line><line x1="347" y1="17" x2="367" y2="17" class="line"></line><path d="M95 17 Q105 17 105 27" class="line"></path><path d="M357 27 Q357 17 367 17" class="line"></path><line x1="105" y1="27" x2="105" y2="51" class="line"></line><line x1="357" y1="51" x2="357" y2="27" class="line"></line><path d="M105 51 Q105 61 115 61" class="line"></path><path d="M347 61 Q357 61 357 51" class="line"></path><rect x="127" y="47" width="50" height="32" rx="10"></rect><rect x="125" y="45" width="50" height="32" class="terminal" rx="10"></rect><text class="terminal" x="135" y="65">desc</text><line x1="115" y1="61" x2="125" y2="61" class="line"></line><line x1="175" y1="61" x2="185" y2="61" class="line"></line><line x1="185" y1="61" x2="347" y2="61" class="line"></line><line x1="105" y1="51" x2="105" y2="71" class="line"></line><line x1="357" y1="71" x2="357" y2="51" class="line"></line><line x1="105" y1="71" x2="105" y2="117" class="line"></line><line x1="357" y1="117" x2="357" y2="71" class="line"></line><path d="M105 117 Q105 127 115 127" class="line"></path><path d="M347 127 Q357 127 357 117" class="line"></path><rect x="127" y="113" width="68" height="32" rx="10"></rect><rect x="125" y="111" width="68" height="32" class="terminal" rx="10"></rect><text class="terminal" x="135" y="131">sortAsc</text><line x1="115" y1="127" x2="125" y2="127" class="line"></line><line x1="193" y1="127" x2="203" y2="127" class="line"></line><a xlink:href="#BINDING" xlink:title="BINDING"><rect x="235" y="113" width="74" height="32"></rect><rect x="233" y="111" width="74" height="32" class="nonterminal"></rect><text class="nonterminal" x="243" y="131">BINDING</text></a><line x1="223" y1="127" x2="233" y2="127" class="line"></line><line x1="307" y1="127" x2="317" y2="127" class="line"></line><path d="M203 127 L223 127 M222 127 Q213 127 213 117 L213 105 Q213 95 223 95" class="line"></path><path d="M317 127 L337 127 M317 127 Q327 127 327 117 L327 105 Q327 95 317 95" class="line"></path><line x1="223" y1="95" x2="233" y2="95" class="line"></line><line x1="233" y1="95" x2="317" y2="95" class="line"></line><line x1="337" y1="127" x2="347" y2="127" class="line"></line><line x1="105" y1="117" x2="105" y2="137" class="line"></line><line x1="357" y1="137" x2="357" y2="117" class="line"></line><line x1="105" y1="137" x2="105" y2="183" class="line"></line><line x1="357" y1="183" x2="357" y2="137" class="line"></line><path d="M105 183 Q105 193 115 193" class="line"></path><path d="M347 193 Q357 193 357 183" class="line"></path><rect x="127" y="179" width="78" height="32" rx="10"></rect><rect x="125" y="177" width="78" height="32" class="terminal" rx="10"></rect><text class="terminal" x="135" y="197">sortDesc</text><line x1="115" y1="193" x2="125" y2="193" class="line"></line><line x1="203" y1="193" x2="213" y2="193" class="line"></line><a xlink:href="#BINDING" xlink:title="BINDING"><rect x="245" y="179" width="74" height="32"></rect><rect x="243" y="177" width="74" height="32" class="nonterminal"></rect><text class="nonterminal" x="253" y="197">BINDING</text></a><line x1="233" y1="193" x2="243" y2="193" class="line"></line><line x1="317" y1="193" x2="327" y2="193" class="line"></line><path d="M213 193 L233 193 M232 193 Q223 193 223 183 L223 171 Q223 161 233 161" class="line"></path><path d="M327 193 L347 193 M327 193 Q337 193 337 183 L337 171 Q337 161 327 161" class="line"></path><line x1="233" y1="161" x2="243" y2="161" class="line"></line><line x1="243" y1="161" x2="327" y2="161" class="line"></line><line x1="105" y1="183" x2="105" y2="203" class="line"></line><line x1="357" y1="203" x2="357" y2="183" class="line"></line><line x1="105" y1="203" x2="105" y2="227" class="line"></line><line x1="357" y1="227" x2="357" y2="203" class="line"></line><path d="M105 227 Q105 237 115 237" class="line"></path><path d="M347 237 Q357 237 357 227" class="line"></path><rect x="127" y="223" width="46" height="32" rx="10"></rect><rect x="125" y="221" width="46" height="32" class="terminal" rx="10"></rect><text class="terminal" x="135" y="241">sort</text><line x1="115" y1="237" x2="125" y2="237" class="line"></line><line x1="171" y1="237" x2="181" y2="237" class="line"></line><a xlink:href="#BINDING_MAP" xlink:title="BINDING_MAP"><rect x="193" y="223" width="108" height="32"></rect><rect x="191" y="221" width="108" height="32" class="nonterminal"></rect><text class="nonterminal" x="201" y="241">BINDING_MAP</text></a><line x1="181" y1="237" x2="191" y2="237" class="line"></line><line x1="299" y1="237" x2="309" y2="237" class="line"></line><line x1="309" y1="237" x2="347" y2="237" class="line"></line><rect x="399" y="3" width="80" height="32" rx="10"></rect><rect x="397" y="1" width="80" height="32" class="terminal" rx="10"></rect><text class="terminal" x="407" y="21">nullsFirst</text><line x1="387" y1="17" x2="397" y2="17" class="line"></line><line x1="477" y1="17" x2="487" y2="17" class="line"></line><line x1="367" y1="17" x2="387" y2="17" class="line"></line><line x1="487" y1="17" x2="507" y2="17" class="line"></line><path d="M367 17 Q377 17 377 27" class="line"></path><path d="M497 27 Q497 17 507 17" class="line"></path><line x1="377" y1="27" x2="377" y2="51" class="line"></line><line x1="497" y1="51" x2="497" y2="27" class="line"></line><path d="M377 51 Q377 61 387 61" class="line"></path><path d="M487 61 Q497 61 497 51" class="line"></path><rect x="399" y="47" width="78" height="32" rx="10"></rect><rect x="397" y="45" width="78" height="32" class="terminal" rx="10"></rect><text class="terminal" x="407" y="65">nullsLast</text><line x1="387" y1="61" x2="397" y2="61" class="line"></line><line x1="475" y1="61" x2="485" y2="61" class="line"></line><line x1="485" y1="61" x2="487" y2="61" class="line"></line><line x1="377" y1="51" x2="377" y2="71" class="line"></line><line x1="497" y1="71" x2="497" y2="51" class="line"></line><line x1="377" y1="71" x2="377" y2="85" class="line"></line><line x1="497" y1="85" x2="497" y2="71" class="line"></line><path d="M377 85 Q377 95 387 95" class="line"></path><path d="M487 95 Q497 95 497 85" class="line"></path><line x1="387" y1="95" x2="397" y2="95" class="line"></line><line x1="397" y1="95" x2="487" y2="95" class="line"></line><line x1="510" y1="17" x2="507" y2="17" class="line"></line><polygon points="517 17 525 13 525 21" class="filled"></polygon><polygon points="517 17 509 13 509 21" class="filled"></polygon></svg><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml">referenced by:<xhtml:ul><xhtml:li><xhtml:a href="#PARTITION_CLAUSE" title="PARTITION_CLAUSE">PARTITION_CLAUSE</xhtml:a></xhtml:li><xhtml:li><xhtml:a href="#SELECT" title="SELECT">SELECT</xhtml:a></xhtml:li></xhtml:ul></xhtml:p><xhtml:br xmlns:xhtml="http://www.w3.org/1999/xhtml"></xhtml:br><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml" style="font-size: 14px; font-weight:bold"><xhtml:a name="INT">INT:</xhtml:a></xhtml:p><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="158" height="52"><defs><style type="text/css">
    -
    -    @namespace "http://www.w3.org/2000/svg";
    -    .line                 {fill: none; stroke: #332900;}
    -    filled                {fill: #332900; stroke: none;}
    -    text                  {font-family: Verdana, Sans-serif;
    -                            font-size: 12px;
    -                            fill: #4D3D00;
    -                          }
    -    text.terminal         {font-family: Verdana, Sans-serif;
    -                            font-size: 12px;
    -                            fill: #4D3D00;
    -                            font-weight: bold;
    -                          }
    -    rect, circle, polygon {fill: #332900; stroke: #332900;}
    -    rect.terminal         {fill: #FFCC00; stroke: #332900;}
    -    rect.nonterminal      {fill: #FFEB99; stroke: #332900;}
    -    rect.text             {fill: none; stroke: none;}    
    -    polygon.regexp        {fill: #FFF5CC; stroke: #332900;}
    -  </style></defs><polygon points="9 33 1 29 1 37" class="filled"></polygon><polygon points="17 33 9 29 9 37" class="filled"></polygon><line x1="17" y1="33" x2="19" y2="33" class="line"></line><polygon points="51 35 58 19 104 19 111 35 104 51 58 51"></polygon><polygon points="49 33 56 17 102 17 109 33 102 49 56 49" class="regexp"></polygon><text class="regexp" x="64" y="37">[0-9]</text><line x1="39" y1="33" x2="49" y2="33" class="line"></line><line x1="109" y1="33" x2="119" y2="33" class="line"></line><path d="M19 33 L39 33 M38 33 Q29 33 29 23 L29 11 Q29 1 39 1" class="line"></path><path d="M119 33 L139 33 M119 33 Q129 33 129 23 L129 11 Q129 1 119 1" class="line"></path><line x1="39" y1="1" x2="49" y2="1" class="line"></line><line x1="49" y1="1" x2="119" y2="1" class="line"></line><line x1="142" y1="33" x2="139" y2="33" class="line"></line><polygon points="149 33 157 29 157 37" class="filled"></polygon><polygon points="149 33 141 29 141 37" class="filled"></polygon></svg><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml">referenced by:<xhtml:ul><xhtml:li><xhtml:a href="#AGGREGATE_FUNCTION" title="AGGREGATE_FUNCTION">AGGREGATE_FUNCTION</xhtml:a></xhtml:li><xhtml:li><xhtml:a href="#PARTITION_CLAUSE" title="PARTITION_CLAUSE">PARTITION_CLAUSE</xhtml:a></xhtml:li><xhtml:li><xhtml:a href="#SELECT" title="SELECT">SELECT</xhtml:a></xhtml:li></xhtml:ul></xhtml:p><xhtml:br xmlns:xhtml="http://www.w3.org/1999/xhtml"></xhtml:br><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml" style="font-size: 14px; font-weight:bold"><xhtml:a name="NAME">NAME:</xhtml:a></xhtml:p><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="198" height="140"><defs><style type="text/css">
    -    @namespace "http://www.w3.org/2000/svg";
    -    .line                 {fill: none; stroke: #332900;}
    -    filled                {fill: #332900; stroke: none;}
    -    text                  {font-family: Verdana, Sans-serif;
    -                            font-size: 12px;
    -                            fill: #4D3D00;
    -                          }
    -    text.terminal         {font-family: Verdana, Sans-serif;
    -                            font-size: 12px;
    -                            fill: #4D3D00;
    -                            font-weight: bold;
    -                          }
    -    rect, circle, polygon {fill: #332900; stroke: #332900;}
    -    rect.terminal         {fill: #FFCC00; stroke: #332900;}
    -    rect.nonterminal      {fill: #FFEB99; stroke: #332900;}
    -    rect.text             {fill: none; stroke: none;}    
    -    polygon.regexp        {fill: #FFF5CC; stroke: #332900;}
    -  </style></defs><polygon points="9 33 1 29 1 37" class="filled"></polygon><polygon points="17 33 9 29 9 37" class="filled"></polygon><line x1="17" y1="33" x2="19" y2="33" class="line"></line><polygon points="71 35 78 19 124 19 131 35 124 51 78 51"></polygon><polygon points="69 33 76 17 122 17 129 33 122 49 76 49" class="regexp"></polygon><text class="regexp" x="84" y="37">[A-Z]</text><line x1="59" y1="33" x2="69" y2="33" class="line"></line><line x1="129" y1="33" x2="139" y2="33" class="line"></line><line x1="39" y1="33" x2="59" y2="33" class="line"></line><line x1="139" y1="33" x2="159" y2="33" class="line"></line><path d="M39 33 Q49 33 49 43" class="line"></path><path d="M149 43 Q149 33 159 33" class="line"></path><line x1="49" y1="43" x2="49" y2="67" class="line"></line><line x1="149" y1="67" x2="149" y2="43" class="line"></line><path d="M49 67 Q49 77 59 77" class="line"></path><path d="M139 77 Q149 77 149 67" class="line"></path><polygon points="71 79 78 63 124 63 131 79 124 95 78 95"></polygon><polygon points="69 77 76 61 122 61 129 77 122 93 76 93" class="regexp"></polygon><text class="regexp" x="84" y="81">[a-z]</text><line x1="59" y1="77" x2="69" y2="77" class="line"></line><line x1="129" y1="77" x2="139" y2="77" class="line"></line><line x1="49" y1="67" x2="49" y2="87" class="line"></line><line x1="149" y1="87" x2="149" y2="67" class="line"></line><line x1="49" y1="87" x2="49" y2="111" class="line"></line><line x1="149" y1="111" x2="149" y2="87" class="line"></line><path d="M49 111 Q49 121 59 121" class="line"></path><path d="M139 121 Q149 121 149 111" class="line"></path><polygon points="71 123 78 107 124 107 131 123 124 139 78 139"></polygon><polygon points="69 121 76 105 122 105 129 121 122 137 76 137" class="regexp"></polygon><text class="regexp" x="84" y="125">[0-9]</text><line x1="59" y1="121" x2="69" y2="121" class="line"></line><line x1="129" y1="121" x2="139" y2="121" class="line"></line><path d="M19 33 L39 33 M38 33 Q29 33 29 23 L29 11 Q29 1 39 1" class="line"></path><path d="M159 33 L179 33 M159 33 Q169 33 169 23 L169 11 Q169 1 159 1" class="line"></path><line x1="39" y1="1" x2="49" y2="1" class="line"></line><line x1="49" y1="1" x2="159" y2="1" class="line"></line><line x1="182" y1="33" x2="179" y2="33" class="line"></line><polygon points="189 33 197 29 197 37" class="filled"></polygon><polygon points="189 33 181 29 181 37" class="filled"></polygon></svg><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml">referenced by:<xhtml:ul><xhtml:li><xhtml:a href="#FIELD" title="FIELD">FIELD</xhtml:a></xhtml:li><xhtml:li><xhtml:a href="#TABLE" title="TABLE">TABLE</xhtml:a></xhtml:li></xhtml:ul></xhtml:p><xhtml:br xmlns:xhtml="http://www.w3.org/1999/xhtml"></xhtml:br><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml" style="font-size: 14px; font-weight:bold"><xhtml:a name="TABLE">TABLE:</xhtml:a></xhtml:p><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="710" height="410"><defs><style type="text/css">
    -
    -    @namespace "http://www.w3.org/2000/svg";
    -    .line                 {fill: none; stroke: #332900;}
    -    filled                {fill: #332900; stroke: none;}
    -    text                  {font-family: Verdana, Sans-serif;
    -                            font-size: 12px;
    -                            fill: #4D3D00;
    -                          }
    -    text.terminal         {font-family: Verdana, Sans-serif;
    -                            font-size: 12px;
    -                            fill: #4D3D00;
    -                            font-weight: bold;
    -                          }
    -    rect, circle, polygon {fill: #332900; stroke: #332900;}
    -    rect.terminal         {fill: #FFCC00; stroke: #332900;}
    -    rect.nonterminal      {fill: #FFEB99; stroke: #332900;}
    -    rect.text             {fill: none; stroke: none;}    
    -    polygon.regexp        {fill: #FFF5CC; stroke: #332900;}
    -  </style></defs><polygon points="9 17 1 13 1 21" class="filled"></polygon><polygon points="17 17 9 13 9 21" class="filled"></polygon><line x1="17" y1="17" x2="19" y2="17" class="line"></line><rect x="51" y="3" width="168" height="32" rx="10"></rect><rect x="49" y="1" width="168" height="32" class="terminal" rx="10"></rect><text class="terminal" x="59" y="21">jOOQ generated Table</text><line x1="39" y1="17" x2="49" y2="17" class="line"></line><line x1="217" y1="17" x2="227" y2="17" class="line"></line><line x1="227" y1="17" x2="671" y2="17" class="line"></line><line x1="19" y1="17" x2="39" y2="17" class="line"></line><line x1="671" y1="17" x2="691" y2="17" class="line"></line><path d="M19 17 Q29 17 29 27" class="line"></path><path d="M681 27 Q681 17 691 17" class="line"></path><line x1="29" y1="27" x2="29" y2="51" class="line"></line><line x1="681" y1="51" x2="681" y2="27" class="line"></line><path d="M29 51 Q29 61 39 61" class="line"></path><path d="M671 61 Q681 61 681 51" class="line"></path><rect x="51" y="47" width="104" height="32" rx="10"></rect><rect x="49" y="45" width="104" height="32" class="terminal" rx="10"></rect><text class="terminal" x="59" y="65">CustomTable</text><line x1="39" y1="61" x2="49" y2="61" class="line"></line><line x1="153" y1="61" x2="163" y2="61" class="line"></line><line x1="163" y1="61" x2="671" y2="61" class="line"></line><line x1="29" y1="51" x2="29" y2="71" class="line"></line><line x1="681" y1="71" x2="681" y2="51" class="line"></line><line x1="29" y1="71" x2="29" y2="95" class="line"></line><line x1="681" y1="95" x2="681" y2="71" class="line"></line><path d="M29 95 Q29 105 39 105" class="line"></path><path d="M671 105 Q681 105 681 95" class="line"></path><rect x="51" y="91" width="52" height="32" rx="10"></rect><rect x="49" y="89" width="52" height="32" class="terminal" rx="10"></rect><text class="terminal" x="59" y="109">table</text><line x1="39" y1="105" x2="49" y2="105" class="line"></line><line x1="101" y1="105" x2="111" y2="105" class="line"></line><a xlink:href="#SQL" xlink:title="SQL"><rect x="143" y="91" width="44" height="32"></rect><rect x="141" y="89" width="44" height="32" class="nonterminal"></rect><text class="nonterminal" x="151" y="109">SQL</text></a><line x1="131" y1="105" x2="141" y2="105" class="line"></line><line x1="185" y1="105" x2="195" y2="105" class="line"></line><line x1="195" y1="105" x2="217" y2="105" class="line"></line><line x1="111" y1="105" x2="131" y2="105" class="line"></line><line x1="217" y1="105" x2="237" y2="105" class="line"></line><path d="M111 105 Q121 105 121 115" class="line"></path><path d="M227 115 Q227 105 237 105" class="line"></path><line x1="121" y1="115" x2="121" y2="139" class="line"></line><line x1="227" y1="139" x2="227" y2="115" class="line"></line><path d="M121 139 Q121 149 131 149" class="line"></path><path d="M217 149 Q227 149 227 139" class="line"></path><a xlink:href="#SELECT" xlink:title="SELECT"><rect x="143" y="135" width="66" height="32"></rect><rect x="141" y="133" width="66" height="32" class="nonterminal"></rect><text class="nonterminal" x="151" y="153">SELECT</text></a><line x1="131" y1="149" x2="141" y2="149" class="line"></line><line x1="207" y1="149" x2="217" y2="149" class="line"></line><line x1="237" y1="105" x2="671" y2="105" class="line"></line><line x1="29" y1="95" x2="29" y2="115" class="line"></line><line x1="681" y1="115" x2="681" y2="95" class="line"></line><line x1="29" y1="115" x2="29" y2="183" class="line"></line><line x1="681" y1="183" x2="681" y2="115" class="line"></line><path d="M29 183 Q29 193 39 193" class="line"></path><path d="M671 193 Q681 193 681 183" class="line"></path><rect x="71" y="179" width="52" height="32" rx="10"></rect><rect x="69" y="177" width="52" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="197">table</text><line x1="59" y1="193" x2="69" y2="193" class="line"></line><line x1="121" y1="193" x2="131" y2="193" class="line"></line><line x1="131" y1="193" x2="143" y2="193" class="line"></line><line x1="39" y1="193" x2="59" y2="193" class="line"></line><line x1="143" y1="193" x2="163" y2="193" class="line"></line><path d="M39 193 Q49 193 49 203" class="line"></path><path d="M153 203 Q153 193 163 193" class="line"></path><line x1="49" y1="203" x2="49" y2="227" class="line"></line><line x1="153" y1="227" x2="153" y2="203" class="line"></line><path d="M49 227 Q49 237 59 237" class="line"></path><path d="M143 237 Q153 237 153 227" class="line"></path><rect x="71" y="223" width="64" height="32" rx="10"></rect><rect x="69" y="221" width="64" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="241">unnest</text><line x1="59" y1="237" x2="69" y2="237" class="line"></line><line x1="133" y1="237" x2="143" y2="237" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="195" y="179" width="56" height="32"></rect><rect x="193" y="177" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="203" y="197">FIELD</text></a><line x1="183" y1="193" x2="193" y2="193" class="line"></line><line x1="249" y1="193" x2="259" y2="193" class="line"></line><line x1="259" y1="193" x2="317" y2="193" class="line"></line><line x1="163" y1="193" x2="183" y2="193" class="line"></line><line x1="317" y1="193" x2="337" y2="193" class="line"></line><path d="M163 193 Q173 193 173 203" class="line"></path><path d="M327 203 Q327 193 337 193" class="line"></path><line x1="173" y1="203" x2="173" y2="249" class="line"></line><line x1="327" y1="249" x2="327" y2="203" class="line"></line><path d="M173 249 Q173 259 183 259" class="line"></path><path d="M317 259 Q327 259 327 249" class="line"></path><a xlink:href="#BINDING" xlink:title="BINDING"><rect x="215" y="245" width="74" height="32"></rect><rect x="213" y="243" width="74" height="32" class="nonterminal"></rect><text class="nonterminal" x="223" y="263">BINDING</text></a><line x1="203" y1="259" x2="213" y2="259" class="line"></line><line x1="287" y1="259" x2="297" y2="259" class="line"></line><path d="M183 259 L203 259 M202 259 Q193 259 193 249 L193 237 Q193 227 203 227" class="line"></path><path d="M297 259 L317 259 M297 259 Q307 259 307 249 L307 237 Q307 227 297 227" class="line"></path><line x1="203" y1="227" x2="213" y2="227" class="line"></line><line x1="213" y1="227" x2="297" y2="227" class="line"></line><line x1="173" y1="249" x2="173" y2="269" class="line"></line><line x1="327" y1="269" x2="327" y2="249" class="line"></line><line x1="173" y1="269" x2="173" y2="283" class="line"></line><line x1="327" y1="283" x2="327" y2="269" class="line"></line><path d="M173 283 Q173 293 183 293" class="line"></path><path d="M317 293 Q327 293 327 283" class="line"></path><line x1="183" y1="293" x2="193" y2="293" class="line"></line><line x1="193" y1="293" x2="317" y2="293" class="line"></line><line x1="337" y1="193" x2="671" y2="193" class="line"></line><line x1="29" y1="183" x2="29" y2="203" class="line"></line><line x1="681" y1="203" x2="681" y2="183" class="line"></line><line x1="29" y1="203" x2="29" y2="315" class="line"></line><line x1="681" y1="315" x2="681" y2="203" class="line"></line><path d="M29 315 Q29 325 39 325" class="line"></path><path d="M671 325 Q681 325 681 315" class="line"></path><a xlink:href="#TABLE" xlink:title="TABLE"><rect x="51" y="311" width="58" height="32"></rect><rect x="49" y="309" width="58" height="32" class="nonterminal"></rect><text class="nonterminal" x="59" y="329">TABLE</text></a><line x1="39" y1="325" x2="49" y2="325" class="line"></line><line x1="107" y1="325" x2="117" y2="325" class="line"></line><rect x="129" y="311" width="34" height="32" rx="10"></rect><rect x="127" y="309" width="34" height="32" class="terminal" rx="10"></rect><text class="terminal" x="137" y="329">as</text><line x1="117" y1="325" x2="127" y2="325" class="line"></line><line x1="161" y1="325" x2="171" y2="325" class="line"></line><a xlink:href="#NAME" xlink:title="NAME"><rect x="183" y="311" width="54" height="32"></rect><rect x="181" y="309" width="54" height="32" class="nonterminal"></rect><text class="nonterminal" x="191" y="329">NAME</text></a><line x1="171" y1="325" x2="181" y2="325" class="line"></line><line x1="235" y1="325" x2="245" y2="325" class="line"></line><line x1="245" y1="325" x2="671" y2="325" class="line"></line><line x1="29" y1="315" x2="29" y2="335" class="line"></line><line x1="681" y1="335" x2="681" y2="315" class="line"></line><line x1="29" y1="335" x2="29" y2="381" class="line"></line><line x1="681" y1="381" x2="681" y2="335" class="line"></line><path d="M29 381 Q29 391 39 391" class="line"></path><path d="M671 391 Q681 391 681 381" class="line"></path><a xlink:href="#TABLE" xlink:title="TABLE"><rect x="51" y="377" width="58" height="32"></rect><rect x="49" y="375" width="58" height="32" class="nonterminal"></rect><text class="nonterminal" x="59" y="395">TABLE</text></a><line x1="39" y1="391" x2="49" y2="391" class="line"></line><line x1="107" y1="391" x2="117" y2="391" class="line"></line><rect x="129" y="377" width="52" height="32" rx="10"></rect><rect x="127" y="375" width="52" height="32" class="terminal" rx="10"></rect><text class="terminal" x="137" y="395">pivot</text><line x1="117" y1="391" x2="127" y2="391" class="line"></line><line x1="179" y1="391" x2="189" y2="391" class="line"></line><a xlink:href="#AGGREGATE_FUNCTION" xlink:title="AGGREGATE_FUNCTION"><rect x="201" y="377" width="166" height="32"></rect><rect x="199" y="375" width="166" height="32" class="nonterminal"></rect><text class="nonterminal" x="209" y="395">AGGREGATE_FUNCTION</text></a><line x1="189" y1="391" x2="199" y2="391" class="line"></line><line x1="365" y1="391" x2="375" y2="391" class="line"></line><rect x="387" y="377" width="32" height="32" rx="10"></rect><rect x="385" y="375" width="32" height="32" class="terminal" rx="10"></rect><text class="terminal" x="395" y="395">of</text><line x1="375" y1="391" x2="385" y2="391" class="line"></line><line x1="417" y1="391" x2="427" y2="391" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="439" y="377" width="56" height="32"></rect><rect x="437" y="375" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="447" y="395">FIELD</text></a><line x1="427" y1="391" x2="437" y2="391" class="line"></line><line x1="493" y1="391" x2="503" y2="391" class="line"></line><rect x="515" y="377" width="32" height="32" rx="10"></rect><rect x="513" y="375" width="32" height="32" class="terminal" rx="10"></rect><text class="terminal" x="523" y="395">in</text><line x1="503" y1="391" x2="513" y2="391" class="line"></line><line x1="545" y1="391" x2="555" y2="391" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="587" y="377" width="56" height="32"></rect><rect x="585" y="375" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="595" y="395">FIELD</text></a><line x1="575" y1="391" x2="585" y2="391" class="line"></line><line x1="641" y1="391" x2="651" y2="391" class="line"></line><path d="M555 391 L575 391 M574 391 Q565 391 565 381 L565 369 Q565 359 575 359" class="line"></path><path d="M651 391 L671 391 M651 391 Q661 391 661 381 L661 369 Q661 359 651 359" class="line"></path><line x1="575" y1="359" x2="585" y2="359" class="line"></line><line x1="585" y1="359" x2="651" y2="359" class="line"></line><line x1="694" y1="17" x2="691" y2="17" class="line"></line><polygon points="701 17 709 13 709 21" class="filled"></polygon><polygon points="701 17 693 13 693 21" class="filled"></polygon></svg><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml">referenced by:<xhtml:ul><xhtml:li><xhtml:a href="#DELETE" title="DELETE">DELETE</xhtml:a></xhtml:li><xhtml:li><xhtml:a href="#INSERT" title="INSERT">INSERT</xhtml:a></xhtml:li><xhtml:li><xhtml:a href="#MERGE" title="MERGE">MERGE</xhtml:a></xhtml:li><xhtml:li><xhtml:a href="#RESULT" title="RESULT">RESULT</xhtml:a></xhtml:li><xhtml:li><xhtml:a href="#SELECT" title="SELECT">SELECT</xhtml:a></xhtml:li><xhtml:li><xhtml:a href="#TABLE" title="TABLE">TABLE</xhtml:a></xhtml:li><xhtml:li><xhtml:a href="#TRUNCATE" title="TRUNCATE">TRUNCATE</xhtml:a></xhtml:li><xhtml:li><xhtml:a href="#UPDATE" title="UPDATE">UPDATE</xhtml:a></xhtml:li></xhtml:ul></xhtml:p><xhtml:br xmlns:xhtml="http://www.w3.org/1999/xhtml"></xhtml:br><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml" style="font-size: 14px; font-weight:bold"><xhtml:a name="CONDITION">CONDITION:</xhtml:a></xhtml:p><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="498" height="1774"><defs><style type="text/css">
    -
    -    @namespace "http://www.w3.org/2000/svg";
    -    .line                 {fill: none; stroke: #332900;}
    -    filled                {fill: #332900; stroke: none;}
    -    text                  {font-family: Verdana, Sans-serif;
    -                            font-size: 12px;
    -                            fill: #4D3D00;
    -                          }
    -    text.terminal         {font-family: Verdana, Sans-serif;
    -                            font-size: 12px;
    -                            fill: #4D3D00;
    -                            font-weight: bold;
    -                          }
    -    rect, circle, polygon {fill: #332900; stroke: #332900;}
    -    rect.terminal         {fill: #FFCC00; stroke: #332900;}
    -    rect.nonterminal      {fill: #FFEB99; stroke: #332900;}
    -    rect.text             {fill: none; stroke: none;}    
    -    polygon.regexp        {fill: #FFF5CC; stroke: #332900;}
    -  </style></defs><polygon points="9 17 1 13 1 21" class="filled"></polygon><polygon points="17 17 9 13 9 21" class="filled"></polygon><line x1="17" y1="17" x2="19" y2="17" class="line"></line><a xlink:href="#CONDITION" xlink:title="CONDITION"><rect x="51" y="3" width="92" height="32"></rect><rect x="49" y="1" width="92" height="32" class="nonterminal"></rect><text class="nonterminal" x="59" y="21">CONDITION</text></a><line x1="39" y1="17" x2="49" y2="17" class="line"></line><line x1="141" y1="17" x2="151" y2="17" class="line"></line><a xlink:href="#MORE_CONDITIONS" xlink:title="MORE_CONDITIONS"><rect x="183" y="3" width="144" height="32"></rect><rect x="181" y="1" width="144" height="32" class="nonterminal"></rect><text class="nonterminal" x="191" y="21">MORE_CONDITIONS</text></a><line x1="171" y1="17" x2="181" y2="17" class="line"></line><line x1="325" y1="17" x2="335" y2="17" class="line"></line><line x1="151" y1="17" x2="171" y2="17" class="line"></line><line x1="335" y1="17" x2="355" y2="17" class="line"></line><path d="M151 17 Q161 17 161 27" class="line"></path><path d="M345 27 Q345 17 355 17" class="line"></path><line x1="161" y1="27" x2="161" y2="51" class="line"></line><line x1="345" y1="51" x2="345" y2="27" class="line"></line><path d="M161 51 Q161 61 171 61" class="line"></path><path d="M335 61 Q345 61 345 51" class="line"></path><rect x="183" y="47" width="40" height="32" rx="10"></rect><rect x="181" y="45" width="40" height="32" class="terminal" rx="10"></rect><text class="terminal" x="191" y="65">not</text><line x1="171" y1="61" x2="181" y2="61" class="line"></line><line x1="221" y1="61" x2="231" y2="61" class="line"></line><line x1="231" y1="61" x2="335" y2="61" class="line"></line><line x1="355" y1="17" x2="459" y2="17" class="line"></line><line x1="19" y1="17" x2="39" y2="17" class="line"></line><line x1="459" y1="17" x2="479" y2="17" class="line"></line><path d="M19 17 Q29 17 29 27" class="line"></path><path d="M469 27 Q469 17 479 17" class="line"></path><line x1="29" y1="27" x2="29" y2="95" class="line"></line><line x1="469" y1="95" x2="469" y2="27" class="line"></line><path d="M29 95 Q29 105 39 105" class="line"></path><path d="M459 105 Q469 105 469 95" class="line"></path><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="51" y="91" width="56" height="32"></rect><rect x="49" y="89" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="59" y="109">FIELD</text></a><line x1="39" y1="105" x2="49" y2="105" class="line"></line><line x1="105" y1="105" x2="115" y2="105" class="line"></line><rect x="147" y="91" width="56" height="32" rx="10"></rect><rect x="145" y="89" width="56" height="32" class="terminal" rx="10"></rect><text class="terminal" x="155" y="109">isNull</text><line x1="135" y1="105" x2="145" y2="105" class="line"></line><line x1="201" y1="105" x2="211" y2="105" class="line"></line><line x1="211" y1="105" x2="439" y2="105" class="line"></line><line x1="115" y1="105" x2="135" y2="105" class="line"></line><line x1="439" y1="105" x2="459" y2="105" class="line"></line><path d="M115 105 Q125 105 125 115" class="line"></path><path d="M449 115 Q449 105 459 105" class="line"></path><line x1="125" y1="115" x2="125" y2="139" class="line"></line><line x1="449" y1="139" x2="449" y2="115" class="line"></line><path d="M125 139 Q125 149 135 149" class="line"></path><path d="M439 149 Q449 149 449 139" class="line"></path><rect x="147" y="135" width="80" height="32" rx="10"></rect><rect x="145" y="133" width="80" height="32" class="terminal" rx="10"></rect><text class="terminal" x="155" y="153">isNotNull</text><line x1="135" y1="149" x2="145" y2="149" class="line"></line><line x1="225" y1="149" x2="235" y2="149" class="line"></line><line x1="235" y1="149" x2="439" y2="149" class="line"></line><line x1="125" y1="139" x2="125" y2="159" class="line"></line><line x1="449" y1="159" x2="449" y2="139" class="line"></line><line x1="125" y1="159" x2="125" y2="183" class="line"></line><line x1="449" y1="183" x2="449" y2="159" class="line"></line><path d="M125 183 Q125 193 135 193" class="line"></path><path d="M439 193 Q449 193 449 183" class="line"></path><rect x="147" y="179" width="60" height="32" rx="10"></rect><rect x="145" y="177" width="60" height="32" class="terminal" rx="10"></rect><text class="terminal" x="155" y="197">isTrue</text><line x1="135" y1="193" x2="145" y2="193" class="line"></line><line x1="205" y1="193" x2="215" y2="193" class="line"></line><line x1="215" y1="193" x2="439" y2="193" class="line"></line><line x1="125" y1="183" x2="125" y2="203" class="line"></line><line x1="449" y1="203" x2="449" y2="183" class="line"></line><line x1="125" y1="203" x2="125" y2="227" class="line"></line><line x1="449" y1="227" x2="449" y2="203" class="line"></line><path d="M125 227 Q125 237 135 237" class="line"></path><path d="M439 237 Q449 237 449 227" class="line"></path><rect x="147" y="223" width="66" height="32" rx="10"></rect><rect x="145" y="221" width="66" height="32" class="terminal" rx="10"></rect><text class="terminal" x="155" y="241">isFalse</text><line x1="135" y1="237" x2="145" y2="237" class="line"></line><line x1="211" y1="237" x2="221" y2="237" class="line"></line><line x1="221" y1="237" x2="439" y2="237" class="line"></line><line x1="125" y1="227" x2="125" y2="247" class="line"></line><line x1="449" y1="247" x2="449" y2="227" class="line"></line><line x1="125" y1="247" x2="125" y2="271" class="line"></line><line x1="449" y1="271" x2="449" y2="247" class="line"></line><path d="M125 271 Q125 281 135 281" class="line"></path><path d="M439 281 Q449 281 449 271" class="line"></path><rect x="147" y="267" width="76" height="32" rx="10"></rect><rect x="145" y="265" width="76" height="32" class="terminal" rx="10"></rect><text class="terminal" x="155" y="285">between</text><line x1="135" y1="281" x2="145" y2="281" class="line"></line><line x1="221" y1="281" x2="231" y2="281" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="243" y="267" width="56" height="32"></rect><rect x="241" y="265" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="251" y="285">FIELD</text></a><line x1="231" y1="281" x2="241" y2="281" class="line"></line><line x1="297" y1="281" x2="307" y2="281" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="319" y="267" width="56" height="32"></rect><rect x="317" y="265" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="327" y="285">FIELD</text></a><line x1="307" y1="281" x2="317" y2="281" class="line"></line><line x1="373" y1="281" x2="383" y2="281" class="line"></line><line x1="383" y1="281" x2="439" y2="281" class="line"></line><line x1="125" y1="271" x2="125" y2="291" class="line"></line><line x1="449" y1="291" x2="449" y2="271" class="line"></line><line x1="125" y1="291" x2="125" y2="315" class="line"></line><line x1="449" y1="315" x2="449" y2="291" class="line"></line><path d="M125 315 Q125 325 135 325" class="line"></path><path d="M439 325 Q449 325 449 315" class="line"></path><rect x="167" y="311" width="44" height="32" rx="10"></rect><rect x="165" y="309" width="44" height="32" class="terminal" rx="10"></rect><text class="terminal" x="175" y="329">like</text><line x1="155" y1="325" x2="165" y2="325" class="line"></line><line x1="209" y1="325" x2="219" y2="325" class="line"></line><line x1="219" y1="325" x2="297" y2="325" class="line"></line><line x1="135" y1="325" x2="155" y2="325" class="line"></line><line x1="297" y1="325" x2="317" y2="325" class="line"></line><path d="M135 325 Q145 325 145 335" class="line"></path><path d="M307 335 Q307 325 317 325" class="line"></path><line x1="145" y1="335" x2="145" y2="359" class="line"></line><line x1="307" y1="359" x2="307" y2="335" class="line"></line><path d="M145 359 Q145 369 155 369" class="line"></path><path d="M297 369 Q307 369 307 359" class="line"></path><rect x="167" y="355" width="68" height="32" rx="10"></rect><rect x="165" y="353" width="68" height="32" class="terminal" rx="10"></rect><text class="terminal" x="175" y="373">notLike</text><line x1="155" y1="369" x2="165" y2="369" class="line"></line><line x1="233" y1="369" x2="243" y2="369" class="line"></line><line x1="243" y1="369" x2="297" y2="369" class="line"></line><line x1="145" y1="359" x2="145" y2="379" class="line"></line><line x1="307" y1="379" x2="307" y2="359" class="line"></line><line x1="145" y1="379" x2="145" y2="403" class="line"></line><line x1="307" y1="403" x2="307" y2="379" class="line"></line><path d="M145 403 Q145 413 155 413" class="line"></path><path d="M297 413 Q307 413 307 403" class="line"></path><rect x="167" y="399" width="56" height="32" rx="10"></rect><rect x="165" y="397" width="56" height="32" class="terminal" rx="10"></rect><text class="terminal" x="175" y="417">equal</text><line x1="155" y1="413" x2="165" y2="413" class="line"></line><line x1="221" y1="413" x2="231" y2="413" class="line"></line><line x1="231" y1="413" x2="297" y2="413" class="line"></line><line x1="145" y1="403" x2="145" y2="423" class="line"></line><line x1="307" y1="423" x2="307" y2="403" class="line"></line><line x1="145" y1="423" x2="145" y2="447" class="line"></line><line x1="307" y1="447" x2="307" y2="423" class="line"></line><path d="M145 447 Q145 457 155 457" class="line"></path><path d="M297 457 Q307 457 307 447" class="line"></path><rect x="167" y="443" width="76" height="32" rx="10"></rect><rect x="165" y="441" width="76" height="32" class="terminal" rx="10"></rect><text class="terminal" x="175" y="461">notEqual</text><line x1="155" y1="457" x2="165" y2="457" class="line"></line><line x1="241" y1="457" x2="251" y2="457" class="line"></line><line x1="251" y1="457" x2="297" y2="457" class="line"></line><line x1="145" y1="447" x2="145" y2="467" class="line"></line><line x1="307" y1="467" x2="307" y2="447" class="line"></line><line x1="145" y1="467" x2="145" y2="491" class="line"></line><line x1="307" y1="491" x2="307" y2="467" class="line"></line><path d="M145 491 Q145 501 155 501" class="line"></path><path d="M297 501 Q307 501 307 491" class="line"></path><rect x="167" y="487" width="78" height="32" rx="10"></rect><rect x="165" y="485" width="78" height="32" class="terminal" rx="10"></rect><text class="terminal" x="175" y="505">lessThan</text><line x1="155" y1="501" x2="165" y2="501" class="line"></line><line x1="243" y1="501" x2="253" y2="501" class="line"></line><line x1="253" y1="501" x2="297" y2="501" class="line"></line><line x1="145" y1="491" x2="145" y2="511" class="line"></line><line x1="307" y1="511" x2="307" y2="491" class="line"></line><line x1="145" y1="511" x2="145" y2="535" class="line"></line><line x1="307" y1="535" x2="307" y2="511" class="line"></line><path d="M145 535 Q145 545 155 545" class="line"></path><path d="M297 545 Q307 545 307 535" class="line"></path><rect x="167" y="531" width="98" height="32" rx="10"></rect><rect x="165" y="529" width="98" height="32" class="terminal" rx="10"></rect><text class="terminal" x="175" y="549">lessOrEqual</text><line x1="155" y1="545" x2="165" y2="545" class="line"></line><line x1="263" y1="545" x2="273" y2="545" class="line"></line><line x1="273" y1="545" x2="297" y2="545" class="line"></line><line x1="145" y1="535" x2="145" y2="555" class="line"></line><line x1="307" y1="555" x2="307" y2="535" class="line"></line><line x1="145" y1="555" x2="145" y2="579" class="line"></line><line x1="307" y1="579" x2="307" y2="555" class="line"></line><path d="M145 579 Q145 589 155 589" class="line"></path><path d="M297 589 Q307 589 307 579" class="line"></path><rect x="167" y="575" width="100" height="32" rx="10"></rect><rect x="165" y="573" width="100" height="32" class="terminal" rx="10"></rect><text class="terminal" x="175" y="593">greaterThan</text><line x1="155" y1="589" x2="165" y2="589" class="line"></line><line x1="265" y1="589" x2="275" y2="589" class="line"></line><line x1="275" y1="589" x2="297" y2="589" class="line"></line><line x1="145" y1="579" x2="145" y2="599" class="line"></line><line x1="307" y1="599" x2="307" y2="579" class="line"></line><line x1="145" y1="599" x2="145" y2="623" class="line"></line><line x1="307" y1="623" x2="307" y2="599" class="line"></line><path d="M145 623 Q145 633 155 633" class="line"></path><path d="M297 633 Q307 633 307 623" class="line"></path><rect x="167" y="619" width="122" height="32" rx="10"></rect><rect x="165" y="617" width="122" height="32" class="terminal" rx="10"></rect><text class="terminal" x="175" y="637">greaterOrEqual</text><line x1="155" y1="633" x2="165" y2="633" class="line"></line><line x1="287" y1="633" x2="297" y2="633" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="329" y="311" width="56" height="32"></rect><rect x="327" y="309" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="337" y="329">FIELD</text></a><line x1="317" y1="325" x2="327" y2="325" class="line"></line><line x1="383" y1="325" x2="393" y2="325" class="line"></line><line x1="393" y1="325" x2="439" y2="325" class="line"></line><line x1="125" y1="315" x2="125" y2="335" class="line"></line><line x1="449" y1="335" x2="449" y2="315" class="line"></line><line x1="125" y1="335" x2="125" y2="689" class="line"></line><line x1="449" y1="689" x2="449" y2="335" class="line"></line><path d="M125 689 Q125 699 135 699" class="line"></path><path d="M439 699 Q449 699 449 689" class="line"></path><rect x="167" y="685" width="32" height="32" rx="10"></rect><rect x="165" y="683" width="32" height="32" class="terminal" rx="10"></rect><text class="terminal" x="175" y="703">in</text><line x1="155" y1="699" x2="165" y2="699" class="line"></line><line x1="197" y1="699" x2="207" y2="699" class="line"></line><line x1="207" y1="699" x2="229" y2="699" class="line"></line><line x1="135" y1="699" x2="155" y2="699" class="line"></line><line x1="229" y1="699" x2="249" y2="699" class="line"></line><path d="M135 699 Q145 699 145 709" class="line"></path><path d="M239 709 Q239 699 249 699" class="line"></path><line x1="145" y1="709" x2="145" y2="733" class="line"></line><line x1="239" y1="733" x2="239" y2="709" class="line"></line><path d="M145 733 Q145 743 155 743" class="line"></path><path d="M229 743 Q239 743 239 733" class="line"></path><rect x="167" y="729" width="54" height="32" rx="10"></rect><rect x="165" y="727" width="54" height="32" class="terminal" rx="10"></rect><text class="terminal" x="175" y="747">notIn</text><line x1="155" y1="743" x2="165" y2="743" class="line"></line><line x1="219" y1="743" x2="229" y2="743" class="line"></line><a xlink:href="#FIELD" xlink:title="FIELD"><rect x="301" y="685" width="56" height="32"></rect><rect x="299" y="683" width="56" height="32" class="nonterminal"></rect><text class="nonterminal" x="309" y="703">FIELD</text></a><line x1="289" y1="699" x2="299" y2="699" class="line"></line><line x1="355" y1="699" x2="365" y2="699" class="line"></line><path d="M269 699 L289 699 M288 699 Q279 699 279 689 L279 677 Q279 667 289 667" class="line"></path><path d="M365 699 L385 699 M365 699 Q375 699 375 689 L375 677 Q375 667 365 667" class="line"></path><line x1="289" y1="667" x2="299" y2="667" class="line"></line><line x1="299" y1="667" x2="365" y2="667" class="line"></line><line x1="249" y1="699" x2="269" y2="699" class="line"></line><line x1="385" y1="699" x2="405" y2="699" class="line"></line><path d="M249 699 Q259 699 259 709" class="line"></path><path d="M395 709 Q395 699 405 699" class="line"></path><line x1="259" y1="709" x2="259" y2="733" class="line"></line><line x1="395" y1="733" x2="395" y2="709" class="line"></line><path d="M259 733 Q259 743 269 743" class="line"></path><path d="M385 743 Q395 743 395 733" class="line"></path><a xlink:href="#SELECT" xlink:title="SELECT"><rect x="281" y="729" width="66" height="32"></rect><rect x="279" y="727" width="66" height="32" class="nonterminal"></rect><text class="nonterminal" x="289" y="747">SELECT</text></a><line x1="269" y1="743" x2="279" y2="743" class="line"></line><line x1="345" y1="743" x2="355" y2="743" class="line"></line><line x1="355" y1="743" x2="385" y2="743" class="line"></line><line x1="405" y1="699" x2="439" y2="699" class="line"></line><line x1="125" y1="689" x2="125" y2="709" class="line"></line><line x1="449" y1="709" x2="449" y2="689" class="line"></line><line x1="125" y1="709" x2="125" y2="777" class="line"></line><line x1="449" y1="777" x2="449" y2="709" class="line"></line><path d="M125 777 Q125 787 135 787" class="line"></path><path d="M439 787 Q449 787 449 777" class="line"></path><rect x="167" y="773" width="80" height="32" rx="10"></rect><rect x="165" y="771" width="80" height="32" class="terminal" rx="10"></rect><text class="terminal" x="175" y="791">equalAny</text><line x1="155" y1="787" x2="165" y2="787" class="line"></line><line x1="245" y1="787" x2="255" y2="787" class="line"></line><line x1="255" y1="787" x2="333" y2="787" class="line"></line><line x1="135" y1="787" x2="155" y2="787" class="line"></line><line x1="333" y1="787" x2="353" y2="787" class="line"></line><path d="M135 787 Q145 787 145 797" class="line"></path><path d="M343 797 Q343 787 353 787" class="line"></path><line x1="145" y1="797" x2="145" y2="821" class="line"></line><line x1="343" y1="821" x2="343" y2="797" class="line"></line><path d="M145 821 Q145 831 155 831" class="line"></path><path d="M333 831 Q343 831 343 821" class="line"></path><rect x="167" y="817" width="92" height="32" rx="10"></rect><rect x="165" y="815" width="92" height="32" class="terminal" rx="10"></rect><text class="terminal" x="175" y="835">equalSome</text><line x1="155" y1="831" x2="165" y2="831" class="line"></line><line x1="257" y1="831" x2="267" y2="831" class="line"></line><line x1="267" y1="831" x2="333" y2="831" class="line"></line><line x1="145" y1="821" x2="145" y2="841" class="line"></line><line x1="343" y1="841" x2="343" y2="821" class="line"></line><line x1="145" y1="841" x2="145" y2="865" class="line"></line><line x1="343" y1="865" x2="343" y2="841" class="line"></line><path d="M145 865 Q145 875 155 875" class="line"></path><path d="M333 875 Q343 875 343 865" class="line"></path><rect x="167" y="861" width="72" height="32" rx="10"></rect><rect x="165" y="859" width="72" height="32" class="terminal" rx="10"></rect><text class="terminal" x="175" y="879">equalAll</text><line x1="155" y1="875" x2="165" y2="875" class="line"></line><line x1="237" y1="875" x2="247" y2="875" class="line"></line><line x1="247" y1="875" x2="333" y2="875" class="line"></line><line x1="145" y1="865" x2="145" y2="885" class="line"></line><line x1="343" y1="885" x2="343" y2="865" class="line"></line><line x1="145" y1="885" x2="145" y2="909" class="line"></line><line x1="343" y1="909" x2="343" y2="885" class="line"></line><path d="M145 909 Q145 919 155 919" class="line"></path><path d="M333 919 Q343 919 343 909" class="line"></path><rect x="167" y="905" width="102" height="32" rx="10"></rect><rect x="165" y="903" width="102" height="32" class="terminal" rx="10"></rect><text class="terminal" x="175" y="923">notEqualAny</text><line x1="155" y1="919" x2="165" y2="919" class="line"></line><line x1="267" y1="919" x2="277" y2="919" class="line"></line><line x1="277" y1="919" x2="333" y2="919" class="line"></line><line x1="145" y1="909" x2="145" y2="929" class="line"></line><line x1="343" y1="929" x2="343" y2="909" class="line"></line><line x1="145" y1="929" x2="145" y2="953" class="line"></line><line x1="343" y1="953" x2="343" y2="929" class="line"></line><path d="M145 953 Q145 963 155 963" class="line"></path><path d="M333 963 Q343 963 343 953" class="line"></path><rect x="167" y="949" width="114" height="32" rx="10"></rect><rect x="165" y="947" width="114" height="32" class="terminal" rx="10"></rect><text class="terminal" x="175" y="967">notEqualSome</text><line x1="155" y1="963" x2="165" y2="963" class="line"></line><line x1="279" y1="963" x2="289" y2="963" class="line"></line><line x1="289" y1="963" x2="333" y2="963" class="line"></line><line x1="145" y1="953" x2="145" y2="973" class="line"></line><line x1="343" y1="973" x2="343" y2="953" class="line"></line><line x1="145" y1="973" x2="145" y2="997" class="line"></line><line x1="343" y1="997" x2="343" y2="973" class="line"></line><path d="M145 997 Q145 1007 155 1007" class="line"></path><path d="M333 1007 Q343 1007 343 997" class="line"></path><rect x="167" y="993" width="94" height="32" rx="10"></rect><rect x="165" y="991" width="94" height="32" class="terminal" rx="10"></rect><text class="terminal" x="175" y="1011">notEqualAll</text><line x1="155" y1="1007" x2="165" y2="1007" class="line"></line><line x1="259" y1="1007" x2="269" y2="1007" class="line"></line><line x1="269" y1="1007" x2="333" y2="1007" class="line"></line><line x1="145" y1="997" x2="145" y2="1017" class="line"></line><line x1="343" y1="1017" x2="343" y2="997" class="line"></line><line x1="145" y1="1017" x2="145" y2="1041" class="line"></line><line x1="343" y1="1041" x2="343" y2="1017" class="line"></line><path d="M145 1041 Q145 1051 155 1051" class="line"></path><path d="M333 1051 Q343 1051 343 1041" class="line"></path><rect x="167" y="1037" width="102" height="32" rx="10"></rect><rect x="165" y="1035" width="102" height="32" class="terminal" rx="10"></rect><text class="terminal" x="175" y="1055">lessThanAny</text><line x1="155" y1="1051" x2="165" y2="1051" class="line"></line><line x1="267" y1="1051" x2="277" y2="1051" class="line"></line><line x1="277" y1="1051" x2="333" y2="1051" class="line"></line><line x1="145" y1="1041" x2="145" y2="1061" class="line"></line><line x1="343" y1="1061" x2="343" y2="1041" class="line"></line><line x1="145" y1="1061" x2="145" y2="1085" class="line"></line><line x1="343" y1="1085" x2="343" y2="1061" class="line"></line><path d="M145 1085 Q145 1095 155 1095" class="line"></path><path d="M333 1095 Q343 1095 343 1085" class="line"></path><rect x="167" y="1081" width="114" height="32" rx="10"></rect><rect x="165" y="1079" width="114" height="32" class="terminal" rx="10"></rect><text class="terminal" x="175" y="1099">lessThanSome</text><line x1="155" y1="1095" x2="165" y2="1095" class="line"></line><line x1="279" y1="1095" x2="289" y2="1095" class="line"></line><line x1="289" y1="1095" x2="333" y2="1095" class="line"></line><line x1="145" y1="1085" x2="145" y2="1105" class="line"></line><line x1="343" y1="1105" x2="343" y2="1085" class="line"></line><line x1="145" y1="1105" x2="145" y2="1129" class="line"></line><line x1="343" y1="1129" x2="343" y2="1105" class="line"></line><path d="M145 1129 Q145 1139 155 1139" class="line"></path><path d="M333 1139 Q343 1139 343 1129" class="line"></path><rect x="167" y="1125" width="94" height="32" rx="10"></rect><rect x="165" y="1123" width="94" height="32" class="terminal" rx="10"></rect><text class="terminal" x="175" y="1143">lessThanAll</text><line x1="155" y1="1139" x2="165" y2="1139" class="line"></line><line x1="259" y1="1139" x2="269" y2="1139" class="line"></line><line x1="269" y1="1139" x2="333" y2="1139" class="line"></line><line x1="145" y1="1129" x2="145" y2="1149" class="line"></line><line x1="343" y1="1149" x2="343" y2="1129" class="line"></line><line x1="145" y1="1149" x2="145" y2="1173" class="line"></line><line x1="343" y1="1173" x2="343" y2="1149" class="line"></line><path d="M145 1173 Q145 1183 155 1183" class="line"></path><path d="M333 1183 Q343 1183 343 1173" class="line"></path><rect x="167" y="1169" width="124" height="32" rx="10"></rect><rect x="165" y="1167" width="124" height="32" class="terminal" rx="10"></rect><text class="terminal" x="175" y="1187">lessOrEqualAny</text><line x1="155" y1="1183" x2="165" y2="1183" class="line"></line><line x1="289" y1="1183" x2="299" y2="1183" class="line"></line><line x1="299" y1="1183" x2="333" y2="1183" class="line"></line><line x1="145" y1="1173" x2="145" y2="1193" class="line"></line><line x1="343" y1="1193" x2="343" y2="1173" class="line"></line><line x1="145" y1="1193" x2="145" y2="1217" class="line"></line><line x1="343" y1="1217" x2="343" y2="1193" class="line"></line><path d="M145 1217 Q145 1227 155 1227" class="line"></path><path d="M333 1227 Q343 1227 343 1217" class="line"></path><rect x="167" y="1213" width="136" height="32" rx="10"></rect><rect x="165" y="1211" width="136" height="32" class="terminal" rx="10"></rect><text class="terminal" x="175" y="1231">lessOrEqualSome</text><line x1="155" y1="1227" x2="165" y2="1227" class="line"></line><line x1="301" y1="1227" x2="311" y2="1227" class="line"></line><line x1="311" y1="1227" x2="333" y2="1227" class="line"></line><line x1="145" y1="1217" x2="145" y2="1237" class="line"></line><line x1="343" y1="1237" x2="343" y2="1217" class="line"></line><line x1="145" y1="1237" x2="145" y2="1261" class="line"></line><line x1="343" y1="1261" x2="343" y2="1237" class="line"></line><path d="M145 1261 Q145 1271 155 1271" class="line"></path><path d="M333 1271 Q343 1271 343 1261" class="line"></path><rect x="167" y="1257" width="116" height="32" rx="10"></rect><rect x="165" y="1255" width="116" height="32" class="terminal" rx="10"></rect><text class="terminal" x="175" y="1275">lessOrEqualAll</text><line x1="155" y1="1271" x2="165" y2="1271" class="line"></line><line x1="281" y1="1271" x2="291" y2="1271" class="line"></line><line x1="291" y1="1271" x2="333" y2="1271" class="line"></line><line x1="145" y1="1261" x2="145" y2="1281" class="line"></line><line x1="343" y1="1281" x2="343" y2="1261" class="line"></line><line x1="145" y1="1281" x2="145" y2="1305" class="line"></line><line x1="343" y1="1305" x2="343" y2="1281" class="line"></line><path d="M145 1305 Q145 1315 155 1315" class="line"></path><path d="M333 1315 Q343 1315 343 1305" class="line"></path><rect x="167" y="1301" width="126" height="32" rx="10"></rect><rect x="165" y="1299" width="126" height="32" class="terminal" rx="10"></rect><text class="terminal" x="175" y="1319">greaterThanAny</text><line x1="155" y1="1315" x2="165" y2="1315" class="line"></line><line x1="291" y1="1315" x2="301" y2="1315" class="line"></line><line x1="301" y1="1315" x2="333" y2="1315" class="line"></line><line x1="145" y1="1305" x2="145" y2="1325" class="line"></line><line x1="343" y1="1325" x2="343" y2="1305" class="line"></line><line x1="145" y1="1325" x2="145" y2="1349" class="line"></line><line x1="343" y1="1349" x2="343" y2="1325" class="line"></line><path d="M145 1349 Q145 1359 155 1359" class="line"></path><path d="M333 1359 Q343 1359 343 1349" class="line"></path><rect x="167" y="1345" width="138" height="32" rx="10"></rect><rect x="165" y="1343" width="138" height="32" class="terminal" rx="10"></rect><text class="terminal" x="175" y="1363">greaterThanSome</text><line x1="155" y1="1359" x2="165" y2="1359" class="line"></line><line x1="303" y1="1359" x2="313" y2="1359" class="line"></line><line x1="313" y1="1359" x2="333" y2="1359" class="line"></line><line x1="145" y1="1349" x2="145" y2="1369" class="line"></line><line x1="343" y1="1369" x2="343" y2="1349" class="line"></line><line x1="145" y1="1369" x2="145" y2="1393" class="line"></line><line x1="343" y1="1393" x2="343" y2="1369" class="line"></line><path d="M145 1393 Q145 1403 155 1403" class="line"></path><path d="M333 1403 Q343 1403 343 1393" class="line"></path><rect x="167" y="1389" width="118" height="32" rx="10"></rect><rect x="165" y="1387" width="118" height="32" class="terminal" rx="10"></rect><text class="terminal" x="175" y="1407">greaterThanAll</text><line x1="155" y1="1403" x2="165" y2="1403" class="line"></line><line x1="283" y1="1403" x2="293" y2="1403" class="line"></line><line x1="293" y1="1403" x2="333" y2="1403" class="line"></line><line x1="145" y1="1393" x2="145" y2="1413" class="line"></line><line x1="343" y1="1413" x2="343" y2="1393" class="line"></line><line x1="145" y1="1413" x2="145" y2="1437" class="line"></line><line x1="343" y1="1437" x2="343" y2="1413" class="line"></line><path d="M145 1437 Q145 1447 155 1447" class="line"></path><path d="M333 1447 Q343 1447 343 1437" class="line"></path><rect x="167" y="1433" width="146" height="32" rx="10"></rect><rect x="165" y="1431" width="146" height="32" class="terminal" rx="10"></rect><text class="terminal" x="175" y="1451">greaterOrEqualAny</text><line x1="155" y1="1447" x2="165" y2="1447" class="line"></line><line x1="311" y1="1447" x2="321" y2="1447" class="line"></line><line x1="321" y1="1447" x2="333" y2="1447" class="line"></line><line x1="145" y1="1437" x2="145" y2="1457" class="line"></line><line x1="343" y1="1457" x2="343" y2="1437" class="line"></line><line x1="145" y1="1457" x2="145" y2="1481" class="line"></line><line x1="343" y1="1481" x2="343" y2="1457" class="line"></line><path d="M145 1481 Q145 1491 155 1491" class="line"></path><path d="M333 1491 Q343 1491 343 1481" class="line"></path><rect x="167" y="1477" width="158" height="32" rx="10"></rect><rect x="165" y="1475" width="158" height="32" class="terminal" rx="10"></rect><text class="terminal" x="175" y="1495">greaterOrEqualSome</text><line x1="155" y1="1491" x2="165" y2="1491" class="line"></line><line x1="323" y1="1491" x2="333" y2="1491" class="line"></line><line x1="145" y1="1481" x2="145" y2="1501" class="line"></line><line x1="343" y1="1501" x2="343" y2="1481" class="line"></line><line x1="145" y1="1501" x2="145" y2="1525" class="line"></line><line x1="343" y1="1525" x2="343" y2="1501" class="line"></line><path d="M145 1525 Q145 1535 155 1535" class="line"></path><path d="M333 1535 Q343 1535 343 1525" class="line"></path><rect x="167" y="1521" width="138" height="32" rx="10"></rect><rect x="165" y="1519" width="138" height="32" class="terminal" rx="10"></rect><text class="terminal" x="175" y="1539">greaterOrEqualAll</text><line x1="155" y1="1535" x2="165" y2="1535" class="line"></line><line x1="303" y1="1535" x2="313" y2="1535" class="line"></line><line x1="313" y1="1535" x2="333" y2="1535" class="line"></line><a xlink:href="#SELECT" xlink:title="SELECT"><rect x="365" y="773" width="66" height="32"></rect><rect x="363" y="771" width="66" height="32" class="nonterminal"></rect><text class="nonterminal" x="373" y="791">SELECT</text></a><line x1="353" y1="787" x2="363" y2="787" class="line"></line><line x1="429" y1="787" x2="439" y2="787" class="line"></line><line x1="29" y1="95" x2="29" y2="115" class="line"></line><line x1="469" y1="115" x2="469" y2="95" class="line"></line><line x1="29" y1="115" x2="29" y2="1569" class="line"></line><line x1="469" y1="1569" x2="469" y2="115" class="line"></line><path d="M29 1569 Q29 1579 39 1579" class="line"></path><path d="M459 1579 Q469 1579 469 1569" class="line"></path><rect x="51" y="1565" width="80" height="32" rx="10"></rect><rect x="49" y="1563" width="80" height="32" class="terminal" rx="10"></rect><text class="terminal" x="59" y="1583">condition</text><line x1="39" y1="1579" x2="49" y2="1579" class="line"></line><line x1="129" y1="1579" x2="139" y2="1579" class="line"></line><a xlink:href="#SQL" xlink:title="SQL"><rect x="151" y="1565" width="44" height="32"></rect><rect x="149" y="1563" width="44" height="32" class="nonterminal"></rect><text class="nonterminal" x="159" y="1583">SQL</text></a><line x1="139" y1="1579" x2="149" y2="1579" class="line"></line><line x1="193" y1="1579" x2="203" y2="1579" class="line"></line><line x1="203" y1="1579" x2="459" y2="1579" class="line"></line><line x1="29" y1="1569" x2="29" y2="1589" class="line"></line><line x1="469" y1="1589" x2="469" y2="1569" class="line"></line><line x1="29" y1="1589" x2="29" y2="1613" class="line"></line><line x1="469" y1="1613" x2="469" y2="1589" class="line"></line><path d="M29 1613 Q29 1623 39 1623" class="line"></path><path d="M459 1623 Q469 1623 469 1613" class="line"></path><rect x="51" y="1609" width="108" height="32" rx="10"></rect><rect x="49" y="1607" width="108" height="32" class="terminal" rx="10"></rect><text class="terminal" x="59" y="1627">trueCondition</text><line x1="39" y1="1623" x2="49" y2="1623" class="line"></line><line x1="157" y1="1623" x2="167" y2="1623" class="line"></line><line x1="167" y1="1623" x2="459" y2="1623" class="line"></line><line x1="29" y1="1613" x2="29" y2="1633" class="line"></line><line x1="469" y1="1633" x2="469" y2="1613" class="line"></line><line x1="29" y1="1633" x2="29" y2="1657" class="line"></line><line x1="469" y1="1657" x2="469" y2="1633" class="line"></line><path d="M29 1657 Q29 1667 39 1667" class="line"></path><path d="M459 1667 Q469 1667 469 1657" class="line"></path><rect x="51" y="1653" width="114" height="32" rx="10"></rect><rect x="49" y="1651" width="114" height="32" class="terminal" rx="10"></rect><text class="terminal" x="59" y="1671">falseCondition</text><line x1="39" y1="1667" x2="49" y2="1667" class="line"></line><line x1="163" y1="1667" x2="173" y2="1667" class="line"></line><line x1="173" y1="1667" x2="459" y2="1667" class="line"></line><line x1="29" y1="1657" x2="29" y2="1677" class="line"></line><line x1="469" y1="1677" x2="469" y2="1657" class="line"></line><line x1="29" y1="1677" x2="29" y2="1701" class="line"></line><line x1="469" y1="1701" x2="469" y2="1677" class="line"></line><path d="M29 1701 Q29 1711 39 1711" class="line"></path><path d="M459 1711 Q469 1711 469 1701" class="line"></path><rect x="71" y="1697" width="58" height="32" rx="10"></rect><rect x="69" y="1695" width="58" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="1715">exists</text><line x1="59" y1="1711" x2="69" y2="1711" class="line"></line><line x1="127" y1="1711" x2="137" y2="1711" class="line"></line><line x1="137" y1="1711" x2="159" y2="1711" class="line"></line><line x1="39" y1="1711" x2="59" y2="1711" class="line"></line><line x1="159" y1="1711" x2="179" y2="1711" class="line"></line><path d="M39 1711 Q49 1711 49 1721" class="line"></path><path d="M169 1721 Q169 1711 179 1711" class="line"></path><line x1="49" y1="1721" x2="49" y2="1745" class="line"></line><line x1="169" y1="1745" x2="169" y2="1721" class="line"></line><path d="M49 1745 Q49 1755 59 1755" class="line"></path><path d="M159 1755 Q169 1755 169 1745" class="line"></path><rect x="71" y="1741" width="80" height="32" rx="10"></rect><rect x="69" y="1739" width="80" height="32" class="terminal" rx="10"></rect><text class="terminal" x="79" y="1759">notExists</text><line x1="59" y1="1755" x2="69" y2="1755" class="line"></line><line x1="149" y1="1755" x2="159" y2="1755" class="line"></line><a xlink:href="#SELECT" xlink:title="SELECT"><rect x="191" y="1697" width="66" height="32"></rect><rect x="189" y="1695" width="66" height="32" class="nonterminal"></rect><text class="nonterminal" x="199" y="1715">SELECT</text></a><line x1="179" y1="1711" x2="189" y2="1711" class="line"></line><line x1="255" y1="1711" x2="265" y2="1711" class="line"></line><line x1="265" y1="1711" x2="459" y2="1711" class="line"></line><line x1="482" y1="17" x2="479" y2="17" class="line"></line><polygon points="489 17 497 13 497 21" class="filled"></polygon><polygon points="489 17 481 13 481 21" class="filled"></polygon></svg><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml">referenced by:<xhtml:ul><xhtml:li><xhtml:a href="#CONDITION" title="CONDITION">CONDITION</xhtml:a></xhtml:li><xhtml:li><xhtml:a href="#DELETE" title="DELETE">DELETE</xhtml:a></xhtml:li><xhtml:li><xhtml:a href="#FIELD" title="FIELD">FIELD</xhtml:a></xhtml:li><xhtml:li><xhtml:a href="#MERGE" title="MERGE">MERGE</xhtml:a></xhtml:li><xhtml:li><xhtml:a href="#MORE_CONDITIONS" title="MORE_CONDITIONS">MORE_CONDITIONS</xhtml:a></xhtml:li><xhtml:li><xhtml:a href="#RESULT" title="RESULT">RESULT</xhtml:a></xhtml:li><xhtml:li><xhtml:a href="#SELECT" title="SELECT">SELECT</xhtml:a></xhtml:li><xhtml:li><xhtml:a href="#UPDATE" title="UPDATE">UPDATE</xhtml:a></xhtml:li></xhtml:ul></xhtml:p><xhtml:br xmlns:xhtml="http://www.w3.org/1999/xhtml"></xhtml:br><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml" style="font-size: 14px; font-weight:bold"><xhtml:a name="MORE_CONDITIONS">MORE_CONDITIONS:</xhtml:a></xhtml:p><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="374" height="360"><defs><style type="text/css">
    -
    -    @namespace "http://www.w3.org/2000/svg";
    -    .line                 {fill: none; stroke: #332900;}
    -    filled                {fill: #332900; stroke: none;}
    -    text                  {font-family: Verdana, Sans-serif;
    -                            font-size: 12px;
    -                            fill: #4D3D00;
    -                          }
    -    text.terminal         {font-family: Verdana, Sans-serif;
    -                            font-size: 12px;
    -                            fill: #4D3D00;
    -                            font-weight: bold;
    -                          }
    -    rect, circle, polygon {fill: #332900; stroke: #332900;}
    -    rect.terminal         {fill: #FFCC00; stroke: #332900;}
    -    rect.nonterminal      {fill: #FFEB99; stroke: #332900;}
    -    rect.text             {fill: none; stroke: none;}    
    -    polygon.regexp        {fill: #FFF5CC; stroke: #332900;}
    -  </style></defs><polygon points="9 33 1 29 1 37" class="filled"></polygon><polygon points="17 33 9 29 9 37" class="filled"></polygon><line x1="17" y1="33" x2="19" y2="33" class="line"></line><rect x="91" y="19" width="44" height="32" rx="10"></rect><rect x="89" y="17" width="44" height="32" class="terminal" rx="10"></rect><text class="terminal" x="99" y="37">and</text><line x1="79" y1="33" x2="89" y2="33" class="line"></line><line x1="133" y1="33" x2="143" y2="33" class="line"></line><line x1="59" y1="33" x2="79" y2="33" class="line"></line><line x1="143" y1="33" x2="163" y2="33" class="line"></line><path d="M59 33 Q69 33 69 43" class="line"></path><path d="M153 43 Q153 33 163 33" class="line"></path><line x1="69" y1="43" x2="69" y2="67" class="line"></line><line x1="153" y1="67" x2="153" y2="43" class="line"></line><path d="M69 67 Q69 77 79 77" class="line"></path><path d="M143 77 Q153 77 153 67" class="line"></path><rect x="91" y="63" width="34" height="32" rx="10"></rect><rect x="89" y="61" width="34" height="32" class="terminal" rx="10"></rect><text class="terminal" x="99" y="81">or</text><line x1="79" y1="77" x2="89" y2="77" class="line"></line><line x1="123" y1="77" x2="133" y2="77" class="line"></line><line x1="133" y1="77" x2="143" y2="77" class="line"></line><a xlink:href="#CONDITION" xlink:title="CONDITION"><rect x="195" y="19" width="92" height="32"></rect><rect x="193" y="17" width="92" height="32" class="nonterminal"></rect><text class="nonterminal" x="203" y="37">CONDITION</text></a><line x1="183" y1="33" x2="193" y2="33" class="line"></line><line x1="285" y1="33" x2="295" y2="33" class="line"></line><line x1="163" y1="33" x2="183" y2="33" class="line"></line><line x1="295" y1="33" x2="315" y2="33" class="line"></line><path d="M163 33 Q173 33 173 43" class="line"></path><path d="M305 43 Q305 33 315 33" class="line"></path><line x1="173" y1="43" x2="173" y2="67" class="line"></line><line x1="305" y1="67" x2="305" y2="43" class="line"></line><path d="M173 67 Q173 77 183 77" class="line"></path><path d="M295 77 Q305 77 305 67" class="line"></path><a xlink:href="#SQL" xlink:title="SQL"><rect x="195" y="63" width="44" height="32"></rect><rect x="193" y="61" width="44" height="32" class="nonterminal"></rect><text class="nonterminal" x="203" y="81">SQL</text></a><line x1="183" y1="77" x2="193" y2="77" class="line"></line><line x1="237" y1="77" x2="247" y2="77" class="line"></line><line x1="247" y1="77" x2="295" y2="77" class="line"></line><line x1="39" y1="33" x2="59" y2="33" class="line"></line><line x1="315" y1="33" x2="335" y2="33" class="line"></line><path d="M39 33 Q49 33 49 43" class="line"></path><path d="M325 43 Q325 33 335 33" class="line"></path><line x1="49" y1="43" x2="49" y2="111" class="line"></line><line x1="325" y1="111" x2="325" y2="43" class="line"></line><path d="M49 111 Q49 121 59 121" class="line"></path><path d="M315 121 Q325 121 325 111" class="line"></path><rect x="91" y="107" width="66" height="32" rx="10"></rect><rect x="89" y="105" width="66" height="32" class="terminal" rx="10"></rect><text class="terminal" x="99" y="125">andNot</text><line x1="79" y1="121" x2="89" y2="121" class="line"></line><line x1="155" y1="121" x2="165" y2="121" class="line"></line><line x1="59" y1="121" x2="79" y2="121" class="line"></line><line x1="165" y1="121" x2="185" y2="121" class="line"></line><path d="M59 121 Q69 121 69 131" class="line"></path><path d="M175 131 Q175 121 185 121" class="line"></path><line x1="69" y1="131" x2="69" y2="155" class="line"></line><line x1="175" y1="155" x2="175" y2="131" class="line"></line><path d="M69 155 Q69 165 79 165" class="line"></path><path d="M165 165 Q175 165 175 155" class="line"></path><rect x="91" y="151" width="56" height="32" rx="10"></rect><rect x="89" y="149" width="56" height="32" class="terminal" rx="10"></rect><text class="terminal" x="99" y="169">orNot</text><line x1="79" y1="165" x2="89" y2="165" class="line"></line><line x1="145" y1="165" x2="155" y2="165" class="line"></line><line x1="155" y1="165" x2="165" y2="165" class="line"></line><a xlink:href="#CONDITION" xlink:title="CONDITION"><rect x="197" y="107" width="92" height="32"></rect><rect x="195" y="105" width="92" height="32" class="nonterminal"></rect><text class="nonterminal" x="205" y="125">CONDITION</text></a><line x1="185" y1="121" x2="195" y2="121" class="line"></line><line x1="287" y1="121" x2="297" y2="121" class="line"></line><line x1="297" y1="121" x2="315" y2="121" class="line"></line><line x1="49" y1="111" x2="49" y2="131" class="line"></line><line x1="325" y1="131" x2="325" y2="111" class="line"></line><line x1="49" y1="131" x2="49" y2="199" class="line"></line><line x1="325" y1="199" x2="325" y2="131" class="line"></line><path d="M49 199 Q49 209 59 209" class="line"></path><path d="M315 209 Q325 209 325 199" class="line"></path><rect x="91" y="195" width="82" height="32" rx="10"></rect><rect x="89" y="193" width="82" height="32" class="terminal" rx="10"></rect><text class="terminal" x="99" y="213">andExists</text><line x1="79" y1="209" x2="89" y2="209" class="line"></line><line x1="171" y1="209" x2="181" y2="209" class="line"></line><line x1="181" y1="209" x2="205" y2="209" class="line"></line><line x1="59" y1="209" x2="79" y2="209" class="line"></line><line x1="205" y1="209" x2="225" y2="209" class="line"></line><path d="M59 209 Q69 209 69 219" class="line"></path><path d="M215 219 Q215 209 225 209" class="line"></path><line x1="69" y1="219" x2="69" y2="243" class="line"></line><line x1="215" y1="243" x2="215" y2="219" class="line"></line><path d="M69 243 Q69 253 79 253" class="line"></path><path d="M205 253 Q215 253 215 243" class="line"></path><rect x="91" y="239" width="106" height="32" rx="10"></rect><rect x="89" y="237" width="106" height="32" class="terminal" rx="10"></rect><text class="terminal" x="99" y="257">andNotExists</text><line x1="79" y1="253" x2="89" y2="253" class="line"></line><line x1="195" y1="253" x2="205" y2="253" class="line"></line><line x1="69" y1="243" x2="69" y2="263" class="line"></line><line x1="215" y1="263" x2="215" y2="243" class="line"></line><line x1="69" y1="263" x2="69" y2="287" class="line"></line><line x1="215" y1="287" x2="215" y2="263" class="line"></line><path d="M69 287 Q69 297 79 297" class="line"></path><path d="M205 297 Q215 297 215 287" class="line"></path><rect x="91" y="283" width="72" height="32" rx="10"></rect><rect x="89" y="281" width="72" height="32" class="terminal" rx="10"></rect><text class="terminal" x="99" y="301">orExists</text><line x1="79" y1="297" x2="89" y2="297" class="line"></line><line x1="161" y1="297" x2="171" y2="297" class="line"></line><line x1="171" y1="297" x2="205" y2="297" class="line"></line><line x1="69" y1="287" x2="69" y2="307" class="line"></line><line x1="215" y1="307" x2="215" y2="287" class="line"></line><line x1="69" y1="307" x2="69" y2="331" class="line"></line><line x1="215" y1="331" x2="215" y2="307" class="line"></line><path d="M69 331 Q69 341 79 341" class="line"></path><path d="M205 341 Q215 341 215 331" class="line"></path><rect x="91" y="327" width="96" height="32" rx="10"></rect><rect x="89" y="325" width="96" height="32" class="terminal" rx="10"></rect><text class="terminal" x="99" y="345">orNotExists</text><line x1="79" y1="341" x2="89" y2="341" class="line"></line><line x1="185" y1="341" x2="195" y2="341" class="line"></line><line x1="195" y1="341" x2="205" y2="341" class="line"></line><a xlink:href="#SELECT" xlink:title="SELECT"><rect x="237" y="195" width="66" height="32"></rect><rect x="235" y="193" width="66" height="32" class="nonterminal"></rect><text class="nonterminal" x="245" y="213">SELECT</text></a><line x1="225" y1="209" x2="235" y2="209" class="line"></line><line x1="301" y1="209" x2="311" y2="209" class="line"></line><line x1="311" y1="209" x2="315" y2="209" class="line"></line><path d="M19 33 L39 33 M38 33 Q29 33 29 23 L29 11 Q29 1 39 1" class="line"></path><path d="M335 33 L355 33 M335 33 Q345 33 345 23 L345 11 Q345 1 335 1" class="line"></path><line x1="39" y1="1" x2="49" y2="1" class="line"></line><line x1="49" y1="1" x2="335" y2="1" class="line"></line><line x1="358" y1="33" x2="355" y2="33" class="line"></line><polygon points="365 33 373 29 373 37" class="filled"></polygon><polygon points="365 33 357 29 357 37" class="filled"></polygon></svg><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml">referenced by:<xhtml:ul><xhtml:li><xhtml:a href="#CONDITION" title="CONDITION">CONDITION</xhtml:a></xhtml:li><xhtml:li><xhtml:a href="#DELETE" title="DELETE">DELETE</xhtml:a></xhtml:li><xhtml:li><xhtml:a href="#MERGE" title="MERGE">MERGE</xhtml:a></xhtml:li><xhtml:li><xhtml:a href="#SELECT" title="SELECT">SELECT</xhtml:a></xhtml:li><xhtml:li><xhtml:a href="#UPDATE" title="UPDATE">UPDATE</xhtml:a></xhtml:li></xhtml:ul></xhtml:p><xhtml:br xmlns:xhtml="http://www.w3.org/1999/xhtml"></xhtml:br></body></html>
    \ No newline at end of file
    diff --git a/jOOQ-website/sql-as-seen-by-jooq.txt b/jOOQ-website/sql-as-seen-by-jooq.txt
    deleted file mode 100644
    index 86568e6a01..0000000000
    --- a/jOOQ-website/sql-as-seen-by-jooq.txt
    +++ /dev/null
    @@ -1,214 +0,0 @@
    -QUERY ::= ( SELECT | 
    -            RESULT_QUERY |
    -            UPDATE |
    -            INSERT |
    -            DELETE |
    -            MERGE |
    -            TRUNCATE |
    -            'query' SQL )
    -
    -RESULT_QUERY ::= ( SELECT |
    -                   'resultQuery' SQL )
    -
    -RESULT ::=   ( 'fetch' | 'fetchMany' | 'fetchOne' ) SQL |
    -             ( 'fetch' | 'fetchOne' ) TABLE CONDITION? |
    -             ( 'fetchAny' TABLE ) |
    -             ( 'fetch' 'JDBC ResultSet' ) |
    -             RESULT_QUERY
    -             ( 'fetch' |
    -               'fetchMany' |
    -               'fetchOne' |
    -               'fetchAny' |
    -               'fetchMaps' |
    -               'fetchOneMap' |
    -               'fetchMap' |
    -               'fetchArrays' |
    -               'fetchArray' |
    -               'fetchOneArray' |
    -               'fetchInto' |
    -               'fetchLater' |
    -               'execute' 'getResult' )
    -
    -CURSOR ::= ( RESULT_QUERY 'fetchLazy' )
    -
    -SELECT ::= ( ( 'select' | 'selectDistinct' ) FIELD* |
    -               'selectOne' |
    -               'selectZero' |
    -               'selectCount' )
    -             ( 'select' FIELD* )* 
    -             ( 'hint' SQL )*
    -             ( 'from' ( TABLE+ | SQL )
    -               ( ( 'join' | 'leftOuterJoin' | 'rightOuterJoin' | 'fullOuterJoin' )
    -                 ( TABLE | SQL ) 
    -                 ( 'on' ( CONDITION+ | SQL ) MORE_CONDITIONS? |
    -                   'using' FIELD+ ) |
    -                 ( 'crossJoin' | 'naturalJoin' | 'naturalLeftOuterJoin' | 'naturalRightOuterJoin' )
    -               ( TABLE | SQL ) )* )?
    -             ( ( 'where' ( CONDITION+ | SQL ) | 
    -                 ( 'whereExists' | 'whereNotExists' ) SELECT ) MORE_CONDITIONS? )?
    -             ( ( 'connectBy' | 'connectByNoCycle' )
    -               ( CONDITION | SQL )
    -               ( 'and' ( CONDITION | SQL ) )* 
    -               ( 'startWith' ( CONDITION | SQL ) )? )?
    -             ( 'groupBy' GROUP_FIELD+ )?
    -             ( 'having' ( CONDITION+ | SQL ) MORE_CONDITIONS? )?
    -             ( 'orderBy' ( FIELD+ | SORT_FIELD+ | INT+ ) )?
    -             ( ( 'limit' INT ( 'offset' INT | INT )? ) |
    -               ( ( 'forUpdate' 
    -                   ( 'of' ( FIELD+ | TABLE+ ) )? 
    -                   ( 'wait' INT |
    -                     'noWait' |
    -                     'skipLocked' )? ) |
    -                 'forShare' ) )?
    -           ( ( 'union' | 'unionAll' | 'except' | 'intersect' ) SELECT )*
    -
    -UPDATE ::=  ( 'update' TABLE )
    -            ( 'set' FIELD FIELD )+
    -            ( ( 'where' ( CONDITION+ | SQL ) | 
    -            ( 'whereExists' | 'whereNotExists' ) SELECT ) MORE_CONDITIONS? )?
    -
    -INSERT ::=  ( 'insertInto' )
    -            ( SELECT | 
    -              TABLE 
    -              ( ( ( 'set' FIELD FIELD )+ ( 'newRecord' ( 'set' FIELD FIELD )+ )* | 
    -                        ( 'values' FIELD+ )+ ) |
    -                FIELD+ ( 'values' FIELD+ )+ ) 
    -              ( ( 'onDuplicateKeyUpdate' ( 'set' FIELD FIELD )+ ) | 
    -                ( 'returning' FIELD* ) )? )
    -
    -DELETE ::=  ( 'delete' TABLE )
    -            ( ( 'where' ( CONDITION+ | SQL ) | 
    -            ( 'whereExists' | 'whereNotExists' ) SELECT ) MORE_CONDITIONS? )?
    -
    -MERGE ::= ( 'mergeInto' TABLE )
    -          ( 'using' TABLE | 'usingDual' )
    -          ( 'on' ( CONDITION+ | SQL ) MORE_CONDITIONS? )
    -          ( 'whenMatchedThenUpdate' 
    -            ( 'set' FIELD FIELD )+ 
    -            ( 'where' CONDITION 
    -              ( 'deleteWhere' CONDITION )? )? )?
    -          ( 'whenNotMatchedThenInsert' 
    -            ( ( 'set' FIELD FIELD )+ | 
    -              ( FIELD+ 'values' FIELD+) ) 
    -            ( 'where' CONDITION )? )?
    -
    -TRUNCATE ::= 'truncate' TABLE
    -
    -SQL ::= 'SQL String' BINDING*
    -
    -BINDING ::= 'Any Java Object'
    -BINDING_MAP ::= 'A map of bind values'
    -
    -FIELD ::= ( 'jOOQ generated Field' ) |
    -          ( 'CustomField' ) |
    -          ( ( 'val' | 'value' ) BINDING ) |
    -          ( 'param' NAME BINDING? ) |
    -          ( 'literal' BINDING ) |
    -          FIELD 'as' NAME |
    -          FIELD 'cast' TYPE |
    -          ( 'zero' | 'one' | 'two' | 'pi' | 'e' ) |
    -          ( 'currentDate' | 'currentTime' | 'currentTimestamp' | 'currentUser' ) |
    -          ( 'rand' ) |
    -          ( 'field' SQL ) |
    -          ( 'function' NAME FIELD* ) |
    -          ( ( 'decode' )
    -            ( ( ( ( 'value' FIELD )
    -                  ( 'when' FIELD FIELD )+ ) |
    -                  ( 'when' CONDITION FIELD )+ )
    -              ( 'otherwise' FIELD )? | 
    -              ( FIELD+ ) ) ) |
    -          ( 'grouping' FIELD ) |
    -          ( 'groupingId' FIELD+ ) |
    -          ( 'cast' BINDING TYPE ) |
    -          ( 'castNull' TYPE ) |
    -          ( ( 'coalesce' | 'concat' | 'greatest' | 'least' ) FIELD+ ) |
    -          ( ( 'nvl' | 'nullif' ) FIELD FIELD ) |
    -          ( 'nvl2' FIELD FIELD FIELD ) |
    -          ( ( 'upper' | 'lower' | 'trim' | 'rtrim' | 'ltrim' | 
    -              'ascii' | 'length' | 'charLength' | 'bitLength' | 'octetLength' ) FIELD ) |
    -          ( ( 'rpad' | 'lpad' | 'replace' | 'substring' ) FIELD FIELD FIELD? ) |
    -          ( ( 'repeat' | 'position' ) FIELD FIELD ) |
    -          ( 'extract' FIELD FIELD ) |
    -          ( ( 'bitCount' | 'bitNot' ) FIELD ) |
    -          ( ( 'bitAnd' | 'bitNand' | 'bitOr' | 'bitNor' | 'bitXor' | 'bitXNor' | 'shl' | 'shr' ) FIELD FIELD ) |
    -          ( FIELD 'neg' ) |
    -          ( FIELD ( 'add' | 'sub' | 'mul' | 'div' | 'mod' ) FIELD ) |
    -          ( ( 'sign' | 'abs' | 'floor' | 'ceil' | 'sqrt' | 'exp' | 'ln' | 
    -              'acos' | 'asin' | 'atan' | 'cos' | 'sin' | 'tan' | 'cot' |
    -              'sinh' | 'cosh' | 'tanh' | 'coth' | 'deg' | 'rad' ) FIELD ) |
    -          ( ( 'log' | 'power' | 'atan2' ) FIELD FIELD ) |
    -          ( 'round' FIELD FIELD? ) |
    -          AGGREGATE_FUNCTION ( 'over' PARTITION_CLAUSE )?
    -
    -AGGREGATE_FUNCTION ::=           
    -              'count' | 'rowNumber' | 'rank' | 'denseRank' | 'percentRank' | 'cumeDist' |
    -              ( ( 'count' | 'countDistinct' | 
    -			      'max' | 'maxDistinct' |
    -				  'min' | 'minDistinct' |
    -				  'sum' | 'sumDistinct' |
    -				  'avg' | 'avgDistinct' |
    -				  'median' | 
    -                  'stddevPop' | 'stddevSamp' | 'varPop' | 'varSamp' ) FIELD ) |
    -              ( 'ntile' INT ) | 
    -              ( ( ( 'firstValue' | 'lastValue' ) FIELD |
    -                  ( ( 'lead' | 'lag' ) FIELD ( INT FIELD? )? ) ) 
    -                ( 'ignoreNulls' | 'respectNulls' )? )
    -
    -PARTITION_CLAUSE ::= ( 'partitionBy' FIELD+ | 'partitionByOne' )?
    -                     ( 'orderBy' ( FIELD+ | SORT_FIELD+ )
    -                       ( 'rowsUnboundedPreceding' | 
    -                         'rowsPreceding' INT | 
    -                         'rowsCurrentRow' |
    -                         'rowsUnboundedFollowing' |
    -                         'rowsFollowing' INT | 
    -                         ( 'rowsBetweenUnboundedPreceding' | 
    -                           'rowsBetweenPreceding' INT |
    -                           'rowsBetweenCurrentRow' |
    -                           'rowsBetweenUnboundedFollowing' |
    -                           'rowsBetweenFollowing' INT ) 
    -                         ( 'andUnboundedPreceding' |
    -                           'andPreceding' INT |
    -                           'andCurrentRow' |
    -                           'andUnboundedFollowing' |
    -                           'andFollowing' INT ) )? )?
    -           
    -GROUP_FIELD ::= ( FIELD | 
    -                  'rollup' FIELD+ |
    -                  'cube' FIELD+ |
    -                  'groupingSets' ( FIELD+ | ( '[' FIELD+ ']' )+ ) )
    -
    -
    -SORT_FIELD ::= FIELD ( 'asc' | 'desc' | 'sortAsc' BINDING+ | 'sortDesc' BINDING+ | 'sort' BINDING_MAP )
    -                     ( 'nullsFirst' | 'nullsLast' )?
    -INT ::= [0-9]+ /* ws: explicit */
    -NAME ::= [A-Za-z0-9]+ /* ws: explicit */
    -TABLE ::= ( 'jOOQ generated Table' ) |
    -          ( 'CustomTable' ) |
    -          ( 'table' ( SQL | SELECT ) ) |
    -          ( ( 'table' | 'unnest' ) ( FIELD | BINDING* ) ) |
    -		  ( TABLE 'as' NAME ) |
    -		  ( TABLE 'pivot' AGGREGATE_FUNCTION+ 'on' FIELD 'in' FIELD+ )
    -
    -CONDITION ::= ( CONDITION ( MORE_CONDITIONS | 'not' ) ) |
    -              ( FIELD ( 'isNull' | 
    -                        'isNotNull' | 
    -                        'isTrue' | 
    -                        'isFalse' | 
    -                        'between' FIELD FIELD |
    -                        ( 'like' | 'notLike' | 'equal' | 'notEqual' |
    -                          'lessThan' | 'lessOrEqual' | 'greaterThan' | 'greaterOrEqual' ) FIELD |
    -                        ( 'in' | 'notIn' ) ( FIELD+ | SELECT ) |
    -                        ( 'equalAny' | 'equalSome' | 'equalAll' | 
    -                          'notEqualAny' | 'notEqualSome' | 'notEqualAll' |
    -                          'lessThanAny' | 'lessThanSome' | 'lessThanAll' |
    -                          'lessOrEqualAny' | 'lessOrEqualSome' | 'lessOrEqualAll' |
    -                          'greaterThanAny' | 'greaterThanSome' | 'greaterThanAll' |
    -                          'greaterOrEqualAny' | 'greaterOrEqualSome' | 'greaterOrEqualAll' ) SELECT ) ) |
    -              ( 'condition' SQL ) |
    -              ( 'trueCondition' | 'falseCondition' ) |
    -              ( 'exists' | 'notExists' ) SELECT
    -
    -MORE_CONDITIONS ::= ( ( 'and' | 'or') ( CONDITION | SQL ) | 
    -                      ( 'andNot' | 'orNot' ) CONDITION |
    -                      ( 'andExists' | 'andNotExists' | 'orExists' | 'orNotExists' ) SELECT )+
    -
    diff --git a/jOOQ-website/src/main/java/Transform.java b/jOOQ-website/src/main/java/Transform.java
    deleted file mode 100644
    index 0a0c961614..0000000000
    --- a/jOOQ-website/src/main/java/Transform.java
    +++ /dev/null
    @@ -1,424 +0,0 @@
    -/**
    - * Copyright (c) 2009-2013, Data Geekery GmbH (http://www.datageekery.com)
    - * All rights reserved.
    - *
    - * This work is dual-licensed
    - * - under the Apache Software License 2.0 (the "ASL")
    - * - under the jOOQ License and Maintenance Agreement (the "jOOQ License")
    - * =============================================================================
    - * You may choose which license applies to you:
    - *
    - * - If you're using this work with Open Source databases, you may choose
    - *   either ASL or jOOQ License.
    - * - If you're using this work with at least one commercial database, you must
    - *   choose jOOQ License
    - *
    - * For more information, please visit http://www.jooq.org/licenses
    - *
    - * Apache Software License 2.0:
    - * -----------------------------------------------------------------------------
    - * Licensed under the Apache License, Version 2.0 (the "License");
    - * you may not use this file except in compliance with the License.
    - * You may obtain a copy of the License at
    - *
    - *  http://www.apache.org/licenses/LICENSE-2.0
    - *
    - * Unless required by applicable law or agreed to in writing, software
    - * distributed under the License is distributed on an "AS IS" BASIS,
    - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    - * See the License for the specific language governing permissions and
    - * limitations under the License.
    - *
    - * jOOQ License and Maintenance Agreement:
    - * -----------------------------------------------------------------------------
    - * Data Geekery grants the Customer the non-exclusive, timely limited and
    - * non-transferable license to install and use the Software under the terms of
    - * the jOOQ License and Maintenance Agreement.
    - *
    - * This library is distributed with a LIMITED WARRANTY. See the jOOQ License
    - * and Maintenance Agreement for more details: http://www.jooq.org/licensing
    - */
    -import static org.joox.JOOX.$;
    -
    -import java.io.BufferedOutputStream;
    -import java.io.File;
    -import java.io.FileOutputStream;
    -import java.io.InputStream;
    -import java.io.OutputStream;
    -import java.io.PrintStream;
    -import java.io.PrintWriter;
    -import java.util.ArrayList;
    -import java.util.Arrays;
    -import java.util.Collections;
    -import java.util.HashSet;
    -import java.util.List;
    -import java.util.regex.Matcher;
    -import java.util.regex.Pattern;
    -
    -import javax.xml.transform.Result;
    -import javax.xml.transform.Source;
    -import javax.xml.transform.Transformer;
    -import javax.xml.transform.TransformerFactory;
    -import javax.xml.transform.dom.DOMSource;
    -import javax.xml.transform.sax.SAXResult;
    -import javax.xml.transform.stream.StreamResult;
    -import javax.xml.transform.stream.StreamSource;
    -
    -import org.jooq.Constants;
    -
    -import org.apache.commons.lang3.StringUtils;
    -import org.apache.fop.apps.FOUserAgent;
    -import org.apache.fop.apps.Fop;
    -import org.apache.fop.apps.FopFactory;
    -import org.apache.fop.apps.MimeConstants;
    -import org.joox.Context;
    -import org.joox.Each;
    -import org.joox.Filter;
    -import org.joox.Match;
    -
    -/**
    - * XSL transformation utility for HTML pages
    - *
    - * @author Lukas Eder
    - */
    -public class Transform {
    -
    -    private static final FopFactory fopFactory   = FopFactory.newInstance();
    -    private static final String     minorVersion = Constants.MINOR_VERSION;
    -    private static final String     version      = Constants.FULL_VERSION;
    -    private static final String     codegenXSDVersion;
    -    private static final String     exportXSDVersion;
    -    private static final String     runtimeXSDVersion;
    -    private static final String     baseDir      = "";
    -
    -    static {
    -        File xsdDir = new File("./xsd");
    -        String[] files = xsdDir.list();
    -
    -        List<String> codegenXSDVersions = new ArrayList<String>();
    -        List<String> exportXSDVersions = new ArrayList<String>();
    -        List<String> runtimeXSDVersions = new ArrayList<String>();
    -
    -        Pattern p = Pattern.compile("jooq-(\\w+)-(\\d+\\.\\d+\\.\\d+).xsd");
    -
    -        for (String file : files) {
    -            Matcher m = p.matcher(file);
    -
    -            if (m.matches()) {
    -                if ("codegen".equals(m.group(1))) {
    -                    codegenXSDVersions.add(m.group(2));
    -                }
    -                else if ("export".equals(m.group(1))) {
    -                    exportXSDVersions.add(m.group(2));
    -                }
    -                else if ("runtime".equals(m.group(1))) {
    -                    runtimeXSDVersions.add(m.group(2));
    -                }
    -            }
    -        }
    -
    -        codegenXSDVersions.add(version);
    -        exportXSDVersions.add(version);
    -        runtimeXSDVersions.add(version);
    -
    -        Collections.sort(codegenXSDVersions);
    -        Collections.sort(exportXSDVersions);
    -        Collections.sort(runtimeXSDVersions);
    -
    -        codegenXSDVersion = codegenXSDVersions.get(codegenXSDVersions.lastIndexOf(version) - 1);
    -        exportXSDVersion = exportXSDVersions.get(exportXSDVersions.lastIndexOf(version) - 1);
    -        runtimeXSDVersion = runtimeXSDVersions.get(runtimeXSDVersions.lastIndexOf(version) - 1);
    -    }
    -
    -    public static void main(String[] args) throws Exception {
    -        System.out.println("Transforming manual: " + file("manual.xml"));
    -        System.out.println();
    -
    -//        System.out.println("Transforming multi-page manual");
    -//        System.out.println("------------------------------");
    -//        multiplePages();
    -//
    -//        System.out.println();
    -//        System.out.println("Transforming single-page manual");
    -//        System.out.println("-------------------------------");
    -//        singlePage();
    -
    -        System.out.println();
    -        System.out.println("Transforming PDF manual");
    -        System.out.println("-------------------------------");
    -        pdf();
    -    }
    -
    -    private static String file(String name) {
    -        if (minorVersion == null || minorVersion.equals("")) {
    -            return name;
    -        }
    -
    -        return name.replaceAll("\\.\\w{3}$", "-" + minorVersion + "$0");
    -    }
    -
    -    private static String path(String path) {
    -        return root() + path;
    -    }
    -
    -    private static String root() {
    -        if (minorVersion == null || minorVersion.equals("")) {
    -            return "";
    -        }
    -
    -        return "doc/" + minorVersion + "/";
    -    }
    -
    -    private static String relative(String path) {
    -        return StringUtils.join(Collections.nCopies(path.split("/").length, ".."), "/") + "/";
    -    }
    -
    -    private static void replaceVariables(Match manual) {
    -        manual.find("content").add(manual.find("title")).each(new Each() {
    -            @Override
    -            public void each(Context context) {
    -                String content = $(context.element()).content();
    -
    -                // Work around a jOOX bug
    -                content = content.replaceAll("^<content>((?s:.*))</content>$", "$1");
    -                boolean changed = false;
    -
    -                if (content.contains("{jooq-minor-version}")) {
    -                    content = content.replace("{jooq-minor-version}", minorVersion + ".0");
    -                    changed = true;
    -                }
    -
    -                if (content.contains("{jooq-version}")) {
    -                    content = content.replace("{jooq-version}", version);
    -                    changed = true;
    -                }
    -
    -                if (content.contains("{max-row-degree}")) {
    -                    content = content.replace("{max-row-degree}", "" + Constants.MAX_ROW_DEGREE);
    -                    changed = true;
    -                }
    -
    -                if (content.contains("{codegen-xsd-version}")) {
    -                    content = content.replace("{codegen-xsd-version}", codegenXSDVersion);
    -                    changed = true;
    -                }
    -
    -                if (content.contains("{export-xsd-version}")) {
    -                    content = content.replace("{export-xsd-version}", exportXSDVersion);
    -                    changed = true;
    -                }
    -
    -                if (content.contains("{runtime-xsd-version}")) {
    -                    content = content.replace("{runtime-xsd-version}", runtimeXSDVersion);
    -                    changed = true;
    -                }
    -
    -                if (changed) {
    -                    $(context.element()).content(content);
    -                }
    -            }
    -        });
    -    }
    -
    -    public static void multiplePages() throws Exception {
    -        InputStream isXML = Transform.class.getResourceAsStream(file("manual.xml"));
    -        InputStream isXSL = Transform.class.getResourceAsStream("html-pages.xsl");
    -
    -        StreamSource xsl = new StreamSource(isXSL);
    -        TransformerFactory factory = TransformerFactory.newInstance();
    -        Transformer transformer = factory.newTransformer(xsl);
    -
    -        Match manual = $(isXML);
    -        replaceVariables(manual);
    -
    -        List<String> ids = manual.find("section").ids();
    -        HashSet<String> uniqueIds = new HashSet<String>(ids);
    -
    -        if (ids.size() != uniqueIds.size()) {
    -            for (String id : uniqueIds) {
    -                ids.remove(id);
    -            }
    -
    -            throw new Exception("Duplicate section ids found! " + ids);
    -        }
    -
    -        int blanks = 0, completed = 0;
    -
    -        Filter f = new Filter() {
    -            @Override
    -            public boolean filter(Context arg0) {
    -                return Arrays.asList("section", "redirect").contains($(arg0.element()).tag());
    -            }
    -        };
    -
    -        for (Match section : manual.xpath("//section | //redirect").each()) {
    -            Match sections = section.add(section.parents(f)).reverse();
    -
    -            String path = path(StringUtils.join(sections.ids(), "/"));
    -            String relativePath = relative(path);
    -            String root = root();
    -            File dir = new File(baseDir + path);
    -            dir.mkdirs();
    -
    -            File file = new File(dir, "index.php");
    -            file.delete();
    -            FileOutputStream out = new FileOutputStream(file);
    -
    -            // A redirection section
    -            if ("redirect".equals(section.tag())) {
    -                Match redirectSection = manual.xpath("//section[@id='" + section.attr("redirect-to") + "']");
    -                Match redirectSections = redirectSection.add(redirectSection.parents("section")).reverse();
    -
    -                String redirectPath = path(StringUtils.join(redirectSections.ids(), "/"));
    -
    -                PrintWriter o = new PrintWriter(out);
    -                o.println("<?php header('Location: " + relativePath + redirectPath + "'); ?>");
    -                o.flush();
    -
    -                System.out.println("[r] Redirecting  section " + path + " to " + redirectPath);
    -            }
    -
    -            // A regular section (without redirection)
    -            else {
    -                PrintStream stream = System.out;
    -                boolean blank = StringUtils.isBlank(section.find("content").text());
    -                if (blank) {
    -                    blanks++;
    -                    stream = System.err;
    -                }
    -                else {
    -                    completed++;
    -                }
    -
    -                stream.print("[");
    -                stream.print(blank ? " " : "x");
    -                stream.println("] Transforming section " + path);
    -
    -                Source source = new DOMSource(manual.document());
    -                Result target = new StreamResult(out);
    -
    -                transformer.setParameter("sectionID", section.id());
    -                transformer.setParameter("relativePath", relativePath);
    -                transformer.setParameter("root", root);
    -                transformer.transform(source, target);
    -            }
    -
    -            out.close();
    -        }
    -        System.out.println("    Completed sections : " + completed + " / " + (blanks + completed) + " (" + (100 * completed / (blanks + completed)) + "%)");
    -    }
    -
    -    public static void singlePage() throws Exception {
    -        InputStream isXML = Transform.class.getResourceAsStream(file("manual.xml"));
    -        InputStream isXSL = Transform.class.getResourceAsStream("html-page.xsl");
    -
    -        StreamSource xsl = new StreamSource(isXSL);
    -        TransformerFactory factory = TransformerFactory.newInstance();
    -        Transformer transformer = factory.newTransformer(xsl);
    -
    -        String relativePath = relative(path("manual-single-page"));
    -        String root = root();
    -        Match manual = $(isXML);
    -        replaceVariables(manual);
    -
    -        File dir = new File(baseDir + path("manual-single-page"));
    -        dir.mkdirs();
    -
    -        System.out.println("Transforming manual");
    -        File file = new File(dir, "index.php");
    -        file.delete();
    -        FileOutputStream out = new FileOutputStream(file);
    -
    -        Source source = new DOMSource(manual.document());
    -        Result target = new StreamResult(out);
    -
    -        transformer.setParameter("relativePath", relativePath);
    -        transformer.setParameter("root", root);
    -        transformer.transform(source, target);
    -
    -        out.close();
    -    }
    -
    -    public static void pdf() throws Exception {
    -
    -        // XML -> FO
    -        // ---------------------------------------------------------------------
    -        System.out.println("Transforming XML -> FO");
    -        InputStream isXML = Transform.class.getResourceAsStream(file("manual.xml"));
    -        InputStream isXSL = Transform.class.getResourceAsStream("pdf.xsl");
    -
    -        StreamSource xsl = new StreamSource(isXSL);
    -        TransformerFactory factory = TransformerFactory.newInstance();
    -        Transformer transformer = factory.newTransformer(xsl);
    -
    -        Match manual = $(isXML);
    -        replaceVariables(manual);
    -        checkCodeBlockLengths(manual);
    -
    -        File dir = new File(baseDir + path("manual-pdf"));
    -        dir.mkdirs();
    -        FileOutputStream fout = new FileOutputStream(new File(dir, file("jOOQ-manual.fo.xml")));
    -
    -        Source source = new DOMSource(manual.document());
    -        Result target = new StreamResult(fout);
    -
    -        transformer.transform(source, target);
    -        fout.close();
    -
    -        // FO -> PDF
    -        // ---------------------------------------------------------------------
    -        // See an example about how to do it here:
    -        // http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/examples/embedding/java/embedding/ExampleFO2PDF.java?view=markup
    -        System.out.println("Transforming FO -> PDF");
    -
    -        OutputStream out = null;
    -
    -        fopFactory.setUserConfig(new File(Transform.class.getResource("/fop.config.xml").toURI()));
    -        FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
    -        // configure foUserAgent as desired
    -
    -        // Setup output stream.  Note: Using BufferedOutputStream
    -        // for performance reasons (helpful with FileOutputStreams).
    -        File file = new File(dir, file("jOOQ-manual.pdf"));
    -        out = new FileOutputStream(file);
    -        out = new BufferedOutputStream(out);
    -
    -        // Construct fop with desired output format
    -        Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out);
    -
    -        // Setup JAXP using identity transformer
    -        transformer = factory.newTransformer(); // identity transformer
    -
    -        // Setup input stream
    -        Source src = new StreamSource(new File(dir, file("jOOQ-manual.fo.xml")));
    -
    -        // Resulting SAX events (the generated FO) must be piped through to FOP
    -        Result res = new SAXResult(fop.getDefaultHandler());
    -
    -        // Start XSLT transformation and FOP processing
    -        transformer.transform(src, res);
    -
    -        out.flush();
    -        out.close();
    -
    -        // Open the PDF and check it
    -        Runtime.getRuntime().exec(new String[] {
    -                "C:\\Program Files (x86)\\Adobe\\Reader 11.0\\Reader\\AcroRd32.exe",
    -                file.getAbsolutePath() });
    -    }
    -
    -    private static void checkCodeBlockLengths(Match manual) {
    -        manual.xpath("//pre|//java|//sql|//text|//xml|//config").each(new Each() {
    -            @Override
    -            public void each(Context context) {
    -                String content = $(context.element()).content();
    -
    -                for (String line : content.split("[\\r\\n]")) {
    -                    if (line.length() > 128) {
    -                        System.out.println("WARNING: Code block line length exceeds 128 characters : (" + line.length() + ") " + line);
    -                    }
    -                }
    -            }
    -        });
    -    }
    -}
    diff --git a/jOOQ-website/src/main/resources/OPENSANS-LIGHT.TTF b/jOOQ-website/src/main/resources/OPENSANS-LIGHT.TTF
    deleted file mode 100644
    index 0d381897da..0000000000
    Binary files a/jOOQ-website/src/main/resources/OPENSANS-LIGHT.TTF and /dev/null differ
    diff --git a/jOOQ-website/src/main/resources/ROBOTO-LIGHT.TTF b/jOOQ-website/src/main/resources/ROBOTO-LIGHT.TTF
    deleted file mode 100644
    index 664e1b2f9d..0000000000
    Binary files a/jOOQ-website/src/main/resources/ROBOTO-LIGHT.TTF and /dev/null differ
    diff --git a/jOOQ-website/src/main/resources/fop.config.xml b/jOOQ-website/src/main/resources/fop.config.xml
    deleted file mode 100644
    index 8594a42243..0000000000
    --- a/jOOQ-website/src/main/resources/fop.config.xml
    +++ /dev/null
    @@ -1,65 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?>
    -<!-- 
    -  * Copyright (c) 2009-2013, Data Geekery GmbH (http://www.datageekery.com)
    -  * All rights reserved.
    -  *
    -  * This work is dual-licensed
    -  * - under the Apache Software License 2.0 (the "ASL")
    -  * - under the jOOQ License and Maintenance Agreement (the "jOOQ License")
    -  * ===========================================================================
    -  * You may choose which license applies to you:
    -  *
    -  * - If you're using this work with Open Source databases, you may choose
    -  *   either ASL or jOOQ License.
    -  * - If you're using this work with at least one commercial database, you must
    -  *   choose jOOQ License
    -  *
    -  * For more information, please visit http://www.jooq.org/licenses
    -  *
    -  * Apache Software License 2.0:
    -  * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -  * Licensed under the Apache License, Version 2.0 (the "License");
    -  * you may not use this file except in compliance with the License.
    -  * You may obtain a copy of the License at
    -  *
    -  *  http://www.apache.org/licenses/LICENSE-2.0
    -  *
    -  * Unless required by applicable law or agreed to in writing, software
    -  * distributed under the License is distributed on an "AS IS" BASIS,
    -  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -  * See the License for the specific language governing permissions and
    -  * limitations under the License.
    -  *
    -  * jOOQ License and Maintenance Agreement:
    -  * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -  * Data Geekery grants the Customer the non-exclusive, timely limited and
    -  * non-transferable license to install and use the Software under the terms of
    -  * the jOOQ License and Maintenance Agreement.
    -  *
    -  * This library is distributed with a LIMITED WARRANTY. See the jOOQ License
    -  * and Maintenance Agreement for more details: http://www.jooq.org/licensing
    -  -->
    -<fop version="1.0">
    -	<renderers>
    -		<renderer mime="application/pdf">
    -			<filterList>
    -				<!-- provides compression using zlib flate (default is on) -->
    -				<value>flate</value>
    -			</filterList>
    -			<fonts>
    -				<font
    -					metrics-url="C:/Users/lukas/workspace/jOOQ/jOOQ-website/src/main/resources/roboto.xml"
    -					embed-url="C:/Users/lukas/workspace/jOOQ/jOOQ-website/src/main/resources/ROBOTO-LIGHT.TTF"
    -					kerning="yes">
    -					<font-triplet name="Roboto" style="normal" weight="normal" />
    -				</font>
    -				<font
    -					metrics-url="C:/Users/lukas/workspace/jOOQ/jOOQ-website/src/main/resources/opensans.xml"
    -					embed-url="C:/Users/lukas/workspace/jOOQ/jOOQ-website/src/main/resources/OPENSANS-LIGHT.TTF"
    -					kerning="yes">
    -					<font-triplet name="Open Sans" style="normal" weight="normal" />
    -				</font>
    -			</fonts>
    -		</renderer>
    -	</renderers>
    -</fop>
    \ No newline at end of file
    diff --git a/jOOQ-website/src/main/resources/html-page.xsl b/jOOQ-website/src/main/resources/html-page.xsl
    deleted file mode 100644
    index f1e77664bd..0000000000
    --- a/jOOQ-website/src/main/resources/html-page.xsl
    +++ /dev/null
    @@ -1,128 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?>
    -<!-- 
    -  * Copyright (c) 2009-2013, Data Geekery GmbH (http://www.datageekery.com)
    -  * All rights reserved.
    -  *
    -  * This work is dual-licensed
    -  * - under the Apache Software License 2.0 (the "ASL")
    -  * - under the jOOQ License and Maintenance Agreement (the "jOOQ License")
    -  * ===========================================================================
    -  * You may choose which license applies to you:
    -  *
    -  * - If you're using this work with Open Source databases, you may choose
    -  *   either ASL or jOOQ License.
    -  * - If you're using this work with at least one commercial database, you must
    -  *   choose jOOQ License
    -  *
    -  * For more information, please visit http://www.jooq.org/licenses
    -  *
    -  * Apache Software License 2.0:
    -  * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -  * Licensed under the Apache License, Version 2.0 (the "License");
    -  * you may not use this file except in compliance with the License.
    -  * You may obtain a copy of the License at
    -  *
    -  *  http://www.apache.org/licenses/LICENSE-2.0
    -  *
    -  * Unless required by applicable law or agreed to in writing, software
    -  * distributed under the License is distributed on an "AS IS" BASIS,
    -  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -  * See the License for the specific language governing permissions and
    -  * limitations under the License.
    -  *
    -  * jOOQ License and Maintenance Agreement:
    -  * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -  * Data Geekery grants the Customer the non-exclusive, timely limited and
    -  * non-transferable license to install and use the Software under the terms of
    -  * the jOOQ License and Maintenance Agreement.
    -  *
    -  * This library is distributed with a LIMITED WARRANTY. See the jOOQ License
    -  * and Maintenance Agreement for more details: http://www.jooq.org/licensing
    -  -->
    -<xsl:stylesheet version="1.0"
    -	xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    -
    -	<xsl:import href="src/main/resources/html-util.xsl"/>
    -
    -	<xsl:output encoding="UTF-8" method="html" omit-xml-declaration="yes" indent="yes"/>
    -
    -	<xsl:variable name="apos">&apos;</xsl:variable>
    -	<xsl:param name="relativePath"/>
    -	<xsl:param name="root"/>
    -
    -	<!-- Main match -->
    -
    -	<xsl:template match="/">
    -		<xsl:text disable-output-escaping="yes">
    -&lt;?php
    -// The following content has been XSL transformed from manual.xml using html-page.xsl
    -// Please do not edit this content manually
    -require '</xsl:text><xsl:value-of select="$relativePath"/><xsl:text disable-output-escaping="yes">frame.php';
    -function getH1() {
    -    return "The jOOQ User Manual. Single Page";
    -}
    -function getActiveMenu() {
    -    return "learn";
    -}
    -function printTheme() {
    -    noTheme();
    -}
    -function printContent() {
    -    global $root;
    -?&gt;
    -</xsl:text>
    -
    -        <div id="manual">
    -		<!-- Display the main section's content -->
    -        <div class="row col col-100 col-white">
    -		<xsl:apply-templates select="/manual/section/content"/>
    -        </div>
    -
    -		<!-- Display the overall table of contents -->
    -        <div class="row col col-100 col-white">
    -		<h2 id="toc"><a href="#toc" name="toc">Table of contents</a></h2>
    -		<xsl:apply-templates select="/manual/section" mode="toc"/>
    -        </div>
    -        
    -		<xsl:for-each select="/manual/section//section">
    -            <xsl:variable name="id" select="@id"/>
    -            
    -            <section>
    -                <div class="row col col-100 col-white">
    -        			<h2 id="{@id}">
    -                        <xsl:for-each select="//redirect[@redirect-to = $id]">
    -                            <a id="{@id}" name="{@id}"/>
    -                        </xsl:for-each>
    -                        
    -        				<a name="{@id}" href="#{@id}">
    -            				<xsl:apply-templates select="." mode="chapter-number"/>
    -            				<xsl:text> </xsl:text>
    -            				<xsl:value-of select="title"/>
    -                        </a>
    -        			</h2>
    -                </div>
    -                    
    -    			<xsl:apply-templates select="content" />
    -            </section>
    -		</xsl:for-each>
    -
    -        </div>
    -		<xsl:text disable-output-escaping="yes">
    -&lt;?php
    -}
    -?&gt;
    -</xsl:text>
    -	</xsl:template>
    -
    -	<!-- matching templates -->
    -
    -	<xsl:template match="//section" mode="content">
    -		<xsl:value-of select="@id"/>
    -		<br/>
    -	</xsl:template>
    -
    -	<xsl:template match="section" mode="href">
    -		<xsl:text>#</xsl:text>
    -		<xsl:value-of select="@id"/>
    -	</xsl:template>
    -</xsl:stylesheet>
    \ No newline at end of file
    diff --git a/jOOQ-website/src/main/resources/html-pages.xsl b/jOOQ-website/src/main/resources/html-pages.xsl
    deleted file mode 100644
    index a4778f0a0c..0000000000
    --- a/jOOQ-website/src/main/resources/html-pages.xsl
    +++ /dev/null
    @@ -1,223 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?>
    -<!-- 
    -  * Copyright (c) 2009-2013, Data Geekery GmbH (http://www.datageekery.com)
    -  * All rights reserved.
    -  *
    -  * This work is dual-licensed
    -  * - under the Apache Software License 2.0 (the "ASL")
    -  * - under the jOOQ License and Maintenance Agreement (the "jOOQ License")
    -  * ===========================================================================
    -  * You may choose which license applies to you:
    -  *
    -  * - If you're using this work with Open Source databases, you may choose
    -  *   either ASL or jOOQ License.
    -  * - If you're using this work with at least one commercial database, you must
    -  *   choose jOOQ License
    -  *
    -  * For more information, please visit http://www.jooq.org/licenses
    -  *
    -  * Apache Software License 2.0:
    -  * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -  * Licensed under the Apache License, Version 2.0 (the "License");
    -  * you may not use this file except in compliance with the License.
    -  * You may obtain a copy of the License at
    -  *
    -  *  http://www.apache.org/licenses/LICENSE-2.0
    -  *
    -  * Unless required by applicable law or agreed to in writing, software
    -  * distributed under the License is distributed on an "AS IS" BASIS,
    -  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -  * See the License for the specific language governing permissions and
    -  * limitations under the License.
    -  *
    -  * jOOQ License and Maintenance Agreement:
    -  * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -  * Data Geekery grants the Customer the non-exclusive, timely limited and
    -  * non-transferable license to install and use the Software under the terms of
    -  * the jOOQ License and Maintenance Agreement.
    -  *
    -  * This library is distributed with a LIMITED WARRANTY. See the jOOQ License
    -  * and Maintenance Agreement for more details: http://www.jooq.org/licensing
    -  -->
    -<xsl:stylesheet version="1.0"
    -    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    -
    -    <xsl:import href="src/main/resources/html-util.xsl"/>
    -
    -    <xsl:output encoding="UTF-8" method="html" omit-xml-declaration="yes" indent="yes"/>
    -    <xsl:param name="sectionID"/>
    -    <xsl:param name="relativePath"/>
    -    <xsl:param name="root"/>
    -
    -    <xsl:variable name="apos">&apos;</xsl:variable>
    -
    -    <!-- Main match -->
    -
    -    <xsl:template match="/">
    -        <xsl:text disable-output-escaping="yes">
    -&lt;?php
    -// The following content has been XSL transformed from manual.xml using html-pages.xsl
    -// Please do not edit this content manually
    -require '</xsl:text>
    -        <xsl:value-of select="$relativePath"/>
    -<xsl:text disable-output-escaping="yes">frame.php';
    -function getH1() {
    -    return "</xsl:text>
    -    <xsl:value-of select="//section[@id = $sectionID]/title"/>
    -<xsl:text disable-output-escaping="yes">";
    -}
    -function getActiveMenu() {
    -    return "learn";
    -}
    -function printTheme() {
    -    noTheme();
    -}
    -function printContent() {
    -    global $root;
    -?&gt;
    -</xsl:text>
    -        <div id="manual">
    -        <xsl:apply-templates select="//section[@id = $sectionID]" mode="content"/>
    -        </div>
    -        <xsl:text disable-output-escaping="yes">
    -&lt;?php
    -}
    -?&gt;
    -</xsl:text>
    -    </xsl:template>
    -
    -    <!-- matching templates -->
    -
    -    <xsl:template match="h3" mode="content">
    -        <xsl:variable name="id" select="generate-id(.)"/>
    -
    -        <h2 id="{$id}">
    -            <a href="#{$id}" name="{$id}">
    -                <xsl:apply-templates mode="content"/>
    -            </a>
    -        </h2>
    -    </xsl:template>
    -
    -    <xsl:template match="//section[@id = $sectionID]" mode="content">
    -        <section>
    -            <div class="row col col-100 col-white">
    -                <xsl:apply-templates select="." mode="navigation"/>
    -            </div>
    -            
    -            <xsl:apply-templates select="content"/>
    -        
    -            <div class="row col col-100 col-white">
    -                <xsl:if test="count(sections/section) &gt; 0">
    -                    <h2 id="toc"><a href="#toc" name="toc">Table of contents</a></h2>
    -                </xsl:if>
    -                <xsl:apply-templates select="." mode="toc"/>
    -        
    -                <br/>
    -                <xsl:apply-templates select="." mode="navigation"/>
    -            </div>
    -        </section>
    -    </xsl:template>
    -
    -    <xsl:template match="section" mode="navigation">
    -        <table cellpadding="0" cellspacing="0" border="0" width="936">
    -            <tr>
    -                <td align="left" valign="top">
    -                    <xsl:apply-templates select="." mode="breadcrumb"/>
    -                </td>
    -                <td align="right" valign="top" style="white-space: nowrap">
    -                    <xsl:apply-templates select="." mode="prev-next"/>
    -                </td>
    -            </tr>
    -        </table>
    -    </xsl:template>
    -
    -    <xsl:template match="section" mode="breadcrumb">
    -        <xsl:if test="name(../..) = 'section'">
    -            <xsl:apply-templates select="../.." mode="breadcrumb"/>
    -            <xsl:text> : </xsl:text>
    -        </xsl:if>
    -
    -        <xsl:variable name="href">
    -            <xsl:apply-templates select="." mode="href"/>
    -        </xsl:variable>
    -
    -        <a href="{$href}">
    -            <xsl:value-of select="title"/>
    -        </a>
    -    </xsl:template>
    -
    -    <xsl:template match="section" mode="href">
    -        <xsl:choose>
    -            <xsl:when test="name(../..) = 'section'">
    -                <xsl:apply-templates select="../.." mode="href"/>
    -            </xsl:when>
    -            <xsl:otherwise>
    -                <xsl:text>&lt;?=$root?&gt;/</xsl:text>
    -                <xsl:value-of select="$root"/>
    -            </xsl:otherwise>
    -        </xsl:choose>
    -
    -        <xsl:value-of select="@id"/>
    -        <xsl:text>/</xsl:text>
    -    </xsl:template>
    -
    -    <xsl:template match="section" mode="prev-next">
    -        <xsl:variable name="prev" select="(preceding::section | ancestor::section)[last()]"/>
    -        <xsl:variable name="prevhref">
    -            <xsl:apply-templates select="$prev" mode="href"/>
    -        </xsl:variable>
    -
    -        <xsl:variable name="next" select="(following::section | descendant::section)[1]"/>
    -        <xsl:variable name="nexthref">
    -            <xsl:apply-templates select="$next" mode="href"/>
    -        </xsl:variable>
    -
    -        <xsl:if test="$prev">
    -            <a href="{$prevhref}" title="Previous section: {$prev/title}">previous</a>
    -        </xsl:if>
    -
    -        <xsl:if test="$prev and $next">
    -            <xsl:text> : </xsl:text>
    -        </xsl:if>
    -
    -        <xsl:if test="$next">
    -            <a href="{$nexthref}" title="Next section: {$next/title}">next</a>
    -        </xsl:if>
    -    </xsl:template>
    -
    -    <xsl:template match="section" mode="prev-id">
    -        <xsl:variable name="id" select="@id"/>
    -
    -        <xsl:variable name="position">
    -            <xsl:for-each select="//section">
    -                <xsl:if test="@id = $id">
    -                    <xsl:value-of select="position()"/>
    -                </xsl:if>
    -            </xsl:for-each>
    -        </xsl:variable>
    -
    -        <xsl:for-each select="//section">
    -            <xsl:if test="position() = $position - 1">
    -                <xsl:value-of select="@id"/>
    -            </xsl:if>
    -        </xsl:for-each>
    -    </xsl:template>
    -
    -    <xsl:template match="section" mode="next-id">
    -        <xsl:variable name="id" select="@id"/>
    -
    -        <xsl:variable name="position">
    -            <xsl:for-each select="//section">
    -                <xsl:if test="@id = $id">
    -                    <xsl:value-of select="position()"/>
    -                </xsl:if>
    -            </xsl:for-each>
    -        </xsl:variable>
    -
    -        <xsl:for-each select="//section">
    -            <xsl:if test="position() = $position + 1">
    -                <xsl:value-of select="@id"/>
    -            </xsl:if>
    -        </xsl:for-each>
    -    </xsl:template>
    -</xsl:stylesheet>
    \ No newline at end of file
    diff --git a/jOOQ-website/src/main/resources/html-util.xsl b/jOOQ-website/src/main/resources/html-util.xsl
    deleted file mode 100644
    index 18c407d7d3..0000000000
    --- a/jOOQ-website/src/main/resources/html-util.xsl
    +++ /dev/null
    @@ -1,276 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?>
    -<!-- 
    -  * Copyright (c) 2009-2013, Data Geekery GmbH (http://www.datageekery.com)
    -  * All rights reserved.
    -  *
    -  * This work is dual-licensed
    -  * - under the Apache Software License 2.0 (the "ASL")
    -  * - under the jOOQ License and Maintenance Agreement (the "jOOQ License")
    -  * ===========================================================================
    -  * You may choose which license applies to you:
    -  *
    -  * - If you're using this work with Open Source databases, you may choose
    -  *   either ASL or jOOQ License.
    -  * - If you're using this work with at least one commercial database, you must
    -  *   choose jOOQ License
    -  *
    -  * For more information, please visit http://www.jooq.org/licenses
    -  *
    -  * Apache Software License 2.0:
    -  * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -  * Licensed under the Apache License, Version 2.0 (the "License");
    -  * you may not use this file except in compliance with the License.
    -  * You may obtain a copy of the License at
    -  *
    -  *  http://www.apache.org/licenses/LICENSE-2.0
    -  *
    -  * Unless required by applicable law or agreed to in writing, software
    -  * distributed under the License is distributed on an "AS IS" BASIS,
    -  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -  * See the License for the specific language governing permissions and
    -  * limitations under the License.
    -  *
    -  * jOOQ License and Maintenance Agreement:
    -  * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -  * Data Geekery grants the Customer the non-exclusive, timely limited and
    -  * non-transferable license to install and use the Software under the terms of
    -  * the jOOQ License and Maintenance Agreement.
    -  *
    -  * This library is distributed with a LIMITED WARRANTY. See the jOOQ License
    -  * and Maintenance Agreement for more details: http://www.jooq.org/licensing
    -  -->
    -<xsl:stylesheet version="1.0"
    -    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    -
    -    <xsl:output encoding="UTF-8" method="html" omit-xml-declaration="yes" indent="yes"/>
    -
    -    <xsl:template match="html-only" mode="content">
    -        <xsl:apply-templates mode="content"/>
    -    </xsl:template>
    -
    -    <xsl:template match="section" mode="toc">
    -        <xsl:if test="count(sections/section) &gt; 0">
    -            <dl class="toc">
    -                <xsl:apply-templates select="." mode="toc-contents"/>
    -            </dl>
    -        </xsl:if>
    -    </xsl:template>
    -    
    -    <xsl:template match="section" mode="toc-contents">
    -        <xsl:if test="count(sections/section) &gt; 0">
    -            <xsl:for-each select="sections/section">
    -                <xsl:variable name="class">
    -                    <xsl:if test="../../@id = 'manual'">toc-main</xsl:if>
    -                </xsl:variable>
    -                
    -                <dt class="{$class}">
    -                    <xsl:apply-templates select="." mode="chapter-number"/>
    -                </dt>
    -                
    -                <dd class="{$class}">
    -                    <xsl:variable name="href">
    -                        <xsl:apply-templates select="." mode="href"/>
    -                    </xsl:variable>
    -
    -                    <a href="{$href}" title="{title}">
    -                        <xsl:value-of select="title"/>
    -                    </a>
    -                </dd>
    -                
    -                <xsl:apply-templates select="." mode="toc-contents"/>
    -            </xsl:for-each>
    -        </xsl:if>
    -    </xsl:template>
    -
    -    <xsl:template match="content">
    -        <xsl:apply-templates select="@*|node()" mode="content"/>
    -    </xsl:template>
    -    
    -    <xsl:template match="html" mode="content">
    -        <div class="row col col-100 col-white">
    -            <xsl:copy>
    -                <xsl:apply-templates select="@*|node()" mode="content"/>
    -            </xsl:copy>
    -        </div>
    -    </xsl:template>
    -
    -    <xsl:template match="@*|node()" mode="content">
    -        <xsl:param name="colwidth" select="'100'"/>
    -        <xsl:param name="col1" select="false()"/>
    -        <xsl:param name="col2" select="false()"/>
    -        
    -        <xsl:choose>
    -            <xsl:when test="name(.) = 'reference'">
    -                <xsl:variable name="id" select="@id"/>
    -
    -                <a>
    -                    <xsl:attribute name="href">
    -                        <xsl:choose>
    -                            <xsl:when test="@id">
    -                                <xsl:apply-templates select="//section[@id = $id]" mode="href"/>
    -                                <xsl:value-of select="@anchor"/>
    -
    -                                <xsl:if test="not(//section[@id = $id])">
    -                                    <xsl:message>
    -                                        <xsl:text>Reference not found: </xsl:text>
    -                                        <xsl:value-of select="$id"/>
    -                                    </xsl:message>
    -                                </xsl:if>
    -                            </xsl:when>
    -
    -                            <xsl:when test="@class and starts-with(@class, 'org.jooq.test')">
    -                                <xsl:text>https://github.com/jOOQ/jOOQ/blob/master/jOOQ-test/src/</xsl:text>
    -                                <xsl:value-of select="translate(@class, '.', '/')"/>
    -                                <xsl:text>.java</xsl:text>
    -                                <xsl:value-of select="@anchor"/>
    -                            </xsl:when>
    -
    -                            <xsl:when test="@class and starts-with(@class, 'org.jooq.debug')">
    -                                <xsl:text>https://github.com/jOOQ/jOOQ/blob/master/jOOQ-console/src/main/java/</xsl:text>
    -                                <xsl:value-of select="translate(@class, '.', '/')"/>
    -                                <xsl:text>.java</xsl:text>
    -                                <xsl:value-of select="@anchor"/>
    -                            </xsl:when>
    -
    -                            <xsl:when test="@class and starts-with(@class, 'org.jooq')">
    -                                <xsl:text>http://www.jooq.org/javadoc/latest/</xsl:text>
    -                                <xsl:value-of select="translate(@class, '.', '/')"/>
    -                                <xsl:text>.html</xsl:text>
    -                                <xsl:value-of select="@anchor"/>
    -                            </xsl:when>
    -
    -                            <xsl:when test="@class and (starts-with(@class, 'javax.persistence'))">
    -                                <xsl:text>http://docs.oracle.com/javaee/6/api/</xsl:text>
    -                                <xsl:value-of select="translate(@class, '.', '/')"/>
    -                                <xsl:text>.html</xsl:text>
    -                                <xsl:value-of select="@anchor"/>
    -                            </xsl:when>
    -
    -                            <xsl:when test="@class and (starts-with(@class, 'java') or starts-with(@class, 'org.w3c.dom'))">
    -                                <xsl:text>http://download.oracle.com/javase/6/docs/api/</xsl:text>
    -                                <xsl:value-of select="translate(@class, '.', '/')"/>
    -                                <xsl:text>.html</xsl:text>
    -                                <xsl:value-of select="@anchor"/>
    -                            </xsl:when>
    -
    -                            <xsl:when test="@ticket">
    -                                <xsl:text>https://github.com/jOOQ/jOOQ/issues/</xsl:text>
    -                                <xsl:value-of select="@ticket"/>
    -                                <xsl:value-of select="@anchor"/>
    -                            </xsl:when>
    -
    -                            <xsl:otherwise>
    -                                <xsl:message>
    -                                    <xsl:text>Reference not supported</xsl:text>
    -                                </xsl:message>
    -                            </xsl:otherwise>
    -                        </xsl:choose>
    -                    </xsl:attribute>
    -
    -                    <xsl:attribute name="title">
    -                        <xsl:choose>
    -                            <xsl:when test="@id">
    -                                <xsl:text>jOOQ Manual reference: </xsl:text>
    -                                <xsl:value-of select="//section[@id = $id]/title"/>
    -                            </xsl:when>
    -                            <xsl:when test="@class and starts-with(@class, 'org.jooq')">
    -                                <xsl:text>Internal API reference: </xsl:text>
    -                                <xsl:value-of select="@class"/>
    -                            </xsl:when>
    -                            <xsl:when test="@class and starts-with(@class, 'java')">
    -                                <xsl:text>External API reference: </xsl:text>
    -                                <xsl:value-of select="@class"/>
    -                            </xsl:when>
    -                            <xsl:when test="@ticket">
    -                                <xsl:text>GitHub issue: #</xsl:text>
    -                                <xsl:value-of select="@ticket"/>
    -                            </xsl:when>
    -                        </xsl:choose>
    -                    </xsl:attribute>
    -
    -                    <xsl:choose>
    -                        <xsl:when test="@title">
    -                            <xsl:value-of select="@title"/>
    -                        </xsl:when>
    -                        <xsl:when test="@id">
    -                            <xsl:value-of select="//section[@id = $id]/title"/>
    -                        </xsl:when>
    -                        <xsl:when test="@class">
    -                            <xsl:value-of select="@class"/>
    -                        </xsl:when>
    -                        <xsl:when test="@ticket">
    -                            <xsl:text>#</xsl:text>
    -                            <xsl:value-of select="@ticket"/>
    -                        </xsl:when>
    -                    </xsl:choose>
    -                </a>
    -            </xsl:when>
    -            <xsl:when test="name(.) = 'java'">
    -                <div class="row col col-{$colwidth} col-black">
    -                    <pre class="prettyprint lang-java">
    -                        <xsl:value-of select="text()"/>
    -                    </pre>
    -                </div>
    -            </xsl:when>
    -            <xsl:when test="name(.) = 'scala'">
    -                <div class="row col col-{$colwidth} col-black">
    -                    <pre class="prettyprint lang-scala">
    -                        <xsl:value-of select="text()"/>
    -                    </pre>
    -                </div>
    -            </xsl:when>
    -            <xsl:when test="name(.) = 'sql'">
    -                <div class="row col col-{$colwidth} col-black">
    -                    <pre class="prettyprint lang-sql">
    -                        <xsl:value-of select="text()"/>
    -                    </pre>
    -                </div>
    -            </xsl:when>
    -            <xsl:when test="name(.) = 'xml'">
    -                <div class="row col col-{$colwidth} col-black">
    -                    <pre class="prettyprint lang-xml">
    -                        <xsl:value-of select="text()"/>
    -                    </pre>
    -                </div>
    -            </xsl:when>
    -            <xsl:when test="name(.) = 'config'">
    -                <div class="row col col-{$colwidth} col-black">
    -                    <pre class="prettyprint">
    -                        <xsl:value-of select="text()"/>
    -                    </pre>
    -                </div>
    -            </xsl:when>
    -            <xsl:when test="name(.) = 'text'">
    -                <div class="row col col-{$colwidth} col-red">
    -                    <pre>
    -                        <xsl:value-of select="text()"/>
    -                    </pre>
    -                </div>
    -            </xsl:when>
    -            <xsl:when test="name(.) = 'code-pair'">
    -                <xsl:apply-templates select="./*[position() = 1]" mode="content">
    -                    <xsl:with-param name="colwidth" select="'50'"/>
    -                    <xsl:with-param name="col1" select="true()"/>
    -                </xsl:apply-templates>
    -                <xsl:apply-templates select="./*[position() = 2]" mode="content">
    -                    <xsl:with-param name="colwidth" select="'50'"/>
    -                    <xsl:with-param name="col2" select="true()"/>
    -                </xsl:apply-templates>
    -            </xsl:when>
    -            <xsl:otherwise>
    -                <xsl:copy>
    -                    <xsl:apply-templates select="@*|node()" mode="content"/>
    -                </xsl:copy>
    -            </xsl:otherwise>
    -        </xsl:choose>
    -    </xsl:template>
    -    
    -    <xsl:template match="section" mode="chapter-number">
    -        <xsl:if test="@id != 'manual'">
    -            <xsl:apply-templates select="../.." mode="chapter-number"/>
    -
    -            <xsl:value-of select="count(preceding-sibling::section) + 1"/>
    -            <xsl:text>.</xsl:text>
    -        </xsl:if>
    -    </xsl:template>
    -</xsl:stylesheet>
    \ No newline at end of file
    diff --git a/jOOQ-website/src/main/resources/manual-2.5.xml b/jOOQ-website/src/main/resources/manual-2.5.xml
    deleted file mode 100644
    index fa418092c9..0000000000
    --- a/jOOQ-website/src/main/resources/manual-2.5.xml
    +++ /dev/null
    @@ -1,8516 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?>
    -<!-- 
    -  - Copyright (c) 2009-2013, Lukas Eder, lukas.eder@gmail.com
    -  - All rights reserved.
    -  -
    -  - This software is licensed to you under the Apache License, Version 2.0
    -  - (the "License"); You may obtain a copy of the License at
    -  -
    -  -   http://www.apache.org/licenses/LICENSE-2.0
    -  -
    -  - Redistribution and use in source and binary forms, with or without
    -  - modification, are permitted provided that the following conditions are met:
    -  -
    -  - . Redistributions of source code must retain the above copyright notice, this
    -  -   list of conditions and the following disclaimer.
    -  -
    -  - . Redistributions in binary form must reproduce the above copyright notice,
    -  -   this list of conditions and the following disclaimer in the documentation
    -  -   and/or other materials provided with the distribution.
    -  -
    -  - . Neither the name "jOOQ" nor the names of its contributors may be
    -  -   used to endorse or promote products derived from this software without
    -  -   specific prior written permission.
    -  -
    -  - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    -  - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    -  - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    -  - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
    -  - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
    -  - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
    -  - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
    -  - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
    -  - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
    -  - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
    -  - POSSIBILITY OF SUCH DAMAGE.
    -  -->
    -<manual>
    -	<section id="manual">
    -		<title>The jOOQ User Manual. Multiple Pages</title>
    -		<content><html>
    -			<h2 id="Overview"><a href="#Overview" name="Overview">#</a> Overview</h2>
    -			<p>This manual is divided into six main sections:</p>
    -
    -			<ul>
    -				<li>
    -					<reference id="getting-started"/>
    -					<p>
    -						This section will get you started with jOOQ quickly. It contains
    -						simple explanations about what jOOQ is, what jOOQ isn't and how
    -						to set it up for the first time
    -					</p>
    -				</li>
    -				<li>
    -					<reference id="sql-building"/>
    -					<p>
    -						This section explains all about the jOOQ syntax used for building
    -						queries. It explains the central factories, the supported SQL
    -						statements and various other syntax elements
    -					</p>
    -				</li>
    -				<li>
    -					<reference id="code-generation"/>
    -					<p>
    -						This section explains how to configure and use the built-in source code
    -						generator
    -					</p>
    -				</li>
    -				<li>
    -					<reference id="sql-execution"/>
    -					<p>
    -						This section will get you through the specifics of what can be done
    -						with jOOQ at runtime, in order to execute queries, perform CRUD
    -						operations, import and export data, and hook into the jOOQ execution
    -						lifecycle for debugging
    -					</p>
    -				</li>
    -				<li>
    -					<reference id="tools"/>
    -					<p>
    -						This section is dedicated to tools that ship with jOOQ, such as the
    -						jOOQ console
    -					</p>
    -				</li>
    -				<li>
    -					<reference id="reference"/>
    -					<p>
    -						This section is a reference for elements in this manual
    -					</p>
    -				</li>
    -			</ul>
    -		</html></content>
    -
    -		<sections>
    -			<section id="preface">
    -				<title>Preface</title>
    -				<content><html>
    -					<h3>jOOQ's reason of being - compared to JPA</h3>
    -					<p>
    -						Java and SQL have come a long way. SQL is an "ancient", yet established and well-understood technology. Java is a legacy too, although its platform JVM allows for many new and contemporary languages built on top of it. Yet, after all these years, libraries dealing with the interface between SQL and Java have come and gone, leaving JPA to be a standard that is accepted only with doubts, short of any surviving options.
    -					</p>
    -					<p>
    -						So far, there had been only few database abstraction frameworks or libraries, that truly respected SQL as a first class citizen among languages. Most frameworks, including the industry standards JPA, EJB, Hibernate, JDO, Criteria Query, and many others try to hide SQL itself, minimising its scope to things called JPQL, HQL, JDOQL and various other inferior query languages
    -					</p>
    -					<p>
    -						jOOQ has come to fill this gap.
    -					</p>
    -
    -					<h3>jOOQ's reason of being - compared to LINQ</h3>
    -					<p>
    -						Other platforms incorporate ideas such as LINQ (with LINQ-to-SQL), or Scala's SLICK, or also Java's QueryDSL to better integrate querying as a concept into their respective language. By querying, they understand querying of arbitrary targets, such as SQL, XML, Collections and other heterogeneous data stores. jOOQ claims that this is going the wrong way too.
    -					</p>
    -					<p>
    - 						In more advanced querying use-cases (more than simple CRUD and the occasional JOIN), people will want to profit from the expressivity of SQL. Due to the relational nature of SQL, this is quite different from what object-oriented and partially functional languages such as C#, Scala, or Java can offer.
    - 					</p>
    - 					<p>
    - 						It is very hard to formally express and validate joins and the ad-hoc table expression types they create. It gets even harder when you want support for more advanced table expressions, such as pivot tables, unnested cursors, or just arbitrary projections from derived tables. With a very strong object-oriented typing model, these features will probably stay out of scope.
    - 					</p>
    - 					<p>
    - 						In essence, the decision of creating an API that looks like SQL or one that looks like C#, Scala, Java is a definite decision in favour of one or the other platform. While it will be easier to evolve SLICK in similar ways as LINQ (or QueryDSL in the Java world), SQL feature scope that clearly communicates its underlying intent will be very hard to add, later on (e.g. how would you model Oracle's partitioned outer join syntax? How would you model ANSI/ISO SQL:1999 grouping sets? How can you support scalar subquery caching? etc...).					
    -					</p>
    -					<p>
    -						jOOQ has come to fill this gap.
    -					</p>
    -					
    -					<h3>jOOQ is different</h3>
    -					<p>
    -						SQL was never meant to be abstracted. To be confined in the narrow boundaries of heavy mappers, hiding the beauty and simplicity of relational data. SQL was never meant to be object-oriented. SQL was never meant to be anything other than... SQL!
    -					</p>					
    -				</html></content>
    -			</section>
    -			
    -			<section id="getting-started">
    -				<title>Getting started with jOOQ</title>
    -				<content><html>
    -					<p>
    -						These chapters contain a quick overview of how to get started with this manual and with jOOQ. While the subsequent chapters contain a lot of reference information, this chapter here just wraps up the essentials.
    -					</p>
    -				</html></content>
    -
    -				<sections>
    -					<section id="the-manual">
    -					    <title>How to read this manual</title>
    -						<content><html>
    -							<p>
    -								This section helps you correctly interpret this manual in the context of jOOQ.
    -							</p>
    -							
    -							<h3>Code blocks</h3>
    -							<p>
    -								The following are code blocks:
    -							</p>
    -							
    -</html><sql><![CDATA[-- A SQL code block
    -SELECT 1 FROM DUAL]]></sql><java><![CDATA[// A Java code block
    -for (int i = 0; i < 10; i++);]]></java><xml><![CDATA[<!-- An XML code block -->
    -<hello what="world"></hello>]]></xml><config><![CDATA[# A config file code block
    -org.jooq.property=value]]></config><html>		
    -
    -							<p>
    -								These are useful to provide examples in code. Often, with jOOQ, it is even more useful to compare SQL code with its corresponding Java/jOOQ code. When this is done, the blocks are aligned side-by-side, with SQL usually being on the left, and Java usually being on the right:
    -							</p>					
    -							
    -</html><code-pair>
    -<sql><![CDATA[-- In SQL:
    -SELECT 1 FROM DUAL]]></sql><java><![CDATA[// Using jOOQ:
    -create.select()]]></java>
    -</code-pair><html>
    -
    -							<h3>Code block contents</h3>
    -							<p>
    -								The contents of code blocks follow conventions, too. If nothing else is mentioned next to any given code block, then the following can be assumed:
    -							</p>
    -							
    -							
    -</html><sql><![CDATA[-- SQL assumptions
    -------------------
    -
    --- If nothing else is specified, assume that the Oracle syntax is used 
    -SELECT 1 FROM DUAL]]></sql><java><![CDATA[// Java assumptions
    -// ----------------
    - 
    -// Whenever you see "standalone functions", assume they were static imported from org.jooq.impl.Factory 
    -exists(); max(); min(); val(); inline(); // correspond to Factory.exists(); Factory.max(); Factory.min(); etc...
    -
    -// Whenever you see BOOK/Book, AUTHOR/Author and similar entities, assume they were (static) imported from the generated schema
    -BOOK.TITLE, AUTHOR.LAST_NAME // correspond to com.example.generated.Tables.BOOK.TITLE, com.example.generated.Tables.BOOK.TITLE
    -
    -// Whenever you see "create" being used in Java code, assume that this is an instance of org.jooq.impl.Factory:
    -Factory create = new Factory(connection, SQLDialect.ORACLE);]]></java><html>
    -
    -							<h3>Settings</h3>
    -							<p>
    -								jOOQ allows to override runtime behaviour using <reference class="org.jooq.conf.Settings"/>. If nothing is specified, the default runtime settings are assumed.
    -							</p>
    -							
    -							<h3>Sample database</h3>
    -							<p>
    -								See the manual's section about <reference id="sample-database" title="the sample database used in this manual"/> to learn more about the sample database.
    -							</p>
    -						</html></content>
    -					</section>
    -
    -					<section id="sample-database">
    -					    <title>The sample database used in this manual</title>
    -						<content><html>
    -							<p>
    -							For the examples in this manual, the same database will always be referred to. It essentially consists of these entities created using the Oracle dialect
    -							</p>
    -</html><sql>CREATE TABLE language (
    -  id              NUMBER(7)     NOT NULL PRIMARY KEY,
    -  cd              CHAR(2)       NOT NULL,
    -  description     VARCHAR2(50)
    -)
    -
    -CREATE TABLE author (
    -  id              NUMBER(7)     NOT NULL PRIMARY KEY,
    -  first_name      VARCHAR2(50),
    -  last_name       VARCHAR2(50)  NOT NULL,
    -  date_of_birth   DATE,
    -  year_of_birth   NUMBER(7),
    -  distinguished   NUMBER(1)
    -)
    -
    -CREATE TABLE book (
    -  id              NUMBER(7)     NOT NULL PRIMARY KEY,
    -  author_id       NUMBER(7)     NOT NULL,
    -  title           VARCHAR2(400) NOT NULL,
    -  published_in    NUMBER(7)     NOT NULL,
    -  language_id     NUMBER(7)     NOT NULL,
    -  
    -  CONSTRAINT fk_book_author     FOREIGN KEY (author_id)   REFERENCES author(id),
    -  CONSTRAINT fk_book_language   FOREIGN KEY (language_id) REFERENCES language(id)
    -)
    -
    -CREATE TABLE book_store (
    -  name            VARCHAR2(400) NOT NULL UNIQUE
    -)
    -
    -CREATE TABLE book_to_book_store (
    -  name            VARCHAR2(400) NOT NULL,
    -  book_id         INTEGER       NOT NULL,
    -  stock           INTEGER,
    -  
    -  PRIMARY KEY(name, book_id),
    -  CONSTRAINT fk_b2bs_book_store FOREIGN KEY (name)        REFERENCES book_store (name) ON DELETE CASCADE,
    -  CONSTRAINT fk_b2bs_book       FOREIGN KEY (book_id)     REFERENCES book (id)         ON DELETE CASCADE
    -)</sql><html>
    -							<p>
    -								More entities, types (e.g. UDT's, ARRAY types, ENUM types, etc), stored procedures and packages are introduced for specific examples
    -							</p>
    -						</html></content>
    -					</section>
    -
    -					<section id="use-cases">
    -						<title>Different use cases for jOOQ</title>
    -						<content><html>
    -							<p>
    -								jOOQ has originally been created as a library for complete abstraction of JDBC and all database interaction. Various best practices that are frequently encountered in pre-existing software products are applied to this library. This includes:
    -							</p>
    -							<ul>
    -								<li>Typesafe database object referencing through generated schema, table, column, record, procedure, type, dao, pojo artefacts (see the chapter about <reference id="code-generation" title="code generation"/>)</li>
    -								<li>Typesafe SQL construction through a complete API modelling SQL as a domain specific language in Java (see the chapter about <reference id="dsl-and-non-dsl" title="the DSL API"/>)</li>
    -								<li>Convenient query execution through an improved API for result fetching (see the chapters about <reference id="fetching" title="the various types of data fetching"/>)</li>
    -								<li>SQL dialect abstraction and SQL clause simulation to improve cross-database compatibility and to enable missing features in simpler databases (see the chapter about <reference id="sql-dialects" title="SQL dialects"/>)</li>
    -								<li>SQL logging and debugging using jOOQ as an integral part of your development process (see the chapters about <reference id="logging" title="logging"/> and about the <reference id="jooq-console" title="jOOQ Console"/>)</li>
    -							</ul>
    -							<p>
    -								Effectively, jOOQ was originally designed to replace any other database abstraction framework short of the ones handling connection pooling and transaction management (see also the <reference id="reference-credits" title="credits for other database abstraction libraries"/>)
    -							</p>
    -							
    -							<h3>Use jOOQ the way you prefer</h3>
    -							<p>
    -								... but open source is community-driven. And the community has shown various ways of using jOOQ that diverge from its original intent. Some use cases encountered are:
    -							</p>
    -							<ul>
    -								<li>Using Hibernate for 70% of the queries (i.e. <reference id="crud-with-updatablerecords" title="CRUD"/>) and jOOQ for the remaining 30% where SQL is really needed</li>
    -								<li>Using jOOQ for SQL building and JDBC for SQL execution</li> 
    -								<li>Using jOOQ for SQL building and Spring Data for SQL execution</li>
    -								<li>Using jOOQ without the <reference id="code-generation" title="source code generator"/> to build the basis of a framework for dynamic SQL execution.</li> 
    -							</ul>
    -							
    -							<p>
    -								The following sections explain about various use cases for using jOOQ in your application.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="jooq-as-a-standalone-sql-builder">
    -								<title>jOOQ as a SQL builder</title>
    -								<content><html>
    -									<p>
    -										This is the most simple of all use cases, allowing for construction of valid SQL for any database. In this use case, you will not use <reference id="jooq-as-a-sql-builder-with-code-generation" title="jOOQ's code generator"/> and probably not even <reference id="jooq-as-a-sql-executor" title="jOOQ's query execution facilities"/>. Instead, you'll use jOOQ to wrap strings, literals and other user-defined objects into an object-oriented, type-safe AST modelling your SQL statements. An example is given here: 
    -									</p>
    -									
    -</html><java><![CDATA[// Fetch a SQL string from a jOOQ Query in order to manually execute it with another tool.
    -String sql = create.select(fieldByName("BOOK","TITLE"), fieldByName("AUTHOR","FIRST_NAME"), fieldByName("AUTHOR","LAST_NAME"))
    -                   .from(tableByName("BOOK"))
    -                   .join(tableByName("AUTHOR"))
    -                   .on(fieldByName("BOOK", "AUTHOR_ID").equal("AUTHOR", "ID"))
    -                   .where(fieldByName("BOOK", "PUBLISHED_IN").equal(1948))
    -                   .getSQL();]]></java><html>
    -                   
    -                   					<p>
    -                   						The SQL string that you can generate as such can then be executed using JDBC directly, using Spring's JdbcTemplate, using Apache DbUtils and many other tools.
    -                   					</p>
    -                   					<p>
    -                   						If you wish to use jOOQ only as a SQL builder, the following sections of the manual will be of interest to you:
    -                  					</p>
    -                  					<ul>
    -                  						<li><reference id="sql-building" title="SQL building"/>: This section contains a lot of information about creating SQL statements using the jOOQ API</li>
    -                  						<li><reference id="plain-sql" title="Plain SQL"/>: This section contains information useful in particular to those that want to supply <reference id="table-expressions" title="table expressions"/>, <reference id="column-expressions" title="column expressions"/>, etc. as plain SQL to jOOQ, rather than through generated artefacts</li>
    -                  					</ul>
    -								</html></content>
    -							</section>
    -
    -							<section id="jooq-as-a-sql-builder-with-code-generation">
    -								<title>jOOQ as a SQL builder with code generation</title>
    -								<content><html>
    -									<p>
    -										In addition to using jOOQ as a <reference id="jooq-as-a-standalone-sql-builder" title="standalone SQL builder"/>, you can also use jOOQ's code generation features in order to compile your SQL statements using a Java compiler against an actual database schema. This adds a lot of power and expressiveness to just simply constructing SQL using custom strings and literals, as you can be sure that all database artefacts actually exist in the database, and that their type is correct. An example is given here: 
    -									</p>
    -
    -</html><java><![CDATA[// Fetch a SQL string from a jOOQ Query in order to manually execute it with another tool.
    -String sql = create.select(BOOK.TITLE, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -                   .from(BOOK)
    -                   .join(AUTHOR)
    -                   .on(BOOK.AUTHOR_ID.equal(AUTHOR.ID))
    -                   .where(BOOK.PUBLISHED_IN.equal(1948))
    -                   .getSQL();]]></java><html>
    -                   
    -                   					<p>
    -                   						The SQL string that you can generate as such can then be executed using JDBC directly, using Spring's JdbcTemplate, using Apache DbUtils and many other tools.
    -                   					</p>
    -                   					<p>
    -                   						If you wish to use jOOQ only as a SQL builder with code generation, the following sections of the manual will be of interest to you:
    -                  					</p>
    -                  					<ul>
    -                  						<li><reference id="sql-building" title="SQL building"/>: This section contains a lot of information about creating SQL statements using the jOOQ API</li>
    -                  						<li><reference id="code-generation" title="Code generation"/>: This section contains the necessary information to run jOOQ's code generator against your developer database</li>
    -                  					</ul>
    -								</html></content>
    -							</section>
    -
    -							<section id="jooq-as-a-sql-executor">
    -								<title>jOOQ as a SQL executor</title>
    -								<content><html>
    -									<p>
    -										Instead of any tool mentioned in the previous chapters, you can also use jOOQ directly to execute your jOOQ-generated SQL statements. This will add a lot of convenience on top of the previously discussed API for typesafe SQL construction, when you can re-use the information from generated classes to fetch records and custom data types. An example is given here:
    -									</p>
    -									
    -</html><java><![CDATA[// Execute the SQL statement directly with jOOQ
    -Result<Record> result = create.select(BOOK.TITLE, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -			                  .from(BOOK)
    -			                  .join(AUTHOR)
    -			                  .on(BOOK.AUTHOR_ID.equal(AUTHOR.ID))
    -			                  .where(BOOK.PUBLISHED_IN.equal(1948))
    -			                  .fetch();]]></java><html>
    -
    -									<p>
    -										jOOQ doesn't stop here, though! You can execute any SQL with jOOQ. In other words, you can use any other SQL building tool and run the SQL statements with jOOQ. An example is given here:
    -									</p>
    -
    -</html><java><![CDATA[// Use your favourite tool to construct SQL strings:
    -String sql = "SELECT title, first_name, last_name FROM book JOIN author ON book.author_id = author.id " +
    -             "WHERE book.published_in = 1984";
    -
    -// Fetch results using jOOQ
    -Result<Record> result = create.fetch(sql);
    -
    -// Or execute that SQL with JDBC, fetching the ResultSet with jOOQ:
    -ResultSet rs = connection.createStatement().executeQuery(sql);
    -Result<Record> result = create.fetch(rs);]]></java><html>
    -
    -									<p>
    -                   						If you wish to use jOOQ as a SQL executor with (or without) code generation, the following sections of the manual will be of interest to you:
    -                  					</p>
    -                  					<ul>
    -                  						<li><reference id="sql-building" title="SQL building"/>: This section contains a lot of information about creating SQL statements using the jOOQ API</li>
    -                  						<li><reference id="code-generation" title="Code generation"/>: This section contains the necessary information to run jOOQ's code generator against your developer database</li>
    -                  						<li><reference id="sql-execution" title="SQL execution"/>: This section contains a lot of information about executing SQL statements using the jOOQ API</li>
    -                  						<li><reference id="fetching"/>: This section contains some useful information about the various ways of fetching data with jOOQ</li>
    -                  					</ul>
    -								</html></content>
    -							</section>
    -
    -							<section id="jooq-for-crud">
    -								<title>jOOQ for CRUD</title>
    -								<content><html>
    -									<p>
    -										This is probably the most complete use-case for jOOQ: Use all of jOOQ's features. Apart from jOOQ's fluent API for query construction, jOOQ can also help you execute everyday CRUD operations. An example is given here:
    -									</p>
    -
    -</html><java><![CDATA[// Fetch all authors
    -for (AuthorRecord author : create.fetch(AUTHOR)) {
    -
    -    // Skip previously distinguished authors  
    -    if ((int) author.getDistinguished() == 1)
    -        continue;
    -  
    -    // Check if the author has written more than 5 books
    -    if (author.fetchChildren(FK_BOOK_AUTHOR).size() > 5) {
    -    
    -        // Mark the author as a "distinguished" author
    -        author.setDistinguished(1);
    -        author.store();
    -    }
    -}]]></java><html>
    -
    -									<p>
    -                   						If you wish to use all of jOOQ's features, the following sections of the manual will be of interest to you (including all sub-sections):
    -                  					</p>
    -                  					<ul>
    -                  						<li><reference id="sql-building" title="SQL building"/>: This section contains a lot of information about creating SQL statements using the jOOQ API</li>
    -                  						<li><reference id="code-generation" title="Code generation"/>: This section contains the necessary information to run jOOQ's code generator against your developer database</li>
    -                  						<li><reference id="sql-execution" title="SQL execution"/>: This section contains a lot of information about executing SQL statements using the jOOQ API</li>
    -                  					</ul>
    -								</html></content>
    -							</section>
    -							
    -							<section id="jooq-for-pros">
    -								<title>jOOQ for PROs</title>
    -								<content><html>
    -									<p>
    -										jOOQ isn't just a library that helps you <reference id="sql-building" title="build"/> and <reference id="sql-execution" title="execute"/> SQL against your <reference id="code-generation" title="generated, compilable schema"/>. jOOQ ships with a lot of tools. Here are some of the most important tools shipped with jOOQ:
    -									</p>
    -									<ul>
    -										<li><reference id="jooq-console" title="jOOQ Console"/>: This small application hooks into jOOQ's execute listener support to allow for tracing, debugging and introspecting any SQL statement executed through the jOOQ API. This includes setting breakpoints, introspecting bind values, running probe SQL statements, ad-hoc patching of SQL, measuring execution times, exporting stack traces. Use this tool to better know your SQL!</li>
    -										<li><reference id="execute-listeners" title="jOOQ's Execute Listeners"/>: jOOQ allows you to hook your custom execute listeners into jOOQ's SQL statement execution lifecycle in order to centrally coordinate any arbitrary operation performed on SQL being executed. Use this for logging, identity generation, SQL tracing, performance measurements, etc.</li>
    -										<li><reference id="logging" title="Logging"/>: jOOQ has a standard DEBUG logger built-in, for logging and tracing all your executed SQL statements and fetched result sets</li>
    -										<li><reference id="stored-procedures" title="Stored Procedures"/>: jOOQ supports stored procedures and functions of your favourite database. All routines and user-defined types are generated and can be included in jOOQ's SQL building API as function references.</li>
    -										<li><reference id="exporting" title="Exporting"/> and <reference id="importing" title="Importing"/>: jOOQ ships with an API to easily export/import data in various formats</li>
    -									</ul>
    -									<p>
    -										If you're a power user of your favourite, feature-rich database, jOOQ will help you access all of your database's vendor-specific features, such as OLAP features, stored procedures, user-defined types, vendor-specific SQL, functions, etc. Examples are given throughout this manual.
    -									</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -					<section id="tutorials">
    -						<title>Tutorials</title>
    -						<content><html>
    -							<p>
    -								Don't have time to read the full manual? Here are a couple of tutorials that will get you into the most essential parts of jOOQ as quick as possible.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="jooq-in-7-steps">
    -								<title>jOOQ in 7 easy steps</title>
    -								<content><html>
    -									<p>
    -										This manual section is intended for new users, to help them get a running application with jOOQ, quickly.
    -									</p>
    -								</html></content>
    -								
    -								<sections>
    -									<section id="jooq-in-7-steps-step1">
    -										<title>Step 1: Preparation</title>
    -										<content><html>
    -											<p>
    -												If you haven't already downloaded it, download jOOQ:<br/>
    -												<a href="https://sourceforge.net/projects/jooq/files/Release/" title="jOOQ download">https://sourceforge.net/projects/jooq/files/Release/</a>
    -											</p>
    -											
    -											<p>
    -												Alternatively, you can create a Maven dependency:
    -											</p>
    -</html><xml><![CDATA[<dependency>
    -  <groupId>org.jooq</groupId>
    -  <!-- artefacts are jooq, jooq-meta, jooq-codegen -->
    -  <artifactId>jooq</artifactId>
    -  <version>{jooq-version}</version>
    -</dependency>]]></xml><html>
    -
    -											<p>
    -												For this example, we'll be using MySQL. If you haven't already downloaded MySQL Connector/J, download it here:<br/>
    -												<a href="http://dev.mysql.com/downloads/connector/j/" target="_blank" title="MySQL JDBC driver">http://dev.mysql.com/downloads/connector/j/</a>
    -											</p>
    -
    -											<p>
    -												If you don't have a MySQL instance up and running yet, get <a href="http://www.apachefriends.org/en/xampp.html" title="XAMPP">XAMPP</a> now! XAMPP is a simple installation bundle for Apache, MySQL, PHP and Perl
    -											</p>
    -										</html></content>
    -									</section>
    -									
    -									<section id="jooq-in-7-steps-step2">
    -										<title>Step 2: Your database</title>
    -										<content><html>
    -											<p>
    -												We're going to create a database called "guestbook" and a corresponding "posts" table. Connect to MySQL via your command line client and type the following:
    -											</p>
    -											
    -</html><sql>CREATE DATABASE guestbook;
    -
    -CREATE TABLE `posts` (
    -  `id` bigint(20) NOT NULL,
    -  `body` varchar(255) DEFAULT NULL,
    -  `timestamp` datetime DEFAULT NULL,
    -  `title` varchar(255) DEFAULT NULL,
    -  PRIMARY KEY (`id`)
    -);
    -</sql></content>
    -									</section>
    -									
    -									<section id="jooq-in-7-steps-step3">
    -										<title>Step 3: Code generation</title>
    -										<content><html>
    -											<p>
    -												In this step, we're going to use jOOQ's command line tools to generate classes that map to the Posts table we just created. More detailed information about how to set up the jOOQ code generator can be found here:<br/>
    -												<reference id="code-generation" title="jOOQ manual pages about setting up the code generator"/>
    -											</p>
    -
    -											<p>
    -												The easiest way to generate a schema is to copy the jOOQ jar files (there should be 3) and the MySQL Connector jar file to a temporary directory. Then, create a guestbook.xml that looks like this:
    -											</p>
    -											
    -</html><xml><![CDATA[<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    -<configuration xmlns="http://www.jooq.org/xsd/jooq-codegen-2.5.0.xsd">
    -  <!-- Configure the database connection here -->
    -  <jdbc>
    -    <driver>com.mysql.jdbc.Driver</driver>
    -    <url>jdbc:mysql://localhost:3306/guestbook</url>
    -    <user>root</user>
    -    <password></password>
    -  </jdbc>
    -
    -  <generator>
    -    <!-- The default code generator. You can override this one, to generate your own code style
    -         Defaults to org.jooq.util.DefaultGenerator -->
    -    <name>org.jooq.util.DefaultGenerator</name>
    -
    -    <database>
    -      <!-- The database type. The format here is:
    -           org.util.[database].[database]Database -->
    -      <name>org.jooq.util.mysql.MySQLDatabase</name>
    -
    -      <!-- The database schema (or in the absence of schema support, in your RDBMS this
    -           can be the owner, user, database name) to be generated -->
    -      <inputSchema>guestbook</inputSchema>
    -
    -      <!-- All elements that are generated from your schema (several Java regular expressions, separated by comma)
    -           Watch out for case-sensitivity. Depending on your database, this might be important! -->
    -      <includes>.*</includes>
    -
    -      <!-- All elements that are excluded from your schema (several Java regular expressions, separated by comma).
    -              Excludes match before includes -->
    -      <excludes></excludes>
    -    </database>
    -
    -    <target>
    -      <!-- The destination package of your generated classes (within the destination directory) -->
    -      <packageName>test.generated</packageName>
    -
    -      <!-- The destination directory of your generated classes -->
    -      <directory>C:/workspace/MySQLTest/src</directory>
    -    </target>
    -  </generator>
    -</configuration>]]></xml><html>
    -											<p>
    -												Replace the username with whatever user has the appropriate privileges to query the database meta data. You'll also want to look at the other values and replace as necessary. Here are the two interesting properties:
    -											</p>
    -											<p>
    -												<code>generator.target.package</code> - set this to the parent package you want to create for the generated classes. The setting of <code>test.generated</code> will cause the <code>test.generated.Posts</code> and <code>test.generated.PostsRecord</code> to be created
    -											</p>
    -											<p>
    -												<code>generator.target.directory</code> - the directory to output to.
    -											</p>
    -											
    -											<p>
    -												Once you have the JAR files and guestbook.xml in your temp directory, type this (use colons instead of semi-colons on UNIX/Linux systems):
    -											</p>
    -
    -</html><text>java -classpath jooq-{jooq-version}.jar;jooq-meta-{jooq-version}.jar;jooq-codegen-{jooq-version}.jar;mysql-connector-java-5.1.18-bin.jar;. 
    -  org.jooq.util.GenerationTool /guestbook.xml
    -</text><html>
    -
    -											<p>
    -												Note the prefix slash before guestbook.xml. Even though it's in our working directory, we need to prepend a slash, as the configuration file is loaded from the classpath. Replace the filenames with your filenames. In this example, jOOQ {jooq-version} is being used. If everything has worked, you should see this in your console output:
    -											</p>
    -
    -</html><text>Nov 1, 2011 7:25:06 PM org.jooq.impl.JooqLogger info
    -INFO: Initialising properties  : /guestbook.xml
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Database parameters
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: ----------------------------------------------------------
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO:   dialect                : MYSQL
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO:   schema                 : guestbook
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO:   target dir             : /Users/jOOQ/Documents/workspace/MySQLTest/src
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO:   target package         : test.generated
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: ----------------------------------------------------------
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Emptying                 : /Users/jOOQ/workspace/MySQLTest/src/test/generated
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Generating classes in    : /Users/jOOQ/workspace/MySQLTest/src/test/generated
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Generating schema        : Guestbook.java
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Generating factory       : GuestbookFactory.java
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Schema generated         : Total: 122.18ms
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Sequences fetched        : 0 (0 included, 0 excluded)
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Masterdata tables fetched: 0 (0 included, 0 excluded)
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Tables fetched           : 5 (5 included, 0 excluded)
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Generating tables        : /Users/jOOQ/workspace/MySQLTest/src/test/generated/tables
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: ARRAYs fetched           : 0 (0 included, 0 excluded)
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Enums fetched            : 0 (0 included, 0 excluded)
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: UDTs fetched             : 0 (0 included, 0 excluded)
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Generating table         : Posts.java
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Tables generated         : Total: 680.464ms, +558.284ms
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Generating Keys          : /Users/jOOQ/workspace/MySQLTest/src/test/generated/tables
    -Nov 1, 2011 7:25:08 PM org.jooq.impl.JooqLogger info
    -INFO: Keys generated           : Total: 718.621ms, +38.157ms
    -Nov 1, 2011 7:25:08 PM org.jooq.impl.JooqLogger info
    -INFO: Generating records       : /Users/jOOQ/workspace/MySQLTest/src/test/generated/tables/records
    -Nov 1, 2011 7:25:08 PM org.jooq.impl.JooqLogger info
    -INFO: Generating record        : PostsRecord.java
    -Nov 1, 2011 7:25:08 PM org.jooq.impl.JooqLogger info
    -INFO: Table records generated  : Total: 782.545ms, +63.924ms
    -Nov 1, 2011 7:25:08 PM org.jooq.impl.JooqLogger info
    -INFO: Routines fetched         : 0 (0 included, 0 excluded)
    -Nov 1, 2011 7:25:08 PM org.jooq.impl.JooqLogger info
    -INFO: Packages fetched         : 0 (0 included, 0 excluded)
    -Nov 1, 2011 7:25:08 PM org.jooq.impl.JooqLogger info
    -INFO: GENERATION FINISHED!     : Total: 791.688ms, +9.143ms
    -</text></content>
    -									</section>
    -									
    -									<section id="jooq-in-7-steps-step4">
    -										<title>Step 4: Connect to your database</title>
    -										<content><html>
    -											<p>
    -												Let's just write a vanilla main class in the project containing the generated classes:
    -											</p>
    -											
    -</html><java><![CDATA[// For convenience, always static import your generated tables and jOOQ functions to decrease verbosity:
    -import static test.generated.Tables.*;
    -import static org.jooq.impl.Factory.*;
    -
    -public class Main {
    -    public static void main(String[] args) {
    -        Connection conn = null;
    -
    -        String userName = "root";
    -        String password = "";
    -        String url = "jdbc:mysql://localhost:3306/guestbook";
    -
    -        try {
    -            Class.forName("com.mysql.jdbc.Driver").newInstance();
    -            conn = DriverManager.getConnection(url, userName, password);
    -        } catch (Exception e) {
    -            // For the sake of this tutorial, let's keep exception handling simple
    -            e.printStackTrace();
    -        } finally {
    -            if (conn != null) {
    -                try {
    -                    conn.close();
    -                } catch (SQLException ignore) {
    -                }
    -            }
    -        }
    -    }
    -}]]></java><html>
    -
    -											<p>
    -												This is pretty standard code for establishing a MySQL connection.
    -											</p>
    -										</html></content>
    -									</section>
    -									
    -									<section id="jooq-in-7-steps-step5">
    -										<title>Step 5: Querying</title>
    -										<content><html>
    -											<p>
    -												Let's add a simple query:
    -											</p>
    -											
    -</html><java><![CDATA[Factory create = new Factory(conn, SQLDialect.MYSQL);
    -Result<Record> result = create.select().from(POSTS).fetch();]]></java><html>
    -
    -											<p>
    -												First get an instance of <code>Factory</code> so we can write a simple <code>SELECT</code> query. We pass an instance of the MySQL connection to <code>Factory</code>. Note that the factory doesn't close the connection. We'll have to do that ourselves.
    -											</p>
    -											<p>
    -												We then use jOOQ's DSL to return an instance of Result. We'll be using this result in the next step.
    -											</p>
    -										</html></content>
    -									</section>
    -									
    -									<section id="jooq-in-7-steps-step6">
    -										<title>Step 6: Iterating</title>
    -										<content><html>
    -											<p>
    -												After the line where we retrieve the results, let's iterate over the results and print out the data:
    -											</p>
    -
    -</html><java><![CDATA[for (Record r : result) {
    -    Long id = r.getValue(POSTS.ID);
    -    String title = r.getValue(POSTS.TITLE);
    -    String description = r.getValue(POSTS.BODY);
    -
    -    System.out.println("ID: " + id + " title: " + title + " desciption: " + description);
    -}]]></java><html>
    -
    -											<p>
    -												The full program should now look like this:
    -											</p>
    -											
    -</html><java><![CDATA[package test;
    -
    -// For convenience, always static import your generated tables and
    -// jOOQ functions to decrease verbosity:
    -import static test.generated.Tables.*;
    -import static org.jooq.impl.Factory.*;
    -
    -import java.sql.Connection;
    -import java.sql.DriverManager;
    -import java.sql.ResultSet;
    -import java.sql.Statement;
    -
    -import org.jooq.Record;
    -import org.jooq.Result;
    -
    -import test.generated.GuestbookFactory;
    -import test.generated.tables.Posts;
    -
    -public class Main {
    -
    -    /**
    -     * @param args
    -     */
    -    public static void main(String[] args) {
    -        Connection conn = null;
    -
    -        String userName = "root";
    -        String password = "";
    -        String url = "jdbc:mysql://localhost:3306/guestbook";
    -
    -        try {
    -            Class.forName("com.mysql.jdbc.Driver").newInstance();
    -            conn = DriverManager.getConnection(url, userName, password);
    -
    -            GuestbookFactory create = new GuestbookFactory(conn);
    -            Result<Record> result = create.select().from(POSTS).fetch();
    -
    -            for (Record r : result) {
    -                Long id = r.getValue(POSTS.ID);
    -                String title = r.getValue(POSTS.TITLE);
    -                String description = r.getValue(POSTS.BODY);
    -
    -                System.out.println("ID: " + id + " title: " + title + " desciption: " + description);
    -            }
    -        } catch (Exception e) {
    -            // For the sake of this tutorial, let's keep exception handling simple
    -            e.printStackTrace();
    -        } finally {
    -            if (conn != null) {
    -                try {
    -                    conn.close();
    -                } catch (SQLException ignore) {
    -                }
    -            }
    -        }
    -    }
    -}]]></java></content>
    -									</section>
    -									
    -									<section id="jooq-in-7-steps-step7">
    -										<title>Step 7: Explore!</title>
    -										<content><html>
    -											<p>
    -												jOOQ has grown to be a comprehensive SQL library. For more information, please consider the manual:<br/>
    -												<a href="http://www.jooq.org/manual/" title="jOOQ Manual">http://www.jooq.org/manual/</a>
    -											</p>
    -											<p>
    -												... explore the Javadoc:<br/>
    -												<a href="http://www.jooq.org/javadoc/latest/" title="jOOQ Javadoc">http://www.jooq.org/javadoc/latest/</a>
    -											</p>
    -											<p>
    -												... or join the news group:<br/>
    -												<a href="https://groups.google.com/forum/#!forum/jooq-user" title="jOOQ news group">https://groups.google.com/forum/#!forum/jooq-user</a>
    -											</p>
    -											<p>
    -											    This tutorial is the courtesy of Ikai Lan. See the original source here:<br/>
    -											    <a href="http://ikaisays.com/2011/11/01/getting-started-with-jooq-a-tutorial/" target="_blank" title="Ikai Lan's jOOQ tutorial">http://ikaisays.com/2011/11/01/getting-started-with-jooq-a-tutorial/</a>
    -											</p>
    -										</html></content>
    -									</section>
    -								</sections>
    -							</section>
    -
    -							<section id="jooq-in-modern-ides">
    -								<title>Using jOOQ in modern IDEs</title>
    -								<content><html>
    -									<p>Feel free to contribute a tutorial!</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="jooq-with-spring">
    -								<title>Using jOOQ with Spring</title>
    -								<content><html>
    -									<p>Feel free to contribute a tutorial!</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="a-simple-web-application">
    -								<title>A simple web application with jOOQ</title>
    -								<content><html>
    -									<p>Feel free to contribute a tutorial!</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -					
    -					<section id="dependencies">
    -						<title>Dependencies</title>
    -						<content><html>
    -							<p>
    -								jOOQ has no dependencies on any third-party libraries. This rule has some exceptions:
    -							</p>
    -							<ul>
    -								<li><reference id="logging" title="logging APIs"/> are referenced as "optional dependencies". jOOQ tries to find slf4j or log4j on the classpath. If it fails, it will use the <reference class="java.util.logging.Logger"/></li>
    -								<li>Oracle ojdbc types used for array creation are loaded using reflection.</li>
    -								<li>Small libraries with compatible licenses are incorporated into jOOQ (<a href="http://code.google.com/p/joor/">jOOR</a>, <a href="http://code.google.com/p/joou/">jOOU</a>, <a href="http://opencsv.sourceforge.net/">OpenCSV</a>, <a href="http://code.google.com/p/json-simple/">json simple</a>, <a href="http://commons.apache.org/lang/">commons-lang</a>)</li>
    -								<li>javax.persistence and javax.validation will be needed if you activate the relevant <reference id="code-generation" title="code generation flags"/></li>
    -							</ul>
    -							
    -							<h3>Build your own</h3>
    -							<p>
    -								In order to build jOOQ, please download the sources from <a href="https://github.com/jOOQ/jOOQ">https://github.com/jOOQ/jOOQ</a> and use Maven to build it, preferably in Eclipse.
    -							</p>
    -						</html></content>
    -					</section>
    -				</sections>
    -			</section>
    -
    -			<section id="sql-building">
    -				<title>SQL building</title>
    -				<content><html>
    -					<p>
    -					    SQL is a declarative language that is hard to integrate into procedural, object-oriented, functional or any other type of programming languages. jOOQ's philosophy is to give SQL the credit it deserves and integrate SQL itself as an <a href="http://en.wikipedia.org/wiki/Domain_Specific_Language">"internal domain specific language"</a> directly into Java.
    -					</p>
    -					<p>
    -						With this philosophy in mind, SQL building is the main feature of jOOQ. All other features (such as <reference id="sql-execution"/> and <reference id="code-generation"/>) are mere convenience built on top of jOOQ's SQL building capabilities.
    -					</p>
    -					<p>
    -						This section explains all about the various syntax elements involved with jOOQ's SQL building capabilities. For a complete overview of all syntax elements, please refer to the manual's section about <reference id="reference-bnf-notation"/>
    -					</p>
    -				</html></content>
    -
    -				<sections>
    -					<section id="factory">
    -						<title>The Factory class</title>
    -						<content><html>
    -							<p>
    -								jOOQ exposes a lot of interfaces and hides most implementation facts from client code. The reasons for this are:
    -							</p>
    -							<ul>
    -								<li>Interface-driven design. This allows for modelling queries in a fluent API most efficiently</li>
    -								<li>Reduction of complexity for client code.</li>
    -								<li>API guarantee. You only depend on the exposed interfaces, not concrete (potentially dialect-specific) implementations.</li>
    -							</ul>
    -							<p>
    -								The <reference class="org.jooq.impl.Factory"/> class is the main class from where you will create all jOOQ objects.	The Factory serves two types of purposes:
    -							</p>
    -							<ul>
    -								<li>It serves as a static factory for <reference id="table-expressions" title="table expressions"/>, <reference id="column-expressions" title="column expressions"/> (or "fields"), <reference id="conditional-expressions" title="conditional expressions"/> and many other <reference id="queryparts" title="QueryParts"/>.</li>
    -								<li>It implements <reference class="org.jooq.Configuration"/>, an object that configures jOOQ's behaviour when executing queries (see <reference id="sql-execution"/> for more details). Factories allow for creating <reference id="sql-statements" title="SQL statements"/> that are already "configured" and ready for execution.</li>
    -							</ul>
    -
    -							<h3>The static Factory API</h3>
    -							<p>
    -								With jOOQ 2.0, static factory methods have been introduced in order to make client code look more like SQL. Ideally, when working with jOOQ, you will simply static import all methods from the Factory class:
    -							</p>
    -							</html><java>import static org.jooq.impl.Factory.*;</java><html>
    -							<p>
    -							    Note, that when working with Eclipse, you could also add the Factory to your favourites. This will allow to access functions even more fluently:
    -							</p>
    -</html><java>concat(trim(FIRST_NAME), trim(LAST_NAME));
    -// ... which is in fact the same as:
    -Factory.concat(Factory.trim(FIRST_NAME), Factory.trim(LAST_NAME));</java><html>
    -
    -							<h3>The Factory as a Configuration object</h3>
    -							<p>
    -							    As any Configuration object, a Factory can be supplied with these objects:
    -							</p>
    -							<ul>
    -								<li><reference class="org.jooq.SQLDialect"/> : The dialect of your database. This may be any of the currently supported database types (see <reference id="sql-dialects"/> for more details)</li>
    -								<li><reference class="java.sql.Connection"/> : An optional JDBC Connection that will be re-used for the whole lifecycle of your Factory (see <reference id="connection-vs-datasource"/> for more details)</li>
    -    							<li><reference class="java.sql.DataSource"/> : An optional JDBC DataSource that will be re-used for the whole lifecycle of your Factory. If you prefer using DataSources over Connections, jOOQ will internally fetch new Connections from your DataSource, conveniently closing them again after query execution. This is particularly useful in J2EE or Spring contexts (see <reference id="connection-vs-datasource"/> for more details)</li>
    -    							<li><reference class="org.jooq.conf.Settings"/> : An optional runtime configuration (see <reference id="custom-settings"/> for more details)</li>
    -							</ul>
    -							<p>
    -								As a Configuration object, a Factory can construct <reference id="sql-statements" title="statements"/>, for later <reference id="sql-execution" title="execution"/>. An example is given here:
    -							</p>
    -</html><java><![CDATA[// The Factory is "configured" with a Connection and a SQLDialect
    -Factory create = new Factory(connection, dialect);
    -
    -// This select statement contains an internal reference to the Factory:
    -Select<?> select = create.selectOne();
    -
    -// Using the internally referenced Factory, the select statement can now be executed:
    -Result<?> result = select.fetch();]]></java></content>
    -
    -						<sections>
    -							<section id="sql-dialects">
    -								<title>SQL Dialect</title>
    -								<content><html>
    -									<p>
    -										While jOOQ tries to represent the SQL standard as much as possible, many features are vendor-specific to a given database and to its "SQL dialect". jOOQ models this using the <reference class="org.jooq.SQLDialect"/> enum type.
    -									</p>
    -									<p>
    -										The SQL dialect is one of the main attributes of a <reference id="factory" title="Factory"/>. Queries created from such factories will assume dialect-specific behaviour when <reference id="sql-rendering" title="rendering SQL"/> and <reference id="variable-binding" title="binding bind values"/>.
    -									</p>
    -									<p>
    -										Some parts of the jOOQ API are officially supported only by a given subset of the supported SQL dialects. For instance, the <reference id="connect-by-clause" title="Oracle CONNECT BY clause"/>, which is supported by the Oracle and CUBRID databases, is annotated with a <reference class="org.jooq.Support"/> annotation, as such:
    -									</p>
    -</html><java><![CDATA[/**
    - * Add an Oracle-specific <code>CONNECT BY</code> clause to the query
    - */
    -@Support({ CUBRID, ORACLE })
    -SelectConnectByConditionStep connectBy(Condition condition);]]></java><html>
    -									<p>
    -									    jOOQ API methods which are not annotated with the <reference class="org.jooq.Support"/> annotation, or which are annotated with the Support annotation, but without any SQL dialects can be safely used in all SQL dialects. An example for this is the <reference id="select-statement" title="SELECT statement"/> factory method:
    -									</p>
    -</html><java><![CDATA[/**
    - * Create a new DSL select statement.
    - */
    -@Support
    -SelectSelectStep select(Field<?>... fields);]]></java><html>
    -
    -									<h3>jOOQ's SQL clause simulation capabilities</h3>
    -									<p>
    -										The aforementioned Support annotation does not only designate, which databases natively support a feature. It also indicates that a feature is simulated by jOOQ for some databases lacking this feature. An example of this is the <reference id="distinct-predicate" title="DISTINCT predicate"/>, a predicate syntax defined by SQL:1999 and implemented only by H2, HSQLDB, and Postgres:
    -									</p>
    -
    -</html><sql><![CDATA[A IS DISTINCT FROM B]]></sql><html>
    -
    -									<p>
    -										Nevertheless, the <code>IS DISTINCT FROM</code> predicate is supported in all dialects, as its semantics can be expressed with an equivalent <reference id="case-expressions" title="CASE expression"/>. For more details, see the manual's section about the <reference id="distinct-predicate" title="DISTINCT predicate"/>.
    -									</p>
    -									
    -									<h3>jOOQ and the Oracle SQL dialect</h3>
    -									<p>
    -										Oracle SQL is much more expressive than many other SQL dialects. It features many unique keywords, clauses and functions that are out of scope for the SQL standard. Some examples for this are
    -									</p>
    -									<ul>
    -										<li>The <reference id="connect-by-clause" title="CONNECT BY clause"/>, for hierarchical queries</li>
    -										<li>The <reference id="pivot-tables" title="PIVOT"/> keyword for creating PIVOT tables</li>
    -										<li><reference id="oracle-packages" title="Packages"/>, <reference id="oracle-member-procedures" title="object-oriented user-defined types, member procedures"/> as described in the section about <reference id="stored-procedures" title="stored procedures and functions"/></li>
    -										<li>Advanced analytical functions as described in the section about <reference id="window-functions" title="window functions"/></li>
    -									</ul>
    -
    -									<p>
    -										jOOQ has a historic affinity to Oracle's SQL extensions. If something is supported in Oracle SQL, it has a high probability of making it into the jOOQ API
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="connection-vs-datasource">
    -								<title>Connection vs. DataSource</title>
    -								<content><html>
    -									<h3>Interact with JDBC Connections</h3>
    -									<p>
    -										While you can use jOOQ for <reference id="sql-building" title="SQL building"/> only, you can also run queries against a JDBC <reference class="java.sql.Connection"/>. Internally, jOOQ creates <reference class="java.sql.Statement"/> or <reference class="java.sql.PreparedStatement"/> objects from such a Connection, in order to execute statements. The normal operation mode is to provide a <reference id="factory" title="Factory"/> with a JDBC Connection, whose lifecycle you will control yourself. This means that jOOQ will not actively close connections, rollback or commit transactions.
    -									</p>
    -									<h3>Interact with JDBC DataSources</h3>
    -									<p>
    -										If you're in a J2EE or Spring context, however, you may wish to use a <reference class="javax.sql.DataSource"/> instead. Currently, Connections obtained from such a DataSource will be closed after query execution by jOOQ. The semantics of such a close operation should be the returning of the connection into a connection pool, not the actual closing of the underlying physical connection. Typically, this makes sense in an environment using distributed JTA transactions. An example of using DataSources with jOOQ can be seen in the tutorial section about <reference id="jooq-with-spring" title="using jOOQ with Spring"/>.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="custom-settings">
    -								<title>Custom Settings</title>
    -								<content><html>
    -									<p>
    -										The jOOQ Factory allows for some optional configuration elements to be used by advanced users. The <reference class="org.jooq.conf.Settings" /> class is a JAXB-annotated type, that can be provided to a Factory in several ways:
    -									</p>
    -									<ul>
    -										<li>In the constructor. This will override default settings below</li>
    -										<li>From a location specified by a JVM parameter: -Dorg.jooq.settings</li>
    -										<li>From the classpath at /jooq-settings.xml</li>
    -										<li>From the settings defaults, as specified in <a href="http://www.jooq.org/xsd/jooq-runtime-2.5.0.xsd" title="The jOOQ Runtime configuration XSD">http://www.jooq.org/xsd/jooq-runtime-2.5.0.xsd</a></li>
    -									</ul>
    -									<h3>Example</h3>
    -									<p>
    -										For example, if you want to indicate to jOOQ, that it should inline all bind variables, and execute static <reference class="java.sql.Statement"/> instead of binding its variables to <reference class="java.sql.PreparedStatement"/>, you can do so by using the following Factory:
    -									</p>
    -</html><java><![CDATA[Settings settings = new Settings();
    -settings.setStatementType(StatementType.STATIC_STATEMENT);
    -Factory create = new Factory(connection, dialect, settings);]]></java><html>
    -									<p>
    -										Subsequent sections of the manual contain some more in-depth explanations about these settings:
    -									</p>
    -									<ul>
    -										<li>
    -		     								<reference id="schema-mapping" title="Runtime schema and table mapping"/>
    -		   								</li>
    -		     							<li>
    -		     								<reference id="execute-listeners" title="Execute listeners and SQL tracing"/>
    -		     							</li>
    -		     							<li>
    -		     								<reference id="optimistic-locking" title="Execute CRUD with optimistic locking enabled"/>
    -		     							</li>
    -		     							<li>
    -		     								<reference id="logging" title="Enabling DEBUG logging of all executed SQL"/>
    -		     							</li>
    -		   							</ul>
    -		   							<p>
    -										Please refer to the jOOQ runtime configuration XSD for more details:<br/>
    -										<a href="http://www.jooq.org/xsd/jooq-runtime-2.5.0.xsd" title="The jOOQ Runtime configuration XSD">http://www.jooq.org/xsd/jooq-runtime-2.5.0.xsd</a>
    -									</p>
    -								</html></content>
    -							</section>
    -							
    -							<section id="runtime-schema-mapping">
    -								<title>Runtime schema and table mapping</title>
    -								<content><html>
    -									<h3>Mapping your DEV schema to a productive environment</h3>
    -									<p>
    -										You may wish to design your database in a way that you have several instances of your schema. This is useful when you want to cleanly separate data belonging to several customers / organisation units / branches / users and put each of those entities' data in a separate database or schema.
    -									</p>
    -									
    -									<p>
    -										In our AUTHOR example this would mean that you provide a book reference database to several companies, such as My Book World and Books R Us. In that case, you'll probably have a schema setup like this:
    -									</p>
    -									<ul>
    -										<li>DEV: Your development schema. This will be the schema that you base code generation upon, with jOOQ </li>
    -										<li>MY_BOOK_WORLD: The schema instance for My Book World </li>
    -										<li>BOOKS_R_US: The schema instance for Books R Us </li>
    -									</ul>
    -
    -									<h3>Mapping DEV to MY_BOOK_WORLD with jOOQ</h3>
    -									<p>
    -										When a user from My Book World logs in, you want them to access the MY_BOOK_WORLD schema using classes generated from DEV. This can be achieved with the <reference class="org.jooq.conf.RenderMapping"/> class, that you can equip your Factory's <reference id="custom-settings" title="settings"/> with. Take the following example:
    -									</p>
    -
    -</html><java>Settings settings = new Settings()
    -    .withRenderMapping(new RenderMapping()
    -    .withSchemata(
    -        new MappedSchema().withInput("DEV")
    -                          .withOutput("MY_BOOK_WORLD")));
    -
    -// Add the settings to the factory
    -Factory create = new Factory(connection, SQLDialect.ORACLE, settings);
    -
    -// Run queries with the "mapped" factory
    -create.selectFrom(AUTHOR).fetch();</java><html>
    -
    -									<p>
    -										The query executed with a Factory equipped with the above mapping will in fact produce this SQL statement:
    -									</p>
    -									
    -</html><sql>SELECT * FROM MY_BOOK_WORLD.AUTHOR</sql><html>
    -									<p>
    -										Even if AUTHOR was generated from DEV.
    -									</p>
    -
    -									<h3>Mapping several schemata</h3>
    -									<p>
    -										Your development database may not be restricted to hold only one DEV schema. You may also have a LOG schema and a MASTER schema. Let's say the MASTER schema is shared among all customers, but each customer has their own LOG schema instance. Then you can enhance your RenderMapping like this (e.g. using an XML configuration file):
    -									</p>
    -
    -</html><xml><![CDATA[<settings xmlns="http://www.jooq.org/xsd/jooq-runtime-2.5.0.xsd">
    -  <renderMapping>
    -    <schemata>
    -      <schema>
    -        <input>DEV</input>
    -        <output>MY_BOOK_WORLD</output>
    -      </schema>
    -      <schema>
    -        <input>LOG</input>
    -        <output>MY_BOOK_WORLD_LOG</output>
    -      </schema>
    -    </schemata>
    -  </renderMapping>
    -</settings>]]></xml><html>
    -
    -                            		<p>
    -                            			Note, you can load the above XML file like this:
    -                           			</p>
    -
    -</html><java>Settings settings = JAXB.unmarshal(new File("jooq-runtime.xml"), Settings.class);</java><html>
    -
    -									<p>
    -										This will map generated classes from DEV to MY_BOOK_WORLD, from LOG to MY_BOOK_WORLD_LOG, but leave the MASTER schema alone. Whenever you want to change your mapping configuration, you will have to create a new Factory
    -									</p>
    -
    -
    -									<h3>Using a default schema</h3>
    -									<p>
    -										Another option to switch schema names is to use a default schema for the Factory's underlying Connection. Many RDBMS support a USE or SET SCHEMA command, which you can call like this:
    -									</p>
    -
    -</html><java>// Set the default schema
    -Schema MY_BOOK_WORLD = ...
    -create.use(MY_BOOK_WORLD);
    -
    -// Run queries with factory having a default schema
    -create.selectFrom(AUTHOR).fetch();</java><html>
    -
    -									<p>
    -										Queries generated from the above Factory will produce this kind of SQL statement:
    -									</p>
    -
    -</html><sql>-- the schema name is omitted from all SQL constructs.
    -SELECT * FROM AUTHOR</sql><html>
    -
    -                            		<p>
    -                            			If you wish not to render any schema name at all, use the following Settings property for this:
    -                           			</p>
    -
    -
    -</html><java>Settings settings = new Settings()
    -    .withRenderSchema(false);
    -
    -// Add the settings to the factory
    -Factory create = new Factory(connection, SQLDialect.ORACLE, settings);
    -
    -// Run queries that omit rendering schema names
    -create.selectFrom(AUTHOR).fetch();</java><html>
    -
    -									<h3>Mapping of tables</h3>
    -									<p>
    -										Not only schemata can be mapped, but also tables. If you are not the owner of the database your application connects to, you might need to install your schema with some sort of prefix to every table. In our examples, this might mean that you will have to map DEV.AUTHOR to something MY_BOOK_WORLD.MY_APP__AUTHOR, where MY_APP__ is a prefix applied to all of your tables. This can be achieved by creating the following mapping: 
    -									</p>
    -
    -</html><java>Settings settings = new Settings()
    -    .withRenderMapping(new RenderMapping()
    -    .withSchemata(
    -        new MappedSchema().withInput("DEV")
    -                          .withOutput("MY_BOOK_WORLD")
    -                          .withTables(
    -         new MappedTable().withInput("AUTHOR")
    -                          .withOutput("MY_APP__AUTHOR"))));
    -
    -// Add the settings to the factory
    -Factory create = new Factory(connection, SQLDialect.ORACLE, settings);
    -
    -// Run queries with the "mapped" factory
    -create.selectFrom(AUTHOR).fetch();</java><html>
    -
    -									<p>
    -										The query executed with a Factory equipped with the above mapping will in fact produce this SQL statement:
    -									</p>
    -									
    -</html><sql>SELECT * FROM MY_BOOK_WORLD.MY_APP__AUTHOR</sql><html>
    -
    -		                            <p>
    -		                           		Table mapping and schema mapping can be applied independently, by specifying several MappedSchema entries in the above configuration. jOOQ will process them in order of appearance and map at first match. Note that you can always omit a MappedSchema's output value, in case of which, only the table mapping is applied. If you omit a MappedSchema's input value, the table mapping is applied to all schemata!
    -		                            </p>
    -
    -									<h3>Hard-wiring mappings at code-generation time</h3>
    -									<p>
    -										Note that the manual's section about <reference id="schema-mapping" title="code generation schema mapping"/> explains how you can hard-wire your schema mappings at code generation time
    -									</p>									
    -								</html></content>
    -							</section>
    -
    -							<section id="factory-subclasses">
    -								<title>Factory subclasses</title>
    -								<content><html>
    -									<p>
    -										There are a couple of subclasses for the general Factory. Each SQL dialect has its own dialect-specific factory. For instance, if you're only using the MySQL dialect, you can choose to create a new Factory using any of the following types:
    -									</p>
    -</html><java>// A general, dialect-unspecific factory
    -Factory create = new Factory(connection, SQLDialect.MYSQL);
    -
    -// A MySQL-specific factory
    -MySQLFactory create = new MySQLFactory(connection);</java><html>
    -									<p>
    -										The advantage of using a dialect-specific Factory lies in the fact,	that you have access to more proprietary RDMBS functionality. This may include:
    -									</p>
    -									<ul>
    -		    							<li>MySQL's encryption functions</li>
    -		    							<li>PL/SQL constructs, pgplsql, or any other dialect's ROUTINE-language (maybe in the future)</li>
    -									</ul>
    -									<p>
    -										Another type of Factory subclasses are each generated schema's factories. If you generate your schema TEST, then you will have access to a TestFactory. By default, such a schema-specific Factory will not render the schema name.
    -									</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -					<section id="sql-statements">
    -						<title>SQL Statements</title>
    -						<content><html>
    -							<p>
    -								jOOQ currently supports 6 types of SQL statements. All of these statements are constructed from a Factory instance with an optional <reference id="connection-vs-datasource" title="JDBC Connection or DataSource"/>. If supplied with a Connection or DataSource, they can be executed. Depending on the <reference id="query-vs-resultquery" title="query type"/>, executed queries can return results.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="dsl-and-non-dsl">
    -								<title>jOOQ's DSL and non-DSL API</title>
    -								<content><html>
    -									<p>
    -										jOOQ ships with its own DSL (or	<a href="http://en.wikipedia.org/wiki/Domain-specific_language" title="Domain Specific Language">Domain Specific Language</a>) that	simulates SQL in Java. This means, that you can	write SQL statements almost as if Java natively supported it, just like .NET's C# does with <a href="http://msdn.microsoft.com/en-us/library/bb425822.aspx">LINQ to SQL.</a>
    -									</p>
    -									<p>
    -										Here is an example to illustrate what that means:
    -									</p>
    -									
    -</html><code-pair><sql><![CDATA[-- Select all books by authors born after 1920,
    --- named "Paulo" from a catalogue:
    -SELECT *
    -  FROM author a
    -  JOIN book b ON a.id = b.author_id
    - WHERE a.year_of_birth > 1920
    -   AND a.first_name = 'Paulo'
    - ORDER BY b.title]]></sql><java><![CDATA[Result<Record> result =
    -create.select()
    -      .from(AUTHOR.as("a"))
    -      .join(BOOK.as("b")).on(a.ID.equal(b.AUTHOR_ID))
    -      .where(a.YEAR_OF_BIRTH.greaterThan(1920)
    -      .and(a.FIRST_NAME.equal("Paulo")))
    -      .orderBy(b.TITLE)
    -      .fetch();]]></java></code-pair><html>
    -
    -									<p>
    -										We'll see how the aliasing works later in the section about <reference id="aliased-tables" title="aliased tables"/>
    -									</p>
    -
    -									<h3>jOOQ as an internal domain specific language in Java (a.k.a. the DSL-API)</h3>
    -									<p>
    -										Many other frameworks have similar APIs with similar feature sets. Yet, what makes jOOQ special is its informal <reference id="reference-bnf-notation" title="BNF notation"/> modelling a unified SQL dialect suitable for many vendor-specific dialects, and implementing that BNF notation as a hierarchy of interfaces in Java. This concept is extremely powerful, when <reference id="jooq-in-modern-ides" title="using jOOQ in modern IDEs" /> with syntax completion. Not only can you code much faster, your SQL code will be compile-checked to a certain extent. An example of a DSL query equivalent to the previous one is given here:
    -									</p>
    -</html><java><![CDATA[Factory create = new Factory(connection, dialect);
    -Result<?> result = create.select()
    -                         .from(AUTHOR)
    -                         .join(BOOK).on(BOOK.AUTHOR_ID.equal(AUTHOR.ID))
    -                         .fetch();]]></java><html>
    -
    -                         			<p>
    -                         				Unlike other, simpler frameworks that use <a href="http://en.wikipedia.org/wiki/Fluent_interface">"fluent APIs"</a> or <a href="http://en.wikipedia.org/wiki/Method_chaining">"method chaining"</a>, jOOQ's BNF-based interface hierarchy will not allow bad query syntax. The following will not compile, for instance:
    -                         			</p>
    -</html><java><![CDATA[Factory create = new Factory(connection, dialect);
    -Result<?> result = create.select()
    -                         .join(BOOK).on(BOOK.AUTHOR_ID.equal(AUTHOR.ID))
    -                      //  ^^^^ "join" is not possible here
    -                         .from(AUTHOR)
    -                         .fetch();
    -
    -Result<?> result = create.select()
    -                         .from(AUTHOR)
    -                         .join(BOOK)
    -                         .fetch();
    -                      //  ^^^^^ "on" is missing here
    -
    -Result<?> result = create.select(rowNumber())
    -                      //         ^^^^^^^^^ "over()" is missing here
    -                         .from(AUTHOR)
    -                         .fetch();]]></java><html>
    -
    -									<h3>History of SQL building and incremental query building (a.k.a. the non-DSL API)</h3>
    -									<p>
    -										Historically, jOOQ started out as an object-oriented SQL builder library like any other. This meant that all queries and their syntactic components were modeled as so-called <reference id="queryparts" title="QueryParts"/>, which delegate <reference id="sql-rendering" title="SQL rendering"/> and <reference id="variable-binding" title="variable binding"/> to child components. This part of the API will be referred to as the non-DSL API, which is still maintained and used internally by jOOQ for incremental query building. An example of incremental query building is given here:
    -									</p>
    -</html><java><![CDATA[Factory create = new Factory(connection, dialect);
    -SelectQuery query = create.selectQuery();
    -query.addFrom(AUTHOR);
    -
    -// Join books only under certain circumstances
    -if (join) {
    -    query.addJoin(BOOK, BOOK.AUTHOR_ID.equal(AUTHOR.ID));
    -}
    -
    -Result<?> result = query.fetch();]]></java><html>
    -
    -									<p>
    -										This query is equivalent to the one shown before using the DSL syntax. In fact, internally, the DSL API constructs precisely this QueryObject. Note, that you can always access the SelectQuery object to switch between DSL and non-DSL APIs:
    -									</p>
    -
    -</html><java><![CDATA[Factory create = new Factory(connection, dialect);
    -SelectFinalStep select = create.select().from(AUTHOR);
    -
    -// Add the JOIN clause on the internal QueryObject representation
    -SelectQuery query = select.getQuery();
    -query.addJoin(BOOK, BOOK.AUTHOR_ID.equal(AUTHOR.ID));]]></java><html>
    -
    -									<h3>Mutability</h3>
    -									<p>
    -										Note, that for historic reasons, the DSL API mixes mutable and immutable behaviour with respect to the internal representation of the <reference id="queryparts" title="QueryPart"/> being constructed. While creating <reference id="conditional-expressions" title="conditional expressions"/>, <reference id="column-expressions" title="column expressions"/> (such as functions) assumes immutable behaviour, creating <reference id="sql-statements" title="SQL statements"/> does not. In other words, the following can be said:
    -									</p>
    -									
    -</html><java><![CDATA[// Conditional expressions (immutable)
    -// -----------------------------------
    -Condition a = BOOK.TITLE.equal("1984");
    -Condition b = BOOK.TITLE.equal("Animal Farm");
    -
    -// The following can be said
    -a       != a.or(b); // or() does not modify a
    -a.or(b) != a.or(b); // or() always creates new objects
    -
    -// Statements (mutable)
    -// --------------------
    -SelectFromStep s1 = create.select();
    -SelectJoinStep s2 = s1.from(BOOK);
    -SelectJoinStep s3 = s1.from(AUTHOR);
    -
    -// The following can be said
    -s1 == s2; // The internal object is always the same
    -s2 == s3; // The internal object is always the same]]></java><html>
    -
    -									<p>
    -										Mutability may be removed in a future version of jOOQ.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="select-statement">
    -								<title>The SELECT statement</title>
    -								<content><html>
    -									<p>
    -										When you don't just perform <reference id="crud-with-updatablerecords" title="CRUD"/> (i.e. SELECT * FROM your_table WHERE ID = ?), you're usually generating new record types using custom projections. With jOOQ, this is as intuitive, as if using SQL directly. A more or less complete example of the "standard" SQL syntax, plus some extensions, is provided by a query like this:
    -									</p>
    -</html><code-pair>
    -<sql><![CDATA[-- get all authors' first and last names, and the number
    --- of books they've written in German, if they have written
    --- more than five books in German in the last three years
    --- (from 2011), and sort those authors by last names
    --- limiting results to the second and third row, locking
    --- the rows for a subsequent update... whew!
    -
    -  SELECT AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME, COUNT(*)
    -    FROM AUTHOR
    -    JOIN BOOK ON AUTHOR.ID = BOOK.AUTHOR_ID
    -   WHERE BOOK.LANGUAGE = 'DE'
    -     AND BOOK.PUBLISHED > '2008-01-01'
    -GROUP BY AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME
    -  HAVING COUNT(*) > 5
    -ORDER BY AUTHOR.LAST_NAME ASC NULLS FIRST
    -   LIMIT 2
    -  OFFSET 1
    -     FOR UPDATE]]></sql><java><![CDATA[// And with jOOQ...
    -
    -
    -
    -
    -Factory create = new Factory(connection, dialect);
    -
    -create.select(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME, count())
    -      .from(AUTHOR)
    -      .join(BOOK).on(BOOK.AUTHOR_ID.equal(AUTHOR.ID))
    -      .where(BOOK.LANGUAGE.equal("DE"))
    -      .and(BOOK.PUBLISHED.greaterThan("2008-01-01"))
    -      .groupBy(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -      .having(count().greaterThan(5))
    -      .orderBy(AUTHOR.LAST_NAME.asc().nullsFirst())
    -      .limit(1)
    -      .offset(2)
    -      .forUpdate();]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										Details about the various clauses of this query will be provided in subsequent sections
    -									</p>
    -
    -									<h3>SELECT from single physical tables</h3>
    -									<p>
    -										A very similar, but limited API is available, if you want to select from single physical tables in order to retrieve <reference id="crud-with-updatablerecords" title="TableRecords or even UpdatableRecords"/>. The decision, which type of select to create is already made at the very first step, when you create the SELECT statement with the Factory:
    -									</p>
    -
    -</html><java><![CDATA[public <R extends Record> SimpleSelectWhereStep<R> selectFrom(Table<R> table);]]></java><html>
    -									<p>
    -										As you can see, there is no way to further restrict/project the selected fields. This just selects all known TableFields in the supplied Table, and it also binds &lt;R extends Record&gt; to your Table's associated Record. An example of such a Query would then be:
    -									</p>
    -</html><java><![CDATA[BookRecord book = create.selectFrom(BOOK)
    -                        .where(BOOK.LANGUAGE.equal("DE"))
    -                        .orderBy(BOOK.TITLE)
    -                        .fetchAny();]]></java><html>
    -
    -                   					<p>
    -                   						The simple SELECT API is limited in the way that it does not support any of these clauses:
    -                   					</p>
    -                   					<ul>
    -                   						<li><reference id="select-clause"/></li>
    -                   						<li><reference id="join-clause"/></li>
    -                   						<li><reference id="group-by-clause"/></li>
    -                   						<li><reference id="having-clause"/></li>
    -                   					</ul>
    -                   					<p>
    -                   						In most parts of this manual, it is assumed that you do not use the simple SELECT API. For more information about the simple SELECT API, see the manual's section about <reference id="record-vs-tablerecord" title="fetching strongly or weakly typed records"/>.
    -                   					</p>
    -								</html></content>
    -
    -								<sections>
    -									<section id="select-clause">
    -										<title>The SELECT clause</title>
    -										<content><html>
    -											<p>
    -												The SELECT clause lets you project your own record types, referencing table fields, functions, arithmetic expressions, etc. The Factory provides several methods for expressing a SELECT clause:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[-- The SELECT clause
    -SELECT BOOK.ID, BOOK.TITLE
    -SELECT BOOK.ID, TRIM(BOOK.TITLE)
    -]]></sql><java><![CDATA[// Provide a varargs Fields list to the SELECT clause:
    -Select<?> s1 = create.select(BOOK.ID, BOOK.TITLE);
    -Select<?> s2 = create.select(BOOK.ID, trim(BOOK.TITLE));]]></java>
    -</code-pair><html>
    -
    -											<p>
    -												Some commonly used projections can be easily created using convenience methods:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[-- Simple SELECTs
    -SELECT COUNT(*)
    -SELECT 0 -- Not a bind variable
    -SELECT 1 -- Not a bind variable
    -]]></sql><java><![CDATA[// Select commonly used values
    -Select<?> select1 = create.selectCount();
    -Select<?> select2 = create.selectZero();
    -Select<?> select2 = create.selectOne();]]></java>
    -</code-pair><html>
    -
    -											<p>
    -												See more details about functions and expressions in the manual's section about <reference id="column-expressions"/>
    -											</p>
    -
    -											<h3>The SELECT DISTINCT clause</h3>
    -											<p>
    -												The DISTINCT keyword can be included in the method name, constructing a SELECT clause
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT DISTINCT BOOK.TITLE]]></sql><java><![CDATA[Select<?> select1 = create.selectDistinct(BOOK.TITLE);]]></java>
    -</code-pair><html>
    -										</html></content>
    -									</section>
    -
    -									<section id="from-clause">
    -										<title>The FROM clause</title>
    -										<content><html>
    -											<p>
    -												The SQL FROM clause allows for specifying any number of <reference id="table-expressions" title="table expressions"/> to select data from. The following are examples of how to form normal FROM clauses:
    -											</p>
    -
    -</html><code-pair>
    -	<sql><![CDATA[SELECT 1 FROM BOOK
    -SELECT 1 FROM BOOK, AUTHOR
    -SELECT 1 FROM BOOK "b", AUTHOR "a"]]></sql><java><![CDATA[create.selectOne().from(BOOK);
    -create.selectOne().from(BOOK, AUTHOR);
    -create.selectOne().from(BOOK.as("b"), AUTHOR.as("a"));]]></java>
    -</code-pair><html>
    -
    -											<p>
    -												Read more about aliasing in the manual's section about <reference id="aliased-tables" title="aliased tables"/>.
    -											</p>
    -											
    -											<h3>More advanced table expressions</h3>
    -											<p>
    -												Apart from simple tables, you can pass any arbitrary <reference id="table-expressions" title="table expression"/> to the jOOQ FROM clause. This may include <reference id="array-and-cursor-unnesting" title="unnested cursors"/> in Oracle:
    -											</p>
    -
    -</html><code-pair>
    -	<sql><![CDATA[SELECT *
    -FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(null, null, 'ALLSTATS'));]]></sql><java><![CDATA[create.select()
    -      .from(table(DbmsXplan.displayCursor(null, null, "ALLSTATS"));]]></java>
    -</code-pair><html>
    -
    -											<p>
    -												Note, in order to access the DbmsXplan package, you can use the <reference id="code-generation" title="code generator"/> to generate Oracle's SYS schema.
    -											</p>
    -
    -
    -											<h3>Selecting FROM DUAL with jOOQ</h3>
    -											<p>
    -												In many SQL dialects, FROM is a mandatory clause, in some it isn't. jOOQ allows you to omit the FROM clause, returning just one record. An example:
    -											</p>
    -
    -</html><code-pair>
    -	<sql><![CDATA[SELECT 1 FROM DUAL
    -SELECT 1]]></sql><java><![CDATA[new Factory(SQLDialect.ORACLE).selectOne().getSQL();
    -new Factory(SQLDialect.POSTGRES).selectOne().getSQL();]]></java>
    -</code-pair><html>
    -
    -											<p>
    -												Read more about dual or dummy tables in the manual's section about <reference id="dual" title="the DUAL table"/>. The following are examples of how to form normal FROM clauses:
    -											</p>
    -										</html></content>
    -									</section>
    -
    -									<section id="join-clause">
    -										<title>The JOIN clause</title>
    -										<content><html>
    -											<p>
    -												jOOQ supports many different types of standard SQL JOIN operations:
    -											</p>
    -											<ul>
    -												<li>[ INNER ] JOIN</li>
    -												<li>LEFT [ OUTER ] JOIN</li>
    -												<li>RIGHT [ OUTER ] JOIN</li>
    -												<li>FULL OUTER JOIN</li>
    -												<li>CROSS JOIN</li>
    -												<li>NATURAL JOIN</li>
    -												<li>NATURAL LEFT [ OUTER ] JOIN</li>
    -												<li>NATURAL RIGHT [ OUTER ] JOIN</li>
    -											</ul>
    -
    -											<p>
    -												All of these JOIN methods can be called on <reference class="org.jooq.Table"/> types, or directly after the FROM clause for convenience. The following example joins AUTHOR and BOOK
    -											</p>
    -
    -</html><java><![CDATA[Factory create = new Factory(connection, dialect);
    -
    -// Call "join" directly on the AUTHOR table
    -Result<?> result = create.select()
    -                         .from(AUTHOR.join(BOOK)
    -                                     .on(BOOK.AUTHOR_ID.equal(AUTHOR.ID)))
    -                         .fetch();
    -
    -// Call "join" on the type returned by "from"
    -Result<?> result = create.select()
    -                         .from(AUTHOR)
    -                         .join(BOOK)
    -                         .on(BOOK.AUTHOR_ID.equal(AUTHOR.ID))
    -                         .fetch();]]></java><html>
    -
    -											<p>
    -												The two syntaxes will produce the same SQL statement. However, calling "join" on <reference class="org.jooq.Table"/> objects allows for more powerful, nested JOIN expressions (if you can handle the parentheses):
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT *
    -FROM AUTHOR
    -LEFT OUTER JOIN (
    -  BOOK JOIN BOOK_TO_BOOK_STORE
    -       ON BOOK_TO_BOOK_STORE.BOOK_ID = BOOK.ID
    -)
    -ON BOOK.AUTHOR_ID = AUTHOR.ID]]></sql><java><![CDATA[// Nest joins and provide JOIN conditions only at the end
    -create.select()
    -      .from(AUTHOR
    -      .leftOuterJoin(BOOK
    -        .join(BOOK_TO_BOOK_STORE)
    -        .on(BOOK_TO_BOOK_STORE.BOOK_ID.equal(BOOK.ID)))
    -      .on(BOOK.AUTHOR_ID.equal(AUTHOR.ID)));]]></java></code-pair><html>
    -
    -      										<ul>
    -      											<li>See the section about <reference id="conditional-expressions" title="conditional expressions"/> to learn more about the many ways to create <reference class="org.jooq.Condition"/> objects in jOOQ.</li>
    -      											<li>See the section about <reference id="table-expressions" title="table expressions"/> to learn about the various ways of referencing <reference class="org.jooq.Table"/> objects in jOOQ</li>
    -      										</ul>
    -
    -											<h3>JOIN ON KEY, convenience provided by jOOQ</h3>
    -											<p>
    -												Surprisingly, SQL does not allow to formally JOIN on well-known foreign key relationship information. Naturally, when you join BOOK to AUTHOR, you will want to do that based on the BOOK.AUTHOR_ID foreign key to AUTHOR.ID primary key relation. Not being able to do this in SQL leads to a lot of repetitive code, re-writing the same JOIN predicate again and again - especially, when your foreign keys contain more than one column. With jOOQ, when you use <reference id="code-generation" title="code generation"/>, you can use foreign key constraint information in JOIN expressions as such:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT *
    -FROM AUTHOR
    -JOIN BOOK ON BOOK.AUTHOR_ID = AUTHOR.ID]]></sql><java><![CDATA[create.select()
    -      .from(AUTHOR)
    -      .join(BOOK).onKey();]]></java></code-pair><html>
    -
    -      										<p>
    -      											In case of ambiguity, you can also supply field references for your foreign keys, or the generated foreign key reference to the onKey() method.
    -      										</p>
    -
    -											<h3>The JOIN USING syntax</h3>
    -											<p>
    -												Most often, you will provide jOOQ with JOIN conditions in the JOIN .. ON clause. SQL supports a different means of specifying how two tables are to be joined. This is the JOIN .. USING clause. Instead of a condition, you supply a set of fields whose names are common to both tables to the left and right of a JOIN operation. This can be useful when your database schema has a high degree of <a href="http://en.wikipedia.org/wiki/Database_normalization">relational normalisation</a>. An example:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[-- Assuming that both tables contain AUTHOR_ID columns
    -SELECT *
    -FROM AUTHOR
    -JOIN BOOK USING (AUTHOR_ID)]]></sql><java><![CDATA[// join(...).using(...)
    -create.select()
    -      .from(AUTHOR)
    -      .join(BOOK).using(AUTHOR.AUTHOR_ID);]]></java></code-pair><html>
    -
    -											<p>
    -												In schemas with high degrees of normalisation, you may also choose to use NATURAL JOIN, which takes no JOIN arguments as it joins using all fields that are common to the table expressions to the left and to the right of the JOIN operator. An example:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[-- Assuming that both tables contain AUTHOR_ID columns
    -SELECT *
    -FROM AUTHOR
    -NATURAL JOIN BOOK]]></sql><java><![CDATA[// naturalJoin(...)
    -create.select()
    -      .from(AUTHOR)
    -      .naturalJoin(BOOK);]]></java></code-pair><html>
    -
    -											<h3>Oracle's partitioned OUTER JOIN</h3>
    -											<p>
    -												Oracle SQL ships with a special syntax available for OUTER JOIN clauses. According to the <a href="http://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_10002.htm#i2196190">Oracle documentation about partitioned outer joins</a> this can be used to fill gaps for simplified analytical calculations. jOOQ only supports putting the PARTITION BY clause to the right of the OUTER JOIN clause. The following example will create at least one record per AUTHOR and per existing value in BOOK.PUBLISHED_IN, regardless if an AUTHOR has actually published a book in that year.
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT *
    -FROM AUTHOR
    -LEFT OUTER JOIN BOOK
    -PARTITION BY (PUBLISHED_IN)
    -ON BOOK.AUTHOR_ID = AUTHOR.ID]]></sql><java><![CDATA[create.select()
    -      .from(AUTHOR)
    -      .leftOuterJoin(BOOK)
    -      .partitionBy(BOOK.PUBLISHED_IN)
    -      .on(BOOK.AUTHOR_ID.equal(AUTHOR.ID));]]></java></code-pair><html>
    -
    -										</html></content>
    -									</section>
    -
    -									<section id="where-clause">
    -										<title>The WHERE clause</title>
    -										<content><html>
    -											<p>
    -												The WHERE clause can be used for JOIN or filter predicates, in order to restrict the data returned by the <reference id="table-expressions" title="table expressions"/> supplied to the previously specified <reference id="from-clause" title="from clause"/> and <reference id="join-clause" title="join clause"/>. Here is an example:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT *
    -FROM BOOK
    -WHERE AUTHOR_ID = 1
    -AND TITLE = '1984']]></sql><java><![CDATA[create.select()
    -      .from(BOOK)
    -      .where(BOOK.AUTHOR_ID.equal(1))
    -      .and(BOOK.TITLE.equal("1984"));]]></java></code-pair><html>
    -
    -											<p>
    -												The above syntax is convenience provided by jOOQ, allowing you to connect the <reference class="org.jooq.Condition"/> supplied in the WHERE clause with another condition using an AND operator. You can of course also create a more complex condition and supply that to the WHERE clause directly (observe the different placing of parentheses). The results will be the same:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT *
    -FROM BOOK
    -WHERE AUTHOR_ID = 1
    -AND TITLE = '1984']]></sql><java><![CDATA[create.select()
    -      .from(BOOK)
    -      .where(BOOK.AUTHOR_ID.equal(1).and(
    -             BOOK.TITLE.equal("1984")));]]></java></code-pair><html>
    -
    -											<p>
    -												You will find more information about creating <reference id="conditional-expressions" title="conditional expressions"/> later in the manual.
    -											</p>
    -										</html></content>
    -									</section>
    -
    -									<section id="connect-by-clause">
    -										<title>The CONNECT BY clause</title>
    -										<content><html>
    -											<p>
    -												The Oracle database knows a very succinct syntax for creating hierarchical queries: the CONNECT BY clause, which is fully supported by jOOQ, including all related functions and pseudo-columns. A more or less formal definition of this clause is given here:
    -											</p>
    -</html><sql>--   SELECT ..
    ---     FROM ..
    ---    WHERE ..
    - CONNECT BY [NOCYCLE] condition [AND condition, ...] [START WITH condition]
    --- GROUP BY ..</sql><html>
    -
    -											<p>
    -												An example for an iterative query, iterating through values between 1 and 5 is this:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT LEVEL
    -FROM DUAL
    -CONNECT BY LEVEL <= 5]]></sql><java><![CDATA[// Get a table with elements 1, 2, 3, 4, 5
    -create.select(level())
    -      .connectBy(level().lessOrEqual(5));]]></java></code-pair><html>
    -
    -											<p>
    -												Here's a more complex example where you can recursively fetch directories in your database, and concatenate them to a path:
    -											</p>
    -</html><code-pair>
    -<sql><![CDATA[SELECT 
    -  SUBSTR(SYS_CONNECT_BY_PATH(DIRECTORY.NAME, '/'), 2)
    -FROM DIRECTORY
    -CONNECT BY 
    -  PRIOR DIRECTORY.ID = DIRECTORY_PARENT_ID
    -START WITH DIRECTORY.PARENT_ID IS NULL
    -ORDER BY 1]]></sql><java><![CDATA[.select(
    -   sysConnectByPath(DIRECTORY.NAME, "/").substring(2))
    -.from(DIRECTORY)
    -.connectBy(
    -   prior(DIRECTORY.ID).equal(DIRECTORY.PARENT_ID))
    -.startWith(DIRECTORY.PARENT_ID.isNull())
    -.orderBy(1);]]></java>
    -</code-pair><html>
    -
    -    										<p>
    -    											The output might then look like this
    -   											</p>
    -
    -</html><text>+------------------------------------------------+
    -|substring                                       |
    -+------------------------------------------------+
    -|C:                                              |
    -|C:/eclipse                                      |
    -|C:/eclipse/configuration                        |
    -|C:/eclipse/dropins                              |
    -|C:/eclipse/eclipse.exe                          |
    -+------------------------------------------------+
    -|...21 record(s) truncated...
    -</text><html>
    -
    -											<p>
    -												Some of the supported functions and pseudo-columns are these (available from the <reference id="factory" title="Factory"/>):
    -											</p>
    -
    -											<ul>
    -												<li>LEVEL</li>
    -												<li>CONNECT_BY_IS_CYCLE</li>
    -												<li>CONNECT_BY_IS_LEAF</li>
    -												<li>CONNECT_BY_ROOT</li>
    -												<li>SYS_CONNECT_BY_PATH</li>
    -												<li>PRIOR</li>
    -											</ul>
    -
    -											<p>
    -												Note that this syntax is also supported in the CUBRID database.
    -											</p>
    -										</html></content>
    -									</section>
    -
    -									<section id="group-by-clause">
    -										<title>The GROUP BY clause</title>
    -										<content><html>
    -											<p>
    -												GROUP BY can be used to create unique groups of data, to form aggregations, to remove duplicates and for other reasons. It will transform your previously defined <reference id="table-expressions" title="set of table expressions"/>, and return only one record per unique group as specified in this clause. For instance, you can group books by BOOK.AUTHOR_ID:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT AUTHOR_ID, COUNT(*)
    -FROM BOOK
    -GROUP BY AUTHOR_ID]]></sql><java><![CDATA[create.select(BOOK.AUTHOR_ID, count())
    -      .from(BOOK)
    -      .groupBy(AUTHOR_ID);]]></java></code-pair><html>
    -
    -											<p>
    -												As defined in the SQL standard, when grouping, you may no longer project any columns that are not a formal part of the GROUP BY clause, or <reference id="aggregate-functions" title="aggregate functions"/>. The above example counts all books per author
    -											</p>
    -
    -											<h3>MySQL's deviation from the SQL standard</h3>
    -											<p>
    -												MySQL has a peculiar way of not adhering to this standard behaviour. This is documented in the <a href="http://dev.mysql.com/doc/refman/5.6/en/group-by-hidden-columns.html">MySQL manual</a>. In short, with MySQL, you can also project any other field that are not part of the GROUP BY clause. The projected values will just be arbitrary values from within the group. You cannot rely on any ordering. For example:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT AUTHOR_ID, TITLE
    -FROM BOOK
    -GROUP BY AUTHOR_ID]]></sql><java><![CDATA[create.select(BOOK.AUTHOR_ID, BOOK.TITLE)
    -      .from(BOOK)
    -      .groupBy(AUTHOR_ID);]]></java></code-pair><html>
    -
    -											<p>
    -												This will return an arbitrary title per author. jOOQ supports this syntax, as jOOQ is not doing any checks internally, about the consistence of tables/fields/functions that you provide it.
    -											</p>
    -
    -											<h3>Empty GROUP BY clauses</h3>
    -											<p>
    -												jOOQ supports empty <code>GROUP BY ()</code> clauses as well. This will result in <reference id="select-statement" title="SELECT statements"/> that return only one record.
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT COUNT(*)
    -FROM BOOK
    -GROUP BY ()]]></sql><java><![CDATA[create.selectCount()
    -      .from(BOOK)
    -      .groupBy();]]></java></code-pair><html>
    -
    -											
    -											<h3>ROLLUP(), CUBE() and GROUPING SETS()</h3>
    -											<p>
    -												Some databases support the SQL standard grouping functions and some extensions thereof. See the manual's section about <reference id="grouping-functions" title="grouping functions"/> for more details.
    -											</p>
    -										</html></content>
    -									</section>
    -
    -									<section id="having-clause">
    -										<title>The HAVING clause</title>
    -										<content><html>
    -											<p>
    -												The HAVING clause is commonly used to further restrict data resulting from a previously issued <reference id="group-by-clause" title="GROUP BY clause"/>. An example, selecting only those authors that have written at least two books:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT AUTHOR_ID, COUNT(*)
    -FROM BOOK
    -GROUP BY AUTHOR_ID
    -HAVING COUNT(*) >= 2]]></sql><java><![CDATA[create.select(BOOK.AUTHOR_ID, count(*))
    -      .from(BOOK)
    -      .groupBy(AUTHOR_ID)
    -      .having(count().greaterOrEqual(2));]]></java></code-pair><html>
    -
    -											<p>
    -												According to the SQL standard, you may omit the GROUP BY clause and still issue a HAVING clause. This will implicitly GROUP BY (). jOOQ also supports this syntax. The following example selects one record, only if there are at least 4 books in the books table:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT COUNT(*)
    -FROM BOOK
    -HAVING COUNT(*) >= 4]]></sql><java><![CDATA[create.select(count(*))
    -      .from(BOOK)
    -      .having(count().greaterOrEqual(4));]]></java></code-pair><html>
    -
    -										</html></content>
    -									</section>
    -
    -									<section id="order-by-clause">
    -										<title>The ORDER BY clause</title>
    -										<content><html>
    -											<p>
    -												Databases are allowed to return data in any arbitrary order, unless you explicitly declare that order in the ORDER BY clause. In jOOQ, this is straight-forward:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT AUTHOR_ID, TITLE
    -FROM BOOK
    -ORDER BY AUTHOR_ID ASC, TITLE DESC]]></sql><java><![CDATA[create.select(BOOK.AUTHOR_ID, BOOK.TITLE)
    -      .from(BOOK)
    -      .orderBy(BOOK.AUTHOR_ID.asc(), BOOK.TITLE.desc());]]></java></code-pair><html>
    -
    -											<p>
    -												Any jOOQ <reference id="column-expressions" title="column expression (or field)"/> can be transformed into an <reference class="org.jooq.SortField"/> by calling the asc() and desc() methods.
    -											</p>
    -
    -											<h3>Ordering by field index</h3>
    -											<p>
    -												The SQL standard allows for specifying integer literals (<reference id="inlined-parameters" title="literals"/>, not <reference id="bind-values" title="bind values"/>!) to reference column indexes from the projection (<reference id="select-clause" title="SELECT clause"/>). This may be useful if you do not want to repeat a lengthy expression, by which you want to order - although most databases also allow for referencing <reference id="aliased-columns" title="aliased column references"/> in the ORDER BY clause. An example of this is given here:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT AUTHOR_ID, TITLE
    -FROM BOOK
    -ORDER BY 1 ASC, 2 DESC]]></sql><java><![CDATA[create.select(BOOK.AUTHOR_ID, BOOK.TITLE)
    -      .from(BOOK)
    -      .orderBy(one().asc(), inline(2).desc());]]></java></code-pair><html>
    -
    -											<p>
    -												Note, how one() is used as a convenience short-cut for inline(1)
    -											</p>
    -
    -											<h3>Ordering and NULLS</h3>
    -											<p>
    -												A few databases support the SQL standard "null ordering" clause in sort specification lists, to define whether NULL values should come first or last in an ordered result.
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT 
    -  BOOK.AUTHOR_ID, 
    -  BOOK.CO_AUTHOR_ID, 
    -  BOOK.TITLE
    -FROM BOOK
    -ORDER BY AUTHOR_ID ASC,
    -         CO_AUTHOR_ID ASC NULLS LAST]]></sql><java><![CDATA[create.select(
    -         BOOK.AUTHOR_ID, 
    -         BOOK.CO_AUTHOR_ID, 
    -         BOOK.TITLE)
    -      .from(BOOK)
    -      .orderBy(BOOK.AUTHOR_ID.asc(),
    -               BOOK.CO_AUTHOR_ID.asc().nullsLast());]]></java></code-pair><html>
    -
    -											<p>
    -												If your database doesn't support this syntax, jOOQ simulates it using a <reference id="case-expressions" title="CASE expression"/> as follows
    -											</p>
    -</html><code-pair>
    -<sql><![CDATA[SELECT 
    -  BOOK.AUTHOR_ID, BOOK.CO_AUTHOR_ID, BOOK.TITLE
    -FROM BOOK
    -ORDER BY AUTHOR_ID ASC,
    -         CASE WHEN CO_AUTHOR_ID IS NULL 
    -              THEN 1 ELSE 0 END ASC,
    -         CO_AUTHOR_ID ASC]]></sql><java><![CDATA[create.select(
    -         BOOK.AUTHOR_ID, 
    -         BOOK.CO_AUTHOR_ID,
    -         BOOK.TITLE)
    -      .from(BOOK)
    -      .orderBy(BOOK.AUTHOR_ID.asc(),
    -               BOOK.CO_AUTHOR_ID.asc().nullsLast());]]></java></code-pair><html>
    -
    -											<h3>Ordering using CASE expressions</h3>
    -											<p>
    -												Using <reference id="case-expressions" title="CASE expressions"/> in SQL ORDER BY clauses is a common pattern, if you want to introduce some sort indirection / sort mapping into your queries. As with SQL, you can add any type of <reference id="column-expressions" title="column expression"/> into your ORDER BY clause. For instance, if you have two favourite books that you always want to appear on top, you could write:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT *
    -FROM BOOK
    -ORDER BY CASE TITLE
    -         WHEN '1984' THEN 0
    -         WHEN 'Animal Farm' THEN 1
    -         ELSE 2 END ASC]]></sql><java><![CDATA[create.select()
    -      .from(BOOK)
    -      .orderBy(decode().value(BOOK.TITLE)
    -                       .when("1984", 0)
    -                       .when("Animal Farm", 1)
    -                       .otherwise(2).asc());]]></java></code-pair><html>
    -
    -											<p>
    -												But writing these things can become quite verbose. jOOQ supports a convenient syntax for specifying sort mappings. The same query can be written in jOOQ as such:
    -											</p>
    -
    -</html><java><![CDATA[create.select()
    -      .from(BOOK)
    -      .orderBy(BOOK.TITLE.sortAsc("1984", "Animal Farm"));]]></java><html>
    -
    -											<p>
    -												More complex sort indirections can be provided using a Map:
    -											</p>
    -
    -</html><java><![CDATA[create.select()
    -      .from(BOOK)
    -      .orderBy(BOOK.TITLE.sort(new HashMap<String, Integer>() {{
    -          put("1984", 1);
    -          put("Animal Farm", 13);
    -          put("The jOOQ book", 10);
    -      }}));]]></java><html>
    -
    -      										<p>
    -      											Of course, you can combine this feature with the previously discussed NULLS FIRST / NULLS LAST feature. So, if in fact these two books are the ones you like least, you can put all NULLS FIRST (all the other books):
    -      										</p>
    -
    -</html><java><![CDATA[create.select()
    -      .from(BOOK)
    -      .orderBy(BOOK.TITLE.sortAsc("1984", "Animal Farm").nullsFirst());]]></java><html>
    -
    -											<h3>jOOQ's understanding of SELECT .. ORDER BY</h3>
    -											<p>
    -												The SQL standard defines that a "query expression" can be ordered, and that query expressions can contain <reference id="union-clause" title="UNION, INTERSECT and EXCEPT clauses"/>, whose subqueries cannot be ordered. While this is defined as such in the SQL standard, many databases allowing for the non-standard <reference id="limit-clause" title="LIMIT clause"/> in one way or another, do not adhere to this part of the SQL standard. Hence, jOOQ allows for ordering all SELECT statements, regardless whether they are constructed as a part of a UNION or not. Corner-cases are handled internally by jOOQ, by introducing synthetic subselects to adhere to the correct syntax, where this is needed.
    -											</p>
    -										</html></content>
    -									</section>
    -
    -									<section id="limit-clause">
    -										<title>The LIMIT .. OFFSET clause</title>
    -										<content><html>
    -											<p>
    -												While being extremely useful for every application that does paging, or just to limit result sets to reasonable sizes, this clause is not yet part of any SQL standard (up until SQL:2008). Hence, there exist a variety of possible implementations in various SQL dialects, concerning this limit clause. jOOQ chose to implement the LIMIT .. OFFSET clause as understood and supported by MySQL, H2, HSQLDB, Postgres, and SQLite. Here is an example of how to apply limits with jOOQ:
    -											</p>
    -
    -</html><java><![CDATA[create.select().from(BOOK).limit(1).offset(2);]]></java><html>
    -
    -											<p>
    -												This will limit the result to 1 books starting with the 2nd book (starting at offset 0!). limit() is supported in all dialects, offset() in all but Sybase ASE, which has no reasonable means to simulate it. This is how jOOQ simulates the above query in various SQL dialects:
    -											</p>
    -
    -</html><sql><![CDATA[-- MySQL, H2, HSQLDB, Postgres, and SQLite
    -SELECT * FROM BOOK LIMIT 1 OFFSET 2
    -
    --- CUBRID supports a MySQL variant of the LIMIT .. OFFSET clause
    -SELECT * FROM BOOK LIMIT 2, 1
    -
    --- Derby
    -SELECT * FROM BOOK OFFSET 2 ROWS FETCH NEXT 1 ROWS ONLY
    -
    --- Ingres
    -SELECT * FROM BOOK OFFSET 2 FETCH FIRST 1 ROWS ONLY
    -
    --- Firebird
    -SELECT * FROM BOOK ROWS 2 TO 3
    -
    --- Sybase SQL Anywhere
    -SELECT TOP 1 ROWS START AT 3 * FROM BOOK
    -
    --- DB2 (without OFFSET)
    -SELECT * FROM BOOK FETCH FIRST 1 ROWS ONLY
    -
    --- Sybase ASE, SQL Server (without OFFSET)
    -SELECT TOP 1 * FROM BOOK
    -
    --- DB2 (with OFFSET), SQL Server (with OFFSET), Oracle (actual query may vary)
    -SELECT * FROM (
    -  SELECT LIMIT_98843777.*, ROW_NUMBER() OVER (ORDER BY ID ASC) AS ROWNUM_98843777
    -  FROM (
    -    SELECT TOP 100 PERCENT *
    -    FROM BOOK
    -    ORDER BY ID ASC
    -  ) AS LIMIT_98843777
    -) AS OUTER_LIMIT_98843777
    -WHERE ROWNUM_98843777 > 1
    -AND ROWNUM_98843777 <= 3
    -]]></sql><html>
    -
    -											<p>
    -												As you can see, jOOQ will take care of the incredibly painful ROW_NUMBER() OVER() (or ROWNUM for Oracle) filtering in subselects for you, you'll just have to write limit(1).offset(2) in any dialect.
    -											</p>
    -
    -											<h3>SQL Server's ORDER BY, TOP and subqueries</h3>
    -											<p>
    -												As can be seen in the above example, writing correct SQL can be quite tricky, depending on the SQL dialect. For instance, with SQL Server, you cannot have an ORDER BY clause in a subquery, unless you also have a TOP clause. This is illustrated by the fact that jOOQ renders a TOP 100 PERCENT clause for you. The same applies to the fact that ROW_NUMBER() OVER() needs an ORDER BY windowing clause, even if you don't provide one to the jOOQ query. By default, jOOQ adds ordering by the first column of your projection.
    -											</p>
    -										</html></content>
    -									</section>
    -
    -									<section id="for-update-clause">
    -										<title>The FOR UPDATE clause</title>
    -										<content><html>
    -											<p>
    -												For inter-process synchronisation and other reasons, you may choose to use the SELECT .. FOR UPDATE clause to indicate to the database, that a set of cells or records should be locked by a given transaction for subsequent updates. With jOOQ, this can be achieved as such:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT *
    -FROM BOOK
    -WHERE ID = 3
    -FOR UPDATE]]></sql><java><![CDATA[create.select()
    -      .from(BOOK)
    -      .where(BOOK.ID.equal(3))
    -      .forUpdate();]]></java></code-pair><html>
    -
    -											<p>
    -												The above example will produce a record-lock, locking the whole record for updates. Some databases also support cell-locks using FOR UPDATE OF ..
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT *
    -FROM BOOK
    -WHERE ID = 3
    -FOR UPDATE OF TITLE]]></sql><java><![CDATA[create.select()
    -      .from(BOOK)
    -      .where(BOOK.ID.equal(3))
    -      .forUpdate().of(BOOK.TITLE);]]></java></code-pair><html>
    -
    -											<p>
    -												Oracle goes a bit further and also allows to specify the actual locking behaviour. It features these additional clauses, which are all supported by jOOQ:
    -											</p>
    -											<ul>
    -												<li>FOR UPDATE NOWAIT: This is the default behaviour. If the lock cannot be acquired, the query fails immediately</li>
    -												<li>FOR UPDATE WAIT n: Try to wait for [n] seconds for the lock acquisition. The query will fail only afterwards</li>
    -												<li>FOR UPDATE SKIP LOCKED: This peculiar syntax will skip all locked records. This is particularly useful when implementing queue tables with multiple consumers</li>
    -											</ul>
    -											<p>
    -												With jOOQ, you can use those Oracle extensions as such:
    -											</p>
    -
    -</html><java><![CDATA[create.select().from(BOOK).where(BOOK.ID.equal(3)).forUpdate().nowait();
    -create.select().from(BOOK).where(BOOK.ID.equal(3)).forUpdate().wait(5);
    -create.select().from(BOOK).where(BOOK.ID.equal(3)).forUpdate().skipLocked();]]></java><html>
    -
    -											<h3>FOR UPDATE in CUBRID and SQL Server</h3>
    -											<p>
    -												The SQL standard specifies a FOR UPDATE clause to be applicable for cursors. Most databases interpret this as being applicable for all SELECT statements. An exception to this rule are the CUBRID and SQL Server databases, that do not allow for any FOR UPDATE clause in a regular SQL SELECT statement. jOOQ simulates the FOR UPDATE behaviour, by locking record by record with JDBC. JDBC allows for specifying the flags TYPE_SCROLL_SENSITIVE, CONCUR_UPDATABLE for any statement, and then using ResultSet.updateXXX() methods to produce a cell-lock / row-lock. Here's a simplified example in JDBC:
    -											</p>
    -</html><java><![CDATA[PreparedStatement stmt = connection.prepareStatement(
    -  "SELECT * FROM author WHERE id IN (3, 4, 5)",
    -  ResultSet.TYPE_SCROLL_SENSITIVE,
    -  ResultSet.CONCUR_UPDATABLE);
    -ResultSet rs = stmt.executeQuery();
    -
    -while (rs.next()) {
    -  // UPDATE the primary key for row-locks, or any other columns for cell-locks
    -  rs.updateObject(1, rs.getObject(1));
    -  rs.updateRow();
    -
    -  // Do more stuff with this record
    -}]]></java><html>
    -
    -											<p>
    -												The main drawback of this approach is the fact that the database has to maintain a scrollable cursor, whose records are locked one by one. This can cause a major risk of deadlocks or race conditions if the JDBC driver can recover from the unsuccessful locking, if two Java threads execute the following statements:
    -											</p>
    -
    -</html><sql><![CDATA[-- thread 1
    -SELECT * FROM author ORDER BY id ASC;
    -
    --- thread 2
    -SELECT * FROM author ORDER BY id DESC;]]></sql><html>
    -
    -											<p>
    -												So use this technique with care, possibly only ever locking single rows!
    -											</p>
    -
    -											<h3>Pessimistic (shared) locking with the FOR SHARE clause</h3>
    -											<p>
    -												Some databases (MySQL, Postgres) also allow to issue a non-exclusive lock explicitly using a FOR SHARE clause. This is also supported by jOOQ
    -											</p>
    -
    -											<h3>Optimistic locking in jOOQ</h3>
    -											<p>
    -												Note, that jOOQ also supports optimistic locking, if you're doing simple CRUD. This is documented in the section's manual about <reference id="optimistic-locking" title="optimistic locking"/>.
    -											</p>
    -										</html></content>
    -									</section>
    -
    -									<section id="union-clause">
    -										<title>UNION, INTERSECTION and EXCEPT</title>
    -										<content><html>
    -											<p>
    -												SQL allows to perform set operations as understood in standard set theory on result sets. These operations include unions, intersections, subtractions. For two subselects to be combinable by such a set operator, each subselect must return a <reference id="table-expressions" title="table expression"/> of the same arity and type.
    -											</p>
    -											
    -											<h3>UNION and UNION ALL</h3>
    -											<p>
    -												These operators combine two results into one. While UNION removes all duplicate records resulting from this combination, UNION ALL leaves subselect results as they are. Typically, you should prefer UNION ALL over UNION, if you don't really need to remove duplicates. The following example shows how to use such a UNION operation in jOOQ.
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT * FROM BOOK WHERE ID = 3
    -UNION ALL
    -SELECT * FROM BOOK WHERE ID = 5]]></sql><java><![CDATA[create.selectFrom(BOOK).where(BOOK.ID.equal(3))
    -      .unionAll(
    -create.selectFrom(BOOK).where(BOOK.ID.equal(5)));]]></java></code-pair><html>
    -											
    -											<h3>INTERSECT [ ALL ] and EXCEPT [ ALL ]</h3>
    -											<p>
    -												INTERSECT is the operation that produces only those tuples that are returned by both subselects. EXCEPT is the operation that returns only those tuples that are returned exclusively in the first subselect. Both operators will remove duplicates from their results. The SQL standard allows to specify the ALL keyword for both of these operators as well, but this is hardly supported in any database. jOOQ does not support INTERSECT ALL, EXEPT ALL operations either. 
    -											</p>
    -											
    -											<h3>jOOQ's set operators and how they're different from standard SQL</h3>
    -											<p>
    -												As previously mentioned in the manual's section about the <reference id="order-by-clause" title="ORDER BY clause"/>, jOOQ has slightly changed the semantics of these set operators. While in SQL, a subselect may not contain any <reference id="order-by-clause" title="ORDER BY clause"/> or <reference id="limit-clause" title="LIMIT clause"/> (unless you wrap the subselect into a <reference id="nested-selects" title="nested SELECT"/>), jOOQ allows you to do so. In order to select both the youngest and the oldest author from the database, you can issue the following statement with jOOQ (rendered to the MySQL dialect):
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[  (SELECT * FROM AUTHOR 
    -   ORDER BY DATE_OF_BIRTH ASC LIMIT 1)
    -UNION
    -  (SELECT * FROM AUTHOR 
    -   ORDER BY DATE_OF_BIRTH DESC LIMIT 1)]]></sql><java><![CDATA[create.selectFrom(AUTHOR)
    -      .orderBy(AUTHOR.DATE_OF_BIRTH.asc()).limit(1)
    -      .union(
    -create.selectFrom(AUTHOR)
    -      .orderBy(AUTHOR.DATE_OF_BIRTH.desc()).limit(1));]]></java></code-pair><html>
    -		
    -										</html></content>
    -									</section>
    -
    -									<section id="oracle-hints">
    -										<title>Oracle-style hints</title>
    -										<content><html>
    -											<p>
    -												If you are closely coupling your application to an Oracle (or CUBRID) database,	you might need to be able to pass hints of the form /*+HINT*/ with your SQL statements to the Oracle database. For example:
    -											</p>
    -
    -</html><sql>SELECT /*+ALL_ROWS*/ FIRST_NAME, LAST_NAME
    -  FROM AUTHOR</sql><html>
    -
    -				  							<p>
    -				  								This can be done in jOOQ using the .hint() clause in your SELECT statement:
    -			  								</p>
    -
    -</html><java>create.select(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -      .hint("/*+ALL_ROWS*/")
    -      .from(AUTHOR);</java><html>
    -
    -											<p>
    -												Note that you can pass any string in the .hint() clause. If you use that clause, the passed string will always be put in between the SELECT [DISTINCT] keywords and the actual projection list
    -											</p>
    -										</html></content>
    -									</section>
    -								</sections>
    -							</section>
    -
    -							<section id="insert-statement">
    -								<title>The INSERT statement</title>
    -								<content><html>
    -									<p>
    -										The INSERT statement is used to insert new records into a database table. Records can either be supplied using a VALUES() constructor, or a SELECT statement. jOOQ supports both types of INSERT statements. An example of an INSERT statement using a VALUES() constructor is given here:
    -									</p>
    -
    -
    -</html><code-pair>
    -<sql>INSERT INTO AUTHOR 
    -       (ID, FIRST_NAME, LAST_NAME)
    -VALUES (100, 'Hermann', 'Hesse');</sql><java>create.insertInto(AUTHOR,
    -        AUTHOR.ID, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -      .values(100, "Hermann", "Hesse");</java></code-pair><html>
    -
    -									<h3>INSERT multiple rows with the VALUES() constructor</h3>
    -									<p>
    -										The SQL standard specifies that multiple rows can be supplied to the VALUES() constructor in an INSERT statement. Here's an example of a multi-record INSERT
    -									</p>
    -</html><code-pair>
    -<sql>INSERT INTO AUTHOR
    -       (ID, FIRST_NAME, LAST_NAME)
    -VALUES (100, 'Hermann', 'Hesse'),
    -       (101, 'Alfred', 'Döblin');</sql><java>create.insertInto(AUTHOR,
    -        AUTHOR.ID, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -      .values(100, "Hermann", "Hesse")
    -      .values(101, "Alfred", "Döblin");</java></code-pair><html>
    -
    -									<p>
    -										jOOQ tries to stay close to actual SQL. In detail, however, Java's expressiveness is limited. That's why the values() clause is repeated for every record in multi-record inserts. 
    -									</p>
    -									<p> 
    -										Some RDBMS do not support inserting several records in a single statement. In those cases, jOOQ simulates multi-record INSERTs using the following SQL:
    -									</p>
    -
    -</html><code-pair>
    -<sql>INSERT INTO AUTHOR
    -    (ID, FIRST_NAME, LAST_NAME)
    -SELECT 100, 'Hermann', 'Hesse' FROM DUAL UNION ALL
    -SELECT 101, 'Alfred', 'Döblin' FROM DUAL;</sql><java>create.insertInto(AUTHOR,
    -        AUTHOR.ID, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -      .values(100, "Hermann", "Hesse")
    -      .values(101, "Alfred", "Döblin");
    -</java></code-pair><html>
    -
    -									<h3>INSERT using jOOQ's alternative syntax</h3>
    -									<p>
    -										MySQL (and some other RDBMS) allow for using a non-SQL-standard, UPDATE-like syntax for INSERT statements. This is also supported in jOOQ, should you prefer that syntax. The above INSERT statement can also be expressed as follows:
    -									</p>
    -
    -</html><java>create.insertInto(AUTHOR)
    -      .set(AUTHOR.ID, 100)
    -      .set(AUTHOR.FIRST_NAME, "Hermann")
    -      .set(AUTHOR.LAST_NAME, "Hesse")
    -      .newRecord()
    -      .set(AUTHOR.ID, 101)
    -      .set(AUTHOR.FIRST_NAME, "Alfred")
    -      .set(AUTHOR.LAST_NAME, "Döblin");</java><html>
    -      
    -									<p>
    -										As you can see, this syntax is a bit more verbose, but also more type-safe, as every field can be matched with its value. Internally, the two syntaxes are strictly equivalent.
    -									</p>
    -
    -									<h3>MySQL's INSERT .. ON DUPLICATE KEY UPDATE</h3>
    -									<p>
    -										The MySQL database supports a very convenient way to INSERT or UPDATE a record. This is a non-standard extension to the SQL syntax, which is supported by jOOQ and simulated in other RDBMS, where this is possible (i.e. if they support the SQL standard <reference id="merge-statement" title="MERGE statement"/>). Here is an example how to use the ON DUPLICATE KEY UPDATE clause:
    -									</p>
    -									
    -</html><java>// Add a new author called "Koontz" with ID 3.
    -// If that ID is already present, update the author's name
    -create.insertInto(AUTHOR, AUTHOR.ID, AUTHOR.LAST_NAME)
    -      .values(3, "Koontz")
    -      .onDuplicateKeyUpdate()
    -      .set(AUTHOR.LAST_NAME, "Koontz");</java><html>
    -
    -									<h3>The synthetic ON DUPLICATE KEY IGNORE clause</h3>
    -							
    -									<p>
    -										The MySQL database also supports an INSERT IGNORE INTO clause. This is supported by jOOQ using the more convenient SQL syntax variant of ON DUPLICATE KEY IGNORE, which can be equally simulated in other databases using a <reference id="merge-statement" title="MERGE statement"/>:
    -									</p>
    -									
    -</html><java>// Add a new author called "Koontz" with ID 3.
    -// If that ID is already present, ignore the INSERT statement
    -create.insertInto(AUTHOR, AUTHOR.ID, AUTHOR.LAST_NAME)
    -      .values(3, "Koontz")
    -      .onDuplicateKeyIgnore();</java><html>
    -
    -      								<h3>Postgres's INSERT .. RETURNING</h3>
    -									<p>
    -										The Postgres database has native support for an INSERT .. RETURNING clause. This is a very powerful concept that is simulated for all other dialects using JDBC's <reference class="java.sql.Statement" anchor="#getGeneratedKeys()" title="getGeneratedKeys()"/> method. Take this example:
    -									</p>
    -
    -</html><java><![CDATA[// Add another author, with a generated ID
    -Record<?> record =
    -create.insertInto(AUTHOR, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -      .values("Charlotte", "Roche")
    -      .returning(AUTHOR.ID)
    -      .fetchOne();
    -
    -System.out.println(record.getValue(AUTHOR.ID));
    -
    -// For some RDBMS, this also works when inserting several values
    -// The following should return a 2x2 table
    -Result<?> result =
    -create.insertInto(AUTHOR, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -      .values("Johann Wolfgang", "von Goethe")
    -      .values("Friedrich", "Schiller")
    -      // You can request any field. Also trigger-generated values
    -      .returning(AUTHOR.ID, AUTHOR.CREATION_DATE)
    -      .fetch();]]></java><html>
    -
    -		      						<p>
    -		      							Some databases have poor support for returning generated keys after INSERTs. In those cases, jOOQ might need to issue another <reference id="select-statement" title="SELECT statement"/> in order to fetch an @@identity value. Be aware, that this can lead to race-conditions in those databases that cannot properly return generated ID values. For more information, please consider the jOOQ Javadoc for the returning() clause.
    -		      						</p>
    -
    -									<h3>The INSERT SELECT statement</h3>
    -							
    -									<p>
    -										In some occasions, you may prefer the INSERT SELECT syntax, for instance, when you copy records from one table to another:
    -									</p>
    -									
    -</html><java>create.insertInto(AUTHOR_ARCHIVE)
    -      .select(create.selectFrom(AUTHOR).where(AUTHOR.DECEASED.isTrue()));</java></content>
    -							</section>
    -
    -							<section id="update-statement">
    -								<title>The UPDATE statement</title>
    -								<content><html>
    -									<p>
    -										The UPDATE statement is used to modify one or several pre-existing records in a database table. UPDATE statements are only possible on single tables. Support for multi-table updates will be implemented in the near future. An example update query is given here:
    -									</p>
    -
    -</html><code-pair>
    -<sql>UPDATE AUTHOR
    -   SET FIRST_NAME = 'Hermann',
    -       LAST_NAME = 'Hesse'
    - WHERE ID = 3;</sql><java>create.update(AUTHOR)
    -      .set(AUTHOR.FIRST_NAME, "Hermann")
    -      .set(AUTHOR.LAST_NAME, "Hesse")
    -      .where(AUTHOR.ID.equal(3));</java>
    -</code-pair><html>
    -								
    -								</html></content>
    -							</section>
    -
    -							<section id="delete-statement">
    -								<title>The DELETE statement</title>
    -								<content><html>
    -									<p>
    -										The DELETE statement physically removes records from a database table. DELETE statements are only possible on single tables. Support for multi-table deletes will be implemented in the near future. An example delete query is given here:
    -									</p>
    -
    -</html><code-pair>
    -<sql>DELETE AUTHOR
    - WHERE ID = 100;</sql><java>create.delete(AUTHOR)
    -      .where(AUTHOR.ID.equal(100));</java>
    -</code-pair><html>
    -
    -								</html></content>
    -							</section>
    -
    -							<section id="merge-statement">
    -								<title>The MERGE statement</title>
    -								<content><html>
    -									<p>
    -										The MERGE statement is one of the most advanced standardised SQL constructs, which is supported by DB2, HSQLDB, Oracle, SQL Server and Sybase (MySQL has the similar INSERT .. ON DUPLICATE KEY UPDATE construct)
    -									</p>
    -									<p>
    -										The point of the standard MERGE statement is to take a TARGET table, and merge (INSERT, UPDATE) data from a SOURCE table into it. DB2, Oracle, SQL Server and Sybase also allow for DELETING some data and for adding many additional clauses. With jOOQ {jooq-version}, only Oracle's MERGE extensions are supported. Here is an example:
    -									</p>
    -
    -</html><code-pair>
    -<sql>-- Check if there is already an author called 'Hitchcock'
    --- If there is, rename him to John. If there isn't add him.
    -MERGE INTO AUTHOR
    -USING (SELECT 1 FROM DUAL)
    -ON (LAST_NAME = 'Hitchcock')
    -WHEN MATCHED THEN UPDATE SET FIRST_NAME = 'John'
    -WHEN NOT MATCHED THEN INSERT (LAST_NAME) VALUES ('Hitchcock')</sql><java>create.mergeInto(AUTHOR)
    -      .using(create().selectOne())
    -      .on(AUTHOR.LAST_NAME.equal("Hitchcock"))
    -      .whenMatchedThenUpdate()
    -      .set(AUTHOR.FIRST_NAME, "John")
    -      .whenNotMatchedThenInsert(AUTHOR.LAST_NAME)
    -      .values("Hitchcock");
    -
    -</java></code-pair><html>
    -
    -		                            <h3>MERGE Statement (H2-specific syntax)</h3>
    -									<p>
    -									    The H2 database ships with a somewhat less powerful but a little more intuitive syntax for its own version of the MERGE statement. An example more or less equivalent to the previous one can be seen here:
    -									</p>
    -									
    -</html><code-pair>
    -<sql>-- Check if there is already an author called 'Hitchcock'
    --- If there is, rename him to John. If there isn't add him.
    -
    -MERGE INTO AUTHOR (FIRST_NAME, LAST_NAME)
    -KEY (LAST_NAME)
    -VALUES ('John', 'Hitchcock')</sql><java>create.mergeInto(AUTHOR,
    -                 AUTHOR.FIRST_NAME,
    -                 AUTHOR.LAST_NAME)
    -      .key(AUTHOR.LAST_NAME)
    -      .values("John", "Hitchcock")
    -      .execute();
    -</java></code-pair><html>
    -
    -		                            <p>
    -		                                This syntax can be fully simulated by jOOQ for all other databases that support the SQL standard. For more information about the H2 MERGE syntax, see the documentation here:<br/>
    -		                                <a href="http://www.h2database.com/html/grammar.html#merge">http://www.h2database.com/html/grammar.html#merge</a>
    -		                            </p>
    -								
    -								</html></content>
    -							</section>
    -
    -							<section id="truncate-statement">
    -								<title>The TRUNCATE statement</title>
    -								<content><html>
    -									<p>
    -										The TRUNCATE statement is the only DDL statement supported by jOOQ so far. It is popular in many databases when you want to bypass constraints for table truncation. Databases may behave differently, when a truncated table is referenced by other tables. For instance, they may fail if records from a truncated table are referenced, even with ON DELETE CASCADE clauses in place. Please, consider your database manual to learn more about its TRUNCATE implementation.
    -									</p>
    -									<p>
    -										The TRUNCATE syntax is trivial:
    -									</p>
    -
    -</html><code-pair>
    -	<sql>TRUNCATE TABLE AUTHOR;</sql><java>create.truncate(AUTHOR).execute();</java>
    -</code-pair><html>
    -									
    -									<p>
    -										TRUNCATE is not supported by Ingres and SQLite. jOOQ will execute a DELETE FROM AUTHOR statement instead.
    -									</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -					<section id="table-expressions">
    -						<title>Table expressions</title>
    -						<content><html>
    -							<p>
    -								The following sections explain the various types of table expressions supported by jOOQ
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="generated-tables">
    -								<title>Generated Tables</title>
    -								<content><html>
    -									<p>
    -										Most of the times, when thinking about a <reference id="table-expressions" title="table expression"/> you're probably thinking about an actual physical table in your database schema. If you're using jOOQ's <reference id="code-generation" title="code generator"/>, you will have all tables from your database schema available to you as type safe Java objects. You can then use these tables in SQL <reference id="from-clause" title="FROM clauses"/>, <reference id="join-clause" title="JOIN clauses"/> or in other <reference id="sql-statements" title="SQL statements"/>, just like any other table expression. An example is given here:
    -									</p>
    -							
    -</html><code-pair>
    -<sql><![CDATA[SELECT *
    -FROM AUTHOR -- Table expression AUTHOR
    -JOIN BOOK   -- Table expression BOOK
    -ON (AUTHOR.ID = BOOK.AUTHOR_ID)]]></sql><java><![CDATA[create.select()
    -      .from(AUTHOR) // Table expression AUTHOR
    -      .join(BOOK)   // Table expression BOOK
    -      .on(AUTHOR.ID.equal(BOOK.AUTHOR_ID));]]></java></code-pair><html>
    -							
    -									<p>
    -										The above example shows how AUTHOR and BOOK tables are joined in a <reference id="select-statement" title="SELECT statement"/>. It also shows how you can access physical <reference id="table-columns" title="table columns"/> by dereferencing the relevant Java attributes of their tables.
    -									</p>
    -									<p>
    -										See the manual's section about <reference id="codegen-tables" title="generated tables"/> for more information about what is really generated by the <reference id="code-generation" title="code generator"/>
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="aliased-tables">
    -								<title>Aliased Tables</title>
    -								<content><html>
    -									<p>
    -										The strength of jOOQ's <reference id="code-generation" title="code generator"/> becomes more obvious when you perform table aliasing and dereference fields from generated aliased tables. This can best be shown by example:
    -									</p>
    -
    -</html><code-pair><sql><![CDATA[-- Select all books by authors born after 1920,
    --- named "Paulo" from a catalogue:
    -
    -
    -
    -SELECT *
    -  FROM author a
    -  JOIN book b ON a.id = b.author_id
    - WHERE a.year_of_birth > 1920
    -   AND a.first_name = 'Paulo'
    - ORDER BY b.title]]></sql><java><![CDATA[// Declare your aliases before using them in SQL:
    -Author a = AUTHOR.as("a");
    -Book b = BOOK.as("b");
    -
    -// Use aliased tables in your statement
    -create.select()
    -      .from(a)
    -      .join(b).on(a.ID.equal(b.AUTHOR_ID))
    -      .where(a.YEAR_OF_BIRTH.greaterThan(1920)
    -      .and(a.FIRST_NAME.equal("Paulo")))
    -      .orderBy(b.TITLE);]]></java></code-pair><html>
    -								
    -									<p>
    -										As you can see in the above example, calling as() on generated tables returns an object of the same type as the table. This means that the resulting object can be used to dereference fields from the aliased table. This is quite powerful in terms of having your Java compiler check the syntax of your SQL statements. If you remove a column from a table, dereferencing that column from that table alias will cause compilation errors.
    -									</p>
    -									
    -									<h3>Dereferencing columns from other table expressions</h3>
    -									<p>
    -										TODO document this
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="joined-tables">
    -								<title>Joined tables</title>
    -								<content><html>
    -									<p>
    -										The <reference id="join-clause" title="JOIN operators"/> that can be used in <reference id="select-statement" title="SQL SELECT statements"/> are the most powerful and best supported means of creating new <reference id="table-expressions" title="table expressions"/> in SQL. Informally, the following can be said:
    -									</p>
    -									
    -</html><text>A(colA1, ..., colAn) "join" B(colB1, ..., colBm) "produces" C(colA1, ..., colAn, colB1, ..., colBm)</text><html>
    -
    -									<p>
    -										SQL and relational algebra distinguish between at least the following JOIN types (upper-case: SQL, lower-case: relational algebra):
    -									</p>
    -									<ul>
    -										<li><strong>CROSS JOIN or cartesian product</strong>: The basic JOIN in SQL, producing a relational cross product, combining every record of table A with every record of table B. Note that cartesian products can also be produced by listing comma-separated <reference id="table-expressions" title="table expressions"/> in the <reference id="from-clause" title="FROM clause"/> of a <reference id="select-statement" title="SELECT statement"/></li>
    -										<li><strong>NATURAL JOIN</strong>: The basic JOIN in relational algebra, yet a rarely used JOIN in databases with everyday degree of normalisation. This JOIN type unconditionally equi-joins two tables by all columns with the same name (requiring foreign keys and primary keys to share the same name). Note that the JOIN columns will only figure once in the resulting <reference id="table-expressions" title="table expression"/>.</li>
    -										<li><strong>INNER JOIN or equi-join</strong>: This JOIN operation performs a cartesian product (CROSS JOIN) with a <reference id="conditional-expressions" title="filtering predicate"/> being applied to the resulting <reference id="table-expressions" title="table expression"/>. Most often, a <reference id="comparison-predicate" title="equal comparison predicate"/> comparing foreign keys and primary keys will be applied as a filter, but any other predicate will work, too.</li>
    -										<li><strong>OUTER JOIN</strong>: This JOIN operation performs a cartesian product (CROSS JOIN) with a <reference id="conditional-expressions" title="filtering predicate"/> being applied to the resulting <reference id="table-expressions" title="table expression"/>. Most often, a <reference id="comparison-predicate" title="equal comparison predicate"/> comparing foreign keys and primary keys will be applied as a filter, but any other predicate will work, too. Unlike the INNER JOIN, an OUTER JOIN will add "empty records" to the left (table A) or right (table B) or both tables, in case the conditional expression fails to produce a tuple.</li>										
    -										<li><strong>semi-join</strong>: In SQL, this JOIN operation can only be expressed implicitly using <reference id="in-predicate" title="IN predicates"/> or <reference id="exists-predicate" title="EXISTS predicates"/>. The <reference id="table-expressions" title="table expression"/> resulting from a semi-join will only contain the left-hand side table A</li>										
    -										<li><strong>anti-join</strong>: In SQL, this JOIN operation can only be expressed implicitly using <reference id="in-predicate" title="NOT IN predicates"/> or <reference id="exists-predicate" title="NOT EXISTS predicates"/>. The <reference id="table-expressions" title="table expression"/> resulting from a semi-join will only contain the left-hand side table A</li>
    -										<li><strong>division</strong>: This JOIN operation is hard to express at all, in SQL. See the manual's chapter about <reference id="relational-division" title="relational division"/> for details on how jOOQ simulates this operation.</li>
    -									</ul>									
    -									<p>
    -										jOOQ supports all of these JOIN types (except semi-join and anti-join) directly on any <reference id="table-expressions" title="table expression"/>:
    -									</p>
    -									
    -</html><java><![CDATA[// jOOQ's relational division convenience syntax 
    -DivideByOnStep divideBy(Table<?> table)
    -
    -// Various overloaded INNER JOINs
    -TableOnStep join(TableLike<?>)
    -TableOnStep join(String)
    -TableOnStep join(String, Object...)
    -TableOnStep join(String, QueryPart...)
    -
    -// Various overloaded OUTER JOINs (supporting Oracle's partitioned OUTER JOIN)
    -// Overloading is similar to that of INNER JOIN
    -TablePartitionByStep leftOuterJoin(TableLike<?>)
    -TablePartitionByStep rightOuterJoin(TableLike<?>)
    -
    -// Various overloaded FULL OUTER JOINs
    -TableOnStep fullOuterJoin(TableLike<?>)
    -
    -// Various overloaded CROSS JOINs
    -Table<Record> crossJoin(TableLike<?>)
    -
    -// Various overloaded NATURAL JOINs
    -Table<Record> naturalJoin(TableLike<?>)
    -Table<Record> naturalLeftOuterJoin(TableLike<?>)
    -Table<Record> naturalRightOuterJoin(TableLike<?>)]]></java><html>							
    -
    -									<p>
    -										Note that most of jOOQ's JOIN operations give way to a similar DSL API hierarchy as previously seen in the manual's section about the <reference id="join-clause" title="JOIN clause"/>
    -									</p>		
    -								</html></content>
    -							</section>
    -
    -							<section id="nested-selects">
    -								<title>Nested SELECTs</title>
    -								<content><html>
    -									<p>
    -										A <reference id="select-statement" title="SELECT statement"/> can appear almost anywhere a <reference id="table-expressions" title="table expression"/> can. Such a "nested SELECT" is often called a "derived table". Apart from many convenience methods accepting <reference class="org.jooq.Select"/> objects directly, a SELECT statement can always be transformed into a <reference class="org.jooq.Table"/> object using the asTable() method.
    -									</p>
    -									
    -									<h3>Example: Scalar subquery</h3>
    -									
    -</html><code-pair>
    -<sql>SELECT *
    -  FROM BOOK
    - WHERE BOOK.AUTHOR_ID = (
    - 		SELECT ID
    -          FROM AUTHOR
    -         WHERE LAST_NAME = 'Orwell')</sql><java>create.select()
    -      .from(BOOK)
    -      .where(BOOK.AUTHOR_ID.equal(create
    -             .select(AUTHOR.ID)
    -             .from(AUTHOR)
    -             .where(AUTHOR.LAST_NAME.equal("Orwell"))));</java>
    -</code-pair><html>
    -
    -									<h3>Example: Derived table</h3>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT nested.* FROM (
    -      SELECT AUTHOR_ID, count(*) books
    -        FROM BOOK
    -    GROUP BY AUTHOR_ID
    -) nested
    -ORDER BY nested.books DESC
    -
    -
    -
    -]]></sql><java><![CDATA[Table<Record> nested =
    -    create.select(BOOK.AUTHOR_ID, count().as("books"))
    -          .from(BOOK)
    -          .groupBy(BOOK.AUTHOR_ID).asTable("nested");
    -
    -create.select(nested.getFields())
    -      .from(nested)
    -      .orderBy(nested.getField("books"));]]></java>
    -</code-pair><html>
    -
    -									<h3>Example: Correlated subquery</h3>
    -</html><code-pair>
    -<sql><![CDATA[  SELECT LAST_NAME, (
    -      SELECT COUNT(*)
    -       FROM BOOK
    -      WHERE BOOK.AUTHOR_ID = AUTHOR.ID) books
    -    FROM AUTHOR
    -ORDER BY books DESC
    -
    -
    -
    -]]></sql><java><![CDATA[// The type of books cannot be inferred from the Select<?>
    -Field<Object> books =
    -    create.selectCount()
    -          .from(BOOK)
    -          .where(BOOK.AUTHOR_ID.equal(AUTHOR.ID))
    -          .asField("books");
    -create.select(AUTHOR.ID, books)
    -      .from(AUTHOR)
    -      .orderBy(books, AUTHOR.ID));]]></java>
    -</code-pair><html>									
    -								</html></content>
    -							</section>
    -
    -							<section id="pivot-tables">
    -								<title>The Oracle 11g PIVOT clause</title>
    -								<content><html>
    -									<p>
    -										If you are closely coupling your application to an Oracle database, you can take advantage of some Oracle-specific features, such as the PIVOT clause, used for statistical analyses. The formal syntax definition is as follows:
    -									</p>
    -									
    -</html><sql>-- SELECT ..
    -     FROM table PIVOT (aggregateFunction [, aggregateFunction] FOR column IN (expression [, expression]))
    ---  WHERE ..</sql><html>
    -		
    -									<p>
    -										The PIVOT clause is available from the <reference class="org.jooq.Table"/> type, as pivoting is done directly on a table. Currently, only Oracle's PIVOT clause is supported. Support for SQL Server's slightly different PIVOT clause will be added later. Also, jOOQ may simulate PIVOT for other dialects in the future.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="relational-division">
    -								<title>jOOQ's relational division syntax</title>
    -								<content><html>
    -									<p>
    -									    There is one operation in relational algebra that is not given a lot of attention, because it is rarely used in real-world applications. It is the relational division, the opposite operation of the cross product (or, relational multiplication). The following is an approximate definition of a relational division:
    -									</p>
    -
    -</html><config>Assume the following cross join / cartesian product
    -C = A × B
    -
    -Then it can be said that
    -A = C ÷ B
    -B = C ÷ A</config><html>
    -
    -									<p>
    -									   With jOOQ, you can simplify using relational divisions by using the following syntax:
    -									</p>
    -
    -</html><java>C.divideBy(B).on(C.ID.equal(B.C_ID)).returning(C.TEXT)</java><html>
    -
    -									<p>
    -										The above roughly translates to
    -									</p>
    -
    -</html><sql>SELECT DISTINCT C.TEXT FROM C "c1"
    -WHERE NOT EXISTS (
    -  SELECT 1 FROM B
    -  WHERE NOT EXISTS (
    -    SELECT 1 FROM C "c2"
    -    WHERE "c2".TEXT = "c1".TEXT
    -    AND "c2".ID = B.C_ID
    -  )
    -)</sql><html>
    -
    -									<p>
    -										Or in plain text: Find those TEXT values in C whose ID's correspond to all ID's in B. Note that from the above SQL statement, it is immediately clear that proper indexing is of the essence. Be sure to have indexes on all columns referenced from the on(...) and returning(...) clauses.
    -									</p>
    -
    -									<p>
    -										For more information about relational division and some nice, real-life examples, see
    -									</p>
    -
    -									<ul>
    -										<li><a href="http://en.wikipedia.org/wiki/Relational_algebra#Division" title="Wikipedia article on relational division">http://en.wikipedia.org/wiki/Relational_algebra#Division</a></li>
    -										<li><a href="http://www.simple-talk.com/sql/t-sql-programming/divided-we-stand-the-sql-of-relational-division/" title="A nice summary of what relational division is and how it is best implemented in SQL">http://www.simple-talk.com/sql/t-sql-programming/divided-we-stand-the-sql-of-relational-division/</a></li>
    -									</ul>
    -								</html></content>
    -
    -							</section>
    -
    -							<section id="array-and-cursor-unnesting">
    -								<title>Array and cursor unnesting</title>
    -								<content><html>
    -									<p>
    -										The SQL standard specifies how SQL databases should implement ARRAY and TABLE types, as well as CURSOR types. Put simply, a CURSOR is a pointer to any materialised <reference id="table-expressions" title="table expression"/>. Depending on the cursor's features, this table expression can be scrolled through in both directions, records can be locked, updated, removed, inserted, etc. Often, CURSOR types contain tuples, whereas ARRAY and TABLE types contain simple scalar values, although that is not a requirement
    -									</p>
    -									
    -									<p>
    -										ARRAY types in SQL are similar to Java's array types. They contain a "component type" or "element type" and a "dimension". This sort of ARRAY type is implemented in H2, HSQLDB and Postgres and supported by jOOQ as such. Oracle uses strongly-typed arrays, which means that an ARRAY type (VARRAY or TABLE type) has a name and possibly a maximum capacity associated with it.
    -									</p>
    -
    -									<h3>Unnesting array and cursor types</h3>									
    -									<p>
    -										The real power of these types become more obvious when you fetch them from <reference id="stored-procedures" title="stored procedures"/> to unnest them as <reference id="table-expressions" title="table expressions"/> and use them in your <reference id="from-clause" title="FROM clause"/>. An example is given here, where Oracle's DBMS_XPLAN package is used to fetch a cursor containing data about the most recent execution plan:
    -									</p>									
    -
    -</html><code-pair>
    -	<sql><![CDATA[SELECT *
    -FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(null, null, 'ALLSTATS'));]]></sql><java><![CDATA[create.select()
    -      .from(table(DbmsXplan.displayCursor(null, null, "ALLSTATS"));]]></java>
    -</code-pair><html>
    -									<p>
    -										Note, in order to access the DbmsXplan package, you can use the <reference id="code-generation" title="code generator"/> to generate Oracle's SYS schema.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="dual">
    -								<title>The DUAL table</title>
    -								<content><html>
    -									<p>
    -										The SQL standard specifies that the <reference id="from-clause" title="FROM clause"/> is optional in a <reference id="select-statement" title="SELECT statement"/>. However, according to the standard, you may then no longer use some other clauses, such as the <reference id="where-clause" title="WHERE clause"/>. In the real world, there exist three types of databases:
    -									</p>
    -									<ul>
    -										<li>The ones that always require a FROM clause</li>
    -										<li>The ones that never require a FROM clause (and still allow a WHERE clause)</li>
    -										<li>The ones that correctly implement the SQL standard</li>
    -									</ul>
    -									<p>
    -										With jOOQ, you don't have to worry about the above distinction of SQL dialects. jOOQ never requires a FROM clause, but renders the necessary "DUAL" table, if needed. The following program shows how jOOQ renders "DUAL" tables
    -									</p>
    -
    -</html><code-pair>
    -	<sql><![CDATA[SELECT 1
    -SELECT 1 FROM "db_root"
    -SELECT 1 FROM "SYSIBM"."DUAL"
    -SELECT 1 FROM "SYSIBM"."SYSDUMMY1"
    -SELECT 1 FROM dual
    -SELECT 1 FROM "INFORMATION_SCHEMA"."SYSTEM_USERS"
    -SELECT 1 FROM (select 1 as dual) as dual
    -SELECT 1 FROM dual
    -SELECT 1 FROM dual
    -SELECT 1
    -SELECT 1
    -SELECT 1
    -SELECT 1 FROM [SYS].[DUMMY]
    -]]></sql><java><![CDATA[new Factory(SQLDialect.ASE      ).selectOne().getSQL();
    -new Factory(SQLDialect.CUBRID   ).selectOne().getSQL();
    -new Factory(SQLDialect.DB2      ).selectOne().getSQL();
    -new Factory(SQLDialect.DERBY    ).selectOne().getSQL();
    -new Factory(SQLDialect.H2       ).selectOne().getSQL();
    -new Factory(SQLDialect.HSQLDB   ).selectOne().getSQL();
    -new Factory(SQLDialect.INGRES   ).selectOne().getSQL();
    -new Factory(SQLDialect.MYSQL    ).selectOne().getSQL();
    -new Factory(SQLDialect.ORACLE   ).selectOne().getSQL();
    -new Factory(SQLDialect.POSTGRES ).selectOne().getSQL();
    -new Factory(SQLDialect.SQLITE   ).selectOne().getSQL();
    -new Factory(SQLDialect.SQLSERVER).selectOne().getSQL();
    -new Factory(SQLDialect.SYBASE   ).selectOne().getSQL();]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										Note, that some databases (H2, MySQL) can normally do without "dual". However, there exist some corner-cases with complex nested SELECT statements, where this will cause syntax errors (or parser bugs). To stay on the safe side, jOOQ will always render "dual" in those dialects.
    -									</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -					<section id="column-expressions">
    -						<title>Column expressions</title>
    -						<content><html>
    -							<p>
    -								jOOQ allows you to freely create arbitrary column expressions using a fluent expression construction API. Many expressions can be formed as functions from <reference id="factory" title="Factory methods"/>, other expressions can be formed based on a pre-existing column expression. For example:
    -							</p>
    -							
    -</html><java><![CDATA[// A regular table column expression
    -Field<String> field1 = BOOK.TITLE;
    -
    -// A function created from the Factory using "prefix" notation
    -Field<String> field2 = trim(BOOK.TITLE);
    -
    -// The same function created from a pre-existing Field using "postfix" notation
    -Field<String> field3 = BOOK.TITLE.trim();
    -
    -// More complex function with advanced DSL syntax
    -Field<String> field4 = listAgg(BOOK.TITLE)
    -                          .withinGroupOrderBy(BOOK.ID.asc())
    -                          .over().partitionBy(AUTHOR.ID);]]></java><html>
    -
    -							<p>
    -								In general, it is up to you whether you want to use the "prefix" notation or the "postfix" notation to create new column expressions based on existing ones. The "SQL way" would be to use the "prefix notation", with functions created from the <reference id="factory" title="Factory"/>. The "Java way" or "object-oriented way" would be to use the "postfix" notation with functions created from <reference class="org.jooq.Field"/> objects. Both ways ultimately create the same query part, though.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="table-columns">
    -								<title>Table columns</title>
    -								<content><html>
    -									<p>
    -										Table columns are the most simple implementations of a <reference id="column-expressions" title="column expression"/>. They are mainly produced by jOOQ's <reference id="code-generation" title="code generator"/> and can be dereferenced from the generated tables. This manual is full of examples involving table columns. Another example is given in this query:
    -									</p>
    -
    -</html><code-pair>
    -	<sql><![CDATA[SELECT BOOK.ID, BOOK.TITLE
    -FROM BOOK
    -WHERE BOOK.TITLE LIKE '%SQL%'
    -ORDER BY BOOK.TITLE]]></sql><java><![CDATA[create.select(BOOK.ID, BOOK.TITLE)
    -	  .from(BOOK)
    -	  .where(BOOK.TITLE.like("%SQL%"))
    -	  .orderBy(BOOK.TITLE);]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										Table columns implement a more specific interface called <reference class="org.jooq.TableField"/>, which is parameterised with its associated &lt;R extends Record&gt; record type.
    -									</p>
    -									<p>
    -										See the manual's section about <reference id="codegen-tables" title="generated tables"/> for more information about what is really generated by the <reference id="code-generation" title="code generator"/>
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="aliased-columns">
    -								<title>Aliased columns</title>
    -								<content><html>
    -									<p>
    -										Just like <reference id="aliased-tables" title="tables"/>, columns can be renamed using aliases. Here is an example:
    -									</p>
    -									
    -</html><sql>  SELECT FIRST_NAME || ' ' || LAST_NAME author, COUNT(*) books
    -    FROM AUTHOR
    -    JOIN BOOK ON AUTHOR.ID = AUTHOR_ID
    -GROUP BY FIRST_NAME, LAST_NAME;</sql><html>
    -
    -									<p>
    -										Here is how it's done with jOOQ:
    -									</p>
    -									
    -</html><java>Record record = create.select(
    -         concat(AUTHOR.FIRST_NAME, val(" "), AUTHOR.LAST_NAME).as("author"),
    -         count().as("books"))
    -      .from(AUTHOR)
    -      .join(BOOK).on(AUTHOR.ID.equal(BOOK.AUTHOR_ID))
    -      .groupBy(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME).fetchAny();</java><html>
    -      
    -      								<p>
    -      									When you alias Fields like above, you can access those Fields' values using the alias name:
    -  									</p>
    -  									
    -</html><java>System.out.println("Author : " + record.getValue("author"));
    -System.out.println("Books  : " + record.getValue("books"));</java></content>
    -							</section>
    -
    -							<section id="cast-expressions">
    -								<title>Cast expressions</title>
    -								<content><html>
    -									<p>
    -										jOOQ's source code generator tries to find the most accurate type mapping between your vendor-specific data types and a matching Java type. For instance, most VARCHAR, CHAR, CLOB types will map to String. Most BINARY, BYTEA, BLOB types will map to byte[]. NUMERIC types will default to java.math.BigDecimal, but can also be any of java.math.BigInteger, Long, Integer, Short, Byte, Double, Float.
    -									</p>
    -									<p>
    -										Sometimes, this automatic mapping might not be what you needed, or jOOQ cannot know the type of a field. In those cases you would write SQL type CASTs like this:
    -									</p>
    -									
    -</html><sql>-- Let's say, your Postgres column LAST_NAME was VARCHAR(30)
    --- Then you could do this:
    -SELECT CAST(AUTHOR.LAST_NAME AS TEXT) FROM DUAL</sql><html>
    -
    -									<p>
    -										in jOOQ, you can write something like that:
    -									</p>
    -									
    -</html><java>create.select(TAuthor.LAST_NAME.cast(PostgresDataType.TEXT));</java><html>
    -
    -									<p>
    -										The same thing can be achieved by casting a Field directly to String.class, as TEXT is the default data type in Postgres to map to Java's String
    -									</p>
    -									
    -</html><java>create.select(TAuthor.LAST_NAME.cast(String.class));</java><html>
    -		
    -									<p>
    -										The complete CAST API in Field consists of these three methods:
    -									</p>
    -									
    -</html><java><![CDATA[public interface Field<T> {
    -
    -    // Cast this field to the type of another field
    -    <Z> Field<Z> cast(Field<Z> field);
    -    
    -    // Cast this field to a given DataType
    -    <Z> Field<Z> cast(DataType<Z> type);
    -    
    -    // Cast this field to the default DataType for a given Class
    -    <Z> Field<Z> cast(Class<? extends Z> type);
    -}
    -
    -// And additional convenience methods in the Factory:
    -public class Factory {
    -    <T> Field<T> cast(Object object, Field<T> field);
    -    <T> Field<T> cast(Object object, DataType<T> type);
    -    <T> Field<T> cast(Object object, Class<? extends T> type);
    -    <T> Field<T> castNull(Field<T> field);
    -    <T> Field<T> castNull(DataType<T> type);
    -    <T> Field<T> castNull(Class<? extends T> type);
    -}]]></java></content>
    -							</section>
    -
    -							<section id="arithmetic-expressions">
    -								<title>Arithmetic expressions</title>
    -								<content><html>
    -									<h3>Numeric arithmetic expressions</h3>
    -									<p>
    -										Your database can do the math for you. Arithmetic operations are implemented just like <reference id="numeric-functions" title="numeric functions"/>, with similar limitations as far as type restrictions are concerned. You can use any of these operators:
    -									</p>
    -
    -</html><config>  +  -  *  /  %</config><html>
    -
    -									<p>
    -										In order to express a SQL query like this one:
    -									</p>
    -									
    -</html><sql>SELECT ((1 + 2) * (5 - 3) / 2) % 10 FROM DUAL</sql><html>
    -							
    -									<p>
    -										You can write something like this in jOOQ:
    -									</p>
    -									
    -</html><java>create.select(val(1).add(2).mul(val(5).sub(3)).div(2).mod(10);</java><html>
    -
    -									<h3>Datetime arithmetic expressions</h3>
    -									<p>
    -										jOOQ also supports the Oracle-style syntax for adding days to a Field&lt;? extends java.util.Date&gt; 
    -									</p>
    -
    -</html><code-pair>
    -	<sql>SELECT SYSDATE + 3 FROM DUAL;</sql><java>create.select(currentTimestamp().add(3));</java>
    -</code-pair><html>
    -
    -									<p>
    -										For more advanced datetime arithmetic, use the Factory's timestampDiff() and dateDiff() functions, as well as jOOQ's built-in SQL standard INTERVAL data type support:
    -									</p>
    -									<ul>
    -										<li>INTERVAL YEAR TO MONTH: <reference class="org.jooq.types.YearToMonth"/></li>
    -										<li>INTERVAL DAY TO SECOND: <reference class="org.jooq.types.DayToSecond"/></li>
    -									</ul>
    -								</html></content>
    -							</section>
    -							
    -							<section id="string-concatenation">
    -								<title>String concatenation</title>
    -								<content><html>
    -									<p>
    -										The SQL standard defines the concatenation operator to be an infix operator, similar to the ones we've seen in the chapter about <reference id="arithmetic-expressions" title="arithmetic expressions"/>. This operator looks like this: <code>||</code>. Some other dialects do not support this operator, but expect a <code>concat()</code> function, instead. jOOQ renders the right operator / function, depending on your <reference id="sql-dialects" title="SQL dialect"/>:
    -									</p>
    -									
    -</html><code-pair>
    -<sql>SELECT 'A' || 'B' || 'C' FROM DUAL
    --- Or in MySQL:
    -SELECT concat('A', 'B', 'C') FROM DUAL</sql><java>&#160;
    -// For all RDBMS, including MySQL:
    -create.select(concat("A", "B", "C"));
    -</java>
    -</code-pair><html>								
    -								</html></content>
    -							</section>
    -
    -							<section id="general-functions">
    -								<title>General functions</title>
    -								<content><html>
    -									<p>
    -										There are a variety of general functions supported by jOOQ As discussed in the chapter about <reference id="sql-dialects" title="SQL dialects"/> functions are mostly simulated in your database, in case they are not natively supported.
    -									</p>
    -									<p>
    -										This is a list of general functions supported by jOOQ's <reference id="factory" title="Factory"/>:
    -									</p>
    -									<ul>
    -										<li><strong>COALESCE</strong>: Get the first non-null value in a list of arguments.</li>
    -										<li><strong>NULLIF</strong>: Return NULL if both arguments are equal, or the first argument, otherwise.</li>
    -										<li><strong>NVL</strong>: Get the first non-null value among two arguments.</li>
    -										<li><strong>NVL2</strong>: Get the second argument if the first is null, or the third argument, otherwise.</li>
    -									</ul>
    -																
    -									<p>
    -										Please refer to the <reference class="org.jooq.impl.Factory" title="Factory Javadoc"/> for more details.
    -									</p>
    -								</html></content>
    -							</section>
    -							
    -							<section id="numeric-functions">
    -								<title>Numeric functions</title>
    -								<content><html>
    -									<p>
    -										Math can be done efficiently in the database before returning results to your Java application. In addition to the <reference id="arithmetic-expressions" title="arithmetic expressions" /> discussed previously, jOOQ also supports a variety of numeric functions. As discussed in the chapter about <reference id="sql-dialects" title="SQL dialects"/> numeric functions (as any function type) are mostly simulated in your database, in case they are not natively supported.
    -									</p>
    -									<p>
    -										This is a list of numeric functions supported by jOOQ's <reference id="factory" title="Factory"/>:
    -									</p>
    -									
    -									<ul>
    -										<li><strong>ABS</strong>: Get the absolute value of a value.</li>
    -										<li><strong>ACOS</strong>: Get the arc cosine of a value.</li>
    -										<li><strong>ASIN</strong>: Get the arc sine of a value.</li>
    -										<li><strong>ATAN</strong>: Get the arc tangent of a value.</li>
    -										<li><strong>ATAN2</strong>: Get the atan2 function of two values.</li>
    -										<li><strong>CEIL</strong>: Get the smalles integer value larger than a given numeric value.</li>
    -										<li><strong>COS</strong>: Get the cosine of a value.</li>
    -										<li><strong>COSH</strong>: Get the hyperbolic cosine of a value.</li>
    -										<li><strong>COT</strong>: Get the cotangent of a value.</li>
    -										<li><strong>COTH</strong>: Get the hyperbolic cotangent of a value.</li>
    -										<li><strong>DEG</strong>: Transform radians into degrees.</li>
    -										<li><strong>EXP</strong>: Calculate e^value.</li>
    -										<li><strong>FLOOR</strong>: Get the largest integer value smaller than a given numeric value.</li>
    -										<li><strong>GREATEST</strong>: Finds the greatest among all argument values (can also be used with non-numeric values).</li>
    -										<li><strong>LEAST</strong>: Finds the least among all argument values (can also be used with non-numeric values).</li>
    -										<li><strong>LN</strong>: Get the natural logarithm of a value.</li>
    -										<li><strong>LOG</strong>: Get the logarithm of a value given a base.</li>
    -										<li><strong>POWER</strong>: Calculate value^exponent.</li>
    -										<li><strong>RAD</strong>: Transform degrees into radians.</li>
    -										<li><strong>RAND</strong>: Get a random number.</li>
    -										<li><strong>ROUND</strong>: Rounds a value to the nearest integer.</li>
    -										<li><strong>SIGN</strong>: Get the sign of a value (-1, 0, 1).</li>
    -										<li><strong>SIN</strong>: Get the sine of a value.</li>
    -										<li><strong>SINH</strong>: Get the hyperbolic sine of a value.</li>
    -										<li><strong>SQRT</strong>: Calculate the square root of a value.</li>
    -										<li><strong>TAN</strong>: Get the tangent of a value.</li>
    -										<li><strong>TANH</strong>: Get the hyperbolic tangent of a value.</li>
    -										<li><strong>TRUNC</strong>: Truncate the decimals off a given value.</li>
    -									</ul>
    -									
    -									<p>
    -										Please refer to the <reference class="org.jooq.impl.Factory" title="Factory Javadoc"/> for more details.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="bitwise-functions">
    -								<title>Bitwise functions</title>
    -								<content><html>
    -									<p>
    -										Interestingly, bitwise functions and bitwise arithmetic is not very popular among SQL databases. Most databases only support a few bitwise operations, while others ship with the full set of operators. jOOQ's API includes most bitwise operations as listed below. In order to avoid ambiguities with <reference id="conditional-expressions" title="conditional operators"/>, all bitwise functions are prefixed with "bit"
    -									</p>
    -									<ul>
    -										<li><strong>BIT_COUNT</strong>: Count the number of bits set to 1 in a number</li>
    -										<li><strong>BIT_AND</strong>: Set only those bits that are set in two numbers</li>
    -										<li><strong>BIT_OR</strong>: Set all bits that are set in at least one number</li>
    -										<li><strong>BIT_NAND</strong>: Set only those bits that are set in two numbers, and inverse the result</li>
    -										<li><strong>BIT_NOR</strong>: Set all bits that are set in at least one number, and inverse the result</li>
    -										<li><strong>BIT_NOT</strong>: Inverse the bits in a number</li>
    -										<li><strong>BIT_XOR</strong>: Set all bits that are set in at exactly one number</li>
    -										<li><strong>BIT_XNOR</strong>: Set all bits that are set in at exactly one number, and inverse the result</li>
    -										<li><strong>SHL</strong>: Shift bits to the left</li>
    -										<li><strong>SHR</strong>: Shift bits to the right</li>
    -									</ul>
    -									
    -									<h3>Some background about bitwise operation simulation</h3>
    -									<p>
    -										As stated before, not all databases support all of these bitwise operations. jOOQ simulates them wherever this is possible. More details can be seen in this blog post: <br/>
    -										<a href="http://blog.jooq.org/2011/10/30/the-comprehensive-sql-bitwise-operations-compatibility-list/">http://blog.jooq.org/2011/10/30/the-comprehensive-sql-bitwise-operations-compatibility-list/</a>
    -									</p>
    -									
    -								</html></content>
    -							</section>
    -
    -							<section id="string-functions">
    -								<title>String functions</title>
    -								<content><html>
    -									<p>
    -										String formatting can be done efficiently in the database before returning results to your Java application. As discussed in the chapter about <reference id="sql-dialects" title="SQL dialects"/> string functions (as any function type) are mostly simulated in your database, in case they are not natively supported.
    -									</p>
    -									<p>
    -										This is a list of numeric functions supported by jOOQ's <reference id="factory" title="Factory"/>:
    -									</p>
    -									
    -									<ul>
    -										<li><strong>ASCII</strong>: Get the ASCII code of a character.</li>
    -										<li><strong>BIT_LENGTH</strong>: Get the length of a string in bits.</li>
    -										<li><strong>CHAR_LENGTH</strong>: Get the length of a string in characters.</li>
    -										<li><strong>CONCAT</strong>: Concatenate several strings.</li>
    -										<li><strong>ESCAPE</strong>: Escape a string for use with the <reference id="like-predicate" title="LIKE predicate"/>.</li>
    -										<li><strong>LENGTH</strong>: Get the length of a string.</li>
    -										<li><strong>LOWER</strong>: Get a string in lower case letters.</li>
    -										<li><strong>LPAD</strong>: Pad a string on the left side.</li>
    -										<li><strong>LTRIM</strong>: Trim a string on the left side.</li>
    -										<li><strong>OCTET_LENGTH</strong>: Get the length of a string in octets.</li>
    -										<li><strong>POSITION</strong>: Find a string within another string.</li>
    -										<li><strong>REPEAT</strong>: Repeat a string a given number of times.</li>
    -										<li><strong>REPLACE</strong>: Replace a string within another string.</li>
    -										<li><strong>RPAD</strong>: Pad a string on the right side.</li>
    -										<li><strong>RTRIM</strong>: Trim a string on the right side.</li>
    -										<li><strong>SUBSTRING</strong>: Get a substring of a string.</li>
    -										<li><strong>TRIM</strong>: Trim a string on both sides.</li>
    -										<li><strong>UPPER</strong>: Get a string in upper case letters.</li>
    -									</ul>
    -									
    -									<p>
    -										Please refer to the <reference class="org.jooq.impl.Factory" title="Factory Javadoc"/> for more details.
    -									</p>
    -									
    -									<h3>Regular expressions, REGEXP, REGEXP_LIKE, etc.</h3>
    -									<p>
    -										Various databases have some means of searching through columns using regular expressions if the <reference id="like-predicate" title="LIKE predicate"/> does not provide sufficient pattern matching power. While there are many different functions and operators in the various databases, jOOQ settled for the SQL:2008 standard REGEX_LIKE operator. Being an operator (and not a function), you should use the corresponding method on <reference class="org.jooq.Field"/>:
    -									</p>
    -									
    -</html><java><![CDATA[create.selectFrom(BOOK).where(TITLE.likeRegex("^.*SQL.*$"));]]></java><html>
    -
    -									<p>
    -										Note that the SQL standard specifies that patterns should follow the XQuery standards. In the real world, the POSIX regular expression standard is the most used one, some use Java regular expressions, and only a few ones use Perl regular expressions. jOOQ does not make any assumptions about regular expression syntax. For cross-database compatibility, please read the relevant database manuals carefully, to learn about the appropriate syntax. Please refer to the <reference class="org.jooq.impl.Factory" title="Factory Javadoc"/> for more details.
    -									</p>
    -								</html></content>
    -								<!-- don't forget regex here! -->
    -							</section>
    -
    -							<section id="date-and-time-functions">
    -								<title>Date and time functions</title>
    -								<content><html>
    -									<p>
    -										This is a list of date and time functions supported by jOOQ's <reference id="factory" title="Factory"/>:
    -									</p>
    -									
    -									<ul>
    -										<li><strong>CURRENT_DATE</strong>: Get current date as a DATE object.</li>
    -										<li><strong>CURRENT_TIME</strong>: Get current time as a TIME object.</li>
    -										<li><strong>CURRENT_TIMESTAMP</strong>: Get current date as a TIMESTAMP object.</li>
    -										<li><strong>DATE_ADD</strong>: Add a number of days or an interval to a date.</li>
    -										<li><strong>DATE_DIFF</strong>: Get the difference in days between two dates.</li>
    -										<li><strong>TIMESTAMP_ADD</strong>: Add a number of days or an interval to a timestamp.</li>
    -										<li><strong>TIMESTAMP_DIFF</strong>: Get the difference as an INTERVAL DAY TO SECOND between two dates.</li>
    -									</ul>
    -									
    -									<h3>Intervals in jOOQ</h3>
    -									<p>
    -										jOOQ fills a gap opened by JDBC, which neglects an important SQL data type as defined by the SQL standards: INTERVAL types. See the manual's section about <reference id="data-types-intervals" title="INTERVAL data types"/> for more details.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="system-functions">
    -								<title>System functions</title>
    -								<content><html>
    -									<p>
    -										This is a list of system functions supported by jOOQ's <reference id="factory" title="Factory"/>:
    -									</p>
    -									<ul>
    -										<li><strong>CURRENT_USER</strong>: Get current user.</li>
    -									</ul>
    -								</html></content>
    -							</section>
    -
    -							<section id="aggregate-functions">
    -								<title>Aggregate functions</title>
    -								<content><html>
    -									<p>
    -										Aggregate functions work just like functions, even if they have a slightly different semantics. Here are some example aggregate functions from the <reference id="factory" title="Factory"/>:
    -									</p>
    -
    -</html><java><![CDATA[// Every-day, SQL standard aggregate functions
    -AggregateFunction<Integer> count();
    -AggregateFunction<Integer> count(Field<?> field);
    -AggregateFunction<T> max(Field<T> field);
    -AggregateFunction<T> min(Field<T> field);
    -AggregateFunction<BigDecimal> sum(Field<? extends Number> field);
    -AggregateFunction<BigDecimal> avg(Field<? extends Number> field);
    -
    -// DISTINCT keyword in aggregate functions
    -AggregateFunction<Integer> countDistinct(Field<?> field);
    -AggregateFunction<T> maxDistinct(Field<T> field);
    -AggregateFunction<T> minDistinct(Field<T> field);
    -AggregateFunction<BigDecimal> sumDistinct(Field<? extends Number> field);
    -AggregateFunction<BigDecimal> avgDistinct(Field<? extends Number> field);
    -
    -// String aggregate functions
    -AggregateFunction<String> groupConcat(Field<?> field);
    -AggregateFunction<String> groupConcatDistinct(Field<?> field);
    -OrderedAggregateFunction<String> listAgg(Field<?> field);
    -OrderedAggregateFunction<String> listAgg(Field<?> field, String separator);
    -
    -// Statistical functions
    -AggregateFunction<BigDecimal> median(Field<? extends Number> field);
    -AggregateFunction<BigDecimal> stddevPop(Field<? extends Number> field);
    -AggregateFunction<BigDecimal> stddevSamp(Field<? extends Number> field);
    -AggregateFunction<BigDecimal> varPop(Field<? extends Number> field);
    -AggregateFunction<BigDecimal> varSamp(Field<? extends Number> field);]]></java><html>
    -
    -									<p>
    -										Here's an example, counting the number of books any author has written:
    -									</p>
    -
    -</html><code-pair>
    -<sql>SELECT AUTHOR_ID, COUNT(*)
    -FROM BOOK
    -GROUP BY AUTHOR_ID</sql><java>create.select(BOOK.AUTHOR_ID, count())
    -      .from(BOOK)
    -      .groupBy(BOOK.AUTHOR_ID);</java>
    -</code-pair><html>
    -
    -									<p>
    -										Aggregate functions have strong limitations about when they may be used and when not. For instance, you can use aggregate functions in scalar queries. Typically, this means you only select aggregate functions, no <reference id="table-columns" title="regular columns"/> or other <reference id="column-expressions" title="column expressions"/>. Another use case is to use them along with a <reference id="group-by-clause" title="GROUP BY clause"/> as seen in the previous example. Note, that jOOQ does not check whether your using of aggregate functions is correct according to the SQL standards, or according to your database's behaviour.
    -									</p>
    -
    -		                            <h3>Ordered aggregate functions</h3>
    -		                            <p>
    -		                            	Oracle and some other databases support "ordered aggregate functions". This means you can provide an ORDER BY clause to an aggregate function, which will be taken into consideration when aggregating. The best example for this is Oracle's <code>LISTAGG()</code> (also known as <code>GROUP_CONCAT</code> in other <reference id="sql-dialects" title="SQL dialects"/>). The following query groups by authors and concatenates their books' titles
    -		                           	</p>
    -</html><code-pair>
    -<sql>SELECT   LISTAGG(TITLE, ', ')
    -         WITHIN GROUP (ORDER BY TITLE)
    -FROM     BOOK
    -GROUP BY AUTHOR_ID</sql><java>create.select(listAgg(BOOK.TITLE, ", ")
    -      .withinGroupOrderBy(BOOK.TITLE))
    -      .from(BOOK)
    -      .groupBy(BOOK.AUTHOR_ID)</java>
    -</code-pair><html>
    -
    -									<p>
    -										The above query might yield:
    -									</p>
    -
    -</html><text>+---------------------+
    -| LISTAGG             |
    -+---------------------+
    -| 1984, Animal Farm   |
    -| O Alquimista, Brida |
    -+---------------------+</text><html>
    -
    -									<h3>FIRST and LAST: Oracle's "ranked" aggregate functions</h3>
    -									<p>
    -										Oracle allows for restricting aggregate functions using the <code>KEEP()</code> clause, which is supported by jOOQ. In Oracle, some aggregate functions (MIN, MAX, SUM, AVG, COUNT, VARIANCE, or STDDEV) can be restricted by this clause, hence <reference class="org.jooq.AggregateFunction"/> also allows for specifying it. Here are a couple of examples using this clause:
    -									</p>
    -
    -</html><code-pair>
    -<sql>SUM(BOOK.AMOUNT_SOLD)
    -  KEEP(DENSE_RANK FIRST ORDER BY BOOK.AUTHOR_ID)</sql><java>sum(BOOK.AMOUNT_SOLD)
    -  .keepDenseRankFirstOrderBy(BOOK.AUTHOR_ID)</java>
    -</code-pair><html>
    -
    -									<h3>User-defined aggregate functions</h3>
    -									<p>
    -										jOOQ also supports using your own user-defined aggregate functions. See the manual's section about <reference id="user-defined-aggregate-functions" title="user-defined aggregate functions"/> for more details.
    -									</p>
    -
    -									<h3>Window functions / analytical functions</h3>
    -									<p>
    -										In those databases that support <reference id="window-functions" title="window functions"/>, jOOQ's <reference class="org.jooq.AggregateFunction"/> can be transformed into a window function / analytical function by calling <code>over()</code> on it. See the manual's section about <reference id="window-functions" title="window functions"/> for more details.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="window-functions">
    -								<title>Window functions</title>
    -								<content><html>
    -									<p>
    -										Most major RDBMS support the concept of window functions. jOOQ knows of implementations in DB2, Oracle, Postgres, SQL Server, and Sybase SQL Anywhere, and supports most of their specific syntaxes. Note, that H2 and HSQLDB have implemented <code>ROW_NUMBER()</code> functions, without true windowing support.
    -									</p>
    -									<p>
    -										As previously discussed, any <reference class="org.jooq.AggregateFunction"/> can be transformed into a window function using the <code>over()</code> method. See the chapter about <reference id="aggregate-functions" title="aggregate functions"/> for details. In addition to those, there are also some more window functions supported by jOOQ, as declared in the <reference id="factory" title="Factory"/>:
    -									</p>
    -
    -</html><java><![CDATA[// Ranking functions
    -    WindowOverStep<Integer>    rowNumber();
    -    WindowOverStep<Integer>    rank();
    -    WindowOverStep<Integer>    denseRank();
    -    WindowOverStep<BigDecimal> percentRank();
    -    
    -// Windowing functions
    -<T> WindowIgnoreNullsStep<T>   firstValue(Field<T> field);
    -<T> WindowIgnoreNullsStep<T>   lastValue(Field<T> field)
    -<T> WindowIgnoreNullsStep<T>   lead(Field<T> field);
    -<T> WindowIgnoreNullsStep<T>   lead(Field<T> field, int offset);
    -<T> WindowIgnoreNullsStep<T>   lead(Field<T> field, int offset, T defaultValue);
    -<T> WindowIgnoreNullsStep<T>   lead(Field<T> field, int offset, Field<T> defaultValue);
    -<T> WindowIgnoreNullsStep<T>   lag(Field<T> field);
    -<T> WindowIgnoreNullsStep<T>   lag(Field<T> field, int offset);
    -<T> WindowIgnoreNullsStep<T>   lag(Field<T> field, int offset, T defaultValue);
    -<T> WindowIgnoreNullsStep<T>   lag(Field<T> field, int offset, Field<T> defaultValue);
    -
    -// Statistical functions
    -    WindowOverStep<BigDecimal> cumeDist();
    -    WindowOverStep<Integer>    ntile(int number);]]></java><html>	
    -    								
    -    								<p>
    -    									SQL distinguishes between various window function types (e.g. "ranking functions"). Depending on the function, SQL expects mandatory <code>PARTITION BY</code> or <code>ORDER BY</code> clauses within the <code>OVER()</code> clause. jOOQ does not enforce those rules for two reasons:
    -    								</p>
    -    								<ul>
    -    									<li>Your JDBC driver or database already checks SQL syntax semantics</li>
    -    									<li>Not all databases behave correctly according to the SQL standard</li>
    -    								</ul>
    -    								<p>
    -    									If possible, however, jOOQ tries to render missing clauses for you, if a given <reference id="sql-dialects" title="SQL dialect"/> is more restrictive.
    -    								</p>
    -    								<h3>Some examples</h3>
    -									<p>
    -										 Here are some simple examples of window functions with jOOQ:
    -									</p>
    -									
    -</html><code-pair>
    -<sql>-- Sample uses of ROW_NUMBER()
    -ROW_NUMBER() OVER()
    -ROW_NUMBER() OVER(PARTITION BY 1)
    -ROW_NUMBER() OVER(ORDER BY BOOK.ID)
    -ROW_NUMBER() OVER(PARTITION BY BOOK.AUTHOR_ID ORDER BY BOOK.ID)
    -                  
    --- Sample uses of FIRST_VALUE
    -FIRST_VALUE(BOOK.ID) OVER()
    -FIRST_VALUE(BOOK.ID IGNORE NULLS) OVER()
    -FIRST_VALUE(BOOK.ID RESPECT NULLS) OVER()
    -</sql><java>// Sample uses of rowNumber()
    -rowNumber().over()
    -rowNumber().over().partitionByOne()
    -rowNumber().over().partitionBy(BOOK.AUTHOR_ID)
    -rowNumber().over().partitionBy(BOOK.AUTHOR_ID).orderBy(BOOK.ID)
    -                  
    -// Sample uses of firstValue()
    -firstValue(BOOK.ID).over()
    -firstValue(BOOK.ID).ignoreNulls().over()
    -firstValue(BOOK.ID).respectNulls().over()
    -</java>
    -</code-pair><html>
    -    								
    -									<h3>An advanced window function example</h3>
    -									<p>
    -										Window functions can be used for things like calculating a "running total". The following example fetches transactions and the running total for every transaction going back to the beginning of the transaction table (ordered by booked_at). Window functions are accessible from the previously seen <reference class="org.jooq.AggregateFunction"/> type using the <code>over()</code> method:
    -									</p>
    -
    -</html><code-pair>
    -<sql>SELECT booked_at, amount,
    -   SUM(amount) OVER (PARTITION BY 1
    -                     ORDER BY booked_at
    -                     ROWS BETWEEN UNBOUNDED PRECEDING
    -                     AND CURRENT ROW) AS total
    -  FROM transactions</sql><java>create.select(t.BOOKED_AT, t.AMOUNT,
    -         sum(t.AMOUNT).over().partitionByOne()
    -                      .orderBy(t.BOOKED_AT)
    -                      .rowsBetweenUnboundedPreceding()
    -                      .andCurrentRow().as("total")
    -      .from(TRANSACTIONS.as("t"));</java>
    -</code-pair><html>
    -
    -
    -									<h3>Window functions created from ordered aggregate functions</h3>
    -									<p>
    -										In the previous chapter about <reference id="aggregate-functions" title="aggregate functions"/>, we have seen the concept of "ordered aggregate functions", such as Oracle's <code>LISTAGG()</code>. These functions have a window function / analytical function variant, as well. For example:
    -									</p>
    -									
    -</html><code-pair>
    -<sql>SELECT   LISTAGG(TITLE, ', ')
    -         WITHIN GROUP (ORDER BY TITLE)
    -         OVER (PARTITION BY BOOK.AUTHOR_ID)
    -FROM     BOOK</sql><java>create.select(listAgg(BOOK.TITLE, ", ")
    -      .withinGroupOrderBy(BOOK.TITLE)
    -      .over().partitionBy(BOOK.AUTHOR_ID))
    -      .from(BOOK)</java>
    -</code-pair><html>
    -
    -									<h3>Window functions created from Oracle's FIRST and LAST aggregate functions</h3>
    -									<p>
    -										In the previous chapter about <reference id="aggregate-functions" title="aggregate functions"/>, we have seen the concept of "FIRST and LAST aggregate functions". These functions have a window function / analytical function variant, as well. For example:
    -									</p>
    -
    -</html><code-pair>
    -<sql>SUM(BOOK.AMOUNT_SOLD)
    -  KEEP(DENSE_RANK FIRST ORDER BY BOOK.AUTHOR_ID)
    -  OVER(PARTITION BY 1)</sql><java>sum(BOOK.AMOUNT_SOLD)
    -  .keepDenseRankFirstOrderBy(BOOK.AUTHOR_ID)
    -  .over().partitionByOne()</java>
    -</code-pair><html>
    -
    -
    -									<h3>Window functions created from user-defined aggregate functions</h3>
    -									<p>
    -										User-defined aggregate functions also implement <reference class="org.jooq.AggregateFunction"/>, hence they can also be transformed into window functions using <code>over()</code>. This is supported by Oracle in particular. See the manual's section about <reference id="user-defined-aggregate-functions" title="user-defined aggregate functions"/> for more details.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="grouping-functions">
    -								<title>Grouping functions</title>
    -								<content><html>
    -									<h3>ROLLUP() explained in SQL</h3>
    -									<p>
    -										The SQL standard defines special functions that can be used in the <reference id="group-by-clause" title="GROUP BY clause"/>: the grouping functions. These functions can be used to generate several groupings in a single clause. This can best be explained in SQL. Let's take ROLLUP() for instance:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[-- ROLLUP() with one argument 
    -SELECT AUTHOR_ID, COUNT(*)
    -FROM BOOK
    -GROUP BY ROLLUP(AUTHOR_ID)
    -
    -
    --- ROLLUP() with two arguments
    -SELECT AUTHOR_ID, PUBLISHED_IN, COUNT(*)
    -FROM BOOK
    -GROUP BY ROLLUP(AUTHOR_ID, PUBLISHED_IN)
    -
    -
    -
    -
    -
    -
    -
    -]]></sql><sql><![CDATA[-- The same query using UNION ALL:
    -  SELECT AUTHOR_ID, COUNT(*) FROM BOOK GROUP BY (AUTHOR_ID)
    -UNION ALL
    -  SELECT NULL, COUNT(*) FROM BOOK GROUP BY ()
    -ORDER BY 1 NULLS LAST
    -
    --- The same query using UNION ALL:
    -  SELECT AUTHOR_ID, PUBLISHED_IN, COUNT(*) 
    -  FROM BOOK GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -UNION ALL
    -  SELECT AUTHOR_ID, NULL, COUNT(*) 
    -  FROM BOOK GROUP BY (AUTHOR_ID)
    -UNION ALL
    -  SELECT NULL, NULL, COUNT(*) 
    -  FROM BOOK GROUP BY ()
    -ORDER BY 1 NULLS LAST, 2 NULLS LAST
    -]]></sql>
    -</code-pair><html>
    -
    -									<p>
    -										In English, the <code>ROLLUP()</code> grouping function provides <code>N+1</code> groupings, when <code>N</code> is the number of arguments to the <code>ROLLUP()</code> function. Each grouping has an additional group field from the <code>ROLLUP()</code> argument field list. The results of the second query might look something like this:
    -									</p>
    -									
    -</html><text><![CDATA[+-----------+--------------+----------+
    -| AUTHOR_ID | PUBLISHED_IN | COUNT(*) |
    -+-----------+--------------+----------+
    -|         1 |         1945 |        1 | <- GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -|         1 |         1948 |        1 | <- GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -|         1 |         NULL |        2 | <- GROUP BY (AUTHOR_ID)
    -|         2 |         1988 |        1 | <- GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -|         2 |         1990 |        1 | <- GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -|         2 |         NULL |        2 | <- GROUP BY (AUTHOR_ID)
    -|      NULL |         NULL |        4 | <- GROUP BY ()
    -+-----------+--------------+----------+]]></text><html>
    -
    -									<h3>CUBE() explained in SQL</h3>
    -									<p>
    -										<code>CUBE()</code> is different from <code>ROLLUP()</code> in the way that it doesn't just create <code>N+1</code> groupings, it creates all <code>2^N</code> possible combinations between all group fields in the <code>CUBE()</code> function argument list. Let's re-consider our second query from before:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[-- CUBE() with two arguments
    -SELECT AUTHOR_ID, PUBLISHED_IN, COUNT(*)
    -FROM BOOK
    -GROUP BY CUBE(AUTHOR_ID, PUBLISHED_IN)
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -]]></sql><sql><![CDATA[-- The same query using UNION ALL:
    -  SELECT AUTHOR_ID, PUBLISHED_IN, COUNT(*) 
    -  FROM BOOK GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -UNION ALL
    -  SELECT AUTHOR_ID, NULL, COUNT(*) 
    -  FROM BOOK GROUP BY (AUTHOR_ID)
    -UNION ALL
    -  SELECT NULL, PUBLISHED_IN, COUNT(*) 
    -  FROM BOOK GROUP BY (PUBLISHED_IN)
    -UNION ALL
    -  SELECT NULL, NULL, COUNT(*) 
    -  FROM BOOK GROUP BY ()
    -ORDER BY 1 NULLS FIRST, 2 NULLS FIRST
    -]]></sql>
    -</code-pair><html>
    -
    -									<p>
    -										The results would then hold:
    -									</p>
    -
    -</html><text><![CDATA[+-----------+--------------+----------+
    -| AUTHOR_ID | PUBLISHED_IN | COUNT(*) |
    -+-----------+--------------+----------+
    -|      NULL |         NULL |        2 | <- GROUP BY ()
    -|      NULL |         1945 |        1 | <- GROUP BY (PUBLISHED_IN)
    -|      NULL |         1948 |        1 | <- GROUP BY (PUBLISHED_IN)
    -|      NULL |         1988 |        1 | <- GROUP BY (PUBLISHED_IN)
    -|      NULL |         1990 |        1 | <- GROUP BY (PUBLISHED_IN)
    -|         1 |         NULL |        2 | <- GROUP BY (AUTHOR_ID)
    -|         1 |         1945 |        1 | <- GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -|         1 |         1948 |        1 | <- GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -|         2 |         NULL |        2 | <- GROUP BY (AUTHOR_ID)
    -|         2 |         1988 |        1 | <- GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -|         2 |         1990 |        1 | <- GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -+-----------+--------------+----------+]]></text><html>
    -
    -									<h3>GROUPING SETS()</h3>
    -									<p>
    -										<code>GROUPING SETS()</code> are the generalised way to create multiple groupings. From our previous examples 
    -									</p>
    -									<ul>
    -										<li><code>ROLLUP(AUTHOR_ID, PUBLISHED_IN)</code> corresponds to <code>GROUPING SETS((AUTHOR_ID, PUBLISHED_IN), (AUTHOR_ID), ())</code></li>
    -										<li><code>CUBE(AUTHOR_ID, PUBLISHED_IN)</code> corresponds to <code>GROUPING SETS((AUTHOR_ID, PUBLISHED_IN), (AUTHOR_ID), (PUBLISHED_IN), ())</code></li>
    -									</ul>
    -									<p>
    -										This is nicely explained in the SQL Server manual pages about <code>GROUPING SETS()</code> and other grouping functions:<br/>
    -										<a href="http://msdn.microsoft.com/en-us/library/bb510427(v=sql.105)">http://msdn.microsoft.com/en-us/library/bb510427(v=sql.105)</a>
    -									</p>
    -									
    -									<h3>jOOQ's support for ROLLUP(), CUBE(), GROUPING SETS()</h3>
    -									<p>
    -										jOOQ fully supports all of these functions, as well as the utility functions <code>GROUPING()</code> and <code>GROUPING_ID()</code>, used for identifying the grouping set ID of a record. The <reference id="factory" title="Factory API"/> thus includes:
    -									</p>
    -									
    -</html><java><![CDATA[// The various grouping function constructors
    -Field<?> rollup(Field<?>... fields);
    -Field<?> cube(Field<?>... fields);
    -Field<?> groupingSets(Field<?>... fields);
    -Field<?> groupingSets(Field<?>[]... fields);
    -Field<?> groupingSets(Collection<Field<?>>... fields);
    -
    -// The utility functions generating IDs per GROUPING SET
    -Field<Integer> grouping(Field<?>);
    -Field<Integer> groupingId(Field<?>...);]]></java><html>
    -
    -									<h3>MySQL's and CUBRID's WITH ROLLUP syntax</h3>
    -									<p>
    -										MySQL and CUBRID don't know any grouping functions, but they support a <code>WITH ROLLUP</code> clause, that is equivalent to simple <code>ROLLUP()</code> grouping functions. jOOQ simulates <code>ROLLUP()</code> in MySQL and CUBRID, by rendering this <code>WITH ROLLUP</code> clause. The following two statements mean the same:
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[-- Statement 1: SQL standard
    -GROUP BY ROLLUP(A, B, C)
    -
    --- Statement 2: SQL standard
    -GROUP BY A, ROLLUP(B, C)]]></sql><sql><![CDATA[-- Statement 1: MySQL
    -GROUP BY A, B, C WITH ROLLUP
    -
    --- Statement 2: MySQL
    --- This is not supported in MySQL]]></sql>
    -</code-pair><html>
    -								</html></content>
    -							</section>
    -
    -							<section id="user-defined-functions">
    -								<title>User-defined functions</title>
    -								<content><html>
    -									<p>
    -										Some databases support user-defined functions, which can be embedded in any SQL statement, if you're using jOOQ's <reference id="code-generation" title="code generator"/>. Let's say you have the following simple function in Oracle SQL:
    -									</p>
    -									
    -</html><sql><![CDATA[CREATE OR REPLACE FUNCTION echo (INPUT NUMBER)
    -RETURN NUMBER
    -IS
    -BEGIN
    -    RETURN INPUT;
    -END echo;
    -]]></sql><html>
    -
    -                                    <p>
    -                                    	The above function will be made available from a generated <reference id="codegen-procedures" title="Routines"/> class. You can use it like any other <reference id="column-expressions" title="column expression"/>:
    -                                    </p>
    -                                    
    -</html><code-pair>
    -<sql><![CDATA[SELECT echo(1) FROM DUAL WHERE echo(2) = 2]]></sql><java><![CDATA[create.select(echo(1)).where(echo(2).equal(2));]]></java>
    -</code-pair><html>
    -                                
    -                                	<p>
    -                                		Note that user-defined functions returning <reference id="data-types-cursors" title="CURSOR"/> or <reference id="data-types-arrays" title="ARRAY"/> data types can also be used wherever <reference id="table-expressions" title="table expressions"/> can be used, if they are <reference id="array-and-cursor-unnesting" title="unnested"/>
    -                                	</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="user-defined-aggregate-functions">
    -								<title>User-defined aggregate functions</title>
    -								<content><html>
    -									<p>
    -										Some databases support user-defined aggregate functions, which can then be used along with <reference id="group-by-clause" title="GROUP BY clauses"/> or as <reference id="window-functions" title="window functions"/>. An example for such a database is Oracle. With Oracle, you can define the following OBJECT type (the example was taken from the <a href="http://docs.oracle.com/cd/B28359_01/appdev.111/b28425/ext_agg_ref.htm">Oracle 11g documentation</a>): 
    -									</p>
    -									
    -</html><sql><![CDATA[CREATE TYPE U_SECOND_MAX AS OBJECT
    -(
    -  MAX NUMBER, -- highest value seen so far
    -  SECMAX NUMBER, -- second highest value seen so far
    -  STATIC FUNCTION ODCIAggregateInitialize(sctx IN OUT U_SECOND_MAX) RETURN NUMBER,
    -  MEMBER FUNCTION ODCIAggregateIterate(self IN OUT U_SECOND_MAX, value IN NUMBER) RETURN NUMBER,
    -  MEMBER FUNCTION ODCIAggregateTerminate(self IN U_SECOND_MAX, returnValue OUT NUMBER, flags IN NUMBER) RETURN NUMBER,
    -  MEMBER FUNCTION ODCIAggregateMerge(self IN OUT U_SECOND_MAX, ctx2 IN U_SECOND_MAX) RETURN NUMBER
    -);
    -
    -CREATE OR REPLACE TYPE BODY U_SECOND_MAX IS
    -STATIC FUNCTION ODCIAggregateInitialize(sctx IN OUT U_SECOND_MAX)
    -RETURN NUMBER IS
    -BEGIN
    -  SCTX := U_SECOND_MAX(0, 0);
    -  RETURN ODCIConst.Success;
    -END;
    -
    -MEMBER FUNCTION ODCIAggregateIterate(self IN OUT U_SECOND_MAX, value IN NUMBER) RETURN NUMBER IS
    -BEGIN
    -  IF VALUE > SELF.MAX THEN
    -    SELF.SECMAX := SELF.MAX;
    -    SELF.MAX := VALUE;
    -  ELSIF VALUE > SELF.SECMAX THEN
    -    SELF.SECMAX := VALUE;
    -  END IF;
    -  RETURN ODCIConst.Success;
    -END;
    -
    -MEMBER FUNCTION ODCIAggregateTerminate(self IN U_SECOND_MAX, returnValue OUT NUMBER, flags IN NUMBER) RETURN NUMBER IS
    -BEGIN
    -  RETURNVALUE := SELF.SECMAX;
    -  RETURN ODCIConst.Success;
    -END;
    -
    -MEMBER FUNCTION ODCIAggregateMerge(self IN OUT U_SECOND_MAX, ctx2 IN U_SECOND_MAX) RETURN NUMBER IS
    -BEGIN
    -  IF CTX2.MAX > SELF.MAX THEN
    -    IF CTX2.SECMAX > SELF.SECMAX THEN
    -      SELF.SECMAX := CTX2.SECMAX;
    -    ELSE
    -      SELF.SECMAX := SELF.MAX;
    -    END IF;
    -    SELF.MAX := CTX2.MAX;
    -  ELSIF CTX2.MAX > SELF.SECMAX THEN
    -    SELF.SECMAX := CTX2.MAX;
    -  END IF;
    -  RETURN ODCIConst.Success;
    -END;
    -END;]]></sql><html>
    -
    -									<p>
    -										The above OBJECT type is then available to function declarations as such:
    -									</p>
    -
    -</html><sql><![CDATA[
    -CREATE FUNCTION SECOND_MAX (input NUMBER) RETURN NUMBER
    -PARALLEL_ENABLE AGGREGATE USING U_SECOND_MAX;]]></sql><html>
    -
    -									<h3>Using the generated aggregate function</h3>
    -									<p>
    -										jOOQ's <reference id="code-generation" title="code generator"/> will detect such aggregate functions and generate them differently from regular <reference id="user-defined-functions" title="user-defined functions"/>. They implement the <reference class="org.jooq.AggregateFunction"/> type, as mentioned in the manual's section about <reference id="aggregate-functions" title="aggregate functions"/>. Here's how you can use the SECOND_MAX() aggregate function with jOOQ:
    -									</p>
    -				
    -</html><code-pair>					
    -<sql><![CDATA[-- Get the second-latest publishing date by author
    -SELECT SECOND_MAX(PUBLISHED_IN) 
    -FROM BOOK
    -GROUP BY AUTHOR_ID]]></sql><java><![CDATA[// Routines.secondMax() can be static-imported
    -create.select(secondMax(BOOK.PUBLISHED_IN))
    -      .from(BOOK)
    -      .groupBy(BOOK.AUTHOR_ID)]]></java>
    -</code-pair><html>
    -								</html></content>
    -							</section>
    -
    -							<section id="case-expressions">
    -								<title>The CASE expression</title>
    -								<content><html>
    -									<p>
    -										The CASE expression is part of the standard SQL syntax. While some RDBMS also offer an IF expression, or a DECODE function, you can always rely on the two types of CASE syntax:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[CASE WHEN AUTHOR.FIRST_NAME = 'Paulo'  THEN 'brazilian'
    -     WHEN AUTHOR.FIRST_NAME = 'George' THEN 'english'
    -                                       ELSE 'unknown'
    -END
    -
    --- OR:
    -
    -CASE AUTHOR.FIRST_NAME WHEN 'Paulo'  THEN 'brazilian'
    -                       WHEN 'George' THEN 'english'
    -                                     ELSE 'unknown'
    -END]]></sql><java><![CDATA[create.decode()
    -      .when(AUTHOR.FIRST_NAME.equal("Paulo"), "brazilian")
    -      .when(AUTHOR.FIRST_NAME.equal("George"), "english")
    -      .otherwise("unknown");
    -
    -// OR:
    -
    -create.decode().value(AUTHOR.FIRST_NAME)
    -               .when("Paulo", "brazilian")
    -               .when("George", "english")
    -               .otherwise("unknown");]]></java>
    -</code-pair><html>
    -
    -								<p>
    -									In jOOQ, both syntaxes are supported (The second one is simulated in Derby, which only knows the first one). Unfortunately, both case and else are reserved words in Java. jOOQ chose to use decode() from the Oracle DECODE function, and otherwise(), which means the same as else.
    -								</p>
    -
    -								<p>
    -									A CASE expression can be used anywhere where you can place a <reference id="column-expressions" title="column expression (or Field)"/>. For instance, you can SELECT the above expression, if you're selecting from AUTHOR:
    -							 	</p>
    -
    -</html><sql>SELECT AUTHOR.FIRST_NAME, [... CASE EXPR ...] AS nationality
    -  FROM AUTHOR</sql><html>
    -
    -								<h3>The Oracle DECODE() function</h3>
    -								<p>
    -									Oracle knows a more succinct, but maybe less readable DECODE() function with a variable number of arguments. This function roughly does the same as the second case expression syntax. jOOQ supports the DECODE() function and simulates it using CASE expressions in all dialects other than Oracle:
    -								</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[-- Oracle:
    -DECODE(FIRST_NAME, 'Paulo', 'brazilian',
    -                   'George', 'english',
    -                   'unknown');
    -
    --- Other SQL dialects
    -CASE AUTHOR.FIRST_NAME WHEN 'Paulo'  THEN 'brazilian'
    -                       WHEN 'George' THEN 'english'
    -                                     ELSE 'unknown'
    -END]]></sql><java><![CDATA[
    -
    -
    -
    -
    -// Use the Oracle-style DECODE() function with jOOQ.
    -// Note, that you will not be able to rely on type-safety
    -create.decode(AUTHOR.FIRST_NAME,
    -    "Paulo", "brazilian",
    -    "George", "english",
    -    "unknown");]]></java>
    -</code-pair><html>
    -
    -		  							<h3>CASE clauses in an ORDER BY clause</h3>
    -									<p>
    -										Sort indirection is often implemented with a CASE clause of a SELECT's ORDER BY clause. See the manual's section about the <reference id="order-by-clause" title="ORDER BY clause"/> for more details.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="sequences-and-serials">
    -								<title>Sequences and serials</title>
    -								<content><html>
    -									<p>
    -										Sequences implement the <reference class="org.jooq.Sequence"/> interface, providing essentially this functionality:
    -									</p>
    -
    -</html><java><![CDATA[// Get a field for the CURRVAL sequence property
    -Field<T> currval();
    -
    -// Get a field for the NEXTVAL sequence property
    -Field<T> nextval();]]></java><html>
    -
    -									<p>
    -										So if you have a sequence like this in Oracle:
    -									</p>
    -
    -</html><sql>CREATE SEQUENCE s_author_id</sql><html>
    -
    -									<p>
    -										You can then use your <reference id="codegen-sequences" title="generated sequence"/> object directly in a SQL statement as such:
    -									</p>
    -
    -</html><java><![CDATA[// Reference the sequence in a SELECT statement:
    -BigInteger nextID = create.select(s).fetchOne(S_AUTHOR_ID.nextval());
    -
    -// Reference the sequence in an INSERT statement:
    -create.insertInto(AUTHOR, AUTHOR.ID, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -      .values(S_AUTHOR_ID.nextval(), val("William"), val("Shakespeare"));
    -]]></java><html>
    -
    -									<ul>
    -										<li>For more information about generated sequences, refer to the manual's section about <reference id="codegen-sequences" title="generated sequences"/></li>
    -										<li>For more information about executing standalone calls to sequences, refer to the manual's section about <reference id="sequence-execution" title="sequence execution"/></li>
    -									</ul>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -					<section id="conditional-expressions">
    -					    <title>Conditional expressions</title>
    -						<content><html>
    -							<p>
    -								Conditions or conditional expressions are widely used in SQL and in the jOOQ API. They can be used in
    -							</p>
    -							<ul>
    -								<li>The <reference id="case-expressions" title="CASE expression"/></li>
    -								<li>The <reference id="join-clause" title="JOIN clause"/> (or JOIN .. ON clause, to be precise) of a <reference id="select-statement" title="SELECT statement"/>, <reference id="update-statement" title="UPDATE statement"/>, <reference id="delete-statement" title="DELETE statement"/></li>
    -								<li>The <reference id="where-clause" title="WHERE clause"/> of a <reference id="select-statement" title="SELECT statement"/>, <reference id="update-statement" title="UPDATE statement"/>, <reference id="delete-statement" title="DELETE statement"/></li>
    -								<li>The <reference id="connect-by-clause" title="CONNECT BY clause"/> of a <reference id="select-statement" title="SELECT statement"/></li>
    -								<li>The <reference id="having-clause" title="HAVING clause"/> of a <reference id="select-statement" title="SELECT statement"/></li>
    -								<li>The <reference id="merge-statement" title="MERGE statement"/>'s ON clause</li>
    -							</ul>
    -							
    -							<h3>Boolean types in SQL</h3>
    -							<p>
    -								Before SQL:1999, boolean types did not really exist in SQL. They were modelled by 0 and 1 numeric/char values. With SQL:1999, true booleans were introduced and are now supported by most databases. In short, these are possible boolean values:
    -							</p>
    -							<ul>
    -								<li>1 or TRUE</li>
    -								<li>0 or FALSE</li>
    -								<li>NULL or UNKNOWN</li>
    -							</ul>
    -							<p>
    -								It is important to know that SQL differs from many other languages in the way it interprets the NULL boolean value. Most importantly, the following facts are to be remembered:
    -							</p>
    -							<ul>
    -								<li>[ANY] = NULL yields NULL (not FALSE)</li>
    -								<li>[ANY] != NULL yields NULL (not TRUE)</li>
    -								<li>NULL = NULL yields NULL (not TRUE)</li>
    -								<li>NULL != NULL yields NULL (not FALSE)</li>
    -							</ul>
    -							<p>
    -								For simplified NULL handling, please refer to the section about the <reference id="distinct-predicate" title="DISTINCT predicate"/>.
    -							</p>
    -							<p>
    -								Note that jOOQ does not model these values as actual <reference id="column-expressions" title="column expression"/> compatible.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -						    <section id="condition-building">
    -							    <title>Condition building</title>
    -								<content><html>
    -									<p>
    -										With jOOQ, most <reference id="conditional-expressions" title="conditional expressions"/> are built from <reference id="column-expressions" title="column expressions"/>, calling various methods on them. For instance, to build a <reference id="comparison-predicate" title="comparison predicate"/>, you can write the following expression:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[TITLE  = 'Animal Farm'
    -TITLE != 'Animal Farm']]></sql><java><![CDATA[BOOK.TITLE.equal("Animal Farm")
    -BOOK.TITLE.notEqual("Animal Farm")]]></java>
    -</code-pair><html>
    -
    -									<h3>Create conditions from the Factory</h3>
    -									<p>
    -										There are a few types of conditions, that can be created statically from the <reference id="factory" title="Factory"/>. These are:
    -									</p>
    -									<ul>
    -										<li><reference id="plain-sql" title="plain SQL conditions"/>, that allow you to phrase your own SQL string <reference id="conditional-expressions" title="conditional expression"/></li>
    -										<li>The <reference id="exists-predicate" title="EXISTS predicate"/>, a standalone predicate that creates a conditional expression</li>
    -										<li>Constant TRUE and FALSE conditional expressions</li>
    -									</ul>
    -
    -									<h3>Connect conditions using boolean operators</h3>
    -									<p>
    -										Conditions can also be connected using <reference id="boolean-operators" title="boolean operators"/> as will be discussed in a subsequent chapter.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -						    <section id="boolean-operators">
    -							    <title>AND, OR, NOT boolean operators</title>
    -								<content><html>
    -									<p>
    -										In SQL, as in most other languages, <reference id="conditional-expressions" title="conditional expressions"/> can be connected using the AND and OR binary operators, as well as the NOT unary operator, to form new conditional expressions. In jOOQ, this is modelled as such: 
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[-- A simple conditional expression
    -TITLE = 'Animal Farm' OR TITLE = '1984'
    -
    --- A more complex conditional expression
    -        (TITLE = 'Animal Farm' OR TITLE = '1984') 
    -AND NOT (AUTHOR.LAST_NAME = 'Orwell')]]></sql><java><![CDATA[// A simple boolean connection
    -BOOK.TITLE.equal("Animal Farm").or(BOOK.TITLE.equal("1984"))
    -
    -// A more complex conditional expression
    -BOOK.TITLE.equal("Animal Farm").or(BOOK.TITLE.equal("1984"))
    -    .andNot(AUTHOR.LAST_NAME.equal("Orwell"))]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										The above example shows that the number of parentheses in Java can quickly explode. Proper indentation may become crucial in making such code readable. In order to understand how jOOQ composes combined conditional expressions, let's assign component expressions first:
    -									</p>
    -
    -</html><java><![CDATA[Condition a = BOOK.TITLE.equal("Animal Farm");
    -Condition b = BOOK.TITLE.equal("1984");
    -Condition c = AUTHOR.LAST_NAME.equal("Orwell");
    -
    -Condition combined1 = a.or(b);             // These OR-connected conditions form a new condition, wrapped in parentheses
    -Condition combined2 = combined1.andNot(c); // The left-hand side of the AND NOT () operator is already wrapped in parentheses]]></java><html>
    -
    -									<h3>The Condition API</h3>
    -									<p>
    -										Here are all boolean operators on the <reference class="org.jooq.Condition"/> interface:
    -									</p>
    -									
    -</html><java><![CDATA[and(Condition)            // Combine conditions with AND
    -and(String)               // Combine conditions with AND. Convenience for adding plain SQL to the right-hand side
    -and(String, Object...)    // Combine conditions with AND. Convenience for adding plain SQL to the right-hand side
    -and(String, QueryPart...) // Combine conditions with AND. Convenience for adding plain SQL to the right-hand side
    -andExists(Select<?>)      // Combine conditions with AND. Convenience for adding an exists predicate to the rhs
    -andNot(Condition)         // Combine conditions with AND. Convenience for adding an inverted condition to the rhs
    -andNotExists(Select<?>)   // Combine conditions with AND. Convenience for adding an inverted exists predicate to the rhs
    -
    -or(Condition)             // Combine conditions with OR
    -or(String)                // Combine conditions with OR. Convenience for adding plain SQL to the right-hand side
    -or(String, Object...)     // Combine conditions with OR. Convenience for adding plain SQL to the right-hand side
    -or(String, QueryPart...)  // Combine conditions with OR. Convenience for adding plain SQL to the right-hand side
    -orExists(Select<?>)       // Combine conditions with OR. Convenience for adding an exists predicate to the rhs
    -orNot(Condition)          // Combine conditions with OR. Convenience for adding an inverted condition to the rhs
    -orNotExists(Select<?>)    // Combine conditions with OR. Convenience for adding an inverted exists predicate to the rhs
    -
    -not()                     // Invert a condition (synonym for Factory.not(Condition)]]></java></content>
    -							</section>
    -
    -						    <section id="comparison-predicate">
    -							    <title>Comparison predicate</title>
    -								<content><html>
    -									<p>
    -										In SQL, comparison predicates are formed using common comparison operators:
    -									</p>
    -									<ul>
    -										<li><strong>=</strong> to test for equality</li>
    -										<li><strong>&lt;&gt;</strong> or <strong>!=</strong> to test for non-equality</li>
    -										<li><strong>&gt;</strong> to test for being strictly greater</li>
    -										<li><strong>&gt;=</strong> to test for being greater or equal</li>
    -										<li><strong>&lt;</strong> to test for being strictly less</li>
    -										<li><strong>&lt;=</strong> to test for being less or equal</li>
    -									</ul>
    -									
    -									<p>
    -										Unfortunately, Java does not support operator overloading, hence these operators are also implemented as methods in jOOQ, like any other SQL syntax elements. The relevant parts of the <reference class="org.jooq.Field"/> interface are these:
    -									</p>
    -									
    -</html><java><![CDATA[eq or equal(T);                  // =  (some bind value)
    -eq or equal(Field<T>);           // =  (some column expression)
    -eq or equal(Select<T>);          // =  (some scalar SELECT statement)
    -ne or notEqual(T);               // <> (some bind value)
    -ne or notEqual(Field<T>);        // <> (some column expression)
    -ne or notEqual(Select<T>);       // <> (some scalar SELECT statement)
    -lt or lessThan(T);               // <  (some bind value)
    -lt or lessThan(Field<T>);        // <  (some column expression)
    -lt or lessThan(Select<T>);       // <  (some scalar SELECT statement)
    -le or lessOrEqual(T);            // <= (some bind value)
    -le or lessOrEqual(Field<T>);     // <= (some column expression)
    -le or lessOrEqual(Select<T>);    // <= (some scalar SELECT statement)
    -gt or greaterThan(T);            // >  (some bind value)
    -gt or greaterThan(Field<T>);     // >  (some column expression)
    -gt or greaterThan(Select<T>);    // >  (some scalar SELECT statement)
    -ge or greaterOrEqual(T);         // >= (some bind value)
    -ge or greaterOrEqual(Field<T>);  // >= (some column expression)
    -ge or greaterOrEqual(Select<T>); // >= (some scalar SELECT statement)]]></java><html>
    -
    -									<p>
    -										Note that every operator is represented by two methods. A verbose one (such as equal()) and a two-character one (such as eq()). Both methods are the same. You may choose either one, depending on your taste. The manual will always use the more verbose one.
    -									</p>
    -									
    -									<h3>NULL in jOOQ's comparison predicates</h3>
    -									<p>
    -										jOOQ has a special way of dealing with null bind values, when you pass them to comparison predicates equal() and notEqual(). For convenience, jOOQ will render <reference id="null-predicate" title="IS NULL or IS NOT NULL"/> predicates.
    -									</p>
    -
    -									<h3>jOOQ's convenience methods using comparison operators</h3>
    -									<p>
    -										In addition to the above, jOOQ provides a few convenience methods for common operations performed on strings using comparison predicates:
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[-- case insensitivity
    -LOWER(TITLE)  = LOWER('animal farm')
    -LOWER(TITLE) <> LOWER('animal farm')]]></sql><java><![CDATA[// case insensitivity
    -BOOK.TITLE.equalIgnoreCase("animal farm")
    -BOOK.TITLE.notEqualIgnoreCase("animal farm")]]></java>
    -</code-pair><html>
    -								</html></content>
    -							</section>
    -
    -						    <section id="quantified-comparison-predicate">
    -							    <title>Quantified comparison predicate</title>
    -								<content><html>
    -									<p>
    -										If the right-hand side of a <reference id="comparison-predicate" title="comparison predicate"/> turns out to be a non-scalar table subquery, you can wrap that subquery in a quantifier, such as ALL, ANY, or SOME. Note that the SQL standard defines ANY and SOME to be equivalent. jOOQ settled for the more intuitive ANY and doesn't support SOME. Here are some examples, supported by jOOQ:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[TITLE = ANY('Animal Farm', '1982')
    -PUBLISHED_IN > ALL(1920, 1940)]]></sql><java><![CDATA[BOOK.TITLE.equalAny("Animal Farm", "1982");
    -BOOK.PUBLISHED_IN.greaterThanAll(1920, 1940);]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										For the example, the right-hand side of the quantified comparison predicates were filled with argument lists. But it is easy to imagine that the source of values results from a <reference id="nested-selects" title="subselect"/>.
    -									</p>
    -
    -									<h3>ANY and the IN predicate</h3>
    -									<p>
    -										It is interesting to note that the SQL standard defines the <reference id="in-predicate" title="IN predicate"/> in terms of the ANY-quantified predicate. The following two expressions are equivalent:
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[[ROW VALUE EXPRESSION] IN [IN PREDICATE VALUE]]]></sql><sql><![CDATA[[ROW VALUE EXPRESSION] = ANY [IN PREDICATE VALUE]]]></sql>
    -</code-pair><html>
    -
    -									<p>
    -										Typically, the <reference id="in-predicate" title="IN predicate"/> is more readable than the quantified comparison predicate.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -						    <section id="null-predicate">
    -							    <title>NULL predicate</title>
    -								<content><html>
    -									<p>
    -										In SQL, you cannot compare NULL with any value using <reference id="comparison-predicate" title="comparison predicates"/>, as the result would yield NULL again, which is neither TRUE nor FALSE (see also the manual's section about <reference id="conditional-expressions" title="conditional expressions"/>). In order to test a <reference id="column-expressions" title="column expression"/> for NULL, use the NULL predicate as such:
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[TITLE IS NULL
    -TITLE IS NOT NULL]]></sql><java><![CDATA[BOOK.TITLE.isNull()
    -BOOK.TITLE.isNotNull()]]></java>
    -</code-pair><html>
    -
    -								</html></content>
    -							</section>
    -
    -						    <section id="distinct-predicate">
    -							    <title>DISTINCT predicate</title>
    -								<content><html>
    -									<p>
    -										Some databases support the DISTINCT predicate, which serves as a convenient, NULL-safe <reference id="comparison-predicate" title="comparison predicate"/>. With the DISTINCT predicate, the following truth table can be assumed:
    -									</p>
    -									<ul>
    -										<li>[ANY] IS DISTINCT FROM NULL yields TRUE</li>
    -										<li>[ANY] IS NOT DISTINCT FROM NULL yields FALSE</li>
    -										<li>NULL IS DISTINCT FROM NULL yields FALSE</li>
    -										<li>NULL IS NOT DISTINCT FROM NULL yields TRUE</li>
    -									</ul>
    -									<p>
    -										For instance, you can compare two fields for distinctness, ignoring the fact that any of the two could be NULL, which would lead to funny results. This is supported by jOOQ as such:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[TITLE IS DISTINCT FROM SUB_TITLE
    -TITLE IS NOT DISTINCT FROM SUB_TITLE]]></sql><java><![CDATA[BOOK.TITLE.isDistinctFrom(BOOK.SUB_TITLE)
    -BOOK.TITLE.isNotDistinctFrom(BOOK.SUB_TITLE)]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										If your database does not natively support the DISTINCT predicate, jOOQ simulates it with an equivalent <reference id="case-expressions" title="CASE expression"/>, modelling the above truth table:
    -									</p>
    -	
    -</html><code-pair>								
    -<sql><![CDATA[-- [A] IS DISTINCT FROM [B] 
    -CASE WHEN [A] IS     NULL AND [B] IS     NULL THEN FALSE
    -     WHEN [A] IS     NULL AND [B] IS NOT NULL THEN TRUE
    -     WHEN [A] IS NOT NULL AND [B] IS     NULL THEN TRUE
    -     WHEN [A] =               [B]             THEN FALSE
    -     ELSE                                          TRUE
    -END
    -]]></sql><sql><![CDATA[-- [A] IS NOT DISTINCT FROM [B] 
    -CASE WHEN [A] IS     NULL AND [B] IS     NULL THEN TRUE
    -     WHEN [A] IS     NULL AND [B] IS NOT NULL THEN FALSE
    -     WHEN [A] IS NOT NULL AND [B] IS     NULL THEN FALSE
    -     WHEN [A] =               [B]             THEN TRUE
    -     ELSE                                          FALSE
    -END
    -]]></sql>
    -</code-pair><html>							
    -								</html></content>
    -							</section>
    -
    -						    <section id="between-predicate">
    -							    <title>BETWEEN predicate</title>
    -								<content><html>
    -									<p>
    -										The BETWEEN predicate can be seen as syntactic sugar for a pair of <reference id="comparison-predicate" title="comparison predicates"/>. According to the SQL standard, the following two predicates are equivalent:
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[[A] BETWEEN [B] AND [C]]]></sql><sql><![CDATA[[A] >= [B] AND [A] <= [C]]]></sql>
    -</code-pair><html>
    -
    -									<p>
    -										Note the inclusiveness of range boundaries in the definition of the BETWEEN predicate. Intuitively, this is supported in jOOQ as such:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[PUBLISHED_IN     BETWEEN 1920 AND 1940
    -PUBLISHED_IN NOT BETWEEN 1920 AND 1940]]></sql><java><![CDATA[BOOK.PUBLISHED_IN.between(1920, 1940)
    -BOOK.PUBLISHED_IN.notBetween(1920, 1940)]]></java>
    -</code-pair><html>
    -
    -									<h3>BETWEEN SYMMETRIC</h3>
    -									<p>
    -										The SQL standard defines the SYMMETRIC keyword to be used along with BETWEEN to indicate that you do not care which bound of the range is larger than the other. A database system should simply swap range bounds, in case the first bound is greater than the second one. jOOQ supports this keyword as well, simulating it if necessary.
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[PUBLISHED_IN     BETWEEN SYMMETRIC 1940 AND 1920
    -PUBLISHED_IN NOT BETWEEN SYMMETRIC 1940 AND 1920]]></sql><java><![CDATA[BOOK.PUBLISHED_IN.betweenSymmetric(1940, 1920)
    -BOOK.PUBLISHED_IN.notBetweenSymmetric(1940, 1920)]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										The simulation is done trivially:
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[[A] BETWEEN SYMMETRIC [B] AND [C]]]></sql><sql><![CDATA[([A] BETWEEN [B] AND [C]) OR ([A] BETWEEN [C] AND [B])]]></sql>
    -</code-pair><html>
    -
    -								</html></content>
    -							</section>
    -
    -						    <section id="like-predicate">
    -							    <title>LIKE predicate</title>
    -								<content><html>
    -									<p>
    -										LIKE predicates are popular for simple wildcard-enabled pattern matching. Supported wildcards in all SQL databases are:
    -									</p>
    -									<ul>
    -										<li><strong>_</strong>: (single-character wildcard)</li>
    -										<li><strong>%</strong>: (multi-character wildcard)</li>
    -									</ul>
    -									<p>
    -										With jOOQ, the LIKE predicate can be created from any <reference id="column-expressions" title="column expression"/> as such:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[TITLE     LIKE '%abc%'
    -TITLE NOT LIKE '%abc%']]></sql><java><![CDATA[BOOK.TITLE.like("%abc%")
    -BOOK.TITLE.notLike("%abc%")]]></java>
    -</code-pair><html>
    -									
    -									<h3>Escaping operands with the LIKE predicate</h3>
    -									<p>
    -										Often, your pattern may contain any of the wildcard characters "_" and "%", in case of which you may want to escape them. jOOQ does not automatically escape patterns in like() and notLike() methods. Instead, you can explicitly define an escape character as such:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[TITLE     LIKE '%The !%-Sign Book%' ESCAPE '!'
    -TITLE NOT LIKE '%The !%-Sign Book%' ESCAPE '!']]></sql><java><![CDATA[BOOK.TITLE.like("%The !%-Sign Book%", '!')
    -BOOK.TITLE.notLike("%The !%-Sign Book%", '!')]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										In the above predicate expressions, the exclamation mark character is passed as the escape character to escape wildcard characters "!_" and "!%", as well as to escape the escape character itself: "!!"
    -									</p>
    -									<p>
    -										Please refer to your database manual for more details about escaping patterns with the LIKE predicate.
    -									</p>
    -									
    -									<h3>jOOQ's convenience methods using the LIKE predicate</h3>
    -									<p>
    -										In addition to the above, jOOQ provides a few convenience methods for common operations performed on strings using the LIKE predicate. Typical operations are "contains predicates", "starts with predicates", "ends with predicates", etc. Here is the full convenience API wrapping LIKE predicates:
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[-- case insensitivity
    -LOWER(TITLE) LIKE LOWER('%abc%')
    -LOWER(TITLE) NOT LIKE LOWER('%abc%')
    -
    --- contains and similar methods
    -TITLE LIKE '%' || 'abc' || '%'
    -TITLE LIKE 'abc' || '%'
    -TITLE LIKE '%' || 'abc']]></sql><java><![CDATA[// case insensitivity
    -BOOK.TITLE.likeIgnoreCase("%abc%")
    -BOOK.TITLE.notLikeIgnoreCase("%abc%")
    -
    -// contains and similar methods
    -BOOK.TITLE.contains("abc")
    -BOOK.TITLE.startsWith("abc")
    -BOOK.TITLE.endsWith("abc")]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										Note, that jOOQ escapes % and _ characters in value in some of the above predicate implementations. For simplicity, this has been omitted in this manual.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -						    <section id="in-predicate">
    -							    <title>IN predicate</title>
    -								<content><html>
    -									<p>
    -										In SQL, apart from comparing a value against several values, the IN predicate can be used to create semi-joins or anti-joins. jOOQ knows the following methods on the <reference class="org.jooq.Field" /> interface, to construct such IN predicates:
    -									</p>
    -
    -</html><java><![CDATA[in(Collection<T>)    // Construct an IN predicate from a collection of bind values
    -in(T...)             // Construct an IN predicate from bind values
    -in(Field<?>...)      // Construct an IN predicate from column expressions
    -in(Select<?>)        // Construct an IN predicate from a subselect
    -notIn(Collection<T>) // Construct a NOT IN predicate from a collection of bind values
    -notIn(T...)          // Construct a NOT IN predicate from bind values
    -notIn(Field<?>...)   // Construct a NOT IN predicate from column expressions
    -notIn(Select<?>)     // Construct a NOT IN predicate from a subselect]]></java><html>
    -
    -									<p>
    -										A sample IN predicate might look like this:
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[TITLE     IN ('Animal Farm', '1984')
    -TITLE NOT IN ('Animal Farm', '1984')]]></sql><java><![CDATA[BOOK.TITLE.in("Animal Farm", "1984")
    -BOOK.TITLE.notIn("Animal Farm", "1984")]]></java>
    -</code-pair><html>
    -
    -									
    -									<h3>NOT IN and NULL values</h3>
    -									<p>
    -										Beware that you should probably not have any NULL values in the right hand side of a NOT IN predicate, as the whole expression would evaluate to NULL, which is rarely desired. This can be shown informally using the following reasoning:
    -									</p>
    -									
    -</html><sql>-- The following conditional expressions are formally or informally equivalent
    -A NOT IN (B, C)
    -A != ANY(B, C)
    -A != B AND A != C
    -
    --- Substitute C for NULL, you'll get
    -A NOT IN (B, NULL)   -- Substitute C for NULL
    -A != B AND A != NULL -- From the above rules
    -A != B AND NULL      -- [ANY] != NULL yields NULL
    -NULL                 -- [ANY] AND NULL yields NULL</sql><html>
    -
    -									<p>
    -										A good way to prevent this from happening is to use the <reference id="exists-predicate" title="EXISTS predicate"/> for anti-joins, which is NULL-value insensitive. See the manual's section about <reference id="conditional-expressions" title="conditional expressions"/> to see a boolean truth table.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -						    <section id="exists-predicate">
    -							    <title>EXISTS predicate</title>
    -								<content><html>
    -									<p>
    -										Slightly less intuitive, yet more powerful than the previously discussed <reference id="in-predicate" title="IN predicate"/> is the EXISTS predicate, that can be used to form semi-joins or anti-joins. With jOOQ, the EXISTS predicate can be formed in various ways:
    -									</p>
    -									<ul>
    -										<li>From the <reference id="factory" title="Factory"/>, using static methods. This is probably the most used case</li>
    -										<li>From a <reference id="conditional-expressions" title="conditional expression"/> using <reference id="boolean-operators" title="convenience methods attached to boolean operators"/></li>
    -										<li>From a <reference id="select-statement" title="SELECT statement"/> using <reference id="where-clause" title="convenience methods attached to the where clause"/>, and from other clauses</li>
    -									</ul>
    -									
    -									<p>
    -										An example of an EXISTS predicate can be seen here:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[    EXISTS (SELECT 1 FROM BOOK 
    -            WHERE AUTHOR_ID = 3)
    -NOT EXISTS (SELECT 1 FROM BOOK 
    -            WHERE AUTHOR_ID = 3)]]></sql><java><![CDATA[   exists(create.selectOne().from(BOOK)
    -                .where(BOOK.AUTHOR_ID.equal(3)));
    -notExists(create.selectOne().from(BOOK)
    -                .where(BOOK.AUTHOR_ID.equal(3)));]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										Note that in SQL, the projection of a subselect in an EXISTS predicate is irrelevant. To help you write queries like the above, you can use jOOQ's selectZero() or selectOne() <reference id="factory" title="Factory"/> methods
    -									</p>
    -									
    -									<h3>Performance of IN vs. EXISTS</h3>
    -									<p>
    -										In theory, the two types of predicates can perform equally well. If your database system ships with a sophisticated cost-based optimiser, it will be able to transform one predicate into the other, if you have all necessary constraints set (e.g. referential constraints, not null constraints). However, in reality, performance between the two might differ substantially. An interesting blog post investigating this topic on the MySQL database can be seen here:<br/>
    -										<a href="http://blog.jooq.org/2012/07/27/not-in-vs-not-exists-vs-left-join-is-null-mysql/">http://blog.jooq.org/2012/07/27/not-in-vs-not-exists-vs-left-join-is-null-mysql/</a>
    -									</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -					<section id="plain-sql">
    -						<title>Plain SQL</title>
    -						<content><html>
    -							<p>
    -								A DSL is a nice thing to have, it feels "fluent" and "natural", especially if it models a well-known language, such as SQL. But a DSL is always expressed in a host language (Java in this case), which was not made for exactly the same purposes as its hosted DSL. If it were, then jOOQ would be implemented on a compiler-level, similar to LINQ in .NET. But it's not, and so, the DSL is limited by language constraints of its host language. We have seen many functionalities where the DSL becomes a bit verbose. This can be especially true for:
    -							</p>
    -							<ul>
    -								<li><reference id="aliased-columns" title="aliasing"/></li>
    -								<li><reference id="nested-selects" title="nested selects"/></li>
    -								<li><reference id="arithmetic-expressions" title="arithmetic expressions"/></li>
    -								<li><reference id="cast-expressions" title="casting"/></li>
    -							</ul>
    -							
    -							<p>
    -								You'll probably find other examples. If verbosity scares you off, don't worry. The verbose use-cases for jOOQ are rather rare, and when they come up, you do have an option. Just write SQL the way you're used to!
    -							</p>
    -							<p>
    -								jOOQ allows you to embed SQL as a String into any supported <reference id="sql-statements" title="statement"/> in these contexts:
    -							</p>
    -							<ul>
    -								<li>Plain SQL as a <reference id="conditional-expressions" title="conditional expression"/></li>
    -								<li>Plain SQL as a <reference id="column-expressions" title="column expression"/></li>
    -								<li>Plain SQL as a <reference id="column-expressions" title="function"/></li>
    -								<li>Plain SQL as a <reference id="table-expressions" title="table expression"/></li>
    -								<li>Plain SQL as a <reference id="query-vs-resultquery" title="query"/></li>
    -							</ul>
    -
    -							<h3>The Factory plain SQL API</h3>
    -							<p>
    -								Plain SQL API methods are usually overloaded in three ways. Let's look at the <code>condition</code> query part constructor:
    -							</p>
    -</html><java><![CDATA[// Construct a condition without bind values
    -// Example: condition("a = b")
    -Condition condition(String sql);
    -
    -// Construct a condition with bind values
    -// Example: condition("a = ?", 1);
    -Condition condition(String sql, Object... bindings);
    -
    -// Construct a condition taking other jOOQ object arguments
    -// Example: condition("a = {0}", val(1));
    -Condition condition(String sql, QueryPart... parts);]]></java><html>
    -							
    -							<p>
    -								Please refer to the <reference class="org.jooq.impl.Factory"/> Javadoc for more details. The following is a more complete listing of plain SQL construction methods from the Factory:
    -							</p>
    -
    -</html><java><![CDATA[// A condition
    -Condition condition(String sql);
    -Condition condition(String sql, Object... bindings);
    -Condition condition(String sql, QueryPart... parts);
    -
    -// A field with an unknown data type
    -Field<Object> field(String sql);
    -Field<Object> field(String sql, Object... bindings);
    -Field<Object> field(String sql, QueryPart... parts);
    -
    -// A field with a known data type
    -<T> Field<T> field(String sql, Class<T> type);
    -<T> Field<T> field(String sql, Class<T> type, Object... bindings);
    -<T> Field<T> field(String sql, Class<T> type, QueryPart... parts);
    -<T> Field<T> field(String sql, DataType<T> type);
    -<T> Field<T> field(String sql, DataType<T> type, Object... bindings);
    -<T> Field<T> field(String sql, DataType<T> type, QueryPart... parts);
    -
    -// A field with a known name (properly escaped)
    -Field<Object> fieldByName(String... fieldName);
    -<T> Field<T>  fieldByName(Class<T> type, String... fieldName);
    -<T> Field<T>  fieldByName(DataType<T> type, String... fieldName)
    -
    -// A function
    -<T> Field<T> function(String name, Class<T> type, Field<?>... arguments);
    -<T> Field<T> function(String name, DataType<T> type, Field<?>... arguments);
    -
    -// A table
    -Table<?> table(String sql);
    -Table<?> table(String sql, Object... bindings);
    -Table<?> table(String sql, QueryPart... parts);
    -
    -// A table with a known name (properly escaped)
    -Table<Record> tableByName(String... fieldName);
    -
    -// A query without results (update, insert, etc)
    -Query query(String sql);
    -Query query(String sql, Object... bindings);
    -Query query(String sql, QueryPart... parts);
    -
    -// A query with results
    -ResultQuery<Record> resultQuery(String sql);
    -ResultQuery<Record> resultQuery(String sql, Object... bindings);
    -ResultQuery<Record> resultQuery(String sql, QueryPart... parts);
    -
    -// A query with results. This is the same as resultQuery(...).fetch();
    -Result<Record> fetch(String sql);
    -Result<Record> fetch(String sql, Object... bindings);
    -Result<Record> fetch(String sql, QueryPart... parts);]]></java><html>
    -
    -							<p>
    -								Apart from the general factory methods, plain SQL is also available in various other contexts. For instance, when adding a .where("a = b") clause to a query. Hence, there exist several convenience methods where plain SQL can be inserted usefully. This is an example displaying all various use-cases in one single query:
    -							</p>
    -							
    -</html><java><![CDATA[// You can use your table aliases in plain SQL fields
    -// As long as that will produce syntactically correct SQL
    -Field<?> LAST_NAME    = create.field("a.LAST_NAME");
    -
    -// You can alias your plain SQL fields
    -Field<?> COUNT1       = create.field("count(*) x");
    -
    -// If you know a reasonable Java type for your field, you
    -// can also provide jOOQ with that type
    -Field<Integer> COUNT2 = create.field("count(*) y", Integer.class);
    -
    -       // Use plain SQL as select fields
    -create.select(LAST_NAME, COUNT1, COUNT2)
    -
    -       // Use plain SQL as aliased tables (be aware of syntax!)
    -      .from("author a")
    -      .join("book b")
    -
    -       // Use plain SQL for conditions both in JOIN and WHERE clauses
    -      .on("a.id = b.author_id")
    -
    -       // Bind a variable in plain SQL
    -      .where("b.title != ?", "Brida")
    -
    -       // Use plain SQL again as fields in GROUP BY and ORDER BY clauses
    -      .groupBy(LAST_NAME)
    -      .orderBy(LAST_NAME);]]></java><html>
    -
    -							<h3>Important things to note about plain SQL!</h3>
    -							<p>
    -								There are some important things to keep in mind when using plain SQL:
    -							</p>
    -							<ul>
    -								<li>jOOQ doesn't know what you're doing. You're on your own again!</li>
    -								<li>You have to provide something that will be syntactically correct. If it's not, then jOOQ won't know. Only your JDBC driver or your RDBMS will detect the syntax error.</li>
    -								<li>You have to provide consistency when you use variable binding. The number of ? must match the number of variables</li>
    -								<li>Your SQL is inserted into jOOQ queries without further checks. Hence, jOOQ can't prevent SQL injection. </li>
    -							</ul>
    -						</html></content>
    -					</section>
    -
    -					<section id="bind-values">
    -					    <title>Bind values and parameters</title>
    -						<content><html>
    -							<p>
    -								Bind values are used in SQL / JDBC for various reasons. Among the most obvious ones are:
    -							</p>
    -							<ul>
    -								<li>
    -									Protection against SQL injection. Instead of inlining values possibly originating from user input, you bind those values to your prepared statement and let the JDBC driver / database take care of handling security aspects.
    -								</li>
    -								<li>
    -									Increased speed. Advanced databases such as Oracle can keep execution plans of similar queries in a dedicated cache to prevent hard-parsing your query again and again. In many cases, the actual value of a bind variable does not influence the execution plan, hence it can be reused. Preparing a statement will thus be faster
    -								</li>
    -								<li>
    -									On a JDBC level, you can also reuse the SQL string and prepared statement object instead of constructing it again, as you can bind new values to the prepared statement. jOOQ currently does not cache prepared statements, internally.
    -								</li>
    -							</ul>
    -							
    -							<p>
    -								The following sections explain how you can introduce bind values in jOOQ, and how you can control the way they are rendered and bound to SQL.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -						    <section id="indexed-parameters">
    -							    <title>Indexed parameters</title>
    -								<content><html>
    -									<p>
    -										JDBC only knows indexed bind values. A typical example for using bind values with JDBC is this:
    -									</p>
    -									
    -</html><java><![CDATA[PreparedStatement stmt = connection.prepareStatement("SELECT * FROM BOOK WHERE ID = ? AND TITLE = ?");
    -
    -// bind values to the above statement for appropriate indexes 
    -stmt.setInt(1, 5);
    -stmt.setString(2, "Animal Farm");
    -stmm.executeQuery();]]></java><html>
    -
    -									<p>
    -										With dynamic SQL, keeping track of the number of question marks and their corresponding index may turn out to be hard. jOOQ abstracts this and lets you provide the bind value right where it is needed. A trivial example is this:
    -									</p>
    -									
    -</html><java><![CDATA[create.select().from(BOOK).where(BOOK.ID.equal(5)).and(BOOK.TITLE.equal("Animal Farm"));
    -
    -// This notation is in fact a short form for the equivalent:
    -create.select().from(BOOK).where(BOOK.ID.equal(val(5))).and(BOOK.TITLE.equal(val("Animal Farm")));]]></java><html>
    -
    -									<p>
    -										Note the using of <reference class="org.jooq.impl.Factory" anchor="#val(java.lang.Object)" title="Factory.val()"/> to explicitly create an indexed bind value. You don't have to worry about that index. When the query is <reference id="sql-rendering" title="rendered"/>, each bind value will render a question mark. When the query <reference id="variable-binding" title="binds its variables"/>, each bind value will generate the appropriate bind value index. 
    -									</p>
    -									
    -									<h3>Extract bind values from a query</h3>
    -									<p>
    -										Should you decide to run the above query outside of jOOQ, using your own <reference class="java.sql.PreparedStatement"/>, you can do so as follows:
    -									</p>
    -									
    -</html><java><![CDATA[Select<?> select = create.select().from(BOOK).where(BOOK.ID.equal(5)).and(BOOK.TITLE.equal("Animal Farm"));
    -
    -// Render the SQL statement:
    -String sql = select.getSQL();
    -assertEquals("SELECT * FROM BOOK WHERE ID = ? AND TITLE = ?", sql);
    -
    -// Get the bind values:
    -List<Object> values = select.getBindValues();
    -assertEquals(2, values.size());
    -assertEquals(5, values.get(0));
    -assertEquals("Animal Farm", values.get(1));]]></java><html>
    -
    -									<p>
    -										You can also extract specific bind values by index from a query, if you wish to modify their underlying value after creating a query. This can be achieved as such:
    -									</p>
    -
    -</html><java><![CDATA[Select<?> select = create.select().from(BOOK).where(BOOK.ID.equal(5)).and(BOOK.TITLE.equal("Animal Farm"));
    -Param<?> param = select.getParam("2");
    -
    -// You could now modify the Query's underlying bind value:
    -if ("Animal Farm".equals(param.getValue())) {
    -    param.setConverted("1984");
    -}]]></java><html>
    -
    -									<p>
    -										For more details about jOOQ's internals, see the manual's section about <reference id="queryparts" title="QueryParts"/>.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -						    <section id="named-parameters">
    -							    <title>Named parameters</title>
    -								<content><html>
    -									<p>
    -										Some SQL access abstractions that are built on top of JDBC, or some that bypass JDBC may support named parameters. jOOQ allows you to give names to your parameters as well, although those names are not rendered to SQL strings by default. Here is an example of how to create named parameters using the <reference class="org.jooq.Param"/> type:
    -									</p>
    -
    -</html><java><![CDATA[// Create a query with a named parameter. You can then use that name for accessing the parameter again
    -Query query1 = create.select().from(AUTHOR).where(LAST_NAME.equal(param("lastName", "Poe")));
    -Param<?> param1 = query.getParam("lastName");
    -
    -// Or, keep a reference to the typed parameter in order not to lose the <T> type information:
    -Param<String> param2 = param("lastName", "Poe");
    -Query query2 = create.select().from(AUTHOR).where(LAST_NAME.equal(param2));
    -
    -// You can now change the bind value directly on the Param reference:
    -param2.setValue("Orwell");]]></java><html>
    -
    -									<p>
    -										The <reference class="org.jooq.Query"/> interface also allows for setting new bind values directly, without accessing the Param type:
    -									</p>
    -
    -</html><java><![CDATA[Query query1 = create.select().from(AUTHOR).where(LAST_NAME.equal("Poe"));
    -query1.bind(1, "Orwell");
    -
    -// Or, with named parameters
    -Query query2 = create.select().from(AUTHOR).where(LAST_NAME.equal(param("lastName", "Poe")));
    -query2.bind("lastName", "Orwell");]]></java><html>
    -
    -									<p>
    -										In order to actually render named parameter names in generated SQL, use the <reference class="org.jooq.impl.Factory" anchor="#renderNamedParams(org.jooq.QueryPart)" title="Factory.renderNamedParams()"/> method:
    -									</p>
    -
    -</html><code-pair>
    -<java><![CDATA[create.renderNamedParams(
    -    create.select()
    -          .from(AUTHOR)
    -          .where(LAST_NAME.equal(
    -                 param("lastName", "Poe"))));]]></java><sql><![CDATA[-- The named bind variable can be rendered
    -
    -SELECT *
    -FROM AUTHOR
    -WHERE LAST_NAME = :lastName]]></sql>
    -</code-pair><html>
    -								</html></content>
    -							</section>
    -
    -						    <section id="inlined-parameters">
    -							    <title>Inlined parameters</title>
    -								<content><html>
    -									<p>
    -										Sometimes, you may wish to avoid rendering bind variables while still using custom values in SQL. jOOQ refers to that as "inlined" bind values. When bind values are inlined, they render the actual value in SQL rather than a JDBC question mark. Bind value inlining can be achieved in two ways:
    -									</p>
    -									<ul>
    -										<li>
    -											By using the <reference id="custom-settings" title="Settings"/> and setting the <reference class="org.jooq.conf.StatementType"/> to STATIC_STATEMENT. This will inline all bind values for SQL statements rendered from such a Factory.
    -										</li>
    -										<li>
    -											By using <reference class="org.jooq.impl.Factory" anchor="#inline(java.lang.Object)" title="Factory.inline()"/> methods.
    -										</li>
    -									</ul>
    -									<p>
    -										In both cases, your inlined bind values will be properly escaped to avoid SQL syntax errors and SQL injection. Some examples:
    -									</p>
    -
    -</html><java><![CDATA[
    -// Use dedicated calls to inline() in order to specify
    -// single bind values to be rendered as inline values
    -// --------------------------------------------------
    -create.select()
    -      .from(AUTHOR)
    -      .where(LAST_NAME.equal(inline("Poe")));
    -
    -// Or render the whole query with inlined values
    -// --------------------------------------------------
    -Settings settings = new Settings()
    -    .withStatementType(StatementType.STATIC_STATEMENT);
    -
    -// Add the settings to the factory
    -Factory create = new Factory(connection, SQLDialect.ORACLE, settings);
    -
    -// Run queries that omit rendering schema names
    -create.select()
    -      .from(AUTHOR)
    -      .where(LAST_NAME.equal("Poe"));]]></java></content>
    -							</section>
    -
    -						    <section id="sql-injection-and-plain-sql-queryparts">
    -							    <title>SQL injection and plain SQL QueryParts</title>
    -								<content><html>
    -									<p>
    -										Special care needs to be taken when using <reference id="plain-sql" title="plain SQL QueryParts"/>. While jOOQ's API allows you to specify bind values for use with plain SQL, you're not forced to do that. For instance, both of the following queries will lead to the same, valid result:
    -									</p>
    -									
    -</html><java><![CDATA[// This query will use bind values, internally.
    -create.fetch("SELECT * FROM BOOK WHERE ID = ? AND TITLE = ?", 5 "Animal Farm");
    -
    -// This query will not use bind values, internally.
    -create.fetch("SELECT * FROM BOOK WHERE ID = 5 AND TITLE = 'Animal Farm'");]]></java><html>
    -
    -									<p>
    -										All methods in the jOOQ API that allow for plain (unescaped, untreated) SQL contain a warning message in their relevant Javadoc, to remind you of the risk of SQL injection in what is otherwise a SQL-injection-safe API.
    -									</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -					<section id="queryparts">
    -					    <title>QueryParts</title>
    -						<content><html>
    -							<p>
    -								A <reference class="org.jooq.Query" /> and all its contained objects is a <reference class="org.jooq.QueryPart" />. QueryParts essentially provide this functionality:
    -							</p>
    -							<ul>
    -								<li>they can <reference id="sql-rendering" title="render SQL"/> using the <reference class="org.jooq.QueryPartInternal" anchor="#toSQL(org.jooq.RenderContext)" title="toSQL(RenderContext)"/> method</li>
    -								<li>they can <reference id="variable-binding" title="bind variables"/> using the <reference class="org.jooq.QueryPartInternal" anchor="#bind(org.jooq.BindContext)" title="bind(BindContext)"/> method</li>
    -							</ul>
    -
    -							<p>
    -								Both of these methods are contained in jOOQ's internal API's <reference class="org.jooq.QueryPartInternal"/>, which is internally implemented by every QueryPart.
    -							</p>
    -
    -							<p>
    -								The following sections explain some more details about <reference id="sql-rendering" title="SQL rendering"/> and <reference id="variable-binding" title="variable binding"/>, as well as other implementation details about QueryParts in general.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -						    <section id="sql-rendering">
    -							    <title>SQL rendering</title>
    -								<content><html>
    -									<p>
    -										Every <reference class="org.jooq.QueryPart"/> must implement the <reference class="org.jooq.QueryPartInternal" anchor="#toSQL(org.jooq.RenderContext)" title="toSQL(RenderContext)"/> method to render its SQL string to a <reference class="org.jooq.RenderContext"/>. This RenderContext has two purposes:
    -									</p>
    -									<ul>
    -										<li>It provides some information about the "state" of SQL rendering.</li>
    -										<li>It provides a common API for constructing SQL strings on the context's internal <reference class="java.lang.StringBuilder"/></li>
    -									</ul>
    -									<p>
    -										An overview of the <reference class="org.jooq.RenderContext"/> API is given here:
    -									</p>
    -
    -</html><java><![CDATA[// These methods are useful for generating unique aliases within a RenderContext (and thus within a Query)
    -String peekAlias();
    -String nextAlias();
    -
    -// These methods return rendered SQL
    -String render();
    -String render(QueryPart part);
    -
    -// These methods allow for fluent appending of SQL to the RenderContext's internal StringBuilder
    -RenderContext keyword(String keyword);
    -RenderContext literal(String literal);
    -RenderContext sql(String sql);
    -RenderContext sql(char sql);
    -RenderContext sql(int sql);
    -RenderContext sql(QueryPart part);
    -
    -// These methods allow for controlling formatting of SQL, if the relevant Setting is active
    -RenderContext formatNewLine();
    -RenderContext formatSeparator();
    -RenderContext formatIndentStart();
    -RenderContext formatIndentStart(int indent);
    -RenderContext formatIndentLockStart();
    -RenderContext formatIndentEnd();
    -RenderContext formatIndentEnd(int indent);
    -RenderContext formatIndentLockEnd();
    -
    -// These methods control the RenderContext's internal state
    -boolean       inline();
    -RenderContext inline(boolean inline);
    -boolean       qualify();
    -RenderContext qualify(boolean qualify);
    -boolean       namedParams();
    -RenderContext namedParams(boolean renderNamedParams);
    -CastMode      castMode();
    -RenderContext castMode(CastMode mode);
    -Boolean       cast();
    -RenderContext castModeSome(SQLDialect... dialects);]]></java><html>
    -
    -									<p>
    -										The following additional methods are inherited from a common <reference class="org.jooq.Context"/>, which is shared among <reference class="org.jooq.RenderContext"/> and <reference class="org.jooq.BindContext"/>:
    -									</p>
    -
    -</html><java><![CDATA[// These methods indicate whether fields or tables are being declared (MY_TABLE AS MY_ALIAS) or referenced (MY_ALIAS)
    -boolean declareFields();
    -Context declareFields(boolean declareFields);
    -boolean declareTables();
    -Context declareTables(boolean declareTables);
    -
    -// These methods indicate whether a top-level query is being rendered, or a subquery
    -boolean subquery();
    -Context subquery(boolean subquery);
    -
    -// These methods provide the bind value indices within the scope of the whole Context (and thus of the whole Query)
    -int nextIndex();
    -int peekIndex();]]></java><html>
    -
    -									<h3>An example of rendering SQL</h3>
    -								   	<p>
    -								   		A simple example can be provided by checking out jOOQ's internal representation of a (simplified) <reference id="comparison-predicate" title="CompareCondition"/>. It is used for any <reference class="org.jooq.Condition"/> comparing two fields as for example the AUTHOR.ID = BOOK.AUTHOR_ID condition here:
    -							   		</p>
    -							   		
    -</html><sql>-- [...]
    -FROM AUTHOR
    -JOIN BOOK ON AUTHOR.ID = BOOK.AUTHOR_ID
    --- [...]</sql><html>
    -
    -									<p>
    -										This is how jOOQ renders such a condition:
    -									</p>
    -
    -</html><java><![CDATA[@Override
    -public final void toSQL(RenderContext context) {
    -    // The CompareCondition delegates rendering of the Fields to the Fields
    -    // themselves and connects them using the Condition's comparator operator:
    -    context.sql(field1)
    -           .sql(" ");
    -
    -    // If the second field is null, some convenience behaviour can be
    -    // implemented here
    -    if (field2.isNullLiteral()) {
    -        switch (comparator) {
    -            case EQUALS:
    -                context.sql("is null");
    -                break;
    -
    -            case NOT_EQUALS:
    -                context.sql("is not null");
    -                break;
    -
    -            default:
    -                throw new IllegalStateException("Cannot compare null with " + comparator);
    -        }
    -    }
    -
    -    // By default, also delegate the right hand side's SQL rendering to the
    -    // underlying field
    -    else {
    -        context.sql(comparator.toSQL())
    -               .sql(" ")
    -               .sql(field2);
    -    }
    -}]]></java><html>
    -
    -									<p>
    -										See the manual's sections about <reference id="custom-queryparts" title="custom QueryParts"/> and <reference id="plain-sql-queryparts" title="plain SQL QueryParts"/> to learn about how to write your own query parts in order to extend jOOQ.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -						    <section id="variable-binding">
    -							    <title>Variable binding</title>
    -								<content><html>
    -									<p>
    -										Every <reference class="org.jooq.QueryPart"/> must implement the <reference class="org.jooq.QueryPartInternal" anchor="#bind(org.jooq.BindContext)" title="bind(BindContext)"/> method. This BindContext has two purposes:
    -									</p>
    -									<ul>
    -										<li>It provides some information about the "state" of the variable binding in process.</li>
    -										<li>It provides a common API for binding values to the context's internal <reference class="java.sql.PreparedStatement"/></li>
    -									</ul>
    -									<p>
    -										An overview of the <reference class="org.jooq.RenderContext"/> API is given here:
    -									</p>
    -
    -</html><java><![CDATA[// This method provides access to the PreparedStatement to which bind values are bound
    -PreparedStatement statement();
    -
    -// These methods provide convenience to delegate variable binding
    -BindContext bind(QueryPart part) throws DataAccessException;
    -BindContext bind(Collection<? extends QueryPart> parts) throws DataAccessException;
    -BindContext bind(QueryPart[] parts) throws DataAccessException;
    -
    -// These methods perform the actual variable binding
    -BindContext bindValue(Object value, Class<?> type) throws DataAccessException;
    -BindContext bindValues(Object... values) throws DataAccessException;]]></java><html>
    -
    -									<p>
    -										Some additional methods are inherited from a common <reference class="org.jooq.Context"/>, which is shared among <reference class="org.jooq.RenderContext"/> and <reference class="org.jooq.BindContext"/>. Details are documented in the previous chapter about <reference id="sql-rendering" title="SQL rendering"/>
    -									</p>
    -
    -									<h3>An example of binding values to SQL</h3>
    -								   	<p>
    -								   		A simple example can be provided by checking out jOOQ's internal representation of a (simplified) <reference id="comparison-predicate" title="CompareCondition"/>. It is used for any <reference class="org.jooq.Condition"/> comparing two fields as for example the AUTHOR.ID = BOOK.AUTHOR_ID condition here:
    -							   		</p>
    -							   		
    -</html><sql>-- [...]
    -WHERE AUTHOR.ID = ?
    --- [...]</sql><html>
    -
    -									<p>
    -										This is how jOOQ binds values on such a condition:
    -									</p>
    -</html><java><![CDATA[@Override
    -public final void bind(BindContext context) throws DataAccessException {
    -    // The CompareCondition itself does not bind any variables.
    -    // But the two fields involved in the condition might do so...
    -    context.bind(field1).bind(field2);
    -}]]></java><html>
    -
    -									<p>
    -										See the manual's sections about <reference id="custom-queryparts" title="custom QueryParts"/> and <reference id="plain-sql-queryparts" title="plain SQL QueryParts"/> to learn about how to write your own query parts in order to extend jOOQ.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -						    <section id="custom-queryparts">
    -							    <title>Extend jOOQ with custom types</title>
    -								<content><html>
    -									<p>
    -										If a SQL clause is too complex to express with jOOQ, you can extend either one of the following types for use directly in a jOOQ query:
    -									</p>
    -									
    -</html><java><![CDATA[public abstract class CustomField<T> extends AbstractField<T> {}
    -public abstract class CustomCondition extends AbstractCondition {}
    -public abstract class CustomTable<R extends TableRecord<R>> extends TableImpl<R> {}
    -public abstract class CustomRecord<R extends TableRecord<R>> extends TableRecordImpl<R> {}]]></java><html>
    -
    -									<p>
    -										These classes are declared public and covered by jOOQ's integration tests. When you extend these classes, you will have to provide your own implementations for the <reference id="queryparts" title="QueryParts'"/> <reference id="sql-rendering" title="toSQL()"/> and <reference id="variable-binding" title="bind()"/> methods, as discussed before:
    -									</p>
    -									
    -</html><java><![CDATA[// This method must produce valid SQL. If your QueryPart contains other QueryParts, you may delegate SQL generation to them
    -// in the correct order, passing the render context.
    -//
    -// If context.inline() is true, you must inline all bind variables
    -// If context.inline() is false, you must generate ? for your bind variables
    -public void toSQL(RenderContext context);
    -
    -// This method must bind all bind variables to a PreparedStatement. If your QueryPart contains other QueryParts, $
    -// you may delegate variable binding to them in the correct order, passing the bind context.
    -//
    -// Every QueryPart must ensure, that it starts binding its variables at context.nextIndex().
    -public void bind(BindContext context) throws DataAccessException;]]></java><html>
    -
    -									<p>
    -										The above contract may be a bit tricky to understand at first. The best thing is to check out jOOQ source code and have a look at a couple of QueryParts, to see how it's done. Here's an example <reference class="org.jooq.impl.CustomField"/> showing how to create a field multiplying another field by 2
    -									</p>
    -									
    -</html><java><![CDATA[// Create an anonymous CustomField, initialised with BOOK.ID arguments
    -final Field<Integer> IDx2 = new CustomField<Integer>(BOOK.ID.getName(), BOOK.ID.getDataType()) {
    -    @Override
    -    public void toSQL(RenderContext context) {
    -    
    -        // In inline mode, render the multiplication directly
    -        if (context.inline()) {
    -            context.sql(BOOK.ID).sql(" * 2");
    -        }
    -        
    -        // In non-inline mode, render a bind value
    -        else {
    -            context.sql(BOOK.ID).sql(" * ?");
    -        }
    -    }
    -
    -    @Override
    -    public void bind(BindContext context) {
    -        try {
    -        
    -            // Manually bind the value 2
    -            context.statement().setInt(context.nextIndex(), 2);
    -            
    -            // Alternatively, you could also write:
    -            // context.bind(Factory.val(2));
    -        }
    -        catch (SQLException e) {
    -            throw translate(getSQL(), e);
    -        }
    -    }
    -};
    -
    -// Use the above field in a SQL statement:
    -create.select(IDx2).from(BOOK);]]></java></content>
    -							</section>
    -
    -						    <section id="plain-sql-queryparts">
    -							    <title>Plain SQL QueryParts</title>
    -								<content><html>
    -									<p>
    -										If you don't need the integration of rather complex QueryParts into jOOQ, then you might be safer using simple <reference id="plain-sql" title="Plain SQL"/> functionality, where you can provide jOOQ with a simple String representation of your embedded SQL. Plain SQL methods in jOOQ's API come in two flavours. 
    -									</p>
    -									<ul>
    -										<li><strong>method(String, Object...)</strong>: This is a method that accepts a SQL string and a list of bind values that are to be bound to the variables contained in the SQL string</li>
    -										<li><strong>method(String, QueryPart...)</strong>: This is a method that accepts a SQL string and a list of QueryParts that are "injected" at the position of their respective placeholders in the SQL string</li>
    -									</ul>
    -									<p>
    -										The above distinction is best explained using an example:
    -									</p>
    -									
    -</html><java><![CDATA[// Plain SQL using bind values. The value 5 is bound to the first variable, "Animal Farm" to the second variable:
    -create.selectFrom(BOOK).where("BOOK.ID = ? AND TITLE = ?", 5, "Animal Farm");
    -
    -// Plain SQL using placeholders (counting from zero). 
    -// The QueryPart "id" is substituted for the placeholder {0}, the QueryPart "title" for {1}
    -Field<Integer> id   = val(5);
    -Field<String> title = val("Animal Farm");
    -create.selectFrom(BOOK).where("BOOK.ID = {0} AND TITLE = {1}", id, title);]]></java><html>
    -
    -									<p>
    -										The above technique allows for creating rather complex SQL clauses that are currently not supported by jOOQ, without extending any of the <reference id="custom-queryparts" title="custom QueryParts"/> as indicated in the previous chapter.
    -									</p>									
    -								</html></content>
    -							</section>
    -
    -						    <section id="serializability">
    -							    <title>Serializability</title>
    -								<content><html>
    -									<p>
    -										The only transient, non-serializable element in any jOOQ object is the <reference id="factory" title="Factory's"/> underlying <reference class="java.sql.Connection"/>. When you want to execute queries after de-serialisation, or when you want to store/refresh/delete <reference id="crud-with-updatablerecords" title="Updatable Records"/>, you will have to "re-attach" them to a Factory
    -									</p>
    -
    -</html><java><![CDATA[// Deserialise a SELECT statement
    -ObjectInputStream in = new ObjectInputStream(...);
    -Select<?> select = (Select<?>) in.readObject();
    -
    -// This will throw a DetachedException:
    -select.execute();
    -
    -// In order to execute the above select, attach it first
    -Factory create = new Factory(connection, SQLDialect.ORACLE);
    -create.attach(select);]]></java><html>
    -
    -									<h3>Automatically attaching QueryParts</h3>
    -									<p>
    -										Another way of attaching QueryParts automatically, or rather providing them with a new <reference class="java.sql.Connection"/> at will, is to hook into the <reference id="execute-listeners" title="Execute Listener support"/>. More details about this can be found in the manual's chapter about <reference id="execute-listeners" title="ExecuteListeners"/>
    -									</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -				</sections>
    -			</section>
    -
    -			<section id="sql-execution">
    -				<title>SQL execution</title>
    -				<content><html>
    -					<p>
    -						In a previous section of the manual, we've seen how jOOQ can be used to <reference id="sql-building" title="build SQL"/> that can be executed with any API including JDBC or ... jOOQ. This section of the manual deals with various means of actually executing SQL with jOOQ.
    -					</p>
    -					
    -					<h3>SQL execution with JDBC</h3>
    -					<p>
    -						JDBC calls executable objects "<reference class="java.sql.Statement"/>". It distinguishes between three types of statements:
    -					</p>
    -					<ul>
    -						<li><reference class="java.sql.Statement"/>, or "static statement": This statement type is used for any arbitrary type of SQL statement. It is particularly useful with <reference id="inlined-parameters" title="inlined parameters"/></li>
    -						<li><reference class="java.sql.PreparedStatement"/>: This statement type is used for any arbitrary type of SQL statement. It is particularly useful with <reference id="indexed-parameters" title="indexed parameters"/> (note that JDBC does not support <reference id="named-parameters" title="named parameters"/>)</li>
    -						<li><reference class="java.sql.CallableStatement"/>: This statement type is used for SQL statements that are "called" rather than "executed". In particular, this includes calls to <reference id="stored-procedures" title="stored procedures"/>. Callable statements can register OUT parameters</li>
    -					</ul>
    -					<p>
    -						Today, the JDBC API may look weird to users being used to object-oriented design. While statements hide a lot of SQL dialect-specific implementation details quite well, they assume a lot of knowledge about the internal state of a statement. For instance, you can use the <reference class="java.sql.PreparedStatement" anchor="#addBatch()" title="PreparedStatement.addBatch()"/> method, to add a the prepared statement being created to an "internal list" of batch statements. Instead of returning a new type, this method forces user to reflect on the prepared statement's internal state or "mode".
    -					</p>
    -					
    -					<h3>jOOQ is wrapping JDBC</h3>
    -					<p>						
    -						These things are abstracted away by jOOQ, which exposes such concepts in a more object-oriented way. For more details about jOOQ's batch query execution, see the manual's section about <reference id="batch-execution" title="batch execution"/>.
    -					</p> 
    -					<p>
    -						The following sections of this manual will show how jOOQ is wrapping JDBC for SQL execution
    -					</p>
    -				</html></content>
    -
    -				<sections>
    -					<section id="comparison-with-jdbc">
    -						<title>Comparison between jOOQ and JDBC</title>
    -						<content><html>
    -							<h3>Similarities with JDBC</h3>
    -							<p>
    -								Even if there are <reference id="query-vs-resultquery" title="two general types of Query"/>, there are a lot of similarities between JDBC and jOOQ. Just to name a few:
    -							</p>
    -							<ul>
    -								<li>Both APIs return the number of affected records in non-result queries. JDBC: <reference class="java.sql.Statement" anchor="#executeUpdate(java.lang.String)" title="Statement.executeUpdate()"/>, jOOQ: <reference class="org.jooq.Query" anchor="#execute()" title="Query.execute()"/></li>
    -								<li>Both APIs return a scrollable result set type from result queries. JDBC: <reference class="java.sql.ResultSet"/>, jOOQ: <reference class="org.jooq.Result"/></li>
    -							</ul>
    -							
    -							<h3>Differences to JDBC</h3>
    -							<p>
    -								Some of the most important differences between JDBC and jOOQ are listed here:
    -							</p>
    -							<ul>
    -								<li><reference id="query-vs-resultquery" title="Query vs. ResultQuery"/>: JDBC does not formally distinguish between queries that can return results, and queries that cannot. The same API is used for both. This greatly reduces the possibility for <reference id="fetching" title="fetching convenience methods"/></li>
    -								<li><reference id="exception-handling" title="Exception handling"/>: While SQL uses the checked <reference class="java.sql.SQLException"/>, jOOQ wraps all exceptions in an unchecked <reference class="org.jooq.exception.DataAccessException"/></li>
    -								<li><reference class="org.jooq.Result"/>: Unlike its JDBC counter-part, this type implements <reference class="java.util.List"/> and is fully loaded into Java memory, freeing resources as early as possible. Just like statements, this means that users don't have to deal with a "weird" internal result set state.</li>
    -								<li><reference class="org.jooq.Cursor"/>: If you want more fine-grained control over how many records are fetched into memory at once, you can still do that using jOOQ's <reference id="lazy-fetching" title="lazy fetching"/> feature</li>
    -								<li><reference id="statement-type" title="Statement type"/>: jOOQ does not formally distinguish between static statements and prepared statements. By default, all statements are prepared statements in jOOQ, internally. Executing a statement as a static statement can be done simply using a <reference id="custom-settings" title="custom settings flag"/></li>
    -							</ul>
    -						</html></content>
    -					</section>
    -				    
    -				    <section id="query-vs-resultquery">
    -						<title>Query vs. ResultQuery</title>
    -						<content><html>
    -							<p>
    -								Unlike JDBC, jOOQ has a lot of knowledge about a SQL query's structure and internals (see the manual's section about <reference id="sql-building" title="SQL building"/>). Hence, jOOQ distinguishes between these two fundamental types of queries. While every <reference class="org.jooq.Query"/> can be executed, only <reference class="org.jooq.ResultQuery"/> can return results (see the manual's section about <reference id="fetching" title="fetching"/> to learn more about fetching results). With plain SQL, the distinction can be made clear most easily:
    -							</p>
    -							
    -</html><java><![CDATA[// Create a Query object and execute it:
    -Query query = create.query("DELETE FROM BOOK");
    -query.execute();
    -
    -// Create a ResultQuery object and execute it, fetching results:
    -ResultQuery<Record> resultQuery = create.resultQuery("SELECT * FROM BOOK");
    -Result<Record> resultQuery.fetch();]]></java></content>
    -					</section>
    -
    -				    <section id="fetching">
    -						<title>Fetching</title>
    -						<content><html>
    -							<p>
    -								Fetching is something that has been completely neglegted by JDBC and also by various other database abstraction libraries. Fetching is much more than just looping or listing records or mapped objects. There are so many ways you may want to fetch data from a database, it should be considered a first-class feature of any database abstraction API. Just to name a few, here are some of jOOQ's fetching modes:
    -							</p>
    -							<ul>
    -								<li><reference id="record-vs-tablerecord" title="Untyped vs. typed fetching"/>: Sometimes you care about the returned type of your records, sometimes (with arbitrary projections) you don't.</li>
    -								<li><reference id="arrays-maps-and-lists" title="Fetching arrays, maps, or lists"/>: Instead of letting you transform your result sets into any more suitable data type, a library should do that work for you.</li>
    -								<li><reference id="recordhandler" title="Fetching through callbacks"/>: This is an entirely different fetching paradigm. With Java 8's lambda expressions, this will become even more powerful.</li>
    -								<li><reference id="pojos" title="Fetching custom POJOs"/>: This is what made Hibernate and JPA so strong. Automatic mapping of tables to custom POJOs.</li>
    -								<li><reference id="lazy-fetching" title="Lazy vs. eager fetching"/>: It should be easy to distinguish these two fetch modes.</li>
    -								<li><reference id="many-fetching" title="Fetching many results"/>: Some databases allow for returning many result sets from a single query. JDBC can handle this but it's very verbose. A list of results should be returned instead.</li>
    -								<li><reference id="later-fetching" title="Fetching data asynchronously"/>: Some queries take too long to execute to wait for their results. You should be able to spawn query execution in a separate process.</li>
    -							</ul>
    -							
    -							<h3>Convenience and how ResultQuery, Result, and Record share API</h3>
    -							<p>
    -								The term "fetch" is always reused in jOOQ when you can fetch data from the database. An <reference class="org.jooq.ResultQuery"/> provides many overloaded means of fetching data:
    -							</p>
    -							
    -							<h3>Various modes of fetching</h3>
    -							<p>
    -								These modes of fetching are also documented in subsequent sections of the manual
    -							</p>
    -							
    -</html><java><![CDATA[// The "standard" fetch
    -Result<R> fetch();    
    -
    -// The "standard" fetch when you know your query returns only one record
    -R fetchOne();
    -
    -// The "standard" fetch when you only want to fetch the first record
    -R fetchAny();
    -
    -// Create a "lazy" Cursor, that keeps an open underlying JDBC ResultSet
    -Cursor<R> fetchLazy();
    -Cursor<R> fetchLazy(int fetchSize);
    -
    -// Create a java.util.concurrent.Future, to handle asynchronous execution of the ResultQuery
    -FutureResult<R> fetchLater();
    -FutureResult<R> fetchLater(ExecutorService executor);
    -
    -// Fetch several results at once
    -List<Result<Record>> fetchMany();
    -
    -// Fetch records into a custom callback
    -<H extends RecordHandler<R>> H fetchInto(H handler);
    -
    -// Execute a ResultQuery with jOOQ, but return a JDBC ResultSet, not a jOOQ object
    -ResultSet fetchResultSet();]]></java><html>
    -							
    -							<h3>Fetch convenience</h3>
    -							<p>
    -								These means of fetching are also available from <reference class="org.jooq.Result"/> and <reference class="org.jooq.Record"/> APIs
    -							</p>
    -
    -</html><java><![CDATA[// These methods are convenience for fetching only a single field, 
    -// possibly converting results to another type
    -<T>    List<T> fetch(Field<T> field);
    -<T>    List<T> fetch(Field<?> field, Class<? extends T> type);
    -<T, U> List<U> fetch(Field<T> field, Converter<? super T, U> converter);
    -       List<?> fetch(int fieldIndex);
    -<T>    List<T> fetch(int fieldIndex, Class<? extends T> type);
    -<U>    List<U> fetch(int fieldIndex, Converter<?, U> converter);
    -       List<?> fetch(String fieldName);
    -<T>    List<T> fetch(String fieldName, Class<? extends T> type);
    -<U>    List<U> fetch(String fieldName, Converter<?, U> converter);
    -
    -// These methods are convenience for fetching only a single field, possibly converting results to another type
    -// Instead of returning lists, these return arrays
    -<T>    T[]      fetchArray(Field<T> field);
    -<T>    T[]      fetchArray(Field<?> field, Class<? extends T> type);
    -<T, U> U[]      fetchArray(Field<T> field, Converter<? super T, U> converter);
    -       Object[] fetchArray(int fieldIndex);
    -<T>    T[]      fetchArray(int fieldIndex, Class<? extends T> type);
    -<U>    U[]      fetchArray(int fieldIndex, Converter<?, U> converter);
    -       Object[] fetchArray(String fieldName);
    -<T>    T[]      fetchArray(String fieldName, Class<? extends T> type);
    -<U>    U[]      fetchArray(String fieldName, Converter<?, U> converter);
    -
    -// These methods are convenience for fetching only a single field from a single record, 
    -// possibly converting results to another type
    -<T>    T      fetchOne(Field<T> field);
    -<T>    T      fetchOne(Field<?> field, Class<? extends T> type);
    -<T, U> U      fetchOne(Field<T> field, Converter<? super T, U> converter);
    -       Object fetchOne(int fieldIndex);
    -<T>    T      fetchOne(int fieldIndex, Class<? extends T> type);
    -<U>    U      fetchOne(int fieldIndex, Converter<?, U> converter);
    -       Object fetchOne(String fieldName);
    -<T>    T      fetchOne(String fieldName, Class<? extends T> type);
    -<U>    U      fetchOne(String fieldName, Converter<?, U> converter);]]></java><html>
    -
    -							<h3>Fetch transformations</h3>
    -							<p>
    -								These means of fetching are also available from <reference class="org.jooq.Result"/> and <reference class="org.jooq.Record"/> APIs
    -							</p>
    -							
    -</html><java><![CDATA[// Transform your Records into arrays, Results into matrices
    -       Object[][] fetchArrays();
    -       Object[]   fetchOneArray();
    -       
    -// Transform your Result object into maps
    -<K>    Map<K, R> fetchMap(Field<K> key);
    -<K, V> Map<K, V> fetchMap(Field<K> key, Field<V> value);
    -       List<Map<String, Object>> fetchMaps();
    -       Map<String, Object> fetchOneMap();
    -
    -// Transform your Result object into groups
    -<K>    Map<K, Result<R>> fetchGroups(Field<K> key);
    -<K, V> Map<K, List<V>>   fetchGroups(Field<K> key, Field<V> value);
    -
    -// Transform your Records into custom POJOs
    -<E>    List<E> fetchInto(Class<? extends E> type), MappingException;
    -
    -// Transform your records into another table type
    -<Z extends Record> Result<Z> fetchInto(Table<Z> table);]]></java><html>
    -
    -							<p>
    -								Note, that apart from the <reference class="org.jooq.ResultQuery" anchor="#fetchLazy()" title="fetchLazy()"/> methods, all fetch() methods will immediately close underlying JDBC result sets.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="record-vs-tablerecord">
    -								<title>Record vs. TableRecord</title>
    -								<content><html>
    -									<p>
    -										jOOQ understands that SQL is much more expressive than Java, when it comes to the declarative typing of <reference id="table-expressions" title="table expressions"/>. As a declarative language, SQL allows for creating ad-hoc tuples (records with indexed columns) and records (records with named columns). In Java, this is not possible to the same extent. Yet, still, sometimes you wish to use strongly typed records, when you know that you're selecting only from a single table
    -									</p>
    -									
    -									<h3>Fetching strongly or weakly typed records</h3>
    -									<p>
    -										When fetching data only from a single table, the <reference id="table-expressions" title="table expression's"/> type is known to jOOQ if you use jOOQ's <reference id="code-generation" title="code generator"/> to generate <reference id="codegen-records" title="TableRecords"/> for your database tables. In order to fetch such strongly typed records, you will have to use the <reference id="select-statement" title="simple select API"/>:
    -									</p>
    -
    -</html><java><![CDATA[// Use the selectFrom() method:
    -BookRecord book = create.selectFrom(BOOK).where(BOOK.ID.equal(1)).fetchOne();
    -
    -// Typesafe field access is now possible:
    -System.out.println("Title       : " + book.getTitle());
    -System.out.println("Published in: " + book.getPublishedIn());]]></java><html>
    -									
    -									<p>
    -										When you use the <reference class="org.jooq.FactoryOperations" anchor="#selectFrom(org.jooq.Table)" title="Factory.selectFrom()"/> method, jOOQ will return the record type supplied with the argument table. Beware though, that you will no longer be able to use any clause that modifies the type of your <reference id="table-expressions" title="table expression"/>. This includes: 
    -									</p>
    -									<ul>
    -                   						<li><reference id="select-clause" title="The SELECT clause"/></li>
    -                   						<li><reference id="join-clause" title="The JOIN clause"/></li>
    -                   						<li><reference id="group-by-clause" title="The GROUP BY clause"/></li>
    -                   						<li><reference id="having-clause" title="The HAVING clause"/></li>
    -                   					</ul>		
    -                   												
    -									<h3>Scala's tuple classes</h3>
    -									<p>
    -										With the introduction of generics in Java 5, it is possible in principle, to pre-define a set of tuple types. This is what Scala does. In essence, tuple types look something like this:
    -									</p>
    -									
    -</html><java><![CDATA[// Tuple with arity 1
    -public interface Tuple1<T1> extends Tuple {
    -    T1 get1(); void set1(T1 t1);
    -}
    -
    -// Tuple with arity 2
    -public interface Tuple2<T1, T2> extends Tuple {
    -    T1 get1(); void set1(T1 t1);
    -    T2 get2(); void set2(T2 t2);
    -}
    -
    -// Tuple with arity 3
    -public interface Tuple3<T1, T2, T3> extends Tuple {
    -    T1 get1(); void set1(T1 t1);
    -    T2 get2(); void set2(T2 t2);
    -    T3 get3(); void set3(T3 t3);
    -}
    -
    -// Fictional sample application with Java:
    -for (Tuple<Integer, String, Date>> tuple : create
    -        .select(BOOK.ID, BOOK.TITLE, BOOK.PUBLICATION_DATE)
    -        .from(BOOK)
    -        .orderBy(BOOK.ID)
    -        .fetch()) {
    -
    -    Integer id           = tuple.get1();
    -    String title         = tuple.get2();
    -    Date publicationDate = tuple.get3();
    -}
    -
    -// Fictional sample application with Scala:
    -for (tuple <- create
    -              select (BOOK.ID, BOOK.TITLE, BOOK.PUBLICATION_DATE)
    -              from BOOK
    -              orderBy BOOK.ID
    -              fetch) {
    -
    -    val id              = tuple._1; // Type is Int
    -    val title           = tuple._2; // Type is String
    -    val publicationDate = tuple._3; // Type is Date
    -}]]></java><html>
    -
    -									<p>
    -										It is worth mentioning that Scala is much stronger in inferring types than Java. Yet still, this becomes quickly impracticable as
    -									</p>
    -									<ul>
    -										<li>We will run out of pre-defined tuple types for large arities</li>
    -										<li>Tuples are not as expressive as records (named tuples)</li>
    -										<li>With Java's weak type inference (no val/var keywords), tuples quickly become very verbose in Java</li>
    -									</ul>
    -									<p>
    -										For these reasons jOOQ does not support generic tuples.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="arrays-maps-and-lists">
    -								<title>Arrays, Maps and Lists</title>
    -								<content><html>
    -									<p>
    -										By default, jOOQ returns an <reference class="org.jooq.Result"/> object, which is essentially a <reference class="java.util.List"/> of <reference class="org.jooq.Record"/>. Often, you will find yourself wanting to transform this result object into a type that corresponds more to your specific needs. Or you just want to list all values of one specific column. Here are some examples to illustrate those use cases:
    -									</p>
    -									
    -</html><java><![CDATA[// Fetching only book titles (the two calls are equivalent):
    -List<String> titles1 = create.select().from(BOOK).fetch().getValues(BOOK.TITLE);
    -List<String> titles2 = create.select().from(BOOK).fetch(BOOK.TITLE);
    -String[]     titles3 = create.select().from(BOOK).fetchArray(BOOK.TITLE);
    -
    -// Fetching only book IDs, converted to Long
    -List<Long> ids1 = create.select().from(BOOK).fetch().getValues(BOOK.ID, Long.class);
    -List<Long> ids2 = create.select().from(BOOK).fetch(BOOK.ID, Long.class);
    -Long[]     ids3 = create.select().from(BOOK).fetchArray(BOOK.ID, Long.class);
    -
    -// Fetching book IDs and mapping each ID to their records or titles
    -Map<Integer, BookRecord> map1 = create.selectFrom(BOOK).fetch().intoMap(BOOK.ID);
    -Map<Integer, BookRecord> map2 = create.selectFrom(BOOK).fetchMap(BOOK.ID);
    -Map<Integer, String>     map3 = create.selectFrom(BOOK).fetch().intoMap(BOOK.ID, BOOK.TITLE);
    -Map<Integer, String>     map4 = create.selectFrom(BOOK).fetchMap(BOOK.ID, BOOK.TITLE);
    -
    -// Group by AUTHOR_ID and list all books written by any author:       
    -Map<Integer, Result<BookRecord>> group1 = create.selectFrom(BOOK).fetch().intoGroups(BOOK.AUTHOR_ID);
    -Map<Integer, Result<BookRecord>> group2 = create.selectFrom(BOOK).fetchGroups(BOOK.AUTHOR_ID);
    -Map<Integer, List<String>>       group3 = create.selectFrom(BOOK).fetch().intoGroups(BOOK.AUTHOR_ID, BOOK.TITLE);
    -Map<Integer, List<String>>       group4 = create.selectFrom(BOOK).fetchGroups(BOOK.AUTHOR_ID, BOOK.TITLE);]]></java><html>									
    -
    -									<p>
    -										Note that most of these convenience methods are available both through <reference class="org.jooq.ResultQuery"/> and <reference class="org.jooq.Result"/>, some are even available through <reference class="org.jooq.Record"/> as well.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="recordhandler">
    -								<title>RecordHandler</title>
    -								<content><html>
    -									<p>
    -										In a more functional operating mode, you might want to write callbacks that receive records from your select statement results in order to do some processing. This is a common data access pattern in Spring's JdbcTemplate, and it is also available in jOOQ. With jOOQ, you can implement your own <reference class="org.jooq.RecordHandler"/> classes and plug them into jOOQ's <reference class="org.jooq.ResultQuery"/>:
    -									</p>
    -									
    -</html><java><![CDATA[// Write callbacks to receive records from select statements
    -create.selectFrom(BOOK)
    -      .orderBy(BOOK.ID)
    -      .fetch()
    -      .into(new RecordHandler<BookRecord>() {
    -          @Override
    -          public void next(BookRecord book) {
    -              Util.doThingsWithBook(book);
    -          }
    -      });
    -      
    -// Or more concisely
    -create.selectFrom(BOOK)
    -      .orderBy(BOOK.ID)
    -      .fetchInto(new RecordHandler<BookRecord>() {...});
    -      
    -// Or even more concisely with Java 8's lambda expressions:
    -create.selectFrom(BOOK)
    -      .orderBy(BOOK.ID)
    -      .fetchInto(book -> { Util.doThingsWithBook(book); }; );
    -]]></java></content>
    -							</section>
    -
    -							<section id="pojos">
    -								<title>POJOs</title>
    -								<content><html>
    -									<p>
    -										Fetching data in records is fine as long as your application is not really layered, or as long as you're still writing code in the DAO layer. But if you have a more advanced application architecture, you may not want to allow for jOOQ artefacts to leak into other layers. You may choose to write POJOs (Plain Old Java Objects) as your primary DTOs (Data Transfer Objects), without any dependencies on jOOQ's <reference class="org.jooq.Record"/> types, which may even potentially hold a reference to a <reference id="factory" title="Factory"/>, and thus a JDBC <reference class="java.sql.Connection"/>. Like Hibernate/JPA, jOOQ allows you to operate with POJOs. Unlike Hibernate/JPA, jOOQ does not "attach" those POJOs or create proxies with any magic in them.
    -									</p>
    -									<p>
    -										If you're using jOOQ's <reference id="code-generation" title="code generator"/>, you can configure it to <reference id="codegen-pojos" title="generate POJOs"/> for you, but you're not required to use those generated POJOs. You can use your own.
    -									</p>
    -									
    -									<h3>Using JPA-annotated POJOs</h3>									
    -									<p>
    -										jOOQ tries to find JPA annotations on your POJO types. If it finds any, they are used as the primary source for mapping meta-information. Only the <reference class="javax.persistence.Column"/> annotation is used and understood by jOOQ. An example:
    -									</p>
    -
    -</html><java><![CDATA[// A JPA-annotated POJO class
    -public class MyBook {
    -  @Column(name = "ID")
    -  public int myId;
    -  
    -  @Column(name = "TITLE")
    -  public String myTitle;
    -}
    -
    -// The various "into()" methods allow for fetching records into your custom POJOs:
    -MyBook myBook        = create.select().from(BOOK).fetchAny().into(MyBook.class); 
    -List<MyBook> myBooks = create.select().from(BOOK).fetch().into(MyBook.class);
    -List<MyBook> myBooks = create.select().from(BOOK).fetchInto(MyBook.class);]]></java><html>									
    -									
    -									<p>
    -										Just as with any other JPA implementation, you can put the <reference class="javax.persistence.Column"/> annotation on any class member, including attributes, setters and getters. Please refer to the <reference class="org.jooq.Record" anchor="#into(java.lang.Class)" title="Record.into()"/> Javadoc for more details.
    -									</p>
    -									
    -									<h3>Using simple POJOs</h3>
    -									<p>
    -										If jOOQ does not find any JPA-annotations, columns are mapped to the "best-matching" constructor, attribute or setter. An example illustrates this:
    -									</p>
    -									
    -</html><java><![CDATA[// A "mutable" POJO class
    -public class MyBook1 {
    -  public int id;
    -  public String title;
    -}
    -
    -// The various "into()" methods allow for fetching records into your custom POJOs:
    -MyBook1 myBook        = create.select().from(BOOK).fetchAny().into(MyBook1.class); 
    -List<MyBook1> myBooks = create.select().from(BOOK).fetch().into(MyBook1.class);
    -List<MyBook1> myBooks = create.select().from(BOOK).fetchInto(MyBook1.class);	
    -									
    -// An "immutable" POJO class
    -public class MyBook2 {
    -  public final int id;
    -  public final String title;
    -  
    -  public MyBook2(int id, String title) {
    -    this.id = id;
    -    this.title = title;
    -  }
    -}
    -
    -// With "immutable" POJO classes, there must be an exact match between projected fields and available constructors:
    -MyBook2 myBook        = create.select(BOOK.ID, BOOK.TITLE).from(BOOK).fetchAny().into(MyBook2.class); 
    -List<MyBook2> myBooks = create.select(BOOK.ID, BOOK.TITLE).from(BOOK).fetch().into(MyBook2.class);
    -List<MyBook2> myBooks = create.select(BOOK.ID, BOOK.TITLE).from(BOOK).fetchInto(MyBook2.class);]]></java><html>	
    -									
    -									<p>
    -										Please refer to the <reference class="org.jooq.Record" anchor="#into(java.lang.Class)" title="Record.into()"/> Javadoc for more details.
    -									</p>
    -
    -									<h3>Using proxyable types</h3>
    -									<p>
    -										jOOQ also allows for fetching data into abstract classes or interfaces, or in other words, "proxyable" types. This means that jOOQ will return a <reference class="java.util.HashMap"/> wrapped in a <reference class="java.lang.reflect.Proxy"/> implementing your custom type. An example of this is given here:
    -									</p>
    -									
    -</html><java><![CDATA[// A "proxyable" type
    -public interface MyBook3 {
    -  int getId(); 
    -  void setId(int id);
    -  
    -  String getTitle();
    -  void setTitle(String title);
    -}
    -
    -// The various "into()" methods allow for fetching records into your custom POJOs:
    -MyBook3 myBook        = create.select(BOOK.ID, BOOK.TITLE).from(BOOK).fetchAny().into(MyBook3.class); 
    -List<MyBook3> myBooks = create.select(BOOK.ID, BOOK.TITLE).from(BOOK).fetch().into(MyBook3.class);
    -List<MyBook3> myBooks = create.select(BOOK.ID, BOOK.TITLE).from(BOOK).fetchInto(MyBook3.class);]]></java><html>									
    -
    -									<p>
    -										Please refer to the <reference class="org.jooq.Record" anchor="#into(java.lang.Class)" title="Record.into()"/> Javadoc for more details.
    -									</p>
    -
    -									<h3>Loading POJOs back into Records to store them</h3>
    -									<p>
    -										The above examples show how to fetch data into your own custom POJOs / DTOs. When you have modified the data contained in POJOs, you probably want to store those modifications back to the database. An example of this is given here:
    -									</p>
    -
    -</html><java><![CDATA[// A "mutable" POJO class
    -public class MyBook {
    -  public int id;
    -  public String title;
    -}
    -
    -// Create a new POJO instance
    -MyBook myBook = new MyBook();
    -myBook.id = 10;
    -myBook.title = "Animal Farm";
    -
    -// Load a jOOQ-generated BookRecord from your POJO
    -BookRecord book = create.newRecord(BOOK, myBook); 
    -
    -// Insert it (implicitly)
    -book.store();
    -
    -// Insert it (explicitly)
    -create.executeInsert(book);
    -
    -// or update it (ID = 10)
    -create.executeUpdate(book);]]></java><html>
    -							
    -									<p>
    -										Note: Because of your manual setting of ID = 10, jOOQ's store() method will asume that you want to insert a new record. See the manual's section about <reference id="crud-with-updatablerecords" title="CRUD with UpdatableRecords"/> for more details on this.
    -									</p>
    -											
    -									<h3>Interaction with DAOs</h3>
    -									<p>
    -										If you're using jOOQ's <reference id="code-generation" title="code generator"/>, you can configure it to <reference id="codegen-daos" title="generate DAOs"/> for you. Those DAOs operate on <reference id="codegen-pojos" title="generated POJOs"/>. An example of using such a DAO is given here:
    -									</p>
    -
    -</html><java><![CDATA[// Initialise a Factory
    -Factory create = new Factory(connection, SQLDialect.ORACLE);
    -
    -// Initialise the DAO with the Factory
    -BookDao bookDao = new BookDao(create);
    -
    -// Start using the DAO
    -Book book = bookDao.findById(5);
    -
    -// Modify and update the POJO
    -book.setTitle("1984");
    -book.setPublishedIn(1948);
    -bookDao.update(book);
    -
    -// Delete it again
    -bookDao.delete(book);]]></java><html>
    -									
    -									<h3>More complex data structures</h3>
    -									<p>
    -										jOOQ currently doesn't support more complex data structures, the way Hibernate/JPA attempt to map relational data onto POJOs. While future developments in this direction are not excluded, jOOQ claims that generic mapping strategies lead to an enormous additional complexity that only serves very few use cases. You are likely to find a solution using any of jOOQ's various <reference id="fetching" title="fetching modes"/>, with only little boiler-plate code on the client side.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="lazy-fetching">
    -								<title>Lazy fetching</title>
    -								<content><html>
    -									<p>
    -										Unlike JDBC's <reference class="java.sql.ResultSet"/>, jOOQ's <reference class="org.jooq.Result"/> does not represent an open database cursor with various fetch modes and scroll modes, that needs to be closed after usage. jOOQ's results are simple in-memory Java <reference class="java.util.List"/> objects, containing all of the result values. If your result sets are large, or if you have a lot of network latency, you may wish to fetch records one-by-one, or in small chunks. jOOQ supports a <reference class="org.jooq.Cursor"/> type for that purpose. In order to obtain such a reference, use the <reference class="org.jooq.ResultQuery" anchor="#fetchLazy()" title="ResultQuery.fetchLazy()"/> method. An example is given here:
    -									</p>
    -									
    -</html><java><![CDATA[// Obtain a Cursor reference:
    -Cursor<BookRecord> cursor = null;
    -
    -try {
    -    cursor = create.selectFrom(BOOK).fetchLazy();
    -
    -    // Cursor has similar methods as Iterator<R>
    -    while (cursor.hasNext()) {
    -        BookRecord book = cursor.fetchOne();
    -        
    -        Util.doThingsWithBook(book);
    -    }
    -}
    -
    -// Close the cursor and the cursor's underlying JDBC ResultSet
    -finally {
    -    if (cursor != null) {
    -        cursor.close();
    -    }
    -}]]></java><html>
    -
    -									<p>
    -										As a <reference class="org.jooq.Cursor"/> holds an internal reference to an open <reference class="java.sql.ResultSet"/>, it may need to be closed at the end of iteration. If a cursor is completely scrolled through, it will conveniently close the underlying ResultSet. However, you should not rely on that.
    -									</p>
    -									
    -									<h3>Cursors ship with all the other fetch features</h3>
    -									<p>
    -										Like <reference class="org.jooq.ResultQuery"/> or <reference class="org.jooq.Result"/>, <reference class="org.jooq.Cursor"/> gives access to all of the other fetch features that we've seen so far, i.e.
    -									</p>
    -									<ul>
    -										<li><reference id="record-vs-tablerecord" title="Strongly or weakly typed records"/>: Cursors are also typed with the &lt;R&gt; type, allowing to fetch custom, generated <reference class="org.jooq.TableRecord"/> or plain <reference class="org.jooq.Record"/> types.</li>
    -										<li><reference id="recordhandler" title="RecordHandler callbacks"/>: You can use your own <reference class="org.jooq.RecordHandler"/> callbacks to receive lazily fetched records.</li>
    -										<li><reference id="pojos" title="POJOs"/>: You can fetch data into your own custom POJO types.</li>
    -									</ul>
    -								</html></content>
    -							</section>
    -
    -							<section id="many-fetching">
    -								<title>Many fetching</title>
    -								<content><html>
    -									<p>
    -										Many databases support returning several result sets, or cursors, from single queries. An example for this is Sybase ASE's sp_help command:
    -									</p>
    -</html><text><![CDATA[> sp_help 'author'
    -
    -+--------+-----+-----------+-------------+-------------------+
    -|Name    |Owner|Object_type|Object_status|Create_date        |
    -+--------+-----+-----------+-------------+-------------------+
    -|  author|dbo  |user table | -- none --  |Sep 22 2011 11:20PM|
    -+--------+-----+-----------+-------------+-------------------+
    -
    -+-------------+-------+------+----+-----+-----+
    -|Column_name  |Type   |Length|Prec|Scale|...  |
    -+-------------+-------+------+----+-----+-----+
    -|id           |int    |     4|NULL| NULL|    0|
    -|first_name   |varchar|    50|NULL| NULL|    1|
    -|last_name    |varchar|    50|NULL| NULL|    0|
    -|date_of_birth|date   |     4|NULL| NULL|    1|
    -|year_of_birth|int    |     4|NULL| NULL|    1|
    -+-------------+-------+------+----+-----+-----+]]></text><html>
    -
    -
    -									<p>
    -										The correct (and verbose) way to do this with JDBC is as follows:
    -									</p>
    -									
    -</html><java><![CDATA[ResultSet rs = statement.executeQuery();
    -
    -// Repeat until there are no more result sets
    -for (;;) {
    -
    -  // Empty the current result set
    -  while (rs.next()) {
    -    // [ .. do something with it .. ]
    -  }
    -
    -  // Get the next result set, if available
    -  if (statement.getMoreResults()) {
    -    rs = statement.getResultSet();
    -  }
    -  else {
    -    break;
    -  }
    -}
    -
    -// Be sure that all result sets are closed
    -statement.getMoreResults(Statement.CLOSE_ALL_RESULTS);
    -statement.close();]]></java><html>
    -
    -									<p>
    -										As previously discussed in the chapter about <reference id="comparison-with-jdbc" title="differences between jOOQ and JDBC"/>, jOOQ does not rely on an internal state of any JDBC object, which is "externalised" by Javadoc. Instead, it has a straight-forward API allowing you to do the above in a one-liner: 
    -									</p>
    -									
    -</html><java><![CDATA[// Get some information about the author table, its columns, keys, indexes, etc
    -List<Result<Record>> results = create.fetchMany("sp_help 'author'");]]></java><html>
    -
    -									<p>
    -										Using generics, the resulting structure is immediately clear.
    -									</p>									
    -								</html></content>
    -							</section>
    -
    -							<section id="later-fetching">
    -								<title>Later fetching</title>
    -								<content><html>
    -									<p>
    -										Some queries take very long to execute, yet they are not crucial for the continuation of the main program. For instance, you could be generating a complicated report in a Swing application, and while this report is being calculated in your database, you want to display a background progress bar, allowing the user to pursue some other work. This can be achived simply with jOOQ, by creating a <reference class="org.jooq.FutureResult"/>, a type that extends <reference class="java.util.concurrent.Future"/>. An example is given here:
    -									</p>
    -									
    -</html><java><![CDATA[// Spawn off this query in a separate process:
    -FutureResult<BookRecord> future = create.selectFrom(BOOK).where(... complex predicates ...).fetchLater();
    -
    -// This example actively waits for the result to be done
    -while (!future.isDone()) {
    -    progressBar.increment(1);
    -    Thread.sleep(50);
    -}
    -
    -// The result should be ready, now
    -Result<BookRecord> result = future.get();]]></java><html>
    -
    -									<p>
    -										Note, that instead of letting jOOQ spawn a new thread, you can also provide jOOQ with your own <reference class="java.util.concurrent.ExecutorService"/>:
    -									</p>
    -									
    -</html><java><![CDATA[// Spawn off this query in a separate process:
    -ExecutorService service = // [...]
    -FutureResult<BookRecord> future = create.selectFrom(BOOK).where(... complex predicates ...).fetchLater(service);]]></java></content>
    -							</section>
    -
    -							<section id="resultset-fetching">
    -								<title>ResultSet fetching</title>
    -								<content><html>
    -									<p>
    -										When interacting with legacy applications, you may prefer to have jOOQ return a <reference class="java.sql.ResultSet"/>, rather than jOOQ's own <reference class="org.jooq.Result"/> types. This can be done simply, in two ways:
    -									</p>
    -									
    -</html><java><![CDATA[// jOOQ's Cursor type exposes the underlying ResultSet:
    -ResultSet rs1 = create.selectFrom(BOOK).fetchLazy().resultSet();
    -
    -// But you can also directly access that ResultSet from ResultQuery:
    -ResultSet rs2 = create.selectFrom(BOOK).fetchResultSet();
    -
    -// Don't forget to close these, though!
    -rs1.close();
    -rs2.close();]]></java><html>
    -
    -									<h3>Transform jOOQ's Result into a JDBC ResultSet</h3>
    -									<p>
    -										Instead of operating on a JDBC ResultSet holding an open resource from your database, you can also let jOOQ's <reference class="org.jooq.Result"/> wrap itself in a <reference class="java.sql.ResultSet"/>. The advantage of this is that the so-created ResultSet has no open connection to the database. It is a completely in-memory ResultSet:								
    -									</p>
    -
    -</html><java><![CDATA[// Transform a jOOQ Result into a ResultSet
    -Result<BookRecord> result = create.selectFrom(BOOK).fetch();
    -ResultSet rs = result.intoResultSet();]]></java><html>
    -
    -									<h3>The inverse: Fetch data from a legacy ResultSet using jOOQ</h3>
    -									<p>
    -										The inverse of the above is possible too. Maybe, a legacy part of your application produces JDBC <reference class="java.sql.ResultSet"/>, and you want to turn them into a <reference class="org.jooq.Result"/>: 
    -									</p>
    -
    -</html><java><![CDATA[// Transform a JDBC ResultSet into a jOOQ Result
    -ResultSet rs = connection.createStatement().executeQuery("SELECT * FROM BOOK");
    -
    -// As a Result:
    -Result<Record> result = create.fetch(rs);
    -
    -// As a Cursor
    -Cursor<Record> cursor = create.fetchLazy(rs);]]></java></content>
    -							</section>
    -
    -							<section id="data-type-conversion">
    -								<title>Data type conversion</title>
    -								<content><html>
    -									<p>
    -										Apart from a few extra features (see the manual's section about <reference id="master-data-types" title="master data types"/> and <reference id="codegen-udts" title="user-defined types"/>), jOOQ only supports basic types as supported by the JDBC API. In your application, you may choose to transform these data types into your own ones, without writing too much boiler-plate code. This can be done using jOOQ's <reference class="org.jooq.Converter"/> types. A converter essentially allows for two-way conversion between two Java data types &lt;T&gt; and &lt;U&gt;. By convention, the &lt;T&gt; type corresponds to the type in your database whereas the &gt;U&gt; type corresponds to your own user type. The Converter API is given here:
    -									</p>
    -									
    -</html><java><![CDATA[public interface Converter<T, U> extends Serializable {
    -
    -    /**
    -     * Convert a database object to a user object
    -     */
    -    U from(T databaseObject);
    -
    -    /**
    -     * Convert a user object to a database object
    -     */
    -    T to(U userObject);
    -
    -    /**
    -     * The database type
    -     */
    -    Class<T> fromType();
    -
    -    /**
    -     * The user type
    -     */
    -    Class<U> toType();
    -}]]></java><html>
    -
    -									<p>
    -										Such a converter can be used in many parts of the jOOQ API. Some examples have been illustrated in the manual's section about <reference id="fetching" title="fetching"/>.
    -									</p>
    -									
    -									<h3>A Converter for GregorianCalendar</h3>
    -									<p>
    -										Here is a some more elaborate example involving a Converter for <reference class="java.util.GregorianCalendar"/>: 
    -									</p>
    -									
    -</html><java><![CDATA[// You may prefer Java Calendars over JDBC Timestamps
    -public class CalendarConverter implements Converter<Timestamp, GregorianCalendar> {
    -
    -    @Override
    -    public GregorianCalendar from(Timestamp databaseObject) {
    -        GregorianCalendar calendar = (GregorianCalendar) Calendar.getInstance();
    -        calendar.setTimeInMillis(databaseObject.getTime());
    -        return calendar;
    -    }
    -
    -    @Override
    -    public Timestamp to(GregorianCalendar userObject) {
    -        return new Timestamp(userObject.getTime().getTime());
    -    }
    -
    -    @Override
    -    public Class<Timestamp> fromType() {
    -        return Timestamp.class;
    -    }
    -
    -    @Override
    -    public Class<GregorianCalendar> toType() {
    -        return GregorianCalendar.class;
    -    }
    -}
    -
    -// Now you can fetch calendar values from jOOQ's API:
    -List<GregorianCalendar> dates1 = create.selectFrom(BOOK).fetch().getValues(BOOK.PUBLISHING_DATE, new CalendarConverter());
    -List<GregorianCalendar> dates2 = create.selectFrom(BOOK).fetch(BOOK.PUBLISHING_DATE, new CalendarConverter());
    -]]></java><html>									
    -									
    -									<h3>Enum Converters</h3>
    -									<p>
    -										jOOQ ships with a built-in default <reference class="org.jooq.impl.EnumConverter"/>, that you can use to map VARCHAR values to enum literals or NUMBER values to enum ordinals (both modes are supported). Let's say, you want to map a YES / NO / MAYBE column to a custom Enum:
    -									</p>
    -									
    -</html><java><![CDATA[// Define your Enum
    -public enum YNM {
    -    YES, NO, MAYBE
    -}
    -
    -// Define your converter
    -public class YNMConverter extends EnumConverter<String, YNM> {
    -    public YNMConverter() {
    -        super(String.class, YNM.class);
    -    }
    -}
    -
    -// And you're all set for converting records to your custom Enum:
    -for (BookRecord book : create.selectFrom(BOOK).fetch()) {
    -    switch (book.getValue(BOOK.I_LIKE, new YNMConverter())) {
    -        case YES:    System.out.println("I like this book             : " + book.getTitle()); break;
    -        case NO:     System.out.println("I didn't like this book      : " + book.getTitle()); break;
    -        case MAYBE:  System.out.println("I'm not sure about this book : " + book.getTitle()); break;
    -    }
    -}]]></java><html>
    -									
    -									<h3>Using Converters in generated source code</h3>
    -									<p>
    -										jOOQ also allows for generated source code to reference your own custom converters, in order to permanently replace a <reference id="table-columns" title="table column's"/> &lt;T&gt; type by your own, custom &lt;U&gt; type. See the manual's section about <reference id="custom-data-types" title="custom data types"/> for details.
    -									</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -					
    -					<section id="statement-type">
    -						<title>Static statements vs. Prepared Statements</title>
    -						<content><html>
    -							<p>
    -								With JDBC, you have full control over your SQL statements. You can decide yourself, if you want to execute a static <reference class="java.sql.Statement"/> without bind values, or a <reference class="java.sql.PreparedStatement"/> with (or without) bind values. But you have to decide early, which way to go. And you'll have to prevent SQL injection and syntax errors manually, when inlining your bind variables.
    -							</p>
    -							<p>
    -								With jOOQ, this is easier. As a matter of fact, it is plain simple. With jOOQ, you can just set a flag in your <reference id="factory" title="Factory's"/> <reference id="custom-settings" title="Settings"/>, and all queries produced by that factory will be executed as static statements, with all bind values inlined. An example is given here:
    -							</p>
    -							
    -</html><code-pair>
    -<sql><![CDATA[
    -
    -
    -
    -
    -
    -
    --- These statements are rendered by the two factories:
    -SELECT ? FROM DUAL WHERE ? = ?
    -SELECT 1 FROM DUAL WHERE 1 = 1]]></sql><java><![CDATA[// This Factory executes PreparedStatements
    -Factory prepare = new Factory(connection, SQLDialect.ORACLE);
    -
    -// This Factory exeecutes static Statements
    -Factory inlined = new Factory(connection, SQLDialect.ORACLE, 
    -  new Settings().withStatementType(StatementType.STATIC_STATEMENT));
    -  
    -prepare.select(val(1)).where(val(1).equal(1)).fetch();
    -inlined.select(val(1)).where(val(1).equal(1)).fetch();]]></java>
    -</code-pair><html>
    -
    -							<h3>Reasons for choosing one or the other</h3>
    -							<p>
    -								Not all databases are equal. Some databases show improved performance if you use <reference class="java.sql.PreparedStatement"/>, as the database will then be able to re-use execution plans for identical SQL statements, regardless of actual bind values. This heavily improves the time it takes for soft-parsing a SQL statement. In other situations, assuming that bind values are irrelevant for SQL execution plans may be a bad idea, as you might run into "bind value peeking" issues. You may be better off spending the extra cost for a new hard-parse of your SQL statement and instead having the database fine-tune the new plan to the concrete bind values.
    -							</p>
    -							<p>
    -								Whichever aproach is more optimal for you cannot be decided by jOOQ. In most cases, prepared statements are probably better. But you always have the option of forcing jOOQ to render inlined bind values.
    -							</p>
    -							
    -							<h3>Inlining bind values on a per-bind-value basis</h3>
    -							<p>
    -								Note that you don't have to inline all your bind values at once. If you know that a bind value is not really a variable and should be inlined explicitly, you can do so by using <reference class="org.jooq.impl.Factory" anchor="#inline(Object)" title="Factory.inline()"/>, as documented in the manual's section about <reference id="inlined-parameters" title="inlined parameters"/>
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="batch-execution">
    -						<title>Using JDBC batch operations</title>
    -						<content><html>
    -							<p>
    -								With JDBC, you can easily execute several statements at once using the addBatch() method. Essentially, there are two modes in JDBC
    -							</p>
    -
    -							<ul>
    -								<li>Execute several queries without bind values</li>
    -								<li>Execute one query several times with bind values</li>
    -							</ul>
    -
    -							<p>
    -								In code, this looks like the following snippet:
    -							</p>
    -</html><java><![CDATA[// 1. several queries
    -// ------------------
    -Statement stmt = connection.createStatement();
    -stmt.addBatch("INSERT INTO author VALUES (1, 'Erich Gamma')");
    -stmt.addBatch("INSERT INTO author VALUES (2, 'Richard Helm')");
    -stmt.addBatch("INSERT INTO author VALUES (3, 'Ralph Johnson')");
    -stmt.addBatch("INSERT INTO author VALUES (4, 'John Vlissides')");
    -int[] result = stmt.executeBatch();
    -
    -// 2. a single query
    -// -----------------
    -PreparedStatement stmt = connection.prepareStatement("INSERT INTO autho VALUES (?, ?)");
    -stmt.setInt(1, 1);
    -stmt.setString(2, "Erich Gamma");
    -stmt.addBatch();
    -
    -stmt.setInt(1, 2);
    -stmt.setString(2, "Richard Helm");
    -stmt.addBatch();
    -
    -stmt.setInt(1, 3);
    -stmt.setString(2, "Ralph Johnson");
    -stmt.addBatch();
    -
    -stmt.setInt(1, 4);
    -stmt.setString(2, "John Vlissides");
    -stmt.addBatch();
    -
    -int[] result = stmt.executeBatch();]]></java><html>
    -
    -
    -							<h3>This will also be supported by jOOQ</h3>
    -							<p>
    -								jOOQ supports executing queries in batch mode as follows:
    -							</p>
    -							
    -</html><java><![CDATA[// 1. several queries
    -// ------------------
    -create.batch(
    -	create.insertInto(AUTHOR, ID, NAME).values(1, "Erich Gamma"),
    -	create.insertInto(AUTHOR, ID, NAME).values(2, "Richard Helm"),
    -	create.insertInto(AUTHOR, ID, NAME).values(3, "Ralph Johnson"),
    -	create.insertInto(AUTHOR, ID, NAME).values(4, "John Vlissides"))
    -.execute();
    -
    -// 2. a single query
    -// -----------------
    -create.batch(create.insertInto(AUTHOR, ID, NAME).values("?", "?"))
    -	  .bind(1, "Erich Gamma")
    -	  .bind(2, "Richard Helm")
    -	  .bind(3, "Ralph Johnson")
    -	  .bind(4, "John Vlissides")
    -	  .execute();]]></java></content>
    -					</section>
    -
    -				    <section id="sequence-execution">
    -						<title>Sequence execution</title>
    -						<content><html>
    -							<p>
    -								Most databases support sequences of some sort, to provide you with unique values to be used for primary keys and other enumerations. If you're using jOOQ's <reference id="code-generation" title="code generator"/>, it will generate a sequence object per sequence for you. There are two ways of using such a sequence object:
    -							</p>
    -
    -							<h3>Standalone calls to sequences</h3>
    -							<p>
    -								Instead of actually phrasing a select statement, you can also use the <reference id="factory" title="Factory's"/> convenience methods:
    -							</p>							
    -							
    -</html><java><![CDATA[// Fetch the next value from a sequence
    -BigInteger nextID = create.nextval(S_AUTHOR_ID);
    -
    -// Fetch the current value from a sequence
    -BigInteger currID = create.currval(S_AUTHOR_ID);]]></java><html>
    -							
    -							<h3>Inlining sequence references in SQL</h3>
    -							<p>
    -								You can inline sequence references in jOOQ SQL statements. The following are examples of how to do that:
    -							</p>
    -							
    -</html><java><![CDATA[// Reference the sequence in a SELECT statement:
    -BigInteger nextID = create.select(s).fetchOne(S_AUTHOR_ID.nextval());
    -
    -// Reference the sequence in an INSERT statement:
    -create.insertInto(AUTHOR, AUTHOR.ID, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -      .values(S_AUTHOR_ID.nextval(), val("William"), val("Shakespeare"));
    -]]></java><html>
    -
    -							<p>
    -								For more info about inlining sequence references in SQL statements, please refer to the manual's section about <reference id="sequences-and-serials" title="sequences and serials"/>.
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="stored-procedures">
    -						<title>Stored procedures and functions</title>
    -						<content><html>
    -							<p>
    -								Many RDBMS support the concept of "routines", usually calling them procedures and/or functions. These concepts have been around in programming languages for a while, also outside of databases. Famous languages distinguishing procedures from functions are:
    -							</p>
    -							<ul>
    -								<li>Ada</li>
    -								<li>BASIC</li>
    -								<li>Pascal</li>
    -								<li>etc...</li>
    -							</ul>
    -							<p>
    -								The general distinction between (stored) procedures and (stored) functions can be summarised like this:
    -							</p>
    -							
    -							<h3>Procedures</h3>
    -							<ul>
    -								<li>Are called using JDBC CallableStatement</li>
    -								<li>Have no return value</li>
    -								<li>Usually support OUT parameters</li>
    -							</ul>
    -							
    -							<h3>Functions</h3>
    -							<ul>
    -								<li>Can be used in SQL statements</li>
    -								<li>Have a return value</li>
    -								<li>Usually don't support OUT parameters</li>
    -							</ul>
    -							
    -							<h3>Exceptions to these rules</h3>
    -							<ul>
    -								<li>DB2, H2, and HSQLDB don't allow for JDBC escape syntax when calling functions. Functions must be used in a SELECT statement</li>
    -								<li>H2 only knows functions (without OUT parameters)</li>
    -								<li>Oracle functions may have OUT parameters</li>
    -								<li>Oracle knows functions that must not be used in SQL statements for transactional reasons</li>
    -								<li>Postgres only knows functions (with all features combined). OUT parameters can also be interpreted as return values, which is quite elegant/surprising, depending on your taste</li>
    -								<li>The Sybase jconn3 JDBC driver doesn't handle null values correctly when using the JDBC escape syntax on functions</li>
    -							</ul>
    -							<p>
    -								In general, it can be said that the field of routines (procedures / functions) is far from being standardised in modern RDBMS even if the SQL:2008 standard specifies things quite well. Every database has its ways and JDBC only provides little abstraction over the great variety of procedures / functions implementations, especially when advanced data types such as cursors / UDT's / arrays are involved.
    -							</p>
    -							<p>
    -								To simplify things a little bit, jOOQ handles both procedures and functions the same way, using a more general <reference class="org.jooq.Routine"/> type.
    -							</p>
    -							
    -							<h3>Using jOOQ for standalone calls to stored procedures and functions</h3>
    -							<p>
    -								If you're using jOOQ's <reference id="code-generation" title="code generator"/>, it will generate <reference class="org.jooq.Routine"/> objects for you. Let's consider the following example:
    -							</p>
    -							
    -</html><sql><![CDATA[-- Check whether there is an author in AUTHOR by that name and get his ID
    -CREATE OR REPLACE PROCEDURE author_exists (author_name VARCHAR2, result OUT NUMBER, id OUT NUMBER);]]></sql><html>
    -
    -							<p>
    -								The generated artefacts can then be used as follows:
    -							</p>
    -							
    -</html><java><![CDATA[// Make an explicit call to the generated procedure object:
    -AuthorExists procedure = new AuthorExists();
    -
    -// All IN and IN OUT parameters generate setters
    -procedure.setAuthorName("Paulo");
    -procedure.execute(configuration);
    -
    -// All OUT and IN OUT parameters generate getters
    -assertEquals(new BigDecimal("1"), procedure.getResult());
    -assertEquals(new BigDecimal("2"), procedure.getId();]]></java><html>							
    -							
    -							<p>
    -								But you can also call the procedure using a generated convenience method in a global Routines class:
    -							</p>
    -
    -</html><java><![CDATA[// The generated Routines class contains static methods for every procedure.
    -// Results are also returned in a generated object, holding getters for every OUT or IN OUT parameter.
    -AuthorExists result = Routines.authorExists("Paulo");
    -
    -// All OUT and IN OUT parameters generate getters
    -assertEquals(new BigDecimal("1"), procedure.getResult());
    -assertEquals(new BigDecimal("2"), procedure.getId();]]></java><html>			
    -
    -							<p>
    -								For more details about <reference id="code-generation" title="code generation"/> for procedures, see the manual's section about <reference id="codegen-procedures" title="procedures and code generation"/>.
    -							</p>				
    -							
    -							<h3>Inlining stored function references in SQL</h3>
    -							<p>
    -								Unlike procedures, functions can be inlined in SQL statements to generate <reference id="column-expressions" title="column expressions"/> or <reference id="table-expressions" title="table expressions"/>, if you're using <reference id="array-and-cursor-unnesting" title="unnesting operators"/>. Assume you have a function like this:
    -							</p>
    -
    -</html><sql><![CDATA[-- Check whether there is an author in AUTHOR by that name and get his ID
    -CREATE OR REPLACE FUNCTION author_exists (author_name VARCHAR2) RETURN NUMBER;]]></sql><html>
    -							
    -							<p>
    -								The generated artefacts can then be used as follows:
    -							</p>
    -							
    -</html><code-pair>
    -<sql><![CDATA[-- This is the rendered SQL
    -
    -SELECT AUTHOR_EXISTS('Paulo') FROM DUAL]]></sql><java><![CDATA[// Use the static-imported method from Routines:
    -boolean exists = 
    -create.select(authorExists("Paulo")).fetchOne(0, boolean.class);]]></java>							
    -</code-pair><html>
    -							
    -							<p>
    -								For more info about inlining stored function references in SQL statements, please refer to the manual's section about <reference id="user-defined-functions" title="user-defined functions"/>.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="oracle-packages">
    -								<title>Oracle Packages</title>
    -								<content><html>
    -									<p>
    -										Oracle uses the concept of a PACKAGE to group several procedures/functions into a sort of namespace. The <a href="http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt" title="SQL 92 standard">SQL 92 standard</a> talks about "modules", to represent this concept, even if this is rarely implemented as such. This is reflected in jOOQ by the use of Java sub-packages in the <reference id="code-generation" title="source code generation"/> destination package. Every Oracle package will be reflected by
    -									</p>
    -									<ul>
    -										<li>A Java package holding classes for formal Java representations of the procedure/function in that package</li>
    -										<li>A Java class holding convenience methods to facilitate calling those procedures/functions</li>
    -									</ul>
    -									<p>
    -										Apart from this, the generated source code looks exactly like the one for standalone procedures/functions.
    -									</p>
    -									<p>
    -										For more details about <reference id="code-generation" title="code generation"/> for procedures and packages see the manual's section about <reference id="codegen-procedures" title="procedures and code generation"/>.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="oracle-member-procedures">
    -								<title>Oracle member procedures</title>
    -								<content><html>
    -									<p>
    -										Oracle UDTs can have object-oriented structures including member functions and procedures. With Oracle, you can do things like this:
    -									</p>
    -									
    -</html><sql><![CDATA[CREATE OR REPLACE TYPE u_author_type AS OBJECT (
    -  id NUMBER(7),
    -  first_name VARCHAR2(50),
    -  last_name VARCHAR2(50),
    -
    -  MEMBER PROCEDURE LOAD,
    -  MEMBER FUNCTION counBOOKs RETURN NUMBER
    -)
    -
    --- The type body is omitted for the example]]></sql><html>
    -
    -									<p>
    -										These member functions and procedures can simply be mapped to Java methods:
    -									</p>
    -
    -</html><java><![CDATA[// Create an empty, attached UDT record from the Factory
    -UAuthorType author = create.newRecord(U_AUTHOR_TYPE);
    -
    -// Set the author ID and load the record using the LOAD procedure
    -author.setId(1);
    -author.load();
    -
    -// The record is now updated with the LOAD implementation's content
    -assertNotNull(author.getFirstName());
    -assertNotNull(author.getLastName());]]></java><html>
    -
    -									<p>
    -										For more details about <reference id="code-generation" title="code generation"/> for UDTs see the manual's section about <reference id="codegen-udts" title="user-defined types and code generation"/>.
    -									</p>								
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -				    <section id="exporting">
    -						<title>Exporting to XML, CSV, JSON, HTML, Text</title>
    -						<content><html>
    -							<p>
    -								If you are using jOOQ for scripting purposes or in a slim, unlayered application server, you might be interested in using jOOQ's exporting functionality (see also the <reference id="importing" title="importing functionality"/>). You can export any Result&lt;Record&gt; into the formats discussed in the subsequent chapters of the manual
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="exporting-xml">
    -								<title>Exporting XML</title>
    -								<content><java>// Fetch books and format them as XML
    -String xml = create.selectFrom(BOOK).fetch().formatXML();</java><html>
    -
    -									<p>
    -										The above query will result in an XML document looking like the following one:
    -									</p>
    -
    -</html><xml><![CDATA[<result xmlns="http://www.jooq.org/xsd/jooq-export-1.6.2.xsd">
    -  <fields>
    -    <field name="ID"/>
    -    <field name="AUTHOR_ID"/>
    -    <field name="TITLE"/>
    -  </fields>
    -  <records>
    -    <record>
    -      <value field="ID">1</value>
    -      <value field="AUTHOR_ID">1</value>
    -      <value field="TITLE">1984</value>
    -    </record>
    -    <record>
    -      <value field="ID">2</value>
    -      <value field="AUTHOR_ID">1</value>
    -      <value field="TITLE">Animal Farm</value>
    -    </record>
    -  </records>
    -</result>]]></xml><html>
    -
    -									<p>
    -										The same result as an <reference class="org.w3c.dom.Document"/> can be obtained using the Result.intoXML() method:
    -									</p>
    -
    -
    -</html><java>// Fetch books and format them as XML
    -Document xml = create.selectFrom(BOOK).fetch().intoXML();</java><html>
    -
    -									<p>
    -										See the XSD schema definition here, for a formal definition of the XML export format:<br/>
    -										<a href="http://www.jooq.org/xsd/jooq-export-1.6.2.xsd">http://www.jooq.org/xsd/jooq-export-1.6.2.xsd</a>
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="exporting-csv">
    -								<title>Exporting CSV</title>
    -								<content><java>// Fetch books and format them as CSV
    -String csv = create.selectFrom(BOOK).fetch().formatCSV();</java><html>
    -
    -									<p>
    -										The above query will result in a CSV document looking like the following one:
    -									</p>
    -
    -</html><text>ID,AUTHOR_ID,TITLE
    -1,1,1984
    -2,1,Animal Farm</text><html>
    -
    -									<p>
    -										In addition to the standard behaviour, you can also specify a separator character, as well as a special string to represent NULL values (which cannot be represented in standard CSV):
    -									</p>
    -
    -</html><java>// Use ";" as the separator character
    -String csv = create.selectFrom(BOOK).fetch().formatCSV(';');
    -
    -// Specify "{null}" as a representation for NULL values
    -String csv = create.selectFrom(BOOK).fetch().formatCSV(';', "{null}");</java></content>
    -							</section>
    -
    -							<section id="exporting-json">
    -								<title>Exporting JSON</title>
    -								<content><java>// Fetch books and format them as JSON
    -String json = create.selectFrom(BOOK).fetch().formatJSON();</java><html>
    -
    -									<p>
    -										The above query will result in a JSON document looking like the following one:
    -									</p>
    -
    -</html><text>{fields:["ID","AUTHOR_ID","TITLE"],
    - records:[[1,1,"1984"],[2,1,"Animal Farm"]]}</text></content>
    -							</section>
    -
    -							<section id="exporting-html">
    -								<title>Exporting HTML</title>
    -								<content><java>// Fetch books and format them as HTML
    -String html = create.selectFrom(BOOK).fetch().formatHTML();</java><html>
    -
    -									<p>
    -										The above query will result in an HTML document looking like the following one
    -									</p>
    -
    -</html><xml><![CDATA[<table>
    -  <thead>
    -    <tr>
    -      <th>ID</th>
    -      <th>AUTHOR_ID</th>
    -      <th>TITLE</th>
    -    </tr>
    -  </thead>
    -  <tbody>
    -    <tr>
    -      <td>1</td>
    -      <td>1</td>
    -      <td>1984</td>
    -    </tr>
    -    <tr>
    -      <td>2</td>
    -      <td>1</td>
    -      <td>Animal Farm</td>
    -    </tr>
    -  </tbody>
    -</table>]]></xml></content>
    -							</section>
    -
    -							<section id="exporting-text">
    -								<title>Exporting Text</title>
    -								<content><java>// Fetch books and format them as text
    -String text = create.selectFrom(BOOK).fetch().format();</java><html>
    -
    -									<p>
    -										The above query will result in a text document looking like the following one
    -									</p>
    -
    -</html><text>+---+---------+-----------+
    -| ID|AUTHOR_ID|TITLE      |
    -+---+---------+-----------+
    -|  1|        1|1984       |
    -|  2|        1|Animal Farm|
    -+---+---------+-----------+</text><html>
    -
    -									<p>
    -										A simple text representation can also be obtained by calling toString() on a Result object. See also the manual's section about <reference id="logging" title="DEBUG logging"/>
    -									</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -				    <section id="importing">
    -						<title>Importing data</title>
    -						<content><html>
    -							<p>
    -								If you are using jOOQ for scripting purposes or in a slim, unlayered application server, you might be interested in using jOOQ's importing functionality (see also exporting functionality). You can import data directly into a table from the formats described in the subsequent sections of this manual.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="importing-csv">
    -								<title>Importing CSV</title>
    -								<content><html>
    -
    -									<p>
    -										The below CSV data represents two author records that may have been exported previously, by jOOQ's <reference id="exporting" title="exporting functionality"/>, and then modified in Microsoft Excel or any other spreadsheet tool:
    -									</p>
    -
    -</html><text>ID;AUTHOR_ID;TITLE
    -1;1;1984
    -2;1;Animal Farm</text><html>
    -
    -									<p>
    -										With jOOQ, you can load this data using various parameters from the	loader API. A simple load may look like this:
    -									</p>
    -
    -</html><java>Factory create = new Factory(connection, dialect);
    -
    -// Load data into the AUTHOR table from an input stream
    -// holding the CSV data.
    -create.loadInto(AUTHOR)
    -      .loadCSV(inputstream)
    -      .fields(ID, AUTHOR_ID, TITLE)
    -      .execute();</java><html>
    -
    -      								<p>
    -      									Here are various other examples:
    -   									</p>
    -
    -</html><java>// Ignore the AUTHOR_ID column from the CSV file when inserting
    -create.loadInto(AUTHOR)
    -      .loadCSV(inputstream)
    -      .fields(ID, null, TITLE)
    -      .execute();
    -
    -// Specify behaviour for duplicate records.
    -create.loadInto(AUTHOR)
    -
    -      // choose any of these methods
    -      .onDuplicateKeyUpdate()
    -      .onDuplicateKeyIgnore()
    -      .onDuplicateKeyError() // the default
    -
    -      .loadCSV(inputstream)
    -      .fields(ID, null, TITLE)
    -      .execute();
    -
    -// Specify behaviour when errors occur.
    -create.loadInto(AUTHOR)
    -
    -      // choose any of these methods
    -      .onErrorIgnore()
    -      .onErrorAbort() // the default
    -
    -      .loadCSV(inputstream)
    -      .fields(ID, null, TITLE)
    -      .execute();
    -
    -// Specify transactional behaviour where this is possible
    -// (e.g. not in container-managed transactions)
    -create.loadInto(AUTHOR)
    -
    -      // choose any of these methods
    -      .commitEach()
    -      .commitAfter(10)
    -      .commitAll()
    -      .commitNone() // the default
    -
    -      .loadCSV(inputstream)
    -      .fields(ID, null, TITLE)
    -      .execute();</java><html>
    -
    -									<p>
    -										Any of the above configuration methods can be combined to achieve the type of load you need. Please refer to the API's Javadoc to learn about more details. Errors that occur during the load are reported by the execute method's result:
    -									</p>
    -
    -</html><java><![CDATA[Loader<Author> loader = /* .. */ .execute();
    -
    -// The number of processed rows
    -int processed = loader.processed();
    -
    -// The number of stored rows (INSERT or UPDATE)
    -int stored = loader.stored();
    -
    -// The number of ignored rows (due to errors, or duplicate rule)
    -int ignored = loader.ignored();
    -
    -// The errors that may have occurred during loading
    -List<LoaderError> errors = loader.errors();
    -LoaderError error = errors.get(0);
    -
    -// The exception that caused the error
    -DataAccessException exception = error.exception();
    -
    -// The row that caused the error
    -int rowIndex = error.rowIndex();
    -String[] row = error.row();
    -
    -// The query that caused the error
    -Query query = error.query();]]></java></content>
    -							</section>
    -
    -							<section id="importing-xml">
    -								<title>Importing XML</title>
    -								<content><html>
    -									<p>This is not yet supported</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -				    <section id="crud-with-updatablerecords">
    -						<title>CRUD with UpdatableRecords</title>
    -						<content><html>
    -							<p>
    -								Your database application probably consists of 50% - 80% CRUD, whereas only the remaining 20% - 50% of querying is actual querying. Most often, you will operate on records of tables without using any advanced relational concepts. This is called CRUD for
    -							</p>
    -							<ul>
    -								<li>Create (<reference id="insert-statement" title="INSERT"/>)</li>
    -								<li>Read (<reference id="select-statement" title="SELECT"/>)</li>
    -								<li>Update (<reference id="update-statement" title="UPDATE"/>)</li>
    -								<li>Delete (<reference id="delete-statement" title="DELETE"/>)</li>
    -							</ul>
    -							<p>								
    -								CRUD always uses the same patterns, regardless of the nature of underlying tables. This again, leads to a lot of boilerplate code, if you have to issue your statements yourself. Like Hibernate / JPA and other ORMs, jOOQ facilitates CRUD using a specific API involving <reference class="org.jooq.UpdatableRecord"/> types.
    -							</p>
    -							
    -							<h3>Primary keys and updatability</h3>
    -							<p>
    -								In normalised databases, every table has a primary key by which a tuple/record within that table can be uniquely identified. In simple cases, this is a (possibly auto-generated) number called ID. But in many cases, primary keys include several non-numeric columns. An important feature of such keys is the fact that in most databases, they are enforced using an index that allows for very fast random access to the table. A typical way to access / modify / delete a book is this:
    -							</p>
    -							
    -</html><sql><![CDATA[-- Inserting uses a previously generated key value or generates it afresh
    -INSERT INTO BOOK (ID, TITLE) VALUES (5, 'Animal Farm');
    -
    --- Other operations can use a previously generated key value
    -SELECT * FROM BOOK WHERE ID = 5;
    -UPDATE BOOK SET TITLE = '1984' WHERE ID = 5;
    -DELETE FROM BOOK WHERE ID = 5;]]></sql><html>
    -							
    -							<p>
    -								Normalised databases assume that a primary key is unique "forever", i.e. that a key, once inserted into a table, will never be changed or re-inserted after deletion. In order to use jOOQ's <reference id="simple-crud" title="CRUD"/> operations correctly, you should design your database accordingly.
    -							</p>
    -							
    -							<h3>Main UNIQUE keys</h3>
    -							<p>
    -								In SQL, a primary key is always also a unique key. In fact, unique keys have very similar properties as primary keys. For instance, they can be referenced from other tables' foreign keys in most databases. In the absence of a formal primary key, jOOQ assumes that the first unique key it encounters will serve as a primary key substitute. This is called the "main key" in jOOQ. In other words, a main key is:
    -							</p>
    -							<ul>
    -								<li>The primary key, if available</li>
    -								<li>The first unique key, otherwise</li>
    -							</ul>
    -							
    -							<p>
    -								For simplicity, the term "primary key" will be used in the sense of such a "main unique key" in this manual.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="simple-crud">
    -								<title>Simple CRUD</title>
    -								<content><html>
    -									<p>
    -										If you're using jOOQ's <reference id="code-generation" title="code generator"/>, it will generate <reference class="org.jooq.UpdatableRecord"/> implementations for every table that has a primary key. When <reference id="fetching" title="fetching"/> such a record form the database, these records are "attached" to the <reference id="factory" title="Factory" /> that created them. This means that they hold an internal reference to the same database connection that was used to fetch them. This connection is used internally by any of the following methods of the UpdatableRecord:
    -									</p>
    -									
    -</html><java><![CDATA[// Refresh a record from the database.
    -void refresh() throws DataAccessException;
    -
    -// Store (insert or update) a record to the database.
    -int store() throws DataAccessException;
    -
    -// Delete a record from the database
    -int delete() throws DataAccessException;]]></java><html>
    -									
    -									<p>
    -										See the manual's section about <reference id="serializability" title="serializability"/> for some more insight on "attached" objects. 
    -									</p>
    -									
    -									<h3>Storing</h3>
    -									<p>
    -										Storing a record will perform an <reference id="insert-statement" title="INSERT statement"/> or an <reference id="update-statement" title="UPDATE statement"/>. In general, new records are always inserted, whereas records loaded from the database are always updated. This is best visualised in code:
    -									</p>
    -
    -</html><java><![CDATA[// Create a new record
    -BookRecord book1 = create.newRecord(BOOK);
    -
    -// Insert the record: INSERT INTO BOOK (TITLE) VALUES ('1984');
    -book1.setTitle("1984");
    -book1.store();
    -
    -// Update the record: UPDATE BOOK SET PUBLISHED_IN = 1984 WHERE ID = [id]
    -book1.setPublishedIn(1948);
    -book1.store();
    -
    -// Get the (possibly) auto-generated ID from the record
    -Integer id = book1.getId();
    -
    -// Get another instance of the same book
    -BookRecord book2 = create.fetchOne(BOOK, BOOK.ID.equal(id));
    -
    -// Update the record: UPDATE BOOK SET TITLE = 'Animal Farm' WHERE ID = [id]
    -book2.setTitle("Animal Farm");
    -book2.store();]]></java><html>
    -									
    -									<p>
    -										Some remarks about storing:
    -									</p>
    -									<ul>
    -										<li>jOOQ sets only modified values in <reference id="insert-statement" title="INSERT statements"/> or <reference id="update-statement" title="UPDATE statements"/>. This allows for default values to be applied to inserted records, as specified in CREATE TABLE DDL statements.</li>
    -										<li>When store() performs an <reference id="insert-statement" title="INSERT statement"/>, jOOQ attempts to load any generated keys from the database back into the record. For more details, see the manual's section about <reference id="identity-values" title="IDENTITY values"/>.</li>
    -										<li>When loading records from <reference id="pojos" title="POJOs"/>, jOOQ will assume the record is a new record. It will hence attempt to INSERT it.</li>
    -										<li>When you activate <reference id="optimistic-locking" title="optimistic locking"/>, storing a record may fail, if the underlying database record has been changed in the mean time.</li>
    -									</ul>
    -																		
    -									<h3>Deleting</h3>
    -									<p>
    -										Deleting a record will remove it from the database. Here's how you delete records:
    -									</p>
    -									
    -</html><java><![CDATA[// Get a previously inserted book
    -BookRecord book = create.fetchOne(BOOK, BOOK.ID.equal(5));
    -
    -// Delete the book
    -book.delete();]]></java><html>
    -									
    -									<h3>Refreshing</h3>
    -									<p>
    -										Refreshing a record from the database means that jOOQ will issue a <reference id="select-statement" title="SELECT statement"/> to refresh all record values that are not the primary key. This is particularly useful when you use jOOQ's <reference id="optimistic-locking" title="optimistic locking"/> feature, in case a modified record is "stale" and cannot be stored to the database, because the underlying database record has changed in the mean time.
    -									</p>
    -									<p>
    -										In order to perform a refresh, use the following Java code:
    -									</p>									
    -
    -</html><java><![CDATA[// Fetch an updatable record from the database
    -BookRecord book = create.fetchOne(BOOK, BOOK.ID.equal(5));
    -
    -// Refresh the record
    -book.refresh();]]></java><html>
    -
    -									<h3>CRUD and SELECT statements</h3>
    -									<p>
    -										CRUD operations can be combined with regular querying, if you select records from single database tables, as explained in the manual's section about <reference id="select-statement" title="SELECT statements"/>. For this, you will need to use the selectFrom() method from the <reference id="factory" title="Factory"/>:
    -									</p>
    -									
    -</html><java><![CDATA[// Loop over records returned from a SELECT statement
    -for (BookRecord book : create.fetch(BOOK, BOOK.PUBLISHED_IN.equal(1948))) {
    -
    -  // Perform actions on BookRecords depending on some conditions
    -  if ("Orwell".equals(book.fetchAuthorByAuthorId().getLastName())) {
    -    book.delete();
    -  }
    -}]]></java></content>
    -							</section>
    -
    -							<section id="identity-values">
    -								<title>IDENTITY values</title>
    -								<content><html>
    -									<p>
    -										Many databases support the concept of IDENTITY values, or <reference id="sequence-execution" title="SEQUENCE-generated"/> key values. This is reflected by JDBC's <reference class="java.sql.Statement" anchor="#getGeneratedKeys()" title="getGeneratedKeys()"/> method. jOOQ abstracts using this method as many databases and JDBC drivers behave differently with respect to generated keys. Let's assume the following SQL Server BOOK table:
    -									</p>
    -									
    -</html><sql><![CDATA[CREATE TABLE book (
    -  ID INTEGER IDENTITY(1,1) NOT NULL,
    -  
    -  -- [...]
    -  
    -  CONSTRAINT pk_book PRIMARY KEY (id)
    -)]]></sql><html>
    -
    -									<p>
    -										If you're using jOOQ's <reference id="code-generation" title="code generator"/>, the above table will generate a <reference class="org.jooq.UpdatableRecord"/> with an IDENTITY column. This information is used by jOOQ internally, to update IDs after calling <reference id="crud-with-updatablerecords" title="store()"/>: 
    -									</p>
    -									
    -</html><java><![CDATA[BookRecord book = create.newRecord(BOOK);
    -book.setTitle("1984");
    -book.store();
    -
    -// The generated ID value is fetched after the above INSERT statement
    -System.out.println(book.getId());]]></java><html>
    -
    -									<h3>Database compatibility</h3>
    -									<p>
    -										<strong>DB2, Derby, HSQLDB, Ingres</strong>
    -									</p>
    -									<p>
    -										These SQL dialects implement the standard very neatly.
    -									</p>
    -</html><sql><![CDATA[id INTEGER GENERATED BY DEFAULT AS IDENTITY
    -id INTEGER GENERATED BY DEFAULT AS IDENTITY (START WITH 1)]]></sql><html>
    -
    -									<p>
    -										<strong>H2, MySQL, Postgres, SQL Server, Sybase ASE, Sybase SQL Anywhere</strong>
    -									</p>
    -									<p>
    -										These SQL dialects implement identites, but the DDL syntax doesn’t follow the standard
    -									</p>
    -</html><sql><![CDATA[-- H2 mimicks MySQL's and SQL Server's syntax
    -ID INTEGER IDENTITY(1,1)
    -ID INTEGER AUTO_INCREMENT
    --- MySQL and SQLite
    -ID INTEGER NOT NULL AUTO_INCREMENT
    -
    --- Postgres serials implicitly create a sequence
    --- Postgres also allows for selecting from custom sequences
    --- That way, sequences can be shared among tables
    -id SERIAL NOT NULL
    -
    --- SQL Server
    -ID INTEGER IDENTITY(1,1) NOT NULL
    --- Sybase ASE
    -id INTEGER IDENTITY NOT NULL
    --- Sybase SQL Anywhere
    -id INTEGER NOT NULL IDENTITY]]></sql><html>
    -
    -									<p>
    -										<strong>Oracle</strong>
    -									</p>
    -									<p>
    -										Oracle does not know any identity columns at all. Instead, you will have to use a trigger and update the ID column yourself, using a custom sequence. Something along these lines:
    -									</p>
    -</html><sql><![CDATA[CREATE OR REPLACE TRIGGER my_trigger
    -BEFORE INSERT
    -ON my_table
    -REFERENCING NEW AS new
    -FOR EACH ROW
    -BEGIN
    -  SELECT my_sequence.nextval
    -  INTO :new.id
    -  FROM dual;
    -END my_trigger;]]></sql><html>
    -
    -									<p>
    -										Note, that this approach can be employed in most databases supporting sequences and triggers! It is a lot more flexible than standard identities
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="navigation-methods">
    -								<title>Navigation methods</title>
    -								<content><html>
    -									<p>
    -										When using jOOQ's <reference id="code-generation" title="code generator"/> along with its <reference id="codegen-records" title="record generation capabilities"/>, generated records can have navigation methods contained in them, if properly <reference id="codegen-advanced" title="configured"/>. These navigation methods allow for "navigating" inbound or outbound foreign key references by executing an appropriate query. An example is given here: 
    -									</p>
    -				
    -</html><code-pair>
    -<sql><![CDATA[CREATE TABLE book (
    -  AUTHOR_ID NUMBER(7) NOT NULL,
    -  
    -  -- [...]
    -  
    -  FOREIGN KEY (AUTHOR_ID) REFERENCES author(ID)
    -)]]></sql><java><![CDATA[BookRecord book = create.fetch(BOOK, BOOK.ID.equal(5));
    -
    -// Find the author of a book
    -AuthorRecord author = book.fetchAuthor();
    -
    -// Find other books by that author
    -List<BookRecord> books = author.fetchBookList();]]></java>
    -</code-pair><html>					
    -
    -									<p>
    -										These methods are safe for use with several foreign keys referencing the same tables:
    -									</p>
    -				
    -</html><code-pair>
    -<sql><![CDATA[CREATE TABLE book (
    -  AUTHOR_ID NUMBER(7) NOT NULL,
    -  CO_AUTHOR_ID NUMBER(7) NOT NULL,
    -  
    -  -- [...]
    -  
    -  FOREIGN KEY (AUTHOR_ID) REFERENCES author(ID),
    -  FOREIGN KEY (CO_AUTHOR_ID) REFERENCES author(ID)
    -)]]></sql><java><![CDATA[BookRecord book = create.fetch(BOOK, BOOK.ID.equal(5));
    -
    -// Find the author of a book
    -AuthorRecord author   = book.fetchAuthorByAuthorId();
    -AuthorRecord coAuthor = book.fetchAuthorByCoAuthorId();
    -
    -// Find other books by those authors
    -List<BookRecord> books = author.fetchBookListByAuthorId();
    -List<BookRecord> books = coAuthor.fetchBookListByCoAuthorId();]]></java>
    -</code-pair><html>					
    -
    -									<p>
    -										Note that, unlike in Hibernate, jOOQ's generated navigation methods will always lazy-fetch relevant records, without caching any results. In other words, every time you run such a fetch method, a new query will be issued.
    -									</p>
    -									<p>
    -										These fetch methods only work on "attached" records. See the manual's section about <reference id="serializability" title="serializability"/> for some more insight on "attached" objects.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="non-updatable-records">
    -								<title>Non-updatable records</title>
    -								<content><html>
    -									<p>
    -										Tables without UNIQUE keys are considered non-updatable by jOOQ, as jOOQ has no way of uniquely identifying such a record within the database. If you're using jOOQ's <reference id="code-generation" title="code generator"/>, such tables will generate <reference class="org.jooq.TableRecord"/> classes, instead of <reference class="org.jooq.UpdatableRecord"/> classes. When you fetch <reference id="record-vs-tablerecord" title="typed records"/> from such a table, the returned records will not allow for calling any of the <reference id="crud-with-updatablerecords" title="store(), refresh(), delete()"/> methods. 
    -									</p>
    -									
    -									<p>
    -										Note, that some databases use internal rowid or object-id values to identify such records. jOOQ does not support these vendor-specific record meta-data.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="optimistic-locking">
    -								<title>Optimistic locking</title>
    -								<content><html>
    -									<p>
    -										jOOQ allows you to perform <reference id="crud-with-updatablerecords" title="CRUD"/> operations using optimistic locking. You can immediately take advantage of this feature by activating the relevant <reference id="custom-settings" title="executeWithOptimisticLocking Setting"/>. Without any further knowledge of the underlying data semantics, this will have the following impact on store() and delete() methods:
    -									</p>
    -									<ul>
    -										<li>INSERT statements are not affected by this Setting flag</li>
    -										<li>Prior to UPDATE or DELETE statements, jOOQ will run a <reference id="for-update-clause" title="SELECT .. FOR UPDATE"/> statement, pessimistically locking the record for the subsequent UPDATE / DELETE</li>
    -										<li>The data fetched with the previous SELECT will be compared against the data in the record being stored or deleted</li>
    -										<li>An <reference class="org.jooq.exception.DataChangedException"/> is thrown if the record had been modified in the mean time</li>
    -										<li>The record is successfully stored / deleted, if the record had not been modified in the mean time.</li>
    -									</ul>
    -									<p>
    -										The above changes to jOOQ's behaviour are transparent to the API, the only thing you need to do for it to be activated is to set the Settings flag. Here is an example illustrating optimistic locking:
    -									</p>
    -
    -</html><java><![CDATA[// Properly configure the Factory
    -Factory optimistic = new Factory(connection, SQLDialect.ORACLE, 
    -  new Settings().withExecuteWithOptimisticLocking(true));
    -  
    -// Fetch a book two times
    -BookRecord book1 = optimistic.fetch(BOOK, BOOK.ID.equal(5));
    -BookRecord book2 = optimistic.fetch(BOOK, BOOK.ID.equal(5));
    -
    -// Change the title and store this book. The underlying database record has not been modified, it can be safely updated.
    -book1.setTitle("Animal Farm");
    -book1.store();
    -
    -// Book2 still references the original TITLE value, but the database holds a new value from book1.store(). 
    -// This store() will thus fail:
    -book2.setTitle("1984");
    -book2.store();]]></java><html>								
    -	
    -									<h3>Optimised optimistic locking using TIMESTAMP fields</h3>
    -									<p>
    -										If you're using jOOQ's <reference id="code-generation" title="code generator"/>, you can take indicate TIMESTAMP or UPDATE COUNTER fields for every generated table in the <reference id="codegen-advanced" title="code generation configuration"/>. Let's say we have this table:
    -									</p>
    -
    -</html><sql><![CDATA[CREATE TABLE book (
    -  
    -  -- This column indicates when each book record was modified for the last time
    -  MODIFIED TIMESTAMP NOT NULL,
    -  -- [...]
    -)]]></sql><html>									
    -
    -									<p>
    -										The MODIFIED column will contain a timestamp indicating the last modification timestamp for any book in the BOOK table. If you're using jOOQ and it's <reference id="crud-with-updatablerecords" title="store() methods on UpdatableRecords"/>, jOOQ will then generate this TIMESTAMP value for you, automatically. However, instead of running an additional <reference id="for-update-clause" title="SELECT .. FOR UPDATE"/> statement prior to an UPDATE or DELETE statement, jOOQ adds a WHERE-clause to the UPDATE or DELETE statement, checking for TIMESTAMP's integrity. This can be best illustrated with an example:   
    -									</p>
    -									
    -</html><java><![CDATA[// Properly configure the Factory
    -Factory optimistic = new Factory(connection, SQLDialect.ORACLE, 
    -  new Settings().withExecuteWithOptimisticLocking(true));
    -  
    -// Fetch a book two times
    -BookRecord book1 = optimistic.fetch(BOOK, BOOK.ID.equal(5));
    -BookRecord book2 = optimistic.fetch(BOOK, BOOK.ID.equal(5));
    -
    -// Change the title and store this book. The MODIFIED value has not been changed since the book was fetched. 
    -// It can be safely updated
    -book1.setTitle("Animal Farm");
    -book1.store();
    -
    -// Book2 still references the original MODIFIED value, but the database holds a new value from book1.store(). 
    -// This store() will thus fail:
    -book2.setTitle("1984");
    -book2.store();]]></java><html>
    -
    -									<p>
    -										As before, without the added TIMESTAMP column, optimistic locking is transparent to the API.
    -									</p>
    -									
    -									<h3>Optimised optimistic locking using VERSION fields</h3>
    -									<p>
    -										Instead of using TIMESTAMPs, you may also use numeric VERSION fields, containing version numbers that are incremented by jOOQ upon store() calls.
    -									</p>
    -
    -									<p>
    -										Note, for explicit pessimistic locking, please consider the manual's section about the <reference id="for-update-clause" title="FOR UPDATE clause"/>. For more details about how to configure TIMESTAMP or VERSION fields, consider the manual's section about <reference id="codegen-advanced" title="advanced code generator configuration"/>.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="batch-execution-for-crud">
    -								<title>Batch execution</title>
    -								<content><html>
    -									<p>
    -										When inserting, updating, deleting a lot of records, you may wish to profit from JDBC batch operations, which can be performed by jOOQ. These are available through jOOQ's <reference id="factory" title="Factory"/> as shown in the following example:
    -									</p>
    -									
    -</html><java><![CDATA[// Fetch a bunch of books
    -List<BookRecord> books = create.fetch(BOOK);
    -
    -// Modify the above books, and add some new ones:
    -modify(books);
    -addMore(books);
    -
    -// Batch-update and/or insert all of the above books
    -create.batchStore(books);]]></java><html>					
    -
    -									<p>
    -										Internally, jOOQ will render all the required SQL statements and execute them as a regular <reference id="batch-execution" title="JDBC batch execution"/>. 
    -									</p>				
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -				    <section id="daos">
    -						<title>DAOs</title>
    -						<content><html>
    -							<p>
    -								If you're using jOOQ's <reference id="code-generation" title="code generator"/>, you can configure it to generate <reference id="pojos" title="POJOs" /> and DAOs for you. jOOQ then generates one DAO per <reference id="crud-with-updatablerecords" title="UpdatableRecord"/>, i.e. per table with a single-column primary key. Generated DAOs implement a common jOOQ type called <reference class="org.jooq.DAO"/>. This type contains the following methods:
    -							</p>
    -							
    -</html><java><![CDATA[// <R> corresponds to the DAO's related table
    -// <P> corresponds to the DAO's related generated POJO type
    -// <T> corresponds to the DAO's related table's primary key type. 
    -// Note that multi-column primary keys are not yet supported by DAOs
    -public interface DAO<R extends TableRecord<R>, P, T> {
    -
    -    // These methods allow for inserting POJOs
    -    void insert(P object) throws DataAccessException;
    -    void insert(P... objects) throws DataAccessException;
    -    void insert(Collection<P> objects) throws DataAccessException;
    -    
    -    // These methods allow for updating POJOs based on their primary key
    -    void update(P object) throws DataAccessException;
    -    void update(P... objects) throws DataAccessException;
    -    void update(Collection<P> objects) throws DataAccessException;
    -    
    -    // These methods allow for deleting POJOs based on their primary key
    -    void delete(P... objects) throws DataAccessException;
    -    void delete(Collection<P> objects) throws DataAccessException;
    -    void deleteById(T... ids) throws DataAccessException;
    -    void deleteById(Collection<T> ids) throws DataAccessException;
    -    
    -    // These methods allow for checking record existence
    -    boolean exists(P object) throws DataAccessException;
    -    boolean existsById(T id) throws DataAccessException;
    -    long count() throws DataAccessException;
    -    
    -    // These methods allow for retrieving POJOs by primary key or by some other field
    -    List<P> findAll() throws DataAccessException;
    -    P findById(T id) throws DataAccessException;
    -    <Z> List<P> fetch(Field<Z> field, Z... values) throws DataAccessException;
    -    <Z> P fetchOne(Field<Z> field, Z value) throws DataAccessException;
    -
    -    // These methods provide DAO meta-information
    -    Table<R> getTable();
    -    Class<P> getType();
    -}]]></java><html>
    -
    -							<p>
    -								Besides these base methods, generated DAO classes implement various useful fetch methods. An incomplete example is given here, for the BOOK table:
    -							</p>
    -
    -</html><java><![CDATA[// An example generated BookDao class
    -public class BookDao extends DAOImpl<BookRecord, Book, Integer> {
    -
    -    // Columns with primary / unique keys produce fetchOne() methods    
    -    public Book fetchOneById(Integer value) { ... }
    -
    -    // Other columns produce fetch() methods, returning several records
    -    public List<Book> fetchByAuthorId(Integer... values) { ... }
    -    public List<Book> fetchByTitle(String... values) { ... }
    -}]]></java><html>
    -							<p>
    -								Note that you can further subtype those pre-generated DAO classes, to add more useful DAO methods to them. Using such a DAO is simple:
    -							</p>
    -							
    -</html><java><![CDATA[// Initialise a Factory
    -Factory create = new Factory(connection, SQLDialect.ORACLE);
    -
    -// Initialise the DAO with the Factory
    -BookDao bookDao = new BookDao(create);
    -
    -// Start using the DAO
    -Book book = bookDao.findById(5);
    -
    -// Modify and update the POJO
    -book.setTitle("1984");
    -book.setPublishedIn(1948);
    -bookDao.update(book);
    -
    -// Delete it again
    -bookDao.delete(book);]]></java></content>
    -					</section>
    -
    -				    <section id="exception-handling">
    -						<title>Exception handling</title>
    -						<content><html>
    -							<h3>Checked vs. unchecked exceptions</h3>
    -							<p>
    -								This is an eternal and religious debate. Pros and cons have been discussed time and again, and it still is a matter of taste, today. In this case, jOOQ clearly takes a side. jOOQ's exception strategy is simple:
    -							</p>
    -							<ul>
    -								<li>All "system exceptions" are unchecked. If in the middle of a transaction involving business logic, there is no way that you can recover sensibly from a lost database connection, or a constraint violation that indicates a bug in your understanding of your database model.</li>
    -								<li>All "business exceptions" are checked. Business exceptions are true exceptions that you should handle (e.g. not enough funds to complete a transaction).</li>
    -							</ul>
    -							<p>
    -								With jOOQ, it's simple. All of jOOQ's exceptions are "system exceptions", hence they are all unchecked.
    -							</p>
    -							
    -							<h3>jOOQ's DataAccessException</h3>
    -							<p>
    -								jOOQ uses its own <reference class="org.jooq.exception.DataAccessException"/> to wrap any underlying <reference class="java.sql.SQLException"/> that might have occurred. Note that all methods in jOOQ that may cause such a DataAccessException document this both in the Javadoc as well as in their method signature.
    -							</p>
    -							<p>
    -								DataAccessException is subtyped several times as follows:
    -							</p>
    -							<ul>
    -								<li><strong>DataAccessException</strong>: General exception usually originating from a <reference class="java.sql.SQLException"/></li>
    -								<li><strong>DataChangedException</strong>: An exception indicating that the database's underlying record has been changed in the mean time (see <reference id="optimistic-locking" title="optimistic locking"/>)</li>
    -								<li><strong>DataTypeException</strong>: Something went wrong during type conversion</li>
    -								<li><strong>DetachedException</strong>: A SQL statement was executed on a "detached" <reference id="crud-with-updatablerecords" title="UpdatableRecord"/> or a "detached" <reference id="sql-statements" title="SQL statement"/>.</li>
    -								<li><strong>InvalidResultException</strong>: An operation was performed expecting only one result, but several results were returned.</li>
    -								<li><strong>MappingException</strong>: Something went wrong when loading a record from a <reference id="pojos" title="POJO"/> or when mapping a record into a POJO</li>
    -							</ul>
    -							
    -							<h3>Override jOOQ's exception handling</h3>
    -							<p>
    -								The following section about <reference id="execute-listeners" title="execute listeners"/> documents means of overriding jOOQ's exception handling, if you wish to deal separately with some types of constraint violations, or if you raise business errors from your database, etc.
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="execute-listeners">
    -						<title>ExecuteListeners</title>
    -						<content><html>
    -							<p>
    -								The <reference id="custom-settings" title="jOOQ Factory Settings"/> let you specify a list of <reference class="org.jooq.ExecuteListener"/> classes. The ExecuteListener is essentially an event listener for Query, Routine, or ResultSet render, prepare, bind, execute, fetch steps. It is a base type for loggers, debuggers, profilers, data collectors, triggers, etc. Advanced ExecuteListeners can also provide custom implementations of Connection, PreparedStatement and ResultSet to jOOQ in apropriate methods.
    -							</p>
    -							<p>
    -								For convenience and better backwards-compatibility, consider extending <reference class="org.jooq.impl.DefaultExecuteListener"/> instead of implementing this interface.
    -							</p>
    -							<p>
    -								Here is a sample implementation of an ExecuteListener, that is simply counting the number of queries per type that are being executed using jOOQ:
    -							</p>
    -
    -</html><java><![CDATA[package com.example;
    -
    -// Extending DefaultExecuteListener, which provides empty implementations for all methods...
    -public class StatisticsListener extends DefaultExecuteListener {
    -    public static Map<ExecuteType, Integer> STATISTICS = new HashMap<ExecuteType, Integer>();
    -
    -    // Count "start" events for every type of query executed by jOOQ
    -    @Override
    -    public void start(ExecuteContext ctx) {
    -        synchronized (STATISTICS) {
    -            Integer count = STATISTICS.get(ctx.type());
    -    
    -            if (count == null) {
    -                count = 0;
    -            }
    -    
    -            STATISTICS.put(ctx.type(), count + 1);
    -        }
    -    }
    -}]]></java><html>
    -
    -							<p>
    -								Now, configure jOOQ's runtime to load your listener
    -							</p>
    -
    -</html><xml><![CDATA[<settings>
    -  <executeListeners>
    -    <executeListener>com.example.StatisticsListener</executeListener>
    -  </executeListeners>
    -</settings>]]></xml><html>
    -
    -							<p>
    -								And log results any time with a snippet like this:
    -							</p>
    -
    -</html><java><![CDATA[log.info("STATISTICS");
    -log.info("----------");
    -
    -for (ExecuteType type : ExecuteType.values()) {
    -    log.info(type.name(), StatisticsListener.STATISTICS.get(type) + " executions");
    -}]]></java><html>
    -                            <p>
    -                            	This may result in the following log output:
    -                            </p>
    -
    -</html><config>15:16:52,982  INFO - TEST STATISTICS
    -15:16:52,982  INFO - ---------------
    -15:16:52,983  INFO - READ                     : 919 executions
    -15:16:52,983  INFO - WRITE                    : 117 executions
    -15:16:52,983  INFO - DDL                      : 2 executions
    -15:16:52,983  INFO - BATCH                    : 4 executions
    -15:16:52,983  INFO - ROUTINE                  : 21 executions
    -15:16:52,983  INFO - OTHER                    : 30 executions</config><html>
    -
    -							<p>
    -								Please read the <reference class="org.jooq.ExecuteListener" title="ExecuteListener Javadoc"/> for more details
    -							</p>
    -							<p>
    -								See also the manual's sections about <reference id="logging" title="logging"/> and the <reference id="jooq-console" title="jOOQ Console"/> for more sample implementations of actual ExecuteListeners.
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="logging">
    -						<title>Logging</title>
    -						<content><html>
    -							<p>
    -								jOOQ logs all SQL queries and fetched result sets to its internal DEBUG logger, which is implemented as an <reference id="execute-listeners" title="execute listener"/>. By default, execute logging is activated in the <reference id="custom-settings" title="jOOQ Factory Settings"/>. In order to see any DEBUG log output, put either log4j or slf4j on jOOQ's classpath along with their respective configuration. A sample log4j configuration can be seen here:
    -							</p>
    -							
    -</html><xml><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
    -<log4j:configuration>
    -    <appender name="stdout" class="org.apache.log4j.ConsoleAppender">
    -        <layout class="org.apache.log4j.PatternLayout">
    -            <param name="ConversionPattern" value="%m%n" />
    -        </layout>
    -    </appender>
    -
    -    <root>
    -        <priority value="debug" />
    -        <appender-ref ref="stdout" />
    -    </root>
    -</log4j:configuration>]]></xml><html>
    -
    -							<p>
    -								With the above configuration, let's fetch some data with jOOQ
    -							</p>
    -							
    -</html><java><![CDATA[// Using H2, this time
    -create.select(BOOK.ID, BOOK.TITLE).from(BOOK).orderBy(BOOK.ID).limit(1, 2).fetch();]]></java><html>
    -
    -							<p>
    -								The above query may result in the following log output:
    -							</p>
    -
    -</html><text><![CDATA[Executing query          : select "BOOK"."ID", "BOOK"."TITLE" from "BOOK" order by "BOOK"."ID" asc, limit ? offset ?
    --> with bind values      : select "BOOK"."ID", "BOOK"."TITLE" from "BOOK" order by "BOOK"."ID" asc, limit 2 offset 1
    -Query executed           : Total: 1.439ms
    -Fetched result           : +----+------------+
    -                         : |  ID|TITLE       |
    -                         : +----+------------+
    -                         : |   2|Animal Farm |
    -                         : |   3|O Alquimista|
    -                         : +----+------------+
    -Finishing                : Total: 4.814ms, +3.375ms
    -]]></text><html>
    -
    -							<p>
    -								Essentially, jOOQ will log
    -							</p>
    -							<ul>
    -								<li>The SQL statement as rendered to the prepared statement</li>
    -								<li>The SQL statement with inlined bind values (for improved debugging)</li>
    -								<li>The query execution time</li>
    -								<li>The first 5 records of the result. This is formatted using <reference id="exporting-text" title="jOOQ's text export"/></li>
    -								<li>The total execution + fetching time</li>
    -							</ul>
    -
    -							<p>
    -								If you wish to use your own logger (e.g. avoiding printing out sensitive data), you can deactivate jOOQ's logger using <reference id="custom-settings" title="your custom settings"/> and implement your own <reference id="execute-listeners" title="execute listener logger"/>.
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="performance-considerations">
    -						<title>Performance considerations</title>
    -						<content><html>
    -							<p>
    -								Many users may have switched from higher-level abstractions such as Hibernate to jOOQ, because of Hibernate's hard-to-manage performance, when it comes to large database schemas and complex second-level caching strategies. jOOQ is not a lightweight database abstraction framework, and it comes with its own overhead. Please be sure to consider the following points:
    -							</p>
    -							<ul>
    -								<li>It takes some time to construct jOOQ queries. If you can reuse the same queries, you might cache them. Beware of thread-safety issues, though, as jOOQ's <reference id="factory" title="Factory"/> is not threadsafe, and queries are "attached" to their creating Factory</li>
    -								<li>It takes some time to render SQL strings. Internally, jOOQ reuses the same <reference class="java.lang.StringBuilder"/> for the complete query, but some rendering elements may take their time. You could, of course, cache SQL generated by jOOQ and prepare your own <reference class="java.sql.PreparedStatement"/> objects</li>
    -								<li>It takes some time to bind values to prepared statements. jOOQ does not keep any open prepared statements, internally. Use a sophisticated connection pool, that will cache prepared statements and inject them into jOOQ through the standard JDBC API</li>
    -								<li>It takes some time to fetch results. By default, jOOQ will always fetch the complete <reference class="java.sql.ResultSet"/> into memory. Use <reference id="lazy-fetching" title="lazy fetching"/> to prevent that, and scroll over an open underlying database cursor</li>
    -							</ul>
    -							
    -							<h3>Optimise wisely</h3>
    -							<p>
    -								Don't be put off by the above paragraphs. You should optimise wisely, i.e. only in places where you really need very high throughput to your database. jOOQ's overhead compared to plain JDBC is typically less than 1ms per query.
    -							</p>
    -						</html></content>
    -					</section>
    -				</sections>
    -			</section>
    -
    -			<section id="code-generation">
    -				<title>Code generation</title>
    -				<content><html>
    -					<p>
    -						While optional, source code generation is one of jOOQ's main assets if you wish to increase developer productivity. jOOQ's code generator takes your database schema and reverse-engineers it into a set of Java classes modelling <reference id="table-expressions" title="tables"/>, <reference id="record-vs-tablerecord" title="records"/>, <reference id="sequence-execution" title="sequences"/>, <reference id="pojos" title="POJOs"/>, <reference id="daos" title="DAOs"/>, <reference id="stored-procedures" title="stored procedures"/>, user-defined types and many more.
    -					</p>
    -					<p>
    -						The essential ideas behind source code generation are these:
    -					</p>
    -					<ul>
    -						<li><strong>Increased IDE support</strong>: Type your Java code directly against your database schema, with all type information available</li>
    -						<li><strong>Type-safety</strong>: When your database schema changes, your generated code will change as well. Removing columns will lead to compilation errors, which you can detect early.</li>
    -					</ul>
    -					<p>
    -						The following chapters will show how to configure the code generator and how to generate various artefacts.
    -					</p>
    -				</html></content>
    -
    -				<sections>
    -				    <section id="codegen-configuration">
    -						<title>Configuration and setup of the generator</title>
    -						<content><html>
    -							<p>
    -								There are three binaries available with jOOQ, to be downloaded from <a href="https://sourceforge.net/projects/jooq/">SourceForge</a> or from Maven central:
    -							</p>
    -							<ul>
    -								<li>
    -									<strong>jooq-{jooq-version}.jar</strong>
    -									<br />
    -									The main library that you will include in your application to run jOOQ
    -								</li>
    -								<li>
    -									<strong>jooq-meta-{jooq-version}.jar</strong>
    -									<br />
    -									The utility that you will include in your build to navigate your database schema for code generation. This can be used as a schema crawler as well.
    -								</li>
    -								<li>
    -									<strong>jooq-codegen-{jooq-version}.jar</strong>
    -									<br />
    -									The utility that you will include in your build to generate your database schema
    -								</li>
    -							</ul>
    -
    -							<h3>Configure jOOQ's code generator</h3>
    -							<p>
    -								You need to tell jOOQ some things about your database connection. Here's an example of how to do it for an Oracle database
    -							</p>
    -							
    -</html><xml><![CDATA[<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    -<configuration>
    -  <!-- Configure the database connection here -->
    -  <jdbc>
    -    <driver>oracle.jdbc.OracleDriver</driver>
    -    <url>jdbc:oracle:thin:@[your jdbc connection parameters]</url>
    -    <user>[your database user]</user>
    -    <password>[your database password]</password>
    -    
    -    <!-- You can also pass user/password and other JDBC properties in the optional properties tag: -->
    -    <properties>
    -      <property><key>user</key><value>[db-user]</value></property>
    -      <property><key>password</key><value>[db-password]</value></property>
    -    </properties>
    -  </jdbc>
    -
    -  <generator>
    -    <database>
    -      <!-- The database dialect from jooq-meta. Available dialects are
    -           named org.util.[database].[database]Database. Known values are:
    -
    -           org.jooq.util.ase.ASEDatabase (to be used with Sybase ASE)
    -           org.jooq.util.cubrid.CUBRIDDatabase
    -           org.jooq.util.db2.DB2Database
    -           org.jooq.util.derby.DerbyDatabase
    -           org.jooq.util.h2.H2Database
    -           org.jooq.util.hsqldb.HSQLDBDatabase
    -           org.jooq.util.ingres.IngresDatabase
    -           org.jooq.util.mysql.MySQLDatabase
    -           org.jooq.util.oracle.OracleDatabase
    -           org.jooq.util.postgres.PostgresDatabase
    -           org.jooq.util.sqlite.SQLiteDatabase
    -           org.jooq.util.sqlserver.SQLServerDatabase
    -           org.jooq.util.sybase.SybaseDatabase (to be used with Sybase SQL Anywhere)
    -
    -           You can also provide your own org.jooq.util.Database implementation
    -           here, if your database is currently not supported or if you wish to
    -           read the database schema from a file, such as a Hibernate .hbm.xml file -->
    -      <name>org.jooq.util.oracle.OracleDatabase</name>
    -
    -      <!-- All elements that are generated from your schema (several Java
    -           regular expressions, separated by comma) Watch out for
    -           case-sensitivity. Depending on your database, this might be
    -           important! You can create case-insensitive regular expressions
    -           using this syntax: (?i:expr)A comma-separated list of regular
    -           expressions -->
    -      <includes>.*</includes>
    -
    -      <!-- All elements that are excluded from your schema (several Java
    -           regular expressions, separated by comma). Excludes match before
    -           includes -->
    -      <excludes></excludes>
    -
    -      <!-- The schema that is used locally as a source for meta information.
    -           This could be your development schema or the production schema, etc
    -           This cannot be combined with the schemata element.
    -
    -           If left empty, jOOQ will generate all available schemata. See the
    -           manual's next section to learn how to generate several schemata -->
    -      <inputSchema>[your database schema / owner / name]</inputSchema>
    -    </database>
    -
    -    <generate>
    -      <!-- Generation flags: See advanced configuration properties -->
    -    </generate>
    -
    -    <target>
    -      <!-- The destination package of your generated classes (within the
    -           destination directory) -->
    -      <packageName>[org.jooq.your.packagename]</packageName>
    -
    -      <!-- The destination directory of your generated classes -->
    -      <directory>[/path/to/your/dir]</directory>
    -    </target>
    -  </generator>
    -</configuration>]]></xml><html>
    -
    -							<p>
    -								There are also lots of advanced configuration parameters, which will be treated in the <reference id="codegen-advanced" title="manual's section about advanced code generation features"/> Note, you can find the official XSD file for a formal specification at:<br/>
    -							    <a href="http://www.jooq.org/xsd/jooq-codegen-2.5.0.xsd" title="The jOOQ-codegen configuration XSD">http://www.jooq.org/xsd/jooq-codegen-2.5.0.xsd</a>
    -						    </p>
    -
    -							<h3>Run jOOQ code generation</h3>
    -							<p>
    -								Code generation works by calling this class with the above property file as argument.
    -							</p>
    -							
    -</html><config>org.jooq.util.GenerationTool /jooq-config.xml</config><html>
    -
    -							<p>
    -								Be sure that these elements are located on the classpath:
    -							</p>
    -							
    -							<ul>
    -								<li>The XML configuration file</li>
    -								<li>jooq-{jooq-version}.jar, jooq-meta-{jooq-version}.jar, jooq-codegen-{jooq-version}.jar</li>
    -								<li>The JDBC driver you configured</li>
    -							</ul>
    -
    -							<h3>A command-line example (For Windows, unix/linux/etc will be similar)</h3>
    -							<ul>
    -								<li>Put the property file, jooq*.jar and the JDBC driver into a directory, e.g. C:\temp\jooq</li>
    -							    <li>Go to C:\temp\jooq</li>
    -							    <li>Run java -cp jooq-{jooq-version}.jar;jooq-meta-{jooq-version}.jar;jooq-codegen-{jooq-version}.jar;[JDBC-driver].jar;. org.jooq.util.GenerationTool /[XML file] </li>
    -							</ul>
    -							<p>
    -								Note that the property file must be passed as a classpath resource
    -							</p>
    -
    -							<h3>Run code generation from Eclipse</h3>
    -							<p>
    -								Of course, you can also run code generation from your IDE. In Eclipse, set up a project like this. Note that this example uses jOOQ's log4j support by adding log4j.xml and log4j.jar to the project classpath:
    -							</p>
    -							<div class="screenshot">
    -							<img class="screenshot" src="&lt;?=$root?&gt;/img/eclipse-example-01.png" alt="Eclipse configuration"/>
    -							</div>
    -
    -							<p>
    -								Once the project is set up correctly with all required artefacts on the classpath, you can configure an Eclipse Run Configuration for org.jooq.util.GenerationTool.
    -							</p>
    -							<div class="screenshot">
    -							<img class="screenshot" src="&lt;?=$root?&gt;/img/eclipse-example-02.png" alt="Eclipse configuration"/>
    -							</div>
    -
    -							<p>
    -								With the XML file as an argument
    -							</p>
    -							<div class="screenshot">
    -							<img class="screenshot" src="&lt;?=$root?&gt;/img/eclipse-example-03.png" alt="Eclipse configuration"/>
    -							</div>
    -
    -							<p>
    -								And the classpath set up correctly
    -							</p>
    -							<div class="screenshot">
    -							<img class="screenshot" src="&lt;?=$root?&gt;/img/eclipse-example-04.png" alt="Eclipse configuration"/>
    -							</div>
    -
    -							<p>
    -								Finally, run the code generation and see your generated artefacts
    -							</p>
    -							<div class="screenshot">
    -							<img class="screenshot" src="&lt;?=$root?&gt;/img/eclipse-example-05.png" alt="Eclipse configuration"/>
    -							</div>
    -
    -							<h3>Run generation with ant</h3>
    -							<p>
    -								You can also use an ant task to generate your classes. As a rule of thumb, remove the dots "." and dashes "-" from the .properties file's property names to get the ant task's arguments:
    -							</p>
    -							
    -</html><xml><![CDATA[<!-- Task definition -->
    -<taskdef name="generate-classes" classname="org.jooq.util.GenerationTask">
    -  <classpath>
    -    <fileset dir="${path.to.jooq.distribution}">
    -      <include name="jooq-{jooq-version}.jar"/>
    -      <include name="jooq-meta-{jooq-version}.jar"/>
    -      <include name="jooq-codegen-{jooq-version}.jar"/>
    -    </fileset>
    -    <fileset dir="${path.to.mysql.driver}">
    -      <include name="${mysql.driver}.jar"/>
    -    </fileset>
    -  </classpath>
    -</taskdef>
    -
    -<!-- Run the code generation task -->
    -<target name="generate-test-classes">
    -  <generate-classes
    -      jdbcurl="jdbc:mysql://localhost/test"
    -      jdbcuser="root"
    -      jdbcpassword=""
    -      generatordatabaseinputschema="test"
    -      generatortargetpackage="org.jooq.test.generatedclasses"
    -      generatortargetdirectory="${basedir}/src"/>
    -</target>]]></xml><html>
    -
    -							<p>
    -								Note that when running code generation with ant's &lt;java/&gt; task, you may have to set fork="true":
    -							</p>
    -
    -</html><xml><![CDATA[<!-- Run the code generation task -->
    -<target name="generate-test-classes">
    -  <java fork="true" classname="org.jooq.util.GenerationTool">
    -    [...]
    -  </java><html>
    -</target>
    -]]></xml><html>
    -
    -							<h3>Integrate generation with Maven</h3>
    -							<p>
    -								Using the official jOOQ-codegen-maven plugin, you can integrate source code generation in your Maven build process:
    -							</p>
    -
    -</html><xml><![CDATA[<plugin>
    -
    -  <!-- Specify the maven code generator plugin -->
    -  <groupId>org.jooq</groupId>
    -  <artifactId>jooq-codegen-maven</artifactId>
    -  <version>{jooq-version}</version>
    -
    -  <!-- The plugin should hook into the generate goal -->
    -  <executions>
    -    <execution>
    -      <goals>
    -        <goal>generate</goal>
    -      </goals>
    -    </execution>
    -  </executions>
    -
    -  <!-- Manage the plugin's dependency. In this example, we'll use a PostgreSQL database -->
    -  <dependencies>
    -    <dependency>
    -      <groupId>postgresql</groupId>
    -      <artifactId>postgresql</artifactId>
    -      <version>8.4-702.jdbc4</version>
    -    </dependency>
    -  </dependencies>
    -
    -  <!-- Specify the plugin configuration.
    -       The configuration format is the same as for the standalone code generator -->
    -  <configuration>
    -
    -    <!-- JDBC connection parameters -->
    -    <jdbc>
    -      <driver>org.postgresql.Driver</driver>
    -      <url>jdbc:postgresql:postgres</url>
    -      <user>postgres</user>
    -      <password>test</password>
    -    </jdbc>
    -
    -    <!-- Generator parameters -->
    -    <generator>
    -      <name>org.jooq.util.DefaultGenerator</name>
    -      <database>
    -        <name>org.jooq.util.postgres.PostgresDatabase</name>
    -        <includes>.*</includes>
    -        <excludes></excludes>
    -        <inputSchema>public</inputSchema>
    -      </database>
    -      <target>
    -        <packageName>org.jooq.util.maven.example</packageName>
    -        <directory>target/generated-sources/jooq</directory>
    -      </target>
    -    </generator>
    -  </configuration>
    -</plugin>
    -]]></xml><html>
    -
    -							<p>
    -								See the full example of a pom.xml including the jOOQ-codegen artefact here:<br/>
    -								<a href="https://github.com/jOOQ/jOOQ/blob/master/jOOQ-codegen-maven-example/pom.xml"
    -								  title="jOOQ-codegen-maven example pom.xml file">https://github.com/jOOQ/jOOQ/blob/master/jOOQ-codegen-maven-example/pom.xml</a>
    -							  </p>
    -
    -                            <h3>Migrate properties files from jOOQ 1.7, early versions of jOOQ 2.0.x:</h3>
    -                            <p>
    -                                Before jOOQ 2.0.4, the code generator was configured using properties files. These files are still supported for source code generation, but their syntax won't be maintained any longer. If you wish to migrate to XML, you can migrate the file using this command on the command line
    -                            </p>
    -
    -</html><config>org.jooq.util.GenerationTool /jooq-config.properties migrate</config><html>
    -
    -							<p>
    -								Using the migrate flag, jOOQ will read the properties file and output a corresponding XML file on system out
    -							</p>
    -
    -							<h3>Use jOOQ generated classes in your application</h3>
    -							<p>
    -								Be sure, both jooq-{jooq-version}.jar and your generated package (see configuration) are located on your classpath. Once this is done, you can execute SQL statements with your generated classes.
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="codegen-advanced">
    -						<title>Advanced generator configuration</title>
    -						<content><html>
    -							<p>
    -								In the <reference id="codegen-configuration" title="previous section"/> we have seen how jOOQ's source code generator is configured and run within a few steps. In this chapter we'll cover some advanced settings
    -							</p>
    -
    -</html><xml><![CDATA[<!-- These properties can be added directly to the generator element: -->
    -<generator>
    -  <!-- The default code generator. You can override this one, to generate your own code style
    -       Defaults to org.jooq.util.DefaultGenerator -->
    -  <name>org.jooq.util.DefaultGenerator</name>
    -
    -  <!-- The naming strategy used for class and field names.
    -       You may override this with your custom naming strategy. Some examples follow
    -       Defaults to org.jooq.util.DefaultGeneratorStrategy -->
    -  <strategy>
    -    <name>org.jooq.util.DefaultGeneratorStrategy</name>
    -  </strategy>
    -</generator>]]></xml><html>
    -
    -							<p>
    -								The following example shows how you can override the DefaultGeneratorStrategy to render table and column names the way they are defined in the database, rather than switching them to camel case:
    -							</p>
    -
    -</html><java><![CDATA[/**
    - * It is recommended that you extend the DefaultGeneratorStrategy. Most of the
    - * GeneratorStrategy API is already declared final. You only need to override any
    - * of the following methods, for whatever generation behaviour you'd like to achieve
    - *
    - * Beware that most methods also receive a "Mode" object, to tell you whether a
    - * TableDefinition is being rendered as a Table, Record, POJO, etc. Depending on
    - * that information, you can add a suffix only for TableRecords, not for Tables
    - */
    -public class AsInDatabaseStrategy extends DefaultGeneratorStrategy {
    -
    -    /**
    -     * Override this to specifiy what identifiers in Java should look like.
    -     * This will just take the identifier as defined in the database.
    -     */
    -    @Override
    -    public String getJavaIdentifier(Definition definition) {
    -        return definition.getOutputName();
    -    }
    -
    -    /**
    -     * Override these to specify what a setter in Java should look like. Setters
    -     * are used in TableRecords, UDTRecords, and POJOs. This example will name
    -     * setters "set[NAME_IN_DATABASE]"
    -     */
    -    @Override
    -    public String getJavaSetterName(Definition definition, Mode mode) {
    -        return "set" + definition.getOutputName();
    -    }
    -
    -    /**
    -     * Just like setters...
    -     */
    -    @Override
    -    public String getJavaGetterName(Definition definition, Mode mode) {
    -        return "get" + definition.getOutputName();
    -    }
    -
    -    /**
    -     * Override this method to define what a Java method generated from a database
    -     * Definition should look like. This is used mostly for convenience methods
    -     * when calling stored procedures and functions. This example shows how to
    -     * set a prefix to a CamelCase version of your procedure
    -     */
    -    @Override
    -    public String getJavaMethodName(Definition definition, Mode mode) {
    -        return "call" + org.jooq.tools.StringUtils.toCamelCase(definition.getOutputName());
    -    }
    -
    -    /**
    -     * Override this method to define how your Java classes and Java files should
    -     * be named. This example applies no custom setting and uses CamelCase versions
    -     * instead
    -     */
    -    @Override
    -    public String getJavaClassName(Definition definition, Mode mode) {
    -        return super.getJavaClassName(definition, mode);
    -    }
    -
    -    /**
    -     * Override this method to re-define the package names of your generated
    -     * artefacts.
    -     */
    -    @Override
    -    public String getJavaPackageName(Definition definition, Mode mode) {
    -        return super.getJavaPackageName(definition, mode);
    -    }
    -
    -    /**
    -     * Override this method to define how Java members should be named. This is
    -     * used for POJOs and method arguments
    -     */
    -    @Override
    -    public String getJavaMemberName(Definition definition, Mode mode) {
    -        return definition.getOutputName();
    -    }
    -
    -    /**
    -     * Override this method to define the base class for those artefacts that
    -     * allow for custom base classes
    -     */
    -    @Override
    -    public String getJavaClassExtends(Definition definition, Mode mode) {
    -        return Object.class.getName();
    -    }
    -
    -    /**
    -     * Override this method to define the interfaces to be implemented by those
    -     * artefacts that allow for custom interface implementation
    -     */
    -    @Override
    -    public List<String> getJavaClassImplements(Definition definition, Mode mode) {
    -        return Arrays.asList(Serializable.class.getName(), Cloneable.class.getName());
    -    }
    -
    -    /**
    -     * Override this method to define the suffix to apply to routines when
    -     * they are overloaded.
    -     *
    -     * Use this to resolve compile-time conflicts in generated source code, in
    -     * case you make heavy use of procedure overloading
    -     */
    -    @Override
    -    public String getOverloadSuffix(Definition definition, Mode mode, String overloadIndex) {
    -        return "_OverloadIndex_" + overloadIndex;
    -    }
    -}]]></java><html>
    -
    -                            <h3>jooq-meta configuration</h3>
    -							<p>
    -								Within the &lt;generator/&gt; element, there are other configuration elements:
    -							</p>
    -
    -</html><xml><![CDATA[<!-- These properties can be added to the database element: -->
    -<database>
    -
    -  <!-- All table and view columns that are used as "version" fields for
    -       optimistic locking (several Java regular expressions, separated by comma).
    -       See UpdatableRecord.store() and UpdatableRecord.delete() for details -->
    -  <recordVersionFields>REC_VERSION</recordVersionFields/>
    -
    -  <!-- All table and view columns that are used as "timestamp" fields for
    -       optimistic locking (several Java regular expressions, separated by comma).
    -       See UpdatableRecord.store() and UpdatableRecord.delete() for details -->
    -  <recordTimestampFields>REC_TIMESTAMP</recordTimestampFields/>
    -      
    -  <!-- Generate java.sql.Timestamp fields for DATE columns. This is
    -       particularly useful for Oracle databases.
    -       Defaults to false -->
    -  <dateAsTimestamp>false</dateAsTimestamp>
    -
    -  <!-- Generate jOOU data types for your unsigned data types, which are
    -       not natively supported in Java.
    -       Defaults to true -->
    -  <unsignedTypes>true</unsignedTypes>
    -
    -  <!-- The schema that is used in generated source code. This will be the
    -       production schema. Use this to override your local development
    -       schema name for source code generation. If not specified, this
    -       will be the same as the input-schema. -->
    -  <outputSchema>[your database schema / owner / name]</outputSchema>
    -
    -  <!-- A configuration element to configure several input and/or output
    -       schemata for jooq-meta, in case you're using jooq-meta in a multi-
    -       schema environment.
    -       This cannot be combined with the above inputSchema / outputSchema -->
    -  <schemata>
    -    <schema>
    -      <inputSchema>...</inputSchema>
    -      <outputSchema>...</outputSchema>
    -    </schema>
    -    [ <schema>...</schema> ... ]
    -  </schemata>
    -
    -  <!-- A configuration element to configure master data table enum classes -->
    -  <masterDataTables>...</masterDataTables>
    -
    -  <!-- A configuration element to configure custom data types -->
    -  <customTypes>...</customTypes>
    -
    -  <!-- A configuration element to configure type overrides for generated
    -       artefacts (e.g. in combination with customTypes) -->
    -  <forcedTypes>...</forcedTypes>
    -</database>]]></xml><html>
    -
    -							<p>
    -								Check out the some of the manual's "advanced" sections to find out more about the advanced configuration parameters.
    -							</p>
    -							<ul>
    -								<li><reference id="schema-mapping" title="Schema mapping"/></li>
    -								<li><reference id="master-data-types" title="Master data types"/></li>
    -								<li><reference id="custom-data-types" title="Custom types"/></li>
    -							</ul>
    -
    -							<h3>jooq-codegen configuration</h3>
    -                            <p>
    -                            	Also, you can add some optional advanced configuration parameters for the generator:
    -                           	</p>
    -
    -</html><xml><![CDATA[<!-- These properties can be added to the generate element: -->
    -<generate>
    -  <!-- Primary key / foreign key relations should be generated and used.
    -       This is a prerequisite for various advanced features.
    -       Defaults to true -->
    -  <relations>true</relations>
    -
    -  <!-- Generate navigation methods to navigate foreign key relationships
    -       directly from Record classes. This is only relevant if relations
    -       is set to true, too.
    -       Defaults to true -->
    -  <navigationMethods>true</navigationMethods>
    -
    -  <!-- Generate deprecated code for backwards compatibility
    -       Defaults to true -->
    -  <deprecated>true</deprecated>
    -
    -  <!-- Generate instance fields in your tables, as opposed to static
    -       fields. This simplifies aliasing.
    -       Defaults to true -->
    -  <instanceFields>true</instanceFields>
    -
    -  <!-- Generate the javax.annotation.Generated annotation to indicate
    -       jOOQ version used for source code.
    -       Defaults to true -->
    -  <generatedAnnotation>true</generatedAnnotation>
    -
    -  <!-- Generate jOOQ Record classes for type-safe querying. You can
    -       turn this off, if you don't need "active records" for CRUD
    -       Defaults to true -->
    -  <records>true</records>
    -
    -  <!-- Generate POJOs in addition to Record classes for usage of the
    -       ResultQuery.fetchInto(Class) API
    -       Defaults to false -->
    -  <pojos>false</pojos>
    -
    -  <!-- Generate immutable POJOs for usage of the ResultQuery.fetchInto(Class) API
    -       This overrides any value set in <pojos/>
    -       Defaults to false -->
    -  <immutablePojos>false</immutablePojos>
    -
    -  <!-- Generate interfaces that will be implemented by records and/or pojos.
    -       You can also use these interfaces in Record.into(Class<?>) and similar
    -       methods, to let jOOQ return proxy objects for them.
    -       Defaults to false -->
    -  <interfaces>false</interfaces>
    -
    -  <!-- Generate DAOs in addition to POJO classes
    -       Defaults to false -->
    -  <daos>false</daos>
    -
    -  <!-- Annotate POJOs and Records with JPA annotations for increased
    -       compatibility and better integration with JPA/Hibernate, etc
    -       Defaults to false -->
    -  <jpaAnnotations>false</jpaAnnotations>
    -
    -  <!-- Annotate POJOs and Records with JSR-303 validation annotations
    -       Defaults to false -->
    -  <validationAnnotations>false</validationAnnotations>
    -</generate>]]></xml></content>
    -					</section>
    -
    -				    <section id="codegen-globals">
    -						<title>Generated global artefacts</title>
    -						<content><html>
    -							<p>
    -								For increased convenience at the use-site, jOOQ generates "global" artefacts at the code generation root location, referencing tables, routines, sequences, etc. In detail, these global artefacts include the following:
    -							</p>
    -							<ul>
    -								<li><strong>Keys.java</strong>: This file contains all of the required primary key, unique key, foreign key and identity references in the form of static members of type <reference class="org.jooq.Key"/>.</li>
    -								<li><strong>Routines.java</strong>: This file contains all standalone routines (not in packages) in the form of static factory methods for <reference class="org.jooq.Routine"/> types.</li>
    -								<li><strong>Sequences.java</strong>: This file contains all sequence objects in the form of static members of type <reference class="org.jooq.Sequence"/>.</li>
    -								<li><strong>Tables.java</strong>: This file contains all table objects in the form of static member references to the actual singleton <reference class="org.jooq.Table"/> object</li>
    -								<li><strong>UDTs.java</strong>: This file contains all UDT objects in the form of static member references to the actual singleton <reference class="org.jooq.UDT"/> object</li>
    -							</ul>
    -							
    -							<h3>Referencing global artefacts</h3>
    -							<p>
    -								When referencing global artefacts from your client application, you would typically static import them as such:
    -							</p>
    -							
    -</html><java><![CDATA[// Static imports for all global artefacts
    -import static com.example.generated.Routines.*;
    -import static com.example.generated.Sequences.*;
    -import static com.example.generated.Tables.*;
    -
    -// You could then reference your artefacts as follows:
    -create.insertInto(MY_TABLE)
    -      .values(MY_SEQUENCE.nextval(), myFunction())
    -      
    -// as a more concise form of this:
    -create.insertInto(com.example.generated.Tables.MY_TABLE)
    -      .values(com.example.generated.Sequences.MY_SEQUENCE.nextval(), com.example.generated.Routines.myFunction())]]></java></content>
    -					</section>
    -
    -				    <section id="codegen-tables">
    -						<title>Generated tables</title>
    -						<content><html>
    -							<p>
    -								Every table in your database will generate a <reference class="org.jooq.Table"/> implementation that looks like this:
    -							</p>
    -							
    -</html><java><![CDATA[public class Book extends UpdatableTableImpl<BookRecord> {
    -
    -    // The singleton instance
    -    public static final Book BOOK = new Book();
    -
    -    // Generated columns
    -    public final TableField<BookRecord, Integer> ID        = createField("ID",        SQLDataType.INTEGER, this);
    -    public final TableField<BookRecord, Integer> AUTHOR_ID = createField("AUTHOR_ID", SQLDataType.INTEGER, this);
    -    public final TableField<BookRecord, String>  ITLE      = createField("TITLE",     SQLDataType.VARCHAR, this);
    -
    -    // Covariant aliasing method, returning a table of the same type as BOOK
    -    @Override
    -    public Book as(java.lang.String alias) {
    -        return new Book(alias);
    -    }
    -    
    -    // [...]
    -}]]></java><html>
    -
    -							<h3>Flags influencing generated tables</h3>
    -							<p>
    -								These flags from the <reference id="codegen-advanced" title="code generation configuration"/> influence generated tables:
    -							</p>
    -							<ul>
    -								<li><strong>recordVersionFields</strong>: Relevant methods from super classes are overridden to return the VERSION field</li>
    -								<li><strong>recordTimestampFields</strong>: Relevant methods from super classes are overridden to return the TIMESTAMP field</li>
    -								<li><strong>dateAsTimestamp</strong>: This influences all relevant columns</li>
    -								<li><strong>unsignedTypes</strong>: This influences all relevant columns</li>
    -								<li><strong>relations</strong>: Relevant methods from super classes are overridden to provide primary key, unique key, foreign key and identity information</li>
    -								<li><strong>instanceFields</strong>: This flag controls the "static" keyword on table columns, as well as aliasing convenience</li>
    -								<li><strong>records</strong>: The generated record type is referenced from tables allowing for type-safe single-table record fetching</li>
    -							</ul>
    -							
    -							<h3>Flags controlling table generation</h3>
    -							<p>
    -								Table generation cannot be deactivated
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="codegen-records">
    -						<title>Generated records</title>
    -						<content><html>
    -							<p>
    -								Every table in your database will generate a <reference class="org.jooq.Table"/> implementation that looks like this:
    -							</p>
    -							
    -</html><java><![CDATA[// JPA annotations can be generated, optionally
    -@Entity
    -@Table(name = "BOOK", schema = "TEST")
    -public class BookRecord extends UpdatableRecordImpl<BookRecord> 
    -
    -// An interface common to records and pojos can be generated, optionally
    -implements IBook {
    -
    -    // Every column generates a setter and a getter
    -    @Override
    -    public void setId(Integer value) {
    -        setValue(BOOK.ID, value);
    -    }
    -    
    -    @Id
    -    @Column(name = "ID", unique = true, nullable = false, precision = 7)
    -    @Override
    -    public Integer getId() {
    -        return getValue(BOOK.ID);
    -    }
    -    
    -    // More setters and getters
    -    public void setAuthorId(Integer value) {...}
    -    public Integer getAuthorId() {...}
    -    
    -    // Convenience methods for foreign key methods
    -    public void setAuthorId(AuthorRecord value) {
    -        if (value == null) {
    -            setValue(BOOK.AUTHOR_ID, null);
    -        }
    -        else {
    -            setValue(BOOK.AUTHOR_ID, value.getValue(AUTHOR.ID));
    -        }
    -    }
    -    
    -    // Navigation methods
    -    public AuthorRecord fetchAuthor() {
    -        return create().selectFrom(AUTHOR).where(AUTHOR.ID.equal(getValue(BOOK.AUTHOR_ID))).fetchOne();
    -    }
    -    
    -    // [...]
    -}]]></java><html>							
    -							
    -							<h3>Flags influencing generated records</h3>
    -							<p>
    -								These flags from the <reference id="codegen-advanced" title="code generation configuration"/> influence generated records:
    -							</p>
    -							<ul>
    -								<li><strong>dateAsTimestamp</strong>: This influences all relevant getters and setters</li>
    -								<li><strong>unsignedTypes</strong>: This influences all relevant getters and setters</li>
    -								<li><strong>relations</strong>: This is needed as a prerequisite for navigation methods</li>
    -								<li><strong>navigationMethods</strong>: This controls whether navigation methods will be generated or not</li>
    -								<li><strong>daos</strong>: Records are a pre-requisite for DAOs. If DAOs are generated, records are generated as well</li>
    -								<li><strong>interfaces</strong>: If interfaces are generated, records will implement them</li>
    -								<li><strong>jpaAnnotations</strong>: JPA annotations are used on generated records</li>
    -							</ul>
    -														
    -							<h3>Flags controlling record generation</h3>
    -							<p>
    -								Record generation can be deactivated using the <strong>records</strong> flag
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="codegen-pojos">
    -						<title>Generated POJOs</title>
    -						<content><html>
    -							<p>
    -								Every table in your database will generate a POJO implementation that looks like this:
    -							</p>
    -							
    -</html><java><![CDATA[// JPA annotations can be generated, optionally
    -@javax.persistence.Entity
    -@javax.persistence.Table(name = "BOOK", schema = "TEST")
    -public class Book implements java.io.Serializable
    -
    -// An interface common to records and pojos can be generated, optionally
    -, IBook {
    -
    -    // JSR-303 annotations can be generated, optionally
    -    @NotNull
    -    private Integer id;
    -
    -    @NotNull
    -    private Integer authorId;
    -
    -    @NotNull
    -    @Size(max = 400)
    -    private String title;
    -
    -    // Every column generates a getter and a setter
    -    @Id
    -    @Column(name = "ID", unique = true, nullable = false, precision = 7)
    -    @Override
    -    public Integer getId() {
    -        return this.id;
    -    }
    -
    -    @Override
    -    public void setId(Integer id) {
    -        this.id = id;
    -    }
    -    
    -    // [...]
    -}]]></java><html>							
    -							
    -							<h3>Flags influencing generated POJOs</h3>
    -							<p>
    -								These flags from the <reference id="codegen-advanced" title="code generation configuration"/> influence generated POJOs:
    -							</p>
    -							<ul>
    -								<li><strong>dateAsTimestamp</strong>: This influences all relevant getters and setters</li>
    -								<li><strong>unsignedTypes</strong>: This influences all relevant getters and setters</li>
    -								<li><strong>interfaces</strong>: If interfaces are generated, POJOs will implement them</li>
    -								<li><strong>immutablePojos</strong>: Immutable POJOs have final members and no setters. All members must be passed to the constructor</li>
    -								<li><strong>daos</strong>: POJOs are a pre-requisite for DAOs. If DAOs are generated, POJOs are generated as well</li>
    -								<li><strong>jpaAnnotations</strong>: JPA annotations are used on generated records</li>
    -								<li><strong>validationAnnotations</strong>: JSR-303 validation annotations are used on generated records</li>
    -							</ul>
    -														
    -							<h3>Flags controlling POJO generation</h3>
    -							<p>
    -								POJO generation can be activated using the <strong>pojos</strong> flag
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="codegen-interfaces">
    -						<title>Generated Interfaces</title>
    -						<content><html>
    -							<p>
    -								Every table in your database will generate an interface that looks like this:
    -							</p>
    -							
    -</html><java><![CDATA[public interface IBook extends java.io.Serializable {
    -
    -    // Every column generates a getter and a setter
    -    public void setId(Integer value);
    -    public Integer getId();
    -    
    -    // [...]
    -}]]></java><html>    						
    -							
    -							<h3>Flags influencing generated interfaces</h3>
    -							<p>
    -								These flags from the <reference id="codegen-advanced" title="code generation configuration"/> influence generated interfaces:
    -							</p>
    -							<ul>
    -								<li><strong>dateAsTimestamp</strong>: This influences all relevant getters and setters</li>
    -								<li><strong>unsignedTypes</strong>: This influences all relevant getters and setters</li>
    -							</ul>
    -														
    -							<h3>Flags controlling POJO generation</h3>
    -							<p>
    -								POJO generation can be activated using the <strong>interfaces</strong> flag
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="codegen-daos">
    -						<title>Generated DAOs</title>
    -						<content><html>
    -							<h3>Generated DAOs</h3>
    -							<p>
    -								Every table in your database will generate a <reference class="org.jooq.DAO"/> implementation that looks like this:
    -							</p>
    -							
    -</html><java><![CDATA[public class BookDao extends DAOImpl<BookRecord, Book, Integer> {
    -
    -    // Generated constructors
    -    public BookDao() {
    -        super(BOOK, Book.class);
    -    }
    -
    -    public BookDao(Factory factory) {
    -        super(BOOK, Book.class, factory);
    -    }
    -
    -    // Every column generates at least one fetch method
    -    public List<Book> fetchById(Integer... values) {
    -        return fetch(BOOK.ID, values);
    -    }
    -
    -    public Book fetchOneById(Integer value) {
    -        return fetchOne(BOOK.ID, value);
    -    }
    -
    -    public List<Book> fetchByAuthorId(Integer... values) {
    -        return fetch(BOOK.AUTHOR_ID, values);
    -    }
    -    
    -    // [...]
    -}]]></java><html>							
    -							
    -							<h3>Flags controlling DAO generation</h3>
    -							<p>
    -								DAO generation can be activated using the <strong>daos</strong> flag
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="codegen-sequences">
    -						<title>Generated sequences</title>
    -						<content><html>
    -							<p>
    -								Every sequence in your database will generate a <reference class="org.jooq.Sequence"/> implementation that looks like this:
    -							</p>
    -							
    -</html><java><![CDATA[public final class Sequences {
    -
    -    // Every sequence generates a member
    -    public static final Sequence<Integer> S_AUTHOR_ID = new SequenceImpl<Integer>("S_AUTHOR_ID", TEST, SQLDataType.INTEGER);
    -}]]></java><html>		
    -							
    -							<h3>Flags controlling sequence generation</h3>
    -							<p>
    -								Sequence generation cannot be deactivated
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="codegen-procedures">
    -						<title>Generated procedures</title>
    -						<content><html>
    -							<p>
    -								Every procedure or function (routine) in your database will generate a <reference class="org.jooq.Routine"/> implementation that looks like this:
    -							</p>
    -
    -</html><java><![CDATA[public class AuthorExists extends AbstractRoutine<java.lang.Void> {
    -
    -    // All IN, IN OUT, OUT parameters and function return values generate a static member
    -    public static final Parameter<String>     AUTHOR_NAME = createParameter("AUTHOR_NAME", SQLDataType.VARCHAR);
    -    public static final Parameter<BigDecimal> RESULT      = createParameter("RESULT",      SQLDataType.NUMERIC);
    -
    -    // A constructor for a new "empty" procedure call
    -    public AuthorExists() {
    -        super("AUTHOR_EXISTS", TEST);
    -
    -        addInParameter(AUTHOR_NAME);
    -        addOutParameter(RESULT);
    -    }
    -
    -    // Every IN and IN OUT parameter generates a setter
    -    public void setAuthorName(String value) {
    -        setValue(AUTHOR_NAME, value);
    -    }
    -
    -    // Every IN OUT, OUT and RETURN_VALUE generates a getter
    -    public BigDecimal getResult() {
    -        return getValue(RESULT);
    -    }
    -    
    -    // [...]
    -}]]></java><html>
    -
    -							<h3>Package and member procedures or functions</h3>
    -							<p>
    -								Procedures or functions contained in packages or UDTs are generated in a sub-package that corresponds to the package or UDT name.
    -							</p>
    -
    -							<h3>Flags controlling routine generation</h3>
    -							<p>
    -								Routine generation cannot be deactivated
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="codegen-udts">
    -						<title>Generated UDTs</title>
    -						<content><html>
    -							<p>
    -								Every UDT in your database will generate a <reference class="org.jooq.UDT"/> implementation that looks like this:
    -							</p>
    -						
    -</html><java><![CDATA[public class AddressType extends UDTImpl<AddressTypeRecord> {
    -
    -    // The singleton UDT instance
    -    public static final UAddressType U_ADDRESS_TYPE = new UAddressType();
    -
    -    // Every UDT attribute generates a static member
    -    public static final UDTField<AddressTypeRecord, String> ZIP     = 
    -      createField("ZIP",     SQLDataType.VARCHAR, U_ADDRESS_TYPE);
    -    public static final UDTField<AddressTypeRecord, String> CITY    = 
    -      createField("CITY",    SQLDataType.VARCHAR, U_ADDRESS_TYPE);
    -    public static final UDTField<AddressTypeRecord, String> COUNTRY = 
    -      createField("COUNTRY", SQLDataType.VARCHAR, U_ADDRESS_TYPE);
    -    
    -    // [...]
    -}]]></java><html>						
    -										
    -							<p>
    -								Besides the <reference class="org.jooq.UDT"/> implementation, a <reference class="org.jooq.UDTRecord"/> implementation is also generated
    -							</p>		
    -
    -</html><java><![CDATA[public class AddressTypeRecord extends UDTRecordImpl<AddressTypeRecord> {
    -
    -    // Every attribute generates a getter and a setter
    -
    -    public void setZip(String value) {...}
    -    public String getZip() {...}
    -    public void setCity(String value) {...}
    -    public String getCity() {...}
    -    public void setCountry(String value) {...}
    -    public String getCountry() {...}
    -    
    -    // [...]
    -}]]></java><html>						
    -
    -							<h3>Flags controlling UDT generation</h3>
    -							<p>
    -								UDT generation cannot be deactivated
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="master-data-types">
    -						<title>Master data and enumeration tables</title>
    -						<content><html>
    -							<p>
    -								<strong>NOTE</strong>: This feature is deprecated in jOOQ 2.5.0 and will be removed as of jOOQ 3.0
    -							</p>
    -							<p>
    -								Only MySQL and Postgres databases support true ENUM types natively. Some other RDBMS allow you to map the concept of an ENUM data type to a CHECK constraint, but those constraints can contain arbitrary SQL. With jOOQ, you can "simulate" ENUM types by declaring a table as a "master data table" in the configuration. At code-generation time, this table will be treated specially, and a Java enum type is generated from its data.
    -							</p>
    -
    -							<h3>Configure master data tables</h3>
    -							<p>
    -								As previously discussed, you can configure master data tables as follows:
    -							</p>
    -							
    -</html><xml><![CDATA[<!-- These properties can be added to the database element: -->
    -<database>
    -  <masterDataTables>
    -    <masterDataTable>
    -      <!-- The name of a master data table -->
    -      <name>[a table name]</name>
    -
    -      <!-- The column used for enum literals -->
    -      <literal>[a column name]</literal>
    -
    -      <!-- The column used for documentation -->
    -      <description>[a column name]</description>
    -    </masterDataTable>
    -
    -    [ <masterDataTable>...</masterDataTable> ... ]
    -  </masterDataTables>
    - </database>]]></xml><html>
    -
    -							<p>
    -								The results of this will be a Java enum that looks similar to this:
    -							</p>
    -							
    -</html><java><![CDATA[public enum Language implements MasterDataType<Integer> {
    -
    -  /**
    -   * English
    -   */
    -  en(1, "en", "English"),
    -
    -  /**
    -   * Deutsch
    -   */
    -  de(2, "de", "Deutsch"),
    -
    -  /**
    -   * Français
    -   */
    -  fr(3, "fr", "Français"),
    -
    -  /**
    -   * null
    -   */
    -  pt(4, "pt", null),
    -  ;
    -
    -  private final Integer id;
    -  private final String cd;
    -  private final String description;
    -
    -  // [ ... constructor and getters for the above properties ]
    -}]]></java><html>
    -
    -							<p>
    -								In the above example, you can see how the configured primary key is mapped to the id member, the configured literal column is mapped to the cd member and the configured description member is mapped to the description member and output as Javadoc. In other words, T_LANGUAGE is a table with 4 rows and at least three columns.
    -							</p>
    -							
    -							<p>
    -								The general contract is that there must be
    -							</p>
    -							<ul>
    -								<li>A single-column primary key column of character or integer type</li>
    -								<li>An optional unique literal column of character or integer type (otherwise, the primary key is used as enum literal) </li>
    -								<li>An optional description column of any type </li>
    -							</ul>
    -
    -							<h3>Using MasterDataTypes</h3>
    -							<p>
    -								The point of MasterDataTypes in jOOQ is that they behave exactly like true ENUM types. When the above T_LANGUAGE table is referenced by T_BOOK, instead of generating foreign key navigation methods and a LANGUAGE_ID Field&lt;Integer&gt;, a Field&lt;TLanguage&gt; is generated:
    -							</p>
    -
    -</html><java><![CDATA[public class Book extends UpdatableTableImpl<BookRecord> {
    -
    -  // [...]
    -  public static final TableField<BookRecord, Language> LANGUAGE_ID =
    -                  new TableFieldImpl<BookRecord, Language>( /* ... */ );
    -}]]></java><html>
    -
    -							<p>
    -								Which can then be used in the BookRecord directly:
    -							</p>
    -							
    -</html><java><![CDATA[public class BookRecord extends UpdatableRecordImpl<BookRecord> {
    -
    -  // [...]
    -  public Language getLanguageId() { // [...]
    -  public void setLanguageId(Language value) { // [...]
    -}]]></java><html>
    -
    -							<h3>When to use MasterDataTypes</h3>
    -							<p>
    -								You can use master data types when you're actually mapping master data to a Java enum. When the underlying table changes frequently, those updates will not be reflected by the statically generated code. Also, be aware that it will be difficult to perform actual JOIN operations on the underlying table with jOOQ, once the master data type is generated.
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="custom-data-types">
    -						<title>Custom data types and type conversion</title>
    -						<content><html>
    -							<p>
    -								When using a custom type in jOOQ, you need to let jOOQ know about its associated <reference class="org.jooq.Converter"/>. Ad-hoc usages of such converters has been discussed in the chapter about <reference id="data-type-conversion" title="data type conversion"/>. A more common use-case, however, is to let jOOQ know about custom types at code generation time. Use the following configuration elements to specify, that you'd like to use GregorianCalendar for all database fields that start with DATE_OF_
    -      						</p>
    -
    -</html><xml><![CDATA[<database>
    -  <!-- First, register your custom types here -->
    -  <customTypes>
    -    <customType>
    -      <!-- Specify the fully-qualified class name of your custom type -->
    -      <name>java.util.GregorianCalendar</name>
    -
    -      <!-- Associate that custom type with your converter. Note, a
    -           custom type can only have one converter in jOOQ -->
    -      <converter>com.example.CalendarConverter</converter>
    -    </customType>
    -  </customTypes>
    -
    -  <!-- Then, associate custom types with database columns -->
    -  <forcedTypes>
    -    <forcedType>
    -      <!-- Specify again he fully-qualified class name of your custom type -->
    -      <name>java.util.GregorianCalendar</name>
    -
    -      <!-- Add a list of comma-separated regular expressions matching columns -->
    -      <expressions>.*\.DATE_OF_.*</expressions>
    -    </forcedType>
    -  </forcedTypes>
    -</database>]]></xml><html>
    -
    -                            <p>
    -                            	The above configuration will lead to AUTHOR.DATE_OF_BIRTH being generated like this:
    -                            </p>
    -
    -</html><java><![CDATA[public class TAuthor extends UpdatableTableImpl<TAuthorRecord> {
    -
    -    // [...]
    -    public final TableField<TAuthorRecord, GregorianCalendar> DATE_OF_BIRTH =    // [...]
    -    // [...]
    -
    -}]]></java><html>
    -
    -                            <p>
    -                            	This means that the bound type of &lt;T&gt; will be GregorianCalendar, wherever you reference DATE_OF_BIRTH. jOOQ will use your custom converter when binding variables and when fetching data from <reference class="java.util.ResultSet"/>:
    -                            </p>
    -
    -</html><java><![CDATA[// Get all date of births of authors born after 1980
    -List<GregorianCalendar> result =
    -create.selectFrom(AUTHOR)
    -      .where(AUTHOR.DATE_OF_BIRTH.greaterThan(new GregorianCalendar(1980, 0, 1)))
    -      .fetch(AUTHOR.DATE_OF_BIRTH);]]></java></content>
    -					</section>
    -
    -				    <section id="schema-mapping">
    -						<title>Mapping generated schemata and tables</title>
    -						<content><html>
    -							<p>
    -								We've seen previously in the chapter about <reference id="runtime-schema-mapping" title="runtime schema mapping"/>, that schemata and tables can be mapped at runtime to other names. But you can also hard-wire schema mapping in generated artefacts at code generation time, e.g. when you have 5 developers with their own dedicated developer databases, and a common integration database. In the code generation configuration, you would then write.
    -							</p>
    -
    -</html><xml><![CDATA[<schemata>
    -  <schema>
    -    <!-- Use this as the developer's schema: -->
    -    <inputSchema>LUKAS_DEV_SCHEMA</inputSchema>
    -
    -    <!-- Use this as the integration / production database: -->
    -    <outputSchema>PROD</outputSchema>
    -  </schema>
    -</schemata>]]></xml></content>
    -					</section>
    -				</sections>
    -			</section>
    -
    -			<section id="tools">
    -				<title>Tools</title>
    -				<content><html>
    -					<p>
    -						These chapters hold some information about tools to be used with jOOQ
    -					</p>
    -				</html></content>
    -
    -				<sections>
    -					<section id="jooq-console">
    -						<title>jOOQ Console</title>
    -						<content><html>
    -							<p>
    -							    The <reference id="execute-listeners" title="ExecuteListener API"/> was driven by a feature request by Christopher Deckers, who has had the courtesy to contribute the jOOQ Console, a sample application interfacing with jOOQ's ExecuteListeners. The jOOQ Console logs all queries executed by jOOQ and displays them nicely in a Swing application. With the jOOQ Console's logger, you can:
    -						    </p>
    -						    <ul>
    -						    	<li>Activate the console's DebugListener anytime (in-process or if the remote server is active).</li>
    -						    	<li>View simple and batch queries and their parameters.</li>
    -						    	<li>Reformat queries along with syntax highlighting for better readability.</li>
    -						    	<li>View stack trace of originator of the call.</li>
    -						    	<li>Dump the stack to stdout when in an IDE, to directly navigate to relevant classes.</li>
    -						    	<li>Track execution time, binding time, parsing time, rows read, fields read.</li>
    -						    	<li>Show/hide queries depending on their type (SELECT, UPDATE, etc.).</li>
    -						    	<li>Sort any column (timing columns, queries, types, etc.)</li>
    -						    	<li>Easy copy paste of rows/columns to Spreadsheet editors.</li>
    -						    </ul>
    -
    -						    <p>
    -						    	A short overview of such a debugging session can be seen here:
    -						    </p>
    -   							<div class="screenshot">
    -								<img class="screenshot" src="&lt;?=$root?&gt;/img/jooq-console-01.png" alt="jOOQ Console example"/>
    -							</div>
    -						    <p>
    -							    Please note that the jOOQ Console is still experimental. Any feedback is very welcome on <br/>
    -							    <a href="http://groups.google.com/group/jooq-user" title="the jooq-user group">the jooq-user group</a>
    -							</p>
    -
    -							<h3>jOOQ Console operation modes</h3>
    -							<p>
    -								The jOOQ Console can be run in two different modes:
    -							</p>
    -							<ul>
    -								<li>In-process mode: running in the same process as the queries you're analysing</li>
    -								<li>"headless" mode: running remotely</li>
    -							</ul>
    -
    -							<p>
    -								Both modes will require that you set the <reference class="org.jooq.debug.DebugListener"/> in the Factory's settings. When using XML settings:
    -							</p>
    -
    -</html><xml><![CDATA[<settings>
    -  <executeListeners>
    -    <executeListener>org.jooq.debug.DebugListener</executeListener>
    -  </executeListeners>
    -</settings>]]></xml><html>
    -
    -							<p>
    -								Or when using programmatic settings:
    -							</p>
    -							
    -</html><java><![CDATA[Settings settings = new Settings()
    -    .getExecuteListeners().add("org.jooq.debug.DebugListener");
    -Factory factory = new Factory(connection, dialect, settings);]]></java><html>
    -
    -							<h3>In-process mode</h3>
    -							<p>
    -								The in-process mode is useful for Swing applications or other, locally run Java programs accessing the database via jOOQ. In order to launch the jOOQ Console "in-process", specify the previously documented settings and launch the Console as follows:
    -							</p>
    -
    -</html><java><![CDATA[// Define a DatabaseDescriptor for the "in-process" mode
    -// It is needed for the "Editor" tab
    -DatabaseDescriptor descriptor = new DatabaseDescriptor() {
    -
    -    // Return your generated schema. This is used by the console
    -    // to introspect your schema data
    -    @Override
    -    public Schema getSchema() {
    -        return com.example.MySchema.MY_SCHEMA;
    -    }
    -
    -    // Return the SQL dialect that you're using
    -    @Override
    -    public SQLDialect getSQLDialect() {
    -        return SQLDialect.ORACLE;
    -    }
    -
    -    // Return a connection
    -    @Override
    -    public Connection createConnection() {
    -        try {
    -            return DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "test", "test");
    -        }
    -        catch (Exception ignore) {}
    -    }
    -};
    -
    -// Now pass this database descriptor to the Console and make it visible
    -try {
    -
    -    // Use this for a nicer look-and-feel
    -    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    -
    -    // Create a new Console
    -    Console console = new Console(descriptor, true);
    -    console.setLoggingActive(true);
    -    console.setVisible(true);
    -}
    -catch (Exception ignore) {}
    -]]></java><html>
    -
    -							<p>
    -								Only in the in-process mode, you can execute ad-hoc queries directly from the console, if you provide it with proper DatabaseDescriptor. These queries are executed from the Editor pane which features:
    -							</p>
    -							<ul>
    -								<li>SQL editing within the console.</li>
    -								<li>Incremental search on tables.</li>
    -								<li>Simple code completion with tables/columns/SQL keywords.</li>
    -								<li>Syntax highlighting and formatting capabilities.</li>
    -								<li>Results shown in one or several tabs.</li>
    -								<li>Easy analysis of Logger output by copy/pasting/running queries in the Editor.</li>
    -							</ul>
    -   							<div class="screenshot">
    -								<img class="screenshot" src="&lt;?=$root?&gt;/img/jooq-console-02.png" alt="jOOQ Console example"/>
    -							</div>
    -
    -                            <h3>"Headless" mode</h3>
    -							<p>
    -								In J2EE or other server/client environments, you may not be able to run the console in the same process as your application. You can then run the jOOQ Console in "headless" mode. In addition to the previously documented settings, you'll have to start a debugger server in your application process, that the console can connect to:
    -							</p>
    -
    -</html><java>// Create a new RemoteDebuggerServer in your application that listens to
    -// incoming connections on a given port
    -SERVER = new RemoteDebuggerServer(DEBUGGER_PORT);</java><html>
    -
    -							<p>
    -								Now start your application along with the debugger server and launch the console with this command:
    -							</p>
    -
    -</html><config>java -jar jooq-console-2.1.0.jar [host] [port]</config><html>
    -
    -							<p>
    -								Depending on your distribution, you may have to manually add rsyntaxtextarea-1.5.0.jar and jOOQ artefacts on your classpath.
    -							</p>
    -						</html></content>
    -					</section>
    -				</sections>
    -			</section>
    -
    -			<section id="reference">
    -				<title>Reference</title>
    -				<content><html>
    -					<p>
    -						These chapters hold some general jOOQ reference information
    -					</p>
    -				</html></content>
    -
    -				<sections>
    -					<section id="supported-rdbms">
    -						<title>Supported RDBMS</title>
    -						<content><html>
    -							<h3>A list of supported databases</h3>
    -							<p>
    -						   		Every RDMBS out there has its own little specialties. jOOQ considers those specialties as much as possible, while trying to standardise the behaviour in jOOQ. In order to increase the quality of jOOQ, some 70 unit tests are run for syntax and variable binding verification, as well as some 180 integration tests with an overall of around 1200 queries for any of these databases:
    -					   		</p>
    -							<ul>
    -							    <li>CUBRID 8.4.1</li>
    -							    <li>DB2 9.7</li>
    -							    <li>Derby 10.8</li>
    -							    <li>Firebird 2.5.1</li>
    -							    <li>H2 1.3.161</li>
    -							    <li>HSQLDB 2.2.5</li>
    -							    <li>Ingres 10.1.0</li>
    -							    <li>MySQL 5.1.41 and 5.5.8</li>
    -							    <li>Oracle XE 10.2.0.1.0 and 11g</li>
    -							    <li>PostgreSQL 9.0</li>
    -							    <li>SQLite with inofficial JDBC driver v056</li>
    -							    <li>SQL Server 2008 R8</li>
    -							    <li>Sybase Adaptive Server Enterprise 15.5</li>
    -							    <li>Sybase SQL Anywhere 12</li>
    -							</ul>
    -							<p>
    -								These platforms have been observed to work as well, but are not integration-tested
    -							</p>
    -							<ul>
    -								<li>Google Cloud SQL (MySQL)</li>
    -							</ul>
    -								
    -							<h3>Databases planned for support</h3>
    -							<p>
    -								Any of the following databases might be available in the future
    -							</p>
    -						    <ul>
    -							    <li>Informix</li>
    -							    <li>Interbase</li>
    -							    <li>MS Access</li>
    -							    <li>MS Excel</li>
    -							    <li>SQL Azure</li>
    -							    <li>Sybase SQL Anywhere OnDemand</li>
    -							    <li>Teradata</li>
    -						    </ul>
    -						    
    -							<h3>Databases being watched</h3>
    -							<p>
    -								Any of the following databases are being observed for a potential integration
    -							</p>
    -							<ul>
    -								<li>Mondrian</li>
    -								<li>Netezza</li>
    -								<li>SQLFire</li>
    -								<li>Vectorwise</li>
    -								<li>Vertica</li>
    -								<li>VoltDB</li>
    -							</ul>
    -
    -							<h3>Feature matrix</h3>
    -							<p>
    -								This section will soon contain a feature matrix, documenting what feature is available for which database.
    -							</p>
    -						</html></content>
    -					</section>
    -
    -					<section id="reference-data-types">
    -						<title>Data types</title>
    -						<content><html>
    -							<p>
    -								There is always a small mismatch between SQL data types and Java data types. This is for two reasons:
    -							</p>
    -							<ul>
    -								<li>SQL data types are insufficiently covered by the JDBC API.</li>
    -								<li>Java data types are often less expressive than SQL data types</li>
    -							</ul>
    -							<p>
    -								This chapter should document the most important notes about SQL, JDBC and jOOQ data types.
    -							</p>
    -						</html></content>
    -						
    -						<sections>
    -							<section id="data-types-lobs">
    -								<title>BLOBs and CLOBs</title>
    -								<content><html>
    -									<p>
    -										jOOQ currently doesn't explicitly support JDBC BLOB and CLOB data types. If you use any of these data types in your database, jOOQ will map them to byte[] and String instead. In simple cases (small data), this simplification is sufficient. In more sophisticated cases, you may have to bypass jOOQ, in order to deal with these data types and their respective resources. True support for LOBs is on the roadmap, though.
    -									</p>
    -								</html></content>
    -							</section>
    -							
    -							<section id="data-types-unsigned">
    -								<title>Unsigned integer types</title>
    -								<content><html>
    -									<p>
    -										Some databases explicitly support unsigned integer data types. In most normal JDBC-based applications, they would just be mapped to their signed counterparts letting bit-wise shifting and tweaking to the user. jOOQ ships with a set of unsigned <reference class="java.lang.Number"/> implementations modelling the following types:
    -									</p>
    -									<ul>
    -										<li><reference class="org.jooq.tools.unsigned.UByte"/>: Unsigned byte, an 8-bit unsigned integer</li>
    -										<li><reference class="org.jooq.tools.unsigned.UShort"/>: Unsigned short, a 16-bit unsigned integer</li>
    -										<li><reference class="org.jooq.tools.unsigned.UInteger"/>: Unsigned int, a 32-bit unsigned integer</li>
    -										<li><reference class="org.jooq.tools.unsigned.ULong"/>: Unsigned long, a 64-bit unsigned integer</li>
    -									</ul>
    -									<p>
    -										Each of these wrapper types extends <reference class="java.lang.Number"/>, wrapping a higher-level integer type, internally:
    -									</p>
    -									<ul>
    -										<li>UByte wraps <reference class="java.lang.Short"/></li>
    -										<li>UShort wraps <reference class="java.lang.Integer"/></li>
    -										<li>UInteger wraps <reference class="java.lang.Long"/></li>
    -										<li>ULong wraps <reference class="java.math.BigInteger"/></li>
    -									</ul>
    -								</html></content>
    -							</section>
    -							
    -							<section id="data-types-intervals">
    -								<title>INTERVAL data types</title>
    -								<content><html>
    -									<p>
    -										jOOQ fills a gap opened by JDBC, which neglects an important SQL data type as defined by the SQL standards: INTERVAL types. SQL knows two different types of intervals:
    -									</p>
    -									<ul>
    -										<li><strong>YEAR TO MONTH</strong>: This interval type models a number of months and years</li>
    -										<li><strong>DAY TO SECOND</strong>: This interval type models a number of days, hours, minutes, seconds and milliseconds</li>
    -									</ul>
    -									
    -									<p>
    -										Both interval types ship with a variant of subtypes, such as DAY TO HOUR, HOUR TO SECOND, etc. jOOQ models these types as Java objects extending <reference class="java.lang.Number"/>: <reference class="org.jooq.types.YearToMonth"/> (where Number.intValue() corresponds to the absolute number of months) and <reference class="org.jooq.types.DayToSecond"/> (where Number.intValue() corresponds to the absolute number of milliseconds)
    -									</p>
    -									
    -									<h3>Interval arithmetic</h3>
    -									<p>
    -										In addition to the <reference id="arithmetic-expressions" title="arithmetic expressions"/> documented previously, interval arithmetic is also supported by jOOQ. Essentially, the following operations are supported:
    -									</p>
    -									<ul>
    -										<li>DATETIME - DATETIME => INTERVAL</li>
    -										<li>DATETIME + or - INTERVAL => DATETIME</li>
    -										<li>INTERVAL + DATETIME => DATETIME</li>
    -										<li>INTERVAL + - INTERVAL => INTERVAL</li>
    -										<li>INTERVAL * or / NUMERIC => INTERVAL</li>
    -										<li>NUMERIC * INTERVAL => INTERVAL</li>
    -									</ul>
    -								</html></content>
    -							</section>
    -							
    -							<section id="data-types-xml">
    -								<title>XML data types</title>
    -								<content><html>
    -									<p>
    -										XML data types are currently not supported
    -									</p>
    -								</html></content>
    -							</section>
    -							
    -							<section id="data-types-geospacial">
    -								<title>Geospacial data types</title>
    -								<content><html>
    -									<h3>Geospacial data types</h3>
    -									<p>
    -										Geospacial data types are currently not supported
    -									</p>
    -								</html></content>
    -							</section>
    -							
    -							<section id="data-types-cursors">
    -								<title>CURSOR data types</title>
    -								<content><html>
    -									<p>
    -										Some databases support cursors returned from stored procedures. They are mapped to the following jOOQ data type:
    -									</p>
    -
    -</html><java><![CDATA[Field<Result<Record>> cursor;]]></java><html>
    -									
    -									<p>
    -										In fact, such a cursor will be fetched immediately by jOOQ and wrapped in an <reference class="org.jooq.Result"/> object.
    -									</p>
    -								</html></content>
    -							</section>
    -							
    -							<section id="data-types-arrays">
    -								<title>ARRAY and TABLE data types</title>
    -								<content><html>
    -									<p>
    -										The SQL standard specifies ARRAY data types, that can be mapped to Java arrays as such:
    -									</p>
    -									
    -</html><java><![CDATA[Field<Integer[]> intArray;]]></java><html>
    -										
    -									<p>
    -										The above array type is supported by these SQL dialects:
    -									</p>
    -									<ul>
    -										<li>H2</li>
    -										<li>HSQLDB</li>
    -										<li>Postgres</li>
    -									</ul>
    -									
    -									<h3>Oracle typed arrays</h3>
    -									<p>
    -										Oracle has strongly-typed arrays and table types (as opposed to the previously seen anonymously typed arrays). These arrays are wrapped by <reference class="org.jooq.ArrayRecord"/> types.
    -									</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -					<section id="reference-bnf-notation">
    -						<title>jOOQ's BNF pseudo-notation</title>
    -						<content><html>
    -							<p>
    -								This chapter will soon contain an overview over jOOQ's API using a pseudo BNF notation.
    -							</p>
    -						</html></content>
    -					</section>
    -
    -					<section id="reference-credits">
    -						<title>Credits</title>
    -						<content><html>
    -							<p>
    -								jOOQ lives in a very challenging ecosystem. The Java to SQL interface is still one of the most important system interfaces. Yet there are still a lot of open questions, best practices and no "true" standard has been established. This situation gave way to a lot of tools, APIs, utilities which essentially tackle the same problem domain as jOOQ. jOOQ has gotten great inspiration from pre-existing tools and this section should give them some credit. Here is a list of inspirational tools in alphabetical order:
    -							</p>
    -							<ul>
    -								<li><a href="http://avaje.org">Avajé EBean</a>: Play! Framework's preferred ORM has a feature called asynchronous query execution. This idea made it into jOOQ as <reference class="org.jooq.ResultQuery" anchor="#fetchLater()"/></li>
    -								<li><a href="http://www.hibernate.org">Hibernate</a>: The de-facto standard (JPA) with its useful table-to-POJO mapping features have influenced jOOQ's <reference class="org.jooq.ResultQuery" anchor="#fetchInto(java.lang.Class)"/> facilities</li>
    -								<li><a href="http://www.h2database.com/html/jaqu.html">JaQu</a>: H2's own fluent API for querying databases</li>
    -								<li><a href="http://www.oracle.com/technetwork/java/javaee/tech/persistence-jsp-140049.html">JPA</a>: The de-facto standard in the javax.persistence packages, supplied by Oracle. Its annotations are useful to jOOQ as well.</li>
    -								<li><a href="http://onewebsql.com">OneWebSQL</a>: A commercial SQL abstraction API with support for DAO source code generation, which was integrated also in jOOQ</li>
    -								<li><a href="http://www.querydsl.com">QueryDSL</a>: A "LINQ-port" to Java. It has a similar fluent API, a similar code-generation facility, yet quite a different purpose. While jOOQ is all about SQL, QueryDSL (like LINQ) is mostly about querying.</li>
    -								<li><a href="http://www.springsource.org/features/data-access">Spring Data</a>: Spring's JdbcTemplate knows RowMappers, which are reflected by jOOQ's <reference class="org.jooq.RecordHandler"/></li>
    -							</ul>
    -						</html></content>
    -					</section>
    -				</sections>
    -			</section>
    -		</sections>
    -	</section>
    -</manual>
    diff --git a/jOOQ-website/src/main/resources/manual-2.6.xml b/jOOQ-website/src/main/resources/manual-2.6.xml
    deleted file mode 100644
    index 832da177c9..0000000000
    --- a/jOOQ-website/src/main/resources/manual-2.6.xml
    +++ /dev/null
    @@ -1,9141 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?>
    -<!-- 
    -  - Copyright (c) 2009-2013, Lukas Eder, lukas.eder@gmail.com
    -  - All rights reserved.
    -  -
    -  - This software is licensed to you under the Apache License, Version 2.0
    -  - (the "License"); You may obtain a copy of the License at
    -  -
    -  -   http://www.apache.org/licenses/LICENSE-2.0
    -  -
    -  - Redistribution and use in source and binary forms, with or without
    -  - modification, are permitted provided that the following conditions are met:
    -  -
    -  - . Redistributions of source code must retain the above copyright notice, this
    -  -   list of conditions and the following disclaimer.
    -  -
    -  - . Redistributions in binary form must reproduce the above copyright notice,
    -  -   this list of conditions and the following disclaimer in the documentation
    -  -   and/or other materials provided with the distribution.
    -  -
    -  - . Neither the name "jOOQ" nor the names of its contributors may be
    -  -   used to endorse or promote products derived from this software without
    -  -   specific prior written permission.
    -  -
    -  - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    -  - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    -  - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    -  - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
    -  - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
    -  - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
    -  - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
    -  - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
    -  - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
    -  - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
    -  - POSSIBILITY OF SUCH DAMAGE.
    -  -->
    -<manual>
    -	<section id="manual">
    -		<title>The jOOQ User Manual. Multiple Pages</title>
    -		<content><html>
    -			<h2 id="Overview"><a href="#Overview" name="Overview">#</a> Overview</h2>
    -			<p>This manual is divided into six main sections:</p>
    -
    -			<ul>
    -				<li>
    -					<reference id="getting-started"/>
    -					<p>
    -						This section will get you started with jOOQ quickly. It contains
    -						simple explanations about what jOOQ is, what jOOQ isn't and how
    -						to set it up for the first time
    -					</p>
    -				</li>
    -				<li>
    -					<reference id="sql-building"/>
    -					<p>
    -						This section explains all about the jOOQ syntax used for building
    -						queries. It explains the central factories, the supported SQL
    -						statements and various other syntax elements
    -					</p>
    -				</li>
    -				<li>
    -					<reference id="code-generation"/>
    -					<p>
    -						This section explains how to configure and use the built-in source code
    -						generator
    -					</p>
    -				</li>
    -				<li>
    -					<reference id="sql-execution"/>
    -					<p>
    -						This section will get you through the specifics of what can be done
    -						with jOOQ at runtime, in order to execute queries, perform CRUD
    -						operations, import and export data, and hook into the jOOQ execution
    -						lifecycle for debugging
    -					</p>
    -				</li>
    -				<li>
    -					<reference id="tools"/>
    -					<p>
    -						This section is dedicated to tools that ship with jOOQ, such as the
    -						jOOQ console
    -					</p>
    -				</li>
    -				<li>
    -					<reference id="reference"/>
    -					<p>
    -						This section is a reference for elements in this manual
    -					</p>
    -				</li>
    -			</ul>
    -		</html></content>
    -
    -		<sections>
    -			<section id="preface">
    -				<title>Preface</title>
    -				<content><html>
    -					<h3>jOOQ's reason of being - compared to JPA</h3>
    -					<p>
    -						Java and SQL have come a long way. SQL is an "ancient", yet established and well-understood technology. Java is a legacy too, although its platform JVM allows for many new and contemporary languages built on top of it. Yet, after all these years, libraries dealing with the interface between SQL and Java have come and gone, leaving JPA to be a standard that is accepted only with doubts, short of any surviving options.
    -					</p>
    -					<p>
    -						So far, there had been only few database abstraction frameworks or libraries, that truly respected SQL as a first class citizen among languages. Most frameworks, including the industry standards JPA, EJB, Hibernate, JDO, Criteria Query, and many others try to hide SQL itself, minimising its scope to things called JPQL, HQL, JDOQL and various other inferior query languages
    -					</p>
    -					<p>
    -						jOOQ has come to fill this gap.
    -					</p>
    -
    -					<h3>jOOQ's reason of being - compared to LINQ</h3>
    -					<p>
    -						Other platforms incorporate ideas such as LINQ (with LINQ-to-SQL), or Scala's SLICK, or also Java's QueryDSL to better integrate querying as a concept into their respective language. By querying, they understand querying of arbitrary targets, such as SQL, XML, Collections and other heterogeneous data stores. jOOQ claims that this is going the wrong way too.
    -					</p>
    -					<p>
    - 						In more advanced querying use-cases (more than simple CRUD and the occasional JOIN), people will want to profit from the expressivity of SQL. Due to the relational nature of SQL, this is quite different from what object-oriented and partially functional languages such as C#, Scala, or Java can offer.
    - 					</p>
    - 					<p>
    - 						It is very hard to formally express and validate joins and the ad-hoc table expression types they create. It gets even harder when you want support for more advanced table expressions, such as pivot tables, unnested cursors, or just arbitrary projections from derived tables. With a very strong object-oriented typing model, these features will probably stay out of scope.
    - 					</p>
    - 					<p>
    - 						In essence, the decision of creating an API that looks like SQL or one that looks like C#, Scala, Java is a definite decision in favour of one or the other platform. While it will be easier to evolve SLICK in similar ways as LINQ (or QueryDSL in the Java world), SQL feature scope that clearly communicates its underlying intent will be very hard to add, later on (e.g. how would you model Oracle's partitioned outer join syntax? How would you model ANSI/ISO SQL:1999 grouping sets? How can you support scalar subquery caching? etc...).					
    -					</p>
    -					<p>
    -						jOOQ has come to fill this gap.
    -					</p>
    -					
    -					<h3>jOOQ is different</h3>
    -					<p>
    -						SQL was never meant to be abstracted. To be confined in the narrow boundaries of heavy mappers, hiding the beauty and simplicity of relational data. SQL was never meant to be object-oriented. SQL was never meant to be anything other than... SQL!
    -					</p>					
    -				</html></content>
    -			</section>
    -			
    -			<section id="copyright">
    -				<title>Copyright, License, and Trademarks</title>
    -				<content><html>
    -                    <p>
    -                        This section lists the various licenses that apply to different versions of jOOQ. Prior to version 3.2, jOOQ was shipped for free under the terms of the <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache Software License 2.0</a>. With jOOQ 3.2, jOOQ became dual-licensed: <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache Software License 2.0</a> (for use with Open Source databases) and <a href="http://www.jooq.org/licensing">commercial</a> (for use with commercial databases). Please contact <a href="mailto:sales@datageekery.com">sales@datageekery.com</a>, should you have any questions regarding licensing.
    -                    </p>
    -                    <h3>License for jOOQ 1.x, 2.x, 3.0, 3.1</h3>
    -                    
    -</html><text>Copyright (c) 2009-2013, Lukas Eder, lukas.eder@gmail.com
    -All rights reserved.
    -
    -This software is licensed to you under the Apache License, Version 2.0
    -(the "License"); You may obtain a copy of the License at
    -
    -  http://www.apache.org/licenses/LICENSE-2.0
    -
    -Redistribution and use in source and binary forms, with or without
    -modification, are permitted provided that the following conditions are met:
    -
    -. Redistributions of source code must retain the above copyright notice, this
    -  list of conditions and the following disclaimer.
    -
    -. Redistributions in binary form must reproduce the above copyright notice,
    -  this list of conditions and the following disclaimer in the documentation
    -  and/or other materials provided with the distribution.
    -
    -. Neither the name "jOOQ" nor the names of its contributors may be
    -  used to endorse or promote products derived from this software without
    -  specific prior written permission.
    -
    -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
    -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
    -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
    -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
    -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
    -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
    -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
    -POSSIBILITY OF SUCH DAMAGE.</text><html>
    -
    -                    <h3>License for jOOQ 3.2 and later</h3>
    -                    
    -</html><text>Copyright (c) 2009-2013, Data Geekery GmbH (http://www.datageekery.com)
    -All rights reserved.
    -
    -This work is dual-licensed
    -- under the Apache Software License 2.0 (the "ASL")
    -- under the jOOQ License and Maintenance Agreement (the "jOOQ License")
    -=============================================================================
    -You may choose which license applies to you:
    -
    -- If you're using this work with Open Source databases, you may choose
    -  either ASL or jOOQ License.
    -- If you're using this work with at least one commercial database, you must
    -  choose jOOQ License
    -
    -For more information, please visit http://www.jooq.org/licenses
    -
    -Apache Software License 2.0:
    ------------------------------------------------------------------------------
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    - http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -
    -jOOQ License and Maintenance Agreement:
    ------------------------------------------------------------------------------
    -Data Geekery grants the Customer the non-exclusive, timely limited and
    -non-transferable license to install and use the Software under the terms of
    -the jOOQ License and Maintenance Agreement.
    -
    -This library is distributed with a LIMITED WARRANTY. See the jOOQ License
    -and Maintenance Agreement for more details: http://www.jooq.org/licensing</text><html>
    -
    -                    <h3>Trademarks owned by Data Geekeryâ„¢ GmbH</h3>
    -                    <ul>
    -                        <li>jOOQâ„¢ is a trademark by Data Geekeryâ„¢ GmbH</li>
    -                        <li>jOOXâ„¢ is a trademark by Data Geekeryâ„¢ GmbH</li>
    -                        <li>jOORâ„¢ is a trademark by Data Geekeryâ„¢ GmbH</li>
    -                        <li>jOOUâ„¢ is a trademark by Data Geekeryâ„¢ GmbH</li>
    -                    </ul>
    -                    
    -                    <h3>Trademarks owned by database vendors with no affiliation to Data Geekeryâ„¢ GmbH</h3>
    -                    <ul>
    -                        <li>Access® is a registered trademark of Microsoft® Inc.</li>
    -                        <li>Adaptive Server® Enterprise is a registered trademark of Sybase®, Inc.</li>
    -                        <li>CUBRID™ is a trademark of NHN® Corp.</li>
    -                        <li>DB2® is a registered trademark of IBM® Corp.</li>
    -                        <li>Derby is a trademark of the Apacheâ„¢ Software Foundation</li>
    -                        <li>H2 is a trademark of the H2 Group</li>
    -                        <li>HSQLDB is a trademark of The hsql Development Group</li>
    -                        <li>Ingres is a trademark of Actianâ„¢ Corp.</li>
    -                        <li>MariaDB is a trademark of Monty Program Ab</li>
    -                        <li>MySQL® is a registered trademark of Oracle® Corp.</li>
    -                        <li>Firebird® is a registered trademark of Firebird Foundation Inc.</li>
    -                        <li>Oracle® database is a registered trademark of Oracle® Corp.</li>
    -                        <li>PostgreSQL® is a registered trademark of The PostgreSQL Global Development Group</li>
    -                        <li>Postgres Plus® is a registered trademark of EnterpriseDB® software</li>
    -                        <li>SQL Anywhere® is a registered trademark of Sybase®, Inc.</li>
    -                        <li>SQL Server® is a registered trademark of Microsoft® Inc.</li>
    -                        <li>SQLite is a trademark of Hipp, Wyrick &amp; Company, Inc.</li>
    -                    </ul>
    -                    
    -                    <h3>Other trademarks by vendors with no affiliation to Data Geekeryâ„¢ GmbH</h3>
    -                    <ul>
    -                        <li>Java® is a registered trademark by Oracle® Corp. and/or its affiliates</li>
    -                        <li>Scala is a trademark of EPFL</li>
    -                    </ul>
    -                    
    -                    <h3>Other trademark remarks</h3>
    -                    <p>
    -                        Other names may be trademarks of their respective owners.
    -                    </p>
    -                    
    -                    <p>
    -                        Throughout the manual, the above trademarks are referenced without a formal ® (R) or ™ (TM) symbol. It is believed that referencing third-party trademarks in this manual or on the jOOQ website constitutes "fair use". Please <a href="mailto:contact@datageekery.com">contact us</a> if you think that your trademark(s) are not properly attributed.
    -                    </p>
    -				</html></content>
    -			</section>
    -			
    -			<section id="getting-started">
    -				<title>Getting started with jOOQ</title>
    -				<content><html>
    -					<p>
    -						These chapters contain a quick overview of how to get started with this manual and with jOOQ. While the subsequent chapters contain a lot of reference information, this chapter here just wraps up the essentials.
    -					</p>
    -				</html></content>
    -
    -				<sections>
    -					<section id="the-manual">
    -					    <title>How to read this manual</title>
    -						<content><html>
    -							<p>
    -								This section helps you correctly interpret this manual in the context of jOOQ.
    -							</p>
    -							
    -							<h3>Code blocks</h3>
    -							<p>
    -								The following are code blocks:
    -							</p>
    -							
    -</html><sql><![CDATA[-- A SQL code block
    -SELECT 1 FROM DUAL]]></sql><java><![CDATA[// A Java code block
    -for (int i = 0; i < 10; i++);]]></java><xml><![CDATA[<!-- An XML code block -->
    -<hello what="world"></hello>]]></xml><config><![CDATA[# A config file code block
    -org.jooq.property=value]]></config><html>		
    -
    -							<p>
    -								These are useful to provide examples in code. Often, with jOOQ, it is even more useful to compare SQL code with its corresponding Java/jOOQ code. When this is done, the blocks are aligned side-by-side, with SQL usually being on the left, and Java usually being on the right:
    -							</p>					
    -							
    -</html><code-pair>
    -<sql><![CDATA[-- In SQL:
    -SELECT 1 FROM DUAL]]></sql><java><![CDATA[// Using jOOQ:
    -create.select()]]></java>
    -</code-pair><html>
    -
    -							<h3>Code block contents</h3>
    -							<p>
    -								The contents of code blocks follow conventions, too. If nothing else is mentioned next to any given code block, then the following can be assumed:
    -							</p>
    -							
    -							
    -</html><sql><![CDATA[-- SQL assumptions
    -------------------
    -
    --- If nothing else is specified, assume that the Oracle syntax is used 
    -SELECT 1 FROM DUAL]]></sql><java><![CDATA[// Java assumptions
    -// ----------------
    - 
    -// Whenever you see "standalone functions", assume they were static imported from org.jooq.impl.Factory 
    -exists(); max(); min(); val(); inline(); // correspond to Factory.exists(); Factory.max(); Factory.min(); etc...
    -
    -// Whenever you see BOOK/Book, AUTHOR/Author and similar entities, assume they were (static) imported from the generated schema
    -BOOK.TITLE, AUTHOR.LAST_NAME // correspond to com.example.generated.Tables.BOOK.TITLE, com.example.generated.Tables.BOOK.TITLE
    -
    -// Whenever you see "create" being used in Java code, assume that this is an instance of org.jooq.impl.Factory:
    -Factory create = new Factory(connection, SQLDialect.ORACLE);]]></java><html>
    -
    -							<h3>Settings</h3>
    -							<p>
    -								jOOQ allows to override runtime behaviour using <reference class="org.jooq.conf.Settings"/>. If nothing is specified, the default runtime settings are assumed.
    -							</p>
    -							
    -							<h3>Sample database</h3>
    -							<p>
    -								See the manual's section about <reference id="sample-database" title="the sample database used in this manual"/> to learn more about the sample database.
    -							</p>
    -						</html></content>
    -					</section>
    -
    -					<section id="sample-database">
    -					    <title>The sample database used in this manual</title>
    -						<content><html>
    -							<p>
    -							For the examples in this manual, the same database will always be referred to. It essentially consists of these entities created using the Oracle dialect
    -							</p>
    -</html><sql>CREATE TABLE language (
    -  id              NUMBER(7)     NOT NULL PRIMARY KEY,
    -  cd              CHAR(2)       NOT NULL,
    -  description     VARCHAR2(50)
    -)
    -
    -CREATE TABLE author (
    -  id              NUMBER(7)     NOT NULL PRIMARY KEY,
    -  first_name      VARCHAR2(50),
    -  last_name       VARCHAR2(50)  NOT NULL,
    -  date_of_birth   DATE,
    -  year_of_birth   NUMBER(7),
    -  distinguished   NUMBER(1)
    -)
    -
    -CREATE TABLE book (
    -  id              NUMBER(7)     NOT NULL PRIMARY KEY,
    -  author_id       NUMBER(7)     NOT NULL,
    -  title           VARCHAR2(400) NOT NULL,
    -  published_in    NUMBER(7)     NOT NULL,
    -  language_id     NUMBER(7)     NOT NULL,
    -  
    -  CONSTRAINT fk_book_author     FOREIGN KEY (author_id)   REFERENCES author(id),
    -  CONSTRAINT fk_book_language   FOREIGN KEY (language_id) REFERENCES language(id)
    -)
    -
    -CREATE TABLE book_store (
    -  name            VARCHAR2(400) NOT NULL UNIQUE
    -)
    -
    -CREATE TABLE book_to_book_store (
    -  name            VARCHAR2(400) NOT NULL,
    -  book_id         INTEGER       NOT NULL,
    -  stock           INTEGER,
    -  
    -  PRIMARY KEY(name, book_id),
    -  CONSTRAINT fk_b2bs_book_store FOREIGN KEY (name)        REFERENCES book_store (name) ON DELETE CASCADE,
    -  CONSTRAINT fk_b2bs_book       FOREIGN KEY (book_id)     REFERENCES book (id)         ON DELETE CASCADE
    -)</sql><html>
    -							<p>
    -								More entities, types (e.g. UDT's, ARRAY types, ENUM types, etc), stored procedures and packages are introduced for specific examples
    -							</p>
    -						</html></content>
    -					</section>
    -
    -					<section id="use-cases">
    -						<title>Different use cases for jOOQ</title>
    -						<content><html>
    -							<p>
    -								jOOQ has originally been created as a library for complete abstraction of JDBC and all database interaction. Various best practices that are frequently encountered in pre-existing software products are applied to this library. This includes:
    -							</p>
    -							<ul>
    -								<li>Typesafe database object referencing through generated schema, table, column, record, procedure, type, dao, pojo artefacts (see the chapter about <reference id="code-generation" title="code generation"/>)</li>
    -								<li>Typesafe SQL construction through a complete API modelling SQL as a domain specific language in Java (see the chapter about <reference id="dsl-and-non-dsl" title="the DSL API"/>)</li>
    -								<li>Convenient query execution through an improved API for result fetching (see the chapters about <reference id="fetching" title="the various types of data fetching"/>)</li>
    -								<li>SQL dialect abstraction and SQL clause simulation to improve cross-database compatibility and to enable missing features in simpler databases (see the chapter about <reference id="sql-dialects" title="SQL dialects"/>)</li>
    -								<li>SQL logging and debugging using jOOQ as an integral part of your development process (see the chapters about <reference id="logging" title="logging"/> and about the <reference id="jooq-console" title="jOOQ Console"/>)</li>
    -							</ul>
    -							<p>
    -								Effectively, jOOQ was originally designed to replace any other database abstraction framework short of the ones handling connection pooling and transaction management (see also the <reference id="reference-credits" title="credits for other database abstraction libraries"/>)
    -							</p>
    -							
    -							<h3>Use jOOQ the way you prefer</h3>
    -							<p>
    -								... but open source is community-driven. And the community has shown various ways of using jOOQ that diverge from its original intent. Some use cases encountered are:
    -							</p>
    -							<ul>
    -								<li>Using Hibernate for 70% of the queries (i.e. <reference id="crud-with-updatablerecords" title="CRUD"/>) and jOOQ for the remaining 30% where SQL is really needed</li>
    -								<li>Using jOOQ for SQL building and JDBC for SQL execution</li> 
    -								<li>Using jOOQ for SQL building and Spring Data for SQL execution</li>
    -								<li>Using jOOQ without the <reference id="code-generation" title="source code generator"/> to build the basis of a framework for dynamic SQL execution.</li> 
    -							</ul>
    -							
    -							<p>
    -								The following sections explain about various use cases for using jOOQ in your application.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="jooq-as-a-standalone-sql-builder">
    -								<title>jOOQ as a SQL builder</title>
    -								<content><html>
    -									<p>
    -										This is the most simple of all use cases, allowing for construction of valid SQL for any database. In this use case, you will not use <reference id="jooq-as-a-sql-builder-with-code-generation" title="jOOQ's code generator"/> and probably not even <reference id="jooq-as-a-sql-executor" title="jOOQ's query execution facilities"/>. Instead, you'll use jOOQ to wrap strings, literals and other user-defined objects into an object-oriented, type-safe AST modelling your SQL statements. An example is given here: 
    -									</p>
    -									
    -</html><java><![CDATA[// Fetch a SQL string from a jOOQ Query in order to manually execute it with another tool.
    -String sql = create.select(fieldByName("BOOK","TITLE"), fieldByName("AUTHOR","FIRST_NAME"), fieldByName("AUTHOR","LAST_NAME"))
    -                   .from(tableByName("BOOK"))
    -                   .join(tableByName("AUTHOR"))
    -                   .on(fieldByName("BOOK", "AUTHOR_ID").equal("AUTHOR", "ID"))
    -                   .where(fieldByName("BOOK", "PUBLISHED_IN").equal(1948))
    -                   .getSQL();]]></java><html>
    -                   
    -                   					<p>
    -                   						The SQL string that you can generate as such can then be executed using JDBC directly, using Spring's JdbcTemplate, using Apache DbUtils and many other tools.
    -                   					</p>
    -                   					<p>
    -                   						If you wish to use jOOQ only as a SQL builder, the following sections of the manual will be of interest to you:
    -                  					</p>
    -                  					<ul>
    -                  						<li><reference id="sql-building" title="SQL building"/>: This section contains a lot of information about creating SQL statements using the jOOQ API</li>
    -                  						<li><reference id="plain-sql" title="Plain SQL"/>: This section contains information useful in particular to those that want to supply <reference id="table-expressions" title="table expressions"/>, <reference id="column-expressions" title="column expressions"/>, etc. as plain SQL to jOOQ, rather than through generated artefacts</li>
    -                  					</ul>
    -								</html></content>
    -							</section>
    -
    -							<section id="jooq-as-a-sql-builder-with-code-generation">
    -								<title>jOOQ as a SQL builder with code generation</title>
    -								<content><html>
    -									<p>
    -										In addition to using jOOQ as a <reference id="jooq-as-a-standalone-sql-builder" title="standalone SQL builder"/>, you can also use jOOQ's code generation features in order to compile your SQL statements using a Java compiler against an actual database schema. This adds a lot of power and expressiveness to just simply constructing SQL using custom strings and literals, as you can be sure that all database artefacts actually exist in the database, and that their type is correct. An example is given here: 
    -									</p>
    -
    -</html><java><![CDATA[// Fetch a SQL string from a jOOQ Query in order to manually execute it with another tool.
    -String sql = create.select(BOOK.TITLE, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -                   .from(BOOK)
    -                   .join(AUTHOR)
    -                   .on(BOOK.AUTHOR_ID.equal(AUTHOR.ID))
    -                   .where(BOOK.PUBLISHED_IN.equal(1948))
    -                   .getSQL();]]></java><html>
    -                   
    -                   					<p>
    -                   						The SQL string that you can generate as such can then be executed using JDBC directly, using Spring's JdbcTemplate, using Apache DbUtils and many other tools.
    -                   					</p>
    -                   					<p>
    -                   						If you wish to use jOOQ only as a SQL builder with code generation, the following sections of the manual will be of interest to you:
    -                  					</p>
    -                  					<ul>
    -                  						<li><reference id="sql-building" title="SQL building"/>: This section contains a lot of information about creating SQL statements using the jOOQ API</li>
    -                  						<li><reference id="code-generation" title="Code generation"/>: This section contains the necessary information to run jOOQ's code generator against your developer database</li>
    -                  					</ul>
    -								</html></content>
    -							</section>
    -
    -							<section id="jooq-as-a-sql-executor">
    -								<title>jOOQ as a SQL executor</title>
    -								<content><html>
    -									<p>
    -										Instead of any tool mentioned in the previous chapters, you can also use jOOQ directly to execute your jOOQ-generated SQL statements. This will add a lot of convenience on top of the previously discussed API for typesafe SQL construction, when you can re-use the information from generated classes to fetch records and custom data types. An example is given here:
    -									</p>
    -									
    -</html><java><![CDATA[// Execute the SQL statement directly with jOOQ
    -Result<Record> result = create.select(BOOK.TITLE, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -			                  .from(BOOK)
    -			                  .join(AUTHOR)
    -			                  .on(BOOK.AUTHOR_ID.equal(AUTHOR.ID))
    -			                  .where(BOOK.PUBLISHED_IN.equal(1948))
    -			                  .fetch();]]></java><html>
    -
    -									<p>
    -										jOOQ doesn't stop here, though! You can execute any SQL with jOOQ. In other words, you can use any other SQL building tool and run the SQL statements with jOOQ. An example is given here:
    -									</p>
    -
    -</html><java><![CDATA[// Use your favourite tool to construct SQL strings:
    -String sql = "SELECT title, first_name, last_name FROM book JOIN author ON book.author_id = author.id " +
    -             "WHERE book.published_in = 1984";
    -
    -// Fetch results using jOOQ
    -Result<Record> result = create.fetch(sql);
    -
    -// Or execute that SQL with JDBC, fetching the ResultSet with jOOQ:
    -ResultSet rs = connection.createStatement().executeQuery(sql);
    -Result<Record> result = create.fetch(rs);]]></java><html>
    -
    -									<p>
    -                   						If you wish to use jOOQ as a SQL executor with (or without) code generation, the following sections of the manual will be of interest to you:
    -                  					</p>
    -                  					<ul>
    -                  						<li><reference id="sql-building" title="SQL building"/>: This section contains a lot of information about creating SQL statements using the jOOQ API</li>
    -                  						<li><reference id="code-generation" title="Code generation"/>: This section contains the necessary information to run jOOQ's code generator against your developer database</li>
    -                  						<li><reference id="sql-execution" title="SQL execution"/>: This section contains a lot of information about executing SQL statements using the jOOQ API</li>
    -                  						<li><reference id="fetching"/>: This section contains some useful information about the various ways of fetching data with jOOQ</li>
    -                  					</ul>
    -								</html></content>
    -							</section>
    -
    -							<section id="jooq-for-crud">
    -								<title>jOOQ for CRUD</title>
    -								<content><html>
    -									<p>
    -										This is probably the most complete use-case for jOOQ: Use all of jOOQ's features. Apart from jOOQ's fluent API for query construction, jOOQ can also help you execute everyday CRUD operations. An example is given here:
    -									</p>
    -
    -</html><java><![CDATA[// Fetch all authors
    -for (AuthorRecord author : create.fetch(AUTHOR)) {
    -
    -    // Skip previously distinguished authors  
    -    if ((int) author.getDistinguished() == 1)
    -        continue;
    -  
    -    // Check if the author has written more than 5 books
    -    if (author.fetchChildren(FK_BOOK_AUTHOR).size() > 5) {
    -    
    -        // Mark the author as a "distinguished" author
    -        author.setDistinguished(1);
    -        author.store();
    -    }
    -}]]></java><html>
    -
    -									<p>
    -                   						If you wish to use all of jOOQ's features, the following sections of the manual will be of interest to you (including all sub-sections):
    -                  					</p>
    -                  					<ul>
    -                  						<li><reference id="sql-building" title="SQL building"/>: This section contains a lot of information about creating SQL statements using the jOOQ API</li>
    -                  						<li><reference id="code-generation" title="Code generation"/>: This section contains the necessary information to run jOOQ's code generator against your developer database</li>
    -                  						<li><reference id="sql-execution" title="SQL execution"/>: This section contains a lot of information about executing SQL statements using the jOOQ API</li>
    -                  					</ul>
    -								</html></content>
    -							</section>
    -							
    -							<section id="jooq-for-pros">
    -								<title>jOOQ for PROs</title>
    -								<content><html>
    -									<p>
    -										jOOQ isn't just a library that helps you <reference id="sql-building" title="build"/> and <reference id="sql-execution" title="execute"/> SQL against your <reference id="code-generation" title="generated, compilable schema"/>. jOOQ ships with a lot of tools. Here are some of the most important tools shipped with jOOQ:
    -									</p>
    -									<ul>
    -										<li><reference id="jooq-console" title="jOOQ Console"/>: This small application hooks into jOOQ's execute listener support to allow for tracing, debugging and introspecting any SQL statement executed through the jOOQ API. This includes setting breakpoints, introspecting bind values, running probe SQL statements, ad-hoc patching of SQL, measuring execution times, exporting stack traces. Use this tool to better know your SQL!</li>
    -										<li><reference id="execute-listeners" title="jOOQ's Execute Listeners"/>: jOOQ allows you to hook your custom execute listeners into jOOQ's SQL statement execution lifecycle in order to centrally coordinate any arbitrary operation performed on SQL being executed. Use this for logging, identity generation, SQL tracing, performance measurements, etc.</li>
    -										<li><reference id="logging" title="Logging"/>: jOOQ has a standard DEBUG logger built-in, for logging and tracing all your executed SQL statements and fetched result sets</li>
    -										<li><reference id="stored-procedures" title="Stored Procedures"/>: jOOQ supports stored procedures and functions of your favourite database. All routines and user-defined types are generated and can be included in jOOQ's SQL building API as function references.</li>
    -										<li><reference id="exporting" title="Exporting"/> and <reference id="importing" title="Importing"/>: jOOQ ships with an API to easily export/import data in various formats</li>
    -									</ul>
    -									<p>
    -										If you're a power user of your favourite, feature-rich database, jOOQ will help you access all of your database's vendor-specific features, such as OLAP features, stored procedures, user-defined types, vendor-specific SQL, functions, etc. Examples are given throughout this manual.
    -									</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -					<section id="tutorials">
    -						<title>Tutorials</title>
    -						<content><html>
    -							<p>
    -								Don't have time to read the full manual? Here are a couple of tutorials that will get you into the most essential parts of jOOQ as quick as possible.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="jooq-in-7-steps">
    -								<title>jOOQ in 7 easy steps</title>
    -								<content><html>
    -									<p>
    -										This manual section is intended for new users, to help them get a running application with jOOQ, quickly.
    -									</p>
    -								</html></content>
    -								
    -								<sections>
    -									<section id="jooq-in-7-steps-step1">
    -										<title>Step 1: Preparation</title>
    -										<content><html>
    -											<p>
    -												If you haven't already downloaded it, download jOOQ:<br/>
    -												<a href="https://sourceforge.net/projects/jooq/files/Release/" title="jOOQ download">https://sourceforge.net/projects/jooq/files/Release/</a>
    -											</p>
    -											
    -											<p>
    -												Alternatively, you can create a Maven dependency:
    -											</p>
    -</html><xml><![CDATA[<dependency>
    -  <groupId>org.jooq</groupId>
    -  <!-- artefacts are jooq, jooq-meta, jooq-codegen -->
    -  <artifactId>jooq</artifactId>
    -  <version>{jooq-version}</version>
    -</dependency>]]></xml><html>
    -
    -											<p>
    -												For this example, we'll be using MySQL. If you haven't already downloaded MySQL Connector/J, download it here:<br/>
    -												<a href="http://dev.mysql.com/downloads/connector/j/" target="_blank" title="MySQL JDBC driver">http://dev.mysql.com/downloads/connector/j/</a>
    -											</p>
    -
    -											<p>
    -												If you don't have a MySQL instance up and running yet, get <a href="http://www.apachefriends.org/en/xampp.html" title="XAMPP">XAMPP</a> now! XAMPP is a simple installation bundle for Apache, MySQL, PHP and Perl
    -											</p>
    -										</html></content>
    -									</section>
    -									
    -									<section id="jooq-in-7-steps-step2">
    -										<title>Step 2: Your database</title>
    -										<content><html>
    -											<p>
    -												We're going to create a database called "guestbook" and a corresponding "posts" table. Connect to MySQL via your command line client and type the following:
    -											</p>
    -											
    -</html><sql>CREATE DATABASE guestbook;
    -
    -CREATE TABLE `posts` (
    -  `id` bigint(20) NOT NULL,
    -  `body` varchar(255) DEFAULT NULL,
    -  `timestamp` datetime DEFAULT NULL,
    -  `title` varchar(255) DEFAULT NULL,
    -  PRIMARY KEY (`id`)
    -);
    -</sql></content>
    -									</section>
    -									
    -									<section id="jooq-in-7-steps-step3">
    -										<title>Step 3: Code generation</title>
    -										<content><html>
    -											<p>
    -												In this step, we're going to use jOOQ's command line tools to generate classes that map to the Posts table we just created. More detailed information about how to set up the jOOQ code generator can be found here:<br/>
    -												<reference id="code-generation" title="jOOQ manual pages about setting up the code generator"/>
    -											</p>
    -
    -											<p>
    -												The easiest way to generate a schema is to copy the jOOQ jar files (there should be 3) and the MySQL Connector jar file to a temporary directory. Then, create a guestbook.xml that looks like this:
    -											</p>
    -											
    -</html><xml><![CDATA[<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    -<configuration xmlns="http://www.jooq.org/xsd/jooq-codegen-2.5.0.xsd">
    -  <!-- Configure the database connection here -->
    -  <jdbc>
    -    <driver>com.mysql.jdbc.Driver</driver>
    -    <url>jdbc:mysql://localhost:3306/guestbook</url>
    -    <user>root</user>
    -    <password></password>
    -  </jdbc>
    -
    -  <generator>
    -    <!-- The default code generator. You can override this one, to generate your own code style
    -         Defaults to org.jooq.util.DefaultGenerator -->
    -    <name>org.jooq.util.DefaultGenerator</name>
    -
    -    <database>
    -      <!-- The database type. The format here is:
    -           org.util.[database].[database]Database -->
    -      <name>org.jooq.util.mysql.MySQLDatabase</name>
    -
    -      <!-- The database schema (or in the absence of schema support, in your RDBMS this
    -           can be the owner, user, database name) to be generated -->
    -      <inputSchema>guestbook</inputSchema>
    -
    -      <!-- All elements that are generated from your schema (several Java regular expressions, separated by comma)
    -           Watch out for case-sensitivity. Depending on your database, this might be important! -->
    -      <includes>.*</includes>
    -
    -      <!-- All elements that are excluded from your schema (several Java regular expressions, separated by comma).
    -              Excludes match before includes -->
    -      <excludes></excludes>
    -    </database>
    -
    -    <target>
    -      <!-- The destination package of your generated classes (within the destination directory) -->
    -      <packageName>test.generated</packageName>
    -
    -      <!-- The destination directory of your generated classes -->
    -      <directory>C:/workspace/MySQLTest/src</directory>
    -    </target>
    -  </generator>
    -</configuration>]]></xml><html>
    -											<p>
    -												Replace the username with whatever user has the appropriate privileges to query the database meta data. You'll also want to look at the other values and replace as necessary. Here are the two interesting properties:
    -											</p>
    -											<p>
    -												<code>generator.target.package</code> - set this to the parent package you want to create for the generated classes. The setting of <code>test.generated</code> will cause the <code>test.generated.Posts</code> and <code>test.generated.PostsRecord</code> to be created
    -											</p>
    -											<p>
    -												<code>generator.target.directory</code> - the directory to output to.
    -											</p>
    -											
    -											<p>
    -												Once you have the JAR files and guestbook.xml in your temp directory, type this (use colons instead of semi-colons on UNIX/Linux systems):
    -											</p>
    -
    -</html><text>java -classpath jooq-{jooq-version}.jar;jooq-meta-{jooq-version}.jar;jooq-codegen-{jooq-version}.jar;mysql-connector-java-5.1.18-bin.jar;. 
    -  org.jooq.util.GenerationTool /guestbook.xml
    -</text><html>
    -
    -											<p>
    -												Note the prefix slash before guestbook.xml. Even though it's in our working directory, we need to prepend a slash, as the configuration file is loaded from the classpath. Replace the filenames with your filenames. In this example, jOOQ {jooq-version} is being used. If everything has worked, you should see this in your console output:
    -											</p>
    -
    -</html><text>Nov 1, 2011 7:25:06 PM org.jooq.impl.JooqLogger info
    -INFO: Initialising properties  : /guestbook.xml
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Database parameters
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: ----------------------------------------------------------
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO:   dialect                : MYSQL
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO:   schema                 : guestbook
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO:   target dir             : /Users/jOOQ/Documents/workspace/MySQLTest/src
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO:   target package         : test.generated
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: ----------------------------------------------------------
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Emptying                 : /Users/jOOQ/workspace/MySQLTest/src/test/generated
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Generating classes in    : /Users/jOOQ/workspace/MySQLTest/src/test/generated
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Generating schema        : Guestbook.java
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Schema generated         : Total: 122.18ms
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Sequences fetched        : 0 (0 included, 0 excluded)
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Masterdata tables fetched: 0 (0 included, 0 excluded)
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Tables fetched           : 5 (5 included, 0 excluded)
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Generating tables        : /Users/jOOQ/workspace/MySQLTest/src/test/generated/tables
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: ARRAYs fetched           : 0 (0 included, 0 excluded)
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Enums fetched            : 0 (0 included, 0 excluded)
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: UDTs fetched             : 0 (0 included, 0 excluded)
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Generating table         : Posts.java
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Tables generated         : Total: 680.464ms, +558.284ms
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Generating Keys          : /Users/jOOQ/workspace/MySQLTest/src/test/generated/tables
    -Nov 1, 2011 7:25:08 PM org.jooq.impl.JooqLogger info
    -INFO: Keys generated           : Total: 718.621ms, +38.157ms
    -Nov 1, 2011 7:25:08 PM org.jooq.impl.JooqLogger info
    -INFO: Generating records       : /Users/jOOQ/workspace/MySQLTest/src/test/generated/tables/records
    -Nov 1, 2011 7:25:08 PM org.jooq.impl.JooqLogger info
    -INFO: Generating record        : PostsRecord.java
    -Nov 1, 2011 7:25:08 PM org.jooq.impl.JooqLogger info
    -INFO: Table records generated  : Total: 782.545ms, +63.924ms
    -Nov 1, 2011 7:25:08 PM org.jooq.impl.JooqLogger info
    -INFO: Routines fetched         : 0 (0 included, 0 excluded)
    -Nov 1, 2011 7:25:08 PM org.jooq.impl.JooqLogger info
    -INFO: Packages fetched         : 0 (0 included, 0 excluded)
    -Nov 1, 2011 7:25:08 PM org.jooq.impl.JooqLogger info
    -INFO: GENERATION FINISHED!     : Total: 791.688ms, +9.143ms
    -</text></content>
    -									</section>
    -									
    -									<section id="jooq-in-7-steps-step4">
    -										<title>Step 4: Connect to your database</title>
    -										<content><html>
    -											<p>
    -												Let's just write a vanilla main class in the project containing the generated classes:
    -											</p>
    -											
    -</html><java><![CDATA[// For convenience, always static import your generated tables and jOOQ functions to decrease verbosity:
    -import static test.generated.Tables.*;
    -import static org.jooq.impl.Factory.*;
    -
    -public class Main {
    -    public static void main(String[] args) {
    -        Connection conn = null;
    -
    -        String userName = "root";
    -        String password = "";
    -        String url = "jdbc:mysql://localhost:3306/guestbook";
    -
    -        try {
    -            Class.forName("com.mysql.jdbc.Driver").newInstance();
    -            conn = DriverManager.getConnection(url, userName, password);
    -        } catch (Exception e) {
    -            // For the sake of this tutorial, let's keep exception handling simple
    -            e.printStackTrace();
    -        } finally {
    -            if (conn != null) {
    -                try {
    -                    conn.close();
    -                } catch (SQLException ignore) {
    -                }
    -            }
    -        }
    -    }
    -}]]></java><html>
    -
    -											<p>
    -												This is pretty standard code for establishing a MySQL connection.
    -											</p>
    -										</html></content>
    -									</section>
    -									
    -									<section id="jooq-in-7-steps-step5">
    -										<title>Step 5: Querying</title>
    -										<content><html>
    -											<p>
    -												Let's add a simple query:
    -											</p>
    -											
    -</html><java><![CDATA[Factory create = new Factory(conn, SQLDialect.MYSQL);
    -Result<Record> result = create.select().from(POSTS).fetch();]]></java><html>
    -
    -											<p>
    -												First get an instance of <code>Factory</code> so we can write a simple <code>SELECT</code> query. We pass an instance of the MySQL connection to <code>Factory</code>. Note that the factory doesn't close the connection. We'll have to do that ourselves.
    -											</p>
    -											<p>
    -												We then use jOOQ's DSL to return an instance of Result. We'll be using this result in the next step.
    -											</p>
    -										</html></content>
    -									</section>
    -									
    -									<section id="jooq-in-7-steps-step6">
    -										<title>Step 6: Iterating</title>
    -										<content><html>
    -											<p>
    -												After the line where we retrieve the results, let's iterate over the results and print out the data:
    -											</p>
    -
    -</html><java><![CDATA[for (Record r : result) {
    -    Long id = r.getValue(POSTS.ID);
    -    String title = r.getValue(POSTS.TITLE);
    -    String description = r.getValue(POSTS.BODY);
    -
    -    System.out.println("ID: " + id + " title: " + title + " desciption: " + description);
    -}]]></java><html>
    -
    -											<p>
    -												The full program should now look like this:
    -											</p>
    -											
    -</html><java><![CDATA[package test;
    -
    -// For convenience, always static import your generated tables and
    -// jOOQ functions to decrease verbosity:
    -import static test.generated.Tables.*;
    -import static org.jooq.impl.Factory.*;
    -
    -import java.sql.Connection;
    -import java.sql.DriverManager;
    -import java.sql.ResultSet;
    -import java.sql.Statement;
    -
    -import org.jooq.Record;
    -import org.jooq.Result;
    -
    -import test.generated.GuestbookFactory;
    -import test.generated.tables.Posts;
    -
    -public class Main {
    -
    -    /**
    -     * @param args
    -     */
    -    public static void main(String[] args) {
    -        Connection conn = null;
    -
    -        String userName = "root";
    -        String password = "";
    -        String url = "jdbc:mysql://localhost:3306/guestbook";
    -
    -        try {
    -            Class.forName("com.mysql.jdbc.Driver").newInstance();
    -            conn = DriverManager.getConnection(url, userName, password);
    -
    -            Factory create = new Factory(conn, SQLDialect.MYSQL);
    -            Result<Record> result = create.select().from(POSTS).fetch();
    -
    -            for (Record r : result) {
    -                Long id = r.getValue(POSTS.ID);
    -                String title = r.getValue(POSTS.TITLE);
    -                String description = r.getValue(POSTS.BODY);
    -
    -                System.out.println("ID: " + id + " title: " + title + " desciption: " + description);
    -            }
    -        } catch (Exception e) {
    -            // For the sake of this tutorial, let's keep exception handling simple
    -            e.printStackTrace();
    -        } finally {
    -            if (conn != null) {
    -                try {
    -                    conn.close();
    -                } catch (SQLException ignore) {
    -                }
    -            }
    -        }
    -    }
    -}]]></java></content>
    -									</section>
    -									
    -									<section id="jooq-in-7-steps-step7">
    -										<title>Step 7: Explore!</title>
    -										<content><html>
    -											<p>
    -												jOOQ has grown to be a comprehensive SQL library. For more information, please consider the manual:<br/>
    -												<a href="http://www.jooq.org/manual/" title="jOOQ Manual">http://www.jooq.org/manual/</a>
    -											</p>
    -											<p>
    -												... explore the Javadoc:<br/>
    -												<a href="http://www.jooq.org/javadoc/latest/" title="jOOQ Javadoc">http://www.jooq.org/javadoc/latest/</a>
    -											</p>
    -											<p>
    -												... or join the news group:<br/>
    -												<a href="https://groups.google.com/forum/#!forum/jooq-user" title="jOOQ news group">https://groups.google.com/forum/#!forum/jooq-user</a>
    -											</p>
    -											<p>
    -											    This tutorial is the courtesy of Ikai Lan. See the original source here:<br/>
    -											    <a href="http://ikaisays.com/2011/11/01/getting-started-with-jooq-a-tutorial/" target="_blank" title="Ikai Lan's jOOQ tutorial">http://ikaisays.com/2011/11/01/getting-started-with-jooq-a-tutorial/</a>
    -											</p>
    -										</html></content>
    -									</section>
    -								</sections>
    -							</section>
    -
    -							<section id="jooq-in-modern-ides">
    -								<title>Using jOOQ in modern IDEs</title>
    -								<content><html>
    -									<p>Feel free to contribute a tutorial!</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="jooq-with-spring">
    -								<title>Using jOOQ with Spring</title>
    -								<content><html>
    -									<p>Feel free to contribute a tutorial!</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="a-simple-web-application">
    -								<title>A simple web application with jOOQ</title>
    -								<content><html>
    -									<p>Feel free to contribute a tutorial!</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -					
    -					<section id="jooq-and-scala">
    -						<title>jOOQ and Scala</title>
    -						<content><html>
    -							<p>
    -								As any other library, jOOQ can be easily used in Scala, taking advantage of the many Scala language features such as for example:
    -							</p>
    -							<ul>
    -								<li>Optional "." to dereference methods from expressions</li>
    -								<li>Optional "(" and ")" to delimit method argument lists</li>
    -								<li>Optioanl ";" at the end of a Scala statement</li>
    -								<li>Type inference using "var" and "val" keywords</li>
    -							</ul>
    -						
    -							<p>
    -								But jOOQ also leverages other useful Scala features, such as
    -							</p>
    -							<ul>
    -								<li>implicit defs for operator overloading</li>
    -								<li>Scala Macros (soon to come)</li>
    -							</ul>
    -							
    -							<p>
    -								A short example jOOQ application in Scala might look like this:
    -							</p>
    -							
    -</html><scala><![CDATA[
    -import collection.JavaConversions._                                  // Import implicit defs for iteration over org.jooq.Result
    -                                                                     //
    -import java.sql.DriverManager                                        //
    -                                                                     //
    -import org.jooq._                                                    //
    -import org.jooq.impl._                                               //
    -import org.jooq.impl.Factory._                                       //
    -import org.jooq.scala.example.h2.Tables._                            //
    -import org.jooq.scala.Conversions._                                  // Import implicit defs for overloaded jOOQ/SQL operators
    -                                                                     //
    -object Test {                                                        //
    -  def main(args: Array[String]): Unit = {                            //
    -    val c = DriverManager.getConnection("jdbc:h2:~/test", "sa", ""); // Standard JDBC connection
    -    val f = new Factory(c, SQLDialect.H2);                           //
    -    val x = T_AUTHOR as "x"                                          // SQL-esque table aliasing
    -                                                                     //
    -    for (r <- f                                                      // Iteration over Result. "r" is an org.jooq.Record
    -        select (                                                     //
    -          T_BOOK.ID * T_BOOK.AUTHOR_ID,                              // Using the overloaded "*" operator
    -          T_BOOK.ID + T_BOOK.AUTHOR_ID * 3 + 4,                      // Using the overloaded "+" operator
    -          T_BOOK.TITLE || " abc" || " xy"                            // Using the overloaded "||" operator
    -        )                                                            //
    -        from T_BOOK                                                  // No need to use parentheses or "." here
    -        leftOuterJoin (                                              //
    -          f select (x.ID, x.YEAR_OF_BIRTH)                           // Dereference fields from aliased table
    -          from x                                                     //
    -          limit 1                                                    //
    -          asTable x.getName()                                        //
    -        )                                                            //
    -        on T_BOOK.AUTHOR_ID === x.ID                                 // Using the overloaded "===" operator
    -        where (T_BOOK.ID <> 2)                                       // Using the olerloaded "<>" operator
    -        or (T_BOOK.TITLE in ("O Alquimista", "Brida"))               // Neat IN predicate expression
    -        fetch                                                        //
    -    ) {                                                              //
    -      println(r)                                                     //
    -    }                                                                //
    -  }                                                                  //
    -}]]></scala><html>
    -
    -							<p>
    -								For more details about jOOQ's Scala integration, please refer to the manual's section about <reference id="scala-sql-building" title="SQL building with Scala"/>.
    -							</p>
    -						</html></content>
    -					</section>
    -					
    -					<section id="dependencies">
    -						<title>Dependencies</title>
    -						<content><html>
    -							<p>
    -								jOOQ has no dependencies on any third-party libraries. This rule has some exceptions:
    -							</p>
    -							<ul>
    -								<li><reference id="logging" title="logging APIs"/> are referenced as "optional dependencies". jOOQ tries to find slf4j or log4j on the classpath. If it fails, it will use the <reference class="java.util.logging.Logger"/></li>
    -								<li>Oracle ojdbc types used for array creation are loaded using reflection.</li>
    -								<li>Small libraries with compatible licenses are incorporated into jOOQ (<a href="http://code.google.com/p/joor/">jOOR</a>, <a href="http://code.google.com/p/joou/">jOOU</a>, <a href="http://opencsv.sourceforge.net/">OpenCSV</a>, <a href="http://code.google.com/p/json-simple/">json simple</a>, <a href="http://commons.apache.org/lang/">commons-lang</a>)</li>
    -								<li>javax.persistence and javax.validation will be needed if you activate the relevant <reference id="code-generation" title="code generation flags"/></li>
    -							</ul>
    -							
    -							<h3>Build your own</h3>
    -							<p>
    -								In order to build jOOQ, please download the sources from <a href="https://github.com/jOOQ/jOOQ">https://github.com/jOOQ/jOOQ</a> and use Maven to build it, preferably in Eclipse.
    -							</p>
    -						</html></content>
    -					</section>
    -				</sections>
    -			</section>
    -
    -			<section id="sql-building">
    -				<title>SQL building</title>
    -				<content><html>
    -					<p>
    -					    SQL is a declarative language that is hard to integrate into procedural, object-oriented, functional or any other type of programming languages. jOOQ's philosophy is to give SQL the credit it deserves and integrate SQL itself as an <a href="http://en.wikipedia.org/wiki/Domain_Specific_Language">"internal domain specific language"</a> directly into Java.
    -					</p>
    -					<p>
    -						With this philosophy in mind, SQL building is the main feature of jOOQ. All other features (such as <reference id="sql-execution"/> and <reference id="code-generation"/>) are mere convenience built on top of jOOQ's SQL building capabilities.
    -					</p>
    -					<p>
    -						This section explains all about the various syntax elements involved with jOOQ's SQL building capabilities. For a complete overview of all syntax elements, please refer to the manual's section about <reference id="reference-bnf-notation"/>
    -					</p>
    -				</html></content>
    -
    -				<sections>
    -					<section id="factory">
    -						<title>The Factory class</title>
    -						<content><html>
    -							<p>
    -								jOOQ exposes a lot of interfaces and hides most implementation facts from client code. The reasons for this are:
    -							</p>
    -							<ul>
    -								<li>Interface-driven design. This allows for modelling queries in a fluent API most efficiently</li>
    -								<li>Reduction of complexity for client code.</li>
    -								<li>API guarantee. You only depend on the exposed interfaces, not concrete (potentially dialect-specific) implementations.</li>
    -							</ul>
    -							<p>
    -								The <reference class="org.jooq.impl.Factory"/> class is the main class from where you will create all jOOQ objects.	The Factory serves two types of purposes:
    -							</p>
    -							<ul>
    -								<li>It serves as a static factory for <reference id="table-expressions" title="table expressions"/>, <reference id="column-expressions" title="column expressions"/> (or "fields"), <reference id="conditional-expressions" title="conditional expressions"/> and many other <reference id="queryparts" title="QueryParts"/>.</li>
    -								<li>It implements <reference class="org.jooq.Configuration"/>, an object that configures jOOQ's behaviour when executing queries (see <reference id="sql-execution"/> for more details). Factories allow for creating <reference id="sql-statements" title="SQL statements"/> that are already "configured" and ready for execution.</li>
    -							</ul>
    -
    -							<h3>The static Factory API</h3>
    -							<p>
    -								With jOOQ 2.0, static factory methods have been introduced in order to make client code look more like SQL. Ideally, when working with jOOQ, you will simply static import all methods from the Factory class:
    -							</p>
    -							</html><java>import static org.jooq.impl.Factory.*;</java><html>
    -							<p>
    -							    Note, that when working with Eclipse, you could also add the Factory to your favourites. This will allow to access functions even more fluently:
    -							</p>
    -</html><java>concat(trim(FIRST_NAME), trim(LAST_NAME));
    -// ... which is in fact the same as:
    -Factory.concat(Factory.trim(FIRST_NAME), Factory.trim(LAST_NAME));</java><html>
    -
    -							<h3>The Factory as a Configuration object</h3>
    -							<p>
    -							    As any Configuration object, a Factory can be supplied with these objects:
    -							</p>
    -							<ul>
    -								<li><reference class="org.jooq.SQLDialect"/> : The dialect of your database. This may be any of the currently supported database types (see <reference id="sql-dialects"/> for more details)</li>
    -								<li><reference class="java.sql.Connection"/> : An optional JDBC Connection that will be re-used for the whole lifecycle of your Factory (see <reference id="connection-vs-datasource"/> for more details)</li>
    -    							<li><reference class="java.sql.DataSource"/> : An optional JDBC DataSource that will be re-used for the whole lifecycle of your Factory. If you prefer using DataSources over Connections, jOOQ will internally fetch new Connections from your DataSource, conveniently closing them again after query execution. This is particularly useful in J2EE or Spring contexts (see <reference id="connection-vs-datasource"/> for more details)</li>
    -    							<li><reference class="org.jooq.conf.Settings"/> : An optional runtime configuration (see <reference id="custom-settings"/> for more details)</li>
    -							</ul>
    -							<p>
    -								As a Configuration object, a Factory can construct <reference id="sql-statements" title="statements"/>, for later <reference id="sql-execution" title="execution"/>. An example is given here:
    -							</p>
    -</html><java><![CDATA[// The Factory is "configured" with a Connection and a SQLDialect
    -Factory create = new Factory(connection, dialect);
    -
    -// This select statement contains an internal reference to the Factory:
    -Select<?> select = create.selectOne();
    -
    -// Using the internally referenced Factory, the select statement can now be executed:
    -Result<?> result = select.fetch();]]></java></content>
    -
    -						<sections>
    -							<section id="sql-dialects">
    -								<title>SQL Dialect</title>
    -								<content><html>
    -									<p>
    -										While jOOQ tries to represent the SQL standard as much as possible, many features are vendor-specific to a given database and to its "SQL dialect". jOOQ models this using the <reference class="org.jooq.SQLDialect"/> enum type.
    -									</p>
    -									<p>
    -										The SQL dialect is one of the main attributes of a <reference id="factory" title="Factory"/>. Queries created from such factories will assume dialect-specific behaviour when <reference id="sql-rendering" title="rendering SQL"/> and <reference id="variable-binding" title="binding bind values"/>.
    -									</p>
    -									<p>
    -										Some parts of the jOOQ API are officially supported only by a given subset of the supported SQL dialects. For instance, the <reference id="connect-by-clause" title="Oracle CONNECT BY clause"/>, which is supported by the Oracle and CUBRID databases, is annotated with a <reference class="org.jooq.Support"/> annotation, as such:
    -									</p>
    -</html><java><![CDATA[/**
    - * Add an Oracle-specific <code>CONNECT BY</code> clause to the query
    - */
    -@Support({ CUBRID, ORACLE })
    -SelectConnectByConditionStep connectBy(Condition condition);]]></java><html>
    -									<p>
    -									    jOOQ API methods which are not annotated with the <reference class="org.jooq.Support"/> annotation, or which are annotated with the Support annotation, but without any SQL dialects can be safely used in all SQL dialects. An example for this is the <reference id="select-statement" title="SELECT statement"/> factory method:
    -									</p>
    -</html><java><![CDATA[/**
    - * Create a new DSL select statement.
    - */
    -@Support
    -SelectSelectStep select(Field<?>... fields);]]></java><html>
    -
    -									<h3>jOOQ's SQL clause simulation capabilities</h3>
    -									<p>
    -										The aforementioned Support annotation does not only designate, which databases natively support a feature. It also indicates that a feature is simulated by jOOQ for some databases lacking this feature. An example of this is the <reference id="distinct-predicate" title="DISTINCT predicate"/>, a predicate syntax defined by SQL:1999 and implemented only by H2, HSQLDB, and Postgres:
    -									</p>
    -
    -</html><sql><![CDATA[A IS DISTINCT FROM B]]></sql><html>
    -
    -									<p>
    -										Nevertheless, the <code>IS DISTINCT FROM</code> predicate is supported in all dialects, as its semantics can be expressed with an equivalent <reference id="case-expressions" title="CASE expression"/>. For more details, see the manual's section about the <reference id="distinct-predicate" title="DISTINCT predicate"/>.
    -									</p>
    -									
    -									<h3>jOOQ and the Oracle SQL dialect</h3>
    -									<p>
    -										Oracle SQL is much more expressive than many other SQL dialects. It features many unique keywords, clauses and functions that are out of scope for the SQL standard. Some examples for this are
    -									</p>
    -									<ul>
    -										<li>The <reference id="connect-by-clause" title="CONNECT BY clause"/>, for hierarchical queries</li>
    -										<li>The <reference id="pivot-tables" title="PIVOT"/> keyword for creating PIVOT tables</li>
    -										<li><reference id="oracle-packages" title="Packages"/>, <reference id="oracle-member-procedures" title="object-oriented user-defined types, member procedures"/> as described in the section about <reference id="stored-procedures" title="stored procedures and functions"/></li>
    -										<li>Advanced analytical functions as described in the section about <reference id="window-functions" title="window functions"/></li>
    -									</ul>
    -
    -									<p>
    -										jOOQ has a historic affinity to Oracle's SQL extensions. If something is supported in Oracle SQL, it has a high probability of making it into the jOOQ API
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="connection-vs-datasource">
    -								<title>Connection vs. DataSource</title>
    -								<content><html>
    -									<h3>Interact with JDBC Connections</h3>
    -									<p>
    -										While you can use jOOQ for <reference id="sql-building" title="SQL building"/> only, you can also run queries against a JDBC <reference class="java.sql.Connection"/>. Internally, jOOQ creates <reference class="java.sql.Statement"/> or <reference class="java.sql.PreparedStatement"/> objects from such a Connection, in order to execute statements. The normal operation mode is to provide a <reference id="factory" title="Factory"/> with a JDBC Connection, whose lifecycle you will control yourself. This means that jOOQ will not actively close connections, rollback or commit transactions.
    -									</p>
    -									<h3>Interact with JDBC DataSources</h3>
    -									<p>
    -										If you're in a J2EE or Spring context, however, you may wish to use a <reference class="javax.sql.DataSource"/> instead. Currently, Connections obtained from such a DataSource will be closed after query execution by jOOQ. The semantics of such a close operation should be the returning of the connection into a connection pool, not the actual closing of the underlying physical connection. Typically, this makes sense in an environment using distributed JTA transactions. An example of using DataSources with jOOQ can be seen in the tutorial section about <reference id="jooq-with-spring" title="using jOOQ with Spring"/>.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="custom-settings">
    -								<title>Custom Settings</title>
    -								<content><html>
    -									<p>
    -										The jOOQ Factory allows for some optional configuration elements to be used by advanced users. The <reference class="org.jooq.conf.Settings" /> class is a JAXB-annotated type, that can be provided to a Factory in several ways:
    -									</p>
    -									<ul>
    -										<li>In the constructor. This will override default settings below</li>
    -										<li>From a location specified by a JVM parameter: -Dorg.jooq.settings</li>
    -										<li>From the classpath at /jooq-settings.xml</li>
    -										<li>From the settings defaults, as specified in <a href="http://www.jooq.org/xsd/jooq-runtime-2.5.0.xsd" title="The jOOQ Runtime configuration XSD">http://www.jooq.org/xsd/jooq-runtime-2.5.0.xsd</a></li>
    -									</ul>
    -									<h3>Example</h3>
    -									<p>
    -										For example, if you want to indicate to jOOQ, that it should inline all bind variables, and execute static <reference class="java.sql.Statement"/> instead of binding its variables to <reference class="java.sql.PreparedStatement"/>, you can do so by using the following Factory:
    -									</p>
    -</html><java><![CDATA[Settings settings = new Settings();
    -settings.setStatementType(StatementType.STATIC_STATEMENT);
    -Factory create = new Factory(connection, dialect, settings);]]></java><html>
    -									<p>
    -										Subsequent sections of the manual contain some more in-depth explanations about these settings:
    -									</p>
    -									<ul>
    -										<li>
    -		     								<reference id="schema-mapping" title="Runtime schema and table mapping"/>
    -		   								</li>
    -		     							<li>
    -		     								<reference id="execute-listeners" title="Execute listeners and SQL tracing"/>
    -		     							</li>
    -		     							<li>
    -		     								<reference id="optimistic-locking" title="Execute CRUD with optimistic locking enabled"/>
    -		     							</li>
    -		     							<li>
    -		     								<reference id="logging" title="Enabling DEBUG logging of all executed SQL"/>
    -		     							</li>
    -		   							</ul>
    -		   							<p>
    -										Please refer to the jOOQ runtime configuration XSD for more details:<br/>
    -										<a href="http://www.jooq.org/xsd/jooq-runtime-2.5.0.xsd" title="The jOOQ Runtime configuration XSD">http://www.jooq.org/xsd/jooq-runtime-2.5.0.xsd</a>
    -									</p>
    -								</html></content>
    -							</section>
    -							
    -							<section id="runtime-schema-mapping">
    -								<title>Runtime schema and table mapping</title>
    -								<content><html>
    -									<h3>Mapping your DEV schema to a productive environment</h3>
    -									<p>
    -										You may wish to design your database in a way that you have several instances of your schema. This is useful when you want to cleanly separate data belonging to several customers / organisation units / branches / users and put each of those entities' data in a separate database or schema.
    -									</p>
    -									
    -									<p>
    -										In our AUTHOR example this would mean that you provide a book reference database to several companies, such as My Book World and Books R Us. In that case, you'll probably have a schema setup like this:
    -									</p>
    -									<ul>
    -										<li>DEV: Your development schema. This will be the schema that you base code generation upon, with jOOQ </li>
    -										<li>MY_BOOK_WORLD: The schema instance for My Book World </li>
    -										<li>BOOKS_R_US: The schema instance for Books R Us </li>
    -									</ul>
    -
    -									<h3>Mapping DEV to MY_BOOK_WORLD with jOOQ</h3>
    -									<p>
    -										When a user from My Book World logs in, you want them to access the MY_BOOK_WORLD schema using classes generated from DEV. This can be achieved with the <reference class="org.jooq.conf.RenderMapping"/> class, that you can equip your Factory's <reference id="custom-settings" title="settings"/> with. Take the following example:
    -									</p>
    -
    -</html><java>Settings settings = new Settings()
    -    .withRenderMapping(new RenderMapping()
    -    .withSchemata(
    -        new MappedSchema().withInput("DEV")
    -                          .withOutput("MY_BOOK_WORLD")));
    -
    -// Add the settings to the factory
    -Factory create = new Factory(connection, SQLDialect.ORACLE, settings);
    -
    -// Run queries with the "mapped" factory
    -create.selectFrom(AUTHOR).fetch();</java><html>
    -
    -									<p>
    -										The query executed with a Factory equipped with the above mapping will in fact produce this SQL statement:
    -									</p>
    -									
    -</html><sql>SELECT * FROM MY_BOOK_WORLD.AUTHOR</sql><html>
    -									<p>
    -										Even if AUTHOR was generated from DEV.
    -									</p>
    -
    -									<h3>Mapping several schemata</h3>
    -									<p>
    -										Your development database may not be restricted to hold only one DEV schema. You may also have a LOG schema and a MASTER schema. Let's say the MASTER schema is shared among all customers, but each customer has their own LOG schema instance. Then you can enhance your RenderMapping like this (e.g. using an XML configuration file):
    -									</p>
    -
    -</html><xml><![CDATA[<settings xmlns="http://www.jooq.org/xsd/jooq-runtime-2.5.0.xsd">
    -  <renderMapping>
    -    <schemata>
    -      <schema>
    -        <input>DEV</input>
    -        <output>MY_BOOK_WORLD</output>
    -      </schema>
    -      <schema>
    -        <input>LOG</input>
    -        <output>MY_BOOK_WORLD_LOG</output>
    -      </schema>
    -    </schemata>
    -  </renderMapping>
    -</settings>]]></xml><html>
    -
    -                            		<p>
    -                            			Note, you can load the above XML file like this:
    -                           			</p>
    -
    -</html><java>Settings settings = JAXB.unmarshal(new File("jooq-runtime.xml"), Settings.class);</java><html>
    -
    -									<p>
    -										This will map generated classes from DEV to MY_BOOK_WORLD, from LOG to MY_BOOK_WORLD_LOG, but leave the MASTER schema alone. Whenever you want to change your mapping configuration, you will have to create a new Factory
    -									</p>
    -
    -
    -									<h3>Using a default schema</h3>
    -									<p>
    -										Another option to switch schema names is to use a default schema for the Factory's underlying Connection. Many RDBMS support a USE or SET SCHEMA command, which you can call like this:
    -									</p>
    -
    -</html><java>// Set the default schema
    -Schema MY_BOOK_WORLD = ...
    -create.use(MY_BOOK_WORLD);
    -
    -// Run queries with factory having a default schema
    -create.selectFrom(AUTHOR).fetch();</java><html>
    -
    -									<p>
    -										Queries generated from the above Factory will produce this kind of SQL statement:
    -									</p>
    -
    -</html><sql>-- the schema name is omitted from all SQL constructs.
    -SELECT * FROM AUTHOR</sql><html>
    -
    -                            		<p>
    -                            			If you wish not to render any schema name at all, use the following Settings property for this:
    -                           			</p>
    -
    -
    -</html><java>Settings settings = new Settings()
    -    .withRenderSchema(false);
    -
    -// Add the settings to the factory
    -Factory create = new Factory(connection, SQLDialect.ORACLE, settings);
    -
    -// Run queries that omit rendering schema names
    -create.selectFrom(AUTHOR).fetch();</java><html>
    -
    -									<h3>Mapping of tables</h3>
    -									<p>
    -										Not only schemata can be mapped, but also tables. If you are not the owner of the database your application connects to, you might need to install your schema with some sort of prefix to every table. In our examples, this might mean that you will have to map DEV.AUTHOR to something MY_BOOK_WORLD.MY_APP__AUTHOR, where MY_APP__ is a prefix applied to all of your tables. This can be achieved by creating the following mapping: 
    -									</p>
    -
    -</html><java>Settings settings = new Settings()
    -    .withRenderMapping(new RenderMapping()
    -    .withSchemata(
    -        new MappedSchema().withInput("DEV")
    -                          .withOutput("MY_BOOK_WORLD")
    -                          .withTables(
    -         new MappedTable().withInput("AUTHOR")
    -                          .withOutput("MY_APP__AUTHOR"))));
    -
    -// Add the settings to the factory
    -Factory create = new Factory(connection, SQLDialect.ORACLE, settings);
    -
    -// Run queries with the "mapped" factory
    -create.selectFrom(AUTHOR).fetch();</java><html>
    -
    -									<p>
    -										The query executed with a Factory equipped with the above mapping will in fact produce this SQL statement:
    -									</p>
    -									
    -</html><sql>SELECT * FROM MY_BOOK_WORLD.MY_APP__AUTHOR</sql><html>
    -
    -		                            <p>
    -		                           		Table mapping and schema mapping can be applied independently, by specifying several MappedSchema entries in the above configuration. jOOQ will process them in order of appearance and map at first match. Note that you can always omit a MappedSchema's output value, in case of which, only the table mapping is applied. If you omit a MappedSchema's input value, the table mapping is applied to all schemata!
    -		                            </p>
    -
    -									<h3>Hard-wiring mappings at code-generation time</h3>
    -									<p>
    -										Note that the manual's section about <reference id="schema-mapping" title="code generation schema mapping"/> explains how you can hard-wire your schema mappings at code generation time
    -									</p>									
    -								</html></content>
    -							</section>
    -
    -							<section id="factory-subclasses">
    -								<title>Factory subclasses</title>
    -								<content><html>
    -									<p>
    -										There are a couple of subclasses for the general Factory. Each SQL dialect has its own dialect-specific factory. For instance, if you're only using the MySQL dialect, you can choose to create a new Factory using any of the following types:
    -									</p>
    -</html><java>// A general, dialect-unspecific factory
    -Factory create = new Factory(connection, SQLDialect.MYSQL);
    -
    -// A MySQL-specific factory
    -MySQLFactory create = new MySQLFactory(connection);</java><html>
    -									<p>
    -										The advantage of using a dialect-specific Factory lies in the fact,	that you have access to more proprietary RDMBS functionality. This may include:
    -									</p>
    -									<ul>
    -		    							<li>MySQL's encryption functions</li>
    -		    							<li>PL/SQL constructs, pgplsql, or any other dialect's ROUTINE-language (maybe in the future)</li>
    -									</ul>
    -									<p>
    -										Another type of Factory subclasses are each generated schema's factories. If you generate your schema TEST, then you will have access to a TestFactory. By default, such a schema-specific Factory will not render the schema name.
    -									</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -					<section id="sql-statements">
    -						<title>SQL Statements</title>
    -						<content><html>
    -							<p>
    -								jOOQ currently supports 6 types of SQL statements. All of these statements are constructed from a Factory instance with an optional <reference id="connection-vs-datasource" title="JDBC Connection or DataSource"/>. If supplied with a Connection or DataSource, they can be executed. Depending on the <reference id="query-vs-resultquery" title="query type"/>, executed queries can return results.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="dsl-and-non-dsl">
    -								<title>jOOQ's DSL and non-DSL API</title>
    -								<content><html>
    -									<p>
    -										jOOQ ships with its own DSL (or	<a href="http://en.wikipedia.org/wiki/Domain-specific_language" title="Domain Specific Language">Domain Specific Language</a>) that	simulates SQL in Java. This means, that you can	write SQL statements almost as if Java natively supported it, just like .NET's C# does with <a href="http://msdn.microsoft.com/en-us/library/bb425822.aspx">LINQ to SQL.</a>
    -									</p>
    -									<p>
    -										Here is an example to illustrate what that means:
    -									</p>
    -									
    -</html><code-pair><sql><![CDATA[-- Select all books by authors born after 1920,
    --- named "Paulo" from a catalogue:
    -SELECT *
    -  FROM author a
    -  JOIN book b ON a.id = b.author_id
    - WHERE a.year_of_birth > 1920
    -   AND a.first_name = 'Paulo'
    - ORDER BY b.title]]></sql><java><![CDATA[Result<Record> result =
    -create.select()
    -      .from(AUTHOR.as("a"))
    -      .join(BOOK.as("b")).on(a.ID.equal(b.AUTHOR_ID))
    -      .where(a.YEAR_OF_BIRTH.greaterThan(1920)
    -      .and(a.FIRST_NAME.equal("Paulo")))
    -      .orderBy(b.TITLE)
    -      .fetch();]]></java></code-pair><html>
    -
    -									<p>
    -										We'll see how the aliasing works later in the section about <reference id="aliased-tables" title="aliased tables"/>
    -									</p>
    -
    -									<h3>jOOQ as an internal domain specific language in Java (a.k.a. the DSL-API)</h3>
    -									<p>
    -										Many other frameworks have similar APIs with similar feature sets. Yet, what makes jOOQ special is its informal <reference id="reference-bnf-notation" title="BNF notation"/> modelling a unified SQL dialect suitable for many vendor-specific dialects, and implementing that BNF notation as a hierarchy of interfaces in Java. This concept is extremely powerful, when <reference id="jooq-in-modern-ides" title="using jOOQ in modern IDEs" /> with syntax completion. Not only can you code much faster, your SQL code will be compile-checked to a certain extent. An example of a DSL query equivalent to the previous one is given here:
    -									</p>
    -</html><java><![CDATA[Factory create = new Factory(connection, dialect);
    -Result<?> result = create.select()
    -                         .from(AUTHOR)
    -                         .join(BOOK).on(BOOK.AUTHOR_ID.equal(AUTHOR.ID))
    -                         .fetch();]]></java><html>
    -
    -                         			<p>
    -                         				Unlike other, simpler frameworks that use <a href="http://en.wikipedia.org/wiki/Fluent_interface">"fluent APIs"</a> or <a href="http://en.wikipedia.org/wiki/Method_chaining">"method chaining"</a>, jOOQ's BNF-based interface hierarchy will not allow bad query syntax. The following will not compile, for instance:
    -                         			</p>
    -</html><java><![CDATA[Factory create = new Factory(connection, dialect);
    -Result<?> result = create.select()
    -                         .join(BOOK).on(BOOK.AUTHOR_ID.equal(AUTHOR.ID))
    -                      //  ^^^^ "join" is not possible here
    -                         .from(AUTHOR)
    -                         .fetch();
    -
    -Result<?> result = create.select()
    -                         .from(AUTHOR)
    -                         .join(BOOK)
    -                         .fetch();
    -                      //  ^^^^^ "on" is missing here
    -
    -Result<?> result = create.select(rowNumber())
    -                      //         ^^^^^^^^^ "over()" is missing here
    -                         .from(AUTHOR)
    -                         .fetch();]]></java><html>
    -
    -									<h3>History of SQL building and incremental query building (a.k.a. the non-DSL API)</h3>
    -									<p>
    -										Historically, jOOQ started out as an object-oriented SQL builder library like any other. This meant that all queries and their syntactic components were modeled as so-called <reference id="queryparts" title="QueryParts"/>, which delegate <reference id="sql-rendering" title="SQL rendering"/> and <reference id="variable-binding" title="variable binding"/> to child components. This part of the API will be referred to as the non-DSL API, which is still maintained and used internally by jOOQ for incremental query building. An example of incremental query building is given here:
    -									</p>
    -</html><java><![CDATA[Factory create = new Factory(connection, dialect);
    -SelectQuery query = create.selectQuery();
    -query.addFrom(AUTHOR);
    -
    -// Join books only under certain circumstances
    -if (join) {
    -    query.addJoin(BOOK, BOOK.AUTHOR_ID.equal(AUTHOR.ID));
    -}
    -
    -Result<?> result = query.fetch();]]></java><html>
    -
    -									<p>
    -										This query is equivalent to the one shown before using the DSL syntax. In fact, internally, the DSL API constructs precisely this QueryObject. Note, that you can always access the SelectQuery object to switch between DSL and non-DSL APIs:
    -									</p>
    -
    -</html><java><![CDATA[Factory create = new Factory(connection, dialect);
    -SelectFinalStep select = create.select().from(AUTHOR);
    -
    -// Add the JOIN clause on the internal QueryObject representation
    -SelectQuery query = select.getQuery();
    -query.addJoin(BOOK, BOOK.AUTHOR_ID.equal(AUTHOR.ID));]]></java><html>
    -
    -									<h3>Mutability</h3>
    -									<p>
    -										Note, that for historic reasons, the DSL API mixes mutable and immutable behaviour with respect to the internal representation of the <reference id="queryparts" title="QueryPart"/> being constructed. While creating <reference id="conditional-expressions" title="conditional expressions"/>, <reference id="column-expressions" title="column expressions"/> (such as functions) assumes immutable behaviour, creating <reference id="sql-statements" title="SQL statements"/> does not. In other words, the following can be said:
    -									</p>
    -									
    -</html><java><![CDATA[// Conditional expressions (immutable)
    -// -----------------------------------
    -Condition a = BOOK.TITLE.equal("1984");
    -Condition b = BOOK.TITLE.equal("Animal Farm");
    -
    -// The following can be said
    -a       != a.or(b); // or() does not modify a
    -a.or(b) != a.or(b); // or() always creates new objects
    -
    -// Statements (mutable)
    -// --------------------
    -SelectFromStep s1 = create.select();
    -SelectJoinStep s2 = s1.from(BOOK);
    -SelectJoinStep s3 = s1.from(AUTHOR);
    -
    -// The following can be said
    -s1 == s2; // The internal object is always the same
    -s2 == s3; // The internal object is always the same]]></java><html>
    -
    -									<p>
    -										Mutability may be removed in a future version of jOOQ.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="select-statement">
    -								<title>The SELECT statement</title>
    -								<content><html>
    -									<p>
    -										When you don't just perform <reference id="crud-with-updatablerecords" title="CRUD"/> (i.e. SELECT * FROM your_table WHERE ID = ?), you're usually generating new record types using custom projections. With jOOQ, this is as intuitive, as if using SQL directly. A more or less complete example of the "standard" SQL syntax, plus some extensions, is provided by a query like this:
    -									</p>
    -</html><code-pair>
    -<sql><![CDATA[-- get all authors' first and last names, and the number
    --- of books they've written in German, if they have written
    --- more than five books in German in the last three years
    --- (from 2011), and sort those authors by last names
    --- limiting results to the second and third row, locking
    --- the rows for a subsequent update... whew!
    -
    -  SELECT AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME, COUNT(*)
    -    FROM AUTHOR
    -    JOIN BOOK ON AUTHOR.ID = BOOK.AUTHOR_ID
    -   WHERE BOOK.LANGUAGE = 'DE'
    -     AND BOOK.PUBLISHED > '2008-01-01'
    -GROUP BY AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME
    -  HAVING COUNT(*) > 5
    -ORDER BY AUTHOR.LAST_NAME ASC NULLS FIRST
    -   LIMIT 2
    -  OFFSET 1
    -     FOR UPDATE]]></sql><java><![CDATA[// And with jOOQ...
    -
    -
    -
    -
    -Factory create = new Factory(connection, dialect);
    -
    -create.select(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME, count())
    -      .from(AUTHOR)
    -      .join(BOOK).on(BOOK.AUTHOR_ID.equal(AUTHOR.ID))
    -      .where(BOOK.LANGUAGE.equal("DE"))
    -      .and(BOOK.PUBLISHED.greaterThan("2008-01-01"))
    -      .groupBy(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -      .having(count().greaterThan(5))
    -      .orderBy(AUTHOR.LAST_NAME.asc().nullsFirst())
    -      .limit(1)
    -      .offset(2)
    -      .forUpdate();]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										Details about the various clauses of this query will be provided in subsequent sections
    -									</p>
    -
    -									<h3>SELECT from single physical tables</h3>
    -									<p>
    -										A very similar, but limited API is available, if you want to select from single physical tables in order to retrieve <reference id="crud-with-updatablerecords" title="TableRecords or even UpdatableRecords"/>. The decision, which type of select to create is already made at the very first step, when you create the SELECT statement with the Factory:
    -									</p>
    -
    -</html><java><![CDATA[public <R extends Record> SimpleSelectWhereStep<R> selectFrom(Table<R> table);]]></java><html>
    -									<p>
    -										As you can see, there is no way to further restrict/project the selected fields. This just selects all known TableFields in the supplied Table, and it also binds &lt;R extends Record&gt; to your Table's associated Record. An example of such a Query would then be:
    -									</p>
    -</html><java><![CDATA[BookRecord book = create.selectFrom(BOOK)
    -                        .where(BOOK.LANGUAGE.equal("DE"))
    -                        .orderBy(BOOK.TITLE)
    -                        .fetchAny();]]></java><html>
    -
    -                   					<p>
    -                   						The simple SELECT API is limited in the way that it does not support any of these clauses:
    -                   					</p>
    -                   					<ul>
    -                   						<li><reference id="select-clause"/></li>
    -                   						<li><reference id="join-clause"/></li>
    -                   						<li><reference id="group-by-clause"/></li>
    -                   						<li><reference id="having-clause"/></li>
    -                   					</ul>
    -                   					<p>
    -                   						In most parts of this manual, it is assumed that you do not use the simple SELECT API. For more information about the simple SELECT API, see the manual's section about <reference id="record-vs-tablerecord" title="fetching strongly or weakly typed records"/>.
    -                   					</p>
    -								</html></content>
    -
    -								<sections>
    -									<section id="select-clause">
    -										<title>The SELECT clause</title>
    -										<content><html>
    -											<p>
    -												The SELECT clause lets you project your own record types, referencing table fields, functions, arithmetic expressions, etc. The Factory provides several methods for expressing a SELECT clause:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[-- The SELECT clause
    -SELECT BOOK.ID, BOOK.TITLE
    -SELECT BOOK.ID, TRIM(BOOK.TITLE)
    -]]></sql><java><![CDATA[// Provide a varargs Fields list to the SELECT clause:
    -Select<?> s1 = create.select(BOOK.ID, BOOK.TITLE);
    -Select<?> s2 = create.select(BOOK.ID, trim(BOOK.TITLE));]]></java>
    -</code-pair><html>
    -
    -											<p>
    -												Some commonly used projections can be easily created using convenience methods:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[-- Simple SELECTs
    -SELECT COUNT(*)
    -SELECT 0 -- Not a bind variable
    -SELECT 1 -- Not a bind variable
    -]]></sql><java><![CDATA[// Select commonly used values
    -Select<?> select1 = create.selectCount();
    -Select<?> select2 = create.selectZero();
    -Select<?> select2 = create.selectOne();]]></java>
    -</code-pair><html>
    -
    -											<p>
    -												See more details about functions and expressions in the manual's section about <reference id="column-expressions"/>
    -											</p>
    -
    -											<h3>The SELECT DISTINCT clause</h3>
    -											<p>
    -												The DISTINCT keyword can be included in the method name, constructing a SELECT clause
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT DISTINCT BOOK.TITLE]]></sql><java><![CDATA[Select<?> select1 = create.selectDistinct(BOOK.TITLE);]]></java>
    -</code-pair><html>
    -										</html></content>
    -									</section>
    -
    -									<section id="from-clause">
    -										<title>The FROM clause</title>
    -										<content><html>
    -											<p>
    -												The SQL FROM clause allows for specifying any number of <reference id="table-expressions" title="table expressions"/> to select data from. The following are examples of how to form normal FROM clauses:
    -											</p>
    -
    -</html><code-pair>
    -	<sql><![CDATA[SELECT 1 FROM BOOK
    -SELECT 1 FROM BOOK, AUTHOR
    -SELECT 1 FROM BOOK "b", AUTHOR "a"]]></sql><java><![CDATA[create.selectOne().from(BOOK);
    -create.selectOne().from(BOOK, AUTHOR);
    -create.selectOne().from(BOOK.as("b"), AUTHOR.as("a"));]]></java>
    -</code-pair><html>
    -
    -											<p>
    -												Read more about aliasing in the manual's section about <reference id="aliased-tables" title="aliased tables"/>.
    -											</p>
    -											
    -											<h3>More advanced table expressions</h3>
    -											<p>
    -												Apart from simple tables, you can pass any arbitrary <reference id="table-expressions" title="table expression"/> to the jOOQ FROM clause. This may include <reference id="array-and-cursor-unnesting" title="unnested cursors"/> in Oracle:
    -											</p>
    -
    -</html><code-pair>
    -	<sql><![CDATA[SELECT *
    -FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(null, null, 'ALLSTATS'));]]></sql><java><![CDATA[create.select()
    -      .from(table(DbmsXplan.displayCursor(null, null, "ALLSTATS"));]]></java>
    -</code-pair><html>
    -
    -											<p>
    -												Note, in order to access the DbmsXplan package, you can use the <reference id="code-generation" title="code generator"/> to generate Oracle's SYS schema.
    -											</p>
    -
    -
    -											<h3>Selecting FROM DUAL with jOOQ</h3>
    -											<p>
    -												In many SQL dialects, FROM is a mandatory clause, in some it isn't. jOOQ allows you to omit the FROM clause, returning just one record. An example:
    -											</p>
    -
    -</html><code-pair>
    -	<sql><![CDATA[SELECT 1 FROM DUAL
    -SELECT 1]]></sql><java><![CDATA[new Factory(SQLDialect.ORACLE).selectOne().getSQL();
    -new Factory(SQLDialect.POSTGRES).selectOne().getSQL();]]></java>
    -</code-pair><html>
    -
    -											<p>
    -												Read more about dual or dummy tables in the manual's section about <reference id="dual" title="the DUAL table"/>. The following are examples of how to form normal FROM clauses:
    -											</p>
    -										</html></content>
    -									</section>
    -
    -									<section id="join-clause">
    -										<title>The JOIN clause</title>
    -										<content><html>
    -											<p>
    -												jOOQ supports many different types of standard SQL JOIN operations:
    -											</p>
    -											<ul>
    -												<li>[ INNER ] JOIN</li>
    -												<li>LEFT [ OUTER ] JOIN</li>
    -												<li>RIGHT [ OUTER ] JOIN</li>
    -												<li>FULL OUTER JOIN</li>
    -												<li>CROSS JOIN</li>
    -												<li>NATURAL JOIN</li>
    -												<li>NATURAL LEFT [ OUTER ] JOIN</li>
    -												<li>NATURAL RIGHT [ OUTER ] JOIN</li>
    -											</ul>
    -
    -											<p>
    -												All of these JOIN methods can be called on <reference class="org.jooq.Table"/> types, or directly after the FROM clause for convenience. The following example joins AUTHOR and BOOK
    -											</p>
    -
    -</html><java><![CDATA[Factory create = new Factory(connection, dialect);
    -
    -// Call "join" directly on the AUTHOR table
    -Result<?> result = create.select()
    -                         .from(AUTHOR.join(BOOK)
    -                                     .on(BOOK.AUTHOR_ID.equal(AUTHOR.ID)))
    -                         .fetch();
    -
    -// Call "join" on the type returned by "from"
    -Result<?> result = create.select()
    -                         .from(AUTHOR)
    -                         .join(BOOK)
    -                         .on(BOOK.AUTHOR_ID.equal(AUTHOR.ID))
    -                         .fetch();]]></java><html>
    -
    -											<p>
    -												The two syntaxes will produce the same SQL statement. However, calling "join" on <reference class="org.jooq.Table"/> objects allows for more powerful, nested JOIN expressions (if you can handle the parentheses):
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT *
    -FROM AUTHOR
    -LEFT OUTER JOIN (
    -  BOOK JOIN BOOK_TO_BOOK_STORE
    -       ON BOOK_TO_BOOK_STORE.BOOK_ID = BOOK.ID
    -)
    -ON BOOK.AUTHOR_ID = AUTHOR.ID]]></sql><java><![CDATA[// Nest joins and provide JOIN conditions only at the end
    -create.select()
    -      .from(AUTHOR
    -      .leftOuterJoin(BOOK
    -        .join(BOOK_TO_BOOK_STORE)
    -        .on(BOOK_TO_BOOK_STORE.BOOK_ID.equal(BOOK.ID)))
    -      .on(BOOK.AUTHOR_ID.equal(AUTHOR.ID)));]]></java></code-pair><html>
    -
    -      										<ul>
    -      											<li>See the section about <reference id="conditional-expressions" title="conditional expressions"/> to learn more about the many ways to create <reference class="org.jooq.Condition"/> objects in jOOQ.</li>
    -      											<li>See the section about <reference id="table-expressions" title="table expressions"/> to learn about the various ways of referencing <reference class="org.jooq.Table"/> objects in jOOQ</li>
    -      										</ul>
    -
    -											<h3>JOIN ON KEY, convenience provided by jOOQ</h3>
    -											<p>
    -												Surprisingly, SQL does not allow to formally JOIN on well-known foreign key relationship information. Naturally, when you join BOOK to AUTHOR, you will want to do that based on the BOOK.AUTHOR_ID foreign key to AUTHOR.ID primary key relation. Not being able to do this in SQL leads to a lot of repetitive code, re-writing the same JOIN predicate again and again - especially, when your foreign keys contain more than one column. With jOOQ, when you use <reference id="code-generation" title="code generation"/>, you can use foreign key constraint information in JOIN expressions as such:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT *
    -FROM AUTHOR
    -JOIN BOOK ON BOOK.AUTHOR_ID = AUTHOR.ID]]></sql><java><![CDATA[create.select()
    -      .from(AUTHOR)
    -      .join(BOOK).onKey();]]></java></code-pair><html>
    -
    -      										<p>
    -      											In case of ambiguity, you can also supply field references for your foreign keys, or the generated foreign key reference to the onKey() method.
    -      										</p>
    -
    -											<h3>The JOIN USING syntax</h3>
    -											<p>
    -												Most often, you will provide jOOQ with JOIN conditions in the JOIN .. ON clause. SQL supports a different means of specifying how two tables are to be joined. This is the JOIN .. USING clause. Instead of a condition, you supply a set of fields whose names are common to both tables to the left and right of a JOIN operation. This can be useful when your database schema has a high degree of <a href="http://en.wikipedia.org/wiki/Database_normalization">relational normalisation</a>. An example:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[-- Assuming that both tables contain AUTHOR_ID columns
    -SELECT *
    -FROM AUTHOR
    -JOIN BOOK USING (AUTHOR_ID)]]></sql><java><![CDATA[// join(...).using(...)
    -create.select()
    -      .from(AUTHOR)
    -      .join(BOOK).using(AUTHOR.AUTHOR_ID);]]></java></code-pair><html>
    -
    -											<p>
    -												In schemas with high degrees of normalisation, you may also choose to use NATURAL JOIN, which takes no JOIN arguments as it joins using all fields that are common to the table expressions to the left and to the right of the JOIN operator. An example:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[-- Assuming that both tables contain AUTHOR_ID columns
    -SELECT *
    -FROM AUTHOR
    -NATURAL JOIN BOOK]]></sql><java><![CDATA[// naturalJoin(...)
    -create.select()
    -      .from(AUTHOR)
    -      .naturalJoin(BOOK);]]></java></code-pair><html>
    -
    -											<h3>Oracle's partitioned OUTER JOIN</h3>
    -											<p>
    -												Oracle SQL ships with a special syntax available for OUTER JOIN clauses. According to the <a href="http://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_10002.htm#i2196190">Oracle documentation about partitioned outer joins</a> this can be used to fill gaps for simplified analytical calculations. jOOQ only supports putting the PARTITION BY clause to the right of the OUTER JOIN clause. The following example will create at least one record per AUTHOR and per existing value in BOOK.PUBLISHED_IN, regardless if an AUTHOR has actually published a book in that year.
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT *
    -FROM AUTHOR
    -LEFT OUTER JOIN BOOK
    -PARTITION BY (PUBLISHED_IN)
    -ON BOOK.AUTHOR_ID = AUTHOR.ID]]></sql><java><![CDATA[create.select()
    -      .from(AUTHOR)
    -      .leftOuterJoin(BOOK)
    -      .partitionBy(BOOK.PUBLISHED_IN)
    -      .on(BOOK.AUTHOR_ID.equal(AUTHOR.ID));]]></java></code-pair><html>
    -
    -										</html></content>
    -									</section>
    -
    -									<section id="where-clause">
    -										<title>The WHERE clause</title>
    -										<content><html>
    -											<p>
    -												The WHERE clause can be used for JOIN or filter predicates, in order to restrict the data returned by the <reference id="table-expressions" title="table expressions"/> supplied to the previously specified <reference id="from-clause" title="from clause"/> and <reference id="join-clause" title="join clause"/>. Here is an example:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT *
    -FROM BOOK
    -WHERE AUTHOR_ID = 1
    -AND TITLE = '1984']]></sql><java><![CDATA[create.select()
    -      .from(BOOK)
    -      .where(BOOK.AUTHOR_ID.equal(1))
    -      .and(BOOK.TITLE.equal("1984"));]]></java></code-pair><html>
    -
    -											<p>
    -												The above syntax is convenience provided by jOOQ, allowing you to connect the <reference class="org.jooq.Condition"/> supplied in the WHERE clause with another condition using an AND operator. You can of course also create a more complex condition and supply that to the WHERE clause directly (observe the different placing of parentheses). The results will be the same:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT *
    -FROM BOOK
    -WHERE AUTHOR_ID = 1
    -AND TITLE = '1984']]></sql><java><![CDATA[create.select()
    -      .from(BOOK)
    -      .where(BOOK.AUTHOR_ID.equal(1).and(
    -             BOOK.TITLE.equal("1984")));]]></java></code-pair><html>
    -
    -											<p>
    -												You will find more information about creating <reference id="conditional-expressions" title="conditional expressions"/> later in the manual.
    -											</p>
    -										</html></content>
    -									</section>
    -
    -									<section id="connect-by-clause">
    -										<title>The CONNECT BY clause</title>
    -										<content><html>
    -											<p>
    -												The Oracle database knows a very succinct syntax for creating hierarchical queries: the CONNECT BY clause, which is fully supported by jOOQ, including all related functions and pseudo-columns. A more or less formal definition of this clause is given here:
    -											</p>
    -</html><sql>--   SELECT ..
    ---     FROM ..
    ---    WHERE ..
    - CONNECT BY [ NOCYCLE ] condition [ AND condition, ... ] [ START WITH condition ]
    --- GROUP BY ..
    --- ORDER [ SIBLINGS ] BY ..</sql><html>
    -
    -											<p>
    -												An example for an iterative query, iterating through values between 1 and 5 is this:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT LEVEL
    -FROM DUAL
    -CONNECT BY LEVEL <= 5]]></sql><java><![CDATA[// Get a table with elements 1, 2, 3, 4, 5
    -create.select(level())
    -      .connectBy(level().lessOrEqual(5));]]></java></code-pair><html>
    -
    -											<p>
    -												Here's a more complex example where you can recursively fetch directories in your database, and concatenate them to a path:
    -											</p>
    -</html><code-pair>
    -<sql><![CDATA[SELECT 
    -  SUBSTR(SYS_CONNECT_BY_PATH(DIRECTORY.NAME, '/'), 2)
    -FROM DIRECTORY
    -CONNECT BY 
    -  PRIOR DIRECTORY.ID = DIRECTORY.PARENT_ID
    -START WITH DIRECTORY.PARENT_ID IS NULL
    -ORDER BY 1]]></sql><java><![CDATA[.select(
    -   sysConnectByPath(DIRECTORY.NAME, "/").substring(2))
    -.from(DIRECTORY)
    -.connectBy(
    -   prior(DIRECTORY.ID).equal(DIRECTORY.PARENT_ID))
    -.startWith(DIRECTORY.PARENT_ID.isNull())
    -.orderBy(1);]]></java>
    -</code-pair><html>
    -
    -    										<p>
    -    											The output might then look like this
    -   											</p>
    -
    -</html><text>+------------------------------------------------+
    -|substring                                       |
    -+------------------------------------------------+
    -|C:                                              |
    -|C:/eclipse                                      |
    -|C:/eclipse/configuration                        |
    -|C:/eclipse/dropins                              |
    -|C:/eclipse/eclipse.exe                          |
    -+------------------------------------------------+
    -|...21 record(s) truncated...
    -</text><html>
    -
    -											<p>
    -												Some of the supported functions and pseudo-columns are these (available from the <reference id="factory" title="Factory"/>):
    -											</p>
    -
    -											<ul>
    -												<li>LEVEL</li>
    -												<li>CONNECT_BY_IS_CYCLE</li>
    -												<li>CONNECT_BY_IS_LEAF</li>
    -												<li>CONNECT_BY_ROOT</li>
    -												<li>SYS_CONNECT_BY_PATH</li>
    -												<li>PRIOR</li>
    -											</ul>
    -
    -											<p>
    -												Note that this syntax is also supported in the CUBRID database.
    -											</p>
    -											
    -											<h3>ORDER SIBLINGS</h3>
    -											<p>
    -												The Oracle database allows for specifying a SIBLINGS keyword in the <reference id="order-by-clause" title="ORDER BY clause"/>. Instead of ordering the overall result, this will only order siblings among each other, keeping the hierarchy intact. An example is given here:
    -											</p>
    -											
    -</html><code-pair>
    -<sql><![CDATA[SELECT DIRECTORY.NAME
    -FROM DIRECTORY
    -CONNECT BY 
    -  PRIOR DIRECTORY.ID = DIRECTORY.PARENT_ID
    -START WITH DIRECTORY.PARENT_ID IS NULL
    -ORDER SIBLINGS BY 1]]></sql><java><![CDATA[.select(DIRECTORY.NAME)
    -.from(DIRECTORY)
    -.connectBy(
    -   prior(DIRECTORY.ID).equal(DIRECTORY.PARENT_ID))
    -.startWith(DIRECTORY.PARENT_ID.isNull())
    -.orderSiblingsBy(1);]]></java>
    -</code-pair><html>
    -											
    -										</html></content>
    -									</section>
    -
    -									<section id="group-by-clause">
    -										<title>The GROUP BY clause</title>
    -										<content><html>
    -											<p>
    -												GROUP BY can be used to create unique groups of data, to form aggregations, to remove duplicates and for other reasons. It will transform your previously defined <reference id="table-expressions" title="set of table expressions"/>, and return only one record per unique group as specified in this clause. For instance, you can group books by BOOK.AUTHOR_ID:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT AUTHOR_ID, COUNT(*)
    -FROM BOOK
    -GROUP BY AUTHOR_ID]]></sql><java><![CDATA[create.select(BOOK.AUTHOR_ID, count())
    -      .from(BOOK)
    -      .groupBy(AUTHOR_ID);]]></java></code-pair><html>
    -
    -											<p>
    -												As defined in the SQL standard, when grouping, you may no longer project any columns that are not a formal part of the GROUP BY clause, or <reference id="aggregate-functions" title="aggregate functions"/>. The above example counts all books per author
    -											</p>
    -
    -											<h3>MySQL's deviation from the SQL standard</h3>
    -											<p>
    -												MySQL has a peculiar way of not adhering to this standard behaviour. This is documented in the <a href="http://dev.mysql.com/doc/refman/5.6/en/group-by-hidden-columns.html">MySQL manual</a>. In short, with MySQL, you can also project any other field that are not part of the GROUP BY clause. The projected values will just be arbitrary values from within the group. You cannot rely on any ordering. For example:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT AUTHOR_ID, TITLE
    -FROM BOOK
    -GROUP BY AUTHOR_ID]]></sql><java><![CDATA[create.select(BOOK.AUTHOR_ID, BOOK.TITLE)
    -      .from(BOOK)
    -      .groupBy(AUTHOR_ID);]]></java></code-pair><html>
    -
    -											<p>
    -												This will return an arbitrary title per author. jOOQ supports this syntax, as jOOQ is not doing any checks internally, about the consistence of tables/fields/functions that you provide it.
    -											</p>
    -
    -											<h3>Empty GROUP BY clauses</h3>
    -											<p>
    -												jOOQ supports empty <code>GROUP BY ()</code> clauses as well. This will result in <reference id="select-statement" title="SELECT statements"/> that return only one record.
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT COUNT(*)
    -FROM BOOK
    -GROUP BY ()]]></sql><java><![CDATA[create.selectCount()
    -      .from(BOOK)
    -      .groupBy();]]></java></code-pair><html>
    -
    -											
    -											<h3>ROLLUP(), CUBE() and GROUPING SETS()</h3>
    -											<p>
    -												Some databases support the SQL standard grouping functions and some extensions thereof. See the manual's section about <reference id="grouping-functions" title="grouping functions"/> for more details.
    -											</p>
    -										</html></content>
    -									</section>
    -
    -									<section id="having-clause">
    -										<title>The HAVING clause</title>
    -										<content><html>
    -											<p>
    -												The HAVING clause is commonly used to further restrict data resulting from a previously issued <reference id="group-by-clause" title="GROUP BY clause"/>. An example, selecting only those authors that have written at least two books:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT AUTHOR_ID, COUNT(*)
    -FROM BOOK
    -GROUP BY AUTHOR_ID
    -HAVING COUNT(*) >= 2]]></sql><java><![CDATA[create.select(BOOK.AUTHOR_ID, count(*))
    -      .from(BOOK)
    -      .groupBy(AUTHOR_ID)
    -      .having(count().greaterOrEqual(2));]]></java></code-pair><html>
    -
    -											<p>
    -												According to the SQL standard, you may omit the GROUP BY clause and still issue a HAVING clause. This will implicitly GROUP BY (). jOOQ also supports this syntax. The following example selects one record, only if there are at least 4 books in the books table:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT COUNT(*)
    -FROM BOOK
    -HAVING COUNT(*) >= 4]]></sql><java><![CDATA[create.select(count(*))
    -      .from(BOOK)
    -      .having(count().greaterOrEqual(4));]]></java></code-pair><html>
    -
    -										</html></content>
    -									</section>
    -
    -									<section id="order-by-clause">
    -										<title>The ORDER BY clause</title>
    -										<content><html>
    -											<p>
    -												Databases are allowed to return data in any arbitrary order, unless you explicitly declare that order in the ORDER BY clause. In jOOQ, this is straight-forward:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT AUTHOR_ID, TITLE
    -FROM BOOK
    -ORDER BY AUTHOR_ID ASC, TITLE DESC]]></sql><java><![CDATA[create.select(BOOK.AUTHOR_ID, BOOK.TITLE)
    -      .from(BOOK)
    -      .orderBy(BOOK.AUTHOR_ID.asc(), BOOK.TITLE.desc());]]></java></code-pair><html>
    -
    -											<p>
    -												Any jOOQ <reference id="column-expressions" title="column expression (or field)"/> can be transformed into an <reference class="org.jooq.SortField"/> by calling the asc() and desc() methods.
    -											</p>
    -
    -											<h3>Ordering by field index</h3>
    -											<p>
    -												The SQL standard allows for specifying integer literals (<reference id="inlined-parameters" title="literals"/>, not <reference id="bind-values" title="bind values"/>!) to reference column indexes from the projection (<reference id="select-clause" title="SELECT clause"/>). This may be useful if you do not want to repeat a lengthy expression, by which you want to order - although most databases also allow for referencing <reference id="aliased-columns" title="aliased column references"/> in the ORDER BY clause. An example of this is given here:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT AUTHOR_ID, TITLE
    -FROM BOOK
    -ORDER BY 1 ASC, 2 DESC]]></sql><java><![CDATA[create.select(BOOK.AUTHOR_ID, BOOK.TITLE)
    -      .from(BOOK)
    -      .orderBy(one().asc(), inline(2).desc());]]></java></code-pair><html>
    -
    -											<p>
    -												Note, how one() is used as a convenience short-cut for inline(1)
    -											</p>
    -
    -											<h3>Ordering and NULLS</h3>
    -											<p>
    -												A few databases support the SQL standard "null ordering" clause in sort specification lists, to define whether NULL values should come first or last in an ordered result.
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT 
    -  BOOK.AUTHOR_ID, 
    -  BOOK.CO_AUTHOR_ID, 
    -  BOOK.TITLE
    -FROM BOOK
    -ORDER BY AUTHOR_ID ASC,
    -         CO_AUTHOR_ID ASC NULLS LAST]]></sql><java><![CDATA[create.select(
    -         BOOK.AUTHOR_ID, 
    -         BOOK.CO_AUTHOR_ID, 
    -         BOOK.TITLE)
    -      .from(BOOK)
    -      .orderBy(BOOK.AUTHOR_ID.asc(),
    -               BOOK.CO_AUTHOR_ID.asc().nullsLast());]]></java></code-pair><html>
    -
    -											<p>
    -												If your database doesn't support this syntax, jOOQ simulates it using a <reference id="case-expressions" title="CASE expression"/> as follows
    -											</p>
    -</html><code-pair>
    -<sql><![CDATA[SELECT 
    -  BOOK.AUTHOR_ID, BOOK.CO_AUTHOR_ID, BOOK.TITLE
    -FROM BOOK
    -ORDER BY AUTHOR_ID ASC,
    -         CASE WHEN CO_AUTHOR_ID IS NULL 
    -              THEN 1 ELSE 0 END ASC,
    -         CO_AUTHOR_ID ASC]]></sql><java><![CDATA[create.select(
    -         BOOK.AUTHOR_ID, 
    -         BOOK.CO_AUTHOR_ID,
    -         BOOK.TITLE)
    -      .from(BOOK)
    -      .orderBy(BOOK.AUTHOR_ID.asc(),
    -               BOOK.CO_AUTHOR_ID.asc().nullsLast());]]></java></code-pair><html>
    -
    -											<h3>Ordering using CASE expressions</h3>
    -											<p>
    -												Using <reference id="case-expressions" title="CASE expressions"/> in SQL ORDER BY clauses is a common pattern, if you want to introduce some sort indirection / sort mapping into your queries. As with SQL, you can add any type of <reference id="column-expressions" title="column expression"/> into your ORDER BY clause. For instance, if you have two favourite books that you always want to appear on top, you could write:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT *
    -FROM BOOK
    -ORDER BY CASE TITLE
    -         WHEN '1984' THEN 0
    -         WHEN 'Animal Farm' THEN 1
    -         ELSE 2 END ASC]]></sql><java><![CDATA[create.select()
    -      .from(BOOK)
    -      .orderBy(decode().value(BOOK.TITLE)
    -                       .when("1984", 0)
    -                       .when("Animal Farm", 1)
    -                       .otherwise(2).asc());]]></java></code-pair><html>
    -
    -											<p>
    -												But writing these things can become quite verbose. jOOQ supports a convenient syntax for specifying sort mappings. The same query can be written in jOOQ as such:
    -											</p>
    -
    -</html><java><![CDATA[create.select()
    -      .from(BOOK)
    -      .orderBy(BOOK.TITLE.sortAsc("1984", "Animal Farm"));]]></java><html>
    -
    -											<p>
    -												More complex sort indirections can be provided using a Map:
    -											</p>
    -
    -</html><java><![CDATA[create.select()
    -      .from(BOOK)
    -      .orderBy(BOOK.TITLE.sort(new HashMap<String, Integer>() {{
    -          put("1984", 1);
    -          put("Animal Farm", 13);
    -          put("The jOOQ book", 10);
    -      }}));]]></java><html>
    -
    -      										<p>
    -      											Of course, you can combine this feature with the previously discussed NULLS FIRST / NULLS LAST feature. So, if in fact these two books are the ones you like least, you can put all NULLS FIRST (all the other books):
    -      										</p>
    -
    -</html><java><![CDATA[create.select()
    -      .from(BOOK)
    -      .orderBy(BOOK.TITLE.sortAsc("1984", "Animal Farm").nullsFirst());]]></java><html>
    -
    -											<h3>jOOQ's understanding of SELECT .. ORDER BY</h3>
    -											<p>
    -												The SQL standard defines that a "query expression" can be ordered, and that query expressions can contain <reference id="union-clause" title="UNION, INTERSECT and EXCEPT clauses"/>, whose subqueries cannot be ordered. While this is defined as such in the SQL standard, many databases allowing for the non-standard <reference id="limit-clause" title="LIMIT clause"/> in one way or another, do not adhere to this part of the SQL standard. Hence, jOOQ allows for ordering all SELECT statements, regardless whether they are constructed as a part of a UNION or not. Corner-cases are handled internally by jOOQ, by introducing synthetic subselects to adhere to the correct syntax, where this is needed.
    -											</p>
    -											
    -											
    -											<h3>Oracle's ORDER SIBLINGS BY clause</h3>
    -											<p>
    -												jOOQ also supports Oracle's SIBLINGS keyword to be used with ORDER BY clauses for <reference id="connect-by-clause" title="hierarchical queries using CONNECT BY"/>
    -											</p>
    -										</html></content>
    -									</section>
    -
    -									<section id="limit-clause">
    -										<title>The LIMIT .. OFFSET clause</title>
    -										<content><html>
    -											<p>
    -												While being extremely useful for every application that does paging, or just to limit result sets to reasonable sizes, this clause is not yet part of any SQL standard (up until SQL:2008). Hence, there exist a variety of possible implementations in various SQL dialects, concerning this limit clause. jOOQ chose to implement the LIMIT .. OFFSET clause as understood and supported by MySQL, H2, HSQLDB, Postgres, and SQLite. Here is an example of how to apply limits with jOOQ:
    -											</p>
    -
    -</html><java><![CDATA[create.select().from(BOOK).limit(1).offset(2);]]></java><html>
    -
    -											<p>
    -												This will limit the result to 1 books starting with the 2nd book (starting at offset 0!). limit() is supported in all dialects, offset() in all but Sybase ASE, which has no reasonable means to simulate it. This is how jOOQ simulates the above query in various SQL dialects:
    -											</p>
    -
    -</html><sql><![CDATA[-- MySQL, H2, HSQLDB, Postgres, and SQLite
    -SELECT * FROM BOOK LIMIT 1 OFFSET 2
    -
    --- CUBRID supports a MySQL variant of the LIMIT .. OFFSET clause
    -SELECT * FROM BOOK LIMIT 2, 1
    -
    --- Derby
    -SELECT * FROM BOOK OFFSET 2 ROWS FETCH NEXT 1 ROWS ONLY
    -
    --- Ingres
    -SELECT * FROM BOOK OFFSET 2 FETCH FIRST 1 ROWS ONLY
    -
    --- Firebird
    -SELECT * FROM BOOK ROWS 2 TO 3
    -
    --- Sybase SQL Anywhere
    -SELECT TOP 1 ROWS START AT 3 * FROM BOOK
    -
    --- DB2 (without OFFSET)
    -SELECT * FROM BOOK FETCH FIRST 1 ROWS ONLY
    -
    --- Sybase ASE, SQL Server (without OFFSET)
    -SELECT TOP 1 * FROM BOOK
    -
    --- DB2 (with OFFSET), SQL Server (with OFFSET), Oracle (actual query may vary)
    -SELECT * FROM (
    -  SELECT LIMIT_98843777.*, ROW_NUMBER() OVER (ORDER BY ID ASC) AS ROWNUM_98843777
    -  FROM (
    -    SELECT TOP 100 PERCENT *
    -    FROM BOOK
    -    ORDER BY ID ASC
    -  ) AS LIMIT_98843777
    -) AS OUTER_LIMIT_98843777
    -WHERE ROWNUM_98843777 > 1
    -AND ROWNUM_98843777 <= 3
    -]]></sql><html>
    -
    -											<p>
    -												As you can see, jOOQ will take care of the incredibly painful ROW_NUMBER() OVER() (or ROWNUM for Oracle) filtering in subselects for you, you'll just have to write limit(1).offset(2) in any dialect.
    -											</p>
    -
    -											<h3>SQL Server's ORDER BY, TOP and subqueries</h3>
    -											<p>
    -												As can be seen in the above example, writing correct SQL can be quite tricky, depending on the SQL dialect. For instance, with SQL Server, you cannot have an ORDER BY clause in a subquery, unless you also have a TOP clause. This is illustrated by the fact that jOOQ renders a TOP 100 PERCENT clause for you. The same applies to the fact that ROW_NUMBER() OVER() needs an ORDER BY windowing clause, even if you don't provide one to the jOOQ query. By default, jOOQ adds ordering by the first column of your projection.
    -											</p>
    -										</html></content>
    -									</section>
    -
    -									<section id="for-update-clause">
    -										<title>The FOR UPDATE clause</title>
    -										<content><html>
    -											<p>
    -												For inter-process synchronisation and other reasons, you may choose to use the SELECT .. FOR UPDATE clause to indicate to the database, that a set of cells or records should be locked by a given transaction for subsequent updates. With jOOQ, this can be achieved as such:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT *
    -FROM BOOK
    -WHERE ID = 3
    -FOR UPDATE]]></sql><java><![CDATA[create.select()
    -      .from(BOOK)
    -      .where(BOOK.ID.equal(3))
    -      .forUpdate();]]></java></code-pair><html>
    -
    -											<p>
    -												The above example will produce a record-lock, locking the whole record for updates. Some databases also support cell-locks using FOR UPDATE OF ..
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT *
    -FROM BOOK
    -WHERE ID = 3
    -FOR UPDATE OF TITLE]]></sql><java><![CDATA[create.select()
    -      .from(BOOK)
    -      .where(BOOK.ID.equal(3))
    -      .forUpdate().of(BOOK.TITLE);]]></java></code-pair><html>
    -
    -											<p>
    -												Oracle goes a bit further and also allows to specify the actual locking behaviour. It features these additional clauses, which are all supported by jOOQ:
    -											</p>
    -											<ul>
    -												<li>FOR UPDATE NOWAIT: This is the default behaviour. If the lock cannot be acquired, the query fails immediately</li>
    -												<li>FOR UPDATE WAIT n: Try to wait for [n] seconds for the lock acquisition. The query will fail only afterwards</li>
    -												<li>FOR UPDATE SKIP LOCKED: This peculiar syntax will skip all locked records. This is particularly useful when implementing queue tables with multiple consumers</li>
    -											</ul>
    -											<p>
    -												With jOOQ, you can use those Oracle extensions as such:
    -											</p>
    -
    -</html><java><![CDATA[create.select().from(BOOK).where(BOOK.ID.equal(3)).forUpdate().nowait();
    -create.select().from(BOOK).where(BOOK.ID.equal(3)).forUpdate().wait(5);
    -create.select().from(BOOK).where(BOOK.ID.equal(3)).forUpdate().skipLocked();]]></java><html>
    -
    -											<h3>FOR UPDATE in CUBRID and SQL Server</h3>
    -											<p>
    -												The SQL standard specifies a FOR UPDATE clause to be applicable for cursors. Most databases interpret this as being applicable for all SELECT statements. An exception to this rule are the CUBRID and SQL Server databases, that do not allow for any FOR UPDATE clause in a regular SQL SELECT statement. jOOQ simulates the FOR UPDATE behaviour, by locking record by record with JDBC. JDBC allows for specifying the flags TYPE_SCROLL_SENSITIVE, CONCUR_UPDATABLE for any statement, and then using ResultSet.updateXXX() methods to produce a cell-lock / row-lock. Here's a simplified example in JDBC:
    -											</p>
    -</html><java><![CDATA[PreparedStatement stmt = connection.prepareStatement(
    -  "SELECT * FROM author WHERE id IN (3, 4, 5)",
    -  ResultSet.TYPE_SCROLL_SENSITIVE,
    -  ResultSet.CONCUR_UPDATABLE);
    -ResultSet rs = stmt.executeQuery();
    -
    -while (rs.next()) {
    -  // UPDATE the primary key for row-locks, or any other columns for cell-locks
    -  rs.updateObject(1, rs.getObject(1));
    -  rs.updateRow();
    -
    -  // Do more stuff with this record
    -}]]></java><html>
    -
    -											<p>
    -												The main drawback of this approach is the fact that the database has to maintain a scrollable cursor, whose records are locked one by one. This can cause a major risk of deadlocks or race conditions if the JDBC driver can recover from the unsuccessful locking, if two Java threads execute the following statements:
    -											</p>
    -
    -</html><sql><![CDATA[-- thread 1
    -SELECT * FROM author ORDER BY id ASC;
    -
    --- thread 2
    -SELECT * FROM author ORDER BY id DESC;]]></sql><html>
    -
    -											<p>
    -												So use this technique with care, possibly only ever locking single rows!
    -											</p>
    -
    -											<h3>Pessimistic (shared) locking with the FOR SHARE clause</h3>
    -											<p>
    -												Some databases (MySQL, Postgres) also allow to issue a non-exclusive lock explicitly using a FOR SHARE clause. This is also supported by jOOQ
    -											</p>
    -
    -											<h3>Optimistic locking in jOOQ</h3>
    -											<p>
    -												Note, that jOOQ also supports optimistic locking, if you're doing simple CRUD. This is documented in the section's manual about <reference id="optimistic-locking" title="optimistic locking"/>.
    -											</p>
    -										</html></content>
    -									</section>
    -
    -									<section id="union-clause">
    -										<title>UNION, INTERSECTION and EXCEPT</title>
    -										<content><html>
    -											<p>
    -												SQL allows to perform set operations as understood in standard set theory on result sets. These operations include unions, intersections, subtractions. For two subselects to be combinable by such a set operator, each subselect must return a <reference id="table-expressions" title="table expression"/> of the same arity and type.
    -											</p>
    -											
    -											<h3>UNION and UNION ALL</h3>
    -											<p>
    -												These operators combine two results into one. While UNION removes all duplicate records resulting from this combination, UNION ALL leaves subselect results as they are. Typically, you should prefer UNION ALL over UNION, if you don't really need to remove duplicates. The following example shows how to use such a UNION operation in jOOQ.
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT * FROM BOOK WHERE ID = 3
    -UNION ALL
    -SELECT * FROM BOOK WHERE ID = 5]]></sql><java><![CDATA[create.selectFrom(BOOK).where(BOOK.ID.equal(3))
    -      .unionAll(
    -create.selectFrom(BOOK).where(BOOK.ID.equal(5)));]]></java></code-pair><html>
    -											
    -											<h3>INTERSECT [ ALL ] and EXCEPT [ ALL ]</h3>
    -											<p>
    -												INTERSECT is the operation that produces only those s that are returned by both subselects. EXCEPT is the operation that returns only those s that are returned exclusively in the first subselect. Both operators will remove duplicates from their results. The SQL standard allows to specify the ALL keyword for both of these operators as well, but this is hardly supported in any database. jOOQ does not support INTERSECT ALL, EXEPT ALL operations either. 
    -											</p>
    -											
    -											<h3>jOOQ's set operators and how they're different from standard SQL</h3>
    -											<p>
    -												As previously mentioned in the manual's section about the <reference id="order-by-clause" title="ORDER BY clause"/>, jOOQ has slightly changed the semantics of these set operators. While in SQL, a subselect may not contain any <reference id="order-by-clause" title="ORDER BY clause"/> or <reference id="limit-clause" title="LIMIT clause"/> (unless you wrap the subselect into a <reference id="nested-selects" title="nested SELECT"/>), jOOQ allows you to do so. In order to select both the youngest and the oldest author from the database, you can issue the following statement with jOOQ (rendered to the MySQL dialect):
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[  (SELECT * FROM AUTHOR 
    -   ORDER BY DATE_OF_BIRTH ASC LIMIT 1)
    -UNION
    -  (SELECT * FROM AUTHOR 
    -   ORDER BY DATE_OF_BIRTH DESC LIMIT 1)]]></sql><java><![CDATA[create.selectFrom(AUTHOR)
    -      .orderBy(AUTHOR.DATE_OF_BIRTH.asc()).limit(1)
    -      .union(
    -create.selectFrom(AUTHOR)
    -      .orderBy(AUTHOR.DATE_OF_BIRTH.desc()).limit(1));]]></java></code-pair><html>
    -		
    -										</html></content>
    -									</section>
    -
    -									<section id="oracle-hints">
    -										<title>Oracle-style hints</title>
    -										<content><html>
    -											<p>
    -												If you are closely coupling your application to an Oracle (or CUBRID) database,	you might need to be able to pass hints of the form /*+HINT*/ with your SQL statements to the Oracle database. For example:
    -											</p>
    -
    -</html><sql>SELECT /*+ALL_ROWS*/ FIRST_NAME, LAST_NAME
    -  FROM AUTHOR</sql><html>
    -
    -				  							<p>
    -				  								This can be done in jOOQ using the .hint() clause in your SELECT statement:
    -			  								</p>
    -
    -</html><java>create.select(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -      .hint("/*+ALL_ROWS*/")
    -      .from(AUTHOR);</java><html>
    -
    -											<p>
    -												Note that you can pass any string in the .hint() clause. If you use that clause, the passed string will always be put in between the SELECT [DISTINCT] keywords and the actual projection list
    -											</p>
    -										</html></content>
    -									</section>
    -								</sections>
    -							</section>
    -
    -							<section id="insert-statement">
    -								<title>The INSERT statement</title>
    -								<content><html>
    -									<p>
    -										The INSERT statement is used to insert new records into a database table. Records can either be supplied using a VALUES() constructor, or a SELECT statement. jOOQ supports both types of INSERT statements. An example of an INSERT statement using a VALUES() constructor is given here:
    -									</p>
    -
    -
    -</html><code-pair>
    -<sql>INSERT INTO AUTHOR 
    -       (ID, FIRST_NAME, LAST_NAME)
    -VALUES (100, 'Hermann', 'Hesse');</sql><java>create.insertInto(AUTHOR,
    -        AUTHOR.ID, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -      .values(100, "Hermann", "Hesse");</java></code-pair><html>
    -
    -									<h3>INSERT multiple rows with the VALUES() constructor</h3>
    -									<p>
    -										The SQL standard specifies that multiple rows can be supplied to the VALUES() constructor in an INSERT statement. Here's an example of a multi-record INSERT
    -									</p>
    -</html><code-pair>
    -<sql>INSERT INTO AUTHOR
    -       (ID, FIRST_NAME, LAST_NAME)
    -VALUES (100, 'Hermann', 'Hesse'),
    -       (101, 'Alfred', 'Döblin');</sql><java>create.insertInto(AUTHOR,
    -        AUTHOR.ID, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -      .values(100, "Hermann", "Hesse")
    -      .values(101, "Alfred", "Döblin");</java></code-pair><html>
    -
    -									<p>
    -										jOOQ tries to stay close to actual SQL. In detail, however, Java's expressiveness is limited. That's why the values() clause is repeated for every record in multi-record inserts. 
    -									</p>
    -									<p> 
    -										Some RDBMS do not support inserting several records in a single statement. In those cases, jOOQ simulates multi-record INSERTs using the following SQL:
    -									</p>
    -
    -</html><code-pair>
    -<sql>INSERT INTO AUTHOR
    -    (ID, FIRST_NAME, LAST_NAME)
    -SELECT 100, 'Hermann', 'Hesse' FROM DUAL UNION ALL
    -SELECT 101, 'Alfred', 'Döblin' FROM DUAL;</sql><java>create.insertInto(AUTHOR,
    -        AUTHOR.ID, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -      .values(100, "Hermann", "Hesse")
    -      .values(101, "Alfred", "Döblin");
    -</java></code-pair><html>
    -
    -									<h3>INSERT using jOOQ's alternative syntax</h3>
    -									<p>
    -										MySQL (and some other RDBMS) allow for using a non-SQL-standard, UPDATE-like syntax for INSERT statements. This is also supported in jOOQ, should you prefer that syntax. The above INSERT statement can also be expressed as follows:
    -									</p>
    -
    -</html><java>create.insertInto(AUTHOR)
    -      .set(AUTHOR.ID, 100)
    -      .set(AUTHOR.FIRST_NAME, "Hermann")
    -      .set(AUTHOR.LAST_NAME, "Hesse")
    -      .newRecord()
    -      .set(AUTHOR.ID, 101)
    -      .set(AUTHOR.FIRST_NAME, "Alfred")
    -      .set(AUTHOR.LAST_NAME, "Döblin");</java><html>
    -      
    -									<p>
    -										As you can see, this syntax is a bit more verbose, but also more type-safe, as every field can be matched with its value. Internally, the two syntaxes are strictly equivalent.
    -									</p>
    -
    -									<h3>MySQL's INSERT .. ON DUPLICATE KEY UPDATE</h3>
    -									<p>
    -										The MySQL database supports a very convenient way to INSERT or UPDATE a record. This is a non-standard extension to the SQL syntax, which is supported by jOOQ and simulated in other RDBMS, where this is possible (i.e. if they support the SQL standard <reference id="merge-statement" title="MERGE statement"/>). Here is an example how to use the ON DUPLICATE KEY UPDATE clause:
    -									</p>
    -									
    -</html><java>// Add a new author called "Koontz" with ID 3.
    -// If that ID is already present, update the author's name
    -create.insertInto(AUTHOR, AUTHOR.ID, AUTHOR.LAST_NAME)
    -      .values(3, "Koontz")
    -      .onDuplicateKeyUpdate()
    -      .set(AUTHOR.LAST_NAME, "Koontz");</java><html>
    -
    -									<h3>The synthetic ON DUPLICATE KEY IGNORE clause</h3>
    -							
    -									<p>
    -										The MySQL database also supports an INSERT IGNORE INTO clause. This is supported by jOOQ using the more convenient SQL syntax variant of ON DUPLICATE KEY IGNORE, which can be equally simulated in other databases using a <reference id="merge-statement" title="MERGE statement"/>:
    -									</p>
    -									
    -</html><java>// Add a new author called "Koontz" with ID 3.
    -// If that ID is already present, ignore the INSERT statement
    -create.insertInto(AUTHOR, AUTHOR.ID, AUTHOR.LAST_NAME)
    -      .values(3, "Koontz")
    -      .onDuplicateKeyIgnore();</java><html>
    -
    -      								<h3>Postgres's INSERT .. RETURNING</h3>
    -									<p>
    -										The Postgres database has native support for an INSERT .. RETURNING clause. This is a very powerful concept that is simulated for all other dialects using JDBC's <reference class="java.sql.Statement" anchor="#getGeneratedKeys()" title="getGeneratedKeys()"/> method. Take this example:
    -									</p>
    -
    -</html><java><![CDATA[// Add another author, with a generated ID
    -Record<?> record =
    -create.insertInto(AUTHOR, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -      .values("Charlotte", "Roche")
    -      .returning(AUTHOR.ID)
    -      .fetchOne();
    -
    -System.out.println(record.getValue(AUTHOR.ID));
    -
    -// For some RDBMS, this also works when inserting several values
    -// The following should return a 2x2 table
    -Result<?> result =
    -create.insertInto(AUTHOR, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -      .values("Johann Wolfgang", "von Goethe")
    -      .values("Friedrich", "Schiller")
    -      // You can request any field. Also trigger-generated values
    -      .returning(AUTHOR.ID, AUTHOR.CREATION_DATE)
    -      .fetch();]]></java><html>
    -
    -		      						<p>
    -		      							Some databases have poor support for returning generated keys after INSERTs. In those cases, jOOQ might need to issue another <reference id="select-statement" title="SELECT statement"/> in order to fetch an @@identity value. Be aware, that this can lead to race-conditions in those databases that cannot properly return generated ID values. For more information, please consider the jOOQ Javadoc for the returning() clause.
    -		      						</p>
    -
    -									<h3>The INSERT SELECT statement</h3>
    -							
    -									<p>
    -										In some occasions, you may prefer the INSERT SELECT syntax, for instance, when you copy records from one table to another:
    -									</p>
    -									
    -</html><java>create.insertInto(AUTHOR_ARCHIVE)
    -      .select(create.selectFrom(AUTHOR).where(AUTHOR.DECEASED.isTrue()));</java></content>
    -							</section>
    -
    -							<section id="update-statement">
    -								<title>The UPDATE statement</title>
    -								<content><html>
    -									<p>
    -										The UPDATE statement is used to modify one or several pre-existing records in a database table. UPDATE statements are only possible on single tables. Support for multi-table updates will be implemented in the near future. An example update query is given here:
    -									</p>
    -
    -</html><code-pair>
    -<sql>UPDATE AUTHOR
    -   SET FIRST_NAME = 'Hermann',
    -       LAST_NAME = 'Hesse'
    - WHERE ID = 3;</sql><java>create.update(AUTHOR)
    -      .set(AUTHOR.FIRST_NAME, "Hermann")
    -      .set(AUTHOR.LAST_NAME, "Hesse")
    -      .where(AUTHOR.ID.equal(3));</java>
    -</code-pair><html>
    -								
    -								</html></content>
    -							</section>
    -
    -							<section id="delete-statement">
    -								<title>The DELETE statement</title>
    -								<content><html>
    -									<p>
    -										The DELETE statement physically removes records from a database table. DELETE statements are only possible on single tables. Support for multi-table deletes will be implemented in the near future. An example delete query is given here:
    -									</p>
    -
    -</html><code-pair>
    -<sql>DELETE AUTHOR
    - WHERE ID = 100;</sql><java>create.delete(AUTHOR)
    -      .where(AUTHOR.ID.equal(100));</java>
    -</code-pair><html>
    -
    -								</html></content>
    -							</section>
    -
    -							<section id="merge-statement">
    -								<title>The MERGE statement</title>
    -								<content><html>
    -									<p>
    -										The MERGE statement is one of the most advanced standardised SQL constructs, which is supported by DB2, HSQLDB, Oracle, SQL Server and Sybase (MySQL has the similar INSERT .. ON DUPLICATE KEY UPDATE construct)
    -									</p>
    -									<p>
    -										The point of the standard MERGE statement is to take a TARGET table, and merge (INSERT, UPDATE) data from a SOURCE table into it. DB2, Oracle, SQL Server and Sybase also allow for DELETING some data and for adding many additional clauses. With jOOQ {jooq-version}, only Oracle's MERGE extensions are supported. Here is an example:
    -									</p>
    -
    -</html><code-pair>
    -<sql>-- Check if there is already an author called 'Hitchcock'
    --- If there is, rename him to John. If there isn't add him.
    -MERGE INTO AUTHOR
    -USING (SELECT 1 FROM DUAL)
    -ON (LAST_NAME = 'Hitchcock')
    -WHEN MATCHED THEN UPDATE SET FIRST_NAME = 'John'
    -WHEN NOT MATCHED THEN INSERT (LAST_NAME) VALUES ('Hitchcock')</sql><java>create.mergeInto(AUTHOR)
    -      .using(create().selectOne())
    -      .on(AUTHOR.LAST_NAME.equal("Hitchcock"))
    -      .whenMatchedThenUpdate()
    -      .set(AUTHOR.FIRST_NAME, "John")
    -      .whenNotMatchedThenInsert(AUTHOR.LAST_NAME)
    -      .values("Hitchcock");
    -
    -</java></code-pair><html>
    -
    -		                            <h3>MERGE Statement (H2-specific syntax)</h3>
    -									<p>
    -									    The H2 database ships with a somewhat less powerful but a little more intuitive syntax for its own version of the MERGE statement. An example more or less equivalent to the previous one can be seen here:
    -									</p>
    -									
    -</html><code-pair>
    -<sql>-- Check if there is already an author called 'Hitchcock'
    --- If there is, rename him to John. If there isn't add him.
    -
    -MERGE INTO AUTHOR (FIRST_NAME, LAST_NAME)
    -KEY (LAST_NAME)
    -VALUES ('John', 'Hitchcock')</sql><java>create.mergeInto(AUTHOR,
    -                 AUTHOR.FIRST_NAME,
    -                 AUTHOR.LAST_NAME)
    -      .key(AUTHOR.LAST_NAME)
    -      .values("John", "Hitchcock")
    -      .execute();
    -</java></code-pair><html>
    -
    -		                            <p>
    -		                                This syntax can be fully simulated by jOOQ for all other databases that support the SQL standard. For more information about the H2 MERGE syntax, see the documentation here:<br/>
    -		                                <a href="http://www.h2database.com/html/grammar.html#merge">http://www.h2database.com/html/grammar.html#merge</a>
    -		                            </p>
    -								
    -								</html></content>
    -							</section>
    -
    -							<section id="truncate-statement">
    -								<title>The TRUNCATE statement</title>
    -								<content><html>
    -									<p>
    -										The TRUNCATE statement is the only DDL statement supported by jOOQ so far. It is popular in many databases when you want to bypass constraints for table truncation. Databases may behave differently, when a truncated table is referenced by other tables. For instance, they may fail if records from a truncated table are referenced, even with ON DELETE CASCADE clauses in place. Please, consider your database manual to learn more about its TRUNCATE implementation.
    -									</p>
    -									<p>
    -										The TRUNCATE syntax is trivial:
    -									</p>
    -
    -</html><code-pair>
    -	<sql>TRUNCATE TABLE AUTHOR;</sql><java>create.truncate(AUTHOR).execute();</java>
    -</code-pair><html>
    -									
    -									<p>
    -										TRUNCATE is not supported by Ingres and SQLite. jOOQ will execute a DELETE FROM AUTHOR statement instead.
    -									</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -					<section id="table-expressions">
    -						<title>Table expressions</title>
    -						<content><html>
    -							<p>
    -								The following sections explain the various types of table expressions supported by jOOQ
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="generated-tables">
    -								<title>Generated Tables</title>
    -								<content><html>
    -									<p>
    -										Most of the times, when thinking about a <reference id="table-expressions" title="table expression"/> you're probably thinking about an actual physical table in your database schema. If you're using jOOQ's <reference id="code-generation" title="code generator"/>, you will have all tables from your database schema available to you as type safe Java objects. You can then use these tables in SQL <reference id="from-clause" title="FROM clauses"/>, <reference id="join-clause" title="JOIN clauses"/> or in other <reference id="sql-statements" title="SQL statements"/>, just like any other table expression. An example is given here:
    -									</p>
    -							
    -</html><code-pair>
    -<sql><![CDATA[SELECT *
    -FROM AUTHOR -- Table expression AUTHOR
    -JOIN BOOK   -- Table expression BOOK
    -ON (AUTHOR.ID = BOOK.AUTHOR_ID)]]></sql><java><![CDATA[create.select()
    -      .from(AUTHOR) // Table expression AUTHOR
    -      .join(BOOK)   // Table expression BOOK
    -      .on(AUTHOR.ID.equal(BOOK.AUTHOR_ID));]]></java></code-pair><html>
    -							
    -									<p>
    -										The above example shows how AUTHOR and BOOK tables are joined in a <reference id="select-statement" title="SELECT statement"/>. It also shows how you can access physical <reference id="table-columns" title="table columns"/> by dereferencing the relevant Java attributes of their tables.
    -									</p>
    -									<p>
    -										See the manual's section about <reference id="codegen-tables" title="generated tables"/> for more information about what is really generated by the <reference id="code-generation" title="code generator"/>
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="aliased-tables">
    -								<title>Aliased Tables</title>
    -								<content><html>
    -									<p>
    -										The strength of jOOQ's <reference id="code-generation" title="code generator"/> becomes more obvious when you perform table aliasing and dereference fields from generated aliased tables. This can best be shown by example:
    -									</p>
    -
    -</html><code-pair><sql><![CDATA[-- Select all books by authors born after 1920,
    --- named "Paulo" from a catalogue:
    -
    -
    -
    -SELECT *
    -  FROM author a
    -  JOIN book b ON a.id = b.author_id
    - WHERE a.year_of_birth > 1920
    -   AND a.first_name = 'Paulo'
    - ORDER BY b.title]]></sql><java><![CDATA[// Declare your aliases before using them in SQL:
    -Author a = AUTHOR.as("a");
    -Book b = BOOK.as("b");
    -
    -// Use aliased tables in your statement
    -create.select()
    -      .from(a)
    -      .join(b).on(a.ID.equal(b.AUTHOR_ID))
    -      .where(a.YEAR_OF_BIRTH.greaterThan(1920)
    -      .and(a.FIRST_NAME.equal("Paulo")))
    -      .orderBy(b.TITLE);]]></java></code-pair><html>
    -								
    -									<p>
    -										As you can see in the above example, calling as() on generated tables returns an object of the same type as the table. This means that the resulting object can be used to dereference fields from the aliased table. This is quite powerful in terms of having your Java compiler check the syntax of your SQL statements. If you remove a column from a table, dereferencing that column from that table alias will cause compilation errors.
    -									</p>
    -									
    -									<h3>Dereferencing columns from other table expressions</h3>
    -									<p>
    -										TODO document this
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="joined-tables">
    -								<title>Joined tables</title>
    -								<content><html>
    -									<p>
    -										The <reference id="join-clause" title="JOIN operators"/> that can be used in <reference id="select-statement" title="SQL SELECT statements"/> are the most powerful and best supported means of creating new <reference id="table-expressions" title="table expressions"/> in SQL. Informally, the following can be said:
    -									</p>
    -									
    -</html><text>A(colA1, ..., colAn) "join" B(colB1, ..., colBm) "produces" C(colA1, ..., colAn, colB1, ..., colBm)</text><html>
    -
    -									<p>
    -										SQL and relational algebra distinguish between at least the following JOIN types (upper-case: SQL, lower-case: relational algebra):
    -									</p>
    -									<ul>
    -										<li><strong>CROSS JOIN or cartesian product</strong>: The basic JOIN in SQL, producing a relational cross product, combining every record of table A with every record of table B. Note that cartesian products can also be produced by listing comma-separated <reference id="table-expressions" title="table expressions"/> in the <reference id="from-clause" title="FROM clause"/> of a <reference id="select-statement" title="SELECT statement"/></li>
    -										<li><strong>NATURAL JOIN</strong>: The basic JOIN in relational algebra, yet a rarely used JOIN in databases with everyday degree of normalisation. This JOIN type unconditionally equi-joins two tables by all columns with the same name (requiring foreign keys and primary keys to share the same name). Note that the JOIN columns will only figure once in the resulting <reference id="table-expressions" title="table expression"/>.</li>
    -										<li><strong>INNER JOIN or equi-join</strong>: This JOIN operation performs a cartesian product (CROSS JOIN) with a <reference id="conditional-expressions" title="filtering predicate"/> being applied to the resulting <reference id="table-expressions" title="table expression"/>. Most often, a <reference id="comparison-predicate" title="equal comparison predicate"/> comparing foreign keys and primary keys will be applied as a filter, but any other predicate will work, too.</li>
    -										<li><strong>OUTER JOIN</strong>: This JOIN operation performs a cartesian product (CROSS JOIN) with a <reference id="conditional-expressions" title="filtering predicate"/> being applied to the resulting <reference id="table-expressions" title="table expression"/>. Most often, a <reference id="comparison-predicate" title="equal comparison predicate"/> comparing foreign keys and primary keys will be applied as a filter, but any other predicate will work, too. Unlike the INNER JOIN, an OUTER JOIN will add "empty records" to the left (table A) or right (table B) or both tables, in case the conditional expression fails to produce a .</li>										
    -										<li><strong>semi-join</strong>: In SQL, this JOIN operation can only be expressed implicitly using <reference id="in-predicate" title="IN predicates"/> or <reference id="exists-predicate" title="EXISTS predicates"/>. The <reference id="table-expressions" title="table expression"/> resulting from a semi-join will only contain the left-hand side table A</li>										
    -										<li><strong>anti-join</strong>: In SQL, this JOIN operation can only be expressed implicitly using <reference id="in-predicate" title="NOT IN predicates"/> or <reference id="exists-predicate" title="NOT EXISTS predicates"/>. The <reference id="table-expressions" title="table expression"/> resulting from a semi-join will only contain the left-hand side table A</li>
    -										<li><strong>division</strong>: This JOIN operation is hard to express at all, in SQL. See the manual's chapter about <reference id="relational-division" title="relational division"/> for details on how jOOQ simulates this operation.</li>
    -									</ul>									
    -									<p>
    -										jOOQ supports all of these JOIN types (except semi-join and anti-join) directly on any <reference id="table-expressions" title="table expression"/>:
    -									</p>
    -									
    -</html><java><![CDATA[// jOOQ's relational division convenience syntax 
    -DivideByOnStep divideBy(Table<?> table)
    -
    -// Various overloaded INNER JOINs
    -TableOnStep join(TableLike<?>)
    -TableOnStep join(String)
    -TableOnStep join(String, Object...)
    -TableOnStep join(String, QueryPart...)
    -
    -// Various overloaded OUTER JOINs (supporting Oracle's partitioned OUTER JOIN)
    -// Overloading is similar to that of INNER JOIN
    -TablePartitionByStep leftOuterJoin(TableLike<?>)
    -TablePartitionByStep rightOuterJoin(TableLike<?>)
    -
    -// Various overloaded FULL OUTER JOINs
    -TableOnStep fullOuterJoin(TableLike<?>)
    -
    -// Various overloaded CROSS JOINs
    -Table<Record> crossJoin(TableLike<?>)
    -
    -// Various overloaded NATURAL JOINs
    -Table<Record> naturalJoin(TableLike<?>)
    -Table<Record> naturalLeftOuterJoin(TableLike<?>)
    -Table<Record> naturalRightOuterJoin(TableLike<?>)]]></java><html>							
    -
    -									<p>
    -										Note that most of jOOQ's JOIN operations give way to a similar DSL API hierarchy as previously seen in the manual's section about the <reference id="join-clause" title="JOIN clause"/>
    -									</p>		
    -								</html></content>
    -							</section>
    -
    -							<section id="nested-selects">
    -								<title>Nested SELECTs</title>
    -								<content><html>
    -									<p>
    -										A <reference id="select-statement" title="SELECT statement"/> can appear almost anywhere a <reference id="table-expressions" title="table expression"/> can. Such a "nested SELECT" is often called a "derived table". Apart from many convenience methods accepting <reference class="org.jooq.Select"/> objects directly, a SELECT statement can always be transformed into a <reference class="org.jooq.Table"/> object using the asTable() method.
    -									</p>
    -									
    -									<h3>Example: Scalar subquery</h3>
    -									
    -</html><code-pair>
    -<sql>SELECT *
    -  FROM BOOK
    - WHERE BOOK.AUTHOR_ID = (
    - 		SELECT ID
    -          FROM AUTHOR
    -         WHERE LAST_NAME = 'Orwell')</sql><java>create.select()
    -      .from(BOOK)
    -      .where(BOOK.AUTHOR_ID.equal(create
    -             .select(AUTHOR.ID)
    -             .from(AUTHOR)
    -             .where(AUTHOR.LAST_NAME.equal("Orwell"))));</java>
    -</code-pair><html>
    -
    -									<h3>Example: Derived table</h3>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT nested.* FROM (
    -      SELECT AUTHOR_ID, count(*) books
    -        FROM BOOK
    -    GROUP BY AUTHOR_ID
    -) nested
    -ORDER BY nested.books DESC
    -
    -
    -
    -]]></sql><java><![CDATA[Table<Record> nested =
    -    create.select(BOOK.AUTHOR_ID, count().as("books"))
    -          .from(BOOK)
    -          .groupBy(BOOK.AUTHOR_ID).asTable("nested");
    -
    -create.select(nested.getFields())
    -      .from(nested)
    -      .orderBy(nested.getField("books"));]]></java>
    -</code-pair><html>
    -
    -									<h3>Example: Correlated subquery</h3>
    -</html><code-pair>
    -<sql><![CDATA[  SELECT LAST_NAME, (
    -      SELECT COUNT(*)
    -       FROM BOOK
    -      WHERE BOOK.AUTHOR_ID = AUTHOR.ID) books
    -    FROM AUTHOR
    -ORDER BY books DESC
    -
    -
    -
    -]]></sql><java><![CDATA[// The type of books cannot be inferred from the Select<?>
    -Field<Object> books =
    -    create.selectCount()
    -          .from(BOOK)
    -          .where(BOOK.AUTHOR_ID.equal(AUTHOR.ID))
    -          .asField("books");
    -create.select(AUTHOR.ID, books)
    -      .from(AUTHOR)
    -      .orderBy(books, AUTHOR.ID));]]></java>
    -</code-pair><html>									
    -								</html></content>
    -							</section>
    -
    -							<section id="pivot-tables">
    -								<title>The Oracle 11g PIVOT clause</title>
    -								<content><html>
    -									<p>
    -										If you are closely coupling your application to an Oracle database, you can take advantage of some Oracle-specific features, such as the PIVOT clause, used for statistical analyses. The formal syntax definition is as follows:
    -									</p>
    -									
    -</html><sql>-- SELECT ..
    -     FROM table PIVOT (aggregateFunction [, aggregateFunction] FOR column IN (expression [, expression]))
    ---  WHERE ..</sql><html>
    -		
    -									<p>
    -										The PIVOT clause is available from the <reference class="org.jooq.Table"/> type, as pivoting is done directly on a table. Currently, only Oracle's PIVOT clause is supported. Support for SQL Server's slightly different PIVOT clause will be added later. Also, jOOQ may simulate PIVOT for other dialects in the future.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="relational-division">
    -								<title>jOOQ's relational division syntax</title>
    -								<content><html>
    -									<p>
    -									    There is one operation in relational algebra that is not given a lot of attention, because it is rarely used in real-world applications. It is the relational division, the opposite operation of the cross product (or, relational multiplication). The following is an approximate definition of a relational division:
    -									</p>
    -
    -</html><config>Assume the following cross join / cartesian product
    -C = A × B
    -
    -Then it can be said that
    -A = C ÷ B
    -B = C ÷ A</config><html>
    -
    -									<p>
    -									   With jOOQ, you can simplify using relational divisions by using the following syntax:
    -									</p>
    -
    -</html><java>C.divideBy(B).on(C.ID.equal(B.C_ID)).returning(C.TEXT)</java><html>
    -
    -									<p>
    -										The above roughly translates to
    -									</p>
    -
    -</html><sql>SELECT DISTINCT C.TEXT FROM C "c1"
    -WHERE NOT EXISTS (
    -  SELECT 1 FROM B
    -  WHERE NOT EXISTS (
    -    SELECT 1 FROM C "c2"
    -    WHERE "c2".TEXT = "c1".TEXT
    -    AND "c2".ID = B.C_ID
    -  )
    -)</sql><html>
    -
    -									<p>
    -										Or in plain text: Find those TEXT values in C whose ID's correspond to all ID's in B. Note that from the above SQL statement, it is immediately clear that proper indexing is of the essence. Be sure to have indexes on all columns referenced from the on(...) and returning(...) clauses.
    -									</p>
    -
    -									<p>
    -										For more information about relational division and some nice, real-life examples, see
    -									</p>
    -
    -									<ul>
    -										<li><a href="http://en.wikipedia.org/wiki/Relational_algebra#Division" title="Wikipedia article on relational division">http://en.wikipedia.org/wiki/Relational_algebra#Division</a></li>
    -										<li><a href="http://www.simple-talk.com/sql/t-sql-programming/divided-we-stand-the-sql-of-relational-division/" title="A nice summary of what relational division is and how it is best implemented in SQL">http://www.simple-talk.com/sql/t-sql-programming/divided-we-stand-the-sql-of-relational-division/</a></li>
    -									</ul>
    -								</html></content>
    -
    -							</section>
    -
    -							<section id="array-and-cursor-unnesting">
    -								<title>Array and cursor unnesting</title>
    -								<content><html>
    -									<p>
    -										The SQL standard specifies how SQL databases should implement ARRAY and TABLE types, as well as CURSOR types. Put simply, a CURSOR is a pointer to any materialised <reference id="table-expressions" title="table expression"/>. Depending on the cursor's features, this table expression can be scrolled through in both directions, records can be locked, updated, removed, inserted, etc. Often, CURSOR types contain s, whereas ARRAY and TABLE types contain simple scalar values, although that is not a requirement
    -									</p>
    -									
    -									<p>
    -										ARRAY types in SQL are similar to Java's array types. They contain a "component type" or "element type" and a "dimension". This sort of ARRAY type is implemented in H2, HSQLDB and Postgres and supported by jOOQ as such. Oracle uses strongly-typed arrays, which means that an ARRAY type (VARRAY or TABLE type) has a name and possibly a maximum capacity associated with it.
    -									</p>
    -
    -									<h3>Unnesting array and cursor types</h3>									
    -									<p>
    -										The real power of these types become more obvious when you fetch them from <reference id="stored-procedures" title="stored procedures"/> to unnest them as <reference id="table-expressions" title="table expressions"/> and use them in your <reference id="from-clause" title="FROM clause"/>. An example is given here, where Oracle's DBMS_XPLAN package is used to fetch a cursor containing data about the most recent execution plan:
    -									</p>									
    -
    -</html><code-pair>
    -	<sql><![CDATA[SELECT *
    -FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(null, null, 'ALLSTATS'));]]></sql><java><![CDATA[create.select()
    -      .from(table(DbmsXplan.displayCursor(null, null, "ALLSTATS"));]]></java>
    -</code-pair><html>
    -									<p>
    -										Note, in order to access the DbmsXplan package, you can use the <reference id="code-generation" title="code generator"/> to generate Oracle's SYS schema.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="dual">
    -								<title>The DUAL table</title>
    -								<content><html>
    -									<p>
    -										The SQL standard specifies that the <reference id="from-clause" title="FROM clause"/> is optional in a <reference id="select-statement" title="SELECT statement"/>. However, according to the standard, you may then no longer use some other clauses, such as the <reference id="where-clause" title="WHERE clause"/>. In the real world, there exist three types of databases:
    -									</p>
    -									<ul>
    -										<li>The ones that always require a FROM clause</li>
    -										<li>The ones that never require a FROM clause (and still allow a WHERE clause)</li>
    -										<li>The ones that correctly implement the SQL standard</li>
    -									</ul>
    -									<p>
    -										With jOOQ, you don't have to worry about the above distinction of SQL dialects. jOOQ never requires a FROM clause, but renders the necessary "DUAL" table, if needed. The following program shows how jOOQ renders "DUAL" tables
    -									</p>
    -
    -</html><code-pair>
    -	<sql><![CDATA[SELECT 1
    -SELECT 1 FROM "db_root"
    -SELECT 1 FROM "SYSIBM"."DUAL"
    -SELECT 1 FROM "SYSIBM"."SYSDUMMY1"
    -SELECT 1 FROM dual
    -SELECT 1 FROM "INFORMATION_SCHEMA"."SYSTEM_USERS"
    -SELECT 1 FROM (select 1 as dual) as dual
    -SELECT 1 FROM dual
    -SELECT 1 FROM dual
    -SELECT 1
    -SELECT 1
    -SELECT 1
    -SELECT 1 FROM [SYS].[DUMMY]
    -]]></sql><java><![CDATA[new Factory(SQLDialect.ASE      ).selectOne().getSQL();
    -new Factory(SQLDialect.CUBRID   ).selectOne().getSQL();
    -new Factory(SQLDialect.DB2      ).selectOne().getSQL();
    -new Factory(SQLDialect.DERBY    ).selectOne().getSQL();
    -new Factory(SQLDialect.H2       ).selectOne().getSQL();
    -new Factory(SQLDialect.HSQLDB   ).selectOne().getSQL();
    -new Factory(SQLDialect.INGRES   ).selectOne().getSQL();
    -new Factory(SQLDialect.MYSQL    ).selectOne().getSQL();
    -new Factory(SQLDialect.ORACLE   ).selectOne().getSQL();
    -new Factory(SQLDialect.POSTGRES ).selectOne().getSQL();
    -new Factory(SQLDialect.SQLITE   ).selectOne().getSQL();
    -new Factory(SQLDialect.SQLSERVER).selectOne().getSQL();
    -new Factory(SQLDialect.SYBASE   ).selectOne().getSQL();]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										Note, that some databases (H2, MySQL) can normally do without "dual". However, there exist some corner-cases with complex nested SELECT statements, where this will cause syntax errors (or parser bugs). To stay on the safe side, jOOQ will always render "dual" in those dialects.
    -									</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -					<section id="column-expressions">
    -						<title>Column expressions</title>
    -						<content><html>
    -						    <p>
    -						    	Column expressions can be used in various SQL clauses in order to refer to one or several columns. This chapter explains how to form various types of column expressions with jOOQ. A particular type of column expression is given in the section about <reference id="row-value-expressions" title="s or row value expressions"/>, where an expression may have a degree of more than one.
    -						    </p>
    -						
    -						    <h3>Using column expressions in jOOQ</h3>
    -							<p>
    -								jOOQ allows you to freely create arbitrary column expressions using a fluent expression construction API. Many expressions can be formed as functions from <reference id="factory" title="Factory methods"/>, other expressions can be formed based on a pre-existing column expression. For example:
    -							</p>
    -							
    -</html><java><![CDATA[// A regular table column expression
    -Field<String> field1 = BOOK.TITLE;
    -
    -// A function created from the Factory using "prefix" notation
    -Field<String> field2 = trim(BOOK.TITLE);
    -
    -// The same function created from a pre-existing Field using "postfix" notation
    -Field<String> field3 = BOOK.TITLE.trim();
    -
    -// More complex function with advanced DSL syntax
    -Field<String> field4 = listAgg(BOOK.TITLE)
    -                          .withinGroupOrderBy(BOOK.ID.asc())
    -                          .over().partitionBy(AUTHOR.ID);]]></java><html>
    -
    -							<p>
    -								In general, it is up to you whether you want to use the "prefix" notation or the "postfix" notation to create new column expressions based on existing ones. The "SQL way" would be to use the "prefix notation", with functions created from the <reference id="factory" title="Factory"/>. The "Java way" or "object-oriented way" would be to use the "postfix" notation with functions created from <reference class="org.jooq.Field"/> objects. Both ways ultimately create the same query part, though.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="table-columns">
    -								<title>Table columns</title>
    -								<content><html>
    -									<p>
    -										Table columns are the most simple implementations of a <reference id="column-expressions" title="column expression"/>. They are mainly produced by jOOQ's <reference id="code-generation" title="code generator"/> and can be dereferenced from the generated tables. This manual is full of examples involving table columns. Another example is given in this query:
    -									</p>
    -
    -</html><code-pair>
    -	<sql><![CDATA[SELECT BOOK.ID, BOOK.TITLE
    -FROM BOOK
    -WHERE BOOK.TITLE LIKE '%SQL%'
    -ORDER BY BOOK.TITLE]]></sql><java><![CDATA[create.select(BOOK.ID, BOOK.TITLE)
    -	  .from(BOOK)
    -	  .where(BOOK.TITLE.like("%SQL%"))
    -	  .orderBy(BOOK.TITLE);]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										Table columns implement a more specific interface called <reference class="org.jooq.TableField"/>, which is parameterised with its associated &lt;R extends Record&gt; record type.
    -									</p>
    -									<p>
    -										See the manual's section about <reference id="codegen-tables" title="generated tables"/> for more information about what is really generated by the <reference id="code-generation" title="code generator"/>
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="aliased-columns">
    -								<title>Aliased columns</title>
    -								<content><html>
    -									<p>
    -										Just like <reference id="aliased-tables" title="tables"/>, columns can be renamed using aliases. Here is an example:
    -									</p>
    -									
    -</html><sql>  SELECT FIRST_NAME || ' ' || LAST_NAME author, COUNT(*) books
    -    FROM AUTHOR
    -    JOIN BOOK ON AUTHOR.ID = AUTHOR_ID
    -GROUP BY FIRST_NAME, LAST_NAME;</sql><html>
    -
    -									<p>
    -										Here is how it's done with jOOQ:
    -									</p>
    -									
    -</html><java>Record record = create.select(
    -         concat(AUTHOR.FIRST_NAME, val(" "), AUTHOR.LAST_NAME).as("author"),
    -         count().as("books"))
    -      .from(AUTHOR)
    -      .join(BOOK).on(AUTHOR.ID.equal(BOOK.AUTHOR_ID))
    -      .groupBy(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME).fetchAny();</java><html>
    -      
    -      								<p>
    -      									When you alias Fields like above, you can access those Fields' values using the alias name:
    -  									</p>
    -  									
    -</html><java>System.out.println("Author : " + record.getValue("author"));
    -System.out.println("Books  : " + record.getValue("books"));</java></content>
    -							</section>
    -
    -							<section id="cast-expressions">
    -								<title>Cast expressions</title>
    -								<content><html>
    -									<p>
    -										jOOQ's source code generator tries to find the most accurate type mapping between your vendor-specific data types and a matching Java type. For instance, most VARCHAR, CHAR, CLOB types will map to String. Most BINARY, BYTEA, BLOB types will map to byte[]. NUMERIC types will default to java.math.BigDecimal, but can also be any of java.math.BigInteger, Long, Integer, Short, Byte, Double, Float.
    -									</p>
    -									<p>
    -										Sometimes, this automatic mapping might not be what you needed, or jOOQ cannot know the type of a field. In those cases you would write SQL type CASTs like this:
    -									</p>
    -									
    -</html><sql>-- Let's say, your Postgres column LAST_NAME was VARCHAR(30)
    --- Then you could do this:
    -SELECT CAST(AUTHOR.LAST_NAME AS TEXT) FROM DUAL</sql><html>
    -
    -									<p>
    -										in jOOQ, you can write something like that:
    -									</p>
    -									
    -</html><java>create.select(TAuthor.LAST_NAME.cast(PostgresDataType.TEXT));</java><html>
    -
    -									<p>
    -										The same thing can be achieved by casting a Field directly to String.class, as TEXT is the default data type in Postgres to map to Java's String
    -									</p>
    -									
    -</html><java>create.select(TAuthor.LAST_NAME.cast(String.class));</java><html>
    -		
    -									<p>
    -										The complete CAST API in Field consists of these three methods:
    -									</p>
    -									
    -</html><java><![CDATA[public interface Field<T> {
    -
    -    // Cast this field to the type of another field
    -    <Z> Field<Z> cast(Field<Z> field);
    -    
    -    // Cast this field to a given DataType
    -    <Z> Field<Z> cast(DataType<Z> type);
    -    
    -    // Cast this field to the default DataType for a given Class
    -    <Z> Field<Z> cast(Class<? extends Z> type);
    -}
    -
    -// And additional convenience methods in the Factory:
    -public class Factory {
    -    <T> Field<T> cast(Object object, Field<T> field);
    -    <T> Field<T> cast(Object object, DataType<T> type);
    -    <T> Field<T> cast(Object object, Class<? extends T> type);
    -    <T> Field<T> castNull(Field<T> field);
    -    <T> Field<T> castNull(DataType<T> type);
    -    <T> Field<T> castNull(Class<? extends T> type);
    -}]]></java></content>
    -							</section>
    -
    -							<section id="arithmetic-expressions">
    -								<title>Arithmetic expressions</title>
    -								<content><html>
    -									<h3>Numeric arithmetic expressions</h3>
    -									<p>
    -										Your database can do the math for you. Arithmetic operations are implemented just like <reference id="numeric-functions" title="numeric functions"/>, with similar limitations as far as type restrictions are concerned. You can use any of these operators:
    -									</p>
    -
    -</html><config>  +  -  *  /  %</config><html>
    -
    -									<p>
    -										In order to express a SQL query like this one:
    -									</p>
    -									
    -</html><sql>SELECT ((1 + 2) * (5 - 3) / 2) % 10 FROM DUAL</sql><html>
    -							
    -									<p>
    -										You can write something like this in jOOQ:
    -									</p>
    -									
    -</html><java>create.select(val(1).add(2).mul(val(5).sub(3)).div(2).mod(10);</java><html>
    -
    -									<h3>Datetime arithmetic expressions</h3>
    -									<p>
    -										jOOQ also supports the Oracle-style syntax for adding days to a Field&lt;? extends java.util.Date&gt; 
    -									</p>
    -
    -</html><code-pair>
    -	<sql>SELECT SYSDATE + 3 FROM DUAL;</sql><java>create.select(currentTimestamp().add(3));</java>
    -</code-pair><html>
    -
    -									<p>
    -										For more advanced datetime arithmetic, use the Factory's timestampDiff() and dateDiff() functions, as well as jOOQ's built-in SQL standard INTERVAL data type support:
    -									</p>
    -									<ul>
    -										<li>INTERVAL YEAR TO MONTH: <reference class="org.jooq.types.YearToMonth"/></li>
    -										<li>INTERVAL DAY TO SECOND: <reference class="org.jooq.types.DayToSecond"/></li>
    -									</ul>
    -								</html></content>
    -							</section>
    -							
    -							<section id="string-concatenation">
    -								<title>String concatenation</title>
    -								<content><html>
    -									<p>
    -										The SQL standard defines the concatenation operator to be an infix operator, similar to the ones we've seen in the chapter about <reference id="arithmetic-expressions" title="arithmetic expressions"/>. This operator looks like this: <code>||</code>. Some other dialects do not support this operator, but expect a <code>concat()</code> function, instead. jOOQ renders the right operator / function, depending on your <reference id="sql-dialects" title="SQL dialect"/>:
    -									</p>
    -									
    -</html><code-pair>
    -<sql>SELECT 'A' || 'B' || 'C' FROM DUAL
    --- Or in MySQL:
    -SELECT concat('A', 'B', 'C') FROM DUAL</sql><java>&#160;
    -// For all RDBMS, including MySQL:
    -create.select(concat("A", "B", "C"));
    -</java>
    -</code-pair><html>								
    -								</html></content>
    -							</section>
    -
    -							<section id="general-functions">
    -								<title>General functions</title>
    -								<content><html>
    -									<p>
    -										There are a variety of general functions supported by jOOQ As discussed in the chapter about <reference id="sql-dialects" title="SQL dialects"/> functions are mostly simulated in your database, in case they are not natively supported.
    -									</p>
    -									<p>
    -										This is a list of general functions supported by jOOQ's <reference id="factory" title="Factory"/>:
    -									</p>
    -									<ul>
    -										<li><strong>COALESCE</strong>: Get the first non-null value in a list of arguments.</li>
    -										<li><strong>NULLIF</strong>: Return NULL if both arguments are equal, or the first argument, otherwise.</li>
    -										<li><strong>NVL</strong>: Get the first non-null value among two arguments.</li>
    -										<li><strong>NVL2</strong>: Get the second argument if the first is null, or the third argument, otherwise.</li>
    -									</ul>
    -																
    -									<p>
    -										Please refer to the <reference class="org.jooq.impl.Factory" title="Factory Javadoc"/> for more details.
    -									</p>
    -								</html></content>
    -							</section>
    -							
    -							<section id="numeric-functions">
    -								<title>Numeric functions</title>
    -								<content><html>
    -									<p>
    -										Math can be done efficiently in the database before returning results to your Java application. In addition to the <reference id="arithmetic-expressions" title="arithmetic expressions" /> discussed previously, jOOQ also supports a variety of numeric functions. As discussed in the chapter about <reference id="sql-dialects" title="SQL dialects"/> numeric functions (as any function type) are mostly simulated in your database, in case they are not natively supported.
    -									</p>
    -									<p>
    -										This is a list of numeric functions supported by jOOQ's <reference id="factory" title="Factory"/>:
    -									</p>
    -									
    -									<ul>
    -										<li><strong>ABS</strong>: Get the absolute value of a value.</li>
    -										<li><strong>ACOS</strong>: Get the arc cosine of a value.</li>
    -										<li><strong>ASIN</strong>: Get the arc sine of a value.</li>
    -										<li><strong>ATAN</strong>: Get the arc tangent of a value.</li>
    -										<li><strong>ATAN2</strong>: Get the atan2 function of two values.</li>
    -										<li><strong>CEIL</strong>: Get the smalles integer value larger than a given numeric value.</li>
    -										<li><strong>COS</strong>: Get the cosine of a value.</li>
    -										<li><strong>COSH</strong>: Get the hyperbolic cosine of a value.</li>
    -										<li><strong>COT</strong>: Get the cotangent of a value.</li>
    -										<li><strong>COTH</strong>: Get the hyperbolic cotangent of a value.</li>
    -										<li><strong>DEG</strong>: Transform radians into degrees.</li>
    -										<li><strong>EXP</strong>: Calculate e^value.</li>
    -										<li><strong>FLOOR</strong>: Get the largest integer value smaller than a given numeric value.</li>
    -										<li><strong>GREATEST</strong>: Finds the greatest among all argument values (can also be used with non-numeric values).</li>
    -										<li><strong>LEAST</strong>: Finds the least among all argument values (can also be used with non-numeric values).</li>
    -										<li><strong>LN</strong>: Get the natural logarithm of a value.</li>
    -										<li><strong>LOG</strong>: Get the logarithm of a value given a base.</li>
    -										<li><strong>POWER</strong>: Calculate value^exponent.</li>
    -										<li><strong>RAD</strong>: Transform degrees into radians.</li>
    -										<li><strong>RAND</strong>: Get a random number.</li>
    -										<li><strong>ROUND</strong>: Rounds a value to the nearest integer.</li>
    -										<li><strong>SIGN</strong>: Get the sign of a value (-1, 0, 1).</li>
    -										<li><strong>SIN</strong>: Get the sine of a value.</li>
    -										<li><strong>SINH</strong>: Get the hyperbolic sine of a value.</li>
    -										<li><strong>SQRT</strong>: Calculate the square root of a value.</li>
    -										<li><strong>TAN</strong>: Get the tangent of a value.</li>
    -										<li><strong>TANH</strong>: Get the hyperbolic tangent of a value.</li>
    -										<li><strong>TRUNC</strong>: Truncate the decimals off a given value.</li>
    -									</ul>
    -									
    -									<p>
    -										Please refer to the <reference class="org.jooq.impl.Factory" title="Factory Javadoc"/> for more details.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="bitwise-functions">
    -								<title>Bitwise functions</title>
    -								<content><html>
    -									<p>
    -										Interestingly, bitwise functions and bitwise arithmetic is not very popular among SQL databases. Most databases only support a few bitwise operations, while others ship with the full set of operators. jOOQ's API includes most bitwise operations as listed below. In order to avoid ambiguities with <reference id="conditional-expressions" title="conditional operators"/>, all bitwise functions are prefixed with "bit"
    -									</p>
    -									<ul>
    -										<li><strong>BIT_COUNT</strong>: Count the number of bits set to 1 in a number</li>
    -										<li><strong>BIT_AND</strong>: Set only those bits that are set in two numbers</li>
    -										<li><strong>BIT_OR</strong>: Set all bits that are set in at least one number</li>
    -										<li><strong>BIT_NAND</strong>: Set only those bits that are set in two numbers, and inverse the result</li>
    -										<li><strong>BIT_NOR</strong>: Set all bits that are set in at least one number, and inverse the result</li>
    -										<li><strong>BIT_NOT</strong>: Inverse the bits in a number</li>
    -										<li><strong>BIT_XOR</strong>: Set all bits that are set in at exactly one number</li>
    -										<li><strong>BIT_XNOR</strong>: Set all bits that are set in at exactly one number, and inverse the result</li>
    -										<li><strong>SHL</strong>: Shift bits to the left</li>
    -										<li><strong>SHR</strong>: Shift bits to the right</li>
    -									</ul>
    -									
    -									<h3>Some background about bitwise operation simulation</h3>
    -									<p>
    -										As stated before, not all databases support all of these bitwise operations. jOOQ simulates them wherever this is possible. More details can be seen in this blog post: <br/>
    -										<a href="http://blog.jooq.org/2011/10/30/the-comprehensive-sql-bitwise-operations-compatibility-list/">http://blog.jooq.org/2011/10/30/the-comprehensive-sql-bitwise-operations-compatibility-list/</a>
    -									</p>
    -									
    -								</html></content>
    -							</section>
    -
    -							<section id="string-functions">
    -								<title>String functions</title>
    -								<content><html>
    -									<p>
    -										String formatting can be done efficiently in the database before returning results to your Java application. As discussed in the chapter about <reference id="sql-dialects" title="SQL dialects"/> string functions (as any function type) are mostly simulated in your database, in case they are not natively supported.
    -									</p>
    -									<p>
    -										This is a list of numeric functions supported by jOOQ's <reference id="factory" title="Factory"/>:
    -									</p>
    -									
    -									<ul>
    -										<li><strong>ASCII</strong>: Get the ASCII code of a character.</li>
    -										<li><strong>BIT_LENGTH</strong>: Get the length of a string in bits.</li>
    -										<li><strong>CHAR_LENGTH</strong>: Get the length of a string in characters.</li>
    -										<li><strong>CONCAT</strong>: Concatenate several strings.</li>
    -										<li><strong>ESCAPE</strong>: Escape a string for use with the <reference id="like-predicate" title="LIKE predicate"/>.</li>
    -										<li><strong>LENGTH</strong>: Get the length of a string.</li>
    -										<li><strong>LOWER</strong>: Get a string in lower case letters.</li>
    -										<li><strong>LPAD</strong>: Pad a string on the left side.</li>
    -										<li><strong>LTRIM</strong>: Trim a string on the left side.</li>
    -										<li><strong>OCTET_LENGTH</strong>: Get the length of a string in octets.</li>
    -										<li><strong>POSITION</strong>: Find a string within another string.</li>
    -										<li><strong>REPEAT</strong>: Repeat a string a given number of times.</li>
    -										<li><strong>REPLACE</strong>: Replace a string within another string.</li>
    -										<li><strong>RPAD</strong>: Pad a string on the right side.</li>
    -										<li><strong>RTRIM</strong>: Trim a string on the right side.</li>
    -										<li><strong>SUBSTRING</strong>: Get a substring of a string.</li>
    -										<li><strong>TRIM</strong>: Trim a string on both sides.</li>
    -										<li><strong>UPPER</strong>: Get a string in upper case letters.</li>
    -									</ul>
    -									
    -									<p>
    -										Please refer to the <reference class="org.jooq.impl.Factory" title="Factory Javadoc"/> for more details.
    -									</p>
    -									
    -									<h3>Regular expressions, REGEXP, REGEXP_LIKE, etc.</h3>
    -									<p>
    -										Various databases have some means of searching through columns using regular expressions if the <reference id="like-predicate" title="LIKE predicate"/> does not provide sufficient pattern matching power. While there are many different functions and operators in the various databases, jOOQ settled for the SQL:2008 standard REGEX_LIKE operator. Being an operator (and not a function), you should use the corresponding method on <reference class="org.jooq.Field"/>:
    -									</p>
    -									
    -</html><java><![CDATA[create.selectFrom(BOOK).where(TITLE.likeRegex("^.*SQL.*$"));]]></java><html>
    -
    -									<p>
    -										Note that the SQL standard specifies that patterns should follow the XQuery standards. In the real world, the POSIX regular expression standard is the most used one, some use Java regular expressions, and only a few ones use Perl regular expressions. jOOQ does not make any assumptions about regular expression syntax. For cross-database compatibility, please read the relevant database manuals carefully, to learn about the appropriate syntax. Please refer to the <reference class="org.jooq.impl.Factory" title="Factory Javadoc"/> for more details.
    -									</p>
    -								</html></content>
    -								<!-- don't forget regex here! -->
    -							</section>
    -
    -							<section id="date-and-time-functions">
    -								<title>Date and time functions</title>
    -								<content><html>
    -									<p>
    -										This is a list of date and time functions supported by jOOQ's <reference id="factory" title="Factory"/>:
    -									</p>
    -									
    -									<ul>
    -										<li><strong>CURRENT_DATE</strong>: Get current date as a DATE object.</li>
    -										<li><strong>CURRENT_TIME</strong>: Get current time as a TIME object.</li>
    -										<li><strong>CURRENT_TIMESTAMP</strong>: Get current date as a TIMESTAMP object.</li>
    -										<li><strong>DATE_ADD</strong>: Add a number of days or an interval to a date.</li>
    -										<li><strong>DATE_DIFF</strong>: Get the difference in days between two dates.</li>
    -										<li><strong>TIMESTAMP_ADD</strong>: Add a number of days or an interval to a timestamp.</li>
    -										<li><strong>TIMESTAMP_DIFF</strong>: Get the difference as an INTERVAL DAY TO SECOND between two dates.</li>
    -									</ul>
    -									
    -									<h3>Intervals in jOOQ</h3>
    -									<p>
    -										jOOQ fills a gap opened by JDBC, which neglects an important SQL data type as defined by the SQL standards: INTERVAL types. See the manual's section about <reference id="data-types-intervals" title="INTERVAL data types"/> for more details.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="system-functions">
    -								<title>System functions</title>
    -								<content><html>
    -									<p>
    -										This is a list of system functions supported by jOOQ's <reference id="factory" title="Factory"/>:
    -									</p>
    -									<ul>
    -										<li><strong>CURRENT_USER</strong>: Get current user.</li>
    -									</ul>
    -								</html></content>
    -							</section>
    -
    -							<section id="aggregate-functions">
    -								<title>Aggregate functions</title>
    -								<content><html>
    -									<p>
    -										Aggregate functions work just like functions, even if they have a slightly different semantics. Here are some example aggregate functions from the <reference id="factory" title="Factory"/>:
    -									</p>
    -
    -</html><java><![CDATA[// Every-day, SQL standard aggregate functions
    -AggregateFunction<Integer>    count();
    -AggregateFunction<Integer>    count(Field<?> field);
    -AggregateFunction<T>          max  (Field<T> field);
    -AggregateFunction<T>          min  (Field<T> field);
    -AggregateFunction<BigDecimal> sum  (Field<? extends Number> field);
    -AggregateFunction<BigDecimal> avg  (Field<? extends Number> field);
    -
    -// DISTINCT keyword in aggregate functions
    -AggregateFunction<Integer>    countDistinct(Field<?> field);
    -AggregateFunction<T>          maxDistinct  (Field<T> field);
    -AggregateFunction<T>          minDistinct  (Field<T> field);
    -AggregateFunction<BigDecimal> sumDistinct  (Field<? extends Number> field);
    -AggregateFunction<BigDecimal> avgDistinct  (Field<? extends Number> field);
    -
    -// String aggregate functions
    -AggregateFunction<String> groupConcat        (Field<?> field);
    -AggregateFunction<String> groupConcatDistinct(Field<?> field);
    -OrderedAggregateFunction<String> listAgg(Field<?> field);
    -OrderedAggregateFunction<String> listAgg(Field<?> field, String separator);
    -
    -// Statistical functions
    -AggregateFunction<BigDecimal> median    (Field<? extends Number> field);
    -AggregateFunction<BigDecimal> stddevPop (Field<? extends Number> field);
    -AggregateFunction<BigDecimal> stddevSamp(Field<? extends Number> field);
    -AggregateFunction<BigDecimal> varPop    (Field<? extends Number> field);
    -AggregateFunction<BigDecimal> varSamp   (Field<? extends Number> field);
    -
    -// Linear regression functions
    -AggregateFunction<BigDecimal> regrAvgX     (Field<? extends Number> y, Field<? extends Number> x);
    -AggregateFunction<BigDecimal> regrAvgY     (Field<? extends Number> y, Field<? extends Number> x);
    -AggregateFunction<BigDecimal> regrCount    (Field<? extends Number> y, Field<? extends Number> x);
    -AggregateFunction<BigDecimal> regrIntercept(Field<? extends Number> y, Field<? extends Number> x);
    -AggregateFunction<BigDecimal> regrR2       (Field<? extends Number> y, Field<? extends Number> x);
    -AggregateFunction<BigDecimal> regrSlope    (Field<? extends Number> y, Field<? extends Number> x);
    -AggregateFunction<BigDecimal> regrSXX      (Field<? extends Number> y, Field<? extends Number> x);
    -AggregateFunction<BigDecimal> regrSXY      (Field<? extends Number> y, Field<? extends Number> x);
    -AggregateFunction<BigDecimal> regrSYY      (Field<? extends Number> y, Field<? extends Number> x);]]></java><html>
    -
    -									<p>
    -										Here's an example, counting the number of books any author has written:
    -									</p>
    -
    -</html><code-pair>
    -<sql>SELECT AUTHOR_ID, COUNT(*)
    -FROM BOOK
    -GROUP BY AUTHOR_ID</sql><java>create.select(BOOK.AUTHOR_ID, count())
    -      .from(BOOK)
    -      .groupBy(BOOK.AUTHOR_ID);</java>
    -</code-pair><html>
    -
    -									<p>
    -										Aggregate functions have strong limitations about when they may be used and when not. For instance, you can use aggregate functions in scalar queries. Typically, this means you only select aggregate functions, no <reference id="table-columns" title="regular columns"/> or other <reference id="column-expressions" title="column expressions"/>. Another use case is to use them along with a <reference id="group-by-clause" title="GROUP BY clause"/> as seen in the previous example. Note, that jOOQ does not check whether your using of aggregate functions is correct according to the SQL standards, or according to your database's behaviour.
    -									</p>
    -
    -		                            <h3>Ordered aggregate functions</h3>
    -		                            <p>
    -		                            	Oracle and some other databases support "ordered aggregate functions". This means you can provide an ORDER BY clause to an aggregate function, which will be taken into consideration when aggregating. The best example for this is Oracle's <code>LISTAGG()</code> (also known as <code>GROUP_CONCAT</code> in other <reference id="sql-dialects" title="SQL dialects"/>). The following query groups by authors and concatenates their books' titles
    -		                           	</p>
    -</html><code-pair>
    -<sql>SELECT   LISTAGG(TITLE, ', ')
    -         WITHIN GROUP (ORDER BY TITLE)
    -FROM     BOOK
    -GROUP BY AUTHOR_ID</sql><java>create.select(listAgg(BOOK.TITLE, ", ")
    -      .withinGroupOrderBy(BOOK.TITLE))
    -      .from(BOOK)
    -      .groupBy(BOOK.AUTHOR_ID)</java>
    -</code-pair><html>
    -
    -									<p>
    -										The above query might yield:
    -									</p>
    -
    -</html><text>+---------------------+
    -| LISTAGG             |
    -+---------------------+
    -| 1984, Animal Farm   |
    -| O Alquimista, Brida |
    -+---------------------+</text><html>
    -
    -									<h3>FIRST and LAST: Oracle's "ranked" aggregate functions</h3>
    -									<p>
    -										Oracle allows for restricting aggregate functions using the <code>KEEP()</code> clause, which is supported by jOOQ. In Oracle, some aggregate functions (MIN, MAX, SUM, AVG, COUNT, VARIANCE, or STDDEV) can be restricted by this clause, hence <reference class="org.jooq.AggregateFunction"/> also allows for specifying it. Here are a couple of examples using this clause:
    -									</p>
    -
    -</html><code-pair>
    -<sql>SUM(BOOK.AMOUNT_SOLD)
    -  KEEP(DENSE_RANK FIRST ORDER BY BOOK.AUTHOR_ID)</sql><java>sum(BOOK.AMOUNT_SOLD)
    -  .keepDenseRankFirstOrderBy(BOOK.AUTHOR_ID)</java>
    -</code-pair><html>
    -
    -									<h3>User-defined aggregate functions</h3>
    -									<p>
    -										jOOQ also supports using your own user-defined aggregate functions. See the manual's section about <reference id="user-defined-aggregate-functions" title="user-defined aggregate functions"/> for more details.
    -									</p>
    -
    -									<h3>Window functions / analytical functions</h3>
    -									<p>
    -										In those databases that support <reference id="window-functions" title="window functions"/>, jOOQ's <reference class="org.jooq.AggregateFunction"/> can be transformed into a window function / analytical function by calling <code>over()</code> on it. See the manual's section about <reference id="window-functions" title="window functions"/> for more details.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="window-functions">
    -								<title>Window functions</title>
    -								<content><html>
    -									<p>
    -										Most major RDBMS support the concept of window functions. jOOQ knows of implementations in DB2, Oracle, Postgres, SQL Server, and Sybase SQL Anywhere, and supports most of their specific syntaxes. Note, that H2 and HSQLDB have implemented <code>ROW_NUMBER()</code> functions, without true windowing support.
    -									</p>
    -									<p>
    -										As previously discussed, any <reference class="org.jooq.AggregateFunction"/> can be transformed into a window function using the <code>over()</code> method. See the chapter about <reference id="aggregate-functions" title="aggregate functions"/> for details. In addition to those, there are also some more window functions supported by jOOQ, as declared in the <reference id="factory" title="Factory"/>:
    -									</p>
    -
    -</html><java><![CDATA[// Ranking functions
    -    WindowOverStep<Integer>    rowNumber();
    -    WindowOverStep<Integer>    rank();
    -    WindowOverStep<Integer>    denseRank();
    -    WindowOverStep<BigDecimal> percentRank();
    -    
    -// Windowing functions
    -<T> WindowIgnoreNullsStep<T>   firstValue(Field<T> field);
    -<T> WindowIgnoreNullsStep<T>   lastValue(Field<T> field)
    -<T> WindowIgnoreNullsStep<T>   lead(Field<T> field);
    -<T> WindowIgnoreNullsStep<T>   lead(Field<T> field, int offset);
    -<T> WindowIgnoreNullsStep<T>   lead(Field<T> field, int offset, T defaultValue);
    -<T> WindowIgnoreNullsStep<T>   lead(Field<T> field, int offset, Field<T> defaultValue);
    -<T> WindowIgnoreNullsStep<T>   lag(Field<T> field);
    -<T> WindowIgnoreNullsStep<T>   lag(Field<T> field, int offset);
    -<T> WindowIgnoreNullsStep<T>   lag(Field<T> field, int offset, T defaultValue);
    -<T> WindowIgnoreNullsStep<T>   lag(Field<T> field, int offset, Field<T> defaultValue);
    -
    -// Statistical functions
    -    WindowOverStep<BigDecimal> cumeDist();
    -    WindowOverStep<Integer>    ntile(int number);]]></java><html>	
    -    								
    -    								<p>
    -    									SQL distinguishes between various window function types (e.g. "ranking functions"). Depending on the function, SQL expects mandatory <code>PARTITION BY</code> or <code>ORDER BY</code> clauses within the <code>OVER()</code> clause. jOOQ does not enforce those rules for two reasons:
    -    								</p>
    -    								<ul>
    -    									<li>Your JDBC driver or database already checks SQL syntax semantics</li>
    -    									<li>Not all databases behave correctly according to the SQL standard</li>
    -    								</ul>
    -    								<p>
    -    									If possible, however, jOOQ tries to render missing clauses for you, if a given <reference id="sql-dialects" title="SQL dialect"/> is more restrictive.
    -    								</p>
    -    								<h3>Some examples</h3>
    -									<p>
    -										 Here are some simple examples of window functions with jOOQ:
    -									</p>
    -									
    -</html><code-pair>
    -<sql>-- Sample uses of ROW_NUMBER()
    -ROW_NUMBER() OVER()
    -ROW_NUMBER() OVER(PARTITION BY 1)
    -ROW_NUMBER() OVER(ORDER BY BOOK.ID)
    -ROW_NUMBER() OVER(PARTITION BY BOOK.AUTHOR_ID ORDER BY BOOK.ID)
    -                  
    --- Sample uses of FIRST_VALUE
    -FIRST_VALUE(BOOK.ID) OVER()
    -FIRST_VALUE(BOOK.ID IGNORE NULLS) OVER()
    -FIRST_VALUE(BOOK.ID RESPECT NULLS) OVER()
    -</sql><java>// Sample uses of rowNumber()
    -rowNumber().over()
    -rowNumber().over().partitionByOne()
    -rowNumber().over().partitionBy(BOOK.AUTHOR_ID)
    -rowNumber().over().partitionBy(BOOK.AUTHOR_ID).orderBy(BOOK.ID)
    -                  
    -// Sample uses of firstValue()
    -firstValue(BOOK.ID).over()
    -firstValue(BOOK.ID).ignoreNulls().over()
    -firstValue(BOOK.ID).respectNulls().over()
    -</java>
    -</code-pair><html>
    -    								
    -									<h3>An advanced window function example</h3>
    -									<p>
    -										Window functions can be used for things like calculating a "running total". The following example fetches transactions and the running total for every transaction going back to the beginning of the transaction table (ordered by booked_at). Window functions are accessible from the previously seen <reference class="org.jooq.AggregateFunction"/> type using the <code>over()</code> method:
    -									</p>
    -
    -</html><code-pair>
    -<sql>SELECT booked_at, amount,
    -   SUM(amount) OVER (PARTITION BY 1
    -                     ORDER BY booked_at
    -                     ROWS BETWEEN UNBOUNDED PRECEDING
    -                     AND CURRENT ROW) AS total
    -  FROM transactions</sql><java>create.select(t.BOOKED_AT, t.AMOUNT,
    -         sum(t.AMOUNT).over().partitionByOne()
    -                      .orderBy(t.BOOKED_AT)
    -                      .rowsBetweenUnboundedPreceding()
    -                      .andCurrentRow().as("total")
    -      .from(TRANSACTIONS.as("t"));</java>
    -</code-pair><html>
    -
    -
    -									<h3>Window functions created from ordered aggregate functions</h3>
    -									<p>
    -										In the previous chapter about <reference id="aggregate-functions" title="aggregate functions"/>, we have seen the concept of "ordered aggregate functions", such as Oracle's <code>LISTAGG()</code>. These functions have a window function / analytical function variant, as well. For example:
    -									</p>
    -									
    -</html><code-pair>
    -<sql>SELECT   LISTAGG(TITLE, ', ')
    -         WITHIN GROUP (ORDER BY TITLE)
    -         OVER (PARTITION BY BOOK.AUTHOR_ID)
    -FROM     BOOK</sql><java>create.select(listAgg(BOOK.TITLE, ", ")
    -      .withinGroupOrderBy(BOOK.TITLE)
    -      .over().partitionBy(BOOK.AUTHOR_ID))
    -      .from(BOOK)</java>
    -</code-pair><html>
    -
    -									<h3>Window functions created from Oracle's FIRST and LAST aggregate functions</h3>
    -									<p>
    -										In the previous chapter about <reference id="aggregate-functions" title="aggregate functions"/>, we have seen the concept of "FIRST and LAST aggregate functions". These functions have a window function / analytical function variant, as well. For example:
    -									</p>
    -
    -</html><code-pair>
    -<sql>SUM(BOOK.AMOUNT_SOLD)
    -  KEEP(DENSE_RANK FIRST ORDER BY BOOK.AUTHOR_ID)
    -  OVER(PARTITION BY 1)</sql><java>sum(BOOK.AMOUNT_SOLD)
    -  .keepDenseRankFirstOrderBy(BOOK.AUTHOR_ID)
    -  .over().partitionByOne()</java>
    -</code-pair><html>
    -
    -
    -									<h3>Window functions created from user-defined aggregate functions</h3>
    -									<p>
    -										User-defined aggregate functions also implement <reference class="org.jooq.AggregateFunction"/>, hence they can also be transformed into window functions using <code>over()</code>. This is supported by Oracle in particular. See the manual's section about <reference id="user-defined-aggregate-functions" title="user-defined aggregate functions"/> for more details.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="grouping-functions">
    -								<title>Grouping functions</title>
    -								<content><html>
    -									<h3>ROLLUP() explained in SQL</h3>
    -									<p>
    -										The SQL standard defines special functions that can be used in the <reference id="group-by-clause" title="GROUP BY clause"/>: the grouping functions. These functions can be used to generate several groupings in a single clause. This can best be explained in SQL. Let's take ROLLUP() for instance:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[-- ROLLUP() with one argument 
    -SELECT AUTHOR_ID, COUNT(*)
    -FROM BOOK
    -GROUP BY ROLLUP(AUTHOR_ID)
    -
    -
    --- ROLLUP() with two arguments
    -SELECT AUTHOR_ID, PUBLISHED_IN, COUNT(*)
    -FROM BOOK
    -GROUP BY ROLLUP(AUTHOR_ID, PUBLISHED_IN)
    -
    -
    -
    -
    -
    -
    -
    -]]></sql><sql><![CDATA[-- The same query using UNION ALL:
    -  SELECT AUTHOR_ID, COUNT(*) FROM BOOK GROUP BY (AUTHOR_ID)
    -UNION ALL
    -  SELECT NULL, COUNT(*) FROM BOOK GROUP BY ()
    -ORDER BY 1 NULLS LAST
    -
    --- The same query using UNION ALL:
    -  SELECT AUTHOR_ID, PUBLISHED_IN, COUNT(*) 
    -  FROM BOOK GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -UNION ALL
    -  SELECT AUTHOR_ID, NULL, COUNT(*) 
    -  FROM BOOK GROUP BY (AUTHOR_ID)
    -UNION ALL
    -  SELECT NULL, NULL, COUNT(*) 
    -  FROM BOOK GROUP BY ()
    -ORDER BY 1 NULLS LAST, 2 NULLS LAST
    -]]></sql>
    -</code-pair><html>
    -
    -									<p>
    -										In English, the <code>ROLLUP()</code> grouping function provides <code>N+1</code> groupings, when <code>N</code> is the number of arguments to the <code>ROLLUP()</code> function. Each grouping has an additional group field from the <code>ROLLUP()</code> argument field list. The results of the second query might look something like this:
    -									</p>
    -									
    -</html><text><![CDATA[+-----------+--------------+----------+
    -| AUTHOR_ID | PUBLISHED_IN | COUNT(*) |
    -+-----------+--------------+----------+
    -|         1 |         1945 |        1 | <- GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -|         1 |         1948 |        1 | <- GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -|         1 |         NULL |        2 | <- GROUP BY (AUTHOR_ID)
    -|         2 |         1988 |        1 | <- GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -|         2 |         1990 |        1 | <- GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -|         2 |         NULL |        2 | <- GROUP BY (AUTHOR_ID)
    -|      NULL |         NULL |        4 | <- GROUP BY ()
    -+-----------+--------------+----------+]]></text><html>
    -
    -									<h3>CUBE() explained in SQL</h3>
    -									<p>
    -										<code>CUBE()</code> is different from <code>ROLLUP()</code> in the way that it doesn't just create <code>N+1</code> groupings, it creates all <code>2^N</code> possible combinations between all group fields in the <code>CUBE()</code> function argument list. Let's re-consider our second query from before:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[-- CUBE() with two arguments
    -SELECT AUTHOR_ID, PUBLISHED_IN, COUNT(*)
    -FROM BOOK
    -GROUP BY CUBE(AUTHOR_ID, PUBLISHED_IN)
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -]]></sql><sql><![CDATA[-- The same query using UNION ALL:
    -  SELECT AUTHOR_ID, PUBLISHED_IN, COUNT(*) 
    -  FROM BOOK GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -UNION ALL
    -  SELECT AUTHOR_ID, NULL, COUNT(*) 
    -  FROM BOOK GROUP BY (AUTHOR_ID)
    -UNION ALL
    -  SELECT NULL, PUBLISHED_IN, COUNT(*) 
    -  FROM BOOK GROUP BY (PUBLISHED_IN)
    -UNION ALL
    -  SELECT NULL, NULL, COUNT(*) 
    -  FROM BOOK GROUP BY ()
    -ORDER BY 1 NULLS FIRST, 2 NULLS FIRST
    -]]></sql>
    -</code-pair><html>
    -
    -									<p>
    -										The results would then hold:
    -									</p>
    -
    -</html><text><![CDATA[+-----------+--------------+----------+
    -| AUTHOR_ID | PUBLISHED_IN | COUNT(*) |
    -+-----------+--------------+----------+
    -|      NULL |         NULL |        2 | <- GROUP BY ()
    -|      NULL |         1945 |        1 | <- GROUP BY (PUBLISHED_IN)
    -|      NULL |         1948 |        1 | <- GROUP BY (PUBLISHED_IN)
    -|      NULL |         1988 |        1 | <- GROUP BY (PUBLISHED_IN)
    -|      NULL |         1990 |        1 | <- GROUP BY (PUBLISHED_IN)
    -|         1 |         NULL |        2 | <- GROUP BY (AUTHOR_ID)
    -|         1 |         1945 |        1 | <- GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -|         1 |         1948 |        1 | <- GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -|         2 |         NULL |        2 | <- GROUP BY (AUTHOR_ID)
    -|         2 |         1988 |        1 | <- GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -|         2 |         1990 |        1 | <- GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -+-----------+--------------+----------+]]></text><html>
    -
    -									<h3>GROUPING SETS()</h3>
    -									<p>
    -										<code>GROUPING SETS()</code> are the generalised way to create multiple groupings. From our previous examples 
    -									</p>
    -									<ul>
    -										<li><code>ROLLUP(AUTHOR_ID, PUBLISHED_IN)</code> corresponds to <code>GROUPING SETS((AUTHOR_ID, PUBLISHED_IN), (AUTHOR_ID), ())</code></li>
    -										<li><code>CUBE(AUTHOR_ID, PUBLISHED_IN)</code> corresponds to <code>GROUPING SETS((AUTHOR_ID, PUBLISHED_IN), (AUTHOR_ID), (PUBLISHED_IN), ())</code></li>
    -									</ul>
    -									<p>
    -										This is nicely explained in the SQL Server manual pages about <code>GROUPING SETS()</code> and other grouping functions:<br/>
    -										<a href="http://msdn.microsoft.com/en-us/library/bb510427(v=sql.105)">http://msdn.microsoft.com/en-us/library/bb510427(v=sql.105)</a>
    -									</p>
    -									
    -									<h3>jOOQ's support for ROLLUP(), CUBE(), GROUPING SETS()</h3>
    -									<p>
    -										jOOQ fully supports all of these functions, as well as the utility functions <code>GROUPING()</code> and <code>GROUPING_ID()</code>, used for identifying the grouping set ID of a record. The <reference id="factory" title="Factory API"/> thus includes:
    -									</p>
    -									
    -</html><java><![CDATA[// The various grouping function constructors
    -Field<?> rollup(Field<?>... fields);
    -Field<?> cube(Field<?>... fields);
    -Field<?> groupingSets(Field<?>... fields);
    -Field<?> groupingSets(Field<?>[]... fields);
    -Field<?> groupingSets(Collection<Field<?>>... fields);
    -
    -// The utility functions generating IDs per GROUPING SET
    -Field<Integer> grouping(Field<?>);
    -Field<Integer> groupingId(Field<?>...);]]></java><html>
    -
    -									<h3>MySQL's and CUBRID's WITH ROLLUP syntax</h3>
    -									<p>
    -										MySQL and CUBRID don't know any grouping functions, but they support a <code>WITH ROLLUP</code> clause, that is equivalent to simple <code>ROLLUP()</code> grouping functions. jOOQ simulates <code>ROLLUP()</code> in MySQL and CUBRID, by rendering this <code>WITH ROLLUP</code> clause. The following two statements mean the same:
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[-- Statement 1: SQL standard
    -GROUP BY ROLLUP(A, B, C)
    -
    --- Statement 2: SQL standard
    -GROUP BY A, ROLLUP(B, C)]]></sql><sql><![CDATA[-- Statement 1: MySQL
    -GROUP BY A, B, C WITH ROLLUP
    -
    --- Statement 2: MySQL
    --- This is not supported in MySQL]]></sql>
    -</code-pair><html>
    -								</html></content>
    -							</section>
    -
    -							<section id="user-defined-functions">
    -								<title>User-defined functions</title>
    -								<content><html>
    -									<p>
    -										Some databases support user-defined functions, which can be embedded in any SQL statement, if you're using jOOQ's <reference id="code-generation" title="code generator"/>. Let's say you have the following simple function in Oracle SQL:
    -									</p>
    -									
    -</html><sql><![CDATA[CREATE OR REPLACE FUNCTION echo (INPUT NUMBER)
    -RETURN NUMBER
    -IS
    -BEGIN
    -    RETURN INPUT;
    -END echo;
    -]]></sql><html>
    -
    -                                    <p>
    -                                    	The above function will be made available from a generated <reference id="codegen-procedures" title="Routines"/> class. You can use it like any other <reference id="column-expressions" title="column expression"/>:
    -                                    </p>
    -                                    
    -</html><code-pair>
    -<sql><![CDATA[SELECT echo(1) FROM DUAL WHERE echo(2) = 2]]></sql><java><![CDATA[create.select(echo(1)).where(echo(2).equal(2));]]></java>
    -</code-pair><html>
    -                                
    -                                	<p>
    -                                		Note that user-defined functions returning <reference id="data-types-cursors" title="CURSOR"/> or <reference id="data-types-arrays" title="ARRAY"/> data types can also be used wherever <reference id="table-expressions" title="table expressions"/> can be used, if they are <reference id="array-and-cursor-unnesting" title="unnested"/>
    -                                	</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="user-defined-aggregate-functions">
    -								<title>User-defined aggregate functions</title>
    -								<content><html>
    -									<p>
    -										Some databases support user-defined aggregate functions, which can then be used along with <reference id="group-by-clause" title="GROUP BY clauses"/> or as <reference id="window-functions" title="window functions"/>. An example for such a database is Oracle. With Oracle, you can define the following OBJECT type (the example was taken from the <a href="http://docs.oracle.com/cd/B28359_01/appdev.111/b28425/ext_agg_ref.htm">Oracle 11g documentation</a>): 
    -									</p>
    -									
    -</html><sql><![CDATA[CREATE TYPE U_SECOND_MAX AS OBJECT
    -(
    -  MAX NUMBER, -- highest value seen so far
    -  SECMAX NUMBER, -- second highest value seen so far
    -  STATIC FUNCTION ODCIAggregateInitialize(sctx IN OUT U_SECOND_MAX) RETURN NUMBER,
    -  MEMBER FUNCTION ODCIAggregateIterate(self IN OUT U_SECOND_MAX, value IN NUMBER) RETURN NUMBER,
    -  MEMBER FUNCTION ODCIAggregateTerminate(self IN U_SECOND_MAX, returnValue OUT NUMBER, flags IN NUMBER) RETURN NUMBER,
    -  MEMBER FUNCTION ODCIAggregateMerge(self IN OUT U_SECOND_MAX, ctx2 IN U_SECOND_MAX) RETURN NUMBER
    -);
    -
    -CREATE OR REPLACE TYPE BODY U_SECOND_MAX IS
    -STATIC FUNCTION ODCIAggregateInitialize(sctx IN OUT U_SECOND_MAX)
    -RETURN NUMBER IS
    -BEGIN
    -  SCTX := U_SECOND_MAX(0, 0);
    -  RETURN ODCIConst.Success;
    -END;
    -
    -MEMBER FUNCTION ODCIAggregateIterate(self IN OUT U_SECOND_MAX, value IN NUMBER) RETURN NUMBER IS
    -BEGIN
    -  IF VALUE > SELF.MAX THEN
    -    SELF.SECMAX := SELF.MAX;
    -    SELF.MAX := VALUE;
    -  ELSIF VALUE > SELF.SECMAX THEN
    -    SELF.SECMAX := VALUE;
    -  END IF;
    -  RETURN ODCIConst.Success;
    -END;
    -
    -MEMBER FUNCTION ODCIAggregateTerminate(self IN U_SECOND_MAX, returnValue OUT NUMBER, flags IN NUMBER) RETURN NUMBER IS
    -BEGIN
    -  RETURNVALUE := SELF.SECMAX;
    -  RETURN ODCIConst.Success;
    -END;
    -
    -MEMBER FUNCTION ODCIAggregateMerge(self IN OUT U_SECOND_MAX, ctx2 IN U_SECOND_MAX) RETURN NUMBER IS
    -BEGIN
    -  IF CTX2.MAX > SELF.MAX THEN
    -    IF CTX2.SECMAX > SELF.SECMAX THEN
    -      SELF.SECMAX := CTX2.SECMAX;
    -    ELSE
    -      SELF.SECMAX := SELF.MAX;
    -    END IF;
    -    SELF.MAX := CTX2.MAX;
    -  ELSIF CTX2.MAX > SELF.SECMAX THEN
    -    SELF.SECMAX := CTX2.MAX;
    -  END IF;
    -  RETURN ODCIConst.Success;
    -END;
    -END;]]></sql><html>
    -
    -									<p>
    -										The above OBJECT type is then available to function declarations as such:
    -									</p>
    -
    -</html><sql><![CDATA[
    -CREATE FUNCTION SECOND_MAX (input NUMBER) RETURN NUMBER
    -PARALLEL_ENABLE AGGREGATE USING U_SECOND_MAX;]]></sql><html>
    -
    -									<h3>Using the generated aggregate function</h3>
    -									<p>
    -										jOOQ's <reference id="code-generation" title="code generator"/> will detect such aggregate functions and generate them differently from regular <reference id="user-defined-functions" title="user-defined functions"/>. They implement the <reference class="org.jooq.AggregateFunction"/> type, as mentioned in the manual's section about <reference id="aggregate-functions" title="aggregate functions"/>. Here's how you can use the SECOND_MAX() aggregate function with jOOQ:
    -									</p>
    -				
    -</html><code-pair>					
    -<sql><![CDATA[-- Get the second-latest publishing date by author
    -SELECT SECOND_MAX(PUBLISHED_IN) 
    -FROM BOOK
    -GROUP BY AUTHOR_ID]]></sql><java><![CDATA[// Routines.secondMax() can be static-imported
    -create.select(secondMax(BOOK.PUBLISHED_IN))
    -      .from(BOOK)
    -      .groupBy(BOOK.AUTHOR_ID)]]></java>
    -</code-pair><html>
    -								</html></content>
    -							</section>
    -
    -							<section id="case-expressions">
    -								<title>The CASE expression</title>
    -								<content><html>
    -									<p>
    -										The CASE expression is part of the standard SQL syntax. While some RDBMS also offer an IF expression, or a DECODE function, you can always rely on the two types of CASE syntax:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[CASE WHEN AUTHOR.FIRST_NAME = 'Paulo'  THEN 'brazilian'
    -     WHEN AUTHOR.FIRST_NAME = 'George' THEN 'english'
    -                                       ELSE 'unknown'
    -END
    -
    --- OR:
    -
    -CASE AUTHOR.FIRST_NAME WHEN 'Paulo'  THEN 'brazilian'
    -                       WHEN 'George' THEN 'english'
    -                                     ELSE 'unknown'
    -END]]></sql><java><![CDATA[create.decode()
    -      .when(AUTHOR.FIRST_NAME.equal("Paulo"), "brazilian")
    -      .when(AUTHOR.FIRST_NAME.equal("George"), "english")
    -      .otherwise("unknown");
    -
    -// OR:
    -
    -create.decode().value(AUTHOR.FIRST_NAME)
    -               .when("Paulo", "brazilian")
    -               .when("George", "english")
    -               .otherwise("unknown");]]></java>
    -</code-pair><html>
    -
    -								<p>
    -									In jOOQ, both syntaxes are supported (The second one is simulated in Derby, which only knows the first one). Unfortunately, both case and else are reserved words in Java. jOOQ chose to use decode() from the Oracle DECODE function, and otherwise(), which means the same as else.
    -								</p>
    -
    -								<p>
    -									A CASE expression can be used anywhere where you can place a <reference id="column-expressions" title="column expression (or Field)"/>. For instance, you can SELECT the above expression, if you're selecting from AUTHOR:
    -							 	</p>
    -
    -</html><sql>SELECT AUTHOR.FIRST_NAME, [... CASE EXPR ...] AS nationality
    -  FROM AUTHOR</sql><html>
    -
    -								<h3>The Oracle DECODE() function</h3>
    -								<p>
    -									Oracle knows a more succinct, but maybe less readable DECODE() function with a variable number of arguments. This function roughly does the same as the second case expression syntax. jOOQ supports the DECODE() function and simulates it using CASE expressions in all dialects other than Oracle:
    -								</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[-- Oracle:
    -DECODE(FIRST_NAME, 'Paulo', 'brazilian',
    -                   'George', 'english',
    -                   'unknown');
    -
    --- Other SQL dialects
    -CASE AUTHOR.FIRST_NAME WHEN 'Paulo'  THEN 'brazilian'
    -                       WHEN 'George' THEN 'english'
    -                                     ELSE 'unknown'
    -END]]></sql><java><![CDATA[
    -
    -
    -
    -
    -// Use the Oracle-style DECODE() function with jOOQ.
    -// Note, that you will not be able to rely on type-safety
    -create.decode(AUTHOR.FIRST_NAME,
    -    "Paulo", "brazilian",
    -    "George", "english",
    -    "unknown");]]></java>
    -</code-pair><html>
    -
    -		  							<h3>CASE clauses in an ORDER BY clause</h3>
    -									<p>
    -										Sort indirection is often implemented with a CASE clause of a SELECT's ORDER BY clause. See the manual's section about the <reference id="order-by-clause" title="ORDER BY clause"/> for more details.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="sequences-and-serials">
    -								<title>Sequences and serials</title>
    -								<content><html>
    -									<p>
    -										Sequences implement the <reference class="org.jooq.Sequence"/> interface, providing essentially this functionality:
    -									</p>
    -
    -</html><java><![CDATA[// Get a field for the CURRVAL sequence property
    -Field<T> currval();
    -
    -// Get a field for the NEXTVAL sequence property
    -Field<T> nextval();]]></java><html>
    -
    -									<p>
    -										So if you have a sequence like this in Oracle:
    -									</p>
    -
    -</html><sql>CREATE SEQUENCE s_author_id</sql><html>
    -
    -									<p>
    -										You can then use your <reference id="codegen-sequences" title="generated sequence"/> object directly in a SQL statement as such:
    -									</p>
    -
    -</html><java><![CDATA[// Reference the sequence in a SELECT statement:
    -BigInteger nextID = create.select(s).fetchOne(S_AUTHOR_ID.nextval());
    -
    -// Reference the sequence in an INSERT statement:
    -create.insertInto(AUTHOR, AUTHOR.ID, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -      .values(S_AUTHOR_ID.nextval(), val("William"), val("Shakespeare"));
    -]]></java><html>
    -
    -									<ul>
    -										<li>For more information about generated sequences, refer to the manual's section about <reference id="codegen-sequences" title="generated sequences"/></li>
    -										<li>For more information about executing standalone calls to sequences, refer to the manual's section about <reference id="sequence-execution" title="sequence execution"/></li>
    -									</ul>
    -								</html></content>
    -							</section>
    -							
    -							<section id="row-value-expressions">
    -								<title>Tuples or row value expressions</title>
    -								<content><html>
    -									<p>
    -										According to the SQL standard, row value expressions can have a degree of more than one. This is commonly used in the <reference id="insert-statement" title="INSERT statement"/>, where the VALUES row value constructor allows for providing a row value expression as a source for INSERT data. Row value expressions can appear in various other places, though. They are supported by jOOQ as s / rows. jOOQ's <reference id="factory" title="Factory"/> allows for the construction of type-safe s up to the degree / arity of 8. Higher-degree s are supported as well, but without any type-safety.  types are modelled as follows:
    -									</p>
    -									
    -</html><java><![CDATA[// The Factory provides overloaded row value expression constructor methods:
    -public static <T1> Row1<T1> row(T1 t1) { ... }
    -public static <T1, T2> Row2<T1, T2> row(T1 t1, T2 t2) { ... }
    -public static <T1, T2, T3> Row3<T1, T2, T3> row(T1 t1, T2 t2, T3 t3) { ... }
    -public static <T1, T2, T3, T4> Row4<T1, T2, T3, T4> row(T1 t1, T2 t2, T3 t3, T4 t4) { ... }
    -
    -// [ ... idem for Row5, Row6, Row7, Row8 ... ]
    -
    -// Degrees of more than 8 are supported without type-safety
    -public static RowN row(Object... values) { ... }]]></java><html>
    -
    -									<h3>Using row value expressions in predicates</h3>
    -                                	<p>
    -                                		Row value expressions are incompatible with most other <reference id="queryparts" title="QueryParts"/>, but they can be used as a basis for constructing various <reference id="conditional-expressions" title="conditional expressions"/>, such as <reference id="comparison-predicate" title="comparison predicates"/>, <reference id="in-predicate" title="IN predicates"/>, or the "degree 2 row value expression only" <reference id="overlaps-predicate" title="OVERLAPS predicate"/>. See the relevant sections for more details about how to use row value expressions in predicates.
    -                                	</p>
    -                                	
    -                                	<h3>Using row value expressions in UPDATE statements</h3>
    -                                	<p>
    -                                		The <reference id="update-statement" title="UPDATE statement"/> also supports a variant where row value expressions are updated, rather than single columns. See the relevant section for more details
    -                                	</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -					<section id="conditional-expressions">
    -					    <title>Conditional expressions</title>
    -						<content><html>
    -							<p>
    -								Conditions or conditional expressions are widely used in SQL and in the jOOQ API. They can be used in
    -							</p>
    -							<ul>
    -								<li>The <reference id="case-expressions" title="CASE expression"/></li>
    -								<li>The <reference id="join-clause" title="JOIN clause"/> (or JOIN .. ON clause, to be precise) of a <reference id="select-statement" title="SELECT statement"/>, <reference id="update-statement" title="UPDATE statement"/>, <reference id="delete-statement" title="DELETE statement"/></li>
    -								<li>The <reference id="where-clause" title="WHERE clause"/> of a <reference id="select-statement" title="SELECT statement"/>, <reference id="update-statement" title="UPDATE statement"/>, <reference id="delete-statement" title="DELETE statement"/></li>
    -								<li>The <reference id="connect-by-clause" title="CONNECT BY clause"/> of a <reference id="select-statement" title="SELECT statement"/></li>
    -								<li>The <reference id="having-clause" title="HAVING clause"/> of a <reference id="select-statement" title="SELECT statement"/></li>
    -								<li>The <reference id="merge-statement" title="MERGE statement"/>'s ON clause</li>
    -							</ul>
    -							
    -							<h3>Boolean types in SQL</h3>
    -							<p>
    -								Before SQL:1999, boolean types did not really exist in SQL. They were modelled by 0 and 1 numeric/char values. With SQL:1999, true booleans were introduced and are now supported by most databases. In short, these are possible boolean values:
    -							</p>
    -							<ul>
    -								<li>1 or TRUE</li>
    -								<li>0 or FALSE</li>
    -								<li>NULL or UNKNOWN</li>
    -							</ul>
    -							<p>
    -								It is important to know that SQL differs from many other languages in the way it interprets the NULL boolean value. Most importantly, the following facts are to be remembered:
    -							</p>
    -							<ul>
    -								<li>[ANY] = NULL yields NULL (not FALSE)</li>
    -								<li>[ANY] != NULL yields NULL (not TRUE)</li>
    -								<li>NULL = NULL yields NULL (not TRUE)</li>
    -								<li>NULL != NULL yields NULL (not FALSE)</li>
    -							</ul>
    -							<p>
    -								For simplified NULL handling, please refer to the section about the <reference id="distinct-predicate" title="DISTINCT predicate"/>.
    -							</p>
    -							<p>
    -								Note that jOOQ does not model these values as actual <reference id="column-expressions" title="column expression"/> compatible.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -						    <section id="condition-building">
    -							    <title>Condition building</title>
    -								<content><html>
    -									<p>
    -										With jOOQ, most <reference id="conditional-expressions" title="conditional expressions"/> are built from <reference id="column-expressions" title="column expressions"/>, calling various methods on them. For instance, to build a <reference id="comparison-predicate" title="comparison predicate"/>, you can write the following expression:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[TITLE  = 'Animal Farm'
    -TITLE != 'Animal Farm']]></sql><java><![CDATA[BOOK.TITLE.equal("Animal Farm")
    -BOOK.TITLE.notEqual("Animal Farm")]]></java>
    -</code-pair><html>
    -
    -									<h3>Create conditions from the Factory</h3>
    -									<p>
    -										There are a few types of conditions, that can be created statically from the <reference id="factory" title="Factory"/>. These are:
    -									</p>
    -									<ul>
    -										<li><reference id="plain-sql" title="plain SQL conditions"/>, that allow you to phrase your own SQL string <reference id="conditional-expressions" title="conditional expression"/></li>
    -										<li>The <reference id="exists-predicate" title="EXISTS predicate"/>, a standalone predicate that creates a conditional expression</li>
    -										<li>Constant TRUE and FALSE conditional expressions</li>
    -									</ul>
    -
    -									<h3>Connect conditions using boolean operators</h3>
    -									<p>
    -										Conditions can also be connected using <reference id="boolean-operators" title="boolean operators"/> as will be discussed in a subsequent chapter.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -						    <section id="boolean-operators">
    -							    <title>AND, OR, NOT boolean operators</title>
    -								<content><html>
    -									<p>
    -										In SQL, as in most other languages, <reference id="conditional-expressions" title="conditional expressions"/> can be connected using the AND and OR binary operators, as well as the NOT unary operator, to form new conditional expressions. In jOOQ, this is modelled as such: 
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[-- A simple conditional expression
    -TITLE = 'Animal Farm' OR TITLE = '1984'
    -
    --- A more complex conditional expression
    -        (TITLE = 'Animal Farm' OR TITLE = '1984') 
    -AND NOT (AUTHOR.LAST_NAME = 'Orwell')]]></sql><java><![CDATA[// A simple boolean connection
    -BOOK.TITLE.equal("Animal Farm").or(BOOK.TITLE.equal("1984"))
    -
    -// A more complex conditional expression
    -BOOK.TITLE.equal("Animal Farm").or(BOOK.TITLE.equal("1984"))
    -    .andNot(AUTHOR.LAST_NAME.equal("Orwell"))]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										The above example shows that the number of parentheses in Java can quickly explode. Proper indentation may become crucial in making such code readable. In order to understand how jOOQ composes combined conditional expressions, let's assign component expressions first:
    -									</p>
    -
    -</html><java><![CDATA[Condition a = BOOK.TITLE.equal("Animal Farm");
    -Condition b = BOOK.TITLE.equal("1984");
    -Condition c = AUTHOR.LAST_NAME.equal("Orwell");
    -
    -Condition combined1 = a.or(b);             // These OR-connected conditions form a new condition, wrapped in parentheses
    -Condition combined2 = combined1.andNot(c); // The left-hand side of the AND NOT () operator is already wrapped in parentheses]]></java><html>
    -
    -									<h3>The Condition API</h3>
    -									<p>
    -										Here are all boolean operators on the <reference class="org.jooq.Condition"/> interface:
    -									</p>
    -									
    -</html><java><![CDATA[and(Condition)            // Combine conditions with AND
    -and(String)               // Combine conditions with AND. Convenience for adding plain SQL to the right-hand side
    -and(String, Object...)    // Combine conditions with AND. Convenience for adding plain SQL to the right-hand side
    -and(String, QueryPart...) // Combine conditions with AND. Convenience for adding plain SQL to the right-hand side
    -andExists(Select<?>)      // Combine conditions with AND. Convenience for adding an exists predicate to the rhs
    -andNot(Condition)         // Combine conditions with AND. Convenience for adding an inverted condition to the rhs
    -andNotExists(Select<?>)   // Combine conditions with AND. Convenience for adding an inverted exists predicate to the rhs
    -
    -or(Condition)             // Combine conditions with OR
    -or(String)                // Combine conditions with OR. Convenience for adding plain SQL to the right-hand side
    -or(String, Object...)     // Combine conditions with OR. Convenience for adding plain SQL to the right-hand side
    -or(String, QueryPart...)  // Combine conditions with OR. Convenience for adding plain SQL to the right-hand side
    -orExists(Select<?>)       // Combine conditions with OR. Convenience for adding an exists predicate to the rhs
    -orNot(Condition)          // Combine conditions with OR. Convenience for adding an inverted condition to the rhs
    -orNotExists(Select<?>)    // Combine conditions with OR. Convenience for adding an inverted exists predicate to the rhs
    -
    -not()                     // Invert a condition (synonym for Factory.not(Condition)]]></java></content>
    -							</section>
    -
    -						    <section id="comparison-predicate">
    -							    <title>Comparison predicate</title>
    -								<content><html>
    -									<p>
    -										In SQL, comparison predicates are formed using common comparison operators:
    -									</p>
    -									<ul>
    -										<li><strong>=</strong> to test for equality</li>
    -										<li><strong>&lt;&gt;</strong> or <strong>!=</strong> to test for non-equality</li>
    -										<li><strong>&gt;</strong> to test for being strictly greater</li>
    -										<li><strong>&gt;=</strong> to test for being greater or equal</li>
    -										<li><strong>&lt;</strong> to test for being strictly less</li>
    -										<li><strong>&lt;=</strong> to test for being less or equal</li>
    -									</ul>
    -									
    -									<p>
    -										Unfortunately, Java does not support operator overloading, hence these operators are also implemented as methods in jOOQ, like any other SQL syntax elements. The relevant parts of the <reference class="org.jooq.Field"/> interface are these:
    -									</p>
    -									
    -</html><java><![CDATA[eq or equal(T);                  // =  (some bind value)
    -eq or equal(Field<T>);           // =  (some column expression)
    -eq or equal(Select<T>);          // =  (some scalar SELECT statement)
    -ne or notEqual(T);               // <> (some bind value)
    -ne or notEqual(Field<T>);        // <> (some column expression)
    -ne or notEqual(Select<T>);       // <> (some scalar SELECT statement)
    -lt or lessThan(T);               // <  (some bind value)
    -lt or lessThan(Field<T>);        // <  (some column expression)
    -lt or lessThan(Select<T>);       // <  (some scalar SELECT statement)
    -le or lessOrEqual(T);            // <= (some bind value)
    -le or lessOrEqual(Field<T>);     // <= (some column expression)
    -le or lessOrEqual(Select<T>);    // <= (some scalar SELECT statement)
    -gt or greaterThan(T);            // >  (some bind value)
    -gt or greaterThan(Field<T>);     // >  (some column expression)
    -gt or greaterThan(Select<T>);    // >  (some scalar SELECT statement)
    -ge or greaterOrEqual(T);         // >= (some bind value)
    -ge or greaterOrEqual(Field<T>);  // >= (some column expression)
    -ge or greaterOrEqual(Select<T>); // >= (some scalar SELECT statement)]]></java><html>
    -
    -									<p>
    -										Note that every operator is represented by two methods. A verbose one (such as equal()) and a two-character one (such as eq()). Both methods are the same. You may choose either one, depending on your taste. The manual will always use the more verbose one.
    -									</p>
    -									
    -									<h3>NULL in jOOQ's comparison predicates</h3>
    -									<p>
    -										jOOQ has a special way of dealing with null bind values, when you pass them to comparison predicates equal() and notEqual(). For convenience, jOOQ will render <reference id="null-predicate" title="IS NULL or IS NOT NULL"/> predicates.
    -									</p>
    -
    -									<h3>jOOQ's convenience methods using comparison operators</h3>
    -									<p>
    -										In addition to the above, jOOQ provides a few convenience methods for common operations performed on strings using comparison predicates:
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[-- case insensitivity
    -LOWER(TITLE)  = LOWER('animal farm')
    -LOWER(TITLE) <> LOWER('animal farm')]]></sql><java><![CDATA[// case insensitivity
    -BOOK.TITLE.equalIgnoreCase("animal farm")
    -BOOK.TITLE.notEqualIgnoreCase("animal farm")]]></java>
    -</code-pair><html>
    -								</html></content>
    -							</section>
    -
    -						    <section id="quantified-comparison-predicate">
    -							    <title>Quantified comparison predicate</title>
    -								<content><html>
    -									<p>
    -										If the right-hand side of a <reference id="comparison-predicate" title="comparison predicate"/> turns out to be a non-scalar table subquery, you can wrap that subquery in a quantifier, such as ALL, ANY, or SOME. Note that the SQL standard defines ANY and SOME to be equivalent. jOOQ settled for the more intuitive ANY and doesn't support SOME. Here are some examples, supported by jOOQ:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[TITLE = ANY('Animal Farm', '1982')
    -PUBLISHED_IN > ALL(1920, 1940)]]></sql><java><![CDATA[BOOK.TITLE.equalAny("Animal Farm", "1982");
    -BOOK.PUBLISHED_IN.greaterThanAll(1920, 1940);]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										For the example, the right-hand side of the quantified comparison predicates were filled with argument lists. But it is easy to imagine that the source of values results from a <reference id="nested-selects" title="subselect"/>.
    -									</p>
    -
    -									<h3>ANY and the IN predicate</h3>
    -									<p>
    -										It is interesting to note that the SQL standard defines the <reference id="in-predicate" title="IN predicate"/> in terms of the ANY-quantified predicate. The following two expressions are equivalent:
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[[ROW VALUE EXPRESSION] IN [IN PREDICATE VALUE]]]></sql><sql><![CDATA[[ROW VALUE EXPRESSION] = ANY [IN PREDICATE VALUE]]]></sql>
    -</code-pair><html>
    -
    -									<p>
    -										Typically, the <reference id="in-predicate" title="IN predicate"/> is more readable than the quantified comparison predicate.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -						    <section id="null-predicate">
    -							    <title>NULL predicate</title>
    -								<content><html>
    -									<p>
    -										In SQL, you cannot compare NULL with any value using <reference id="comparison-predicate" title="comparison predicates"/>, as the result would yield NULL again, which is neither TRUE nor FALSE (see also the manual's section about <reference id="conditional-expressions" title="conditional expressions"/>). In order to test a <reference id="column-expressions" title="column expression"/> for NULL, use the NULL predicate as such:
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[TITLE IS NULL
    -TITLE IS NOT NULL]]></sql><java><![CDATA[BOOK.TITLE.isNull()
    -BOOK.TITLE.isNotNull()]]></java>
    -</code-pair><html>
    -
    -								</html></content>
    -							</section>
    -
    -						    <section id="distinct-predicate">
    -							    <title>DISTINCT predicate</title>
    -								<content><html>
    -									<p>
    -										Some databases support the DISTINCT predicate, which serves as a convenient, NULL-safe <reference id="comparison-predicate" title="comparison predicate"/>. With the DISTINCT predicate, the following truth table can be assumed:
    -									</p>
    -									<ul>
    -										<li>[ANY] IS DISTINCT FROM NULL yields TRUE</li>
    -										<li>[ANY] IS NOT DISTINCT FROM NULL yields FALSE</li>
    -										<li>NULL IS DISTINCT FROM NULL yields FALSE</li>
    -										<li>NULL IS NOT DISTINCT FROM NULL yields TRUE</li>
    -									</ul>
    -									<p>
    -										For instance, you can compare two fields for distinctness, ignoring the fact that any of the two could be NULL, which would lead to funny results. This is supported by jOOQ as such:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[TITLE IS DISTINCT FROM SUB_TITLE
    -TITLE IS NOT DISTINCT FROM SUB_TITLE]]></sql><java><![CDATA[BOOK.TITLE.isDistinctFrom(BOOK.SUB_TITLE)
    -BOOK.TITLE.isNotDistinctFrom(BOOK.SUB_TITLE)]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										If your database does not natively support the DISTINCT predicate, jOOQ simulates it with an equivalent <reference id="case-expressions" title="CASE expression"/>, modelling the above truth table:
    -									</p>
    -	
    -</html><code-pair>								
    -<sql><![CDATA[-- [A] IS DISTINCT FROM [B] 
    -CASE WHEN [A] IS     NULL AND [B] IS     NULL THEN FALSE
    -     WHEN [A] IS     NULL AND [B] IS NOT NULL THEN TRUE
    -     WHEN [A] IS NOT NULL AND [B] IS     NULL THEN TRUE
    -     WHEN [A] =               [B]             THEN FALSE
    -     ELSE                                          TRUE
    -END
    -]]></sql><sql><![CDATA[-- [A] IS NOT DISTINCT FROM [B] 
    -CASE WHEN [A] IS     NULL AND [B] IS     NULL THEN TRUE
    -     WHEN [A] IS     NULL AND [B] IS NOT NULL THEN FALSE
    -     WHEN [A] IS NOT NULL AND [B] IS     NULL THEN FALSE
    -     WHEN [A] =               [B]             THEN TRUE
    -     ELSE                                          FALSE
    -END
    -]]></sql>
    -</code-pair><html>							
    -								</html></content>
    -							</section>
    -
    -						    <section id="between-predicate">
    -							    <title>BETWEEN predicate</title>
    -								<content><html>
    -									<p>
    -										The BETWEEN predicate can be seen as syntactic sugar for a pair of <reference id="comparison-predicate" title="comparison predicates"/>. According to the SQL standard, the following two predicates are equivalent:
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[[A] BETWEEN [B] AND [C]]]></sql><sql><![CDATA[[A] >= [B] AND [A] <= [C]]]></sql>
    -</code-pair><html>
    -
    -									<p>
    -										Note the inclusiveness of range boundaries in the definition of the BETWEEN predicate. Intuitively, this is supported in jOOQ as such:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[PUBLISHED_IN     BETWEEN 1920 AND 1940
    -PUBLISHED_IN NOT BETWEEN 1920 AND 1940]]></sql><java><![CDATA[BOOK.PUBLISHED_IN.between(1920).and(1940)
    -BOOK.PUBLISHED_IN.notBetween(1920).and(1940)]]></java>
    -</code-pair><html>
    -
    -									<h3>BETWEEN SYMMETRIC</h3>
    -									<p>
    -										The SQL standard defines the SYMMETRIC keyword to be used along with BETWEEN to indicate that you do not care which bound of the range is larger than the other. A database system should simply swap range bounds, in case the first bound is greater than the second one. jOOQ supports this keyword as well, simulating it if necessary.
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[PUBLISHED_IN     BETWEEN SYMMETRIC 1940 AND 1920
    -PUBLISHED_IN NOT BETWEEN SYMMETRIC 1940 AND 1920]]></sql><java><![CDATA[BOOK.PUBLISHED_IN.betweenSymmetric(1940).and(1920)
    -BOOK.PUBLISHED_IN.notBetweenSymmetric(1940).and(1920)]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										The simulation is done trivially:
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[[A] BETWEEN SYMMETRIC [B] AND [C]]]></sql><sql><![CDATA[([A] BETWEEN [B] AND [C]) OR ([A] BETWEEN [C] AND [B])]]></sql>
    -</code-pair><html>
    -
    -								</html></content>
    -							</section>
    -
    -						    <section id="like-predicate">
    -							    <title>LIKE predicate</title>
    -								<content><html>
    -									<p>
    -										LIKE predicates are popular for simple wildcard-enabled pattern matching. Supported wildcards in all SQL databases are:
    -									</p>
    -									<ul>
    -										<li><strong>_</strong>: (single-character wildcard)</li>
    -										<li><strong>%</strong>: (multi-character wildcard)</li>
    -									</ul>
    -									<p>
    -										With jOOQ, the LIKE predicate can be created from any <reference id="column-expressions" title="column expression"/> as such:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[TITLE     LIKE '%abc%'
    -TITLE NOT LIKE '%abc%']]></sql><java><![CDATA[BOOK.TITLE.like("%abc%")
    -BOOK.TITLE.notLike("%abc%")]]></java>
    -</code-pair><html>
    -									
    -									<h3>Escaping operands with the LIKE predicate</h3>
    -									<p>
    -										Often, your pattern may contain any of the wildcard characters "_" and "%", in case of which you may want to escape them. jOOQ does not automatically escape patterns in like() and notLike() methods. Instead, you can explicitly define an escape character as such:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[TITLE     LIKE '%The !%-Sign Book%' ESCAPE '!'
    -TITLE NOT LIKE '%The !%-Sign Book%' ESCAPE '!']]></sql><java><![CDATA[BOOK.TITLE.like("%The !%-Sign Book%", '!')
    -BOOK.TITLE.notLike("%The !%-Sign Book%", '!')]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										In the above predicate expressions, the exclamation mark character is passed as the escape character to escape wildcard characters "!_" and "!%", as well as to escape the escape character itself: "!!"
    -									</p>
    -									<p>
    -										Please refer to your database manual for more details about escaping patterns with the LIKE predicate.
    -									</p>
    -									
    -									<h3>jOOQ's convenience methods using the LIKE predicate</h3>
    -									<p>
    -										In addition to the above, jOOQ provides a few convenience methods for common operations performed on strings using the LIKE predicate. Typical operations are "contains predicates", "starts with predicates", "ends with predicates", etc. Here is the full convenience API wrapping LIKE predicates:
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[-- case insensitivity
    -LOWER(TITLE) LIKE LOWER('%abc%')
    -LOWER(TITLE) NOT LIKE LOWER('%abc%')
    -
    --- contains and similar methods
    -TITLE LIKE '%' || 'abc' || '%'
    -TITLE LIKE 'abc' || '%'
    -TITLE LIKE '%' || 'abc']]></sql><java><![CDATA[// case insensitivity
    -BOOK.TITLE.likeIgnoreCase("%abc%")
    -BOOK.TITLE.notLikeIgnoreCase("%abc%")
    -
    -// contains and similar methods
    -BOOK.TITLE.contains("abc")
    -BOOK.TITLE.startsWith("abc")
    -BOOK.TITLE.endsWith("abc")]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										Note, that jOOQ escapes % and _ characters in value in some of the above predicate implementations. For simplicity, this has been omitted in this manual.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -						    <section id="in-predicate">
    -							    <title>IN predicate</title>
    -								<content><html>
    -									<p>
    -										In SQL, apart from comparing a value against several values, the IN predicate can be used to create semi-joins or anti-joins. jOOQ knows the following methods on the <reference class="org.jooq.Field" /> interface, to construct such IN predicates:
    -									</p>
    -
    -</html><java><![CDATA[in(Collection<T>)    // Construct an IN predicate from a collection of bind values
    -in(T...)             // Construct an IN predicate from bind values
    -in(Field<?>...)      // Construct an IN predicate from column expressions
    -in(Select<?>)        // Construct an IN predicate from a subselect
    -notIn(Collection<T>) // Construct a NOT IN predicate from a collection of bind values
    -notIn(T...)          // Construct a NOT IN predicate from bind values
    -notIn(Field<?>...)   // Construct a NOT IN predicate from column expressions
    -notIn(Select<?>)     // Construct a NOT IN predicate from a subselect]]></java><html>
    -
    -									<p>
    -										A sample IN predicate might look like this:
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[TITLE     IN ('Animal Farm', '1984')
    -TITLE NOT IN ('Animal Farm', '1984')]]></sql><java><![CDATA[BOOK.TITLE.in("Animal Farm", "1984")
    -BOOK.TITLE.notIn("Animal Farm", "1984")]]></java>
    -</code-pair><html>
    -
    -									
    -									<h3>NOT IN and NULL values</h3>
    -									<p>
    -										Beware that you should probably not have any NULL values in the right hand side of a NOT IN predicate, as the whole expression would evaluate to NULL, which is rarely desired. This can be shown informally using the following reasoning:
    -									</p>
    -									
    -</html><sql>-- The following conditional expressions are formally or informally equivalent
    -A NOT IN (B, C)
    -A != ANY(B, C)
    -A != B AND A != C
    -
    --- Substitute C for NULL, you'll get
    -A NOT IN (B, NULL)   -- Substitute C for NULL
    -A != B AND A != NULL -- From the above rules
    -A != B AND NULL      -- [ANY] != NULL yields NULL
    -NULL                 -- [ANY] AND NULL yields NULL</sql><html>
    -
    -									<p>
    -										A good way to prevent this from happening is to use the <reference id="exists-predicate" title="EXISTS predicate"/> for anti-joins, which is NULL-value insensitive. See the manual's section about <reference id="conditional-expressions" title="conditional expressions"/> to see a boolean truth table.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -						    <section id="exists-predicate">
    -							    <title>EXISTS predicate</title>
    -								<content><html>
    -									<p>
    -										Slightly less intuitive, yet more powerful than the previously discussed <reference id="in-predicate" title="IN predicate"/> is the EXISTS predicate, that can be used to form semi-joins or anti-joins. With jOOQ, the EXISTS predicate can be formed in various ways:
    -									</p>
    -									<ul>
    -										<li>From the <reference id="factory" title="Factory"/>, using static methods. This is probably the most used case</li>
    -										<li>From a <reference id="conditional-expressions" title="conditional expression"/> using <reference id="boolean-operators" title="convenience methods attached to boolean operators"/></li>
    -										<li>From a <reference id="select-statement" title="SELECT statement"/> using <reference id="where-clause" title="convenience methods attached to the where clause"/>, and from other clauses</li>
    -									</ul>
    -									
    -									<p>
    -										An example of an EXISTS predicate can be seen here:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[    EXISTS (SELECT 1 FROM BOOK 
    -            WHERE AUTHOR_ID = 3)
    -NOT EXISTS (SELECT 1 FROM BOOK 
    -            WHERE AUTHOR_ID = 3)]]></sql><java><![CDATA[   exists(create.selectOne().from(BOOK)
    -                .where(BOOK.AUTHOR_ID.equal(3)));
    -notExists(create.selectOne().from(BOOK)
    -                .where(BOOK.AUTHOR_ID.equal(3)));]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										Note that in SQL, the projection of a subselect in an EXISTS predicate is irrelevant. To help you write queries like the above, you can use jOOQ's selectZero() or selectOne() <reference id="factory" title="Factory"/> methods
    -									</p>
    -									
    -									<h3>Performance of IN vs. EXISTS</h3>
    -									<p>
    -										In theory, the two types of predicates can perform equally well. If your database system ships with a sophisticated cost-based optimiser, it will be able to transform one predicate into the other, if you have all necessary constraints set (e.g. referential constraints, not null constraints). However, in reality, performance between the two might differ substantially. An interesting blog post investigating this topic on the MySQL database can be seen here:<br/>
    -										<a href="http://blog.jooq.org/2012/07/27/not-in-vs-not-exists-vs-left-join-is-null-mysql/">http://blog.jooq.org/2012/07/27/not-in-vs-not-exists-vs-left-join-is-null-mysql/</a>
    -									</p>
    -								</html></content>
    -							</section>
    -							
    -							<section id="overlaps-predicate">
    -								<title>OVERLAPS predicate</title>
    -								<content><html>
    -									<p>
    -										When comparing dates, the SQL standard allows for using a special OVERLAPS predicate, which checks whether two date ranges overlap each other. The following can be said:
    -									</p>
    -
    -</html><sql><![CDATA[-- This yields true
    -(DATE '2010-01-01', DATE '2010-01-03') OVERLAPS (DATE '2010-01-02' DATE '2010-01-04')
    -
    --- INTERVAL data types are also supported. This is equivalent to the above
    -(DATE '2010-01-01', CAST('+2 00:00:00' AS INTERVAL DAY TO SECOND)) OVERLAPS 
    -(DATE '2010-01-02', CAST('+2 00:00:00' AS INTERVAL DAY TO SECOND))]]></sql><html>
    -
    -									<h3>The OVERLAPS predicate in jOOQ</h3>
    -									<p>
    -									    jOOQ supports the OVERLAPS predicate on <reference id="row-value-expressions" title="row value expressions of degree 2"/>. The following methods are contained in <reference class="org.jooq.Row2"/>:
    -									</p>
    -
    -</html><java><![CDATA[Condition overlaps(T1 t1, T2 t2);
    -Condition overlaps(Field<T1> t1, Field<T2> t2);
    -Condition overlaps(Row2<T1, T2> row);]]></java><html>
    -
    -									<p>
    -										This allows for expressing the above predicates as such:
    -									</p>																		
    -
    -</html><java><![CDATA[// The date range tuples version
    -row(Date.valueOf('2010-01-01'), Date.valueOf('2010-01-03')).overlaps(Date.valueOf('2010-01-02'), Date.valueOf('2010-01-04'))
    -
    -// The INTERVAL tuples version
    -row(Date.valueOf('2010-01-01'), new DayToSecond(2)).overlaps(Date.valueOf('2010-01-02'), new DayToSecond(2))]]></java><html>
    -
    -									<h3>jOOQ's extensions to the standard</h3>
    -									<p>
    -										Unlike the standard (or any database implementing the standard), jOOQ also supports the OVERLAPS predicate for comparing arbitrary <reference id="row-value-expressions" title="row vlaue expressions of degree 2"/>. For instance, (1, 3) OVERLAPS (2, 4) will yield true in jOOQ. This is simulated as such
    -									</p>
    -									
    -</html><sql><![CDATA[-- This predicate
    -(A, B) OVERLAPS (C, D)
    -
    --- can be simulated as such
    -(C <= B) AND (A <= D)]]></sql></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -					<section id="plain-sql">
    -						<title>Plain SQL</title>
    -						<content><html>
    -							<p>
    -								A DSL is a nice thing to have, it feels "fluent" and "natural", especially if it models a well-known language, such as SQL. But a DSL is always expressed in a host language (Java in this case), which was not made for exactly the same purposes as its hosted DSL. If it were, then jOOQ would be implemented on a compiler-level, similar to LINQ in .NET. But it's not, and so, the DSL is limited by language constraints of its host language. We have seen many functionalities where the DSL becomes a bit verbose. This can be especially true for:
    -							</p>
    -							<ul>
    -								<li><reference id="aliased-columns" title="aliasing"/></li>
    -								<li><reference id="nested-selects" title="nested selects"/></li>
    -								<li><reference id="arithmetic-expressions" title="arithmetic expressions"/></li>
    -								<li><reference id="cast-expressions" title="casting"/></li>
    -							</ul>
    -							
    -							<p>
    -								You'll probably find other examples. If verbosity scares you off, don't worry. The verbose use-cases for jOOQ are rather rare, and when they come up, you do have an option. Just write SQL the way you're used to!
    -							</p>
    -							<p>
    -								jOOQ allows you to embed SQL as a String into any supported <reference id="sql-statements" title="statement"/> in these contexts:
    -							</p>
    -							<ul>
    -								<li>Plain SQL as a <reference id="conditional-expressions" title="conditional expression"/></li>
    -								<li>Plain SQL as a <reference id="column-expressions" title="column expression"/></li>
    -								<li>Plain SQL as a <reference id="column-expressions" title="function"/></li>
    -								<li>Plain SQL as a <reference id="table-expressions" title="table expression"/></li>
    -								<li>Plain SQL as a <reference id="query-vs-resultquery" title="query"/></li>
    -							</ul>
    -
    -							<h3>The Factory plain SQL API</h3>
    -							<p>
    -								Plain SQL API methods are usually overloaded in three ways. Let's look at the <code>condition</code> query part constructor:
    -							</p>
    -</html><java><![CDATA[// Construct a condition without bind values
    -// Example: condition("a = b")
    -Condition condition(String sql);
    -
    -// Construct a condition with bind values
    -// Example: condition("a = ?", 1);
    -Condition condition(String sql, Object... bindings);
    -
    -// Construct a condition taking other jOOQ object arguments
    -// Example: condition("a = {0}", val(1));
    -Condition condition(String sql, QueryPart... parts);]]></java><html>
    -							
    -							<p>
    -								Please refer to the <reference class="org.jooq.impl.Factory"/> Javadoc for more details. The following is a more complete listing of plain SQL construction methods from the Factory:
    -							</p>
    -
    -</html><java><![CDATA[// A condition
    -Condition condition(String sql);
    -Condition condition(String sql, Object... bindings);
    -Condition condition(String sql, QueryPart... parts);
    -
    -// A field with an unknown data type
    -Field<Object> field(String sql);
    -Field<Object> field(String sql, Object... bindings);
    -Field<Object> field(String sql, QueryPart... parts);
    -
    -// A field with a known data type
    -<T> Field<T> field(String sql, Class<T> type);
    -<T> Field<T> field(String sql, Class<T> type, Object... bindings);
    -<T> Field<T> field(String sql, Class<T> type, QueryPart... parts);
    -<T> Field<T> field(String sql, DataType<T> type);
    -<T> Field<T> field(String sql, DataType<T> type, Object... bindings);
    -<T> Field<T> field(String sql, DataType<T> type, QueryPart... parts);
    -
    -// A field with a known name (properly escaped)
    -Field<Object> fieldByName(String... fieldName);
    -<T> Field<T>  fieldByName(Class<T> type, String... fieldName);
    -<T> Field<T>  fieldByName(DataType<T> type, String... fieldName)
    -
    -// A function
    -<T> Field<T> function(String name, Class<T> type, Field<?>... arguments);
    -<T> Field<T> function(String name, DataType<T> type, Field<?>... arguments);
    -
    -// A table
    -Table<?> table(String sql);
    -Table<?> table(String sql, Object... bindings);
    -Table<?> table(String sql, QueryPart... parts);
    -
    -// A table with a known name (properly escaped)
    -Table<Record> tableByName(String... fieldName);
    -
    -// A query without results (update, insert, etc)
    -Query query(String sql);
    -Query query(String sql, Object... bindings);
    -Query query(String sql, QueryPart... parts);
    -
    -// A query with results
    -ResultQuery<Record> resultQuery(String sql);
    -ResultQuery<Record> resultQuery(String sql, Object... bindings);
    -ResultQuery<Record> resultQuery(String sql, QueryPart... parts);
    -
    -// A query with results. This is the same as resultQuery(...).fetch();
    -Result<Record> fetch(String sql);
    -Result<Record> fetch(String sql, Object... bindings);
    -Result<Record> fetch(String sql, QueryPart... parts);]]></java><html>
    -
    -							<p>
    -								Apart from the general factory methods, plain SQL is also available in various other contexts. For instance, when adding a .where("a = b") clause to a query. Hence, there exist several convenience methods where plain SQL can be inserted usefully. This is an example displaying all various use-cases in one single query:
    -							</p>
    -							
    -</html><java><![CDATA[// You can use your table aliases in plain SQL fields
    -// As long as that will produce syntactically correct SQL
    -Field<?> LAST_NAME    = create.field("a.LAST_NAME");
    -
    -// You can alias your plain SQL fields
    -Field<?> COUNT1       = create.field("count(*) x");
    -
    -// If you know a reasonable Java type for your field, you
    -// can also provide jOOQ with that type
    -Field<Integer> COUNT2 = create.field("count(*) y", Integer.class);
    -
    -       // Use plain SQL as select fields
    -create.select(LAST_NAME, COUNT1, COUNT2)
    -
    -       // Use plain SQL as aliased tables (be aware of syntax!)
    -      .from("author a")
    -      .join("book b")
    -
    -       // Use plain SQL for conditions both in JOIN and WHERE clauses
    -      .on("a.id = b.author_id")
    -
    -       // Bind a variable in plain SQL
    -      .where("b.title != ?", "Brida")
    -
    -       // Use plain SQL again as fields in GROUP BY and ORDER BY clauses
    -      .groupBy(LAST_NAME)
    -      .orderBy(LAST_NAME);]]></java><html>
    -
    -							<h3>Important things to note about plain SQL!</h3>
    -							<p>
    -								There are some important things to keep in mind when using plain SQL:
    -							</p>
    -							<ul>
    -								<li>jOOQ doesn't know what you're doing. You're on your own again!</li>
    -								<li>You have to provide something that will be syntactically correct. If it's not, then jOOQ won't know. Only your JDBC driver or your RDBMS will detect the syntax error.</li>
    -								<li>You have to provide consistency when you use variable binding. The number of ? must match the number of variables</li>
    -								<li>Your SQL is inserted into jOOQ queries without further checks. Hence, jOOQ can't prevent SQL injection. </li>
    -							</ul>
    -						</html></content>
    -					</section>
    -
    -					<section id="bind-values">
    -					    <title>Bind values and parameters</title>
    -						<content><html>
    -							<p>
    -								Bind values are used in SQL / JDBC for various reasons. Among the most obvious ones are:
    -							</p>
    -							<ul>
    -								<li>
    -									Protection against SQL injection. Instead of inlining values possibly originating from user input, you bind those values to your prepared statement and let the JDBC driver / database take care of handling security aspects.
    -								</li>
    -								<li>
    -									Increased speed. Advanced databases such as Oracle can keep execution plans of similar queries in a dedicated cache to prevent hard-parsing your query again and again. In many cases, the actual value of a bind variable does not influence the execution plan, hence it can be reused. Preparing a statement will thus be faster
    -								</li>
    -								<li>
    -									On a JDBC level, you can also reuse the SQL string and prepared statement object instead of constructing it again, as you can bind new values to the prepared statement. jOOQ currently does not cache prepared statements, internally.
    -								</li>
    -							</ul>
    -							
    -							<p>
    -								The following sections explain how you can introduce bind values in jOOQ, and how you can control the way they are rendered and bound to SQL.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -						    <section id="indexed-parameters">
    -							    <title>Indexed parameters</title>
    -								<content><html>
    -									<p>
    -										JDBC only knows indexed bind values. A typical example for using bind values with JDBC is this:
    -									</p>
    -									
    -</html><java><![CDATA[PreparedStatement stmt = connection.prepareStatement("SELECT * FROM BOOK WHERE ID = ? AND TITLE = ?");
    -
    -// bind values to the above statement for appropriate indexes 
    -stmt.setInt(1, 5);
    -stmt.setString(2, "Animal Farm");
    -stmm.executeQuery();]]></java><html>
    -
    -									<p>
    -										With dynamic SQL, keeping track of the number of question marks and their corresponding index may turn out to be hard. jOOQ abstracts this and lets you provide the bind value right where it is needed. A trivial example is this:
    -									</p>
    -									
    -</html><java><![CDATA[create.select().from(BOOK).where(BOOK.ID.equal(5)).and(BOOK.TITLE.equal("Animal Farm"));
    -
    -// This notation is in fact a short form for the equivalent:
    -create.select().from(BOOK).where(BOOK.ID.equal(val(5))).and(BOOK.TITLE.equal(val("Animal Farm")));]]></java><html>
    -
    -									<p>
    -										Note the using of <reference class="org.jooq.impl.Factory" anchor="#val(java.lang.Object)" title="Factory.val()"/> to explicitly create an indexed bind value. You don't have to worry about that index. When the query is <reference id="sql-rendering" title="rendered"/>, each bind value will render a question mark. When the query <reference id="variable-binding" title="binds its variables"/>, each bind value will generate the appropriate bind value index. 
    -									</p>
    -									
    -									<h3>Extract bind values from a query</h3>
    -									<p>
    -										Should you decide to run the above query outside of jOOQ, using your own <reference class="java.sql.PreparedStatement"/>, you can do so as follows:
    -									</p>
    -									
    -</html><java><![CDATA[Select<?> select = create.select().from(BOOK).where(BOOK.ID.equal(5)).and(BOOK.TITLE.equal("Animal Farm"));
    -
    -// Render the SQL statement:
    -String sql = select.getSQL();
    -assertEquals("SELECT * FROM BOOK WHERE ID = ? AND TITLE = ?", sql);
    -
    -// Get the bind values:
    -List<Object> values = select.getBindValues();
    -assertEquals(2, values.size());
    -assertEquals(5, values.get(0));
    -assertEquals("Animal Farm", values.get(1));]]></java><html>
    -
    -									<p>
    -										You can also extract specific bind values by index from a query, if you wish to modify their underlying value after creating a query. This can be achieved as such:
    -									</p>
    -
    -</html><java><![CDATA[Select<?> select = create.select().from(BOOK).where(BOOK.ID.equal(5)).and(BOOK.TITLE.equal("Animal Farm"));
    -Param<?> param = select.getParam("2");
    -
    -// You could now modify the Query's underlying bind value:
    -if ("Animal Farm".equals(param.getValue())) {
    -    param.setConverted("1984");
    -}]]></java><html>
    -
    -									<p>
    -										For more details about jOOQ's internals, see the manual's section about <reference id="queryparts" title="QueryParts"/>.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -						    <section id="named-parameters">
    -							    <title>Named parameters</title>
    -								<content><html>
    -									<p>
    -										Some SQL access abstractions that are built on top of JDBC, or some that bypass JDBC may support named parameters. jOOQ allows you to give names to your parameters as well, although those names are not rendered to SQL strings by default. Here is an example of how to create named parameters using the <reference class="org.jooq.Param"/> type:
    -									</p>
    -
    -</html><java><![CDATA[// Create a query with a named parameter. You can then use that name for accessing the parameter again
    -Query query1 = create.select().from(AUTHOR).where(LAST_NAME.equal(param("lastName", "Poe")));
    -Param<?> param1 = query.getParam("lastName");
    -
    -// Or, keep a reference to the typed parameter in order not to lose the <T> type information:
    -Param<String> param2 = param("lastName", "Poe");
    -Query query2 = create.select().from(AUTHOR).where(LAST_NAME.equal(param2));
    -
    -// You can now change the bind value directly on the Param reference:
    -param2.setValue("Orwell");]]></java><html>
    -
    -									<p>
    -										The <reference class="org.jooq.Query"/> interface also allows for setting new bind values directly, without accessing the Param type:
    -									</p>
    -
    -</html><java><![CDATA[Query query1 = create.select().from(AUTHOR).where(LAST_NAME.equal("Poe"));
    -query1.bind(1, "Orwell");
    -
    -// Or, with named parameters
    -Query query2 = create.select().from(AUTHOR).where(LAST_NAME.equal(param("lastName", "Poe")));
    -query2.bind("lastName", "Orwell");]]></java><html>
    -
    -									<p>
    -										In order to actually render named parameter names in generated SQL, use the <reference class="org.jooq.impl.Factory" anchor="#renderNamedParams(org.jooq.QueryPart)" title="Factory.renderNamedParams()"/> method:
    -									</p>
    -
    -</html><code-pair>
    -<java><![CDATA[create.renderNamedParams(
    -    create.select()
    -          .from(AUTHOR)
    -          .where(LAST_NAME.equal(
    -                 param("lastName", "Poe"))));]]></java><sql><![CDATA[-- The named bind variable can be rendered
    -
    -SELECT *
    -FROM AUTHOR
    -WHERE LAST_NAME = :lastName]]></sql>
    -</code-pair><html>
    -								</html></content>
    -							</section>
    -
    -						    <section id="inlined-parameters">
    -							    <title>Inlined parameters</title>
    -								<content><html>
    -									<p>
    -										Sometimes, you may wish to avoid rendering bind variables while still using custom values in SQL. jOOQ refers to that as "inlined" bind values. When bind values are inlined, they render the actual value in SQL rather than a JDBC question mark. Bind value inlining can be achieved in two ways:
    -									</p>
    -									<ul>
    -										<li>
    -											By using the <reference id="custom-settings" title="Settings"/> and setting the <reference class="org.jooq.conf.StatementType"/> to STATIC_STATEMENT. This will inline all bind values for SQL statements rendered from such a Factory.
    -										</li>
    -										<li>
    -											By using <reference class="org.jooq.impl.Factory" anchor="#inline(java.lang.Object)" title="Factory.inline()"/> methods.
    -										</li>
    -									</ul>
    -									<p>
    -										In both cases, your inlined bind values will be properly escaped to avoid SQL syntax errors and SQL injection. Some examples:
    -									</p>
    -
    -</html><java><![CDATA[
    -// Use dedicated calls to inline() in order to specify
    -// single bind values to be rendered as inline values
    -// --------------------------------------------------
    -create.select()
    -      .from(AUTHOR)
    -      .where(LAST_NAME.equal(inline("Poe")));
    -
    -// Or render the whole query with inlined values
    -// --------------------------------------------------
    -Settings settings = new Settings()
    -    .withStatementType(StatementType.STATIC_STATEMENT);
    -
    -// Add the settings to the factory
    -Factory create = new Factory(connection, SQLDialect.ORACLE, settings);
    -
    -// Run queries that omit rendering schema names
    -create.select()
    -      .from(AUTHOR)
    -      .where(LAST_NAME.equal("Poe"));]]></java></content>
    -							</section>
    -
    -						    <section id="sql-injection-and-plain-sql-queryparts">
    -							    <title>SQL injection and plain SQL QueryParts</title>
    -								<content><html>
    -									<p>
    -										Special care needs to be taken when using <reference id="plain-sql" title="plain SQL QueryParts"/>. While jOOQ's API allows you to specify bind values for use with plain SQL, you're not forced to do that. For instance, both of the following queries will lead to the same, valid result:
    -									</p>
    -									
    -</html><java><![CDATA[// This query will use bind values, internally.
    -create.fetch("SELECT * FROM BOOK WHERE ID = ? AND TITLE = ?", 5 "Animal Farm");
    -
    -// This query will not use bind values, internally.
    -create.fetch("SELECT * FROM BOOK WHERE ID = 5 AND TITLE = 'Animal Farm'");]]></java><html>
    -
    -									<p>
    -										All methods in the jOOQ API that allow for plain (unescaped, untreated) SQL contain a warning message in their relevant Javadoc, to remind you of the risk of SQL injection in what is otherwise a SQL-injection-safe API.
    -									</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -					<section id="queryparts">
    -					    <title>QueryParts</title>
    -						<content><html>
    -							<p>
    -								A <reference class="org.jooq.Query" /> and all its contained objects is a <reference class="org.jooq.QueryPart" />. QueryParts essentially provide this functionality:
    -							</p>
    -							<ul>
    -								<li>they can <reference id="sql-rendering" title="render SQL"/> using the <reference class="org.jooq.QueryPartInternal" anchor="#toSQL(org.jooq.RenderContext)" title="toSQL(RenderContext)"/> method</li>
    -								<li>they can <reference id="variable-binding" title="bind variables"/> using the <reference class="org.jooq.QueryPartInternal" anchor="#bind(org.jooq.BindContext)" title="bind(BindContext)"/> method</li>
    -							</ul>
    -
    -							<p>
    -								Both of these methods are contained in jOOQ's internal API's <reference class="org.jooq.QueryPartInternal"/>, which is internally implemented by every QueryPart.
    -							</p>
    -
    -							<p>
    -								The following sections explain some more details about <reference id="sql-rendering" title="SQL rendering"/> and <reference id="variable-binding" title="variable binding"/>, as well as other implementation details about QueryParts in general.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -						    <section id="sql-rendering">
    -							    <title>SQL rendering</title>
    -								<content><html>
    -									<p>
    -										Every <reference class="org.jooq.QueryPart"/> must implement the <reference class="org.jooq.QueryPartInternal" anchor="#toSQL(org.jooq.RenderContext)" title="toSQL(RenderContext)"/> method to render its SQL string to a <reference class="org.jooq.RenderContext"/>. This RenderContext has two purposes:
    -									</p>
    -									<ul>
    -										<li>It provides some information about the "state" of SQL rendering.</li>
    -										<li>It provides a common API for constructing SQL strings on the context's internal <reference class="java.lang.StringBuilder"/></li>
    -									</ul>
    -									<p>
    -										An overview of the <reference class="org.jooq.RenderContext"/> API is given here:
    -									</p>
    -
    -</html><java><![CDATA[// These methods are useful for generating unique aliases within a RenderContext (and thus within a Query)
    -String peekAlias();
    -String nextAlias();
    -
    -// These methods return rendered SQL
    -String render();
    -String render(QueryPart part);
    -
    -// These methods allow for fluent appending of SQL to the RenderContext's internal StringBuilder
    -RenderContext keyword(String keyword);
    -RenderContext literal(String literal);
    -RenderContext sql(String sql);
    -RenderContext sql(char sql);
    -RenderContext sql(int sql);
    -RenderContext sql(QueryPart part);
    -
    -// These methods allow for controlling formatting of SQL, if the relevant Setting is active
    -RenderContext formatNewLine();
    -RenderContext formatSeparator();
    -RenderContext formatIndentStart();
    -RenderContext formatIndentStart(int indent);
    -RenderContext formatIndentLockStart();
    -RenderContext formatIndentEnd();
    -RenderContext formatIndentEnd(int indent);
    -RenderContext formatIndentLockEnd();
    -
    -// These methods control the RenderContext's internal state
    -boolean       inline();
    -RenderContext inline(boolean inline);
    -boolean       qualify();
    -RenderContext qualify(boolean qualify);
    -boolean       namedParams();
    -RenderContext namedParams(boolean renderNamedParams);
    -CastMode      castMode();
    -RenderContext castMode(CastMode mode);
    -Boolean       cast();
    -RenderContext castModeSome(SQLDialect... dialects);]]></java><html>
    -
    -									<p>
    -										The following additional methods are inherited from a common <reference class="org.jooq.Context"/>, which is shared among <reference class="org.jooq.RenderContext"/> and <reference class="org.jooq.BindContext"/>:
    -									</p>
    -
    -</html><java><![CDATA[// These methods indicate whether fields or tables are being declared (MY_TABLE AS MY_ALIAS) or referenced (MY_ALIAS)
    -boolean declareFields();
    -Context declareFields(boolean declareFields);
    -boolean declareTables();
    -Context declareTables(boolean declareTables);
    -
    -// These methods indicate whether a top-level query is being rendered, or a subquery
    -boolean subquery();
    -Context subquery(boolean subquery);
    -
    -// These methods provide the bind value indices within the scope of the whole Context (and thus of the whole Query)
    -int nextIndex();
    -int peekIndex();]]></java><html>
    -
    -									<h3>An example of rendering SQL</h3>
    -								   	<p>
    -								   		A simple example can be provided by checking out jOOQ's internal representation of a (simplified) <reference id="comparison-predicate" title="CompareCondition"/>. It is used for any <reference class="org.jooq.Condition"/> comparing two fields as for example the AUTHOR.ID = BOOK.AUTHOR_ID condition here:
    -							   		</p>
    -							   		
    -</html><sql>-- [...]
    -FROM AUTHOR
    -JOIN BOOK ON AUTHOR.ID = BOOK.AUTHOR_ID
    --- [...]</sql><html>
    -
    -									<p>
    -										This is how jOOQ renders such a condition:
    -									</p>
    -
    -</html><java><![CDATA[@Override
    -public final void toSQL(RenderContext context) {
    -    // The CompareCondition delegates rendering of the Fields to the Fields
    -    // themselves and connects them using the Condition's comparator operator:
    -    context.sql(field1)
    -           .sql(" ");
    -
    -    // If the second field is null, some convenience behaviour can be
    -    // implemented here
    -    if (field2.isNullLiteral()) {
    -        switch (comparator) {
    -            case EQUALS:
    -                context.sql("is null");
    -                break;
    -
    -            case NOT_EQUALS:
    -                context.sql("is not null");
    -                break;
    -
    -            default:
    -                throw new IllegalStateException("Cannot compare null with " + comparator);
    -        }
    -    }
    -
    -    // By default, also delegate the right hand side's SQL rendering to the
    -    // underlying field
    -    else {
    -        context.sql(comparator.toSQL())
    -               .sql(" ")
    -               .sql(field2);
    -    }
    -}]]></java><html>
    -
    -									<p>
    -										See the manual's sections about <reference id="custom-queryparts" title="custom QueryParts"/> and <reference id="plain-sql-queryparts" title="plain SQL QueryParts"/> to learn about how to write your own query parts in order to extend jOOQ.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="pretty-printing">
    -								<title>Pretty printing SQL</title>
    -								<content><html>
    -									<p>
    -										As mentioned in the previous chapter about <reference id="sql-rendering" title="SQL rendering"/>, there are some elements in the <reference class="org.jooq.RenderContext"/> that are used for formatting / pretty-printing rendered SQL. In order to obtain pretty-printed SQL, just use the following <reference id="custom-settings" title="custom settings"/>: 
    -									</p>
    -	
    -	
    -</html><java><![CDATA[// Create a factory that will render "formatted" SQL
    -Factory pretty = new Factory(dialect, new Settings().withRenderFormatted(true));]]></java><html>
    -
    -									<p>
    -										And then, use the above factory to render pretty-printed SQL:
    -									</p>
    -									
    -</html><code-pair>
    -<java><![CDATA[String sql = pretty.select(
    -                       AUTHOR.LAST_NAME, count().as("c"))
    -                   .from(BOOK)
    -                   .join(AUTHOR)
    -                   .on(BOOK.AUTHOR_ID.equal(AUTHOR.ID))
    -                   .where(BOOK.TITLE.notEqual("1984"))
    -                   .groupBy(AUTHOR.LAST_NAME)
    -                   .having(count().equal(2))
    -                   .getSQL();]]></java><sql><![CDATA[select 
    -  "TEST"."AUTHOR"."LAST_NAME", 
    -  count(*) "c"
    -from "TEST"."BOOK"
    -  join "TEST"."AUTHOR"
    -  on "TEST"."BOOK"."AUTHOR_ID" = "TEST"."AUTHOR"."ID"
    -where "TEST"."BOOK"."TITLE" <> '1984'
    -group by "TEST"."AUTHOR"."LAST_NAME"
    -having count(*) = 2]]></sql>
    -</code-pair><html>
    -
    -									<p>
    -										The section about <reference id="execute-listeners" title="ExecuteListeners"/> shows an example of how such pretty printing can be used to log readable SQL to the stdout.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -						    <section id="variable-binding">
    -							    <title>Variable binding</title>
    -								<content><html>
    -									<p>
    -										Every <reference class="org.jooq.QueryPart"/> must implement the <reference class="org.jooq.QueryPartInternal" anchor="#bind(org.jooq.BindContext)" title="bind(BindContext)"/> method. This BindContext has two purposes:
    -									</p>
    -									<ul>
    -										<li>It provides some information about the "state" of the variable binding in process.</li>
    -										<li>It provides a common API for binding values to the context's internal <reference class="java.sql.PreparedStatement"/></li>
    -									</ul>
    -									<p>
    -										An overview of the <reference class="org.jooq.RenderContext"/> API is given here:
    -									</p>
    -
    -</html><java><![CDATA[// This method provides access to the PreparedStatement to which bind values are bound
    -PreparedStatement statement();
    -
    -// These methods provide convenience to delegate variable binding
    -BindContext bind(QueryPart part) throws DataAccessException;
    -BindContext bind(Collection<? extends QueryPart> parts) throws DataAccessException;
    -BindContext bind(QueryPart[] parts) throws DataAccessException;
    -
    -// These methods perform the actual variable binding
    -BindContext bindValue(Object value, Class<?> type) throws DataAccessException;
    -BindContext bindValues(Object... values) throws DataAccessException;]]></java><html>
    -
    -									<p>
    -										Some additional methods are inherited from a common <reference class="org.jooq.Context"/>, which is shared among <reference class="org.jooq.RenderContext"/> and <reference class="org.jooq.BindContext"/>. Details are documented in the previous chapter about <reference id="sql-rendering" title="SQL rendering"/>
    -									</p>
    -
    -									<h3>An example of binding values to SQL</h3>
    -								   	<p>
    -								   		A simple example can be provided by checking out jOOQ's internal representation of a (simplified) <reference id="comparison-predicate" title="CompareCondition"/>. It is used for any <reference class="org.jooq.Condition"/> comparing two fields as for example the AUTHOR.ID = BOOK.AUTHOR_ID condition here:
    -							   		</p>
    -							   		
    -</html><sql>-- [...]
    -WHERE AUTHOR.ID = ?
    --- [...]</sql><html>
    -
    -									<p>
    -										This is how jOOQ binds values on such a condition:
    -									</p>
    -</html><java><![CDATA[@Override
    -public final void bind(BindContext context) throws DataAccessException {
    -    // The CompareCondition itself does not bind any variables.
    -    // But the two fields involved in the condition might do so...
    -    context.bind(field1).bind(field2);
    -}]]></java><html>
    -
    -									<p>
    -										See the manual's sections about <reference id="custom-queryparts" title="custom QueryParts"/> and <reference id="plain-sql-queryparts" title="plain SQL QueryParts"/> to learn about how to write your own query parts in order to extend jOOQ.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -						    <section id="custom-queryparts">
    -							    <title>Extend jOOQ with custom types</title>
    -								<content><html>
    -									<p>
    -										If a SQL clause is too complex to express with jOOQ, you can extend either one of the following types for use directly in a jOOQ query:
    -									</p>
    -									
    -</html><java><![CDATA[public abstract class CustomField<T> extends AbstractField<T> {}
    -public abstract class CustomCondition extends AbstractCondition {}
    -public abstract class CustomTable<R extends TableRecord<R>> extends TableImpl<R> {}
    -public abstract class CustomRecord<R extends TableRecord<R>> extends TableRecordImpl<R> {}]]></java><html>
    -
    -									<p>
    -										These classes are declared public and covered by jOOQ's integration tests. When you extend these classes, you will have to provide your own implementations for the <reference id="queryparts" title="QueryParts'"/> <reference id="sql-rendering" title="toSQL()"/> and <reference id="variable-binding" title="bind()"/> methods, as discussed before:
    -									</p>
    -									
    -</html><java><![CDATA[// This method must produce valid SQL. If your QueryPart contains other QueryParts, you may delegate SQL generation to them
    -// in the correct order, passing the render context.
    -//
    -// If context.inline() is true, you must inline all bind variables
    -// If context.inline() is false, you must generate ? for your bind variables
    -public void toSQL(RenderContext context);
    -
    -// This method must bind all bind variables to a PreparedStatement. If your QueryPart contains other QueryParts, $
    -// you may delegate variable binding to them in the correct order, passing the bind context.
    -//
    -// Every QueryPart must ensure, that it starts binding its variables at context.nextIndex().
    -public void bind(BindContext context) throws DataAccessException;]]></java><html>
    -
    -									<p>
    -										The above contract may be a bit tricky to understand at first. The best thing is to check out jOOQ source code and have a look at a couple of QueryParts, to see how it's done. Here's an example <reference class="org.jooq.impl.CustomField"/> showing how to create a field multiplying another field by 2
    -									</p>
    -									
    -</html><java><![CDATA[// Create an anonymous CustomField, initialised with BOOK.ID arguments
    -final Field<Integer> IDx2 = new CustomField<Integer>(BOOK.ID.getName(), BOOK.ID.getDataType()) {
    -    @Override
    -    public void toSQL(RenderContext context) {
    -    
    -        // In inline mode, render the multiplication directly
    -        if (context.inline()) {
    -            context.sql(BOOK.ID).sql(" * 2");
    -        }
    -        
    -        // In non-inline mode, render a bind value
    -        else {
    -            context.sql(BOOK.ID).sql(" * ?");
    -        }
    -    }
    -
    -    @Override
    -    public void bind(BindContext context) {
    -        try {
    -        
    -            // Manually bind the value 2
    -            context.statement().setInt(context.nextIndex(), 2);
    -            
    -            // Alternatively, you could also write:
    -            // context.bind(Factory.val(2));
    -        }
    -        catch (SQLException e) {
    -            throw translate(getSQL(), e);
    -        }
    -    }
    -};
    -
    -// Use the above field in a SQL statement:
    -create.select(IDx2).from(BOOK);]]></java></content>
    -							</section>
    -
    -						    <section id="plain-sql-queryparts">
    -							    <title>Plain SQL QueryParts</title>
    -								<content><html>
    -									<p>
    -										If you don't need the integration of rather complex QueryParts into jOOQ, then you might be safer using simple <reference id="plain-sql" title="Plain SQL"/> functionality, where you can provide jOOQ with a simple String representation of your embedded SQL. Plain SQL methods in jOOQ's API come in two flavours. 
    -									</p>
    -									<ul>
    -										<li><strong>method(String, Object...)</strong>: This is a method that accepts a SQL string and a list of bind values that are to be bound to the variables contained in the SQL string</li>
    -										<li><strong>method(String, QueryPart...)</strong>: This is a method that accepts a SQL string and a list of QueryParts that are "injected" at the position of their respective placeholders in the SQL string</li>
    -									</ul>
    -									<p>
    -										The above distinction is best explained using an example:
    -									</p>
    -									
    -</html><java><![CDATA[// Plain SQL using bind values. The value 5 is bound to the first variable, "Animal Farm" to the second variable:
    -create.selectFrom(BOOK).where("BOOK.ID = ? AND TITLE = ?", 5, "Animal Farm");
    -
    -// Plain SQL using placeholders (counting from zero). 
    -// The QueryPart "id" is substituted for the placeholder {0}, the QueryPart "title" for {1}
    -Field<Integer> id   = val(5);
    -Field<String> title = val("Animal Farm");
    -create.selectFrom(BOOK).where("BOOK.ID = {0} AND TITLE = {1}", id, title);]]></java><html>
    -
    -									<p>
    -										The above technique allows for creating rather complex SQL clauses that are currently not supported by jOOQ, without extending any of the <reference id="custom-queryparts" title="custom QueryParts"/> as indicated in the previous chapter.
    -									</p>									
    -								</html></content>
    -							</section>
    -
    -						    <section id="serializability">
    -							    <title>Serializability</title>
    -								<content><html>
    -									<p>
    -										The only transient, non-serializable element in any jOOQ object is the <reference id="factory" title="Factory's"/> underlying <reference class="java.sql.Connection"/>. When you want to execute queries after de-serialisation, or when you want to store/refresh/delete <reference id="crud-with-updatablerecords" title="Updatable Records"/>, you will have to "re-attach" them to a Factory
    -									</p>
    -
    -</html><java><![CDATA[// Deserialise a SELECT statement
    -ObjectInputStream in = new ObjectInputStream(...);
    -Select<?> select = (Select<?>) in.readObject();
    -
    -// This will throw a DetachedException:
    -select.execute();
    -
    -// In order to execute the above select, attach it first
    -Factory create = new Factory(connection, SQLDialect.ORACLE);
    -create.attach(select);]]></java><html>
    -
    -									<h3>Automatically attaching QueryParts</h3>
    -									<p>
    -										Another way of attaching QueryParts automatically, or rather providing them with a new <reference class="java.sql.Connection"/> at will, is to hook into the <reference id="execute-listeners" title="Execute Listener support"/>. More details about this can be found in the manual's chapter about <reference id="execute-listeners" title="ExecuteListeners"/>
    -									</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -					
    -					<section id="scala-sql-building">
    -						<title>SQL building in Scala</title>
    -						<content><html>
    -							<p>
    -								jOOQ-Scala is a maven module used for leveraging some advanced Scala features for those users that wish to use jOOQ with Scala.
    -							</p>
    -							
    -							<h3>Using Scala's implicit defs to allow for operator overloading</h3>
    -							<p>
    -								The most obvious Scala feature to use in jOOQ are implicit defs for implicit conversions in order to enhance the <reference class="org.jooq.Field"/> type with SQL-esque operators. 
    -							</p>
    -							<p>
    -								The following depicts a trait which wraps all fields:
    -							</p>
    -							
    -</html><scala><![CDATA[/**
    - * A Scala-esque representation of {@link org.jooq.Field}, adding overloaded
    - * operators for common jOOQ operations to arbitrary fields
    - */
    -trait SAnyField[T] extends Field[T] {
    -
    -    // String operations
    -    // -----------------
    -
    -    def ||(value : String)            : Field[String]
    -    def ||(value : Field[_])          : Field[String]
    -
    -    // Comparison predicates
    -    // ---------------------
    -
    -    def ===(value : T)                : Condition
    -    def ===(value : Field[T])         : Condition
    -
    -    def !==(value : T)                : Condition
    -    def !==(value : Field[T])         : Condition
    -
    -    def <>(value : T)                 : Condition
    -    def <>(value : Field[T])          : Condition
    -
    -    def >(value : T)                  : Condition
    -    def >(value : Field[T])           : Condition
    -
    -    def >=(value : T)                 : Condition
    -    def >=(value : Field[T])          : Condition
    -
    -    def <(value : T)                  : Condition
    -    def <(value : Field[T])           : Condition
    -
    -    def <=(value : T)                 : Condition
    -    def <=(value : Field[T])          : Condition
    -
    -    def <=>(value : T)                : Condition
    -    def <=>(value : Field[T])         : Condition
    -}]]></scala><html>
    -
    -							<p>
    -								The following depicts a trait which wraps numeric fields:
    -							</p>
    -							
    -</html><scala><![CDATA[/**
    - * A Scala-esque representation of {@link org.jooq.Field}, adding overloaded
    - * operators for common jOOQ operations to numeric fields
    - */
    -trait SNumberField[T <: Number] extends SAnyField[T] {
    -
    -    // Arithmetic operations
    -    // ---------------------
    -
    -    def unary_-                       : Field[T]
    -
    -    def +(value : Number)             : Field[T]
    -    def +(value : Field[_ <: Number]) : Field[T]
    -
    -    def -(value : Number)             : Field[T]
    -    def -(value : Field[_ <: Number]) : Field[T]
    -
    -    def *(value : Number)             : Field[T]
    -    def *(value : Field[_ <: Number]) : Field[T]
    -
    -    def /(value : Number)             : Field[T]
    -    def /(value : Field[_ <: Number]) : Field[T]
    -
    -    def %(value : Number)             : Field[T]
    -    def %(value : Field[_ <: Number]) : Field[T]
    -
    -    // Bitwise operations
    -    // ------------------
    -
    -    def unary_~                       : Field[T]
    -
    -    def &(value : T)                  : Field[T]
    -    def &(value : Field[T])           : Field[T]
    -
    -    def |(value : T)                  : Field[T]
    -    def |(value : Field[T])           : Field[T]
    -
    -    def ^(value : T)                  : Field[T]
    -    def ^(value : Field[T])           : Field[T]
    -
    -    def <<(value : T)                 : Field[T]
    -    def <<(value : Field[T])          : Field[T]
    -
    -    def >>(value : T)                 : Field[T]
    -    def >>(value : Field[T])          : Field[T]
    -}]]></scala><html>
    -
    -							<p>
    -								An example query using such overloaded operators would then look like this:
    -							</p>
    -							
    -</html><scala><![CDATA[select (
    -  T_BOOK.ID * T_BOOK.AUTHOR_ID,
    -  T_BOOK.ID + T_BOOK.AUTHOR_ID * 3 + 4,
    -  T_BOOK.TITLE || " abc" || " xy")
    -from T_BOOK
    -leftOuterJoin (
    -  f select (x.ID, x.YEAR_OF_BIRTH)
    -  from x
    -  limit 1
    -  asTable x.getName()
    -)
    -on T_BOOK.AUTHOR_ID === x.ID
    -where (T_BOOK.ID <> 2)
    -or (T_BOOK.TITLE in ("O Alquimista", "Brida"))
    -fetch]]></scala><html>
    -
    -							<h3>Scala 2.10 Macros</h3>
    -							<p>
    -								This feature is still being experimented with. With Scala Macros, it might be possible to inline a true SQL dialect into the Scala syntax, backed by the jOOQ API. Stay tuned!
    -							</p>
    -						</html></content>
    -					</section>
    -				</sections>
    -			</section>
    -
    -			<section id="sql-execution">
    -				<title>SQL execution</title>
    -				<content><html>
    -					<p>
    -						In a previous section of the manual, we've seen how jOOQ can be used to <reference id="sql-building" title="build SQL"/> that can be executed with any API including JDBC or ... jOOQ. This section of the manual deals with various means of actually executing SQL with jOOQ.
    -					</p>
    -					
    -					<h3>SQL execution with JDBC</h3>
    -					<p>
    -						JDBC calls executable objects "<reference class="java.sql.Statement"/>". It distinguishes between three types of statements:
    -					</p>
    -					<ul>
    -						<li><reference class="java.sql.Statement"/>, or "static statement": This statement type is used for any arbitrary type of SQL statement. It is particularly useful with <reference id="inlined-parameters" title="inlined parameters"/></li>
    -						<li><reference class="java.sql.PreparedStatement"/>: This statement type is used for any arbitrary type of SQL statement. It is particularly useful with <reference id="indexed-parameters" title="indexed parameters"/> (note that JDBC does not support <reference id="named-parameters" title="named parameters"/>)</li>
    -						<li><reference class="java.sql.CallableStatement"/>: This statement type is used for SQL statements that are "called" rather than "executed". In particular, this includes calls to <reference id="stored-procedures" title="stored procedures"/>. Callable statements can register OUT parameters</li>
    -					</ul>
    -					<p>
    -						Today, the JDBC API may look weird to users being used to object-oriented design. While statements hide a lot of SQL dialect-specific implementation details quite well, they assume a lot of knowledge about the internal state of a statement. For instance, you can use the <reference class="java.sql.PreparedStatement" anchor="#addBatch()" title="PreparedStatement.addBatch()"/> method, to add a the prepared statement being created to an "internal list" of batch statements. Instead of returning a new type, this method forces user to reflect on the prepared statement's internal state or "mode".
    -					</p>
    -					
    -					<h3>jOOQ is wrapping JDBC</h3>
    -					<p>						
    -						These things are abstracted away by jOOQ, which exposes such concepts in a more object-oriented way. For more details about jOOQ's batch query execution, see the manual's section about <reference id="batch-execution" title="batch execution"/>.
    -					</p> 
    -					<p>
    -						The following sections of this manual will show how jOOQ is wrapping JDBC for SQL execution
    -					</p>
    -				</html></content>
    -
    -				<sections>
    -					<section id="comparison-with-jdbc">
    -						<title>Comparison between jOOQ and JDBC</title>
    -						<content><html>
    -							<h3>Similarities with JDBC</h3>
    -							<p>
    -								Even if there are <reference id="query-vs-resultquery" title="two general types of Query"/>, there are a lot of similarities between JDBC and jOOQ. Just to name a few:
    -							</p>
    -							<ul>
    -								<li>Both APIs return the number of affected records in non-result queries. JDBC: <reference class="java.sql.Statement" anchor="#executeUpdate(java.lang.String)" title="Statement.executeUpdate()"/>, jOOQ: <reference class="org.jooq.Query" anchor="#execute()" title="Query.execute()"/></li>
    -								<li>Both APIs return a scrollable result set type from result queries. JDBC: <reference class="java.sql.ResultSet"/>, jOOQ: <reference class="org.jooq.Result"/></li>
    -							</ul>
    -							
    -							<h3>Differences to JDBC</h3>
    -							<p>
    -								Some of the most important differences between JDBC and jOOQ are listed here:
    -							</p>
    -							<ul>
    -								<li><reference id="query-vs-resultquery" title="Query vs. ResultQuery"/>: JDBC does not formally distinguish between queries that can return results, and queries that cannot. The same API is used for both. This greatly reduces the possibility for <reference id="fetching" title="fetching convenience methods"/></li>
    -								<li><reference id="exception-handling" title="Exception handling"/>: While SQL uses the checked <reference class="java.sql.SQLException"/>, jOOQ wraps all exceptions in an unchecked <reference class="org.jooq.exception.DataAccessException"/></li>
    -								<li><reference class="org.jooq.Result"/>: Unlike its JDBC counter-part, this type implements <reference class="java.util.List"/> and is fully loaded into Java memory, freeing resources as early as possible. Just like statements, this means that users don't have to deal with a "weird" internal result set state.</li>
    -								<li><reference class="org.jooq.Cursor"/>: If you want more fine-grained control over how many records are fetched into memory at once, you can still do that using jOOQ's <reference id="lazy-fetching" title="lazy fetching"/> feature</li>
    -								<li><reference id="statement-type" title="Statement type"/>: jOOQ does not formally distinguish between static statements and prepared statements. By default, all statements are prepared statements in jOOQ, internally. Executing a statement as a static statement can be done simply using a <reference id="custom-settings" title="custom settings flag"/></li>
    -								<li><reference id="reusing-statements" title="Closing Statements"/>: JDBC keeps open resources even if they are already consumed. With JDBC, there is a lot of verbosity around safely closing resources. In jOOQ, resources are closed after consumption, by default. If you want to keep them open after consumption, you have to explicitly say so.</li>
    -							</ul>
    -						</html></content>
    -					</section>
    -				    
    -				    <section id="query-vs-resultquery">
    -						<title>Query vs. ResultQuery</title>
    -						<content><html>
    -							<p>
    -								Unlike JDBC, jOOQ has a lot of knowledge about a SQL query's structure and internals (see the manual's section about <reference id="sql-building" title="SQL building"/>). Hence, jOOQ distinguishes between these two fundamental types of queries. While every <reference class="org.jooq.Query"/> can be executed, only <reference class="org.jooq.ResultQuery"/> can return results (see the manual's section about <reference id="fetching" title="fetching"/> to learn more about fetching results). With plain SQL, the distinction can be made clear most easily:
    -							</p>
    -							
    -</html><java><![CDATA[// Create a Query object and execute it:
    -Query query = create.query("DELETE FROM BOOK");
    -query.execute();
    -
    -// Create a ResultQuery object and execute it, fetching results:
    -ResultQuery<Record> resultQuery = create.resultQuery("SELECT * FROM BOOK");
    -Result<Record> resultQuery.fetch();]]></java></content>
    -					</section>
    -
    -				    <section id="fetching">
    -						<title>Fetching</title>
    -						<content><html>
    -							<p>
    -								Fetching is something that has been completely neglegted by JDBC and also by various other database abstraction libraries. Fetching is much more than just looping or listing records or mapped objects. There are so many ways you may want to fetch data from a database, it should be considered a first-class feature of any database abstraction API. Just to name a few, here are some of jOOQ's fetching modes:
    -							</p>
    -							<ul>
    -								<li><reference id="record-vs-tablerecord" title="Untyped vs. typed fetching"/>: Sometimes you care about the returned type of your records, sometimes (with arbitrary projections) you don't.</li>
    -								<li><reference id="arrays-maps-and-lists" title="Fetching arrays, maps, or lists"/>: Instead of letting you transform your result sets into any more suitable data type, a library should do that work for you.</li>
    -								<li><reference id="recordhandler" title="Fetching through handler callbacks"/>: This is an entirely different fetching paradigm. With Java 8's lambda expressions, this will become even more powerful.</li>
    -								<li><reference id="recordmapper" title="Fetching through mapper callbacks"/>: This is an entirely different fetching paradigm. With Java 8's lambda expressions, this will become even more powerful.</li>
    -								<li><reference id="pojos" title="Fetching custom POJOs"/>: This is what made Hibernate and JPA so strong. Automatic mapping of tables to custom POJOs.</li>
    -								<li><reference id="lazy-fetching" title="Lazy vs. eager fetching"/>: It should be easy to distinguish these two fetch modes.</li>
    -								<li><reference id="many-fetching" title="Fetching many results"/>: Some databases allow for returning many result sets from a single query. JDBC can handle this but it's very verbose. A list of results should be returned instead.</li>
    -								<li><reference id="later-fetching" title="Fetching data asynchronously"/>: Some queries take too long to execute to wait for their results. You should be able to spawn query execution in a separate process.</li>
    -							</ul>
    -							
    -							<h3>Convenience and how ResultQuery, Result, and Record share API</h3>
    -							<p>
    -								The term "fetch" is always reused in jOOQ when you can fetch data from the database. An <reference class="org.jooq.ResultQuery"/> provides many overloaded means of fetching data:
    -							</p>
    -							
    -							<h3>Various modes of fetching</h3>
    -							<p>
    -								These modes of fetching are also documented in subsequent sections of the manual
    -							</p>
    -							
    -</html><java><![CDATA[// The "standard" fetch
    -Result<R> fetch();    
    -
    -// The "standard" fetch when you know your query returns only one record
    -R fetchOne();
    -
    -// The "standard" fetch when you only want to fetch the first record
    -R fetchAny();
    -
    -// Create a "lazy" Cursor, that keeps an open underlying JDBC ResultSet
    -Cursor<R> fetchLazy();
    -Cursor<R> fetchLazy(int fetchSize);
    -
    -// Create a java.util.concurrent.Future, to handle asynchronous execution of the ResultQuery
    -FutureResult<R> fetchLater();
    -FutureResult<R> fetchLater(ExecutorService executor);
    -
    -// Fetch several results at once
    -List<Result<Record>> fetchMany();
    -
    -// Fetch records into a custom callback
    -<H extends RecordHandler<R>> H fetchInto(H handler);
    -
    -// Map records using a custom callback
    -<E> List<E> fetch(RecordMapper<? super R, E> mapper);
    -
    -// Execute a ResultQuery with jOOQ, but return a JDBC ResultSet, not a jOOQ object
    -ResultSet fetchResultSet();]]></java><html>
    -							
    -							<h3>Fetch convenience</h3>
    -							<p>
    -								These means of fetching are also available from <reference class="org.jooq.Result"/> and <reference class="org.jooq.Record"/> APIs
    -							</p>
    -
    -</html><java><![CDATA[// These methods are convenience for fetching only a single field, 
    -// possibly converting results to another type
    -<T>    List<T> fetch(Field<T> field);
    -<T>    List<T> fetch(Field<?> field, Class<? extends T> type);
    -<T, U> List<U> fetch(Field<T> field, Converter<? super T, U> converter);
    -       List<?> fetch(int fieldIndex);
    -<T>    List<T> fetch(int fieldIndex, Class<? extends T> type);
    -<U>    List<U> fetch(int fieldIndex, Converter<?, U> converter);
    -       List<?> fetch(String fieldName);
    -<T>    List<T> fetch(String fieldName, Class<? extends T> type);
    -<U>    List<U> fetch(String fieldName, Converter<?, U> converter);
    -
    -// These methods are convenience for fetching only a single field, possibly converting results to another type
    -// Instead of returning lists, these return arrays
    -<T>    T[]      fetchArray(Field<T> field);
    -<T>    T[]      fetchArray(Field<?> field, Class<? extends T> type);
    -<T, U> U[]      fetchArray(Field<T> field, Converter<? super T, U> converter);
    -       Object[] fetchArray(int fieldIndex);
    -<T>    T[]      fetchArray(int fieldIndex, Class<? extends T> type);
    -<U>    U[]      fetchArray(int fieldIndex, Converter<?, U> converter);
    -       Object[] fetchArray(String fieldName);
    -<T>    T[]      fetchArray(String fieldName, Class<? extends T> type);
    -<U>    U[]      fetchArray(String fieldName, Converter<?, U> converter);
    -
    -// These methods are convenience for fetching only a single field from a single record, 
    -// possibly converting results to another type
    -<T>    T      fetchOne(Field<T> field);
    -<T>    T      fetchOne(Field<?> field, Class<? extends T> type);
    -<T, U> U      fetchOne(Field<T> field, Converter<? super T, U> converter);
    -       Object fetchOne(int fieldIndex);
    -<T>    T      fetchOne(int fieldIndex, Class<? extends T> type);
    -<U>    U      fetchOne(int fieldIndex, Converter<?, U> converter);
    -       Object fetchOne(String fieldName);
    -<T>    T      fetchOne(String fieldName, Class<? extends T> type);
    -<U>    U      fetchOne(String fieldName, Converter<?, U> converter);]]></java><html>
    -
    -							<h3>Fetch transformations</h3>
    -							<p>
    -								These means of fetching are also available from <reference class="org.jooq.Result"/> and <reference class="org.jooq.Record"/> APIs
    -							</p>
    -							
    -</html><java><![CDATA[// Transform your Records into arrays, Results into matrices
    -       Object[][] fetchArrays();
    -       Object[]   fetchOneArray();
    -       
    -// Reduce your Result object into maps
    -<K>    Map<K, R>      fetchMap(Field<K> key);
    -<K, V> Map<K, V>      fetchMap(Field<K> key, Field<V> value);
    -<K, E> Map<K, E>      fetchMap(Field<K> key, Class<E> value);
    -       Map<Record, R> fetchMap(Field<?>[] key);
    -<E>    Map<Record, E> fetchMap(Field<?>[] key, Class<E> value);       
    -
    -// Transform your Result object into maps
    -       List<Map<String, Object>> fetchMaps();
    -       Map<String, Object>       fetchOneMap();
    -
    -// Transform your Result object into groups
    -<K>    Map<K, Result<R>>      fetchGroups(Field<K> key);
    -<K, V> Map<K, List<V>>        fetchGroups(Field<K> key, Field<V> value);
    -<K, E> Map<K, List<E>>        fetchGroups(Field<K> key, Class<E> value);
    -       Map<Record, Result<R>> fetchGroups(Field<?>[] key);
    -<E>    Map<Record, List<E>>   fetchGroups(Field<?>[] key, Class<E> value);
    -
    -// Transform your Records into custom POJOs
    -<E>    List<E> fetchInto(Class<? extends E> type);
    -
    -// Transform your records into another table type
    -<Z extends Record> Result<Z> fetchInto(Table<Z> table);]]></java><html>
    -
    -							<p>
    -								Note, that apart from the <reference class="org.jooq.ResultQuery" anchor="#fetchLazy()" title="fetchLazy()"/> methods, all fetch() methods will immediately close underlying JDBC result sets.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="record-vs-tablerecord">
    -								<title>Record vs. TableRecord</title>
    -								<content><html>
    -									<p>
    -										jOOQ understands that SQL is much more expressive than Java, when it comes to the declarative typing of <reference id="table-expressions" title="table expressions"/>. As a declarative language, SQL allows for creating ad-hoc row value expressions (records with indexed columns) and records (records with named columns). In Java, this is not possible to the same extent. Yet, still, sometimes you wish to use strongly typed records, when you know that you're selecting only from a single table
    -									</p>
    -									
    -									<h3>Fetching strongly or weakly typed records</h3>
    -									<p>
    -										When fetching data only from a single table, the <reference id="table-expressions" title="table expression's"/> type is known to jOOQ if you use jOOQ's <reference id="code-generation" title="code generator"/> to generate <reference id="codegen-records" title="TableRecords"/> for your database tables. In order to fetch such strongly typed records, you will have to use the <reference id="select-statement" title="simple select API"/>:
    -									</p>
    -
    -</html><java><![CDATA[// Use the selectFrom() method:
    -BookRecord book = create.selectFrom(BOOK).where(BOOK.ID.equal(1)).fetchOne();
    -
    -// Typesafe field access is now possible:
    -System.out.println("Title       : " + book.getTitle());
    -System.out.println("Published in: " + book.getPublishedIn());]]></java><html>
    -									
    -									<p>
    -										When you use the <reference class="org.jooq.FactoryOperations" anchor="#selectFrom(org.jooq.Table)" title="Factory.selectFrom()"/> method, jOOQ will return the record type supplied with the argument table. Beware though, that you will no longer be able to use any clause that modifies the type of your <reference id="table-expressions" title="table expression"/>. This includes: 
    -									</p>
    -									<ul>
    -                   						<li><reference id="select-clause" title="The SELECT clause"/></li>
    -                   						<li><reference id="join-clause" title="The JOIN clause"/></li>
    -                   						<li><reference id="group-by-clause" title="The GROUP BY clause"/></li>
    -                   						<li><reference id="having-clause" title="The HAVING clause"/></li>
    -                   					</ul>		
    -								</html></content>
    -							</section>
    -
    -							<section id="arrays-maps-and-lists">
    -								<title>Arrays, Maps and Lists</title>
    -								<content><html>
    -									<p>
    -										By default, jOOQ returns an <reference class="org.jooq.Result"/> object, which is essentially a <reference class="java.util.List"/> of <reference class="org.jooq.Record"/>. Often, you will find yourself wanting to transform this result object into a type that corresponds more to your specific needs. Or you just want to list all values of one specific column. Here are some examples to illustrate those use cases:
    -									</p>
    -									
    -</html><java><![CDATA[// Fetching only book titles (the two calls are equivalent):
    -List<String> titles1 = create.select().from(BOOK).fetch().getValues(BOOK.TITLE);
    -List<String> titles2 = create.select().from(BOOK).fetch(BOOK.TITLE);
    -String[]     titles3 = create.select().from(BOOK).fetchArray(BOOK.TITLE);
    -
    -// Fetching only book IDs, converted to Long
    -List<Long> ids1 = create.select().from(BOOK).fetch().getValues(BOOK.ID, Long.class);
    -List<Long> ids2 = create.select().from(BOOK).fetch(BOOK.ID, Long.class);
    -Long[]     ids3 = create.select().from(BOOK).fetchArray(BOOK.ID, Long.class);
    -
    -// Fetching book IDs and mapping each ID to their records or titles
    -Map<Integer, BookRecord> map1 = create.selectFrom(BOOK).fetch().intoMap(BOOK.ID);
    -Map<Integer, BookRecord> map2 = create.selectFrom(BOOK).fetchMap(BOOK.ID);
    -Map<Integer, String>     map3 = create.selectFrom(BOOK).fetch().intoMap(BOOK.ID, BOOK.TITLE);
    -Map<Integer, String>     map4 = create.selectFrom(BOOK).fetchMap(BOOK.ID, BOOK.TITLE);
    -
    -// Group by AUTHOR_ID and list all books written by any author:       
    -Map<Integer, Result<BookRecord>> group1 = create.selectFrom(BOOK).fetch().intoGroups(BOOK.AUTHOR_ID);
    -Map<Integer, Result<BookRecord>> group2 = create.selectFrom(BOOK).fetchGroups(BOOK.AUTHOR_ID);
    -Map<Integer, List<String>>       group3 = create.selectFrom(BOOK).fetch().intoGroups(BOOK.AUTHOR_ID, BOOK.TITLE);
    -Map<Integer, List<String>>       group4 = create.selectFrom(BOOK).fetchGroups(BOOK.AUTHOR_ID, BOOK.TITLE);]]></java><html>									
    -
    -									<p>
    -										Note that most of these convenience methods are available both through <reference class="org.jooq.ResultQuery"/> and <reference class="org.jooq.Result"/>, some are even available through <reference class="org.jooq.Record"/> as well.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="recordhandler">
    -								<title>RecordHandler</title>
    -								<content><html>
    -									<p>
    -										In a more functional operating mode, you might want to write callbacks that receive records from your select statement results in order to do some processing. This is a common data access pattern in Spring's JdbcTemplate, and it is also available in jOOQ. With jOOQ, you can implement your own <reference class="org.jooq.RecordHandler"/> classes and plug them into jOOQ's <reference class="org.jooq.ResultQuery"/>:
    -									</p>
    -									
    -</html><java><![CDATA[// Write callbacks to receive records from select statements
    -create.selectFrom(BOOK)
    -      .orderBy(BOOK.ID)
    -      .fetch()
    -      .into(new RecordHandler<BookRecord>() {
    -          @Override
    -          public void next(BookRecord book) {
    -              Util.doThingsWithBook(book);
    -          }
    -      });
    -      
    -// Or more concisely
    -create.selectFrom(BOOK)
    -      .orderBy(BOOK.ID)
    -      .fetchInto(new RecordHandler<BookRecord>() {...});
    -      
    -// Or even more concisely with Java 8's lambda expressions:
    -create.selectFrom(BOOK)
    -      .orderBy(BOOK.ID)
    -      .fetchInto(book -> { Util.doThingsWithBook(book); }; );
    -]]></java><html>
    -
    -									<p>
    -										See also the manual's section about the <reference id="recordmapper" title="RecordMapper"/>, which provides similar features
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="recordmapper">
    -								<title>RecordMapper</title>
    -								<content><html>
    -									<p>
    -										In a more functional operating mode, you might want to write callbacks that map records from your select statement results in order to do some processing. This is a common data access pattern in Spring's JdbcTemplate, and it is also available in jOOQ. With jOOQ, you can implement your own <reference class="org.jooq.RecordMapper"/> classes and plug them into jOOQ's <reference class="org.jooq.ResultQuery"/>:
    -									</p>
    -									
    -</html><java><![CDATA[// Write callbacks to receive records from select statements
    -List<Integer> ids =
    -create.selectFrom(BOOK)
    -      .orderBy(BOOK.ID)
    -      .fetch()
    -      .map(new RecordMapper<BookRecord, Integer>() {
    -          @Override
    -          public Integer map(BookRecord book) {
    -              return book.getId();
    -          }
    -      });
    -      
    -// Or more concisely
    -create.selectFrom(BOOK)
    -      .orderBy(BOOK.ID)
    -      .fetch(new RecordMapper<BookRecord, Integer>() {...});
    -      
    -// Or even more concisely with Java 8's lambda expressions:
    -create.selectFrom(BOOK)
    -      .orderBy(BOOK.ID)
    -      .fetch(book -> book.getId());
    -]]></java><html>
    -
    -									<p>
    -										See also the manual's section about the <reference id="recordhandler" title="RecordHandler"/>, which provides similar features
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="pojos">
    -								<title>POJOs</title>
    -								<content><html>
    -									<p>
    -										Fetching data in records is fine as long as your application is not really layered, or as long as you're still writing code in the DAO layer. But if you have a more advanced application architecture, you may not want to allow for jOOQ artefacts to leak into other layers. You may choose to write POJOs (Plain Old Java Objects) as your primary DTOs (Data Transfer Objects), without any dependencies on jOOQ's <reference class="org.jooq.Record"/> types, which may even potentially hold a reference to a <reference id="factory" title="Factory"/>, and thus a JDBC <reference class="java.sql.Connection"/>. Like Hibernate/JPA, jOOQ allows you to operate with POJOs. Unlike Hibernate/JPA, jOOQ does not "attach" those POJOs or create proxies with any magic in them.
    -									</p>
    -									<p>
    -										If you're using jOOQ's <reference id="code-generation" title="code generator"/>, you can configure it to <reference id="codegen-pojos" title="generate POJOs"/> for you, but you're not required to use those generated POJOs. You can use your own.
    -									</p>
    -									
    -									<h3>Using JPA-annotated POJOs</h3>									
    -									<p>
    -										jOOQ tries to find JPA annotations on your POJO types. If it finds any, they are used as the primary source for mapping meta-information. Only the <reference class="javax.persistence.Column"/> annotation is used and understood by jOOQ. An example:
    -									</p>
    -
    -</html><java><![CDATA[// A JPA-annotated POJO class
    -public class MyBook {
    -  @Column(name = "ID")
    -  public int myId;
    -  
    -  @Column(name = "TITLE")
    -  public String myTitle;
    -}
    -
    -// The various "into()" methods allow for fetching records into your custom POJOs:
    -MyBook myBook        = create.select().from(BOOK).fetchAny().into(MyBook.class); 
    -List<MyBook> myBooks = create.select().from(BOOK).fetch().into(MyBook.class);
    -List<MyBook> myBooks = create.select().from(BOOK).fetchInto(MyBook.class);]]></java><html>									
    -									
    -									<p>
    -										Just as with any other JPA implementation, you can put the <reference class="javax.persistence.Column"/> annotation on any class member, including attributes, setters and getters. Please refer to the <reference class="org.jooq.Record" anchor="#into(java.lang.Class)" title="Record.into()"/> Javadoc for more details.
    -									</p>
    -									
    -									<h3>Using simple POJOs</h3>
    -									<p>
    -										If jOOQ does not find any JPA-annotations, columns are mapped to the "best-matching" constructor, attribute or setter. An example illustrates this:
    -									</p>
    -									
    -</html><java><![CDATA[// A "mutable" POJO class
    -public class MyBook1 {
    -  public int id;
    -  public String title;
    -}
    -
    -// The various "into()" methods allow for fetching records into your custom POJOs:
    -MyBook1 myBook        = create.select().from(BOOK).fetchAny().into(MyBook1.class); 
    -List<MyBook1> myBooks = create.select().from(BOOK).fetch().into(MyBook1.class);
    -List<MyBook1> myBooks = create.select().from(BOOK).fetchInto(MyBook1.class);]]></java><html>	
    -
    -									<p>
    -										Please refer to the <reference class="org.jooq.Record" anchor="#into(java.lang.Class)" title="Record.into()"/> Javadoc for more details.
    -									</p>
    -									
    -									<h3>Using "immutable" POJOs</h3>
    -									<p>
    -										If jOOQ does not find any default constructor, columns are mapped to the "best-matching" constructor. This allows for using "immutable" POJOs with jOOQ. An example illustrates this:
    -									</p>
    -									
    -</html><java><![CDATA[// An "immutable" POJO class
    -public class MyBook2 {
    -  public final int id;
    -  public final String title;
    -  
    -  public MyBook2(int id, String title) {
    -    this.id = id;
    -    this.title = title;
    -  }
    -}
    -
    -// With "immutable" POJO classes, there must be an exact match between projected fields and available constructors:
    -MyBook2 myBook        = create.select(BOOK.ID, BOOK.TITLE).from(BOOK).fetchAny().into(MyBook2.class); 
    -List<MyBook2> myBooks = create.select(BOOK.ID, BOOK.TITLE).from(BOOK).fetch().into(MyBook2.class);
    -List<MyBook2> myBooks = create.select(BOOK.ID, BOOK.TITLE).from(BOOK).fetchInto(MyBook2.class);
    -
    -// An "immutable" POJO class with a java.beans.ConstructorProperties annotation
    -public class MyBook3 {
    -  public final String title;
    -  public final int id;
    -  
    -  @ConstructorProperties({ "title", "id"})
    -  public MyBook2(String title, int id) {
    -    this.title = title;
    -    this.id = id;
    -  }
    -}
    -
    -// With annotated "immutable" POJO classes, there doesn't need to be an exact match between fields and constructor arguments.
    -// In the below cases, only BOOK.ID is really set onto the POJO, BOOK.TITLE remains null and BOOK.AUTHOR_ID is ignored
    -MyBook3 myBook        = create.select(BOOK.ID, BOOK.AUTHOR_ID).from(BOOK).fetchAny().into(MyBook3.class); 
    -List<MyBook3> myBooks = create.select(BOOK.ID, BOOK.AUTHOR_ID).from(BOOK).fetch().into(MyBook3.class);
    -List<MyBook3> myBooks = create.select(BOOK.ID, BOOK.AUTHOR_ID).from(BOOK).fetchInto(MyBook3.class);
    -]]></java><html>	
    -									
    -									<p>
    -										Please refer to the <reference class="org.jooq.Record" anchor="#into(java.lang.Class)" title="Record.into()"/> Javadoc for more details.
    -									</p>
    -
    -									<h3>Using proxyable types</h3>
    -									<p>
    -										jOOQ also allows for fetching data into abstract classes or interfaces, or in other words, "proxyable" types. This means that jOOQ will return a <reference class="java.util.HashMap"/> wrapped in a <reference class="java.lang.reflect.Proxy"/> implementing your custom type. An example of this is given here:
    -									</p>
    -									
    -</html><java><![CDATA[// A "proxyable" type
    -public interface MyBook3 {
    -  int getId(); 
    -  void setId(int id);
    -  
    -  String getTitle();
    -  void setTitle(String title);
    -}
    -
    -// The various "into()" methods allow for fetching records into your custom POJOs:
    -MyBook3 myBook        = create.select(BOOK.ID, BOOK.TITLE).from(BOOK).fetchAny().into(MyBook3.class); 
    -List<MyBook3> myBooks = create.select(BOOK.ID, BOOK.TITLE).from(BOOK).fetch().into(MyBook3.class);
    -List<MyBook3> myBooks = create.select(BOOK.ID, BOOK.TITLE).from(BOOK).fetchInto(MyBook3.class);]]></java><html>									
    -
    -									<p>
    -										Please refer to the <reference class="org.jooq.Record" anchor="#into(java.lang.Class)" title="Record.into()"/> Javadoc for more details.
    -									</p>
    -
    -									<h3>Loading POJOs back into Records to store them</h3>
    -									<p>
    -										The above examples show how to fetch data into your own custom POJOs / DTOs. When you have modified the data contained in POJOs, you probably want to store those modifications back to the database. An example of this is given here:
    -									</p>
    -
    -</html><java><![CDATA[// A "mutable" POJO class
    -public class MyBook {
    -  public int id;
    -  public String title;
    -}
    -
    -// Create a new POJO instance
    -MyBook myBook = new MyBook();
    -myBook.id = 10;
    -myBook.title = "Animal Farm";
    -
    -// Load a jOOQ-generated BookRecord from your POJO
    -BookRecord book = create.newRecord(BOOK, myBook); 
    -
    -// Insert it (implicitly)
    -book.store();
    -
    -// Insert it (explicitly)
    -create.executeInsert(book);
    -
    -// or update it (ID = 10)
    -create.executeUpdate(book);]]></java><html>
    -							
    -									<p>
    -										Note: Because of your manual setting of ID = 10, jOOQ's store() method will asume that you want to insert a new record. See the manual's section about <reference id="crud-with-updatablerecords" title="CRUD with UpdatableRecords"/> for more details on this.
    -									</p>
    -											
    -									<h3>Interaction with DAOs</h3>
    -									<p>
    -										If you're using jOOQ's <reference id="code-generation" title="code generator"/>, you can configure it to <reference id="codegen-daos" title="generate DAOs"/> for you. Those DAOs operate on <reference id="codegen-pojos" title="generated POJOs"/>. An example of using such a DAO is given here:
    -									</p>
    -
    -</html><java><![CDATA[// Initialise a Factory
    -Factory create = new Factory(connection, SQLDialect.ORACLE);
    -
    -// Initialise the DAO with the Factory
    -BookDao bookDao = new BookDao(create);
    -
    -// Start using the DAO
    -Book book = bookDao.findById(5);
    -
    -// Modify and update the POJO
    -book.setTitle("1984");
    -book.setPublishedIn(1948);
    -bookDao.update(book);
    -
    -// Delete it again
    -bookDao.delete(book);]]></java><html>
    -									
    -									<h3>More complex data structures</h3>
    -									<p>
    -										jOOQ currently doesn't support more complex data structures, the way Hibernate/JPA attempt to map relational data onto POJOs. While future developments in this direction are not excluded, jOOQ claims that generic mapping strategies lead to an enormous additional complexity that only serves very few use cases. You are likely to find a solution using any of jOOQ's various <reference id="fetching" title="fetching modes"/>, with only little boiler-plate code on the client side.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="lazy-fetching">
    -								<title>Lazy fetching</title>
    -								<content><html>
    -									<p>
    -										Unlike JDBC's <reference class="java.sql.ResultSet"/>, jOOQ's <reference class="org.jooq.Result"/> does not represent an open database cursor with various fetch modes and scroll modes, that needs to be closed after usage. jOOQ's results are simple in-memory Java <reference class="java.util.List"/> objects, containing all of the result values. If your result sets are large, or if you have a lot of network latency, you may wish to fetch records one-by-one, or in small chunks. jOOQ supports a <reference class="org.jooq.Cursor"/> type for that purpose. In order to obtain such a reference, use the <reference class="org.jooq.ResultQuery" anchor="#fetchLazy()" title="ResultQuery.fetchLazy()"/> method. An example is given here:
    -									</p>
    -									
    -</html><java><![CDATA[// Obtain a Cursor reference:
    -Cursor<BookRecord> cursor = null;
    -
    -try {
    -    cursor = create.selectFrom(BOOK).fetchLazy();
    -
    -    // Cursor has similar methods as Iterator<R>
    -    while (cursor.hasNext()) {
    -        BookRecord book = cursor.fetchOne();
    -        
    -        Util.doThingsWithBook(book);
    -    }
    -}
    -
    -// Close the cursor and the cursor's underlying JDBC ResultSet
    -finally {
    -    if (cursor != null) {
    -        cursor.close();
    -    }
    -}]]></java><html>
    -
    -									<p>
    -										As a <reference class="org.jooq.Cursor"/> holds an internal reference to an open <reference class="java.sql.ResultSet"/>, it may need to be closed at the end of iteration. If a cursor is completely scrolled through, it will conveniently close the underlying ResultSet. However, you should not rely on that.
    -									</p>
    -									
    -									<h3>Cursors ship with all the other fetch features</h3>
    -									<p>
    -										Like <reference class="org.jooq.ResultQuery"/> or <reference class="org.jooq.Result"/>, <reference class="org.jooq.Cursor"/> gives access to all of the other fetch features that we've seen so far, i.e.
    -									</p>
    -									<ul>
    -										<li><reference id="record-vs-tablerecord" title="Strongly or weakly typed records"/>: Cursors are also typed with the &lt;R&gt; type, allowing to fetch custom, generated <reference class="org.jooq.TableRecord"/> or plain <reference class="org.jooq.Record"/> types.</li>
    -										<li><reference id="recordhandler" title="RecordHandler callbacks"/>: You can use your own <reference class="org.jooq.RecordHandler"/> callbacks to receive lazily fetched records.</li>
    -										<li><reference id="recordmapper" title="RecordMapper callbacks"/>: You can use your own <reference class="org.jooq.RecordMapper"/> callbacks to map lazily fetched records.</li>
    -										<li><reference id="pojos" title="POJOs"/>: You can fetch data into your own custom POJO types.</li>
    -									</ul>
    -								</html></content>
    -							</section>
    -
    -							<section id="many-fetching">
    -								<title>Many fetching</title>
    -								<content><html>
    -									<p>
    -										Many databases support returning several result sets, or cursors, from single queries. An example for this is Sybase ASE's sp_help command:
    -									</p>
    -</html><text><![CDATA[> sp_help 'author'
    -
    -+--------+-----+-----------+-------------+-------------------+
    -|Name    |Owner|Object_type|Object_status|Create_date        |
    -+--------+-----+-----------+-------------+-------------------+
    -|  author|dbo  |user table | -- none --  |Sep 22 2011 11:20PM|
    -+--------+-----+-----------+-------------+-------------------+
    -
    -+-------------+-------+------+----+-----+-----+
    -|Column_name  |Type   |Length|Prec|Scale|...  |
    -+-------------+-------+------+----+-----+-----+
    -|id           |int    |     4|NULL| NULL|    0|
    -|first_name   |varchar|    50|NULL| NULL|    1|
    -|last_name    |varchar|    50|NULL| NULL|    0|
    -|date_of_birth|date   |     4|NULL| NULL|    1|
    -|year_of_birth|int    |     4|NULL| NULL|    1|
    -+-------------+-------+------+----+-----+-----+]]></text><html>
    -
    -
    -									<p>
    -										The correct (and verbose) way to do this with JDBC is as follows:
    -									</p>
    -									
    -</html><java><![CDATA[ResultSet rs = statement.executeQuery();
    -
    -// Repeat until there are no more result sets
    -for (;;) {
    -
    -  // Empty the current result set
    -  while (rs.next()) {
    -    // [ .. do something with it .. ]
    -  }
    -
    -  // Get the next result set, if available
    -  if (statement.getMoreResults()) {
    -    rs = statement.getResultSet();
    -  }
    -  else {
    -    break;
    -  }
    -}
    -
    -// Be sure that all result sets are closed
    -statement.getMoreResults(Statement.CLOSE_ALL_RESULTS);
    -statement.close();]]></java><html>
    -
    -									<p>
    -										As previously discussed in the chapter about <reference id="comparison-with-jdbc" title="differences between jOOQ and JDBC"/>, jOOQ does not rely on an internal state of any JDBC object, which is "externalised" by Javadoc. Instead, it has a straight-forward API allowing you to do the above in a one-liner: 
    -									</p>
    -									
    -</html><java><![CDATA[// Get some information about the author table, its columns, keys, indexes, etc
    -List<Result<Record>> results = create.fetchMany("sp_help 'author'");]]></java><html>
    -
    -									<p>
    -										Using generics, the resulting structure is immediately clear.
    -									</p>									
    -								</html></content>
    -							</section>
    -
    -							<section id="later-fetching">
    -								<title>Later fetching</title>
    -								<content><html>
    -									<p>
    -										Some queries take very long to execute, yet they are not crucial for the continuation of the main program. For instance, you could be generating a complicated report in a Swing application, and while this report is being calculated in your database, you want to display a background progress bar, allowing the user to pursue some other work. This can be achived simply with jOOQ, by creating a <reference class="org.jooq.FutureResult"/>, a type that extends <reference class="java.util.concurrent.Future"/>. An example is given here:
    -									</p>
    -									
    -</html><java><![CDATA[// Spawn off this query in a separate process:
    -FutureResult<BookRecord> future = create.selectFrom(BOOK).where(... complex predicates ...).fetchLater();
    -
    -// This example actively waits for the result to be done
    -while (!future.isDone()) {
    -    progressBar.increment(1);
    -    Thread.sleep(50);
    -}
    -
    -// The result should be ready, now
    -Result<BookRecord> result = future.get();]]></java><html>
    -
    -									<p>
    -										Note, that instead of letting jOOQ spawn a new thread, you can also provide jOOQ with your own <reference class="java.util.concurrent.ExecutorService"/>:
    -									</p>
    -									
    -</html><java><![CDATA[// Spawn off this query in a separate process:
    -ExecutorService service = // [...]
    -FutureResult<BookRecord> future = create.selectFrom(BOOK).where(... complex predicates ...).fetchLater(service);]]></java></content>
    -							</section>
    -
    -							<section id="resultset-fetching">
    -								<title>ResultSet fetching</title>
    -								<content><html>
    -									<p>
    -										When interacting with legacy applications, you may prefer to have jOOQ return a <reference class="java.sql.ResultSet"/>, rather than jOOQ's own <reference class="org.jooq.Result"/> types. This can be done simply, in two ways:
    -									</p>
    -									
    -</html><java><![CDATA[// jOOQ's Cursor type exposes the underlying ResultSet:
    -ResultSet rs1 = create.selectFrom(BOOK).fetchLazy().resultSet();
    -
    -// But you can also directly access that ResultSet from ResultQuery:
    -ResultSet rs2 = create.selectFrom(BOOK).fetchResultSet();
    -
    -// Don't forget to close these, though!
    -rs1.close();
    -rs2.close();]]></java><html>
    -
    -									<h3>Transform jOOQ's Result into a JDBC ResultSet</h3>
    -									<p>
    -										Instead of operating on a JDBC ResultSet holding an open resource from your database, you can also let jOOQ's <reference class="org.jooq.Result"/> wrap itself in a <reference class="java.sql.ResultSet"/>. The advantage of this is that the so-created ResultSet has no open connection to the database. It is a completely in-memory ResultSet:								
    -									</p>
    -
    -</html><java><![CDATA[// Transform a jOOQ Result into a ResultSet
    -Result<BookRecord> result = create.selectFrom(BOOK).fetch();
    -ResultSet rs = result.intoResultSet();]]></java><html>
    -
    -									<h3>The inverse: Fetch data from a legacy ResultSet using jOOQ</h3>
    -									<p>
    -										The inverse of the above is possible too. Maybe, a legacy part of your application produces JDBC <reference class="java.sql.ResultSet"/>, and you want to turn them into a <reference class="org.jooq.Result"/>: 
    -									</p>
    -
    -</html><java><![CDATA[// Transform a JDBC ResultSet into a jOOQ Result
    -ResultSet rs = connection.createStatement().executeQuery("SELECT * FROM BOOK");
    -
    -// As a Result:
    -Result<Record> result = create.fetch(rs);
    -
    -// As a Cursor
    -Cursor<Record> cursor = create.fetchLazy(rs);]]></java></content>
    -							</section>
    -
    -							<section id="data-type-conversion">
    -								<title>Data type conversion</title>
    -								<content><html>
    -									<p>
    -										Apart from a few extra features (see the manual's section about <reference id="master-data-types" title="master data types"/> and <reference id="codegen-udts" title="user-defined types"/>), jOOQ only supports basic types as supported by the JDBC API. In your application, you may choose to transform these data types into your own ones, without writing too much boiler-plate code. This can be done using jOOQ's <reference class="org.jooq.Converter"/> types. A converter essentially allows for two-way conversion between two Java data types &lt;T&gt; and &lt;U&gt;. By convention, the &lt;T&gt; type corresponds to the type in your database whereas the &gt;U&gt; type corresponds to your own user type. The Converter API is given here:
    -									</p>
    -									
    -</html><java><![CDATA[public interface Converter<T, U> extends Serializable {
    -
    -    /**
    -     * Convert a database object to a user object
    -     */
    -    U from(T databaseObject);
    -
    -    /**
    -     * Convert a user object to a database object
    -     */
    -    T to(U userObject);
    -
    -    /**
    -     * The database type
    -     */
    -    Class<T> fromType();
    -
    -    /**
    -     * The user type
    -     */
    -    Class<U> toType();
    -}]]></java><html>
    -
    -									<p>
    -										Such a converter can be used in many parts of the jOOQ API. Some examples have been illustrated in the manual's section about <reference id="fetching" title="fetching"/>.
    -									</p>
    -									
    -									<h3>A Converter for GregorianCalendar</h3>
    -									<p>
    -										Here is a some more elaborate example involving a Converter for <reference class="java.util.GregorianCalendar"/>: 
    -									</p>
    -									
    -</html><java><![CDATA[// You may prefer Java Calendars over JDBC Timestamps
    -public class CalendarConverter implements Converter<Timestamp, GregorianCalendar> {
    -
    -    @Override
    -    public GregorianCalendar from(Timestamp databaseObject) {
    -        GregorianCalendar calendar = (GregorianCalendar) Calendar.getInstance();
    -        calendar.setTimeInMillis(databaseObject.getTime());
    -        return calendar;
    -    }
    -
    -    @Override
    -    public Timestamp to(GregorianCalendar userObject) {
    -        return new Timestamp(userObject.getTime().getTime());
    -    }
    -
    -    @Override
    -    public Class<Timestamp> fromType() {
    -        return Timestamp.class;
    -    }
    -
    -    @Override
    -    public Class<GregorianCalendar> toType() {
    -        return GregorianCalendar.class;
    -    }
    -}
    -
    -// Now you can fetch calendar values from jOOQ's API:
    -List<GregorianCalendar> dates1 = create.selectFrom(BOOK).fetch().getValues(BOOK.PUBLISHING_DATE, new CalendarConverter());
    -List<GregorianCalendar> dates2 = create.selectFrom(BOOK).fetch(BOOK.PUBLISHING_DATE, new CalendarConverter());
    -]]></java><html>									
    -									
    -									<h3>Enum Converters</h3>
    -									<p>
    -										jOOQ ships with a built-in default <reference class="org.jooq.impl.EnumConverter"/>, that you can use to map VARCHAR values to enum literals or NUMBER values to enum ordinals (both modes are supported). Let's say, you want to map a YES / NO / MAYBE column to a custom Enum:
    -									</p>
    -									
    -</html><java><![CDATA[// Define your Enum
    -public enum YNM {
    -    YES, NO, MAYBE
    -}
    -
    -// Define your converter
    -public class YNMConverter extends EnumConverter<String, YNM> {
    -    public YNMConverter() {
    -        super(String.class, YNM.class);
    -    }
    -}
    -
    -// And you're all set for converting records to your custom Enum:
    -for (BookRecord book : create.selectFrom(BOOK).fetch()) {
    -    switch (book.getValue(BOOK.I_LIKE, new YNMConverter())) {
    -        case YES:    System.out.println("I like this book             : " + book.getTitle()); break;
    -        case NO:     System.out.println("I didn't like this book      : " + book.getTitle()); break;
    -        case MAYBE:  System.out.println("I'm not sure about this book : " + book.getTitle()); break;
    -    }
    -}]]></java><html>
    -									
    -									<h3>Using Converters in generated source code</h3>
    -									<p>
    -										jOOQ also allows for generated source code to reference your own custom converters, in order to permanently replace a <reference id="table-columns" title="table column's"/> &lt;T&gt; type by your own, custom &lt;U&gt; type. See the manual's section about <reference id="custom-data-types" title="custom data types"/> for details.
    -									</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -					
    -					<section id="statement-type">
    -						<title>Static statements vs. Prepared Statements</title>
    -						<content><html>
    -							<p>
    -								With JDBC, you have full control over your SQL statements. You can decide yourself, if you want to execute a static <reference class="java.sql.Statement"/> without bind values, or a <reference class="java.sql.PreparedStatement"/> with (or without) bind values. But you have to decide early, which way to go. And you'll have to prevent SQL injection and syntax errors manually, when inlining your bind variables.
    -							</p>
    -							<p>
    -								With jOOQ, this is easier. As a matter of fact, it is plain simple. With jOOQ, you can just set a flag in your <reference id="factory" title="Factory's"/> <reference id="custom-settings" title="Settings"/>, and all queries produced by that factory will be executed as static statements, with all bind values inlined. An example is given here:
    -							</p>
    -							
    -</html><code-pair>
    -<sql><![CDATA[
    -
    -
    -
    -
    -
    -
    --- These statements are rendered by the two factories:
    -SELECT ? FROM DUAL WHERE ? = ?
    -SELECT 1 FROM DUAL WHERE 1 = 1]]></sql><java><![CDATA[// This Factory executes PreparedStatements
    -Factory prepare = new Factory(connection, SQLDialect.ORACLE);
    -
    -// This Factory exeecutes static Statements
    -Factory inlined = new Factory(connection, SQLDialect.ORACLE, 
    -  new Settings().withStatementType(StatementType.STATIC_STATEMENT));
    -  
    -prepare.select(val(1)).where(val(1).equal(1)).fetch();
    -inlined.select(val(1)).where(val(1).equal(1)).fetch();]]></java>
    -</code-pair><html>
    -
    -							<h3>Reasons for choosing one or the other</h3>
    -							<p>
    -								Not all databases are equal. Some databases show improved performance if you use <reference class="java.sql.PreparedStatement"/>, as the database will then be able to re-use execution plans for identical SQL statements, regardless of actual bind values. This heavily improves the time it takes for soft-parsing a SQL statement. In other situations, assuming that bind values are irrelevant for SQL execution plans may be a bad idea, as you might run into "bind value peeking" issues. You may be better off spending the extra cost for a new hard-parse of your SQL statement and instead having the database fine-tune the new plan to the concrete bind values.
    -							</p>
    -							<p>
    -								Whichever aproach is more optimal for you cannot be decided by jOOQ. In most cases, prepared statements are probably better. But you always have the option of forcing jOOQ to render inlined bind values.
    -							</p>
    -							
    -							<h3>Inlining bind values on a per-bind-value basis</h3>
    -							<p>
    -								Note that you don't have to inline all your bind values at once. If you know that a bind value is not really a variable and should be inlined explicitly, you can do so by using <reference class="org.jooq.impl.Factory" anchor="#inline(Object)" title="Factory.inline()"/>, as documented in the manual's section about <reference id="inlined-parameters" title="inlined parameters"/>
    -							</p>
    -						</html></content>
    -					</section>
    -
    -					<section id="reusing-statements">
    -						<title>Reusing a Query's PreparedStatement</title>
    -						<content><html>
    -							<p>
    -								As previously discussed in the chapter about <reference id="comparison-with-jdbc" title="differences between jOOQ and JDBC"/>, reusing PreparedStatements is handled a bit differently in jOOQ from how it is handled in JDBC
    -							</p>
    -							
    -							<h3>Keeping open PreparedStatements with JDBC</h3>
    -							<p>
    -								With JDBC, you can easily reuse a <reference class="java.sql.PreparedStatement"/> by not closing it between subsequent executions. An example is given here:
    -							</p>
    -							
    -</html><java><![CDATA[PreparedStatement stmt = null;
    -ResultSet rs1 = null;
    -ResultSet rs2 = null;
    -
    -try {
    -    // Execute the statement and fetch a first ResultSet
    -    stmt = connection.prepareStatement("SELECT 1 FROM DUAL");
    -    rs1  = stmt.executeQuery();
    -
    -    // Without closing the statement, execute it again to fetch another ResultSet
    -    rs2  = stmt.executeQuery();
    -}
    -finally {
    -    try { rs1.close();  } catch (Exception ignore) {}
    -    try { rs2.close();  } catch (Exception ignore) {}
    -    try { stmt.close(); } catch (Exception ignore) {}
    -}]]></java><html>
    -
    -							<p>
    -								The above technique can be quite useful when you want to reuse expensive database resources. This can be the case when your statement is executed very frequently and your database would take non-negligible time to soft-parse the prepared statement and generate a new statement / cursor resource.
    -							</p>
    -							
    -							<h3>Keeping open PreparedStatements with jOOQ</h3>
    -							<p>
    -								This is also modeled in jOOQ. However, the difference to JDBC is that closing a statement is the default action, whereas keeping it open has to be configured explicitly. This is better than JDBC, because the default action should be the one that is used most often. Keeping open statements is rarely done in average applications. Here's an example of how to keep open PreparedStatements with jOOQ:
    -							</p>
    -							
    -</html><java><![CDATA[// Create a query which is configured to keep its underlying PreparedStatement open
    -ResultQuery<Record> query = create.selectOne().keepStatement(true);
    -
    -// Execute the query twice, against the same underlying PreparedStatement:
    -try {
    -    Result<Record> result1 = query.fetch(); // This will lazily create a new PreparedStatement
    -    Result<Record> result2 = query.fetch(); // This will reuse the previous PreparedStatement
    -}
    -
    -// ... but now, you must not forget to close the query
    -finally {
    -    query.close();
    -}]]></java><html>
    -
    -							<p>
    -								The above example shows how a query can be executed twice against the same underlying PreparedStatement. Unlike in other execution scenarios, you must not forget to close this query now
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="batch-execution">
    -						<title>Using JDBC batch operations</title>
    -						<content><html>
    -							<p>
    -								With JDBC, you can easily execute several statements at once using the addBatch() method. Essentially, there are two modes in JDBC
    -							</p>
    -
    -							<ul>
    -								<li>Execute several queries without bind values</li>
    -								<li>Execute one query several times with bind values</li>
    -							</ul>
    -
    -							<p>
    -								In code, this looks like the following snippet:
    -							</p>
    -</html><java><![CDATA[// 1. several queries
    -// ------------------
    -Statement stmt = connection.createStatement();
    -stmt.addBatch("INSERT INTO author VALUES (1, 'Erich Gamma')");
    -stmt.addBatch("INSERT INTO author VALUES (2, 'Richard Helm')");
    -stmt.addBatch("INSERT INTO author VALUES (3, 'Ralph Johnson')");
    -stmt.addBatch("INSERT INTO author VALUES (4, 'John Vlissides')");
    -int[] result = stmt.executeBatch();
    -
    -// 2. a single query
    -// -----------------
    -PreparedStatement stmt = connection.prepareStatement("INSERT INTO autho VALUES (?, ?)");
    -stmt.setInt(1, 1);
    -stmt.setString(2, "Erich Gamma");
    -stmt.addBatch();
    -
    -stmt.setInt(1, 2);
    -stmt.setString(2, "Richard Helm");
    -stmt.addBatch();
    -
    -stmt.setInt(1, 3);
    -stmt.setString(2, "Ralph Johnson");
    -stmt.addBatch();
    -
    -stmt.setInt(1, 4);
    -stmt.setString(2, "John Vlissides");
    -stmt.addBatch();
    -
    -int[] result = stmt.executeBatch();]]></java><html>
    -
    -
    -							<h3>This will also be supported by jOOQ</h3>
    -							<p>
    -								jOOQ supports executing queries in batch mode as follows:
    -							</p>
    -							
    -</html><java><![CDATA[// 1. several queries
    -// ------------------
    -create.batch(
    -	create.insertInto(AUTHOR, ID, NAME).values(1, "Erich Gamma"),
    -	create.insertInto(AUTHOR, ID, NAME).values(2, "Richard Helm"),
    -	create.insertInto(AUTHOR, ID, NAME).values(3, "Ralph Johnson"),
    -	create.insertInto(AUTHOR, ID, NAME).values(4, "John Vlissides"))
    -.execute();
    -
    -// 2. a single query
    -// -----------------
    -create.batch(create.insertInto(AUTHOR, ID, NAME).values("?", "?"))
    -	  .bind(1, "Erich Gamma")
    -	  .bind(2, "Richard Helm")
    -	  .bind(3, "Ralph Johnson")
    -	  .bind(4, "John Vlissides")
    -	  .execute();]]></java></content>
    -					</section>
    -
    -				    <section id="sequence-execution">
    -						<title>Sequence execution</title>
    -						<content><html>
    -							<p>
    -								Most databases support sequences of some sort, to provide you with unique values to be used for primary keys and other enumerations. If you're using jOOQ's <reference id="code-generation" title="code generator"/>, it will generate a sequence object per sequence for you. There are two ways of using such a sequence object:
    -							</p>
    -
    -							<h3>Standalone calls to sequences</h3>
    -							<p>
    -								Instead of actually phrasing a select statement, you can also use the <reference id="factory" title="Factory's"/> convenience methods:
    -							</p>							
    -							
    -</html><java><![CDATA[// Fetch the next value from a sequence
    -BigInteger nextID = create.nextval(S_AUTHOR_ID);
    -
    -// Fetch the current value from a sequence
    -BigInteger currID = create.currval(S_AUTHOR_ID);]]></java><html>
    -							
    -							<h3>Inlining sequence references in SQL</h3>
    -							<p>
    -								You can inline sequence references in jOOQ SQL statements. The following are examples of how to do that:
    -							</p>
    -							
    -</html><java><![CDATA[// Reference the sequence in a SELECT statement:
    -BigInteger nextID = create.select(s).fetchOne(S_AUTHOR_ID.nextval());
    -
    -// Reference the sequence in an INSERT statement:
    -create.insertInto(AUTHOR, AUTHOR.ID, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -      .values(S_AUTHOR_ID.nextval(), val("William"), val("Shakespeare"));
    -]]></java><html>
    -
    -							<p>
    -								For more info about inlining sequence references in SQL statements, please refer to the manual's section about <reference id="sequences-and-serials" title="sequences and serials"/>.
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="stored-procedures">
    -						<title>Stored procedures and functions</title>
    -						<content><html>
    -							<p>
    -								Many RDBMS support the concept of "routines", usually calling them procedures and/or functions. These concepts have been around in programming languages for a while, also outside of databases. Famous languages distinguishing procedures from functions are:
    -							</p>
    -							<ul>
    -								<li>Ada</li>
    -								<li>BASIC</li>
    -								<li>Pascal</li>
    -								<li>etc...</li>
    -							</ul>
    -							<p>
    -								The general distinction between (stored) procedures and (stored) functions can be summarised like this:
    -							</p>
    -							
    -							<h3>Procedures</h3>
    -							<ul>
    -								<li>Are called using JDBC CallableStatement</li>
    -								<li>Have no return value</li>
    -								<li>Usually support OUT parameters</li>
    -							</ul>
    -							
    -							<h3>Functions</h3>
    -							<ul>
    -								<li>Can be used in SQL statements</li>
    -								<li>Have a return value</li>
    -								<li>Usually don't support OUT parameters</li>
    -							</ul>
    -							
    -							<h3>Exceptions to these rules</h3>
    -							<ul>
    -								<li>DB2, H2, and HSQLDB don't allow for JDBC escape syntax when calling functions. Functions must be used in a SELECT statement</li>
    -								<li>H2 only knows functions (without OUT parameters)</li>
    -								<li>Oracle functions may have OUT parameters</li>
    -								<li>Oracle knows functions that must not be used in SQL statements for transactional reasons</li>
    -								<li>Postgres only knows functions (with all features combined). OUT parameters can also be interpreted as return values, which is quite elegant/surprising, depending on your taste</li>
    -								<li>The Sybase jconn3 JDBC driver doesn't handle null values correctly when using the JDBC escape syntax on functions</li>
    -							</ul>
    -							<p>
    -								In general, it can be said that the field of routines (procedures / functions) is far from being standardised in modern RDBMS even if the SQL:2008 standard specifies things quite well. Every database has its ways and JDBC only provides little abstraction over the great variety of procedures / functions implementations, especially when advanced data types such as cursors / UDT's / arrays are involved.
    -							</p>
    -							<p>
    -								To simplify things a little bit, jOOQ handles both procedures and functions the same way, using a more general <reference class="org.jooq.Routine"/> type.
    -							</p>
    -							
    -							<h3>Using jOOQ for standalone calls to stored procedures and functions</h3>
    -							<p>
    -								If you're using jOOQ's <reference id="code-generation" title="code generator"/>, it will generate <reference class="org.jooq.Routine"/> objects for you. Let's consider the following example:
    -							</p>
    -							
    -</html><sql><![CDATA[-- Check whether there is an author in AUTHOR by that name and get his ID
    -CREATE OR REPLACE PROCEDURE author_exists (author_name VARCHAR2, result OUT NUMBER, id OUT NUMBER);]]></sql><html>
    -
    -							<p>
    -								The generated artefacts can then be used as follows:
    -							</p>
    -							
    -</html><java><![CDATA[// Make an explicit call to the generated procedure object:
    -AuthorExists procedure = new AuthorExists();
    -
    -// All IN and IN OUT parameters generate setters
    -procedure.setAuthorName("Paulo");
    -procedure.execute(configuration);
    -
    -// All OUT and IN OUT parameters generate getters
    -assertEquals(new BigDecimal("1"), procedure.getResult());
    -assertEquals(new BigDecimal("2"), procedure.getId();]]></java><html>							
    -							
    -							<p>
    -								But you can also call the procedure using a generated convenience method in a global Routines class:
    -							</p>
    -
    -</html><java><![CDATA[// The generated Routines class contains static methods for every procedure.
    -// Results are also returned in a generated object, holding getters for every OUT or IN OUT parameter.
    -AuthorExists result = Routines.authorExists("Paulo");
    -
    -// All OUT and IN OUT parameters generate getters
    -assertEquals(new BigDecimal("1"), procedure.getResult());
    -assertEquals(new BigDecimal("2"), procedure.getId();]]></java><html>			
    -
    -							<p>
    -								For more details about <reference id="code-generation" title="code generation"/> for procedures, see the manual's section about <reference id="codegen-procedures" title="procedures and code generation"/>.
    -							</p>				
    -							
    -							<h3>Inlining stored function references in SQL</h3>
    -							<p>
    -								Unlike procedures, functions can be inlined in SQL statements to generate <reference id="column-expressions" title="column expressions"/> or <reference id="table-expressions" title="table expressions"/>, if you're using <reference id="array-and-cursor-unnesting" title="unnesting operators"/>. Assume you have a function like this:
    -							</p>
    -
    -</html><sql><![CDATA[-- Check whether there is an author in AUTHOR by that name and get his ID
    -CREATE OR REPLACE FUNCTION author_exists (author_name VARCHAR2) RETURN NUMBER;]]></sql><html>
    -							
    -							<p>
    -								The generated artefacts can then be used as follows:
    -							</p>
    -							
    -</html><code-pair>
    -<sql><![CDATA[-- This is the rendered SQL
    -
    -SELECT AUTHOR_EXISTS('Paulo') FROM DUAL]]></sql><java><![CDATA[// Use the static-imported method from Routines:
    -boolean exists = 
    -create.select(authorExists("Paulo")).fetchOne(0, boolean.class);]]></java>							
    -</code-pair><html>
    -							
    -							<p>
    -								For more info about inlining stored function references in SQL statements, please refer to the manual's section about <reference id="user-defined-functions" title="user-defined functions"/>.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="oracle-packages">
    -								<title>Oracle Packages</title>
    -								<content><html>
    -									<p>
    -										Oracle uses the concept of a PACKAGE to group several procedures/functions into a sort of namespace. The <a href="http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt" title="SQL 92 standard">SQL 92 standard</a> talks about "modules", to represent this concept, even if this is rarely implemented as such. This is reflected in jOOQ by the use of Java sub-packages in the <reference id="code-generation" title="source code generation"/> destination package. Every Oracle package will be reflected by
    -									</p>
    -									<ul>
    -										<li>A Java package holding classes for formal Java representations of the procedure/function in that package</li>
    -										<li>A Java class holding convenience methods to facilitate calling those procedures/functions</li>
    -									</ul>
    -									<p>
    -										Apart from this, the generated source code looks exactly like the one for standalone procedures/functions.
    -									</p>
    -									<p>
    -										For more details about <reference id="code-generation" title="code generation"/> for procedures and packages see the manual's section about <reference id="codegen-procedures" title="procedures and code generation"/>.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="oracle-member-procedures">
    -								<title>Oracle member procedures</title>
    -								<content><html>
    -									<p>
    -										Oracle UDTs can have object-oriented structures including member functions and procedures. With Oracle, you can do things like this:
    -									</p>
    -									
    -</html><sql><![CDATA[CREATE OR REPLACE TYPE u_author_type AS OBJECT (
    -  id NUMBER(7),
    -  first_name VARCHAR2(50),
    -  last_name VARCHAR2(50),
    -
    -  MEMBER PROCEDURE LOAD,
    -  MEMBER FUNCTION counBOOKs RETURN NUMBER
    -)
    -
    --- The type body is omitted for the example]]></sql><html>
    -
    -									<p>
    -										These member functions and procedures can simply be mapped to Java methods:
    -									</p>
    -
    -</html><java><![CDATA[// Create an empty, attached UDT record from the Factory
    -UAuthorType author = create.newRecord(U_AUTHOR_TYPE);
    -
    -// Set the author ID and load the record using the LOAD procedure
    -author.setId(1);
    -author.load();
    -
    -// The record is now updated with the LOAD implementation's content
    -assertNotNull(author.getFirstName());
    -assertNotNull(author.getLastName());]]></java><html>
    -
    -									<p>
    -										For more details about <reference id="code-generation" title="code generation"/> for UDTs see the manual's section about <reference id="codegen-udts" title="user-defined types and code generation"/>.
    -									</p>								
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -				    <section id="exporting">
    -						<title>Exporting to XML, CSV, JSON, HTML, Text</title>
    -						<content><html>
    -							<p>
    -								If you are using jOOQ for scripting purposes or in a slim, unlayered application server, you might be interested in using jOOQ's exporting functionality (see also the <reference id="importing" title="importing functionality"/>). You can export any Result&lt;Record&gt; into the formats discussed in the subsequent chapters of the manual
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="exporting-xml">
    -								<title>Exporting XML</title>
    -								<content><java>// Fetch books and format them as XML
    -String xml = create.selectFrom(BOOK).fetch().formatXML();</java><html>
    -
    -									<p>
    -										The above query will result in an XML document looking like the following one:
    -									</p>
    -
    -</html><xml><![CDATA[<result xmlns="http://www.jooq.org/xsd/jooq-export-2.6.0.xsd">
    -  <fields>
    -    <field name="ID" type="INTEGER"/>
    -    <field name="AUTHOR_ID" type="INTEGER"/>
    -    <field name="TITLE" type="VARCHAR"/>
    -  </fields>
    -  <records>
    -    <record>
    -      <value field="ID">1</value>
    -      <value field="AUTHOR_ID">1</value>
    -      <value field="TITLE">1984</value>
    -    </record>
    -    <record>
    -      <value field="ID">2</value>
    -      <value field="AUTHOR_ID">1</value>
    -      <value field="TITLE">Animal Farm</value>
    -    </record>
    -  </records>
    -</result>]]></xml><html>
    -
    -									<p>
    -										The same result as an <reference class="org.w3c.dom.Document"/> can be obtained using the Result.intoXML() method:
    -									</p>
    -
    -
    -</html><java>// Fetch books and format them as XML
    -Document xml = create.selectFrom(BOOK).fetch().intoXML();</java><html>
    -
    -									<p>
    -										See the XSD schema definition here, for a formal definition of the XML export format:<br/>
    -										<a href="http://www.jooq.org/xsd/jooq-export-1.6.2.xsd">http://www.jooq.org/xsd/jooq-export-1.6.2.xsd</a>
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="exporting-csv">
    -								<title>Exporting CSV</title>
    -								<content><java>// Fetch books and format them as CSV
    -String csv = create.selectFrom(BOOK).fetch().formatCSV();</java><html>
    -
    -									<p>
    -										The above query will result in a CSV document looking like the following one:
    -									</p>
    -
    -</html><text>ID,AUTHOR_ID,TITLE
    -1,1,1984
    -2,1,Animal Farm</text><html>
    -
    -									<p>
    -										In addition to the standard behaviour, you can also specify a separator character, as well as a special string to represent NULL values (which cannot be represented in standard CSV):
    -									</p>
    -
    -</html><java>// Use ";" as the separator character
    -String csv = create.selectFrom(BOOK).fetch().formatCSV(';');
    -
    -// Specify "{null}" as a representation for NULL values
    -String csv = create.selectFrom(BOOK).fetch().formatCSV(';', "{null}");</java></content>
    -							</section>
    -
    -							<section id="exporting-json">
    -								<title>Exporting JSON</title>
    -								<content><java>// Fetch books and format them as JSON
    -String json = create.selectFrom(BOOK).fetch().formatJSON();</java><html>
    -
    -									<p>
    -										The above query will result in a JSON document looking like the following one:
    -									</p>
    -
    -</html><text>{"fields":[{"name":"field-1","type":"type-1"},
    -           {"name":"field-2","type":"type-2"},
    -           ...,
    -           {"name":"field-n","type":"type-n"}],
    - "records":[[value-1-1,value-1-2,...,value-1-n],
    -            [value-2-1,value-2-2,...,value-2-n]]}</text><html>
    -             
    -             						<p>
    -             							Note: This format has changed in jOOQ 2.6.0
    -             						</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="exporting-html">
    -								<title>Exporting HTML</title>
    -								<content><java>// Fetch books and format them as HTML
    -String html = create.selectFrom(BOOK).fetch().formatHTML();</java><html>
    -
    -									<p>
    -										The above query will result in an HTML document looking like the following one
    -									</p>
    -
    -</html><xml><![CDATA[<table>
    -  <thead>
    -    <tr>
    -      <th>ID</th>
    -      <th>AUTHOR_ID</th>
    -      <th>TITLE</th>
    -    </tr>
    -  </thead>
    -  <tbody>
    -    <tr>
    -      <td>1</td>
    -      <td>1</td>
    -      <td>1984</td>
    -    </tr>
    -    <tr>
    -      <td>2</td>
    -      <td>1</td>
    -      <td>Animal Farm</td>
    -    </tr>
    -  </tbody>
    -</table>]]></xml></content>
    -							</section>
    -
    -							<section id="exporting-text">
    -								<title>Exporting Text</title>
    -								<content><java>// Fetch books and format them as text
    -String text = create.selectFrom(BOOK).fetch().format();</java><html>
    -
    -									<p>
    -										The above query will result in a text document looking like the following one
    -									</p>
    -
    -</html><text>+---+---------+-----------+
    -| ID|AUTHOR_ID|TITLE      |
    -+---+---------+-----------+
    -|  1|        1|1984       |
    -|  2|        1|Animal Farm|
    -+---+---------+-----------+</text><html>
    -
    -									<p>
    -										A simple text representation can also be obtained by calling toString() on a Result object. See also the manual's section about <reference id="logging" title="DEBUG logging"/>
    -									</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -				    <section id="importing">
    -						<title>Importing data</title>
    -						<content><html>
    -							<p>
    -								If you are using jOOQ for scripting purposes or in a slim, unlayered application server, you might be interested in using jOOQ's importing functionality (see also exporting functionality). You can import data directly into a table from the formats described in the subsequent sections of this manual.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="importing-csv">
    -								<title>Importing CSV</title>
    -								<content><html>
    -
    -									<p>
    -										The below CSV data represents two author records that may have been exported previously, by jOOQ's <reference id="exporting" title="exporting functionality"/>, and then modified in Microsoft Excel or any other spreadsheet tool:
    -									</p>
    -
    -</html><text>ID;AUTHOR_ID;TITLE
    -1;1;1984
    -2;1;Animal Farm</text><html>
    -
    -									<p>
    -										With jOOQ, you can load this data using various parameters from the	loader API. A simple load may look like this:
    -									</p>
    -
    -</html><java>Factory create = new Factory(connection, dialect);
    -
    -// Load data into the AUTHOR table from an input stream
    -// holding the CSV data.
    -create.loadInto(AUTHOR)
    -      .loadCSV(inputstream)
    -      .fields(ID, AUTHOR_ID, TITLE)
    -      .execute();</java><html>
    -
    -      								<p>
    -      									Here are various other examples:
    -   									</p>
    -
    -</html><java>// Ignore the AUTHOR_ID column from the CSV file when inserting
    -create.loadInto(AUTHOR)
    -      .loadCSV(inputstream)
    -      .fields(ID, null, TITLE)
    -      .execute();
    -
    -// Specify behaviour for duplicate records.
    -create.loadInto(AUTHOR)
    -
    -      // choose any of these methods
    -      .onDuplicateKeyUpdate()
    -      .onDuplicateKeyIgnore()
    -      .onDuplicateKeyError() // the default
    -
    -      .loadCSV(inputstream)
    -      .fields(ID, null, TITLE)
    -      .execute();
    -
    -// Specify behaviour when errors occur.
    -create.loadInto(AUTHOR)
    -
    -      // choose any of these methods
    -      .onErrorIgnore()
    -      .onErrorAbort() // the default
    -
    -      .loadCSV(inputstream)
    -      .fields(ID, null, TITLE)
    -      .execute();
    -
    -// Specify transactional behaviour where this is possible
    -// (e.g. not in container-managed transactions)
    -create.loadInto(AUTHOR)
    -
    -      // choose any of these methods
    -      .commitEach()
    -      .commitAfter(10)
    -      .commitAll()
    -      .commitNone() // the default
    -
    -      .loadCSV(inputstream)
    -      .fields(ID, null, TITLE)
    -      .execute();</java><html>
    -
    -									<p>
    -										Any of the above configuration methods can be combined to achieve the type of load you need. Please refer to the API's Javadoc to learn about more details. Errors that occur during the load are reported by the execute method's result:
    -									</p>
    -
    -</html><java><![CDATA[Loader<Author> loader = /* .. */ .execute();
    -
    -// The number of processed rows
    -int processed = loader.processed();
    -
    -// The number of stored rows (INSERT or UPDATE)
    -int stored = loader.stored();
    -
    -// The number of ignored rows (due to errors, or duplicate rule)
    -int ignored = loader.ignored();
    -
    -// The errors that may have occurred during loading
    -List<LoaderError> errors = loader.errors();
    -LoaderError error = errors.get(0);
    -
    -// The exception that caused the error
    -DataAccessException exception = error.exception();
    -
    -// The row that caused the error
    -int rowIndex = error.rowIndex();
    -String[] row = error.row();
    -
    -// The query that caused the error
    -Query query = error.query();]]></java></content>
    -							</section>
    -
    -							<section id="importing-xml">
    -								<title>Importing XML</title>
    -								<content><html>
    -									<p>This is not yet supported</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -				    <section id="crud-with-updatablerecords">
    -						<title>CRUD with UpdatableRecords</title>
    -						<content><html>
    -							<p>
    -								Your database application probably consists of 50% - 80% CRUD, whereas only the remaining 20% - 50% of querying is actual querying. Most often, you will operate on records of tables without using any advanced relational concepts. This is called CRUD for
    -							</p>
    -							<ul>
    -								<li>Create (<reference id="insert-statement" title="INSERT"/>)</li>
    -								<li>Read (<reference id="select-statement" title="SELECT"/>)</li>
    -								<li>Update (<reference id="update-statement" title="UPDATE"/>)</li>
    -								<li>Delete (<reference id="delete-statement" title="DELETE"/>)</li>
    -							</ul>
    -							<p>								
    -								CRUD always uses the same patterns, regardless of the nature of underlying tables. This again, leads to a lot of boilerplate code, if you have to issue your statements yourself. Like Hibernate / JPA and other ORMs, jOOQ facilitates CRUD using a specific API involving <reference class="org.jooq.UpdatableRecord"/> types.
    -							</p>
    -							
    -							<h3>Primary keys and updatability</h3>
    -							<p>
    -								In normalised databases, every table has a primary key by which a tuple/record within that table can be uniquely identified. In simple cases, this is a (possibly auto-generated) number called ID. But in many cases, primary keys include several non-numeric columns. An important feature of such keys is the fact that in most databases, they are enforced using an index that allows for very fast random access to the table. A typical way to access / modify / delete a book is this:
    -							</p>
    -							
    -</html><sql><![CDATA[-- Inserting uses a previously generated key value or generates it afresh
    -INSERT INTO BOOK (ID, TITLE) VALUES (5, 'Animal Farm');
    -
    --- Other operations can use a previously generated key value
    -SELECT * FROM BOOK WHERE ID = 5;
    -UPDATE BOOK SET TITLE = '1984' WHERE ID = 5;
    -DELETE FROM BOOK WHERE ID = 5;]]></sql><html>
    -							
    -							<p>
    -								Normalised databases assume that a primary key is unique "forever", i.e. that a key, once inserted into a table, will never be changed or re-inserted after deletion. In order to use jOOQ's <reference id="simple-crud" title="CRUD"/> operations correctly, you should design your database accordingly.
    -							</p>
    -							
    -							<h3>Main UNIQUE keys</h3>
    -							<p>
    -								In SQL, a primary key is always also a unique key. In fact, unique keys have very similar properties as primary keys. For instance, they can be referenced from other tables' foreign keys in most databases. In the absence of a formal primary key, jOOQ assumes that the first unique key it encounters will serve as a primary key substitute. This is called the "main key" in jOOQ. In other words, a main key is:
    -							</p>
    -							<ul>
    -								<li>The primary key, if available</li>
    -								<li>The first unique key, otherwise</li>
    -							</ul>
    -							
    -							<p>
    -								For simplicity, the term "primary key" will be used in the sense of such a "main unique key" in this manual.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="simple-crud">
    -								<title>Simple CRUD</title>
    -								<content><html>
    -									<p>
    -										If you're using jOOQ's <reference id="code-generation" title="code generator"/>, it will generate <reference class="org.jooq.UpdatableRecord"/> implementations for every table that has a primary key. When <reference id="fetching" title="fetching"/> such a record form the database, these records are "attached" to the <reference id="factory" title="Factory" /> that created them. This means that they hold an internal reference to the same database connection that was used to fetch them. This connection is used internally by any of the following methods of the UpdatableRecord:
    -									</p>
    -									
    -</html><java><![CDATA[// Refresh a record from the database.
    -void refresh() throws DataAccessException;
    -
    -// Store (insert or update) a record to the database.
    -int store() throws DataAccessException;
    -
    -// Delete a record from the database
    -int delete() throws DataAccessException;]]></java><html>
    -									
    -									<p>
    -										See the manual's section about <reference id="serializability" title="serializability"/> for some more insight on "attached" objects. 
    -									</p>
    -									
    -									<h3>Storing</h3>
    -									<p>
    -										Storing a record will perform an <reference id="insert-statement" title="INSERT statement"/> or an <reference id="update-statement" title="UPDATE statement"/>. In general, new records are always inserted, whereas records loaded from the database are always updated. This is best visualised in code:
    -									</p>
    -
    -</html><java><![CDATA[// Create a new record
    -BookRecord book1 = create.newRecord(BOOK);
    -
    -// Insert the record: INSERT INTO BOOK (TITLE) VALUES ('1984');
    -book1.setTitle("1984");
    -book1.store();
    -
    -// Update the record: UPDATE BOOK SET PUBLISHED_IN = 1984 WHERE ID = [id]
    -book1.setPublishedIn(1948);
    -book1.store();
    -
    -// Get the (possibly) auto-generated ID from the record
    -Integer id = book1.getId();
    -
    -// Get another instance of the same book
    -BookRecord book2 = create.fetchOne(BOOK, BOOK.ID.equal(id));
    -
    -// Update the record: UPDATE BOOK SET TITLE = 'Animal Farm' WHERE ID = [id]
    -book2.setTitle("Animal Farm");
    -book2.store();]]></java><html>
    -									
    -									<p>
    -										Some remarks about storing:
    -									</p>
    -									<ul>
    -										<li>jOOQ sets only modified values in <reference id="insert-statement" title="INSERT statements"/> or <reference id="update-statement" title="UPDATE statements"/>. This allows for default values to be applied to inserted records, as specified in CREATE TABLE DDL statements.</li>
    -										<li>When store() performs an <reference id="insert-statement" title="INSERT statement"/>, jOOQ attempts to load any generated keys from the database back into the record. For more details, see the manual's section about <reference id="identity-values" title="IDENTITY values"/>.</li>
    -										<li>When loading records from <reference id="pojos" title="POJOs"/>, jOOQ will assume the record is a new record. It will hence attempt to INSERT it.</li>
    -										<li>When you activate <reference id="optimistic-locking" title="optimistic locking"/>, storing a record may fail, if the underlying database record has been changed in the mean time.</li>
    -									</ul>
    -																		
    -									<h3>Deleting</h3>
    -									<p>
    -										Deleting a record will remove it from the database. Here's how you delete records:
    -									</p>
    -									
    -</html><java><![CDATA[// Get a previously inserted book
    -BookRecord book = create.fetchOne(BOOK, BOOK.ID.equal(5));
    -
    -// Delete the book
    -book.delete();]]></java><html>
    -									
    -									<h3>Refreshing</h3>
    -									<p>
    -										Refreshing a record from the database means that jOOQ will issue a <reference id="select-statement" title="SELECT statement"/> to refresh all record values that are not the primary key. This is particularly useful when you use jOOQ's <reference id="optimistic-locking" title="optimistic locking"/> feature, in case a modified record is "stale" and cannot be stored to the database, because the underlying database record has changed in the mean time.
    -									</p>
    -									<p>
    -										In order to perform a refresh, use the following Java code:
    -									</p>									
    -
    -</html><java><![CDATA[// Fetch an updatable record from the database
    -BookRecord book = create.fetchOne(BOOK, BOOK.ID.equal(5));
    -
    -// Refresh the record
    -book.refresh();]]></java><html>
    -
    -									<h3>CRUD and SELECT statements</h3>
    -									<p>
    -										CRUD operations can be combined with regular querying, if you select records from single database tables, as explained in the manual's section about <reference id="select-statement" title="SELECT statements"/>. For this, you will need to use the selectFrom() method from the <reference id="factory" title="Factory"/>:
    -									</p>
    -									
    -</html><java><![CDATA[// Loop over records returned from a SELECT statement
    -for (BookRecord book : create.fetch(BOOK, BOOK.PUBLISHED_IN.equal(1948))) {
    -
    -  // Perform actions on BookRecords depending on some conditions
    -  if ("Orwell".equals(book.fetchAuthorByAuthorId().getLastName())) {
    -    book.delete();
    -  }
    -}]]></java></content>
    -							</section>
    -
    -							<section id="identity-values">
    -								<title>IDENTITY values</title>
    -								<content><html>
    -									<p>
    -										Many databases support the concept of IDENTITY values, or <reference id="sequence-execution" title="SEQUENCE-generated"/> key values. This is reflected by JDBC's <reference class="java.sql.Statement" anchor="#getGeneratedKeys()" title="getGeneratedKeys()"/> method. jOOQ abstracts using this method as many databases and JDBC drivers behave differently with respect to generated keys. Let's assume the following SQL Server BOOK table:
    -									</p>
    -									
    -</html><sql><![CDATA[CREATE TABLE book (
    -  ID INTEGER IDENTITY(1,1) NOT NULL,
    -  
    -  -- [...]
    -  
    -  CONSTRAINT pk_book PRIMARY KEY (id)
    -)]]></sql><html>
    -
    -									<p>
    -										If you're using jOOQ's <reference id="code-generation" title="code generator"/>, the above table will generate a <reference class="org.jooq.UpdatableRecord"/> with an IDENTITY column. This information is used by jOOQ internally, to update IDs after calling <reference id="crud-with-updatablerecords" title="store()"/>: 
    -									</p>
    -									
    -</html><java><![CDATA[BookRecord book = create.newRecord(BOOK);
    -book.setTitle("1984");
    -book.store();
    -
    -// The generated ID value is fetched after the above INSERT statement
    -System.out.println(book.getId());]]></java><html>
    -
    -									<h3>Database compatibility</h3>
    -									<p>
    -										<strong>DB2, Derby, HSQLDB, Ingres</strong>
    -									</p>
    -									<p>
    -										These SQL dialects implement the standard very neatly.
    -									</p>
    -</html><sql><![CDATA[id INTEGER GENERATED BY DEFAULT AS IDENTITY
    -id INTEGER GENERATED BY DEFAULT AS IDENTITY (START WITH 1)]]></sql><html>
    -
    -									<p>
    -										<strong>H2, MySQL, Postgres, SQL Server, Sybase ASE, Sybase SQL Anywhere</strong>
    -									</p>
    -									<p>
    -										These SQL dialects implement identites, but the DDL syntax doesn’t follow the standard
    -									</p>
    -</html><sql><![CDATA[-- H2 mimicks MySQL's and SQL Server's syntax
    -ID INTEGER IDENTITY(1,1)
    -ID INTEGER AUTO_INCREMENT
    --- MySQL and SQLite
    -ID INTEGER NOT NULL AUTO_INCREMENT
    -
    --- Postgres serials implicitly create a sequence
    --- Postgres also allows for selecting from custom sequences
    --- That way, sequences can be shared among tables
    -id SERIAL NOT NULL
    -
    --- SQL Server
    -ID INTEGER IDENTITY(1,1) NOT NULL
    --- Sybase ASE
    -id INTEGER IDENTITY NOT NULL
    --- Sybase SQL Anywhere
    -id INTEGER NOT NULL IDENTITY]]></sql><html>
    -
    -									<p>
    -										<strong>Oracle</strong>
    -									</p>
    -									<p>
    -										Oracle does not know any identity columns at all. Instead, you will have to use a trigger and update the ID column yourself, using a custom sequence. Something along these lines:
    -									</p>
    -</html><sql><![CDATA[CREATE OR REPLACE TRIGGER my_trigger
    -BEFORE INSERT
    -ON my_table
    -REFERENCING NEW AS new
    -FOR EACH ROW
    -BEGIN
    -  SELECT my_sequence.nextval
    -  INTO :new.id
    -  FROM dual;
    -END my_trigger;]]></sql><html>
    -
    -									<p>
    -										Note, that this approach can be employed in most databases supporting sequences and triggers! It is a lot more flexible than standard identities
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="navigation-methods">
    -								<title>Navigation methods</title>
    -								<content><html>
    -									<p>
    -										When using jOOQ's <reference id="code-generation" title="code generator"/> along with its <reference id="codegen-records" title="record generation capabilities"/>, generated records can have navigation methods contained in them, if properly <reference id="codegen-advanced" title="configured"/>. These navigation methods allow for "navigating" inbound or outbound foreign key references by executing an appropriate query. An example is given here: 
    -									</p>
    -				
    -</html><code-pair>
    -<sql><![CDATA[CREATE TABLE book (
    -  AUTHOR_ID NUMBER(7) NOT NULL,
    -  
    -  -- [...]
    -  
    -  FOREIGN KEY (AUTHOR_ID) REFERENCES author(ID)
    -)]]></sql><java><![CDATA[BookRecord book = create.fetch(BOOK, BOOK.ID.equal(5));
    -
    -// Find the author of a book
    -AuthorRecord author = book.fetchAuthor();
    -
    -// Find other books by that author
    -List<BookRecord> books = author.fetchBookList();]]></java>
    -</code-pair><html>					
    -
    -									<p>
    -										These methods are safe for use with several foreign keys referencing the same tables:
    -									</p>
    -				
    -</html><code-pair>
    -<sql><![CDATA[CREATE TABLE book (
    -  AUTHOR_ID NUMBER(7) NOT NULL,
    -  CO_AUTHOR_ID NUMBER(7) NOT NULL,
    -  
    -  -- [...]
    -  
    -  FOREIGN KEY (AUTHOR_ID) REFERENCES author(ID),
    -  FOREIGN KEY (CO_AUTHOR_ID) REFERENCES author(ID)
    -)]]></sql><java><![CDATA[BookRecord book = create.fetch(BOOK, BOOK.ID.equal(5));
    -
    -// Find the author of a book
    -AuthorRecord author   = book.fetchAuthorByAuthorId();
    -AuthorRecord coAuthor = book.fetchAuthorByCoAuthorId();
    -
    -// Find other books by those authors
    -List<BookRecord> books = author.fetchBookListByAuthorId();
    -List<BookRecord> books = coAuthor.fetchBookListByCoAuthorId();]]></java>
    -</code-pair><html>					
    -
    -									<p>
    -										Note that, unlike in Hibernate, jOOQ's generated navigation methods will always lazy-fetch relevant records, without caching any results. In other words, every time you run such a fetch method, a new query will be issued.
    -									</p>
    -									<p>
    -										These fetch methods only work on "attached" records. See the manual's section about <reference id="serializability" title="serializability"/> for some more insight on "attached" objects.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="non-updatable-records">
    -								<title>Non-updatable records</title>
    -								<content><html>
    -									<p>
    -										Tables without UNIQUE keys are considered non-updatable by jOOQ, as jOOQ has no way of uniquely identifying such a record within the database. If you're using jOOQ's <reference id="code-generation" title="code generator"/>, such tables will generate <reference class="org.jooq.TableRecord"/> classes, instead of <reference class="org.jooq.UpdatableRecord"/> classes. When you fetch <reference id="record-vs-tablerecord" title="typed records"/> from such a table, the returned records will not allow for calling any of the <reference id="crud-with-updatablerecords" title="store(), refresh(), delete()"/> methods. 
    -									</p>
    -									
    -									<p>
    -										Note, that some databases use internal rowid or object-id values to identify such records. jOOQ does not support these vendor-specific record meta-data.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="optimistic-locking">
    -								<title>Optimistic locking</title>
    -								<content><html>
    -									<p>
    -										jOOQ allows you to perform <reference id="crud-with-updatablerecords" title="CRUD"/> operations using optimistic locking. You can immediately take advantage of this feature by activating the relevant <reference id="custom-settings" title="executeWithOptimisticLocking Setting"/>. Without any further knowledge of the underlying data semantics, this will have the following impact on store() and delete() methods:
    -									</p>
    -									<ul>
    -										<li>INSERT statements are not affected by this Setting flag</li>
    -										<li>Prior to UPDATE or DELETE statements, jOOQ will run a <reference id="for-update-clause" title="SELECT .. FOR UPDATE"/> statement, pessimistically locking the record for the subsequent UPDATE / DELETE</li>
    -										<li>The data fetched with the previous SELECT will be compared against the data in the record being stored or deleted</li>
    -										<li>An <reference class="org.jooq.exception.DataChangedException"/> is thrown if the record had been modified in the mean time</li>
    -										<li>The record is successfully stored / deleted, if the record had not been modified in the mean time.</li>
    -									</ul>
    -									<p>
    -										The above changes to jOOQ's behaviour are transparent to the API, the only thing you need to do for it to be activated is to set the Settings flag. Here is an example illustrating optimistic locking:
    -									</p>
    -
    -</html><java><![CDATA[// Properly configure the Factory
    -Factory optimistic = new Factory(connection, SQLDialect.ORACLE, 
    -  new Settings().withExecuteWithOptimisticLocking(true));
    -  
    -// Fetch a book two times
    -BookRecord book1 = optimistic.fetch(BOOK, BOOK.ID.equal(5));
    -BookRecord book2 = optimistic.fetch(BOOK, BOOK.ID.equal(5));
    -
    -// Change the title and store this book. The underlying database record has not been modified, it can be safely updated.
    -book1.setTitle("Animal Farm");
    -book1.store();
    -
    -// Book2 still references the original TITLE value, but the database holds a new value from book1.store(). 
    -// This store() will thus fail:
    -book2.setTitle("1984");
    -book2.store();]]></java><html>								
    -	
    -									<h3>Optimised optimistic locking using TIMESTAMP fields</h3>
    -									<p>
    -										If you're using jOOQ's <reference id="code-generation" title="code generator"/>, you can take indicate TIMESTAMP or UPDATE COUNTER fields for every generated table in the <reference id="codegen-advanced" title="code generation configuration"/>. Let's say we have this table:
    -									</p>
    -
    -</html><sql><![CDATA[CREATE TABLE book (
    -  
    -  -- This column indicates when each book record was modified for the last time
    -  MODIFIED TIMESTAMP NOT NULL,
    -  -- [...]
    -)]]></sql><html>									
    -
    -									<p>
    -										The MODIFIED column will contain a timestamp indicating the last modification timestamp for any book in the BOOK table. If you're using jOOQ and it's <reference id="crud-with-updatablerecords" title="store() methods on UpdatableRecords"/>, jOOQ will then generate this TIMESTAMP value for you, automatically. However, instead of running an additional <reference id="for-update-clause" title="SELECT .. FOR UPDATE"/> statement prior to an UPDATE or DELETE statement, jOOQ adds a WHERE-clause to the UPDATE or DELETE statement, checking for TIMESTAMP's integrity. This can be best illustrated with an example:   
    -									</p>
    -									
    -</html><java><![CDATA[// Properly configure the Factory
    -Factory optimistic = new Factory(connection, SQLDialect.ORACLE, 
    -  new Settings().withExecuteWithOptimisticLocking(true));
    -  
    -// Fetch a book two times
    -BookRecord book1 = optimistic.fetch(BOOK, BOOK.ID.equal(5));
    -BookRecord book2 = optimistic.fetch(BOOK, BOOK.ID.equal(5));
    -
    -// Change the title and store this book. The MODIFIED value has not been changed since the book was fetched. 
    -// It can be safely updated
    -book1.setTitle("Animal Farm");
    -book1.store();
    -
    -// Book2 still references the original MODIFIED value, but the database holds a new value from book1.store(). 
    -// This store() will thus fail:
    -book2.setTitle("1984");
    -book2.store();]]></java><html>
    -
    -									<p>
    -										As before, without the added TIMESTAMP column, optimistic locking is transparent to the API.
    -									</p>
    -									
    -									<h3>Optimised optimistic locking using VERSION fields</h3>
    -									<p>
    -										Instead of using TIMESTAMPs, you may also use numeric VERSION fields, containing version numbers that are incremented by jOOQ upon store() calls.
    -									</p>
    -
    -									<p>
    -										Note, for explicit pessimistic locking, please consider the manual's section about the <reference id="for-update-clause" title="FOR UPDATE clause"/>. For more details about how to configure TIMESTAMP or VERSION fields, consider the manual's section about <reference id="codegen-advanced" title="advanced code generator configuration"/>.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="batch-execution-for-crud">
    -								<title>Batch execution</title>
    -								<content><html>
    -									<p>
    -										When inserting, updating, deleting a lot of records, you may wish to profit from JDBC batch operations, which can be performed by jOOQ. These are available through jOOQ's <reference id="factory" title="Factory"/> as shown in the following example:
    -									</p>
    -									
    -</html><java><![CDATA[// Fetch a bunch of books
    -List<BookRecord> books = create.fetch(BOOK);
    -
    -// Modify the above books, and add some new ones:
    -modify(books);
    -addMore(books);
    -
    -// Batch-update and/or insert all of the above books
    -create.batchStore(books);]]></java><html>					
    -
    -									<p>
    -										Internally, jOOQ will render all the required SQL statements and execute them as a regular <reference id="batch-execution" title="JDBC batch execution"/>. 
    -									</p>				
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -				    <section id="daos">
    -						<title>DAOs</title>
    -						<content><html>
    -							<p>
    -								If you're using jOOQ's <reference id="code-generation" title="code generator"/>, you can configure it to generate <reference id="pojos" title="POJOs" /> and DAOs for you. jOOQ then generates one DAO per <reference id="crud-with-updatablerecords" title="UpdatableRecord"/>, i.e. per table with a single-column primary key. Generated DAOs implement a common jOOQ type called <reference class="org.jooq.DAO"/>. This type contains the following methods:
    -							</p>
    -							
    -</html><java><![CDATA[// <R> corresponds to the DAO's related table
    -// <P> corresponds to the DAO's related generated POJO type
    -// <T> corresponds to the DAO's related table's primary key type. 
    -// Note that multi-column primary keys are not yet supported by DAOs
    -public interface DAO<R extends TableRecord<R>, P, T> {
    -
    -    // These methods allow for inserting POJOs
    -    void insert(P object) throws DataAccessException;
    -    void insert(P... objects) throws DataAccessException;
    -    void insert(Collection<P> objects) throws DataAccessException;
    -    
    -    // These methods allow for updating POJOs based on their primary key
    -    void update(P object) throws DataAccessException;
    -    void update(P... objects) throws DataAccessException;
    -    void update(Collection<P> objects) throws DataAccessException;
    -    
    -    // These methods allow for deleting POJOs based on their primary key
    -    void delete(P... objects) throws DataAccessException;
    -    void delete(Collection<P> objects) throws DataAccessException;
    -    void deleteById(T... ids) throws DataAccessException;
    -    void deleteById(Collection<T> ids) throws DataAccessException;
    -    
    -    // These methods allow for checking record existence
    -    boolean exists(P object) throws DataAccessException;
    -    boolean existsById(T id) throws DataAccessException;
    -    long count() throws DataAccessException;
    -    
    -    // These methods allow for retrieving POJOs by primary key or by some other field
    -    List<P> findAll() throws DataAccessException;
    -    P findById(T id) throws DataAccessException;
    -    <Z> List<P> fetch(Field<Z> field, Z... values) throws DataAccessException;
    -    <Z> P fetchOne(Field<Z> field, Z value) throws DataAccessException;
    -
    -    // These methods provide DAO meta-information
    -    Table<R> getTable();
    -    Class<P> getType();
    -}]]></java><html>
    -
    -							<p>
    -								Besides these base methods, generated DAO classes implement various useful fetch methods. An incomplete example is given here, for the BOOK table:
    -							</p>
    -
    -</html><java><![CDATA[// An example generated BookDao class
    -public class BookDao extends DAOImpl<BookRecord, Book, Integer> {
    -
    -    // Columns with primary / unique keys produce fetchOne() methods    
    -    public Book fetchOneById(Integer value) { ... }
    -
    -    // Other columns produce fetch() methods, returning several records
    -    public List<Book> fetchByAuthorId(Integer... values) { ... }
    -    public List<Book> fetchByTitle(String... values) { ... }
    -}]]></java><html>
    -							<p>
    -								Note that you can further subtype those pre-generated DAO classes, to add more useful DAO methods to them. Using such a DAO is simple:
    -							</p>
    -							
    -</html><java><![CDATA[// Initialise a Factory
    -Factory create = new Factory(connection, SQLDialect.ORACLE);
    -
    -// Initialise the DAO with the Factory
    -BookDao bookDao = new BookDao(create);
    -
    -// Start using the DAO
    -Book book = bookDao.findById(5);
    -
    -// Modify and update the POJO
    -book.setTitle("1984");
    -book.setPublishedIn(1948);
    -bookDao.update(book);
    -
    -// Delete it again
    -bookDao.delete(book);]]></java></content>
    -					</section>
    -
    -				    <section id="exception-handling">
    -						<title>Exception handling</title>
    -						<content><html>
    -							<h3>Checked vs. unchecked exceptions</h3>
    -							<p>
    -								This is an eternal and religious debate. Pros and cons have been discussed time and again, and it still is a matter of taste, today. In this case, jOOQ clearly takes a side. jOOQ's exception strategy is simple:
    -							</p>
    -							<ul>
    -								<li>All "system exceptions" are unchecked. If in the middle of a transaction involving business logic, there is no way that you can recover sensibly from a lost database connection, or a constraint violation that indicates a bug in your understanding of your database model.</li>
    -								<li>All "business exceptions" are checked. Business exceptions are true exceptions that you should handle (e.g. not enough funds to complete a transaction).</li>
    -							</ul>
    -							<p>
    -								With jOOQ, it's simple. All of jOOQ's exceptions are "system exceptions", hence they are all unchecked.
    -							</p>
    -							
    -							<h3>jOOQ's DataAccessException</h3>
    -							<p>
    -								jOOQ uses its own <reference class="org.jooq.exception.DataAccessException"/> to wrap any underlying <reference class="java.sql.SQLException"/> that might have occurred. Note that all methods in jOOQ that may cause such a DataAccessException document this both in the Javadoc as well as in their method signature.
    -							</p>
    -							<p>
    -								DataAccessException is subtyped several times as follows:
    -							</p>
    -							<ul>
    -								<li><strong>DataAccessException</strong>: General exception usually originating from a <reference class="java.sql.SQLException"/></li>
    -								<li><strong>DataChangedException</strong>: An exception indicating that the database's underlying record has been changed in the mean time (see <reference id="optimistic-locking" title="optimistic locking"/>)</li>
    -								<li><strong>DataTypeException</strong>: Something went wrong during type conversion</li>
    -								<li><strong>DetachedException</strong>: A SQL statement was executed on a "detached" <reference id="crud-with-updatablerecords" title="UpdatableRecord"/> or a "detached" <reference id="sql-statements" title="SQL statement"/>.</li>
    -								<li><strong>InvalidResultException</strong>: An operation was performed expecting only one result, but several results were returned.</li>
    -								<li><strong>MappingException</strong>: Something went wrong when loading a record from a <reference id="pojos" title="POJO"/> or when mapping a record into a POJO</li>
    -							</ul>
    -							
    -							<h3>Override jOOQ's exception handling</h3>
    -							<p>
    -								The following section about <reference id="execute-listeners" title="execute listeners"/> documents means of overriding jOOQ's exception handling, if you wish to deal separately with some types of constraint violations, or if you raise business errors from your database, etc.
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="execute-listeners">
    -						<title>ExecuteListeners</title>
    -						<content><html>
    -							<p>
    -								The <reference id="custom-settings" title="jOOQ Factory Settings"/> let you specify a list of <reference class="org.jooq.ExecuteListener"/> classes. The ExecuteListener is essentially an event listener for Query, Routine, or ResultSet render, prepare, bind, execute, fetch steps. It is a base type for loggers, debuggers, profilers, data collectors, triggers, etc. Advanced ExecuteListeners can also provide custom implementations of Connection, PreparedStatement and ResultSet to jOOQ in apropriate methods.
    -							</p>
    -							<p>
    -								For convenience and better backwards-compatibility, consider extending <reference class="org.jooq.impl.DefaultExecuteListener"/> instead of implementing this interface.
    -							</p>
    -							<p>
    -								Here is a sample implementation of an ExecuteListener, that is simply counting the number of queries per type that are being executed using jOOQ:
    -							</p>
    -
    -</html><java><![CDATA[package com.example;
    -
    -// Extending DefaultExecuteListener, which provides empty implementations for all methods...
    -public class StatisticsListener extends DefaultExecuteListener {
    -    public static Map<ExecuteType, Integer> STATISTICS = new HashMap<ExecuteType, Integer>();
    -
    -    // Count "start" events for every type of query executed by jOOQ
    -    @Override
    -    public void start(ExecuteContext ctx) {
    -        synchronized (STATISTICS) {
    -            Integer count = STATISTICS.get(ctx.type());
    -    
    -            if (count == null) {
    -                count = 0;
    -            }
    -    
    -            STATISTICS.put(ctx.type(), count + 1);
    -        }
    -    }
    -}]]></java><html>
    -
    -							<p>
    -								Now, configure jOOQ's runtime to load your listener
    -							</p>
    -
    -</html><xml><![CDATA[<settings>
    -  <executeListeners>
    -    <executeListener>com.example.StatisticsListener</executeListener>
    -  </executeListeners>
    -</settings>]]></xml><html>
    -
    -							<p>
    -								And log results any time with a snippet like this:
    -							</p>
    -
    -</html><java><![CDATA[log.info("STATISTICS");
    -log.info("----------");
    -
    -for (ExecuteType type : ExecuteType.values()) {
    -    log.info(type.name(), StatisticsListener.STATISTICS.get(type) + " executions");
    -}]]></java><html>
    -                            <p>
    -                            	This may result in the following log output:
    -                            </p>
    -
    -</html><config>15:16:52,982  INFO - TEST STATISTICS
    -15:16:52,982  INFO - ---------------
    -15:16:52,983  INFO - READ                     : 919 executions
    -15:16:52,983  INFO - WRITE                    : 117 executions
    -15:16:52,983  INFO - DDL                      : 2 executions
    -15:16:52,983  INFO - BATCH                    : 4 executions
    -15:16:52,983  INFO - ROUTINE                  : 21 executions
    -15:16:52,983  INFO - OTHER                    : 30 executions</config><html>
    -
    -							<p>
    -								Please read the <reference class="org.jooq.ExecuteListener" title="ExecuteListener Javadoc"/> for more details
    -							</p>
    -							
    -							<h3>Writing a custom ExecuteListener for logging</h3>
    -							<p>
    -								The following depicts an example of a custom ExecuteListener, which pretty-prints all queries being executed by jOOQ to stdout:
    -							</p>
    -
    -</html><java><![CDATA[import org.jooq.ExecuteContext;
    -import org.jooq.conf.Settings;
    -import org.jooq.impl.DefaultExecuteListener;
    -import org.jooq.impl.Factory;
    -import org.jooq.tools.StringUtils;
    -
    -public class PrettyPrinter extends DefaultExecuteListener {
    -
    -    /**
    -     * Hook into the query execution lifecycle before executing queries
    -     */
    -    @Override
    -    public void executeStart(ExecuteContext ctx) {
    -
    -        // Create a new factory for logging rendering purposes
    -        // This factory doesn't need a connection, only the SQLDialect...
    -        Factory factory = new Factory(ctx.getDialect(), 
    -        
    -        // ... and the flag for pretty-printing
    -        	new Settings().withRenderFormatted(true));
    -
    -        // If we're executing a query
    -        if (ctx.query() != null) {
    -            System.out.println(factory.renderInlined(ctx.query()));
    -        }
    -        
    -        // If we're executing a routine
    -        else if (ctx.routine() != null) {
    -            System.out.println(factory.renderInlined(ctx.routine()));
    -        }
    -        
    -        // If we're executing anything else (e.g. plain SQL)
    -        else if (!StringUtils.isBlank(ctx.sql())) {
    -            System.out.println(ctx.sql());
    -        }
    -    }
    -}]]></java><html>
    -							<p>
    -								See also the manual's sections about <reference id="logging" title="logging"/> and the <reference id="jooq-console" title="jOOQ Console"/> for more sample implementations of actual ExecuteListeners.
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="logging">
    -						<title>Logging</title>
    -						<content><html>
    -							<p>
    -								jOOQ logs all SQL queries and fetched result sets to its internal DEBUG logger, which is implemented as an <reference id="execute-listeners" title="execute listener"/>. By default, execute logging is activated in the <reference id="custom-settings" title="jOOQ Factory Settings"/>. In order to see any DEBUG log output, put either log4j or slf4j on jOOQ's classpath along with their respective configuration. A sample log4j configuration can be seen here:
    -							</p>
    -							
    -</html><xml><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
    -<log4j:configuration>
    -    <appender name="stdout" class="org.apache.log4j.ConsoleAppender">
    -        <layout class="org.apache.log4j.PatternLayout">
    -            <param name="ConversionPattern" value="%m%n" />
    -        </layout>
    -    </appender>
    -
    -    <root>
    -        <priority value="debug" />
    -        <appender-ref ref="stdout" />
    -    </root>
    -</log4j:configuration>]]></xml><html>
    -
    -							<p>
    -								With the above configuration, let's fetch some data with jOOQ
    -							</p>
    -							
    -</html><java><![CDATA[// Using H2, this time
    -create.select(BOOK.ID, BOOK.TITLE).from(BOOK).orderBy(BOOK.ID).limit(1, 2).fetch();]]></java><html>
    -
    -							<p>
    -								The above query may result in the following log output:
    -							</p>
    -
    -</html><text><![CDATA[Executing query          : select "BOOK"."ID", "BOOK"."TITLE" from "BOOK" order by "BOOK"."ID" asc, limit ? offset ?
    --> with bind values      : select "BOOK"."ID", "BOOK"."TITLE" from "BOOK" order by "BOOK"."ID" asc, limit 2 offset 1
    -Query executed           : Total: 1.439ms
    -Fetched result           : +----+------------+
    -                         : |  ID|TITLE       |
    -                         : +----+------------+
    -                         : |   2|Animal Farm |
    -                         : |   3|O Alquimista|
    -                         : +----+------------+
    -Finishing                : Total: 4.814ms, +3.375ms
    -]]></text><html>
    -
    -							<p>
    -								Essentially, jOOQ will log
    -							</p>
    -							<ul>
    -								<li>The SQL statement as rendered to the prepared statement</li>
    -								<li>The SQL statement with inlined bind values (for improved debugging)</li>
    -								<li>The query execution time</li>
    -								<li>The first 5 records of the result. This is formatted using <reference id="exporting-text" title="jOOQ's text export"/></li>
    -								<li>The total execution + fetching time</li>
    -							</ul>
    -
    -							<p>
    -								If you wish to use your own logger (e.g. avoiding printing out sensitive data), you can deactivate jOOQ's logger using <reference id="custom-settings" title="your custom settings"/> and implement your own <reference id="execute-listeners" title="execute listener logger"/>.
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="performance-considerations">
    -						<title>Performance considerations</title>
    -						<content><html>
    -							<p>
    -								Many users may have switched from higher-level abstractions such as Hibernate to jOOQ, because of Hibernate's hard-to-manage performance, when it comes to large database schemas and complex second-level caching strategies. jOOQ is not a lightweight database abstraction framework, and it comes with its own overhead. Please be sure to consider the following points:
    -							</p>
    -							<ul>
    -								<li>It takes some time to construct jOOQ queries. If you can reuse the same queries, you might cache them. Beware of thread-safety issues, though, as jOOQ's <reference id="factory" title="Factory"/> is not threadsafe, and queries are "attached" to their creating Factory</li>
    -								<li>It takes some time to render SQL strings. Internally, jOOQ reuses the same <reference class="java.lang.StringBuilder"/> for the complete query, but some rendering elements may take their time. You could, of course, cache SQL generated by jOOQ and prepare your own <reference class="java.sql.PreparedStatement"/> objects</li>
    -								<li>It takes some time to bind values to prepared statements. jOOQ does not keep any open prepared statements, internally. Use a sophisticated connection pool, that will cache prepared statements and inject them into jOOQ through the standard JDBC API</li>
    -								<li>It takes some time to fetch results. By default, jOOQ will always fetch the complete <reference class="java.sql.ResultSet"/> into memory. Use <reference id="lazy-fetching" title="lazy fetching"/> to prevent that, and scroll over an open underlying database cursor</li>
    -							</ul>
    -							
    -							<h3>Optimise wisely</h3>
    -							<p>
    -								Don't be put off by the above paragraphs. You should optimise wisely, i.e. only in places where you really need very high throughput to your database. jOOQ's overhead compared to plain JDBC is typically less than 1ms per query.
    -							</p>
    -						</html></content>
    -					</section>
    -				</sections>
    -			</section>
    -
    -			<section id="code-generation">
    -				<title>Code generation</title>
    -				<content><html>
    -					<p>
    -						While optional, source code generation is one of jOOQ's main assets if you wish to increase developer productivity. jOOQ's code generator takes your database schema and reverse-engineers it into a set of Java classes modelling <reference id="table-expressions" title="tables"/>, <reference id="record-vs-tablerecord" title="records"/>, <reference id="sequence-execution" title="sequences"/>, <reference id="pojos" title="POJOs"/>, <reference id="daos" title="DAOs"/>, <reference id="stored-procedures" title="stored procedures"/>, user-defined types and many more.
    -					</p>
    -					<p>
    -						The essential ideas behind source code generation are these:
    -					</p>
    -					<ul>
    -						<li><strong>Increased IDE support</strong>: Type your Java code directly against your database schema, with all type information available</li>
    -						<li><strong>Type-safety</strong>: When your database schema changes, your generated code will change as well. Removing columns will lead to compilation errors, which you can detect early.</li>
    -					</ul>
    -					<p>
    -						The following chapters will show how to configure the code generator and how to generate various artefacts.
    -					</p>
    -				</html></content>
    -
    -				<sections>
    -				    <section id="codegen-configuration">
    -						<title>Configuration and setup of the generator</title>
    -						<content><html>
    -							<p>
    -								There are three binaries available with jOOQ, to be downloaded from <a href="https://sourceforge.net/projects/jooq/">SourceForge</a> or from Maven central:
    -							</p>
    -							<ul>
    -								<li>
    -									<strong>jooq-{jooq-version}.jar</strong>
    -									<br />
    -									The main library that you will include in your application to run jOOQ
    -								</li>
    -								<li>
    -									<strong>jooq-meta-{jooq-version}.jar</strong>
    -									<br />
    -									The utility that you will include in your build to navigate your database schema for code generation. This can be used as a schema crawler as well.
    -								</li>
    -								<li>
    -									<strong>jooq-codegen-{jooq-version}.jar</strong>
    -									<br />
    -									The utility that you will include in your build to generate your database schema
    -								</li>
    -							</ul>
    -
    -							<h3>Configure jOOQ's code generator</h3>
    -							<p>
    -								You need to tell jOOQ some things about your database connection. Here's an example of how to do it for an Oracle database
    -							</p>
    -							
    -</html><xml><![CDATA[<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    -<configuration>
    -  <!-- Configure the database connection here -->
    -  <jdbc>
    -    <driver>oracle.jdbc.OracleDriver</driver>
    -    <url>jdbc:oracle:thin:@[your jdbc connection parameters]</url>
    -    <user>[your database user]</user>
    -    <password>[your database password]</password>
    -    
    -    <!-- You can also pass user/password and other JDBC properties in the optional properties tag: -->
    -    <properties>
    -      <property><key>user</key><value>[db-user]</value></property>
    -      <property><key>password</key><value>[db-password]</value></property>
    -    </properties>
    -  </jdbc>
    -
    -  <generator>
    -    <database>
    -      <!-- The database dialect from jooq-meta. Available dialects are
    -           named org.util.[database].[database]Database. Known values are:
    -
    -           org.jooq.util.ase.ASEDatabase (to be used with Sybase ASE)
    -           org.jooq.util.cubrid.CUBRIDDatabase
    -           org.jooq.util.db2.DB2Database
    -           org.jooq.util.derby.DerbyDatabase
    -           org.jooq.util.h2.H2Database
    -           org.jooq.util.hsqldb.HSQLDBDatabase
    -           org.jooq.util.ingres.IngresDatabase
    -           org.jooq.util.mysql.MySQLDatabase
    -           org.jooq.util.oracle.OracleDatabase
    -           org.jooq.util.postgres.PostgresDatabase
    -           org.jooq.util.sqlite.SQLiteDatabase
    -           org.jooq.util.sqlserver.SQLServerDatabase
    -           org.jooq.util.sybase.SybaseDatabase (to be used with Sybase SQL Anywhere)
    -
    -           You can also provide your own org.jooq.util.Database implementation
    -           here, if your database is currently not supported or if you wish to
    -           read the database schema from a file, such as a Hibernate .hbm.xml file -->
    -      <name>org.jooq.util.oracle.OracleDatabase</name>
    -
    -      <!-- All elements that are generated from your schema (several Java
    -           regular expressions, separated by comma) Watch out for
    -           case-sensitivity. Depending on your database, this might be
    -           important! You can create case-insensitive regular expressions
    -           using this syntax: (?i:expr)A comma-separated list of regular
    -           expressions -->
    -      <includes>.*</includes>
    -
    -      <!-- All elements that are excluded from your schema (several Java
    -           regular expressions, separated by comma). Excludes match before
    -           includes -->
    -      <excludes></excludes>
    -
    -      <!-- The schema that is used locally as a source for meta information.
    -           This could be your development schema or the production schema, etc
    -           This cannot be combined with the schemata element.
    -
    -           If left empty, jOOQ will generate all available schemata. See the
    -           manual's next section to learn how to generate several schemata -->
    -      <inputSchema>[your database schema / owner / name]</inputSchema>
    -    </database>
    -
    -    <generate>
    -      <!-- Generation flags: See advanced configuration properties -->
    -    </generate>
    -
    -    <target>
    -      <!-- The destination package of your generated classes (within the
    -           destination directory) -->
    -      <packageName>[org.jooq.your.packagename]</packageName>
    -
    -      <!-- The destination directory of your generated classes -->
    -      <directory>[/path/to/your/dir]</directory>
    -    </target>
    -  </generator>
    -</configuration>]]></xml><html>
    -
    -							<p>
    -								There are also lots of advanced configuration parameters, which will be treated in the <reference id="codegen-advanced" title="manual's section about advanced code generation features"/> Note, you can find the official XSD file for a formal specification at:<br/>
    -							    <a href="http://www.jooq.org/xsd/jooq-codegen-2.5.0.xsd" title="The jOOQ-codegen configuration XSD">http://www.jooq.org/xsd/jooq-codegen-2.5.0.xsd</a>
    -						    </p>
    -
    -							<h3>Run jOOQ code generation</h3>
    -							<p>
    -								Code generation works by calling this class with the above property file as argument.
    -							</p>
    -							
    -</html><config>org.jooq.util.GenerationTool /jooq-config.xml</config><html>
    -
    -							<p>
    -								Be sure that these elements are located on the classpath:
    -							</p>
    -							
    -							<ul>
    -								<li>The XML configuration file</li>
    -								<li>jooq-{jooq-version}.jar, jooq-meta-{jooq-version}.jar, jooq-codegen-{jooq-version}.jar</li>
    -								<li>The JDBC driver you configured</li>
    -							</ul>
    -
    -							<h3>A command-line example (For Windows, unix/linux/etc will be similar)</h3>
    -							<ul>
    -								<li>Put the property file, jooq*.jar and the JDBC driver into a directory, e.g. C:\temp\jooq</li>
    -							    <li>Go to C:\temp\jooq</li>
    -							    <li>Run java -cp jooq-{jooq-version}.jar;jooq-meta-{jooq-version}.jar;jooq-codegen-{jooq-version}.jar;[JDBC-driver].jar;. org.jooq.util.GenerationTool /[XML file] </li>
    -							</ul>
    -							<p>
    -								Note that the property file must be passed as a classpath resource
    -							</p>
    -
    -							<h3>Run code generation from Eclipse</h3>
    -							<p>
    -								Of course, you can also run code generation from your IDE. In Eclipse, set up a project like this. Note that this example uses jOOQ's log4j support by adding log4j.xml and log4j.jar to the project classpath:
    -							</p>
    -							<div class="screenshot">
    -							<img class="screenshot" src="&lt;?=$root?&gt;/img/eclipse-example-01.png" alt="Eclipse configuration"/>
    -							</div>
    -
    -							<p>
    -								Once the project is set up correctly with all required artefacts on the classpath, you can configure an Eclipse Run Configuration for org.jooq.util.GenerationTool.
    -							</p>
    -							<div class="screenshot">
    -							<img class="screenshot" src="&lt;?=$root?&gt;/img/eclipse-example-02.png" alt="Eclipse configuration"/>
    -							</div>
    -
    -							<p>
    -								With the XML file as an argument
    -							</p>
    -							<div class="screenshot">
    -							<img class="screenshot" src="&lt;?=$root?&gt;/img/eclipse-example-03.png" alt="Eclipse configuration"/>
    -							</div>
    -
    -							<p>
    -								And the classpath set up correctly
    -							</p>
    -							<div class="screenshot">
    -							<img class="screenshot" src="&lt;?=$root?&gt;/img/eclipse-example-04.png" alt="Eclipse configuration"/>
    -							</div>
    -
    -							<p>
    -								Finally, run the code generation and see your generated artefacts
    -							</p>
    -							<div class="screenshot">
    -							<img class="screenshot" src="&lt;?=$root?&gt;/img/eclipse-example-05.png" alt="Eclipse configuration"/>
    -							</div>
    -
    -							<h3>Run generation with ant</h3>
    -							<p>
    -								You can also use an ant task to generate your classes. As a rule of thumb, remove the dots "." and dashes "-" from the .properties file's property names to get the ant task's arguments:
    -							</p>
    -							
    -</html><xml><![CDATA[<!-- Task definition -->
    -<taskdef name="generate-classes" classname="org.jooq.util.GenerationTask">
    -  <classpath>
    -    <fileset dir="${path.to.jooq.distribution}">
    -      <include name="jooq-{jooq-version}.jar"/>
    -      <include name="jooq-meta-{jooq-version}.jar"/>
    -      <include name="jooq-codegen-{jooq-version}.jar"/>
    -    </fileset>
    -    <fileset dir="${path.to.mysql.driver}">
    -      <include name="${mysql.driver}.jar"/>
    -    </fileset>
    -  </classpath>
    -</taskdef>
    -
    -<!-- Run the code generation task -->
    -<target name="generate-test-classes">
    -  <generate-classes
    -      jdbcurl="jdbc:mysql://localhost/test"
    -      jdbcuser="root"
    -      jdbcpassword=""
    -      generatordatabaseinputschema="test"
    -      generatortargetpackage="org.jooq.test.generatedclasses"
    -      generatortargetdirectory="${basedir}/src"/>
    -</target>]]></xml><html>
    -
    -							<p>
    -								Note that when running code generation with ant's &lt;java/&gt; task, you may have to set fork="true":
    -							</p>
    -
    -</html><xml><![CDATA[<!-- Run the code generation task -->
    -<target name="generate-test-classes">
    -  <java fork="true" classname="org.jooq.util.GenerationTool">
    -    [...]
    -  </java><html>
    -</target>
    -]]></xml><html>
    -
    -							<h3>Integrate generation with Maven</h3>
    -							<p>
    -								Using the official jOOQ-codegen-maven plugin, you can integrate source code generation in your Maven build process:
    -							</p>
    -
    -</html><xml><![CDATA[<plugin>
    -
    -  <!-- Specify the maven code generator plugin -->
    -  <groupId>org.jooq</groupId>
    -  <artifactId>jooq-codegen-maven</artifactId>
    -  <version>{jooq-version}</version>
    -
    -  <!-- The plugin should hook into the generate goal -->
    -  <executions>
    -    <execution>
    -      <goals>
    -        <goal>generate</goal>
    -      </goals>
    -    </execution>
    -  </executions>
    -
    -  <!-- Manage the plugin's dependency. In this example, we'll use a PostgreSQL database -->
    -  <dependencies>
    -    <dependency>
    -      <groupId>postgresql</groupId>
    -      <artifactId>postgresql</artifactId>
    -      <version>8.4-702.jdbc4</version>
    -    </dependency>
    -  </dependencies>
    -
    -  <!-- Specify the plugin configuration.
    -       The configuration format is the same as for the standalone code generator -->
    -  <configuration>
    -
    -    <!-- JDBC connection parameters -->
    -    <jdbc>
    -      <driver>org.postgresql.Driver</driver>
    -      <url>jdbc:postgresql:postgres</url>
    -      <user>postgres</user>
    -      <password>test</password>
    -    </jdbc>
    -
    -    <!-- Generator parameters -->
    -    <generator>
    -      <name>org.jooq.util.DefaultGenerator</name>
    -      <database>
    -        <name>org.jooq.util.postgres.PostgresDatabase</name>
    -        <includes>.*</includes>
    -        <excludes></excludes>
    -        <inputSchema>public</inputSchema>
    -      </database>
    -      <target>
    -        <packageName>org.jooq.util.maven.example</packageName>
    -        <directory>target/generated-sources/jooq</directory>
    -      </target>
    -    </generator>
    -  </configuration>
    -</plugin>
    -]]></xml><html>
    -
    -							<p>
    -								See the full example of a pom.xml including the jOOQ-codegen artefact here:<br/>
    -								<a href="https://github.com/jOOQ/jOOQ/blob/master/jOOQ-codegen-maven-example/pom.xml"
    -								  title="jOOQ-codegen-maven example pom.xml file">https://github.com/jOOQ/jOOQ/blob/master/jOOQ-codegen-maven-example/pom.xml</a>
    -							  </p>
    -
    -                            <h3>Migrate properties files from jOOQ 1.7, early versions of jOOQ 2.0.x:</h3>
    -                            <p>
    -                                Before jOOQ 2.0.4, the code generator was configured using properties files. These files are still supported for source code generation, but their syntax won't be maintained any longer. If you wish to migrate to XML, you can migrate the file using this command on the command line
    -                            </p>
    -
    -</html><config>org.jooq.util.GenerationTool /jooq-config.properties migrate</config><html>
    -
    -							<p>
    -								Using the migrate flag, jOOQ will read the properties file and output a corresponding XML file on system out
    -							</p>
    -
    -							<h3>Use jOOQ generated classes in your application</h3>
    -							<p>
    -								Be sure, both jooq-{jooq-version}.jar and your generated package (see configuration) are located on your classpath. Once this is done, you can execute SQL statements with your generated classes.
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="codegen-advanced">
    -						<title>Advanced generator configuration</title>
    -						<content><html>
    -							<p>
    -								In the <reference id="codegen-configuration" title="previous section"/> we have seen how jOOQ's source code generator is configured and run within a few steps. In this chapter we'll cover some advanced settings
    -							</p>
    -
    -</html><xml><![CDATA[<!-- These properties can be added directly to the generator element: -->
    -<generator>
    -  <!-- The default code generator. You can override this one, to generate your own code style
    -       Defaults to org.jooq.util.DefaultGenerator -->
    -  <name>org.jooq.util.DefaultGenerator</name>
    -
    -  <!-- The naming strategy used for class and field names.
    -       You may override this with your custom naming strategy. Some examples follow
    -       Defaults to org.jooq.util.DefaultGeneratorStrategy -->
    -  <strategy>
    -    <name>org.jooq.util.DefaultGeneratorStrategy</name>
    -  </strategy>
    -</generator>]]></xml><html>
    -
    -							<p>
    -								The following example shows how you can override the DefaultGeneratorStrategy to render table and column names the way they are defined in the database, rather than switching them to camel case:
    -							</p>
    -
    -</html><java><![CDATA[/**
    - * It is recommended that you extend the DefaultGeneratorStrategy. Most of the
    - * GeneratorStrategy API is already declared final. You only need to override any
    - * of the following methods, for whatever generation behaviour you'd like to achieve
    - *
    - * Beware that most methods also receive a "Mode" object, to tell you whether a
    - * TableDefinition is being rendered as a Table, Record, POJO, etc. Depending on
    - * that information, you can add a suffix only for TableRecords, not for Tables
    - */
    -public class AsInDatabaseStrategy extends DefaultGeneratorStrategy {
    -
    -    /**
    -     * Override this to specifiy what identifiers in Java should look like.
    -     * This will just take the identifier as defined in the database.
    -     */
    -    @Override
    -    public String getJavaIdentifier(Definition definition) {
    -        return definition.getOutputName();
    -    }
    -
    -    /**
    -     * Override these to specify what a setter in Java should look like. Setters
    -     * are used in TableRecords, UDTRecords, and POJOs. This example will name
    -     * setters "set[NAME_IN_DATABASE]"
    -     */
    -    @Override
    -    public String getJavaSetterName(Definition definition, Mode mode) {
    -        return "set" + definition.getOutputName();
    -    }
    -
    -    /**
    -     * Just like setters...
    -     */
    -    @Override
    -    public String getJavaGetterName(Definition definition, Mode mode) {
    -        return "get" + definition.getOutputName();
    -    }
    -
    -    /**
    -     * Override this method to define what a Java method generated from a database
    -     * Definition should look like. This is used mostly for convenience methods
    -     * when calling stored procedures and functions. This example shows how to
    -     * set a prefix to a CamelCase version of your procedure
    -     */
    -    @Override
    -    public String getJavaMethodName(Definition definition, Mode mode) {
    -        return "call" + org.jooq.tools.StringUtils.toCamelCase(definition.getOutputName());
    -    }
    -
    -    /**
    -     * Override this method to define how your Java classes and Java files should
    -     * be named. This example applies no custom setting and uses CamelCase versions
    -     * instead
    -     */
    -    @Override
    -    public String getJavaClassName(Definition definition, Mode mode) {
    -        return super.getJavaClassName(definition, mode);
    -    }
    -
    -    /**
    -     * Override this method to re-define the package names of your generated
    -     * artefacts.
    -     */
    -    @Override
    -    public String getJavaPackageName(Definition definition, Mode mode) {
    -        return super.getJavaPackageName(definition, mode);
    -    }
    -
    -    /**
    -     * Override this method to define how Java members should be named. This is
    -     * used for POJOs and method arguments
    -     */
    -    @Override
    -    public String getJavaMemberName(Definition definition, Mode mode) {
    -        return definition.getOutputName();
    -    }
    -
    -    /**
    -     * Override this method to define the base class for those artefacts that
    -     * allow for custom base classes
    -     */
    -    @Override
    -    public String getJavaClassExtends(Definition definition, Mode mode) {
    -        return Object.class.getName();
    -    }
    -
    -    /**
    -     * Override this method to define the interfaces to be implemented by those
    -     * artefacts that allow for custom interface implementation
    -     */
    -    @Override
    -    public List<String> getJavaClassImplements(Definition definition, Mode mode) {
    -        return Arrays.asList(Serializable.class.getName(), Cloneable.class.getName());
    -    }
    -
    -    /**
    -     * Override this method to define the suffix to apply to routines when
    -     * they are overloaded.
    -     *
    -     * Use this to resolve compile-time conflicts in generated source code, in
    -     * case you make heavy use of procedure overloading
    -     */
    -    @Override
    -    public String getOverloadSuffix(Definition definition, Mode mode, String overloadIndex) {
    -        return "_OverloadIndex_" + overloadIndex;
    -    }
    -}]]></java><html>
    -
    -                            <h3>jooq-meta configuration</h3>
    -							<p>
    -								Within the &lt;generator/&gt; element, there are other configuration elements:
    -							</p>
    -
    -</html><xml><![CDATA[<!-- These properties can be added to the database element: -->
    -<database>
    -
    -  <!-- All table and view columns that are used as "version" fields for
    -       optimistic locking (several Java regular expressions, separated by comma).
    -       See UpdatableRecord.store() and UpdatableRecord.delete() for details -->
    -  <recordVersionFields>REC_VERSION</recordVersionFields/>
    -
    -  <!-- All table and view columns that are used as "timestamp" fields for
    -       optimistic locking (several Java regular expressions, separated by comma).
    -       See UpdatableRecord.store() and UpdatableRecord.delete() for details -->
    -  <recordTimestampFields>REC_TIMESTAMP</recordTimestampFields/>
    -      
    -  <!-- Generate java.sql.Timestamp fields for DATE columns. This is
    -       particularly useful for Oracle databases.
    -       Defaults to false -->
    -  <dateAsTimestamp>false</dateAsTimestamp>
    -
    -  <!-- Generate jOOU data types for your unsigned data types, which are
    -       not natively supported in Java.
    -       Defaults to true -->
    -  <unsignedTypes>true</unsignedTypes>
    -
    -  <!-- The schema that is used in generated source code. This will be the
    -       production schema. Use this to override your local development
    -       schema name for source code generation. If not specified, this
    -       will be the same as the input-schema. -->
    -  <outputSchema>[your database schema / owner / name]</outputSchema>
    -
    -  <!-- A configuration element to configure several input and/or output
    -       schemata for jooq-meta, in case you're using jooq-meta in a multi-
    -       schema environment.
    -       This cannot be combined with the above inputSchema / outputSchema -->
    -  <schemata>
    -    <schema>
    -      <inputSchema>...</inputSchema>
    -      <outputSchema>...</outputSchema>
    -    </schema>
    -    [ <schema>...</schema> ... ]
    -  </schemata>
    -
    -  <!-- A configuration element to configure master data table enum classes -->
    -  <masterDataTables>...</masterDataTables>
    -
    -  <!-- A configuration element to configure custom data types -->
    -  <customTypes>...</customTypes>
    -
    -  <!-- A configuration element to configure type overrides for generated
    -       artefacts (e.g. in combination with customTypes) -->
    -  <forcedTypes>...</forcedTypes>
    -</database>]]></xml><html>
    -
    -							<p>
    -								Check out the some of the manual's "advanced" sections to find out more about the advanced configuration parameters.
    -							</p>
    -							<ul>
    -								<li><reference id="schema-mapping" title="Schema mapping"/></li>
    -								<li><reference id="master-data-types" title="Master data types"/></li>
    -								<li><reference id="custom-data-types" title="Custom types"/></li>
    -							</ul>
    -
    -							<h3>jooq-codegen configuration</h3>
    -                            <p>
    -                            	Also, you can add some optional advanced configuration parameters for the generator:
    -                           	</p>
    -
    -</html><xml><![CDATA[<!-- These properties can be added to the generate element: -->
    -<generate>
    -  <!-- Primary key / foreign key relations should be generated and used.
    -       This is a prerequisite for various advanced features.
    -       Defaults to true -->
    -  <relations>true</relations>
    -
    -  <!-- Generate navigation methods to navigate foreign key relationships
    -       directly from Record classes. This is only relevant if relations
    -       is set to true, too.
    -       Defaults to true -->
    -  <navigationMethods>true</navigationMethods>
    -
    -  <!-- Generate deprecated code for backwards compatibility
    -       Defaults to true -->
    -  <deprecated>true</deprecated>
    -
    -  <!-- Generate instance fields in your tables, as opposed to static
    -       fields. This simplifies aliasing.
    -       Defaults to true -->
    -  <instanceFields>true</instanceFields>
    -
    -  <!-- Generate the javax.annotation.Generated annotation to indicate
    -       jOOQ version used for source code.
    -       Defaults to true -->
    -  <generatedAnnotation>true</generatedAnnotation>
    -
    -  <!-- Generate jOOQ Record classes for type-safe querying. You can
    -       turn this off, if you don't need "active records" for CRUD
    -       Defaults to true -->
    -  <records>true</records>
    -
    -  <!-- Generate POJOs in addition to Record classes for usage of the
    -       ResultQuery.fetchInto(Class) API
    -       Defaults to false -->
    -  <pojos>false</pojos>
    -
    -  <!-- Generate immutable POJOs for usage of the ResultQuery.fetchInto(Class) API
    -       This overrides any value set in <pojos/>
    -       Defaults to false -->
    -  <immutablePojos>false</immutablePojos>
    -
    -  <!-- Generate interfaces that will be implemented by records and/or pojos.
    -       You can also use these interfaces in Record.into(Class<?>) and similar
    -       methods, to let jOOQ return proxy objects for them.
    -       Defaults to false -->
    -  <interfaces>false</interfaces>
    -
    -  <!-- Generate DAOs in addition to POJO classes
    -       Defaults to false -->
    -  <daos>false</daos>
    -
    -  <!-- Annotate POJOs and Records with JPA annotations for increased
    -       compatibility and better integration with JPA/Hibernate, etc
    -       Defaults to false -->
    -  <jpaAnnotations>false</jpaAnnotations>
    -
    -  <!-- Annotate POJOs and Records with JSR-303 validation annotations
    -       Defaults to false -->
    -  <validationAnnotations>false</validationAnnotations>
    -</generate>]]></xml></content>
    -					</section>
    -
    -				    <section id="codegen-globals">
    -						<title>Generated global artefacts</title>
    -						<content><html>
    -							<p>
    -								For increased convenience at the use-site, jOOQ generates "global" artefacts at the code generation root location, referencing tables, routines, sequences, etc. In detail, these global artefacts include the following:
    -							</p>
    -							<ul>
    -								<li><strong>Keys.java</strong>: This file contains all of the required primary key, unique key, foreign key and identity references in the form of static members of type <reference class="org.jooq.Key"/>.</li>
    -								<li><strong>Routines.java</strong>: This file contains all standalone routines (not in packages) in the form of static factory methods for <reference class="org.jooq.Routine"/> types.</li>
    -								<li><strong>Sequences.java</strong>: This file contains all sequence objects in the form of static members of type <reference class="org.jooq.Sequence"/>.</li>
    -								<li><strong>Tables.java</strong>: This file contains all table objects in the form of static member references to the actual singleton <reference class="org.jooq.Table"/> object</li>
    -								<li><strong>UDTs.java</strong>: This file contains all UDT objects in the form of static member references to the actual singleton <reference class="org.jooq.UDT"/> object</li>
    -							</ul>
    -							
    -							<h3>Referencing global artefacts</h3>
    -							<p>
    -								When referencing global artefacts from your client application, you would typically static import them as such:
    -							</p>
    -							
    -</html><java><![CDATA[// Static imports for all global artefacts
    -import static com.example.generated.Routines.*;
    -import static com.example.generated.Sequences.*;
    -import static com.example.generated.Tables.*;
    -
    -// You could then reference your artefacts as follows:
    -create.insertInto(MY_TABLE)
    -      .values(MY_SEQUENCE.nextval(), myFunction())
    -      
    -// as a more concise form of this:
    -create.insertInto(com.example.generated.Tables.MY_TABLE)
    -      .values(com.example.generated.Sequences.MY_SEQUENCE.nextval(), com.example.generated.Routines.myFunction())]]></java></content>
    -					</section>
    -
    -				    <section id="codegen-tables">
    -						<title>Generated tables</title>
    -						<content><html>
    -							<p>
    -								Every table in your database will generate a <reference class="org.jooq.Table"/> implementation that looks like this:
    -							</p>
    -							
    -</html><java><![CDATA[public class Book extends UpdatableTableImpl<BookRecord> {
    -
    -    // The singleton instance
    -    public static final Book BOOK = new Book();
    -
    -    // Generated columns
    -    public final TableField<BookRecord, Integer> ID        = createField("ID",        SQLDataType.INTEGER, this);
    -    public final TableField<BookRecord, Integer> AUTHOR_ID = createField("AUTHOR_ID", SQLDataType.INTEGER, this);
    -    public final TableField<BookRecord, String>  ITLE      = createField("TITLE",     SQLDataType.VARCHAR, this);
    -
    -    // Covariant aliasing method, returning a table of the same type as BOOK
    -    @Override
    -    public Book as(java.lang.String alias) {
    -        return new Book(alias);
    -    }
    -    
    -    // [...]
    -}]]></java><html>
    -
    -							<h3>Flags influencing generated tables</h3>
    -							<p>
    -								These flags from the <reference id="codegen-advanced" title="code generation configuration"/> influence generated tables:
    -							</p>
    -							<ul>
    -								<li><strong>recordVersionFields</strong>: Relevant methods from super classes are overridden to return the VERSION field</li>
    -								<li><strong>recordTimestampFields</strong>: Relevant methods from super classes are overridden to return the TIMESTAMP field</li>
    -								<li><strong>dateAsTimestamp</strong>: This influences all relevant columns</li>
    -								<li><strong>unsignedTypes</strong>: This influences all relevant columns</li>
    -								<li><strong>relations</strong>: Relevant methods from super classes are overridden to provide primary key, unique key, foreign key and identity information</li>
    -								<li><strong>instanceFields</strong>: This flag controls the "static" keyword on table columns, as well as aliasing convenience</li>
    -								<li><strong>records</strong>: The generated record type is referenced from tables allowing for type-safe single-table record fetching</li>
    -							</ul>
    -							
    -							<h3>Flags controlling table generation</h3>
    -							<p>
    -								Table generation cannot be deactivated
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="codegen-records">
    -						<title>Generated records</title>
    -						<content><html>
    -							<p>
    -								Every table in your database will generate a <reference class="org.jooq.Table"/> implementation that looks like this:
    -							</p>
    -							
    -</html><java><![CDATA[// JPA annotations can be generated, optionally
    -@Entity
    -@Table(name = "BOOK", schema = "TEST")
    -public class BookRecord extends UpdatableRecordImpl<BookRecord> 
    -
    -// An interface common to records and pojos can be generated, optionally
    -implements IBook {
    -
    -    // Every column generates a setter and a getter
    -    @Override
    -    public void setId(Integer value) {
    -        setValue(BOOK.ID, value);
    -    }
    -    
    -    @Id
    -    @Column(name = "ID", unique = true, nullable = false, precision = 7)
    -    @Override
    -    public Integer getId() {
    -        return getValue(BOOK.ID);
    -    }
    -    
    -    // More setters and getters
    -    public void setAuthorId(Integer value) {...}
    -    public Integer getAuthorId() {...}
    -    
    -    // Convenience methods for foreign key methods
    -    public void setAuthorId(AuthorRecord value) {
    -        if (value == null) {
    -            setValue(BOOK.AUTHOR_ID, null);
    -        }
    -        else {
    -            setValue(BOOK.AUTHOR_ID, value.getValue(AUTHOR.ID));
    -        }
    -    }
    -    
    -    // Navigation methods
    -    public AuthorRecord fetchAuthor() {
    -        return create().selectFrom(AUTHOR).where(AUTHOR.ID.equal(getValue(BOOK.AUTHOR_ID))).fetchOne();
    -    }
    -    
    -    // [...]
    -}]]></java><html>							
    -							
    -							<h3>Flags influencing generated records</h3>
    -							<p>
    -								These flags from the <reference id="codegen-advanced" title="code generation configuration"/> influence generated records:
    -							</p>
    -							<ul>
    -								<li><strong>dateAsTimestamp</strong>: This influences all relevant getters and setters</li>
    -								<li><strong>unsignedTypes</strong>: This influences all relevant getters and setters</li>
    -								<li><strong>relations</strong>: This is needed as a prerequisite for navigation methods</li>
    -								<li><strong>navigationMethods</strong>: This controls whether navigation methods will be generated or not</li>
    -								<li><strong>daos</strong>: Records are a pre-requisite for DAOs. If DAOs are generated, records are generated as well</li>
    -								<li><strong>interfaces</strong>: If interfaces are generated, records will implement them</li>
    -								<li><strong>jpaAnnotations</strong>: JPA annotations are used on generated records</li>
    -							</ul>
    -														
    -							<h3>Flags controlling record generation</h3>
    -							<p>
    -								Record generation can be deactivated using the <strong>records</strong> flag
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="codegen-pojos">
    -						<title>Generated POJOs</title>
    -						<content><html>
    -							<p>
    -								Every table in your database will generate a POJO implementation that looks like this:
    -							</p>
    -							
    -</html><java><![CDATA[// JPA annotations can be generated, optionally
    -@javax.persistence.Entity
    -@javax.persistence.Table(name = "BOOK", schema = "TEST")
    -public class Book implements java.io.Serializable
    -
    -// An interface common to records and pojos can be generated, optionally
    -, IBook {
    -
    -    // JSR-303 annotations can be generated, optionally
    -    @NotNull
    -    private Integer id;
    -
    -    @NotNull
    -    private Integer authorId;
    -
    -    @NotNull
    -    @Size(max = 400)
    -    private String title;
    -
    -    // Every column generates a getter and a setter
    -    @Id
    -    @Column(name = "ID", unique = true, nullable = false, precision = 7)
    -    @Override
    -    public Integer getId() {
    -        return this.id;
    -    }
    -
    -    @Override
    -    public void setId(Integer id) {
    -        this.id = id;
    -    }
    -    
    -    // [...]
    -}]]></java><html>							
    -							
    -							<h3>Flags influencing generated POJOs</h3>
    -							<p>
    -								These flags from the <reference id="codegen-advanced" title="code generation configuration"/> influence generated POJOs:
    -							</p>
    -							<ul>
    -								<li><strong>dateAsTimestamp</strong>: This influences all relevant getters and setters</li>
    -								<li><strong>unsignedTypes</strong>: This influences all relevant getters and setters</li>
    -								<li><strong>interfaces</strong>: If interfaces are generated, POJOs will implement them</li>
    -								<li><strong>immutablePojos</strong>: Immutable POJOs have final members and no setters. All members must be passed to the constructor</li>
    -								<li><strong>daos</strong>: POJOs are a pre-requisite for DAOs. If DAOs are generated, POJOs are generated as well</li>
    -								<li><strong>jpaAnnotations</strong>: JPA annotations are used on generated records</li>
    -								<li><strong>validationAnnotations</strong>: JSR-303 validation annotations are used on generated records</li>
    -							</ul>
    -														
    -							<h3>Flags controlling POJO generation</h3>
    -							<p>
    -								POJO generation can be activated using the <strong>pojos</strong> flag
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="codegen-interfaces">
    -						<title>Generated Interfaces</title>
    -						<content><html>
    -							<p>
    -								Every table in your database will generate an interface that looks like this:
    -							</p>
    -							
    -</html><java><![CDATA[public interface IBook extends java.io.Serializable {
    -
    -    // Every column generates a getter and a setter
    -    public void setId(Integer value);
    -    public Integer getId();
    -    
    -    // [...]
    -}]]></java><html>    						
    -							
    -							<h3>Flags influencing generated interfaces</h3>
    -							<p>
    -								These flags from the <reference id="codegen-advanced" title="code generation configuration"/> influence generated interfaces:
    -							</p>
    -							<ul>
    -								<li><strong>dateAsTimestamp</strong>: This influences all relevant getters and setters</li>
    -								<li><strong>unsignedTypes</strong>: This influences all relevant getters and setters</li>
    -							</ul>
    -														
    -							<h3>Flags controlling POJO generation</h3>
    -							<p>
    -								POJO generation can be activated using the <strong>interfaces</strong> flag
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="codegen-daos">
    -						<title>Generated DAOs</title>
    -						<content><html>
    -							<h3>Generated DAOs</h3>
    -							<p>
    -								Every table in your database will generate a <reference class="org.jooq.DAO"/> implementation that looks like this:
    -							</p>
    -							
    -</html><java><![CDATA[public class BookDao extends DAOImpl<BookRecord, Book, Integer> {
    -
    -    // Generated constructors
    -    public BookDao() {
    -        super(BOOK, Book.class);
    -    }
    -
    -    public BookDao(Factory factory) {
    -        super(BOOK, Book.class, factory);
    -    }
    -
    -    // Every column generates at least one fetch method
    -    public List<Book> fetchById(Integer... values) {
    -        return fetch(BOOK.ID, values);
    -    }
    -
    -    public Book fetchOneById(Integer value) {
    -        return fetchOne(BOOK.ID, value);
    -    }
    -
    -    public List<Book> fetchByAuthorId(Integer... values) {
    -        return fetch(BOOK.AUTHOR_ID, values);
    -    }
    -    
    -    // [...]
    -}]]></java><html>							
    -							
    -							<h3>Flags controlling DAO generation</h3>
    -							<p>
    -								DAO generation can be activated using the <strong>daos</strong> flag
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="codegen-sequences">
    -						<title>Generated sequences</title>
    -						<content><html>
    -							<p>
    -								Every sequence in your database will generate a <reference class="org.jooq.Sequence"/> implementation that looks like this:
    -							</p>
    -							
    -</html><java><![CDATA[public final class Sequences {
    -
    -    // Every sequence generates a member
    -    public static final Sequence<Integer> S_AUTHOR_ID = new SequenceImpl<Integer>("S_AUTHOR_ID", TEST, SQLDataType.INTEGER);
    -}]]></java><html>		
    -							
    -							<h3>Flags controlling sequence generation</h3>
    -							<p>
    -								Sequence generation cannot be deactivated
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="codegen-procedures">
    -						<title>Generated procedures</title>
    -						<content><html>
    -							<p>
    -								Every procedure or function (routine) in your database will generate a <reference class="org.jooq.Routine"/> implementation that looks like this:
    -							</p>
    -
    -</html><java><![CDATA[public class AuthorExists extends AbstractRoutine<java.lang.Void> {
    -
    -    // All IN, IN OUT, OUT parameters and function return values generate a static member
    -    public static final Parameter<String>     AUTHOR_NAME = createParameter("AUTHOR_NAME", SQLDataType.VARCHAR);
    -    public static final Parameter<BigDecimal> RESULT      = createParameter("RESULT",      SQLDataType.NUMERIC);
    -
    -    // A constructor for a new "empty" procedure call
    -    public AuthorExists() {
    -        super("AUTHOR_EXISTS", TEST);
    -
    -        addInParameter(AUTHOR_NAME);
    -        addOutParameter(RESULT);
    -    }
    -
    -    // Every IN and IN OUT parameter generates a setter
    -    public void setAuthorName(String value) {
    -        setValue(AUTHOR_NAME, value);
    -    }
    -
    -    // Every IN OUT, OUT and RETURN_VALUE generates a getter
    -    public BigDecimal getResult() {
    -        return getValue(RESULT);
    -    }
    -    
    -    // [...]
    -}]]></java><html>
    -
    -							<h3>Package and member procedures or functions</h3>
    -							<p>
    -								Procedures or functions contained in packages or UDTs are generated in a sub-package that corresponds to the package or UDT name.
    -							</p>
    -
    -							<h3>Flags controlling routine generation</h3>
    -							<p>
    -								Routine generation cannot be deactivated
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="codegen-udts">
    -						<title>Generated UDTs</title>
    -						<content><html>
    -							<p>
    -								Every UDT in your database will generate a <reference class="org.jooq.UDT"/> implementation that looks like this:
    -							</p>
    -						
    -</html><java><![CDATA[public class AddressType extends UDTImpl<AddressTypeRecord> {
    -
    -    // The singleton UDT instance
    -    public static final UAddressType U_ADDRESS_TYPE = new UAddressType();
    -
    -    // Every UDT attribute generates a static member
    -    public static final UDTField<AddressTypeRecord, String> ZIP     = 
    -      createField("ZIP",     SQLDataType.VARCHAR, U_ADDRESS_TYPE);
    -    public static final UDTField<AddressTypeRecord, String> CITY    = 
    -      createField("CITY",    SQLDataType.VARCHAR, U_ADDRESS_TYPE);
    -    public static final UDTField<AddressTypeRecord, String> COUNTRY = 
    -      createField("COUNTRY", SQLDataType.VARCHAR, U_ADDRESS_TYPE);
    -    
    -    // [...]
    -}]]></java><html>						
    -										
    -							<p>
    -								Besides the <reference class="org.jooq.UDT"/> implementation, a <reference class="org.jooq.UDTRecord"/> implementation is also generated
    -							</p>		
    -
    -</html><java><![CDATA[public class AddressTypeRecord extends UDTRecordImpl<AddressTypeRecord> {
    -
    -    // Every attribute generates a getter and a setter
    -
    -    public void setZip(String value) {...}
    -    public String getZip() {...}
    -    public void setCity(String value) {...}
    -    public String getCity() {...}
    -    public void setCountry(String value) {...}
    -    public String getCountry() {...}
    -    
    -    // [...]
    -}]]></java><html>						
    -
    -							<h3>Flags controlling UDT generation</h3>
    -							<p>
    -								UDT generation cannot be deactivated
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="master-data-types">
    -						<title>Master data and enumeration tables</title>
    -						<content><html>
    -							<p>
    -								<strong>NOTE</strong>: This feature is deprecated in jOOQ 2.5.0 and will be removed as of jOOQ 3.0
    -							</p>
    -							<p>
    -								Only MySQL and Postgres databases support true ENUM types natively. Some other RDBMS allow you to map the concept of an ENUM data type to a CHECK constraint, but those constraints can contain arbitrary SQL. With jOOQ, you can "simulate" ENUM types by declaring a table as a "master data table" in the configuration. At code-generation time, this table will be treated specially, and a Java enum type is generated from its data.
    -							</p>
    -
    -							<h3>Configure master data tables</h3>
    -							<p>
    -								As previously discussed, you can configure master data tables as follows:
    -							</p>
    -							
    -</html><xml><![CDATA[<!-- These properties can be added to the database element: -->
    -<database>
    -  <masterDataTables>
    -    <masterDataTable>
    -      <!-- The name of a master data table -->
    -      <name>[a table name]</name>
    -
    -      <!-- The column used for enum literals -->
    -      <literal>[a column name]</literal>
    -
    -      <!-- The column used for documentation -->
    -      <description>[a column name]</description>
    -    </masterDataTable>
    -
    -    [ <masterDataTable>...</masterDataTable> ... ]
    -  </masterDataTables>
    - </database>]]></xml><html>
    -
    -							<p>
    -								The results of this will be a Java enum that looks similar to this:
    -							</p>
    -							
    -</html><java><![CDATA[public enum Language implements MasterDataType<Integer> {
    -
    -  /**
    -   * English
    -   */
    -  en(1, "en", "English"),
    -
    -  /**
    -   * Deutsch
    -   */
    -  de(2, "de", "Deutsch"),
    -
    -  /**
    -   * Français
    -   */
    -  fr(3, "fr", "Français"),
    -
    -  /**
    -   * null
    -   */
    -  pt(4, "pt", null),
    -  ;
    -
    -  private final Integer id;
    -  private final String cd;
    -  private final String description;
    -
    -  // [ ... constructor and getters for the above properties ]
    -}]]></java><html>
    -
    -							<p>
    -								In the above example, you can see how the configured primary key is mapped to the id member, the configured literal column is mapped to the cd member and the configured description member is mapped to the description member and output as Javadoc. In other words, T_LANGUAGE is a table with 4 rows and at least three columns.
    -							</p>
    -							
    -							<p>
    -								The general contract is that there must be
    -							</p>
    -							<ul>
    -								<li>A single-column primary key column of character or integer type</li>
    -								<li>An optional unique literal column of character or integer type (otherwise, the primary key is used as enum literal) </li>
    -								<li>An optional description column of any type </li>
    -							</ul>
    -
    -							<h3>Using MasterDataTypes</h3>
    -							<p>
    -								The point of MasterDataTypes in jOOQ is that they behave exactly like true ENUM types. When the above T_LANGUAGE table is referenced by T_BOOK, instead of generating foreign key navigation methods and a LANGUAGE_ID Field&lt;Integer&gt;, a Field&lt;TLanguage&gt; is generated:
    -							</p>
    -
    -</html><java><![CDATA[public class Book extends UpdatableTableImpl<BookRecord> {
    -
    -  // [...]
    -  public static final TableField<BookRecord, Language> LANGUAGE_ID =
    -                  new TableFieldImpl<BookRecord, Language>( /* ... */ );
    -}]]></java><html>
    -
    -							<p>
    -								Which can then be used in the BookRecord directly:
    -							</p>
    -							
    -</html><java><![CDATA[public class BookRecord extends UpdatableRecordImpl<BookRecord> {
    -
    -  // [...]
    -  public Language getLanguageId() { // [...]
    -  public void setLanguageId(Language value) { // [...]
    -}]]></java><html>
    -
    -							<h3>When to use MasterDataTypes</h3>
    -							<p>
    -								You can use master data types when you're actually mapping master data to a Java enum. When the underlying table changes frequently, those updates will not be reflected by the statically generated code. Also, be aware that it will be difficult to perform actual JOIN operations on the underlying table with jOOQ, once the master data type is generated.
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="custom-data-types">
    -						<title>Custom data types and type conversion</title>
    -						<content><html>
    -							<p>
    -								When using a custom type in jOOQ, you need to let jOOQ know about its associated <reference class="org.jooq.Converter"/>. Ad-hoc usages of such converters has been discussed in the chapter about <reference id="data-type-conversion" title="data type conversion"/>. A more common use-case, however, is to let jOOQ know about custom types at code generation time. Use the following configuration elements to specify, that you'd like to use GregorianCalendar for all database fields that start with DATE_OF_
    -      						</p>
    -
    -</html><xml><![CDATA[<database>
    -  <!-- First, register your custom types here -->
    -  <customTypes>
    -    <customType>
    -      <!-- Specify the fully-qualified class name of your custom type -->
    -      <name>java.util.GregorianCalendar</name>
    -
    -      <!-- Associate that custom type with your converter. Note, a
    -           custom type can only have one converter in jOOQ -->
    -      <converter>com.example.CalendarConverter</converter>
    -    </customType>
    -  </customTypes>
    -
    -  <!-- Then, associate custom types with database columns -->
    -  <forcedTypes>
    -    <forcedType>
    -      <!-- Specify again he fully-qualified class name of your custom type -->
    -      <name>java.util.GregorianCalendar</name>
    -
    -      <!-- Add a list of comma-separated regular expressions matching columns -->
    -      <expressions>.*\.DATE_OF_.*</expressions>
    -    </forcedType>
    -  </forcedTypes>
    -</database>]]></xml><html>
    -
    -                            <p>
    -                            	The above configuration will lead to AUTHOR.DATE_OF_BIRTH being generated like this:
    -                            </p>
    -
    -</html><java><![CDATA[public class TAuthor extends UpdatableTableImpl<TAuthorRecord> {
    -
    -    // [...]
    -    public final TableField<TAuthorRecord, GregorianCalendar> DATE_OF_BIRTH =    // [...]
    -    // [...]
    -
    -}]]></java><html>
    -
    -                            <p>
    -                            	This means that the bound type of &lt;T&gt; will be GregorianCalendar, wherever you reference DATE_OF_BIRTH. jOOQ will use your custom converter when binding variables and when fetching data from <reference class="java.util.ResultSet"/>:
    -                            </p>
    -
    -</html><java><![CDATA[// Get all date of births of authors born after 1980
    -List<GregorianCalendar> result =
    -create.selectFrom(AUTHOR)
    -      .where(AUTHOR.DATE_OF_BIRTH.greaterThan(new GregorianCalendar(1980, 0, 1)))
    -      .fetch(AUTHOR.DATE_OF_BIRTH);]]></java></content>
    -					</section>
    -
    -				    <section id="schema-mapping">
    -						<title>Mapping generated schemata and tables</title>
    -						<content><html>
    -							<p>
    -								We've seen previously in the chapter about <reference id="runtime-schema-mapping" title="runtime schema mapping"/>, that schemata and tables can be mapped at runtime to other names. But you can also hard-wire schema mapping in generated artefacts at code generation time, e.g. when you have 5 developers with their own dedicated developer databases, and a common integration database. In the code generation configuration, you would then write.
    -							</p>
    -
    -</html><xml><![CDATA[<schemata>
    -  <schema>
    -    <!-- Use this as the developer's schema: -->
    -    <inputSchema>LUKAS_DEV_SCHEMA</inputSchema>
    -
    -    <!-- Use this as the integration / production database: -->
    -    <outputSchema>PROD</outputSchema>
    -  </schema>
    -</schemata>]]></xml></content>
    -					</section>
    -				</sections>
    -			</section>
    -
    -			<section id="tools">
    -				<title>Tools</title>
    -				<content><html>
    -					<p>
    -						These chapters hold some information about tools to be used with jOOQ
    -					</p>
    -				</html></content>
    -
    -				<sections>
    -					<section id="jooq-console">
    -						<title>jOOQ Console</title>
    -						<content><html>
    -							<p>
    -							    The <reference id="execute-listeners" title="ExecuteListener API"/> was driven by a feature request by Christopher Deckers, who has had the courtesy to contribute the jOOQ Console, a sample application interfacing with jOOQ's ExecuteListeners. The jOOQ Console logs all queries executed by jOOQ and displays them nicely in a Swing application. With the jOOQ Console's logger, you can:
    -						    </p>
    -						    <ul>
    -						    	<li>Activate the console's DebugListener anytime (in-process or if the remote server is active).</li>
    -						    	<li>View simple and batch queries and their parameters.</li>
    -						    	<li>Reformat queries along with syntax highlighting for better readability.</li>
    -						    	<li>View stack trace of originator of the call.</li>
    -						    	<li>Dump the stack to stdout when in an IDE, to directly navigate to relevant classes.</li>
    -						    	<li>Track execution time, binding time, parsing time, rows read, fields read.</li>
    -						    	<li>Show/hide queries depending on their type (SELECT, UPDATE, etc.).</li>
    -						    	<li>Sort any column (timing columns, queries, types, etc.)</li>
    -						    	<li>Easy copy paste of rows/columns to Spreadsheet editors.</li>
    -						    </ul>
    -
    -						    <p>
    -						    	A short overview of such a debugging session can be seen here:
    -						    </p>
    -   							<div class="screenshot">
    -								<img class="screenshot" src="&lt;?=$root?&gt;/img/jooq-console-01.png" alt="jOOQ Console example"/>
    -							</div>
    -						    <p>
    -							    Please note that the jOOQ Console is still experimental. Any feedback is very welcome on <br/>
    -							    <a href="http://groups.google.com/group/jooq-user" title="the jooq-user group">the jooq-user group</a>
    -							</p>
    -
    -							<h3>jOOQ Console operation modes</h3>
    -							<p>
    -								The jOOQ Console can be run in two different modes:
    -							</p>
    -							<ul>
    -								<li>In-process mode: running in the same process as the queries you're analysing</li>
    -								<li>"headless" mode: running remotely</li>
    -							</ul>
    -
    -							<p>
    -								Both modes will require that you set the <reference class="org.jooq.debug.DebugListener"/> in the Factory's settings. When using XML settings:
    -							</p>
    -
    -</html><xml><![CDATA[<settings>
    -  <executeListeners>
    -    <executeListener>org.jooq.debug.DebugListener</executeListener>
    -  </executeListeners>
    -</settings>]]></xml><html>
    -
    -							<p>
    -								Or when using programmatic settings:
    -							</p>
    -							
    -</html><java><![CDATA[Settings settings = new Settings()
    -    .getExecuteListeners().add("org.jooq.debug.DebugListener");
    -Factory factory = new Factory(connection, dialect, settings);]]></java><html>
    -
    -							<h3>In-process mode</h3>
    -							<p>
    -								The in-process mode is useful for Swing applications or other, locally run Java programs accessing the database via jOOQ. In order to launch the jOOQ Console "in-process", specify the previously documented settings and launch the Console as follows:
    -							</p>
    -
    -</html><java><![CDATA[// Define a DatabaseDescriptor for the "in-process" mode
    -// It is needed for the "Editor" tab
    -DatabaseDescriptor descriptor = new DatabaseDescriptor() {
    -
    -    // Return your generated schema. This is used by the console
    -    // to introspect your schema data
    -    @Override
    -    public Schema getSchema() {
    -        return com.example.MySchema.MY_SCHEMA;
    -    }
    -
    -    // Return the SQL dialect that you're using
    -    @Override
    -    public SQLDialect getSQLDialect() {
    -        return SQLDialect.ORACLE;
    -    }
    -
    -    // Return a connection
    -    @Override
    -    public Connection createConnection() {
    -        try {
    -            return DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "test", "test");
    -        }
    -        catch (Exception ignore) {}
    -    }
    -};
    -
    -// Now pass this database descriptor to the Console and make it visible
    -try {
    -
    -    // Use this for a nicer look-and-feel
    -    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    -
    -    // Create a new Console
    -    Console console = new Console(descriptor, true);
    -    console.setLoggingActive(true);
    -    console.setVisible(true);
    -}
    -catch (Exception ignore) {}
    -]]></java><html>
    -
    -							<p>
    -								Only in the in-process mode, you can execute ad-hoc queries directly from the console, if you provide it with proper DatabaseDescriptor. These queries are executed from the Editor pane which features:
    -							</p>
    -							<ul>
    -								<li>SQL editing within the console.</li>
    -								<li>Incremental search on tables.</li>
    -								<li>Simple code completion with tables/columns/SQL keywords.</li>
    -								<li>Syntax highlighting and formatting capabilities.</li>
    -								<li>Results shown in one or several tabs.</li>
    -								<li>Easy analysis of Logger output by copy/pasting/running queries in the Editor.</li>
    -							</ul>
    -   							<div class="screenshot">
    -								<img class="screenshot" src="&lt;?=$root?&gt;/img/jooq-console-02.png" alt="jOOQ Console example"/>
    -							</div>
    -
    -                            <h3>"Headless" mode</h3>
    -							<p>
    -								In J2EE or other server/client environments, you may not be able to run the console in the same process as your application. You can then run the jOOQ Console in "headless" mode. In addition to the previously documented settings, you'll have to start a debugger server in your application process, that the console can connect to:
    -							</p>
    -
    -</html><java>// Create a new RemoteDebuggerServer in your application that listens to
    -// incoming connections on a given port
    -SERVER = new RemoteDebuggerServer(DEBUGGER_PORT);</java><html>
    -
    -							<p>
    -								Now start your application along with the debugger server and launch the console with this command:
    -							</p>
    -
    -</html><config>java -jar jooq-console-2.1.0.jar [host] [port]</config><html>
    -
    -							<p>
    -								Depending on your distribution, you may have to manually add rsyntaxtextarea-1.5.0.jar and jOOQ artefacts on your classpath.
    -							</p>
    -						</html></content>
    -					</section>
    -				</sections>
    -			</section>
    -
    -			<section id="reference">
    -				<title>Reference</title>
    -				<content><html>
    -					<p>
    -						These chapters hold some general jOOQ reference information
    -					</p>
    -				</html></content>
    -
    -				<sections>
    -					<section id="supported-rdbms">
    -						<title>Supported RDBMS</title>
    -						<content><html>
    -							<h3>A list of supported databases</h3>
    -							<p>
    -						   		Every RDMBS out there has its own little specialties. jOOQ considers those specialties as much as possible, while trying to standardise the behaviour in jOOQ. In order to increase the quality of jOOQ, some 70 unit tests are run for syntax and variable binding verification, as well as some 180 integration tests with an overall of around 1200 queries for any of these databases:
    -					   		</p>
    -							<ul>
    -							    <li>CUBRID 8.4.1</li>
    -							    <li>DB2 9.7</li>
    -							    <li>Derby 10.8</li>
    -							    <li>Firebird 2.5.1</li>
    -							    <li>H2 1.3.161</li>
    -							    <li>HSQLDB 2.2.5</li>
    -							    <li>Ingres 10.1.0</li>
    -							    <li>MySQL 5.1.41 and 5.5.8</li>
    -							    <li>Oracle XE 10.2.0.1.0 and 11g</li>
    -							    <li>PostgreSQL 9.0</li>
    -							    <li>SQLite with inofficial JDBC driver v056</li>
    -							    <li>SQL Server 2008 R8</li>
    -							    <li>Sybase Adaptive Server Enterprise 15.5</li>
    -							    <li>Sybase SQL Anywhere 12</li>
    -							</ul>
    -							<p>
    -								These platforms have been observed to work as well, but are not integration-tested
    -							</p>
    -							<ul>
    -								<li>Google Cloud SQL (MySQL)</li>
    -							</ul>
    -								
    -							<h3>Databases planned for support</h3>
    -							<p>
    -								Any of the following databases might be available in the future
    -							</p>
    -						    <ul>
    -							    <li>Informix</li>
    -							    <li>Interbase</li>
    -							    <li>MS Access</li>
    -							    <li>MS Excel</li>
    -							    <li>SQL Azure</li>
    -							    <li>Sybase SQL Anywhere OnDemand</li>
    -							    <li>Teradata</li>
    -						    </ul>
    -						    
    -							<h3>Databases being watched</h3>
    -							<p>
    -								Any of the following databases are being observed for a potential integration
    -							</p>
    -							<ul>
    -								<li>Mondrian</li>
    -								<li>Netezza</li>
    -								<li>SQLFire</li>
    -								<li>Vectorwise</li>
    -								<li>Vertica</li>
    -								<li>VoltDB</li>
    -							</ul>
    -
    -							<h3>Feature matrix</h3>
    -							<p>
    -								This section will soon contain a feature matrix, documenting what feature is available for which database.
    -							</p>
    -						</html></content>
    -					</section>
    -
    -					<section id="reference-data-types">
    -						<title>Data types</title>
    -						<content><html>
    -							<p>
    -								There is always a small mismatch between SQL data types and Java data types. This is for two reasons:
    -							</p>
    -							<ul>
    -								<li>SQL data types are insufficiently covered by the JDBC API.</li>
    -								<li>Java data types are often less expressive than SQL data types</li>
    -							</ul>
    -							<p>
    -								This chapter should document the most important notes about SQL, JDBC and jOOQ data types.
    -							</p>
    -						</html></content>
    -						
    -						<sections>
    -							<section id="data-types-lobs">
    -								<title>BLOBs and CLOBs</title>
    -								<content><html>
    -									<p>
    -										jOOQ currently doesn't explicitly support JDBC BLOB and CLOB data types. If you use any of these data types in your database, jOOQ will map them to byte[] and String instead. In simple cases (small data), this simplification is sufficient. In more sophisticated cases, you may have to bypass jOOQ, in order to deal with these data types and their respective resources. True support for LOBs is on the roadmap, though.
    -									</p>
    -								</html></content>
    -							</section>
    -							
    -							<section id="data-types-unsigned">
    -								<title>Unsigned integer types</title>
    -								<content><html>
    -									<p>
    -										Some databases explicitly support unsigned integer data types. In most normal JDBC-based applications, they would just be mapped to their signed counterparts letting bit-wise shifting and tweaking to the user. jOOQ ships with a set of unsigned <reference class="java.lang.Number"/> implementations modelling the following types:
    -									</p>
    -									<ul>
    -										<li><reference class="org.jooq.tools.unsigned.UByte"/>: Unsigned byte, an 8-bit unsigned integer</li>
    -										<li><reference class="org.jooq.tools.unsigned.UShort"/>: Unsigned short, a 16-bit unsigned integer</li>
    -										<li><reference class="org.jooq.tools.unsigned.UInteger"/>: Unsigned int, a 32-bit unsigned integer</li>
    -										<li><reference class="org.jooq.tools.unsigned.ULong"/>: Unsigned long, a 64-bit unsigned integer</li>
    -									</ul>
    -									<p>
    -										Each of these wrapper types extends <reference class="java.lang.Number"/>, wrapping a higher-level integer type, internally:
    -									</p>
    -									<ul>
    -										<li>UByte wraps <reference class="java.lang.Short"/></li>
    -										<li>UShort wraps <reference class="java.lang.Integer"/></li>
    -										<li>UInteger wraps <reference class="java.lang.Long"/></li>
    -										<li>ULong wraps <reference class="java.math.BigInteger"/></li>
    -									</ul>
    -								</html></content>
    -							</section>
    -							
    -							<section id="data-types-intervals">
    -								<title>INTERVAL data types</title>
    -								<content><html>
    -									<p>
    -										jOOQ fills a gap opened by JDBC, which neglects an important SQL data type as defined by the SQL standards: INTERVAL types. SQL knows two different types of intervals:
    -									</p>
    -									<ul>
    -										<li><strong>YEAR TO MONTH</strong>: This interval type models a number of months and years</li>
    -										<li><strong>DAY TO SECOND</strong>: This interval type models a number of days, hours, minutes, seconds and milliseconds</li>
    -									</ul>
    -									
    -									<p>
    -										Both interval types ship with a variant of subtypes, such as DAY TO HOUR, HOUR TO SECOND, etc. jOOQ models these types as Java objects extending <reference class="java.lang.Number"/>: <reference class="org.jooq.types.YearToMonth"/> (where Number.intValue() corresponds to the absolute number of months) and <reference class="org.jooq.types.DayToSecond"/> (where Number.intValue() corresponds to the absolute number of milliseconds)
    -									</p>
    -									
    -									<h3>Interval arithmetic</h3>
    -									<p>
    -										In addition to the <reference id="arithmetic-expressions" title="arithmetic expressions"/> documented previously, interval arithmetic is also supported by jOOQ. Essentially, the following operations are supported:
    -									</p>
    -									<ul>
    -										<li>DATETIME - DATETIME => INTERVAL</li>
    -										<li>DATETIME + or - INTERVAL => DATETIME</li>
    -										<li>INTERVAL + DATETIME => DATETIME</li>
    -										<li>INTERVAL + - INTERVAL => INTERVAL</li>
    -										<li>INTERVAL * or / NUMERIC => INTERVAL</li>
    -										<li>NUMERIC * INTERVAL => INTERVAL</li>
    -									</ul>
    -								</html></content>
    -							</section>
    -							
    -							<section id="data-types-xml">
    -								<title>XML data types</title>
    -								<content><html>
    -									<p>
    -										XML data types are currently not supported
    -									</p>
    -								</html></content>
    -							</section>
    -							
    -							<section id="data-types-geospacial">
    -								<title>Geospacial data types</title>
    -								<content><html>
    -									<h3>Geospacial data types</h3>
    -									<p>
    -										Geospacial data types are currently not supported
    -									</p>
    -								</html></content>
    -							</section>
    -							
    -							<section id="data-types-cursors">
    -								<title>CURSOR data types</title>
    -								<content><html>
    -									<p>
    -										Some databases support cursors returned from stored procedures. They are mapped to the following jOOQ data type:
    -									</p>
    -
    -</html><java><![CDATA[Field<Result<Record>> cursor;]]></java><html>
    -									
    -									<p>
    -										In fact, such a cursor will be fetched immediately by jOOQ and wrapped in an <reference class="org.jooq.Result"/> object.
    -									</p>
    -								</html></content>
    -							</section>
    -							
    -							<section id="data-types-arrays">
    -								<title>ARRAY and TABLE data types</title>
    -								<content><html>
    -									<p>
    -										The SQL standard specifies ARRAY data types, that can be mapped to Java arrays as such:
    -									</p>
    -									
    -</html><java><![CDATA[Field<Integer[]> intArray;]]></java><html>
    -										
    -									<p>
    -										The above array type is supported by these SQL dialects:
    -									</p>
    -									<ul>
    -										<li>H2</li>
    -										<li>HSQLDB</li>
    -										<li>Postgres</li>
    -									</ul>
    -									
    -									<h3>Oracle typed arrays</h3>
    -									<p>
    -										Oracle has strongly-typed arrays and table types (as opposed to the previously seen anonymously typed arrays). These arrays are wrapped by <reference class="org.jooq.ArrayRecord"/> types.
    -									</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -					<section id="reference-bnf-notation">
    -						<title>jOOQ's BNF pseudo-notation</title>
    -						<content><html>
    -							<p>
    -								This chapter will soon contain an overview over jOOQ's API using a pseudo BNF notation.
    -							</p>
    -						</html></content>
    -					</section>
    -
    -					<section id="reference-credits">
    -						<title>Credits</title>
    -						<content><html>
    -							<p>
    -								jOOQ lives in a very challenging ecosystem. The Java to SQL interface is still one of the most important system interfaces. Yet there are still a lot of open questions, best practices and no "true" standard has been established. This situation gave way to a lot of tools, APIs, utilities which essentially tackle the same problem domain as jOOQ. jOOQ has gotten great inspiration from pre-existing tools and this section should give them some credit. Here is a list of inspirational tools in alphabetical order:
    -							</p>
    -							<ul>
    -								<li><a href="http://avaje.org">Avajé EBean</a>: Play! Framework's preferred ORM has a feature called asynchronous query execution. This idea made it into jOOQ as <reference class="org.jooq.ResultQuery" anchor="#fetchLater()"/></li>
    -								<li><a href="http://www.hibernate.org">Hibernate</a>: The de-facto standard (JPA) with its useful table-to-POJO mapping features have influenced jOOQ's <reference class="org.jooq.ResultQuery" anchor="#fetchInto(java.lang.Class)"/> facilities</li>
    -								<li><a href="http://www.h2database.com/html/jaqu.html">JaQu</a>: H2's own fluent API for querying databases</li>
    -								<li><a href="http://www.oracle.com/technetwork/java/javaee/tech/persistence-jsp-140049.html">JPA</a>: The de-facto standard in the javax.persistence packages, supplied by Oracle. Its annotations are useful to jOOQ as well.</li>
    -								<li><a href="http://onewebsql.com">OneWebSQL</a>: A commercial SQL abstraction API with support for DAO source code generation, which was integrated also in jOOQ</li>
    -								<li><a href="http://www.querydsl.com">QueryDSL</a>: A "LINQ-port" to Java. It has a similar fluent API, a similar code-generation facility, yet quite a different purpose. While jOOQ is all about SQL, QueryDSL (like LINQ) is mostly about querying.</li>
    -								<li><a href="http://www.springsource.org/features/data-access">Spring Data</a>: Spring's JdbcTemplate knows RowMappers, which are reflected by jOOQ's <reference id="recordhandler"/> or <reference id="recordmapper"/></li>
    -							</ul>
    -						</html></content>
    -					</section>
    -				</sections>
    -			</section>
    -		</sections>
    -	</section>
    -</manual>
    diff --git a/jOOQ-website/src/main/resources/manual-2.7.xml b/jOOQ-website/src/main/resources/manual-2.7.xml
    deleted file mode 100644
    index 82c165087f..0000000000
    --- a/jOOQ-website/src/main/resources/manual-2.7.xml
    +++ /dev/null
    @@ -1,9141 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?>
    -<!-- 
    -  - Copyright (c) 2009-2012, Lukas Eder, lukas.eder@gmail.com
    -  - All rights reserved.
    -  -
    -  - This software is licensed to you under the Apache License, Version 2.0
    -  - (the "License"); You may obtain a copy of the License at
    -  -
    -  -   http://www.apache.org/licenses/LICENSE-2.0
    -  -
    -  - Redistribution and use in source and binary forms, with or without
    -  - modification, are permitted provided that the following conditions are met:
    -  -
    -  - . Redistributions of source code must retain the above copyright notice, this
    -  -   list of conditions and the following disclaimer.
    -  -
    -  - . Redistributions in binary form must reproduce the above copyright notice,
    -  -   this list of conditions and the following disclaimer in the documentation
    -  -   and/or other materials provided with the distribution.
    -  -
    -  - . Neither the name "jOOQ" nor the names of its contributors may be
    -  -   used to endorse or promote products derived from this software without
    -  -   specific prior written permission.
    -  -
    -  - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    -  - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    -  - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    -  - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
    -  - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
    -  - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
    -  - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
    -  - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
    -  - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
    -  - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
    -  - POSSIBILITY OF SUCH DAMAGE.
    -  -->
    -<manual>
    -	<section id="manual">
    -		<title>The jOOQ User Manual. Multiple Pages</title>
    -		<content><html>
    -			<h2 id="Overview"><a href="#Overview" name="Overview">#</a> Overview</h2>
    -			<p>This manual is divided into six main sections:</p>
    -
    -			<ul>
    -				<li>
    -					<reference id="getting-started"/>
    -					<p>
    -						This section will get you started with jOOQ quickly. It contains
    -						simple explanations about what jOOQ is, what jOOQ isn't and how
    -						to set it up for the first time
    -					</p>
    -				</li>
    -				<li>
    -					<reference id="sql-building"/>
    -					<p>
    -						This section explains all about the jOOQ syntax used for building
    -						queries. It explains the central factories, the supported SQL
    -						statements and various other syntax elements
    -					</p>
    -				</li>
    -				<li>
    -					<reference id="code-generation"/>
    -					<p>
    -						This section explains how to configure and use the built-in source code
    -						generator
    -					</p>
    -				</li>
    -				<li>
    -					<reference id="sql-execution"/>
    -					<p>
    -						This section will get you through the specifics of what can be done
    -						with jOOQ at runtime, in order to execute queries, perform CRUD
    -						operations, import and export data, and hook into the jOOQ execution
    -						lifecycle for debugging
    -					</p>
    -				</li>
    -				<li>
    -					<reference id="tools"/>
    -					<p>
    -						This section is dedicated to tools that ship with jOOQ, such as the
    -						jOOQ console
    -					</p>
    -				</li>
    -				<li>
    -					<reference id="reference"/>
    -					<p>
    -						This section is a reference for elements in this manual
    -					</p>
    -				</li>
    -			</ul>
    -		</html></content>
    -
    -		<sections>
    -			<section id="preface">
    -				<title>Preface</title>
    -				<content><html>
    -					<h3>jOOQ's reason of being - compared to JPA</h3>
    -					<p>
    -						Java and SQL have come a long way. SQL is an "ancient", yet established and well-understood technology. Java is a legacy too, although its platform JVM allows for many new and contemporary languages built on top of it. Yet, after all these years, libraries dealing with the interface between SQL and Java have come and gone, leaving JPA to be a standard that is accepted only with doubts, short of any surviving options.
    -					</p>
    -					<p>
    -						So far, there had been only few database abstraction frameworks or libraries, that truly respected SQL as a first class citizen among languages. Most frameworks, including the industry standards JPA, EJB, Hibernate, JDO, Criteria Query, and many others try to hide SQL itself, minimising its scope to things called JPQL, HQL, JDOQL and various other inferior query languages
    -					</p>
    -					<p>
    -						jOOQ has come to fill this gap.
    -					</p>
    -
    -					<h3>jOOQ's reason of being - compared to LINQ</h3>
    -					<p>
    -						Other platforms incorporate ideas such as LINQ (with LINQ-to-SQL), or Scala's SLICK, or also Java's QueryDSL to better integrate querying as a concept into their respective language. By querying, they understand querying of arbitrary targets, such as SQL, XML, Collections and other heterogeneous data stores. jOOQ claims that this is going the wrong way too.
    -					</p>
    -					<p>
    - 						In more advanced querying use-cases (more than simple CRUD and the occasional JOIN), people will want to profit from the expressivity of SQL. Due to the relational nature of SQL, this is quite different from what object-oriented and partially functional languages such as C#, Scala, or Java can offer.
    - 					</p>
    - 					<p>
    - 						It is very hard to formally express and validate joins and the ad-hoc table expression types they create. It gets even harder when you want support for more advanced table expressions, such as pivot tables, unnested cursors, or just arbitrary projections from derived tables. With a very strong object-oriented typing model, these features will probably stay out of scope.
    - 					</p>
    - 					<p>
    - 						In essence, the decision of creating an API that looks like SQL or one that looks like C#, Scala, Java is a definite decision in favour of one or the other platform. While it will be easier to evolve SLICK in similar ways as LINQ (or QueryDSL in the Java world), SQL feature scope that clearly communicates its underlying intent will be very hard to add, later on (e.g. how would you model Oracle's partitioned outer join syntax? How would you model ANSI/ISO SQL:1999 grouping sets? How can you support scalar subquery caching? etc...).					
    -					</p>
    -					<p>
    -						jOOQ has come to fill this gap.
    -					</p>
    -					
    -					<h3>jOOQ is different</h3>
    -					<p>
    -						SQL was never meant to be abstracted. To be confined in the narrow boundaries of heavy mappers, hiding the beauty and simplicity of relational data. SQL was never meant to be object-oriented. SQL was never meant to be anything other than... SQL!
    -					</p>					
    -				</html></content>
    -			</section>
    -			
    -			<section id="copyright">
    -				<title>Copyright, License, and Trademarks</title>
    -				<content><html>
    -                    <p>
    -                        This section lists the various licenses that apply to different versions of jOOQ. Prior to version 3.2, jOOQ was shipped for free under the terms of the <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache Software License 2.0</a>. With jOOQ 3.2, jOOQ became dual-licensed: <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache Software License 2.0</a> (for use with Open Source databases) and <a href="http://www.jooq.org/licensing">commercial</a> (for use with commercial databases). Please contact <a href="mailto:sales@datageekery.com">sales@datageekery.com</a>, should you have any questions regarding licensing.
    -                    </p>
    -                    <h3>License for jOOQ 1.x, 2.x, 3.0, 3.1</h3>
    -                    
    -</html><text>Copyright (c) 2009-2013, Lukas Eder, lukas.eder@gmail.com
    -All rights reserved.
    -
    -This software is licensed to you under the Apache License, Version 2.0
    -(the "License"); You may obtain a copy of the License at
    -
    -  http://www.apache.org/licenses/LICENSE-2.0
    -
    -Redistribution and use in source and binary forms, with or without
    -modification, are permitted provided that the following conditions are met:
    -
    -. Redistributions of source code must retain the above copyright notice, this
    -  list of conditions and the following disclaimer.
    -
    -. Redistributions in binary form must reproduce the above copyright notice,
    -  this list of conditions and the following disclaimer in the documentation
    -  and/or other materials provided with the distribution.
    -
    -. Neither the name "jOOQ" nor the names of its contributors may be
    -  used to endorse or promote products derived from this software without
    -  specific prior written permission.
    -
    -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
    -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
    -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
    -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
    -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
    -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
    -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
    -POSSIBILITY OF SUCH DAMAGE.</text><html>
    -
    -                    <h3>License for jOOQ 3.2 and later</h3>
    -                    
    -</html><text>Copyright (c) 2009-2013, Data Geekery GmbH (http://www.datageekery.com)
    -All rights reserved.
    -
    -This work is dual-licensed
    -- under the Apache Software License 2.0 (the "ASL")
    -- under the jOOQ License and Maintenance Agreement (the "jOOQ License")
    -=============================================================================
    -You may choose which license applies to you:
    -
    -- If you're using this work with Open Source databases, you may choose
    -  either ASL or jOOQ License.
    -- If you're using this work with at least one commercial database, you must
    -  choose jOOQ License
    -
    -For more information, please visit http://www.jooq.org/licenses
    -
    -Apache Software License 2.0:
    ------------------------------------------------------------------------------
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    - http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -
    -jOOQ License and Maintenance Agreement:
    ------------------------------------------------------------------------------
    -Data Geekery grants the Customer the non-exclusive, timely limited and
    -non-transferable license to install and use the Software under the terms of
    -the jOOQ License and Maintenance Agreement.
    -
    -This library is distributed with a LIMITED WARRANTY. See the jOOQ License
    -and Maintenance Agreement for more details: http://www.jooq.org/licensing</text><html>
    -
    -                    <h3>Trademarks owned by Data Geekeryâ„¢ GmbH</h3>
    -                    <ul>
    -                        <li>jOOQâ„¢ is a trademark by Data Geekeryâ„¢ GmbH</li>
    -                        <li>jOOXâ„¢ is a trademark by Data Geekeryâ„¢ GmbH</li>
    -                        <li>jOORâ„¢ is a trademark by Data Geekeryâ„¢ GmbH</li>
    -                        <li>jOOUâ„¢ is a trademark by Data Geekeryâ„¢ GmbH</li>
    -                    </ul>
    -                    
    -                    <h3>Trademarks owned by database vendors with no affiliation to Data Geekeryâ„¢ GmbH</h3>
    -                    <ul>
    -                        <li>Access® is a registered trademark of Microsoft® Inc.</li>
    -                        <li>Adaptive Server® Enterprise is a registered trademark of Sybase®, Inc.</li>
    -                        <li>CUBRID™ is a trademark of NHN® Corp.</li>
    -                        <li>DB2® is a registered trademark of IBM® Corp.</li>
    -                        <li>Derby is a trademark of the Apacheâ„¢ Software Foundation</li>
    -                        <li>H2 is a trademark of the H2 Group</li>
    -                        <li>HSQLDB is a trademark of The hsql Development Group</li>
    -                        <li>Ingres is a trademark of Actianâ„¢ Corp.</li>
    -                        <li>MariaDB is a trademark of Monty Program Ab</li>
    -                        <li>MySQL® is a registered trademark of Oracle® Corp.</li>
    -                        <li>Firebird® is a registered trademark of Firebird Foundation Inc.</li>
    -                        <li>Oracle® database is a registered trademark of Oracle® Corp.</li>
    -                        <li>PostgreSQL® is a registered trademark of The PostgreSQL Global Development Group</li>
    -                        <li>Postgres Plus® is a registered trademark of EnterpriseDB® software</li>
    -                        <li>SQL Anywhere® is a registered trademark of Sybase®, Inc.</li>
    -                        <li>SQL Server® is a registered trademark of Microsoft® Inc.</li>
    -                        <li>SQLite is a trademark of Hipp, Wyrick &amp; Company, Inc.</li>
    -                    </ul>
    -                    
    -                    <h3>Other trademarks by vendors with no affiliation to Data Geekeryâ„¢ GmbH</h3>
    -                    <ul>
    -                        <li>Java® is a registered trademark by Oracle® Corp. and/or its affiliates</li>
    -                        <li>Scala is a trademark of EPFL</li>
    -                    </ul>
    -                    
    -                    <h3>Other trademark remarks</h3>
    -                    <p>
    -                        Other names may be trademarks of their respective owners.
    -                    </p>
    -                    
    -                    <p>
    -                        Throughout the manual, the above trademarks are referenced without a formal ® (R) or ™ (TM) symbol. It is believed that referencing third-party trademarks in this manual or on the jOOQ website constitutes "fair use". Please <a href="mailto:contact@datageekery.com">contact us</a> if you think that your trademark(s) are not properly attributed.
    -                    </p>
    -				</html></content>
    -			</section>
    -			
    -			<section id="getting-started">
    -				<title>Getting started with jOOQ</title>
    -				<content><html>
    -					<p>
    -						These chapters contain a quick overview of how to get started with this manual and with jOOQ. While the subsequent chapters contain a lot of reference information, this chapter here just wraps up the essentials.
    -					</p>
    -				</html></content>
    -
    -				<sections>
    -					<section id="the-manual">
    -					    <title>How to read this manual</title>
    -						<content><html>
    -							<p>
    -								This section helps you correctly interpret this manual in the context of jOOQ.
    -							</p>
    -							
    -							<h3>Code blocks</h3>
    -							<p>
    -								The following are code blocks:
    -							</p>
    -							
    -</html><sql><![CDATA[-- A SQL code block
    -SELECT 1 FROM DUAL]]></sql><java><![CDATA[// A Java code block
    -for (int i = 0; i < 10; i++);]]></java><xml><![CDATA[<!-- An XML code block -->
    -<hello what="world"></hello>]]></xml><config><![CDATA[# A config file code block
    -org.jooq.property=value]]></config><html>		
    -
    -							<p>
    -								These are useful to provide examples in code. Often, with jOOQ, it is even more useful to compare SQL code with its corresponding Java/jOOQ code. When this is done, the blocks are aligned side-by-side, with SQL usually being on the left, and Java usually being on the right:
    -							</p>					
    -							
    -</html><code-pair>
    -<sql><![CDATA[-- In SQL:
    -SELECT 1 FROM DUAL]]></sql><java><![CDATA[// Using jOOQ:
    -create.select()]]></java>
    -</code-pair><html>
    -
    -							<h3>Code block contents</h3>
    -							<p>
    -								The contents of code blocks follow conventions, too. If nothing else is mentioned next to any given code block, then the following can be assumed:
    -							</p>
    -							
    -							
    -</html><sql><![CDATA[-- SQL assumptions
    -------------------
    -
    --- If nothing else is specified, assume that the Oracle syntax is used 
    -SELECT 1 FROM DUAL]]></sql><java><![CDATA[// Java assumptions
    -// ----------------
    - 
    -// Whenever you see "standalone functions", assume they were static imported from org.jooq.impl.Factory 
    -exists(); max(); min(); val(); inline(); // correspond to Factory.exists(); Factory.max(); Factory.min(); etc...
    -
    -// Whenever you see BOOK/Book, AUTHOR/Author and similar entities, assume they were (static) imported from the generated schema
    -BOOK.TITLE, AUTHOR.LAST_NAME // correspond to com.example.generated.Tables.BOOK.TITLE, com.example.generated.Tables.BOOK.TITLE
    -
    -// Whenever you see "create" being used in Java code, assume that this is an instance of org.jooq.impl.Factory:
    -Factory create = new Factory(connection, SQLDialect.ORACLE);]]></java><html>
    -
    -							<h3>Settings</h3>
    -							<p>
    -								jOOQ allows to override runtime behaviour using <reference class="org.jooq.conf.Settings"/>. If nothing is specified, the default runtime settings are assumed.
    -							</p>
    -							
    -							<h3>Sample database</h3>
    -							<p>
    -								See the manual's section about <reference id="sample-database" title="the sample database used in this manual"/> to learn more about the sample database.
    -							</p>
    -						</html></content>
    -					</section>
    -
    -					<section id="sample-database">
    -					    <title>The sample database used in this manual</title>
    -						<content><html>
    -							<p>
    -							For the examples in this manual, the same database will always be referred to. It essentially consists of these entities created using the Oracle dialect
    -							</p>
    -</html><sql>CREATE TABLE language (
    -  id              NUMBER(7)     NOT NULL PRIMARY KEY,
    -  cd              CHAR(2)       NOT NULL,
    -  description     VARCHAR2(50)
    -)
    -
    -CREATE TABLE author (
    -  id              NUMBER(7)     NOT NULL PRIMARY KEY,
    -  first_name      VARCHAR2(50),
    -  last_name       VARCHAR2(50)  NOT NULL,
    -  date_of_birth   DATE,
    -  year_of_birth   NUMBER(7),
    -  distinguished   NUMBER(1)
    -)
    -
    -CREATE TABLE book (
    -  id              NUMBER(7)     NOT NULL PRIMARY KEY,
    -  author_id       NUMBER(7)     NOT NULL,
    -  title           VARCHAR2(400) NOT NULL,
    -  published_in    NUMBER(7)     NOT NULL,
    -  language_id     NUMBER(7)     NOT NULL,
    -  
    -  CONSTRAINT fk_book_author     FOREIGN KEY (author_id)   REFERENCES author(id),
    -  CONSTRAINT fk_book_language   FOREIGN KEY (language_id) REFERENCES language(id)
    -)
    -
    -CREATE TABLE book_store (
    -  name            VARCHAR2(400) NOT NULL UNIQUE
    -)
    -
    -CREATE TABLE book_to_book_store (
    -  name            VARCHAR2(400) NOT NULL,
    -  book_id         INTEGER       NOT NULL,
    -  stock           INTEGER,
    -  
    -  PRIMARY KEY(name, book_id),
    -  CONSTRAINT fk_b2bs_book_store FOREIGN KEY (name)        REFERENCES book_store (name) ON DELETE CASCADE,
    -  CONSTRAINT fk_b2bs_book       FOREIGN KEY (book_id)     REFERENCES book (id)         ON DELETE CASCADE
    -)</sql><html>
    -							<p>
    -								More entities, types (e.g. UDT's, ARRAY types, ENUM types, etc), stored procedures and packages are introduced for specific examples
    -							</p>
    -						</html></content>
    -					</section>
    -
    -					<section id="use-cases">
    -						<title>Different use cases for jOOQ</title>
    -						<content><html>
    -							<p>
    -								jOOQ has originally been created as a library for complete abstraction of JDBC and all database interaction. Various best practices that are frequently encountered in pre-existing software products are applied to this library. This includes:
    -							</p>
    -							<ul>
    -								<li>Typesafe database object referencing through generated schema, table, column, record, procedure, type, dao, pojo artefacts (see the chapter about <reference id="code-generation" title="code generation"/>)</li>
    -								<li>Typesafe SQL construction through a complete API modelling SQL as a domain specific language in Java (see the chapter about <reference id="dsl-and-non-dsl" title="the DSL API"/>)</li>
    -								<li>Convenient query execution through an improved API for result fetching (see the chapters about <reference id="fetching" title="the various types of data fetching"/>)</li>
    -								<li>SQL dialect abstraction and SQL clause simulation to improve cross-database compatibility and to enable missing features in simpler databases (see the chapter about <reference id="sql-dialects" title="SQL dialects"/>)</li>
    -								<li>SQL logging and debugging using jOOQ as an integral part of your development process (see the chapters about <reference id="logging" title="logging"/> and about the <reference id="jooq-console" title="jOOQ Console"/>)</li>
    -							</ul>
    -							<p>
    -								Effectively, jOOQ was originally designed to replace any other database abstraction framework short of the ones handling connection pooling and transaction management (see also the <reference id="reference-credits" title="credits for other database abstraction libraries"/>)
    -							</p>
    -							
    -							<h3>Use jOOQ the way you prefer</h3>
    -							<p>
    -								... but open source is community-driven. And the community has shown various ways of using jOOQ that diverge from its original intent. Some use cases encountered are:
    -							</p>
    -							<ul>
    -								<li>Using Hibernate for 70% of the queries (i.e. <reference id="crud-with-updatablerecords" title="CRUD"/>) and jOOQ for the remaining 30% where SQL is really needed</li>
    -								<li>Using jOOQ for SQL building and JDBC for SQL execution</li> 
    -								<li>Using jOOQ for SQL building and Spring Data for SQL execution</li>
    -								<li>Using jOOQ without the <reference id="code-generation" title="source code generator"/> to build the basis of a framework for dynamic SQL execution.</li> 
    -							</ul>
    -							
    -							<p>
    -								The following sections explain about various use cases for using jOOQ in your application.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="jooq-as-a-standalone-sql-builder">
    -								<title>jOOQ as a SQL builder</title>
    -								<content><html>
    -									<p>
    -										This is the most simple of all use cases, allowing for construction of valid SQL for any database. In this use case, you will not use <reference id="jooq-as-a-sql-builder-with-code-generation" title="jOOQ's code generator"/> and probably not even <reference id="jooq-as-a-sql-executor" title="jOOQ's query execution facilities"/>. Instead, you'll use jOOQ to wrap strings, literals and other user-defined objects into an object-oriented, type-safe AST modelling your SQL statements. An example is given here: 
    -									</p>
    -									
    -</html><java><![CDATA[// Fetch a SQL string from a jOOQ Query in order to manually execute it with another tool.
    -String sql = create.select(fieldByName("BOOK","TITLE"), fieldByName("AUTHOR","FIRST_NAME"), fieldByName("AUTHOR","LAST_NAME"))
    -                   .from(tableByName("BOOK"))
    -                   .join(tableByName("AUTHOR"))
    -                   .on(fieldByName("BOOK", "AUTHOR_ID").equal("AUTHOR", "ID"))
    -                   .where(fieldByName("BOOK", "PUBLISHED_IN").equal(1948))
    -                   .getSQL();]]></java><html>
    -                   
    -                   					<p>
    -                   						The SQL string that you can generate as such can then be executed using JDBC directly, using Spring's JdbcTemplate, using Apache DbUtils and many other tools.
    -                   					</p>
    -                   					<p>
    -                   						If you wish to use jOOQ only as a SQL builder, the following sections of the manual will be of interest to you:
    -                  					</p>
    -                  					<ul>
    -                  						<li><reference id="sql-building" title="SQL building"/>: This section contains a lot of information about creating SQL statements using the jOOQ API</li>
    -                  						<li><reference id="plain-sql" title="Plain SQL"/>: This section contains information useful in particular to those that want to supply <reference id="table-expressions" title="table expressions"/>, <reference id="column-expressions" title="column expressions"/>, etc. as plain SQL to jOOQ, rather than through generated artefacts</li>
    -                  					</ul>
    -								</html></content>
    -							</section>
    -
    -							<section id="jooq-as-a-sql-builder-with-code-generation">
    -								<title>jOOQ as a SQL builder with code generation</title>
    -								<content><html>
    -									<p>
    -										In addition to using jOOQ as a <reference id="jooq-as-a-standalone-sql-builder" title="standalone SQL builder"/>, you can also use jOOQ's code generation features in order to compile your SQL statements using a Java compiler against an actual database schema. This adds a lot of power and expressiveness to just simply constructing SQL using custom strings and literals, as you can be sure that all database artefacts actually exist in the database, and that their type is correct. An example is given here: 
    -									</p>
    -
    -</html><java><![CDATA[// Fetch a SQL string from a jOOQ Query in order to manually execute it with another tool.
    -String sql = create.select(BOOK.TITLE, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -                   .from(BOOK)
    -                   .join(AUTHOR)
    -                   .on(BOOK.AUTHOR_ID.equal(AUTHOR.ID))
    -                   .where(BOOK.PUBLISHED_IN.equal(1948))
    -                   .getSQL();]]></java><html>
    -                   
    -                   					<p>
    -                   						The SQL string that you can generate as such can then be executed using JDBC directly, using Spring's JdbcTemplate, using Apache DbUtils and many other tools.
    -                   					</p>
    -                   					<p>
    -                   						If you wish to use jOOQ only as a SQL builder with code generation, the following sections of the manual will be of interest to you:
    -                  					</p>
    -                  					<ul>
    -                  						<li><reference id="sql-building" title="SQL building"/>: This section contains a lot of information about creating SQL statements using the jOOQ API</li>
    -                  						<li><reference id="code-generation" title="Code generation"/>: This section contains the necessary information to run jOOQ's code generator against your developer database</li>
    -                  					</ul>
    -								</html></content>
    -							</section>
    -
    -							<section id="jooq-as-a-sql-executor">
    -								<title>jOOQ as a SQL executor</title>
    -								<content><html>
    -									<p>
    -										Instead of any tool mentioned in the previous chapters, you can also use jOOQ directly to execute your jOOQ-generated SQL statements. This will add a lot of convenience on top of the previously discussed API for typesafe SQL construction, when you can re-use the information from generated classes to fetch records and custom data types. An example is given here:
    -									</p>
    -									
    -</html><java><![CDATA[// Execute the SQL statement directly with jOOQ
    -Result<Record> result = create.select(BOOK.TITLE, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -			                  .from(BOOK)
    -			                  .join(AUTHOR)
    -			                  .on(BOOK.AUTHOR_ID.equal(AUTHOR.ID))
    -			                  .where(BOOK.PUBLISHED_IN.equal(1948))
    -			                  .fetch();]]></java><html>
    -
    -									<p>
    -										jOOQ doesn't stop here, though! You can execute any SQL with jOOQ. In other words, you can use any other SQL building tool and run the SQL statements with jOOQ. An example is given here:
    -									</p>
    -
    -</html><java><![CDATA[// Use your favourite tool to construct SQL strings:
    -String sql = "SELECT title, first_name, last_name FROM book JOIN author ON book.author_id = author.id " +
    -             "WHERE book.published_in = 1984";
    -
    -// Fetch results using jOOQ
    -Result<Record> result = create.fetch(sql);
    -
    -// Or execute that SQL with JDBC, fetching the ResultSet with jOOQ:
    -ResultSet rs = connection.createStatement().executeQuery(sql);
    -Result<Record> result = create.fetch(rs);]]></java><html>
    -
    -									<p>
    -                   						If you wish to use jOOQ as a SQL executor with (or without) code generation, the following sections of the manual will be of interest to you:
    -                  					</p>
    -                  					<ul>
    -                  						<li><reference id="sql-building" title="SQL building"/>: This section contains a lot of information about creating SQL statements using the jOOQ API</li>
    -                  						<li><reference id="code-generation" title="Code generation"/>: This section contains the necessary information to run jOOQ's code generator against your developer database</li>
    -                  						<li><reference id="sql-execution" title="SQL execution"/>: This section contains a lot of information about executing SQL statements using the jOOQ API</li>
    -                  						<li><reference id="fetching"/>: This section contains some useful information about the various ways of fetching data with jOOQ</li>
    -                  					</ul>
    -								</html></content>
    -							</section>
    -
    -							<section id="jooq-for-crud">
    -								<title>jOOQ for CRUD</title>
    -								<content><html>
    -									<p>
    -										This is probably the most complete use-case for jOOQ: Use all of jOOQ's features. Apart from jOOQ's fluent API for query construction, jOOQ can also help you execute everyday CRUD operations. An example is given here:
    -									</p>
    -
    -</html><java><![CDATA[// Fetch all authors
    -for (AuthorRecord author : create.fetch(AUTHOR)) {
    -
    -    // Skip previously distinguished authors  
    -    if ((int) author.getDistinguished() == 1)
    -        continue;
    -  
    -    // Check if the author has written more than 5 books
    -    if (author.fetchChildren(FK_BOOK_AUTHOR).size() > 5) {
    -    
    -        // Mark the author as a "distinguished" author
    -        author.setDistinguished(1);
    -        author.store();
    -    }
    -}]]></java><html>
    -
    -									<p>
    -                   						If you wish to use all of jOOQ's features, the following sections of the manual will be of interest to you (including all sub-sections):
    -                  					</p>
    -                  					<ul>
    -                  						<li><reference id="sql-building" title="SQL building"/>: This section contains a lot of information about creating SQL statements using the jOOQ API</li>
    -                  						<li><reference id="code-generation" title="Code generation"/>: This section contains the necessary information to run jOOQ's code generator against your developer database</li>
    -                  						<li><reference id="sql-execution" title="SQL execution"/>: This section contains a lot of information about executing SQL statements using the jOOQ API</li>
    -                  					</ul>
    -								</html></content>
    -							</section>
    -							
    -							<section id="jooq-for-pros">
    -								<title>jOOQ for PROs</title>
    -								<content><html>
    -									<p>
    -										jOOQ isn't just a library that helps you <reference id="sql-building" title="build"/> and <reference id="sql-execution" title="execute"/> SQL against your <reference id="code-generation" title="generated, compilable schema"/>. jOOQ ships with a lot of tools. Here are some of the most important tools shipped with jOOQ:
    -									</p>
    -									<ul>
    -										<li><reference id="jooq-console" title="jOOQ Console"/>: This small application hooks into jOOQ's execute listener support to allow for tracing, debugging and introspecting any SQL statement executed through the jOOQ API. This includes setting breakpoints, introspecting bind values, running probe SQL statements, ad-hoc patching of SQL, measuring execution times, exporting stack traces. Use this tool to better know your SQL!</li>
    -										<li><reference id="execute-listeners" title="jOOQ's Execute Listeners"/>: jOOQ allows you to hook your custom execute listeners into jOOQ's SQL statement execution lifecycle in order to centrally coordinate any arbitrary operation performed on SQL being executed. Use this for logging, identity generation, SQL tracing, performance measurements, etc.</li>
    -										<li><reference id="logging" title="Logging"/>: jOOQ has a standard DEBUG logger built-in, for logging and tracing all your executed SQL statements and fetched result sets</li>
    -										<li><reference id="stored-procedures" title="Stored Procedures"/>: jOOQ supports stored procedures and functions of your favourite database. All routines and user-defined types are generated and can be included in jOOQ's SQL building API as function references.</li>
    -										<li><reference id="exporting" title="Exporting"/> and <reference id="importing" title="Importing"/>: jOOQ ships with an API to easily export/import data in various formats</li>
    -									</ul>
    -									<p>
    -										If you're a power user of your favourite, feature-rich database, jOOQ will help you access all of your database's vendor-specific features, such as OLAP features, stored procedures, user-defined types, vendor-specific SQL, functions, etc. Examples are given throughout this manual.
    -									</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -					<section id="tutorials">
    -						<title>Tutorials</title>
    -						<content><html>
    -							<p>
    -								Don't have time to read the full manual? Here are a couple of tutorials that will get you into the most essential parts of jOOQ as quick as possible.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="jooq-in-7-steps">
    -								<title>jOOQ in 7 easy steps</title>
    -								<content><html>
    -									<p>
    -										This manual section is intended for new users, to help them get a running application with jOOQ, quickly.
    -									</p>
    -								</html></content>
    -								
    -								<sections>
    -									<section id="jooq-in-7-steps-step1">
    -										<title>Step 1: Preparation</title>
    -										<content><html>
    -											<p>
    -												If you haven't already downloaded it, download jOOQ:<br/>
    -												<a href="https://sourceforge.net/projects/jooq/files/Release/" title="jOOQ download">https://sourceforge.net/projects/jooq/files/Release/</a>
    -											</p>
    -											
    -											<p>
    -												Alternatively, you can create a Maven dependency:
    -											</p>
    -</html><xml><![CDATA[<dependency>
    -  <groupId>org.jooq</groupId>
    -  <!-- artefacts are jooq, jooq-meta, jooq-codegen -->
    -  <artifactId>jooq</artifactId>
    -  <version>{jooq-version}</version>
    -</dependency>]]></xml><html>
    -
    -											<p>
    -												For this example, we'll be using MySQL. If you haven't already downloaded MySQL Connector/J, download it here:<br/>
    -												<a href="http://dev.mysql.com/downloads/connector/j/" target="_blank" title="MySQL JDBC driver">http://dev.mysql.com/downloads/connector/j/</a>
    -											</p>
    -
    -											<p>
    -												If you don't have a MySQL instance up and running yet, get <a href="http://www.apachefriends.org/en/xampp.html" title="XAMPP">XAMPP</a> now! XAMPP is a simple installation bundle for Apache, MySQL, PHP and Perl
    -											</p>
    -										</html></content>
    -									</section>
    -									
    -									<section id="jooq-in-7-steps-step2">
    -										<title>Step 2: Your database</title>
    -										<content><html>
    -											<p>
    -												We're going to create a database called "guestbook" and a corresponding "posts" table. Connect to MySQL via your command line client and type the following:
    -											</p>
    -											
    -</html><sql>CREATE DATABASE guestbook;
    -
    -CREATE TABLE `posts` (
    -  `id` bigint(20) NOT NULL,
    -  `body` varchar(255) DEFAULT NULL,
    -  `timestamp` datetime DEFAULT NULL,
    -  `title` varchar(255) DEFAULT NULL,
    -  PRIMARY KEY (`id`)
    -);
    -</sql></content>
    -									</section>
    -									
    -									<section id="jooq-in-7-steps-step3">
    -										<title>Step 3: Code generation</title>
    -										<content><html>
    -											<p>
    -												In this step, we're going to use jOOQ's command line tools to generate classes that map to the Posts table we just created. More detailed information about how to set up the jOOQ code generator can be found here:<br/>
    -												<reference id="code-generation" title="jOOQ manual pages about setting up the code generator"/>
    -											</p>
    -
    -											<p>
    -												The easiest way to generate a schema is to copy the jOOQ jar files (there should be 3) and the MySQL Connector jar file to a temporary directory. Then, create a guestbook.xml that looks like this:
    -											</p>
    -											
    -</html><xml><![CDATA[<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    -<configuration xmlns="http://www.jooq.org/xsd/jooq-codegen-2.5.0.xsd">
    -  <!-- Configure the database connection here -->
    -  <jdbc>
    -    <driver>com.mysql.jdbc.Driver</driver>
    -    <url>jdbc:mysql://localhost:3306/guestbook</url>
    -    <user>root</user>
    -    <password></password>
    -  </jdbc>
    -
    -  <generator>
    -    <!-- The default code generator. You can override this one, to generate your own code style
    -         Defaults to org.jooq.util.DefaultGenerator -->
    -    <name>org.jooq.util.DefaultGenerator</name>
    -
    -    <database>
    -      <!-- The database type. The format here is:
    -           org.util.[database].[database]Database -->
    -      <name>org.jooq.util.mysql.MySQLDatabase</name>
    -
    -      <!-- The database schema (or in the absence of schema support, in your RDBMS this
    -           can be the owner, user, database name) to be generated -->
    -      <inputSchema>guestbook</inputSchema>
    -
    -      <!-- All elements that are generated from your schema (several Java regular expressions, separated by comma)
    -           Watch out for case-sensitivity. Depending on your database, this might be important! -->
    -      <includes>.*</includes>
    -
    -      <!-- All elements that are excluded from your schema (several Java regular expressions, separated by comma).
    -              Excludes match before includes -->
    -      <excludes></excludes>
    -    </database>
    -
    -    <target>
    -      <!-- The destination package of your generated classes (within the destination directory) -->
    -      <packageName>test.generated</packageName>
    -
    -      <!-- The destination directory of your generated classes -->
    -      <directory>C:/workspace/MySQLTest/src</directory>
    -    </target>
    -  </generator>
    -</configuration>]]></xml><html>
    -											<p>
    -												Replace the username with whatever user has the appropriate privileges to query the database meta data. You'll also want to look at the other values and replace as necessary. Here are the two interesting properties:
    -											</p>
    -											<p>
    -												<code>generator.target.package</code> - set this to the parent package you want to create for the generated classes. The setting of <code>test.generated</code> will cause the <code>test.generated.Posts</code> and <code>test.generated.PostsRecord</code> to be created
    -											</p>
    -											<p>
    -												<code>generator.target.directory</code> - the directory to output to.
    -											</p>
    -											
    -											<p>
    -												Once you have the JAR files and guestbook.xml in your temp directory, type this (use colons instead of semi-colons on UNIX/Linux systems):
    -											</p>
    -
    -</html><text>java -classpath jooq-{jooq-version}.jar;jooq-meta-{jooq-version}.jar;jooq-codegen-{jooq-version}.jar;mysql-connector-java-5.1.18-bin.jar;. 
    -  org.jooq.util.GenerationTool /guestbook.xml
    -</text><html>
    -
    -											<p>
    -												Note the prefix slash before guestbook.xml. Even though it's in our working directory, we need to prepend a slash, as the configuration file is loaded from the classpath. Replace the filenames with your filenames. In this example, jOOQ {jooq-version} is being used. If everything has worked, you should see this in your console output:
    -											</p>
    -
    -</html><text>Nov 1, 2011 7:25:06 PM org.jooq.impl.JooqLogger info
    -INFO: Initialising properties  : /guestbook.xml
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Database parameters
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: ----------------------------------------------------------
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO:   dialect                : MYSQL
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO:   schema                 : guestbook
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO:   target dir             : /Users/jOOQ/Documents/workspace/MySQLTest/src
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO:   target package         : test.generated
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: ----------------------------------------------------------
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Emptying                 : /Users/jOOQ/workspace/MySQLTest/src/test/generated
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Generating classes in    : /Users/jOOQ/workspace/MySQLTest/src/test/generated
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Generating schema        : Guestbook.java
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Schema generated         : Total: 122.18ms
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Sequences fetched        : 0 (0 included, 0 excluded)
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Masterdata tables fetched: 0 (0 included, 0 excluded)
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Tables fetched           : 5 (5 included, 0 excluded)
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Generating tables        : /Users/jOOQ/workspace/MySQLTest/src/test/generated/tables
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: ARRAYs fetched           : 0 (0 included, 0 excluded)
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Enums fetched            : 0 (0 included, 0 excluded)
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: UDTs fetched             : 0 (0 included, 0 excluded)
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Generating table         : Posts.java
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Tables generated         : Total: 680.464ms, +558.284ms
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Generating Keys          : /Users/jOOQ/workspace/MySQLTest/src/test/generated/tables
    -Nov 1, 2011 7:25:08 PM org.jooq.impl.JooqLogger info
    -INFO: Keys generated           : Total: 718.621ms, +38.157ms
    -Nov 1, 2011 7:25:08 PM org.jooq.impl.JooqLogger info
    -INFO: Generating records       : /Users/jOOQ/workspace/MySQLTest/src/test/generated/tables/records
    -Nov 1, 2011 7:25:08 PM org.jooq.impl.JooqLogger info
    -INFO: Generating record        : PostsRecord.java
    -Nov 1, 2011 7:25:08 PM org.jooq.impl.JooqLogger info
    -INFO: Table records generated  : Total: 782.545ms, +63.924ms
    -Nov 1, 2011 7:25:08 PM org.jooq.impl.JooqLogger info
    -INFO: Routines fetched         : 0 (0 included, 0 excluded)
    -Nov 1, 2011 7:25:08 PM org.jooq.impl.JooqLogger info
    -INFO: Packages fetched         : 0 (0 included, 0 excluded)
    -Nov 1, 2011 7:25:08 PM org.jooq.impl.JooqLogger info
    -INFO: GENERATION FINISHED!     : Total: 791.688ms, +9.143ms
    -</text></content>
    -									</section>
    -									
    -									<section id="jooq-in-7-steps-step4">
    -										<title>Step 4: Connect to your database</title>
    -										<content><html>
    -											<p>
    -												Let's just write a vanilla main class in the project containing the generated classes:
    -											</p>
    -											
    -</html><java><![CDATA[// For convenience, always static import your generated tables and jOOQ functions to decrease verbosity:
    -import static test.generated.Tables.*;
    -import static org.jooq.impl.Factory.*;
    -
    -public class Main {
    -    public static void main(String[] args) {
    -        Connection conn = null;
    -
    -        String userName = "root";
    -        String password = "";
    -        String url = "jdbc:mysql://localhost:3306/guestbook";
    -
    -        try {
    -            Class.forName("com.mysql.jdbc.Driver").newInstance();
    -            conn = DriverManager.getConnection(url, userName, password);
    -        } catch (Exception e) {
    -            // For the sake of this tutorial, let's keep exception handling simple
    -            e.printStackTrace();
    -        } finally {
    -            if (conn != null) {
    -                try {
    -                    conn.close();
    -                } catch (SQLException ignore) {
    -                }
    -            }
    -        }
    -    }
    -}]]></java><html>
    -
    -											<p>
    -												This is pretty standard code for establishing a MySQL connection.
    -											</p>
    -										</html></content>
    -									</section>
    -									
    -									<section id="jooq-in-7-steps-step5">
    -										<title>Step 5: Querying</title>
    -										<content><html>
    -											<p>
    -												Let's add a simple query:
    -											</p>
    -											
    -</html><java><![CDATA[Factory create = new Factory(conn, SQLDialect.MYSQL);
    -Result<Record> result = create.select().from(POSTS).fetch();]]></java><html>
    -
    -											<p>
    -												First get an instance of <code>Factory</code> so we can write a simple <code>SELECT</code> query. We pass an instance of the MySQL connection to <code>Factory</code>. Note that the factory doesn't close the connection. We'll have to do that ourselves.
    -											</p>
    -											<p>
    -												We then use jOOQ's DSL to return an instance of Result. We'll be using this result in the next step.
    -											</p>
    -										</html></content>
    -									</section>
    -									
    -									<section id="jooq-in-7-steps-step6">
    -										<title>Step 6: Iterating</title>
    -										<content><html>
    -											<p>
    -												After the line where we retrieve the results, let's iterate over the results and print out the data:
    -											</p>
    -
    -</html><java><![CDATA[for (Record r : result) {
    -    Long id = r.getValue(POSTS.ID);
    -    String title = r.getValue(POSTS.TITLE);
    -    String description = r.getValue(POSTS.BODY);
    -
    -    System.out.println("ID: " + id + " title: " + title + " desciption: " + description);
    -}]]></java><html>
    -
    -											<p>
    -												The full program should now look like this:
    -											</p>
    -											
    -</html><java><![CDATA[package test;
    -
    -// For convenience, always static import your generated tables and
    -// jOOQ functions to decrease verbosity:
    -import static test.generated.Tables.*;
    -import static org.jooq.impl.Factory.*;
    -
    -import java.sql.Connection;
    -import java.sql.DriverManager;
    -import java.sql.ResultSet;
    -import java.sql.Statement;
    -
    -import org.jooq.Record;
    -import org.jooq.Result;
    -
    -import test.generated.GuestbookFactory;
    -import test.generated.tables.Posts;
    -
    -public class Main {
    -
    -    /**
    -     * @param args
    -     */
    -    public static void main(String[] args) {
    -        Connection conn = null;
    -
    -        String userName = "root";
    -        String password = "";
    -        String url = "jdbc:mysql://localhost:3306/guestbook";
    -
    -        try {
    -            Class.forName("com.mysql.jdbc.Driver").newInstance();
    -            conn = DriverManager.getConnection(url, userName, password);
    -
    -            Factory create = new Factory(conn, SQLDialect.MYSQL);
    -            Result<Record> result = create.select().from(POSTS).fetch();
    -
    -            for (Record r : result) {
    -                Long id = r.getValue(POSTS.ID);
    -                String title = r.getValue(POSTS.TITLE);
    -                String description = r.getValue(POSTS.BODY);
    -
    -                System.out.println("ID: " + id + " title: " + title + " desciption: " + description);
    -            }
    -        } catch (Exception e) {
    -            // For the sake of this tutorial, let's keep exception handling simple
    -            e.printStackTrace();
    -        } finally {
    -            if (conn != null) {
    -                try {
    -                    conn.close();
    -                } catch (SQLException ignore) {
    -                }
    -            }
    -        }
    -    }
    -}]]></java></content>
    -									</section>
    -									
    -									<section id="jooq-in-7-steps-step7">
    -										<title>Step 7: Explore!</title>
    -										<content><html>
    -											<p>
    -												jOOQ has grown to be a comprehensive SQL library. For more information, please consider the manual:<br/>
    -												<a href="http://www.jooq.org/manual/" title="jOOQ Manual">http://www.jooq.org/manual/</a>
    -											</p>
    -											<p>
    -												... explore the Javadoc:<br/>
    -												<a href="http://www.jooq.org/javadoc/latest/" title="jOOQ Javadoc">http://www.jooq.org/javadoc/latest/</a>
    -											</p>
    -											<p>
    -												... or join the news group:<br/>
    -												<a href="https://groups.google.com/forum/#!forum/jooq-user" title="jOOQ news group">https://groups.google.com/forum/#!forum/jooq-user</a>
    -											</p>
    -											<p>
    -											    This tutorial is the courtesy of Ikai Lan. See the original source here:<br/>
    -											    <a href="http://ikaisays.com/2011/11/01/getting-started-with-jooq-a-tutorial/" target="_blank" title="Ikai Lan's jOOQ tutorial">http://ikaisays.com/2011/11/01/getting-started-with-jooq-a-tutorial/</a>
    -											</p>
    -										</html></content>
    -									</section>
    -								</sections>
    -							</section>
    -
    -							<section id="jooq-in-modern-ides">
    -								<title>Using jOOQ in modern IDEs</title>
    -								<content><html>
    -									<p>Feel free to contribute a tutorial!</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="jooq-with-spring">
    -								<title>Using jOOQ with Spring</title>
    -								<content><html>
    -									<p>Feel free to contribute a tutorial!</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="a-simple-web-application">
    -								<title>A simple web application with jOOQ</title>
    -								<content><html>
    -									<p>Feel free to contribute a tutorial!</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -					
    -					<section id="jooq-and-scala">
    -						<title>jOOQ and Scala</title>
    -						<content><html>
    -							<p>
    -								As any other library, jOOQ can be easily used in Scala, taking advantage of the many Scala language features such as for example:
    -							</p>
    -							<ul>
    -								<li>Optional "." to dereference methods from expressions</li>
    -								<li>Optional "(" and ")" to delimit method argument lists</li>
    -								<li>Optioanl ";" at the end of a Scala statement</li>
    -								<li>Type inference using "var" and "val" keywords</li>
    -							</ul>
    -						
    -							<p>
    -								But jOOQ also leverages other useful Scala features, such as
    -							</p>
    -							<ul>
    -								<li>implicit defs for operator overloading</li>
    -								<li>Scala Macros (soon to come)</li>
    -							</ul>
    -							
    -							<p>
    -								A short example jOOQ application in Scala might look like this:
    -							</p>
    -							
    -</html><scala><![CDATA[
    -import collection.JavaConversions._                                  // Import implicit defs for iteration over org.jooq.Result
    -                                                                     //
    -import java.sql.DriverManager                                        //
    -                                                                     //
    -import org.jooq._                                                    //
    -import org.jooq.impl._                                               //
    -import org.jooq.impl.Factory._                                       //
    -import org.jooq.scala.example.h2.Tables._                            //
    -import org.jooq.scala.Conversions._                                  // Import implicit defs for overloaded jOOQ/SQL operators
    -                                                                     //
    -object Test {                                                        //
    -  def main(args: Array[String]): Unit = {                            //
    -    val c = DriverManager.getConnection("jdbc:h2:~/test", "sa", ""); // Standard JDBC connection
    -    val f = new Factory(c, SQLDialect.H2);                           //
    -    val x = T_AUTHOR as "x"                                          // SQL-esque table aliasing
    -                                                                     //
    -    for (r <- f                                                      // Iteration over Result. "r" is an org.jooq.Record
    -        select (                                                     //
    -          T_BOOK.ID * T_BOOK.AUTHOR_ID,                              // Using the overloaded "*" operator
    -          T_BOOK.ID + T_BOOK.AUTHOR_ID * 3 + 4,                      // Using the overloaded "+" operator
    -          T_BOOK.TITLE || " abc" || " xy"                            // Using the overloaded "||" operator
    -        )                                                            //
    -        from T_BOOK                                                  // No need to use parentheses or "." here
    -        leftOuterJoin (                                              //
    -          f select (x.ID, x.YEAR_OF_BIRTH)                           // Dereference fields from aliased table
    -          from x                                                     //
    -          limit 1                                                    //
    -          asTable x.getName()                                        //
    -        )                                                            //
    -        on T_BOOK.AUTHOR_ID === x.ID                                 // Using the overloaded "===" operator
    -        where (T_BOOK.ID <> 2)                                       // Using the olerloaded "<>" operator
    -        or (T_BOOK.TITLE in ("O Alquimista", "Brida"))               // Neat IN predicate expression
    -        fetch                                                        //
    -    ) {                                                              //
    -      println(r)                                                     //
    -    }                                                                //
    -  }                                                                  //
    -}]]></scala><html>
    -
    -							<p>
    -								For more details about jOOQ's Scala integration, please refer to the manual's section about <reference id="scala-sql-building" title="SQL building with Scala"/>.
    -							</p>
    -						</html></content>
    -					</section>
    -					
    -					<section id="dependencies">
    -						<title>Dependencies</title>
    -						<content><html>
    -							<p>
    -								jOOQ has no dependencies on any third-party libraries. This rule has some exceptions:
    -							</p>
    -							<ul>
    -								<li><reference id="logging" title="logging APIs"/> are referenced as "optional dependencies". jOOQ tries to find slf4j or log4j on the classpath. If it fails, it will use the <reference class="java.util.logging.Logger"/></li>
    -								<li>Oracle ojdbc types used for array creation are loaded using reflection.</li>
    -								<li>Small libraries with compatible licenses are incorporated into jOOQ (<a href="http://code.google.com/p/joor/">jOOR</a>, <a href="http://code.google.com/p/joou/">jOOU</a>, <a href="http://opencsv.sourceforge.net/">OpenCSV</a>, <a href="http://code.google.com/p/json-simple/">json simple</a>, <a href="http://commons.apache.org/lang/">commons-lang</a>)</li>
    -								<li>javax.persistence and javax.validation will be needed if you activate the relevant <reference id="code-generation" title="code generation flags"/></li>
    -							</ul>
    -							
    -							<h3>Build your own</h3>
    -							<p>
    -								In order to build jOOQ, please download the sources from <a href="https://github.com/jOOQ/jOOQ">https://github.com/jOOQ/jOOQ</a> and use Maven to build it, preferably in Eclipse.
    -							</p>
    -						</html></content>
    -					</section>
    -				</sections>
    -			</section>
    -
    -			<section id="sql-building">
    -				<title>SQL building</title>
    -				<content><html>
    -					<p>
    -					    SQL is a declarative language that is hard to integrate into procedural, object-oriented, functional or any other type of programming languages. jOOQ's philosophy is to give SQL the credit it deserves and integrate SQL itself as an <a href="http://en.wikipedia.org/wiki/Domain_Specific_Language">"internal domain specific language"</a> directly into Java.
    -					</p>
    -					<p>
    -						With this philosophy in mind, SQL building is the main feature of jOOQ. All other features (such as <reference id="sql-execution"/> and <reference id="code-generation"/>) are mere convenience built on top of jOOQ's SQL building capabilities.
    -					</p>
    -					<p>
    -						This section explains all about the various syntax elements involved with jOOQ's SQL building capabilities. For a complete overview of all syntax elements, please refer to the manual's section about <reference id="reference-bnf-notation"/>
    -					</p>
    -				</html></content>
    -
    -				<sections>
    -					<section id="factory">
    -						<title>The Factory class</title>
    -						<content><html>
    -							<p>
    -								jOOQ exposes a lot of interfaces and hides most implementation facts from client code. The reasons for this are:
    -							</p>
    -							<ul>
    -								<li>Interface-driven design. This allows for modelling queries in a fluent API most efficiently</li>
    -								<li>Reduction of complexity for client code.</li>
    -								<li>API guarantee. You only depend on the exposed interfaces, not concrete (potentially dialect-specific) implementations.</li>
    -							</ul>
    -							<p>
    -								The <reference class="org.jooq.impl.Factory"/> class is the main class from where you will create all jOOQ objects.	The Factory serves two types of purposes:
    -							</p>
    -							<ul>
    -								<li>It serves as a static factory for <reference id="table-expressions" title="table expressions"/>, <reference id="column-expressions" title="column expressions"/> (or "fields"), <reference id="conditional-expressions" title="conditional expressions"/> and many other <reference id="queryparts" title="QueryParts"/>.</li>
    -								<li>It implements <reference class="org.jooq.Configuration"/>, an object that configures jOOQ's behaviour when executing queries (see <reference id="sql-execution"/> for more details). Factories allow for creating <reference id="sql-statements" title="SQL statements"/> that are already "configured" and ready for execution.</li>
    -							</ul>
    -
    -							<h3>The static Factory API</h3>
    -							<p>
    -								With jOOQ 2.0, static factory methods have been introduced in order to make client code look more like SQL. Ideally, when working with jOOQ, you will simply static import all methods from the Factory class:
    -							</p>
    -							</html><java>import static org.jooq.impl.Factory.*;</java><html>
    -							<p>
    -							    Note, that when working with Eclipse, you could also add the Factory to your favourites. This will allow to access functions even more fluently:
    -							</p>
    -</html><java>concat(trim(FIRST_NAME), trim(LAST_NAME));
    -// ... which is in fact the same as:
    -Factory.concat(Factory.trim(FIRST_NAME), Factory.trim(LAST_NAME));</java><html>
    -
    -							<h3>The Factory as a Configuration object</h3>
    -							<p>
    -							    As any Configuration object, a Factory can be supplied with these objects:
    -							</p>
    -							<ul>
    -								<li><reference class="org.jooq.SQLDialect"/> : The dialect of your database. This may be any of the currently supported database types (see <reference id="sql-dialects"/> for more details)</li>
    -								<li><reference class="java.sql.Connection"/> : An optional JDBC Connection that will be re-used for the whole lifecycle of your Factory (see <reference id="connection-vs-datasource"/> for more details)</li>
    -    							<li><reference class="java.sql.DataSource"/> : An optional JDBC DataSource that will be re-used for the whole lifecycle of your Factory. If you prefer using DataSources over Connections, jOOQ will internally fetch new Connections from your DataSource, conveniently closing them again after query execution. This is particularly useful in J2EE or Spring contexts (see <reference id="connection-vs-datasource"/> for more details)</li>
    -    							<li><reference class="org.jooq.conf.Settings"/> : An optional runtime configuration (see <reference id="custom-settings"/> for more details)</li>
    -							</ul>
    -							<p>
    -								As a Configuration object, a Factory can construct <reference id="sql-statements" title="statements"/>, for later <reference id="sql-execution" title="execution"/>. An example is given here:
    -							</p>
    -</html><java><![CDATA[// The Factory is "configured" with a Connection and a SQLDialect
    -Factory create = new Factory(connection, dialect);
    -
    -// This select statement contains an internal reference to the Factory:
    -Select<?> select = create.selectOne();
    -
    -// Using the internally referenced Factory, the select statement can now be executed:
    -Result<?> result = select.fetch();]]></java></content>
    -
    -						<sections>
    -							<section id="sql-dialects">
    -								<title>SQL Dialect</title>
    -								<content><html>
    -									<p>
    -										While jOOQ tries to represent the SQL standard as much as possible, many features are vendor-specific to a given database and to its "SQL dialect". jOOQ models this using the <reference class="org.jooq.SQLDialect"/> enum type.
    -									</p>
    -									<p>
    -										The SQL dialect is one of the main attributes of a <reference id="factory" title="Factory"/>. Queries created from such factories will assume dialect-specific behaviour when <reference id="sql-rendering" title="rendering SQL"/> and <reference id="variable-binding" title="binding bind values"/>.
    -									</p>
    -									<p>
    -										Some parts of the jOOQ API are officially supported only by a given subset of the supported SQL dialects. For instance, the <reference id="connect-by-clause" title="Oracle CONNECT BY clause"/>, which is supported by the Oracle and CUBRID databases, is annotated with a <reference class="org.jooq.Support"/> annotation, as such:
    -									</p>
    -</html><java><![CDATA[/**
    - * Add an Oracle-specific <code>CONNECT BY</code> clause to the query
    - */
    -@Support({ CUBRID, ORACLE })
    -SelectConnectByConditionStep connectBy(Condition condition);]]></java><html>
    -									<p>
    -									    jOOQ API methods which are not annotated with the <reference class="org.jooq.Support"/> annotation, or which are annotated with the Support annotation, but without any SQL dialects can be safely used in all SQL dialects. An example for this is the <reference id="select-statement" title="SELECT statement"/> factory method:
    -									</p>
    -</html><java><![CDATA[/**
    - * Create a new DSL select statement.
    - */
    -@Support
    -SelectSelectStep select(Field<?>... fields);]]></java><html>
    -
    -									<h3>jOOQ's SQL clause simulation capabilities</h3>
    -									<p>
    -										The aforementioned Support annotation does not only designate, which databases natively support a feature. It also indicates that a feature is simulated by jOOQ for some databases lacking this feature. An example of this is the <reference id="distinct-predicate" title="DISTINCT predicate"/>, a predicate syntax defined by SQL:1999 and implemented only by H2, HSQLDB, and Postgres:
    -									</p>
    -
    -</html><sql><![CDATA[A IS DISTINCT FROM B]]></sql><html>
    -
    -									<p>
    -										Nevertheless, the <code>IS DISTINCT FROM</code> predicate is supported in all dialects, as its semantics can be expressed with an equivalent <reference id="case-expressions" title="CASE expression"/>. For more details, see the manual's section about the <reference id="distinct-predicate" title="DISTINCT predicate"/>.
    -									</p>
    -									
    -									<h3>jOOQ and the Oracle SQL dialect</h3>
    -									<p>
    -										Oracle SQL is much more expressive than many other SQL dialects. It features many unique keywords, clauses and functions that are out of scope for the SQL standard. Some examples for this are
    -									</p>
    -									<ul>
    -										<li>The <reference id="connect-by-clause" title="CONNECT BY clause"/>, for hierarchical queries</li>
    -										<li>The <reference id="pivot-tables" title="PIVOT"/> keyword for creating PIVOT tables</li>
    -										<li><reference id="oracle-packages" title="Packages"/>, <reference id="oracle-member-procedures" title="object-oriented user-defined types, member procedures"/> as described in the section about <reference id="stored-procedures" title="stored procedures and functions"/></li>
    -										<li>Advanced analytical functions as described in the section about <reference id="window-functions" title="window functions"/></li>
    -									</ul>
    -
    -									<p>
    -										jOOQ has a historic affinity to Oracle's SQL extensions. If something is supported in Oracle SQL, it has a high probability of making it into the jOOQ API
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="connection-vs-datasource">
    -								<title>Connection vs. DataSource</title>
    -								<content><html>
    -									<h3>Interact with JDBC Connections</h3>
    -									<p>
    -										While you can use jOOQ for <reference id="sql-building" title="SQL building"/> only, you can also run queries against a JDBC <reference class="java.sql.Connection"/>. Internally, jOOQ creates <reference class="java.sql.Statement"/> or <reference class="java.sql.PreparedStatement"/> objects from such a Connection, in order to execute statements. The normal operation mode is to provide a <reference id="factory" title="Factory"/> with a JDBC Connection, whose lifecycle you will control yourself. This means that jOOQ will not actively close connections, rollback or commit transactions.
    -									</p>
    -									<h3>Interact with JDBC DataSources</h3>
    -									<p>
    -										If you're in a J2EE or Spring context, however, you may wish to use a <reference class="javax.sql.DataSource"/> instead. Currently, Connections obtained from such a DataSource will be closed after query execution by jOOQ. The semantics of such a close operation should be the returning of the connection into a connection pool, not the actual closing of the underlying physical connection. Typically, this makes sense in an environment using distributed JTA transactions. An example of using DataSources with jOOQ can be seen in the tutorial section about <reference id="jooq-with-spring" title="using jOOQ with Spring"/>.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="custom-settings">
    -								<title>Custom Settings</title>
    -								<content><html>
    -									<p>
    -										The jOOQ Factory allows for some optional configuration elements to be used by advanced users. The <reference class="org.jooq.conf.Settings" /> class is a JAXB-annotated type, that can be provided to a Factory in several ways:
    -									</p>
    -									<ul>
    -										<li>In the constructor. This will override default settings below</li>
    -										<li>From a location specified by a JVM parameter: -Dorg.jooq.settings</li>
    -										<li>From the classpath at /jooq-settings.xml</li>
    -										<li>From the settings defaults, as specified in <a href="http://www.jooq.org/xsd/jooq-runtime-2.5.0.xsd" title="The jOOQ Runtime configuration XSD">http://www.jooq.org/xsd/jooq-runtime-2.5.0.xsd</a></li>
    -									</ul>
    -									<h3>Example</h3>
    -									<p>
    -										For example, if you want to indicate to jOOQ, that it should inline all bind variables, and execute static <reference class="java.sql.Statement"/> instead of binding its variables to <reference class="java.sql.PreparedStatement"/>, you can do so by using the following Factory:
    -									</p>
    -</html><java><![CDATA[Settings settings = new Settings();
    -settings.setStatementType(StatementType.STATIC_STATEMENT);
    -Factory create = new Factory(connection, dialect, settings);]]></java><html>
    -									<p>
    -										Subsequent sections of the manual contain some more in-depth explanations about these settings:
    -									</p>
    -									<ul>
    -										<li>
    -		     								<reference id="schema-mapping" title="Runtime schema and table mapping"/>
    -		   								</li>
    -		     							<li>
    -		     								<reference id="execute-listeners" title="Execute listeners and SQL tracing"/>
    -		     							</li>
    -		     							<li>
    -		     								<reference id="optimistic-locking" title="Execute CRUD with optimistic locking enabled"/>
    -		     							</li>
    -		     							<li>
    -		     								<reference id="logging" title="Enabling DEBUG logging of all executed SQL"/>
    -		     							</li>
    -		   							</ul>
    -		   							<p>
    -										Please refer to the jOOQ runtime configuration XSD for more details:<br/>
    -										<a href="http://www.jooq.org/xsd/jooq-runtime-2.5.0.xsd" title="The jOOQ Runtime configuration XSD">http://www.jooq.org/xsd/jooq-runtime-2.5.0.xsd</a>
    -									</p>
    -								</html></content>
    -							</section>
    -							
    -							<section id="runtime-schema-mapping">
    -								<title>Runtime schema and table mapping</title>
    -								<content><html>
    -									<h3>Mapping your DEV schema to a productive environment</h3>
    -									<p>
    -										You may wish to design your database in a way that you have several instances of your schema. This is useful when you want to cleanly separate data belonging to several customers / organisation units / branches / users and put each of those entities' data in a separate database or schema.
    -									</p>
    -									
    -									<p>
    -										In our AUTHOR example this would mean that you provide a book reference database to several companies, such as My Book World and Books R Us. In that case, you'll probably have a schema setup like this:
    -									</p>
    -									<ul>
    -										<li>DEV: Your development schema. This will be the schema that you base code generation upon, with jOOQ </li>
    -										<li>MY_BOOK_WORLD: The schema instance for My Book World </li>
    -										<li>BOOKS_R_US: The schema instance for Books R Us </li>
    -									</ul>
    -
    -									<h3>Mapping DEV to MY_BOOK_WORLD with jOOQ</h3>
    -									<p>
    -										When a user from My Book World logs in, you want them to access the MY_BOOK_WORLD schema using classes generated from DEV. This can be achieved with the <reference class="org.jooq.conf.RenderMapping"/> class, that you can equip your Factory's <reference id="custom-settings" title="settings"/> with. Take the following example:
    -									</p>
    -
    -</html><java>Settings settings = new Settings()
    -    .withRenderMapping(new RenderMapping()
    -    .withSchemata(
    -        new MappedSchema().withInput("DEV")
    -                          .withOutput("MY_BOOK_WORLD")));
    -
    -// Add the settings to the factory
    -Factory create = new Factory(connection, SQLDialect.ORACLE, settings);
    -
    -// Run queries with the "mapped" factory
    -create.selectFrom(AUTHOR).fetch();</java><html>
    -
    -									<p>
    -										The query executed with a Factory equipped with the above mapping will in fact produce this SQL statement:
    -									</p>
    -									
    -</html><sql>SELECT * FROM MY_BOOK_WORLD.AUTHOR</sql><html>
    -									<p>
    -										Even if AUTHOR was generated from DEV.
    -									</p>
    -
    -									<h3>Mapping several schemata</h3>
    -									<p>
    -										Your development database may not be restricted to hold only one DEV schema. You may also have a LOG schema and a MASTER schema. Let's say the MASTER schema is shared among all customers, but each customer has their own LOG schema instance. Then you can enhance your RenderMapping like this (e.g. using an XML configuration file):
    -									</p>
    -
    -</html><xml><![CDATA[<settings xmlns="http://www.jooq.org/xsd/jooq-runtime-2.5.0.xsd">
    -  <renderMapping>
    -    <schemata>
    -      <schema>
    -        <input>DEV</input>
    -        <output>MY_BOOK_WORLD</output>
    -      </schema>
    -      <schema>
    -        <input>LOG</input>
    -        <output>MY_BOOK_WORLD_LOG</output>
    -      </schema>
    -    </schemata>
    -  </renderMapping>
    -</settings>]]></xml><html>
    -
    -                            		<p>
    -                            			Note, you can load the above XML file like this:
    -                           			</p>
    -
    -</html><java>Settings settings = JAXB.unmarshal(new File("jooq-runtime.xml"), Settings.class);</java><html>
    -
    -									<p>
    -										This will map generated classes from DEV to MY_BOOK_WORLD, from LOG to MY_BOOK_WORLD_LOG, but leave the MASTER schema alone. Whenever you want to change your mapping configuration, you will have to create a new Factory
    -									</p>
    -
    -
    -									<h3>Using a default schema</h3>
    -									<p>
    -										Another option to switch schema names is to use a default schema for the Factory's underlying Connection. Many RDBMS support a USE or SET SCHEMA command, which you can call like this:
    -									</p>
    -
    -</html><java>// Set the default schema
    -Schema MY_BOOK_WORLD = ...
    -create.use(MY_BOOK_WORLD);
    -
    -// Run queries with factory having a default schema
    -create.selectFrom(AUTHOR).fetch();</java><html>
    -
    -									<p>
    -										Queries generated from the above Factory will produce this kind of SQL statement:
    -									</p>
    -
    -</html><sql>-- the schema name is omitted from all SQL constructs.
    -SELECT * FROM AUTHOR</sql><html>
    -
    -                            		<p>
    -                            			If you wish not to render any schema name at all, use the following Settings property for this:
    -                           			</p>
    -
    -
    -</html><java>Settings settings = new Settings()
    -    .withRenderSchema(false);
    -
    -// Add the settings to the factory
    -Factory create = new Factory(connection, SQLDialect.ORACLE, settings);
    -
    -// Run queries that omit rendering schema names
    -create.selectFrom(AUTHOR).fetch();</java><html>
    -
    -									<h3>Mapping of tables</h3>
    -									<p>
    -										Not only schemata can be mapped, but also tables. If you are not the owner of the database your application connects to, you might need to install your schema with some sort of prefix to every table. In our examples, this might mean that you will have to map DEV.AUTHOR to something MY_BOOK_WORLD.MY_APP__AUTHOR, where MY_APP__ is a prefix applied to all of your tables. This can be achieved by creating the following mapping: 
    -									</p>
    -
    -</html><java>Settings settings = new Settings()
    -    .withRenderMapping(new RenderMapping()
    -    .withSchemata(
    -        new MappedSchema().withInput("DEV")
    -                          .withOutput("MY_BOOK_WORLD")
    -                          .withTables(
    -         new MappedTable().withInput("AUTHOR")
    -                          .withOutput("MY_APP__AUTHOR"))));
    -
    -// Add the settings to the factory
    -Factory create = new Factory(connection, SQLDialect.ORACLE, settings);
    -
    -// Run queries with the "mapped" factory
    -create.selectFrom(AUTHOR).fetch();</java><html>
    -
    -									<p>
    -										The query executed with a Factory equipped with the above mapping will in fact produce this SQL statement:
    -									</p>
    -									
    -</html><sql>SELECT * FROM MY_BOOK_WORLD.MY_APP__AUTHOR</sql><html>
    -
    -		                            <p>
    -		                           		Table mapping and schema mapping can be applied independently, by specifying several MappedSchema entries in the above configuration. jOOQ will process them in order of appearance and map at first match. Note that you can always omit a MappedSchema's output value, in case of which, only the table mapping is applied. If you omit a MappedSchema's input value, the table mapping is applied to all schemata!
    -		                            </p>
    -
    -									<h3>Hard-wiring mappings at code-generation time</h3>
    -									<p>
    -										Note that the manual's section about <reference id="schema-mapping" title="code generation schema mapping"/> explains how you can hard-wire your schema mappings at code generation time
    -									</p>									
    -								</html></content>
    -							</section>
    -
    -							<section id="factory-subclasses">
    -								<title>Factory subclasses</title>
    -								<content><html>
    -									<p>
    -										There are a couple of subclasses for the general Factory. Each SQL dialect has its own dialect-specific factory. For instance, if you're only using the MySQL dialect, you can choose to create a new Factory using any of the following types:
    -									</p>
    -</html><java>// A general, dialect-unspecific factory
    -Factory create = new Factory(connection, SQLDialect.MYSQL);
    -
    -// A MySQL-specific factory
    -MySQLFactory create = new MySQLFactory(connection);</java><html>
    -									<p>
    -										The advantage of using a dialect-specific Factory lies in the fact,	that you have access to more proprietary RDMBS functionality. This may include:
    -									</p>
    -									<ul>
    -		    							<li>MySQL's encryption functions</li>
    -		    							<li>PL/SQL constructs, pgplsql, or any other dialect's ROUTINE-language (maybe in the future)</li>
    -									</ul>
    -									<p>
    -										Another type of Factory subclasses are each generated schema's factories. If you generate your schema TEST, then you will have access to a TestFactory. By default, such a schema-specific Factory will not render the schema name.
    -									</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -					<section id="sql-statements">
    -						<title>SQL Statements</title>
    -						<content><html>
    -							<p>
    -								jOOQ currently supports 6 types of SQL statements. All of these statements are constructed from a Factory instance with an optional <reference id="connection-vs-datasource" title="JDBC Connection or DataSource"/>. If supplied with a Connection or DataSource, they can be executed. Depending on the <reference id="query-vs-resultquery" title="query type"/>, executed queries can return results.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="dsl-and-non-dsl">
    -								<title>jOOQ's DSL and non-DSL API</title>
    -								<content><html>
    -									<p>
    -										jOOQ ships with its own DSL (or	<a href="http://en.wikipedia.org/wiki/Domain-specific_language" title="Domain Specific Language">Domain Specific Language</a>) that	simulates SQL in Java. This means, that you can	write SQL statements almost as if Java natively supported it, just like .NET's C# does with <a href="http://msdn.microsoft.com/en-us/library/bb425822.aspx">LINQ to SQL.</a>
    -									</p>
    -									<p>
    -										Here is an example to illustrate what that means:
    -									</p>
    -									
    -</html><code-pair><sql><![CDATA[-- Select all books by authors born after 1920,
    --- named "Paulo" from a catalogue:
    -SELECT *
    -  FROM author a
    -  JOIN book b ON a.id = b.author_id
    - WHERE a.year_of_birth > 1920
    -   AND a.first_name = 'Paulo'
    - ORDER BY b.title]]></sql><java><![CDATA[Result<Record> result =
    -create.select()
    -      .from(AUTHOR.as("a"))
    -      .join(BOOK.as("b")).on(a.ID.equal(b.AUTHOR_ID))
    -      .where(a.YEAR_OF_BIRTH.greaterThan(1920)
    -      .and(a.FIRST_NAME.equal("Paulo")))
    -      .orderBy(b.TITLE)
    -      .fetch();]]></java></code-pair><html>
    -
    -									<p>
    -										We'll see how the aliasing works later in the section about <reference id="aliased-tables" title="aliased tables"/>
    -									</p>
    -
    -									<h3>jOOQ as an internal domain specific language in Java (a.k.a. the DSL-API)</h3>
    -									<p>
    -										Many other frameworks have similar APIs with similar feature sets. Yet, what makes jOOQ special is its informal <reference id="reference-bnf-notation" title="BNF notation"/> modelling a unified SQL dialect suitable for many vendor-specific dialects, and implementing that BNF notation as a hierarchy of interfaces in Java. This concept is extremely powerful, when <reference id="jooq-in-modern-ides" title="using jOOQ in modern IDEs" /> with syntax completion. Not only can you code much faster, your SQL code will be compile-checked to a certain extent. An example of a DSL query equivalent to the previous one is given here:
    -									</p>
    -</html><java><![CDATA[Factory create = new Factory(connection, dialect);
    -Result<?> result = create.select()
    -                         .from(AUTHOR)
    -                         .join(BOOK).on(BOOK.AUTHOR_ID.equal(AUTHOR.ID))
    -                         .fetch();]]></java><html>
    -
    -                         			<p>
    -                         				Unlike other, simpler frameworks that use <a href="http://en.wikipedia.org/wiki/Fluent_interface">"fluent APIs"</a> or <a href="http://en.wikipedia.org/wiki/Method_chaining">"method chaining"</a>, jOOQ's BNF-based interface hierarchy will not allow bad query syntax. The following will not compile, for instance:
    -                         			</p>
    -</html><java><![CDATA[Factory create = new Factory(connection, dialect);
    -Result<?> result = create.select()
    -                         .join(BOOK).on(BOOK.AUTHOR_ID.equal(AUTHOR.ID))
    -                      //  ^^^^ "join" is not possible here
    -                         .from(AUTHOR)
    -                         .fetch();
    -
    -Result<?> result = create.select()
    -                         .from(AUTHOR)
    -                         .join(BOOK)
    -                         .fetch();
    -                      //  ^^^^^ "on" is missing here
    -
    -Result<?> result = create.select(rowNumber())
    -                      //         ^^^^^^^^^ "over()" is missing here
    -                         .from(AUTHOR)
    -                         .fetch();]]></java><html>
    -
    -									<h3>History of SQL building and incremental query building (a.k.a. the non-DSL API)</h3>
    -									<p>
    -										Historically, jOOQ started out as an object-oriented SQL builder library like any other. This meant that all queries and their syntactic components were modeled as so-called <reference id="queryparts" title="QueryParts"/>, which delegate <reference id="sql-rendering" title="SQL rendering"/> and <reference id="variable-binding" title="variable binding"/> to child components. This part of the API will be referred to as the non-DSL API, which is still maintained and used internally by jOOQ for incremental query building. An example of incremental query building is given here:
    -									</p>
    -</html><java><![CDATA[Factory create = new Factory(connection, dialect);
    -SelectQuery query = create.selectQuery();
    -query.addFrom(AUTHOR);
    -
    -// Join books only under certain circumstances
    -if (join) {
    -    query.addJoin(BOOK, BOOK.AUTHOR_ID.equal(AUTHOR.ID));
    -}
    -
    -Result<?> result = query.fetch();]]></java><html>
    -
    -									<p>
    -										This query is equivalent to the one shown before using the DSL syntax. In fact, internally, the DSL API constructs precisely this QueryObject. Note, that you can always access the SelectQuery object to switch between DSL and non-DSL APIs:
    -									</p>
    -
    -</html><java><![CDATA[Factory create = new Factory(connection, dialect);
    -SelectFinalStep select = create.select().from(AUTHOR);
    -
    -// Add the JOIN clause on the internal QueryObject representation
    -SelectQuery query = select.getQuery();
    -query.addJoin(BOOK, BOOK.AUTHOR_ID.equal(AUTHOR.ID));]]></java><html>
    -
    -									<h3>Mutability</h3>
    -									<p>
    -										Note, that for historic reasons, the DSL API mixes mutable and immutable behaviour with respect to the internal representation of the <reference id="queryparts" title="QueryPart"/> being constructed. While creating <reference id="conditional-expressions" title="conditional expressions"/>, <reference id="column-expressions" title="column expressions"/> (such as functions) assumes immutable behaviour, creating <reference id="sql-statements" title="SQL statements"/> does not. In other words, the following can be said:
    -									</p>
    -									
    -</html><java><![CDATA[// Conditional expressions (immutable)
    -// -----------------------------------
    -Condition a = BOOK.TITLE.equal("1984");
    -Condition b = BOOK.TITLE.equal("Animal Farm");
    -
    -// The following can be said
    -a       != a.or(b); // or() does not modify a
    -a.or(b) != a.or(b); // or() always creates new objects
    -
    -// Statements (mutable)
    -// --------------------
    -SelectFromStep s1 = create.select();
    -SelectJoinStep s2 = s1.from(BOOK);
    -SelectJoinStep s3 = s1.from(AUTHOR);
    -
    -// The following can be said
    -s1 == s2; // The internal object is always the same
    -s2 == s3; // The internal object is always the same]]></java><html>
    -
    -									<p>
    -										Mutability may be removed in a future version of jOOQ.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="select-statement">
    -								<title>The SELECT statement</title>
    -								<content><html>
    -									<p>
    -										When you don't just perform <reference id="crud-with-updatablerecords" title="CRUD"/> (i.e. SELECT * FROM your_table WHERE ID = ?), you're usually generating new record types using custom projections. With jOOQ, this is as intuitive, as if using SQL directly. A more or less complete example of the "standard" SQL syntax, plus some extensions, is provided by a query like this:
    -									</p>
    -</html><code-pair>
    -<sql><![CDATA[-- get all authors' first and last names, and the number
    --- of books they've written in German, if they have written
    --- more than five books in German in the last three years
    --- (from 2011), and sort those authors by last names
    --- limiting results to the second and third row, locking
    --- the rows for a subsequent update... whew!
    -
    -  SELECT AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME, COUNT(*)
    -    FROM AUTHOR
    -    JOIN BOOK ON AUTHOR.ID = BOOK.AUTHOR_ID
    -   WHERE BOOK.LANGUAGE = 'DE'
    -     AND BOOK.PUBLISHED > '2008-01-01'
    -GROUP BY AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME
    -  HAVING COUNT(*) > 5
    -ORDER BY AUTHOR.LAST_NAME ASC NULLS FIRST
    -   LIMIT 2
    -  OFFSET 1
    -     FOR UPDATE]]></sql><java><![CDATA[// And with jOOQ...
    -
    -
    -
    -
    -Factory create = new Factory(connection, dialect);
    -
    -create.select(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME, count())
    -      .from(AUTHOR)
    -      .join(BOOK).on(BOOK.AUTHOR_ID.equal(AUTHOR.ID))
    -      .where(BOOK.LANGUAGE.equal("DE"))
    -      .and(BOOK.PUBLISHED.greaterThan("2008-01-01"))
    -      .groupBy(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -      .having(count().greaterThan(5))
    -      .orderBy(AUTHOR.LAST_NAME.asc().nullsFirst())
    -      .limit(1)
    -      .offset(2)
    -      .forUpdate();]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										Details about the various clauses of this query will be provided in subsequent sections
    -									</p>
    -
    -									<h3>SELECT from single physical tables</h3>
    -									<p>
    -										A very similar, but limited API is available, if you want to select from single physical tables in order to retrieve <reference id="crud-with-updatablerecords" title="TableRecords or even UpdatableRecords"/>. The decision, which type of select to create is already made at the very first step, when you create the SELECT statement with the Factory:
    -									</p>
    -
    -</html><java><![CDATA[public <R extends Record> SimpleSelectWhereStep<R> selectFrom(Table<R> table);]]></java><html>
    -									<p>
    -										As you can see, there is no way to further restrict/project the selected fields. This just selects all known TableFields in the supplied Table, and it also binds &lt;R extends Record&gt; to your Table's associated Record. An example of such a Query would then be:
    -									</p>
    -</html><java><![CDATA[BookRecord book = create.selectFrom(BOOK)
    -                        .where(BOOK.LANGUAGE.equal("DE"))
    -                        .orderBy(BOOK.TITLE)
    -                        .fetchAny();]]></java><html>
    -
    -                   					<p>
    -                   						The simple SELECT API is limited in the way that it does not support any of these clauses:
    -                   					</p>
    -                   					<ul>
    -                   						<li><reference id="select-clause"/></li>
    -                   						<li><reference id="join-clause"/></li>
    -                   						<li><reference id="group-by-clause"/></li>
    -                   						<li><reference id="having-clause"/></li>
    -                   					</ul>
    -                   					<p>
    -                   						In most parts of this manual, it is assumed that you do not use the simple SELECT API. For more information about the simple SELECT API, see the manual's section about <reference id="record-vs-tablerecord" title="fetching strongly or weakly typed records"/>.
    -                   					</p>
    -								</html></content>
    -
    -								<sections>
    -									<section id="select-clause">
    -										<title>The SELECT clause</title>
    -										<content><html>
    -											<p>
    -												The SELECT clause lets you project your own record types, referencing table fields, functions, arithmetic expressions, etc. The Factory provides several methods for expressing a SELECT clause:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[-- The SELECT clause
    -SELECT BOOK.ID, BOOK.TITLE
    -SELECT BOOK.ID, TRIM(BOOK.TITLE)
    -]]></sql><java><![CDATA[// Provide a varargs Fields list to the SELECT clause:
    -Select<?> s1 = create.select(BOOK.ID, BOOK.TITLE);
    -Select<?> s2 = create.select(BOOK.ID, trim(BOOK.TITLE));]]></java>
    -</code-pair><html>
    -
    -											<p>
    -												Some commonly used projections can be easily created using convenience methods:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[-- Simple SELECTs
    -SELECT COUNT(*)
    -SELECT 0 -- Not a bind variable
    -SELECT 1 -- Not a bind variable
    -]]></sql><java><![CDATA[// Select commonly used values
    -Select<?> select1 = create.selectCount();
    -Select<?> select2 = create.selectZero();
    -Select<?> select2 = create.selectOne();]]></java>
    -</code-pair><html>
    -
    -											<p>
    -												See more details about functions and expressions in the manual's section about <reference id="column-expressions"/>
    -											</p>
    -
    -											<h3>The SELECT DISTINCT clause</h3>
    -											<p>
    -												The DISTINCT keyword can be included in the method name, constructing a SELECT clause
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT DISTINCT BOOK.TITLE]]></sql><java><![CDATA[Select<?> select1 = create.selectDistinct(BOOK.TITLE);]]></java>
    -</code-pair><html>
    -										</html></content>
    -									</section>
    -
    -									<section id="from-clause">
    -										<title>The FROM clause</title>
    -										<content><html>
    -											<p>
    -												The SQL FROM clause allows for specifying any number of <reference id="table-expressions" title="table expressions"/> to select data from. The following are examples of how to form normal FROM clauses:
    -											</p>
    -
    -</html><code-pair>
    -	<sql><![CDATA[SELECT 1 FROM BOOK
    -SELECT 1 FROM BOOK, AUTHOR
    -SELECT 1 FROM BOOK "b", AUTHOR "a"]]></sql><java><![CDATA[create.selectOne().from(BOOK);
    -create.selectOne().from(BOOK, AUTHOR);
    -create.selectOne().from(BOOK.as("b"), AUTHOR.as("a"));]]></java>
    -</code-pair><html>
    -
    -											<p>
    -												Read more about aliasing in the manual's section about <reference id="aliased-tables" title="aliased tables"/>.
    -											</p>
    -											
    -											<h3>More advanced table expressions</h3>
    -											<p>
    -												Apart from simple tables, you can pass any arbitrary <reference id="table-expressions" title="table expression"/> to the jOOQ FROM clause. This may include <reference id="array-and-cursor-unnesting" title="unnested cursors"/> in Oracle:
    -											</p>
    -
    -</html><code-pair>
    -	<sql><![CDATA[SELECT *
    -FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(null, null, 'ALLSTATS'));]]></sql><java><![CDATA[create.select()
    -      .from(table(DbmsXplan.displayCursor(null, null, "ALLSTATS"));]]></java>
    -</code-pair><html>
    -
    -											<p>
    -												Note, in order to access the DbmsXplan package, you can use the <reference id="code-generation" title="code generator"/> to generate Oracle's SYS schema.
    -											</p>
    -
    -
    -											<h3>Selecting FROM DUAL with jOOQ</h3>
    -											<p>
    -												In many SQL dialects, FROM is a mandatory clause, in some it isn't. jOOQ allows you to omit the FROM clause, returning just one record. An example:
    -											</p>
    -
    -</html><code-pair>
    -	<sql><![CDATA[SELECT 1 FROM DUAL
    -SELECT 1]]></sql><java><![CDATA[new Factory(SQLDialect.ORACLE).selectOne().getSQL();
    -new Factory(SQLDialect.POSTGRES).selectOne().getSQL();]]></java>
    -</code-pair><html>
    -
    -											<p>
    -												Read more about dual or dummy tables in the manual's section about <reference id="dual" title="the DUAL table"/>. The following are examples of how to form normal FROM clauses:
    -											</p>
    -										</html></content>
    -									</section>
    -
    -									<section id="join-clause">
    -										<title>The JOIN clause</title>
    -										<content><html>
    -											<p>
    -												jOOQ supports many different types of standard SQL JOIN operations:
    -											</p>
    -											<ul>
    -												<li>[ INNER ] JOIN</li>
    -												<li>LEFT [ OUTER ] JOIN</li>
    -												<li>RIGHT [ OUTER ] JOIN</li>
    -												<li>FULL OUTER JOIN</li>
    -												<li>CROSS JOIN</li>
    -												<li>NATURAL JOIN</li>
    -												<li>NATURAL LEFT [ OUTER ] JOIN</li>
    -												<li>NATURAL RIGHT [ OUTER ] JOIN</li>
    -											</ul>
    -
    -											<p>
    -												All of these JOIN methods can be called on <reference class="org.jooq.Table"/> types, or directly after the FROM clause for convenience. The following example joins AUTHOR and BOOK
    -											</p>
    -
    -</html><java><![CDATA[Factory create = new Factory(connection, dialect);
    -
    -// Call "join" directly on the AUTHOR table
    -Result<?> result = create.select()
    -                         .from(AUTHOR.join(BOOK)
    -                                     .on(BOOK.AUTHOR_ID.equal(AUTHOR.ID)))
    -                         .fetch();
    -
    -// Call "join" on the type returned by "from"
    -Result<?> result = create.select()
    -                         .from(AUTHOR)
    -                         .join(BOOK)
    -                         .on(BOOK.AUTHOR_ID.equal(AUTHOR.ID))
    -                         .fetch();]]></java><html>
    -
    -											<p>
    -												The two syntaxes will produce the same SQL statement. However, calling "join" on <reference class="org.jooq.Table"/> objects allows for more powerful, nested JOIN expressions (if you can handle the parentheses):
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT *
    -FROM AUTHOR
    -LEFT OUTER JOIN (
    -  BOOK JOIN BOOK_TO_BOOK_STORE
    -       ON BOOK_TO_BOOK_STORE.BOOK_ID = BOOK.ID
    -)
    -ON BOOK.AUTHOR_ID = AUTHOR.ID]]></sql><java><![CDATA[// Nest joins and provide JOIN conditions only at the end
    -create.select()
    -      .from(AUTHOR
    -      .leftOuterJoin(BOOK
    -        .join(BOOK_TO_BOOK_STORE)
    -        .on(BOOK_TO_BOOK_STORE.BOOK_ID.equal(BOOK.ID)))
    -      .on(BOOK.AUTHOR_ID.equal(AUTHOR.ID)));]]></java></code-pair><html>
    -
    -      										<ul>
    -      											<li>See the section about <reference id="conditional-expressions" title="conditional expressions"/> to learn more about the many ways to create <reference class="org.jooq.Condition"/> objects in jOOQ.</li>
    -      											<li>See the section about <reference id="table-expressions" title="table expressions"/> to learn about the various ways of referencing <reference class="org.jooq.Table"/> objects in jOOQ</li>
    -      										</ul>
    -
    -											<h3>JOIN ON KEY, convenience provided by jOOQ</h3>
    -											<p>
    -												Surprisingly, SQL does not allow to formally JOIN on well-known foreign key relationship information. Naturally, when you join BOOK to AUTHOR, you will want to do that based on the BOOK.AUTHOR_ID foreign key to AUTHOR.ID primary key relation. Not being able to do this in SQL leads to a lot of repetitive code, re-writing the same JOIN predicate again and again - especially, when your foreign keys contain more than one column. With jOOQ, when you use <reference id="code-generation" title="code generation"/>, you can use foreign key constraint information in JOIN expressions as such:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT *
    -FROM AUTHOR
    -JOIN BOOK ON BOOK.AUTHOR_ID = AUTHOR.ID]]></sql><java><![CDATA[create.select()
    -      .from(AUTHOR)
    -      .join(BOOK).onKey();]]></java></code-pair><html>
    -
    -      										<p>
    -      											In case of ambiguity, you can also supply field references for your foreign keys, or the generated foreign key reference to the onKey() method.
    -      										</p>
    -
    -											<h3>The JOIN USING syntax</h3>
    -											<p>
    -												Most often, you will provide jOOQ with JOIN conditions in the JOIN .. ON clause. SQL supports a different means of specifying how two tables are to be joined. This is the JOIN .. USING clause. Instead of a condition, you supply a set of fields whose names are common to both tables to the left and right of a JOIN operation. This can be useful when your database schema has a high degree of <a href="http://en.wikipedia.org/wiki/Database_normalization">relational normalisation</a>. An example:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[-- Assuming that both tables contain AUTHOR_ID columns
    -SELECT *
    -FROM AUTHOR
    -JOIN BOOK USING (AUTHOR_ID)]]></sql><java><![CDATA[// join(...).using(...)
    -create.select()
    -      .from(AUTHOR)
    -      .join(BOOK).using(AUTHOR.AUTHOR_ID);]]></java></code-pair><html>
    -
    -											<p>
    -												In schemas with high degrees of normalisation, you may also choose to use NATURAL JOIN, which takes no JOIN arguments as it joins using all fields that are common to the table expressions to the left and to the right of the JOIN operator. An example:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[-- Assuming that both tables contain AUTHOR_ID columns
    -SELECT *
    -FROM AUTHOR
    -NATURAL JOIN BOOK]]></sql><java><![CDATA[// naturalJoin(...)
    -create.select()
    -      .from(AUTHOR)
    -      .naturalJoin(BOOK);]]></java></code-pair><html>
    -
    -											<h3>Oracle's partitioned OUTER JOIN</h3>
    -											<p>
    -												Oracle SQL ships with a special syntax available for OUTER JOIN clauses. According to the <a href="http://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_10002.htm#i2196190">Oracle documentation about partitioned outer joins</a> this can be used to fill gaps for simplified analytical calculations. jOOQ only supports putting the PARTITION BY clause to the right of the OUTER JOIN clause. The following example will create at least one record per AUTHOR and per existing value in BOOK.PUBLISHED_IN, regardless if an AUTHOR has actually published a book in that year.
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT *
    -FROM AUTHOR
    -LEFT OUTER JOIN BOOK
    -PARTITION BY (PUBLISHED_IN)
    -ON BOOK.AUTHOR_ID = AUTHOR.ID]]></sql><java><![CDATA[create.select()
    -      .from(AUTHOR)
    -      .leftOuterJoin(BOOK)
    -      .partitionBy(BOOK.PUBLISHED_IN)
    -      .on(BOOK.AUTHOR_ID.equal(AUTHOR.ID));]]></java></code-pair><html>
    -
    -										</html></content>
    -									</section>
    -
    -									<section id="where-clause">
    -										<title>The WHERE clause</title>
    -										<content><html>
    -											<p>
    -												The WHERE clause can be used for JOIN or filter predicates, in order to restrict the data returned by the <reference id="table-expressions" title="table expressions"/> supplied to the previously specified <reference id="from-clause" title="from clause"/> and <reference id="join-clause" title="join clause"/>. Here is an example:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT *
    -FROM BOOK
    -WHERE AUTHOR_ID = 1
    -AND TITLE = '1984']]></sql><java><![CDATA[create.select()
    -      .from(BOOK)
    -      .where(BOOK.AUTHOR_ID.equal(1))
    -      .and(BOOK.TITLE.equal("1984"));]]></java></code-pair><html>
    -
    -											<p>
    -												The above syntax is convenience provided by jOOQ, allowing you to connect the <reference class="org.jooq.Condition"/> supplied in the WHERE clause with another condition using an AND operator. You can of course also create a more complex condition and supply that to the WHERE clause directly (observe the different placing of parentheses). The results will be the same:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT *
    -FROM BOOK
    -WHERE AUTHOR_ID = 1
    -AND TITLE = '1984']]></sql><java><![CDATA[create.select()
    -      .from(BOOK)
    -      .where(BOOK.AUTHOR_ID.equal(1).and(
    -             BOOK.TITLE.equal("1984")));]]></java></code-pair><html>
    -
    -											<p>
    -												You will find more information about creating <reference id="conditional-expressions" title="conditional expressions"/> later in the manual.
    -											</p>
    -										</html></content>
    -									</section>
    -
    -									<section id="connect-by-clause">
    -										<title>The CONNECT BY clause</title>
    -										<content><html>
    -											<p>
    -												The Oracle database knows a very succinct syntax for creating hierarchical queries: the CONNECT BY clause, which is fully supported by jOOQ, including all related functions and pseudo-columns. A more or less formal definition of this clause is given here:
    -											</p>
    -</html><sql>--   SELECT ..
    ---     FROM ..
    ---    WHERE ..
    - CONNECT BY [ NOCYCLE ] condition [ AND condition, ... ] [ START WITH condition ]
    --- GROUP BY ..
    --- ORDER [ SIBLINGS ] BY ..</sql><html>
    -
    -											<p>
    -												An example for an iterative query, iterating through values between 1 and 5 is this:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT LEVEL
    -FROM DUAL
    -CONNECT BY LEVEL <= 5]]></sql><java><![CDATA[// Get a table with elements 1, 2, 3, 4, 5
    -create.select(level())
    -      .connectBy(level().lessOrEqual(5));]]></java></code-pair><html>
    -
    -											<p>
    -												Here's a more complex example where you can recursively fetch directories in your database, and concatenate them to a path:
    -											</p>
    -</html><code-pair>
    -<sql><![CDATA[SELECT 
    -  SUBSTR(SYS_CONNECT_BY_PATH(DIRECTORY.NAME, '/'), 2)
    -FROM DIRECTORY
    -CONNECT BY 
    -  PRIOR DIRECTORY.ID = DIRECTORY.PARENT_ID
    -START WITH DIRECTORY.PARENT_ID IS NULL
    -ORDER BY 1]]></sql><java><![CDATA[.select(
    -   sysConnectByPath(DIRECTORY.NAME, "/").substring(2))
    -.from(DIRECTORY)
    -.connectBy(
    -   prior(DIRECTORY.ID).equal(DIRECTORY.PARENT_ID))
    -.startWith(DIRECTORY.PARENT_ID.isNull())
    -.orderBy(1);]]></java>
    -</code-pair><html>
    -
    -    										<p>
    -    											The output might then look like this
    -   											</p>
    -
    -</html><text>+------------------------------------------------+
    -|substring                                       |
    -+------------------------------------------------+
    -|C:                                              |
    -|C:/eclipse                                      |
    -|C:/eclipse/configuration                        |
    -|C:/eclipse/dropins                              |
    -|C:/eclipse/eclipse.exe                          |
    -+------------------------------------------------+
    -|...21 record(s) truncated...
    -</text><html>
    -
    -											<p>
    -												Some of the supported functions and pseudo-columns are these (available from the <reference id="factory" title="Factory"/>):
    -											</p>
    -
    -											<ul>
    -												<li>LEVEL</li>
    -												<li>CONNECT_BY_IS_CYCLE</li>
    -												<li>CONNECT_BY_IS_LEAF</li>
    -												<li>CONNECT_BY_ROOT</li>
    -												<li>SYS_CONNECT_BY_PATH</li>
    -												<li>PRIOR</li>
    -											</ul>
    -
    -											<p>
    -												Note that this syntax is also supported in the CUBRID database.
    -											</p>
    -											
    -											<h3>ORDER SIBLINGS</h3>
    -											<p>
    -												The Oracle database allows for specifying a SIBLINGS keyword in the <reference id="order-by-clause" title="ORDER BY clause"/>. Instead of ordering the overall result, this will only order siblings among each other, keeping the hierarchy intact. An example is given here:
    -											</p>
    -											
    -</html><code-pair>
    -<sql><![CDATA[SELECT DIRECTORY.NAME
    -FROM DIRECTORY
    -CONNECT BY 
    -  PRIOR DIRECTORY.ID = DIRECTORY.PARENT_ID
    -START WITH DIRECTORY.PARENT_ID IS NULL
    -ORDER SIBLINGS BY 1]]></sql><java><![CDATA[.select(DIRECTORY.NAME)
    -.from(DIRECTORY)
    -.connectBy(
    -   prior(DIRECTORY.ID).equal(DIRECTORY.PARENT_ID))
    -.startWith(DIRECTORY.PARENT_ID.isNull())
    -.orderSiblingsBy(1);]]></java>
    -</code-pair><html>
    -											
    -										</html></content>
    -									</section>
    -
    -									<section id="group-by-clause">
    -										<title>The GROUP BY clause</title>
    -										<content><html>
    -											<p>
    -												GROUP BY can be used to create unique groups of data, to form aggregations, to remove duplicates and for other reasons. It will transform your previously defined <reference id="table-expressions" title="set of table expressions"/>, and return only one record per unique group as specified in this clause. For instance, you can group books by BOOK.AUTHOR_ID:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT AUTHOR_ID, COUNT(*)
    -FROM BOOK
    -GROUP BY AUTHOR_ID]]></sql><java><![CDATA[create.select(BOOK.AUTHOR_ID, count())
    -      .from(BOOK)
    -      .groupBy(AUTHOR_ID);]]></java></code-pair><html>
    -
    -											<p>
    -												As defined in the SQL standard, when grouping, you may no longer project any columns that are not a formal part of the GROUP BY clause, or <reference id="aggregate-functions" title="aggregate functions"/>. The above example counts all books per author
    -											</p>
    -
    -											<h3>MySQL's deviation from the SQL standard</h3>
    -											<p>
    -												MySQL has a peculiar way of not adhering to this standard behaviour. This is documented in the <a href="http://dev.mysql.com/doc/refman/5.6/en/group-by-hidden-columns.html">MySQL manual</a>. In short, with MySQL, you can also project any other field that are not part of the GROUP BY clause. The projected values will just be arbitrary values from within the group. You cannot rely on any ordering. For example:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT AUTHOR_ID, TITLE
    -FROM BOOK
    -GROUP BY AUTHOR_ID]]></sql><java><![CDATA[create.select(BOOK.AUTHOR_ID, BOOK.TITLE)
    -      .from(BOOK)
    -      .groupBy(AUTHOR_ID);]]></java></code-pair><html>
    -
    -											<p>
    -												This will return an arbitrary title per author. jOOQ supports this syntax, as jOOQ is not doing any checks internally, about the consistence of tables/fields/functions that you provide it.
    -											</p>
    -
    -											<h3>Empty GROUP BY clauses</h3>
    -											<p>
    -												jOOQ supports empty <code>GROUP BY ()</code> clauses as well. This will result in <reference id="select-statement" title="SELECT statements"/> that return only one record.
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT COUNT(*)
    -FROM BOOK
    -GROUP BY ()]]></sql><java><![CDATA[create.selectCount()
    -      .from(BOOK)
    -      .groupBy();]]></java></code-pair><html>
    -
    -											
    -											<h3>ROLLUP(), CUBE() and GROUPING SETS()</h3>
    -											<p>
    -												Some databases support the SQL standard grouping functions and some extensions thereof. See the manual's section about <reference id="grouping-functions" title="grouping functions"/> for more details.
    -											</p>
    -										</html></content>
    -									</section>
    -
    -									<section id="having-clause">
    -										<title>The HAVING clause</title>
    -										<content><html>
    -											<p>
    -												The HAVING clause is commonly used to further restrict data resulting from a previously issued <reference id="group-by-clause" title="GROUP BY clause"/>. An example, selecting only those authors that have written at least two books:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT AUTHOR_ID, COUNT(*)
    -FROM BOOK
    -GROUP BY AUTHOR_ID
    -HAVING COUNT(*) >= 2]]></sql><java><![CDATA[create.select(BOOK.AUTHOR_ID, count(*))
    -      .from(BOOK)
    -      .groupBy(AUTHOR_ID)
    -      .having(count().greaterOrEqual(2));]]></java></code-pair><html>
    -
    -											<p>
    -												According to the SQL standard, you may omit the GROUP BY clause and still issue a HAVING clause. This will implicitly GROUP BY (). jOOQ also supports this syntax. The following example selects one record, only if there are at least 4 books in the books table:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT COUNT(*)
    -FROM BOOK
    -HAVING COUNT(*) >= 4]]></sql><java><![CDATA[create.select(count(*))
    -      .from(BOOK)
    -      .having(count().greaterOrEqual(4));]]></java></code-pair><html>
    -
    -										</html></content>
    -									</section>
    -
    -									<section id="order-by-clause">
    -										<title>The ORDER BY clause</title>
    -										<content><html>
    -											<p>
    -												Databases are allowed to return data in any arbitrary order, unless you explicitly declare that order in the ORDER BY clause. In jOOQ, this is straight-forward:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT AUTHOR_ID, TITLE
    -FROM BOOK
    -ORDER BY AUTHOR_ID ASC, TITLE DESC]]></sql><java><![CDATA[create.select(BOOK.AUTHOR_ID, BOOK.TITLE)
    -      .from(BOOK)
    -      .orderBy(BOOK.AUTHOR_ID.asc(), BOOK.TITLE.desc());]]></java></code-pair><html>
    -
    -											<p>
    -												Any jOOQ <reference id="column-expressions" title="column expression (or field)"/> can be transformed into an <reference class="org.jooq.SortField"/> by calling the asc() and desc() methods.
    -											</p>
    -
    -											<h3>Ordering by field index</h3>
    -											<p>
    -												The SQL standard allows for specifying integer literals (<reference id="inlined-parameters" title="literals"/>, not <reference id="bind-values" title="bind values"/>!) to reference column indexes from the projection (<reference id="select-clause" title="SELECT clause"/>). This may be useful if you do not want to repeat a lengthy expression, by which you want to order - although most databases also allow for referencing <reference id="aliased-columns" title="aliased column references"/> in the ORDER BY clause. An example of this is given here:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT AUTHOR_ID, TITLE
    -FROM BOOK
    -ORDER BY 1 ASC, 2 DESC]]></sql><java><![CDATA[create.select(BOOK.AUTHOR_ID, BOOK.TITLE)
    -      .from(BOOK)
    -      .orderBy(one().asc(), inline(2).desc());]]></java></code-pair><html>
    -
    -											<p>
    -												Note, how one() is used as a convenience short-cut for inline(1)
    -											</p>
    -
    -											<h3>Ordering and NULLS</h3>
    -											<p>
    -												A few databases support the SQL standard "null ordering" clause in sort specification lists, to define whether NULL values should come first or last in an ordered result.
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT 
    -  BOOK.AUTHOR_ID, 
    -  BOOK.CO_AUTHOR_ID, 
    -  BOOK.TITLE
    -FROM BOOK
    -ORDER BY AUTHOR_ID ASC,
    -         CO_AUTHOR_ID ASC NULLS LAST]]></sql><java><![CDATA[create.select(
    -         BOOK.AUTHOR_ID, 
    -         BOOK.CO_AUTHOR_ID, 
    -         BOOK.TITLE)
    -      .from(BOOK)
    -      .orderBy(BOOK.AUTHOR_ID.asc(),
    -               BOOK.CO_AUTHOR_ID.asc().nullsLast());]]></java></code-pair><html>
    -
    -											<p>
    -												If your database doesn't support this syntax, jOOQ simulates it using a <reference id="case-expressions" title="CASE expression"/> as follows
    -											</p>
    -</html><code-pair>
    -<sql><![CDATA[SELECT 
    -  BOOK.AUTHOR_ID, BOOK.CO_AUTHOR_ID, BOOK.TITLE
    -FROM BOOK
    -ORDER BY AUTHOR_ID ASC,
    -         CASE WHEN CO_AUTHOR_ID IS NULL 
    -              THEN 1 ELSE 0 END ASC,
    -         CO_AUTHOR_ID ASC]]></sql><java><![CDATA[create.select(
    -         BOOK.AUTHOR_ID, 
    -         BOOK.CO_AUTHOR_ID,
    -         BOOK.TITLE)
    -      .from(BOOK)
    -      .orderBy(BOOK.AUTHOR_ID.asc(),
    -               BOOK.CO_AUTHOR_ID.asc().nullsLast());]]></java></code-pair><html>
    -
    -											<h3>Ordering using CASE expressions</h3>
    -											<p>
    -												Using <reference id="case-expressions" title="CASE expressions"/> in SQL ORDER BY clauses is a common pattern, if you want to introduce some sort indirection / sort mapping into your queries. As with SQL, you can add any type of <reference id="column-expressions" title="column expression"/> into your ORDER BY clause. For instance, if you have two favourite books that you always want to appear on top, you could write:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT *
    -FROM BOOK
    -ORDER BY CASE TITLE
    -         WHEN '1984' THEN 0
    -         WHEN 'Animal Farm' THEN 1
    -         ELSE 2 END ASC]]></sql><java><![CDATA[create.select()
    -      .from(BOOK)
    -      .orderBy(decode().value(BOOK.TITLE)
    -                       .when("1984", 0)
    -                       .when("Animal Farm", 1)
    -                       .otherwise(2).asc());]]></java></code-pair><html>
    -
    -											<p>
    -												But writing these things can become quite verbose. jOOQ supports a convenient syntax for specifying sort mappings. The same query can be written in jOOQ as such:
    -											</p>
    -
    -</html><java><![CDATA[create.select()
    -      .from(BOOK)
    -      .orderBy(BOOK.TITLE.sortAsc("1984", "Animal Farm"));]]></java><html>
    -
    -											<p>
    -												More complex sort indirections can be provided using a Map:
    -											</p>
    -
    -</html><java><![CDATA[create.select()
    -      .from(BOOK)
    -      .orderBy(BOOK.TITLE.sort(new HashMap<String, Integer>() {{
    -          put("1984", 1);
    -          put("Animal Farm", 13);
    -          put("The jOOQ book", 10);
    -      }}));]]></java><html>
    -
    -      										<p>
    -      											Of course, you can combine this feature with the previously discussed NULLS FIRST / NULLS LAST feature. So, if in fact these two books are the ones you like least, you can put all NULLS FIRST (all the other books):
    -      										</p>
    -
    -</html><java><![CDATA[create.select()
    -      .from(BOOK)
    -      .orderBy(BOOK.TITLE.sortAsc("1984", "Animal Farm").nullsFirst());]]></java><html>
    -
    -											<h3>jOOQ's understanding of SELECT .. ORDER BY</h3>
    -											<p>
    -												The SQL standard defines that a "query expression" can be ordered, and that query expressions can contain <reference id="union-clause" title="UNION, INTERSECT and EXCEPT clauses"/>, whose subqueries cannot be ordered. While this is defined as such in the SQL standard, many databases allowing for the non-standard <reference id="limit-clause" title="LIMIT clause"/> in one way or another, do not adhere to this part of the SQL standard. Hence, jOOQ allows for ordering all SELECT statements, regardless whether they are constructed as a part of a UNION or not. Corner-cases are handled internally by jOOQ, by introducing synthetic subselects to adhere to the correct syntax, where this is needed.
    -											</p>
    -											
    -											
    -											<h3>Oracle's ORDER SIBLINGS BY clause</h3>
    -											<p>
    -												jOOQ also supports Oracle's SIBLINGS keyword to be used with ORDER BY clauses for <reference id="connect-by-clause" title="hierarchical queries using CONNECT BY"/>
    -											</p>
    -										</html></content>
    -									</section>
    -
    -									<section id="limit-clause">
    -										<title>The LIMIT .. OFFSET clause</title>
    -										<content><html>
    -											<p>
    -												While being extremely useful for every application that does paging, or just to limit result sets to reasonable sizes, this clause is not yet part of any SQL standard (up until SQL:2008). Hence, there exist a variety of possible implementations in various SQL dialects, concerning this limit clause. jOOQ chose to implement the LIMIT .. OFFSET clause as understood and supported by MySQL, H2, HSQLDB, Postgres, and SQLite. Here is an example of how to apply limits with jOOQ:
    -											</p>
    -
    -</html><java><![CDATA[create.select().from(BOOK).limit(1).offset(2);]]></java><html>
    -
    -											<p>
    -												This will limit the result to 1 books starting with the 2nd book (starting at offset 0!). limit() is supported in all dialects, offset() in all but Sybase ASE, which has no reasonable means to simulate it. This is how jOOQ simulates the above query in various SQL dialects:
    -											</p>
    -
    -</html><sql><![CDATA[-- MySQL, H2, HSQLDB, Postgres, and SQLite
    -SELECT * FROM BOOK LIMIT 1 OFFSET 2
    -
    --- CUBRID supports a MySQL variant of the LIMIT .. OFFSET clause
    -SELECT * FROM BOOK LIMIT 2, 1
    -
    --- Derby
    -SELECT * FROM BOOK OFFSET 2 ROWS FETCH NEXT 1 ROWS ONLY
    -
    --- Ingres
    -SELECT * FROM BOOK OFFSET 2 FETCH FIRST 1 ROWS ONLY
    -
    --- Firebird
    -SELECT * FROM BOOK ROWS 2 TO 3
    -
    --- Sybase SQL Anywhere
    -SELECT TOP 1 ROWS START AT 3 * FROM BOOK
    -
    --- DB2 (without OFFSET)
    -SELECT * FROM BOOK FETCH FIRST 1 ROWS ONLY
    -
    --- Sybase ASE, SQL Server (without OFFSET)
    -SELECT TOP 1 * FROM BOOK
    -
    --- DB2 (with OFFSET), SQL Server (with OFFSET), Oracle (actual query may vary)
    -SELECT * FROM (
    -  SELECT LIMIT_98843777.*, ROW_NUMBER() OVER (ORDER BY ID ASC) AS ROWNUM_98843777
    -  FROM (
    -    SELECT TOP 100 PERCENT *
    -    FROM BOOK
    -    ORDER BY ID ASC
    -  ) AS LIMIT_98843777
    -) AS OUTER_LIMIT_98843777
    -WHERE ROWNUM_98843777 > 1
    -AND ROWNUM_98843777 <= 3
    -]]></sql><html>
    -
    -											<p>
    -												As you can see, jOOQ will take care of the incredibly painful ROW_NUMBER() OVER() (or ROWNUM for Oracle) filtering in subselects for you, you'll just have to write limit(1).offset(2) in any dialect.
    -											</p>
    -
    -											<h3>SQL Server's ORDER BY, TOP and subqueries</h3>
    -											<p>
    -												As can be seen in the above example, writing correct SQL can be quite tricky, depending on the SQL dialect. For instance, with SQL Server, you cannot have an ORDER BY clause in a subquery, unless you also have a TOP clause. This is illustrated by the fact that jOOQ renders a TOP 100 PERCENT clause for you. The same applies to the fact that ROW_NUMBER() OVER() needs an ORDER BY windowing clause, even if you don't provide one to the jOOQ query. By default, jOOQ adds ordering by the first column of your projection.
    -											</p>
    -										</html></content>
    -									</section>
    -
    -									<section id="for-update-clause">
    -										<title>The FOR UPDATE clause</title>
    -										<content><html>
    -											<p>
    -												For inter-process synchronisation and other reasons, you may choose to use the SELECT .. FOR UPDATE clause to indicate to the database, that a set of cells or records should be locked by a given transaction for subsequent updates. With jOOQ, this can be achieved as such:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT *
    -FROM BOOK
    -WHERE ID = 3
    -FOR UPDATE]]></sql><java><![CDATA[create.select()
    -      .from(BOOK)
    -      .where(BOOK.ID.equal(3))
    -      .forUpdate();]]></java></code-pair><html>
    -
    -											<p>
    -												The above example will produce a record-lock, locking the whole record for updates. Some databases also support cell-locks using FOR UPDATE OF ..
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT *
    -FROM BOOK
    -WHERE ID = 3
    -FOR UPDATE OF TITLE]]></sql><java><![CDATA[create.select()
    -      .from(BOOK)
    -      .where(BOOK.ID.equal(3))
    -      .forUpdate().of(BOOK.TITLE);]]></java></code-pair><html>
    -
    -											<p>
    -												Oracle goes a bit further and also allows to specify the actual locking behaviour. It features these additional clauses, which are all supported by jOOQ:
    -											</p>
    -											<ul>
    -												<li>FOR UPDATE NOWAIT: This is the default behaviour. If the lock cannot be acquired, the query fails immediately</li>
    -												<li>FOR UPDATE WAIT n: Try to wait for [n] seconds for the lock acquisition. The query will fail only afterwards</li>
    -												<li>FOR UPDATE SKIP LOCKED: This peculiar syntax will skip all locked records. This is particularly useful when implementing queue tables with multiple consumers</li>
    -											</ul>
    -											<p>
    -												With jOOQ, you can use those Oracle extensions as such:
    -											</p>
    -
    -</html><java><![CDATA[create.select().from(BOOK).where(BOOK.ID.equal(3)).forUpdate().nowait();
    -create.select().from(BOOK).where(BOOK.ID.equal(3)).forUpdate().wait(5);
    -create.select().from(BOOK).where(BOOK.ID.equal(3)).forUpdate().skipLocked();]]></java><html>
    -
    -											<h3>FOR UPDATE in CUBRID and SQL Server</h3>
    -											<p>
    -												The SQL standard specifies a FOR UPDATE clause to be applicable for cursors. Most databases interpret this as being applicable for all SELECT statements. An exception to this rule are the CUBRID and SQL Server databases, that do not allow for any FOR UPDATE clause in a regular SQL SELECT statement. jOOQ simulates the FOR UPDATE behaviour, by locking record by record with JDBC. JDBC allows for specifying the flags TYPE_SCROLL_SENSITIVE, CONCUR_UPDATABLE for any statement, and then using ResultSet.updateXXX() methods to produce a cell-lock / row-lock. Here's a simplified example in JDBC:
    -											</p>
    -</html><java><![CDATA[PreparedStatement stmt = connection.prepareStatement(
    -  "SELECT * FROM author WHERE id IN (3, 4, 5)",
    -  ResultSet.TYPE_SCROLL_SENSITIVE,
    -  ResultSet.CONCUR_UPDATABLE);
    -ResultSet rs = stmt.executeQuery();
    -
    -while (rs.next()) {
    -  // UPDATE the primary key for row-locks, or any other columns for cell-locks
    -  rs.updateObject(1, rs.getObject(1));
    -  rs.updateRow();
    -
    -  // Do more stuff with this record
    -}]]></java><html>
    -
    -											<p>
    -												The main drawback of this approach is the fact that the database has to maintain a scrollable cursor, whose records are locked one by one. This can cause a major risk of deadlocks or race conditions if the JDBC driver can recover from the unsuccessful locking, if two Java threads execute the following statements:
    -											</p>
    -
    -</html><sql><![CDATA[-- thread 1
    -SELECT * FROM author ORDER BY id ASC;
    -
    --- thread 2
    -SELECT * FROM author ORDER BY id DESC;]]></sql><html>
    -
    -											<p>
    -												So use this technique with care, possibly only ever locking single rows!
    -											</p>
    -
    -											<h3>Pessimistic (shared) locking with the FOR SHARE clause</h3>
    -											<p>
    -												Some databases (MySQL, Postgres) also allow to issue a non-exclusive lock explicitly using a FOR SHARE clause. This is also supported by jOOQ
    -											</p>
    -
    -											<h3>Optimistic locking in jOOQ</h3>
    -											<p>
    -												Note, that jOOQ also supports optimistic locking, if you're doing simple CRUD. This is documented in the section's manual about <reference id="optimistic-locking" title="optimistic locking"/>.
    -											</p>
    -										</html></content>
    -									</section>
    -
    -									<section id="union-clause">
    -										<title>UNION, INTERSECTION and EXCEPT</title>
    -										<content><html>
    -											<p>
    -												SQL allows to perform set operations as understood in standard set theory on result sets. These operations include unions, intersections, subtractions. For two subselects to be combinable by such a set operator, each subselect must return a <reference id="table-expressions" title="table expression"/> of the same arity and type.
    -											</p>
    -											
    -											<h3>UNION and UNION ALL</h3>
    -											<p>
    -												These operators combine two results into one. While UNION removes all duplicate records resulting from this combination, UNION ALL leaves subselect results as they are. Typically, you should prefer UNION ALL over UNION, if you don't really need to remove duplicates. The following example shows how to use such a UNION operation in jOOQ.
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT * FROM BOOK WHERE ID = 3
    -UNION ALL
    -SELECT * FROM BOOK WHERE ID = 5]]></sql><java><![CDATA[create.selectFrom(BOOK).where(BOOK.ID.equal(3))
    -      .unionAll(
    -create.selectFrom(BOOK).where(BOOK.ID.equal(5)));]]></java></code-pair><html>
    -											
    -											<h3>INTERSECT [ ALL ] and EXCEPT [ ALL ]</h3>
    -											<p>
    -												INTERSECT is the operation that produces only those s that are returned by both subselects. EXCEPT is the operation that returns only those s that are returned exclusively in the first subselect. Both operators will remove duplicates from their results. The SQL standard allows to specify the ALL keyword for both of these operators as well, but this is hardly supported in any database. jOOQ does not support INTERSECT ALL, EXEPT ALL operations either. 
    -											</p>
    -											
    -											<h3>jOOQ's set operators and how they're different from standard SQL</h3>
    -											<p>
    -												As previously mentioned in the manual's section about the <reference id="order-by-clause" title="ORDER BY clause"/>, jOOQ has slightly changed the semantics of these set operators. While in SQL, a subselect may not contain any <reference id="order-by-clause" title="ORDER BY clause"/> or <reference id="limit-clause" title="LIMIT clause"/> (unless you wrap the subselect into a <reference id="nested-selects" title="nested SELECT"/>), jOOQ allows you to do so. In order to select both the youngest and the oldest author from the database, you can issue the following statement with jOOQ (rendered to the MySQL dialect):
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[  (SELECT * FROM AUTHOR 
    -   ORDER BY DATE_OF_BIRTH ASC LIMIT 1)
    -UNION
    -  (SELECT * FROM AUTHOR 
    -   ORDER BY DATE_OF_BIRTH DESC LIMIT 1)]]></sql><java><![CDATA[create.selectFrom(AUTHOR)
    -      .orderBy(AUTHOR.DATE_OF_BIRTH.asc()).limit(1)
    -      .union(
    -create.selectFrom(AUTHOR)
    -      .orderBy(AUTHOR.DATE_OF_BIRTH.desc()).limit(1));]]></java></code-pair><html>
    -		
    -										</html></content>
    -									</section>
    -
    -									<section id="oracle-hints">
    -										<title>Oracle-style hints</title>
    -										<content><html>
    -											<p>
    -												If you are closely coupling your application to an Oracle (or CUBRID) database,	you might need to be able to pass hints of the form /*+HINT*/ with your SQL statements to the Oracle database. For example:
    -											</p>
    -
    -</html><sql>SELECT /*+ALL_ROWS*/ FIRST_NAME, LAST_NAME
    -  FROM AUTHOR</sql><html>
    -
    -				  							<p>
    -				  								This can be done in jOOQ using the .hint() clause in your SELECT statement:
    -			  								</p>
    -
    -</html><java>create.select(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -      .hint("/*+ALL_ROWS*/")
    -      .from(AUTHOR);</java><html>
    -
    -											<p>
    -												Note that you can pass any string in the .hint() clause. If you use that clause, the passed string will always be put in between the SELECT [DISTINCT] keywords and the actual projection list
    -											</p>
    -										</html></content>
    -									</section>
    -								</sections>
    -							</section>
    -
    -							<section id="insert-statement">
    -								<title>The INSERT statement</title>
    -								<content><html>
    -									<p>
    -										The INSERT statement is used to insert new records into a database table. Records can either be supplied using a VALUES() constructor, or a SELECT statement. jOOQ supports both types of INSERT statements. An example of an INSERT statement using a VALUES() constructor is given here:
    -									</p>
    -
    -
    -</html><code-pair>
    -<sql>INSERT INTO AUTHOR 
    -       (ID, FIRST_NAME, LAST_NAME)
    -VALUES (100, 'Hermann', 'Hesse');</sql><java>create.insertInto(AUTHOR,
    -        AUTHOR.ID, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -      .values(100, "Hermann", "Hesse");</java></code-pair><html>
    -
    -									<h3>INSERT multiple rows with the VALUES() constructor</h3>
    -									<p>
    -										The SQL standard specifies that multiple rows can be supplied to the VALUES() constructor in an INSERT statement. Here's an example of a multi-record INSERT
    -									</p>
    -</html><code-pair>
    -<sql>INSERT INTO AUTHOR
    -       (ID, FIRST_NAME, LAST_NAME)
    -VALUES (100, 'Hermann', 'Hesse'),
    -       (101, 'Alfred', 'Döblin');</sql><java>create.insertInto(AUTHOR,
    -        AUTHOR.ID, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -      .values(100, "Hermann", "Hesse")
    -      .values(101, "Alfred", "Döblin");</java></code-pair><html>
    -
    -									<p>
    -										jOOQ tries to stay close to actual SQL. In detail, however, Java's expressiveness is limited. That's why the values() clause is repeated for every record in multi-record inserts. 
    -									</p>
    -									<p> 
    -										Some RDBMS do not support inserting several records in a single statement. In those cases, jOOQ simulates multi-record INSERTs using the following SQL:
    -									</p>
    -
    -</html><code-pair>
    -<sql>INSERT INTO AUTHOR
    -    (ID, FIRST_NAME, LAST_NAME)
    -SELECT 100, 'Hermann', 'Hesse' FROM DUAL UNION ALL
    -SELECT 101, 'Alfred', 'Döblin' FROM DUAL;</sql><java>create.insertInto(AUTHOR,
    -        AUTHOR.ID, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -      .values(100, "Hermann", "Hesse")
    -      .values(101, "Alfred", "Döblin");
    -</java></code-pair><html>
    -
    -									<h3>INSERT using jOOQ's alternative syntax</h3>
    -									<p>
    -										MySQL (and some other RDBMS) allow for using a non-SQL-standard, UPDATE-like syntax for INSERT statements. This is also supported in jOOQ, should you prefer that syntax. The above INSERT statement can also be expressed as follows:
    -									</p>
    -
    -</html><java>create.insertInto(AUTHOR)
    -      .set(AUTHOR.ID, 100)
    -      .set(AUTHOR.FIRST_NAME, "Hermann")
    -      .set(AUTHOR.LAST_NAME, "Hesse")
    -      .newRecord()
    -      .set(AUTHOR.ID, 101)
    -      .set(AUTHOR.FIRST_NAME, "Alfred")
    -      .set(AUTHOR.LAST_NAME, "Döblin");</java><html>
    -      
    -									<p>
    -										As you can see, this syntax is a bit more verbose, but also more type-safe, as every field can be matched with its value. Internally, the two syntaxes are strictly equivalent.
    -									</p>
    -
    -									<h3>MySQL's INSERT .. ON DUPLICATE KEY UPDATE</h3>
    -									<p>
    -										The MySQL database supports a very convenient way to INSERT or UPDATE a record. This is a non-standard extension to the SQL syntax, which is supported by jOOQ and simulated in other RDBMS, where this is possible (i.e. if they support the SQL standard <reference id="merge-statement" title="MERGE statement"/>). Here is an example how to use the ON DUPLICATE KEY UPDATE clause:
    -									</p>
    -									
    -</html><java>// Add a new author called "Koontz" with ID 3.
    -// If that ID is already present, update the author's name
    -create.insertInto(AUTHOR, AUTHOR.ID, AUTHOR.LAST_NAME)
    -      .values(3, "Koontz")
    -      .onDuplicateKeyUpdate()
    -      .set(AUTHOR.LAST_NAME, "Koontz");</java><html>
    -
    -									<h3>The synthetic ON DUPLICATE KEY IGNORE clause</h3>
    -							
    -									<p>
    -										The MySQL database also supports an INSERT IGNORE INTO clause. This is supported by jOOQ using the more convenient SQL syntax variant of ON DUPLICATE KEY IGNORE, which can be equally simulated in other databases using a <reference id="merge-statement" title="MERGE statement"/>:
    -									</p>
    -									
    -</html><java>// Add a new author called "Koontz" with ID 3.
    -// If that ID is already present, ignore the INSERT statement
    -create.insertInto(AUTHOR, AUTHOR.ID, AUTHOR.LAST_NAME)
    -      .values(3, "Koontz")
    -      .onDuplicateKeyIgnore();</java><html>
    -
    -      								<h3>Postgres's INSERT .. RETURNING</h3>
    -									<p>
    -										The Postgres database has native support for an INSERT .. RETURNING clause. This is a very powerful concept that is simulated for all other dialects using JDBC's <reference class="java.sql.Statement" anchor="#getGeneratedKeys()" title="getGeneratedKeys()"/> method. Take this example:
    -									</p>
    -
    -</html><java><![CDATA[// Add another author, with a generated ID
    -Record<?> record =
    -create.insertInto(AUTHOR, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -      .values("Charlotte", "Roche")
    -      .returning(AUTHOR.ID)
    -      .fetchOne();
    -
    -System.out.println(record.getValue(AUTHOR.ID));
    -
    -// For some RDBMS, this also works when inserting several values
    -// The following should return a 2x2 table
    -Result<?> result =
    -create.insertInto(AUTHOR, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -      .values("Johann Wolfgang", "von Goethe")
    -      .values("Friedrich", "Schiller")
    -      // You can request any field. Also trigger-generated values
    -      .returning(AUTHOR.ID, AUTHOR.CREATION_DATE)
    -      .fetch();]]></java><html>
    -
    -		      						<p>
    -		      							Some databases have poor support for returning generated keys after INSERTs. In those cases, jOOQ might need to issue another <reference id="select-statement" title="SELECT statement"/> in order to fetch an @@identity value. Be aware, that this can lead to race-conditions in those databases that cannot properly return generated ID values. For more information, please consider the jOOQ Javadoc for the returning() clause.
    -		      						</p>
    -
    -									<h3>The INSERT SELECT statement</h3>
    -							
    -									<p>
    -										In some occasions, you may prefer the INSERT SELECT syntax, for instance, when you copy records from one table to another:
    -									</p>
    -									
    -</html><java>create.insertInto(AUTHOR_ARCHIVE)
    -      .select(create.selectFrom(AUTHOR).where(AUTHOR.DECEASED.isTrue()));</java></content>
    -							</section>
    -
    -							<section id="update-statement">
    -								<title>The UPDATE statement</title>
    -								<content><html>
    -									<p>
    -										The UPDATE statement is used to modify one or several pre-existing records in a database table. UPDATE statements are only possible on single tables. Support for multi-table updates will be implemented in the near future. An example update query is given here:
    -									</p>
    -
    -</html><code-pair>
    -<sql>UPDATE AUTHOR
    -   SET FIRST_NAME = 'Hermann',
    -       LAST_NAME = 'Hesse'
    - WHERE ID = 3;</sql><java>create.update(AUTHOR)
    -      .set(AUTHOR.FIRST_NAME, "Hermann")
    -      .set(AUTHOR.LAST_NAME, "Hesse")
    -      .where(AUTHOR.ID.equal(3));</java>
    -</code-pair><html>
    -								
    -								</html></content>
    -							</section>
    -
    -							<section id="delete-statement">
    -								<title>The DELETE statement</title>
    -								<content><html>
    -									<p>
    -										The DELETE statement physically removes records from a database table. DELETE statements are only possible on single tables. Support for multi-table deletes will be implemented in the near future. An example delete query is given here:
    -									</p>
    -
    -</html><code-pair>
    -<sql>DELETE AUTHOR
    - WHERE ID = 100;</sql><java>create.delete(AUTHOR)
    -      .where(AUTHOR.ID.equal(100));</java>
    -</code-pair><html>
    -
    -								</html></content>
    -							</section>
    -
    -							<section id="merge-statement">
    -								<title>The MERGE statement</title>
    -								<content><html>
    -									<p>
    -										The MERGE statement is one of the most advanced standardised SQL constructs, which is supported by DB2, HSQLDB, Oracle, SQL Server and Sybase (MySQL has the similar INSERT .. ON DUPLICATE KEY UPDATE construct)
    -									</p>
    -									<p>
    -										The point of the standard MERGE statement is to take a TARGET table, and merge (INSERT, UPDATE) data from a SOURCE table into it. DB2, Oracle, SQL Server and Sybase also allow for DELETING some data and for adding many additional clauses. With jOOQ {jooq-version}, only Oracle's MERGE extensions are supported. Here is an example:
    -									</p>
    -
    -</html><code-pair>
    -<sql>-- Check if there is already an author called 'Hitchcock'
    --- If there is, rename him to John. If there isn't add him.
    -MERGE INTO AUTHOR
    -USING (SELECT 1 FROM DUAL)
    -ON (LAST_NAME = 'Hitchcock')
    -WHEN MATCHED THEN UPDATE SET FIRST_NAME = 'John'
    -WHEN NOT MATCHED THEN INSERT (LAST_NAME) VALUES ('Hitchcock')</sql><java>create.mergeInto(AUTHOR)
    -      .using(create().selectOne())
    -      .on(AUTHOR.LAST_NAME.equal("Hitchcock"))
    -      .whenMatchedThenUpdate()
    -      .set(AUTHOR.FIRST_NAME, "John")
    -      .whenNotMatchedThenInsert(AUTHOR.LAST_NAME)
    -      .values("Hitchcock");
    -
    -</java></code-pair><html>
    -
    -		                            <h3>MERGE Statement (H2-specific syntax)</h3>
    -									<p>
    -									    The H2 database ships with a somewhat less powerful but a little more intuitive syntax for its own version of the MERGE statement. An example more or less equivalent to the previous one can be seen here:
    -									</p>
    -									
    -</html><code-pair>
    -<sql>-- Check if there is already an author called 'Hitchcock'
    --- If there is, rename him to John. If there isn't add him.
    -
    -MERGE INTO AUTHOR (FIRST_NAME, LAST_NAME)
    -KEY (LAST_NAME)
    -VALUES ('John', 'Hitchcock')</sql><java>create.mergeInto(AUTHOR,
    -                 AUTHOR.FIRST_NAME,
    -                 AUTHOR.LAST_NAME)
    -      .key(AUTHOR.LAST_NAME)
    -      .values("John", "Hitchcock")
    -      .execute();
    -</java></code-pair><html>
    -
    -		                            <p>
    -		                                This syntax can be fully simulated by jOOQ for all other databases that support the SQL standard. For more information about the H2 MERGE syntax, see the documentation here:<br/>
    -		                                <a href="http://www.h2database.com/html/grammar.html#merge">http://www.h2database.com/html/grammar.html#merge</a>
    -		                            </p>
    -								
    -								</html></content>
    -							</section>
    -
    -							<section id="truncate-statement">
    -								<title>The TRUNCATE statement</title>
    -								<content><html>
    -									<p>
    -										The TRUNCATE statement is the only DDL statement supported by jOOQ so far. It is popular in many databases when you want to bypass constraints for table truncation. Databases may behave differently, when a truncated table is referenced by other tables. For instance, they may fail if records from a truncated table are referenced, even with ON DELETE CASCADE clauses in place. Please, consider your database manual to learn more about its TRUNCATE implementation.
    -									</p>
    -									<p>
    -										The TRUNCATE syntax is trivial:
    -									</p>
    -
    -</html><code-pair>
    -	<sql>TRUNCATE TABLE AUTHOR;</sql><java>create.truncate(AUTHOR).execute();</java>
    -</code-pair><html>
    -									
    -									<p>
    -										TRUNCATE is not supported by Ingres and SQLite. jOOQ will execute a DELETE FROM AUTHOR statement instead.
    -									</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -					<section id="table-expressions">
    -						<title>Table expressions</title>
    -						<content><html>
    -							<p>
    -								The following sections explain the various types of table expressions supported by jOOQ
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="generated-tables">
    -								<title>Generated Tables</title>
    -								<content><html>
    -									<p>
    -										Most of the times, when thinking about a <reference id="table-expressions" title="table expression"/> you're probably thinking about an actual physical table in your database schema. If you're using jOOQ's <reference id="code-generation" title="code generator"/>, you will have all tables from your database schema available to you as type safe Java objects. You can then use these tables in SQL <reference id="from-clause" title="FROM clauses"/>, <reference id="join-clause" title="JOIN clauses"/> or in other <reference id="sql-statements" title="SQL statements"/>, just like any other table expression. An example is given here:
    -									</p>
    -							
    -</html><code-pair>
    -<sql><![CDATA[SELECT *
    -FROM AUTHOR -- Table expression AUTHOR
    -JOIN BOOK   -- Table expression BOOK
    -ON (AUTHOR.ID = BOOK.AUTHOR_ID)]]></sql><java><![CDATA[create.select()
    -      .from(AUTHOR) // Table expression AUTHOR
    -      .join(BOOK)   // Table expression BOOK
    -      .on(AUTHOR.ID.equal(BOOK.AUTHOR_ID));]]></java></code-pair><html>
    -							
    -									<p>
    -										The above example shows how AUTHOR and BOOK tables are joined in a <reference id="select-statement" title="SELECT statement"/>. It also shows how you can access physical <reference id="table-columns" title="table columns"/> by dereferencing the relevant Java attributes of their tables.
    -									</p>
    -									<p>
    -										See the manual's section about <reference id="codegen-tables" title="generated tables"/> for more information about what is really generated by the <reference id="code-generation" title="code generator"/>
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="aliased-tables">
    -								<title>Aliased Tables</title>
    -								<content><html>
    -									<p>
    -										The strength of jOOQ's <reference id="code-generation" title="code generator"/> becomes more obvious when you perform table aliasing and dereference fields from generated aliased tables. This can best be shown by example:
    -									</p>
    -
    -</html><code-pair><sql><![CDATA[-- Select all books by authors born after 1920,
    --- named "Paulo" from a catalogue:
    -
    -
    -
    -SELECT *
    -  FROM author a
    -  JOIN book b ON a.id = b.author_id
    - WHERE a.year_of_birth > 1920
    -   AND a.first_name = 'Paulo'
    - ORDER BY b.title]]></sql><java><![CDATA[// Declare your aliases before using them in SQL:
    -Author a = AUTHOR.as("a");
    -Book b = BOOK.as("b");
    -
    -// Use aliased tables in your statement
    -create.select()
    -      .from(a)
    -      .join(b).on(a.ID.equal(b.AUTHOR_ID))
    -      .where(a.YEAR_OF_BIRTH.greaterThan(1920)
    -      .and(a.FIRST_NAME.equal("Paulo")))
    -      .orderBy(b.TITLE);]]></java></code-pair><html>
    -								
    -									<p>
    -										As you can see in the above example, calling as() on generated tables returns an object of the same type as the table. This means that the resulting object can be used to dereference fields from the aliased table. This is quite powerful in terms of having your Java compiler check the syntax of your SQL statements. If you remove a column from a table, dereferencing that column from that table alias will cause compilation errors.
    -									</p>
    -									
    -									<h3>Dereferencing columns from other table expressions</h3>
    -									<p>
    -										TODO document this
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="joined-tables">
    -								<title>Joined tables</title>
    -								<content><html>
    -									<p>
    -										The <reference id="join-clause" title="JOIN operators"/> that can be used in <reference id="select-statement" title="SQL SELECT statements"/> are the most powerful and best supported means of creating new <reference id="table-expressions" title="table expressions"/> in SQL. Informally, the following can be said:
    -									</p>
    -									
    -</html><text>A(colA1, ..., colAn) "join" B(colB1, ..., colBm) "produces" C(colA1, ..., colAn, colB1, ..., colBm)</text><html>
    -
    -									<p>
    -										SQL and relational algebra distinguish between at least the following JOIN types (upper-case: SQL, lower-case: relational algebra):
    -									</p>
    -									<ul>
    -										<li><strong>CROSS JOIN or cartesian product</strong>: The basic JOIN in SQL, producing a relational cross product, combining every record of table A with every record of table B. Note that cartesian products can also be produced by listing comma-separated <reference id="table-expressions" title="table expressions"/> in the <reference id="from-clause" title="FROM clause"/> of a <reference id="select-statement" title="SELECT statement"/></li>
    -										<li><strong>NATURAL JOIN</strong>: The basic JOIN in relational algebra, yet a rarely used JOIN in databases with everyday degree of normalisation. This JOIN type unconditionally equi-joins two tables by all columns with the same name (requiring foreign keys and primary keys to share the same name). Note that the JOIN columns will only figure once in the resulting <reference id="table-expressions" title="table expression"/>.</li>
    -										<li><strong>INNER JOIN or equi-join</strong>: This JOIN operation performs a cartesian product (CROSS JOIN) with a <reference id="conditional-expressions" title="filtering predicate"/> being applied to the resulting <reference id="table-expressions" title="table expression"/>. Most often, a <reference id="comparison-predicate" title="equal comparison predicate"/> comparing foreign keys and primary keys will be applied as a filter, but any other predicate will work, too.</li>
    -										<li><strong>OUTER JOIN</strong>: This JOIN operation performs a cartesian product (CROSS JOIN) with a <reference id="conditional-expressions" title="filtering predicate"/> being applied to the resulting <reference id="table-expressions" title="table expression"/>. Most often, a <reference id="comparison-predicate" title="equal comparison predicate"/> comparing foreign keys and primary keys will be applied as a filter, but any other predicate will work, too. Unlike the INNER JOIN, an OUTER JOIN will add "empty records" to the left (table A) or right (table B) or both tables, in case the conditional expression fails to produce a .</li>										
    -										<li><strong>semi-join</strong>: In SQL, this JOIN operation can only be expressed implicitly using <reference id="in-predicate" title="IN predicates"/> or <reference id="exists-predicate" title="EXISTS predicates"/>. The <reference id="table-expressions" title="table expression"/> resulting from a semi-join will only contain the left-hand side table A</li>										
    -										<li><strong>anti-join</strong>: In SQL, this JOIN operation can only be expressed implicitly using <reference id="in-predicate" title="NOT IN predicates"/> or <reference id="exists-predicate" title="NOT EXISTS predicates"/>. The <reference id="table-expressions" title="table expression"/> resulting from a semi-join will only contain the left-hand side table A</li>
    -										<li><strong>division</strong>: This JOIN operation is hard to express at all, in SQL. See the manual's chapter about <reference id="relational-division" title="relational division"/> for details on how jOOQ simulates this operation.</li>
    -									</ul>									
    -									<p>
    -										jOOQ supports all of these JOIN types (except semi-join and anti-join) directly on any <reference id="table-expressions" title="table expression"/>:
    -									</p>
    -									
    -</html><java><![CDATA[// jOOQ's relational division convenience syntax 
    -DivideByOnStep divideBy(Table<?> table)
    -
    -// Various overloaded INNER JOINs
    -TableOnStep join(TableLike<?>)
    -TableOnStep join(String)
    -TableOnStep join(String, Object...)
    -TableOnStep join(String, QueryPart...)
    -
    -// Various overloaded OUTER JOINs (supporting Oracle's partitioned OUTER JOIN)
    -// Overloading is similar to that of INNER JOIN
    -TablePartitionByStep leftOuterJoin(TableLike<?>)
    -TablePartitionByStep rightOuterJoin(TableLike<?>)
    -
    -// Various overloaded FULL OUTER JOINs
    -TableOnStep fullOuterJoin(TableLike<?>)
    -
    -// Various overloaded CROSS JOINs
    -Table<Record> crossJoin(TableLike<?>)
    -
    -// Various overloaded NATURAL JOINs
    -Table<Record> naturalJoin(TableLike<?>)
    -Table<Record> naturalLeftOuterJoin(TableLike<?>)
    -Table<Record> naturalRightOuterJoin(TableLike<?>)]]></java><html>							
    -
    -									<p>
    -										Note that most of jOOQ's JOIN operations give way to a similar DSL API hierarchy as previously seen in the manual's section about the <reference id="join-clause" title="JOIN clause"/>
    -									</p>		
    -								</html></content>
    -							</section>
    -
    -							<section id="nested-selects">
    -								<title>Nested SELECTs</title>
    -								<content><html>
    -									<p>
    -										A <reference id="select-statement" title="SELECT statement"/> can appear almost anywhere a <reference id="table-expressions" title="table expression"/> can. Such a "nested SELECT" is often called a "derived table". Apart from many convenience methods accepting <reference class="org.jooq.Select"/> objects directly, a SELECT statement can always be transformed into a <reference class="org.jooq.Table"/> object using the asTable() method.
    -									</p>
    -									
    -									<h3>Example: Scalar subquery</h3>
    -									
    -</html><code-pair>
    -<sql>SELECT *
    -  FROM BOOK
    - WHERE BOOK.AUTHOR_ID = (
    - 		SELECT ID
    -          FROM AUTHOR
    -         WHERE LAST_NAME = 'Orwell')</sql><java>create.select()
    -      .from(BOOK)
    -      .where(BOOK.AUTHOR_ID.equal(create
    -             .select(AUTHOR.ID)
    -             .from(AUTHOR)
    -             .where(AUTHOR.LAST_NAME.equal("Orwell"))));</java>
    -</code-pair><html>
    -
    -									<h3>Example: Derived table</h3>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT nested.* FROM (
    -      SELECT AUTHOR_ID, count(*) books
    -        FROM BOOK
    -    GROUP BY AUTHOR_ID
    -) nested
    -ORDER BY nested.books DESC
    -
    -
    -
    -]]></sql><java><![CDATA[Table<Record> nested =
    -    create.select(BOOK.AUTHOR_ID, count().as("books"))
    -          .from(BOOK)
    -          .groupBy(BOOK.AUTHOR_ID).asTable("nested");
    -
    -create.select(nested.getFields())
    -      .from(nested)
    -      .orderBy(nested.getField("books"));]]></java>
    -</code-pair><html>
    -
    -									<h3>Example: Correlated subquery</h3>
    -</html><code-pair>
    -<sql><![CDATA[  SELECT LAST_NAME, (
    -      SELECT COUNT(*)
    -       FROM BOOK
    -      WHERE BOOK.AUTHOR_ID = AUTHOR.ID) books
    -    FROM AUTHOR
    -ORDER BY books DESC
    -
    -
    -
    -]]></sql><java><![CDATA[// The type of books cannot be inferred from the Select<?>
    -Field<Object> books =
    -    create.selectCount()
    -          .from(BOOK)
    -          .where(BOOK.AUTHOR_ID.equal(AUTHOR.ID))
    -          .asField("books");
    -create.select(AUTHOR.ID, books)
    -      .from(AUTHOR)
    -      .orderBy(books, AUTHOR.ID));]]></java>
    -</code-pair><html>									
    -								</html></content>
    -							</section>
    -
    -							<section id="pivot-tables">
    -								<title>The Oracle 11g PIVOT clause</title>
    -								<content><html>
    -									<p>
    -										If you are closely coupling your application to an Oracle database, you can take advantage of some Oracle-specific features, such as the PIVOT clause, used for statistical analyses. The formal syntax definition is as follows:
    -									</p>
    -									
    -</html><sql>-- SELECT ..
    -     FROM table PIVOT (aggregateFunction [, aggregateFunction] FOR column IN (expression [, expression]))
    ---  WHERE ..</sql><html>
    -		
    -									<p>
    -										The PIVOT clause is available from the <reference class="org.jooq.Table"/> type, as pivoting is done directly on a table. Currently, only Oracle's PIVOT clause is supported. Support for SQL Server's slightly different PIVOT clause will be added later. Also, jOOQ may simulate PIVOT for other dialects in the future.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="relational-division">
    -								<title>jOOQ's relational division syntax</title>
    -								<content><html>
    -									<p>
    -									    There is one operation in relational algebra that is not given a lot of attention, because it is rarely used in real-world applications. It is the relational division, the opposite operation of the cross product (or, relational multiplication). The following is an approximate definition of a relational division:
    -									</p>
    -
    -</html><config>Assume the following cross join / cartesian product
    -C = A × B
    -
    -Then it can be said that
    -A = C ÷ B
    -B = C ÷ A</config><html>
    -
    -									<p>
    -									   With jOOQ, you can simplify using relational divisions by using the following syntax:
    -									</p>
    -
    -</html><java>C.divideBy(B).on(C.ID.equal(B.C_ID)).returning(C.TEXT)</java><html>
    -
    -									<p>
    -										The above roughly translates to
    -									</p>
    -
    -</html><sql>SELECT DISTINCT C.TEXT FROM C "c1"
    -WHERE NOT EXISTS (
    -  SELECT 1 FROM B
    -  WHERE NOT EXISTS (
    -    SELECT 1 FROM C "c2"
    -    WHERE "c2".TEXT = "c1".TEXT
    -    AND "c2".ID = B.C_ID
    -  )
    -)</sql><html>
    -
    -									<p>
    -										Or in plain text: Find those TEXT values in C whose ID's correspond to all ID's in B. Note that from the above SQL statement, it is immediately clear that proper indexing is of the essence. Be sure to have indexes on all columns referenced from the on(...) and returning(...) clauses.
    -									</p>
    -
    -									<p>
    -										For more information about relational division and some nice, real-life examples, see
    -									</p>
    -
    -									<ul>
    -										<li><a href="http://en.wikipedia.org/wiki/Relational_algebra#Division" title="Wikipedia article on relational division">http://en.wikipedia.org/wiki/Relational_algebra#Division</a></li>
    -										<li><a href="http://www.simple-talk.com/sql/t-sql-programming/divided-we-stand-the-sql-of-relational-division/" title="A nice summary of what relational division is and how it is best implemented in SQL">http://www.simple-talk.com/sql/t-sql-programming/divided-we-stand-the-sql-of-relational-division/</a></li>
    -									</ul>
    -								</html></content>
    -
    -							</section>
    -
    -							<section id="array-and-cursor-unnesting">
    -								<title>Array and cursor unnesting</title>
    -								<content><html>
    -									<p>
    -										The SQL standard specifies how SQL databases should implement ARRAY and TABLE types, as well as CURSOR types. Put simply, a CURSOR is a pointer to any materialised <reference id="table-expressions" title="table expression"/>. Depending on the cursor's features, this table expression can be scrolled through in both directions, records can be locked, updated, removed, inserted, etc. Often, CURSOR types contain s, whereas ARRAY and TABLE types contain simple scalar values, although that is not a requirement
    -									</p>
    -									
    -									<p>
    -										ARRAY types in SQL are similar to Java's array types. They contain a "component type" or "element type" and a "dimension". This sort of ARRAY type is implemented in H2, HSQLDB and Postgres and supported by jOOQ as such. Oracle uses strongly-typed arrays, which means that an ARRAY type (VARRAY or TABLE type) has a name and possibly a maximum capacity associated with it.
    -									</p>
    -
    -									<h3>Unnesting array and cursor types</h3>									
    -									<p>
    -										The real power of these types become more obvious when you fetch them from <reference id="stored-procedures" title="stored procedures"/> to unnest them as <reference id="table-expressions" title="table expressions"/> and use them in your <reference id="from-clause" title="FROM clause"/>. An example is given here, where Oracle's DBMS_XPLAN package is used to fetch a cursor containing data about the most recent execution plan:
    -									</p>									
    -
    -</html><code-pair>
    -	<sql><![CDATA[SELECT *
    -FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(null, null, 'ALLSTATS'));]]></sql><java><![CDATA[create.select()
    -      .from(table(DbmsXplan.displayCursor(null, null, "ALLSTATS"));]]></java>
    -</code-pair><html>
    -									<p>
    -										Note, in order to access the DbmsXplan package, you can use the <reference id="code-generation" title="code generator"/> to generate Oracle's SYS schema.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="dual">
    -								<title>The DUAL table</title>
    -								<content><html>
    -									<p>
    -										The SQL standard specifies that the <reference id="from-clause" title="FROM clause"/> is optional in a <reference id="select-statement" title="SELECT statement"/>. However, according to the standard, you may then no longer use some other clauses, such as the <reference id="where-clause" title="WHERE clause"/>. In the real world, there exist three types of databases:
    -									</p>
    -									<ul>
    -										<li>The ones that always require a FROM clause</li>
    -										<li>The ones that never require a FROM clause (and still allow a WHERE clause)</li>
    -										<li>The ones that correctly implement the SQL standard</li>
    -									</ul>
    -									<p>
    -										With jOOQ, you don't have to worry about the above distinction of SQL dialects. jOOQ never requires a FROM clause, but renders the necessary "DUAL" table, if needed. The following program shows how jOOQ renders "DUAL" tables
    -									</p>
    -
    -</html><code-pair>
    -	<sql><![CDATA[SELECT 1
    -SELECT 1 FROM "db_root"
    -SELECT 1 FROM "SYSIBM"."DUAL"
    -SELECT 1 FROM "SYSIBM"."SYSDUMMY1"
    -SELECT 1 FROM dual
    -SELECT 1 FROM "INFORMATION_SCHEMA"."SYSTEM_USERS"
    -SELECT 1 FROM (select 1 as dual) as dual
    -SELECT 1 FROM dual
    -SELECT 1 FROM dual
    -SELECT 1
    -SELECT 1
    -SELECT 1
    -SELECT 1 FROM [SYS].[DUMMY]
    -]]></sql><java><![CDATA[new Factory(SQLDialect.ASE      ).selectOne().getSQL();
    -new Factory(SQLDialect.CUBRID   ).selectOne().getSQL();
    -new Factory(SQLDialect.DB2      ).selectOne().getSQL();
    -new Factory(SQLDialect.DERBY    ).selectOne().getSQL();
    -new Factory(SQLDialect.H2       ).selectOne().getSQL();
    -new Factory(SQLDialect.HSQLDB   ).selectOne().getSQL();
    -new Factory(SQLDialect.INGRES   ).selectOne().getSQL();
    -new Factory(SQLDialect.MYSQL    ).selectOne().getSQL();
    -new Factory(SQLDialect.ORACLE   ).selectOne().getSQL();
    -new Factory(SQLDialect.POSTGRES ).selectOne().getSQL();
    -new Factory(SQLDialect.SQLITE   ).selectOne().getSQL();
    -new Factory(SQLDialect.SQLSERVER).selectOne().getSQL();
    -new Factory(SQLDialect.SYBASE   ).selectOne().getSQL();]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										Note, that some databases (H2, MySQL) can normally do without "dual". However, there exist some corner-cases with complex nested SELECT statements, where this will cause syntax errors (or parser bugs). To stay on the safe side, jOOQ will always render "dual" in those dialects.
    -									</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -					<section id="column-expressions">
    -						<title>Column expressions</title>
    -						<content><html>
    -						    <p>
    -						    	Column expressions can be used in various SQL clauses in order to refer to one or several columns. This chapter explains how to form various types of column expressions with jOOQ. A particular type of column expression is given in the section about <reference id="row-value-expressions" title="s or row value expressions"/>, where an expression may have a degree of more than one.
    -						    </p>
    -						
    -						    <h3>Using column expressions in jOOQ</h3>
    -							<p>
    -								jOOQ allows you to freely create arbitrary column expressions using a fluent expression construction API. Many expressions can be formed as functions from <reference id="factory" title="Factory methods"/>, other expressions can be formed based on a pre-existing column expression. For example:
    -							</p>
    -							
    -</html><java><![CDATA[// A regular table column expression
    -Field<String> field1 = BOOK.TITLE;
    -
    -// A function created from the Factory using "prefix" notation
    -Field<String> field2 = trim(BOOK.TITLE);
    -
    -// The same function created from a pre-existing Field using "postfix" notation
    -Field<String> field3 = BOOK.TITLE.trim();
    -
    -// More complex function with advanced DSL syntax
    -Field<String> field4 = listAgg(BOOK.TITLE)
    -                          .withinGroupOrderBy(BOOK.ID.asc())
    -                          .over().partitionBy(AUTHOR.ID);]]></java><html>
    -
    -							<p>
    -								In general, it is up to you whether you want to use the "prefix" notation or the "postfix" notation to create new column expressions based on existing ones. The "SQL way" would be to use the "prefix notation", with functions created from the <reference id="factory" title="Factory"/>. The "Java way" or "object-oriented way" would be to use the "postfix" notation with functions created from <reference class="org.jooq.Field"/> objects. Both ways ultimately create the same query part, though.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="table-columns">
    -								<title>Table columns</title>
    -								<content><html>
    -									<p>
    -										Table columns are the most simple implementations of a <reference id="column-expressions" title="column expression"/>. They are mainly produced by jOOQ's <reference id="code-generation" title="code generator"/> and can be dereferenced from the generated tables. This manual is full of examples involving table columns. Another example is given in this query:
    -									</p>
    -
    -</html><code-pair>
    -	<sql><![CDATA[SELECT BOOK.ID, BOOK.TITLE
    -FROM BOOK
    -WHERE BOOK.TITLE LIKE '%SQL%'
    -ORDER BY BOOK.TITLE]]></sql><java><![CDATA[create.select(BOOK.ID, BOOK.TITLE)
    -	  .from(BOOK)
    -	  .where(BOOK.TITLE.like("%SQL%"))
    -	  .orderBy(BOOK.TITLE);]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										Table columns implement a more specific interface called <reference class="org.jooq.TableField"/>, which is parameterised with its associated &lt;R extends Record&gt; record type.
    -									</p>
    -									<p>
    -										See the manual's section about <reference id="codegen-tables" title="generated tables"/> for more information about what is really generated by the <reference id="code-generation" title="code generator"/>
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="aliased-columns">
    -								<title>Aliased columns</title>
    -								<content><html>
    -									<p>
    -										Just like <reference id="aliased-tables" title="tables"/>, columns can be renamed using aliases. Here is an example:
    -									</p>
    -									
    -</html><sql>  SELECT FIRST_NAME || ' ' || LAST_NAME author, COUNT(*) books
    -    FROM AUTHOR
    -    JOIN BOOK ON AUTHOR.ID = AUTHOR_ID
    -GROUP BY FIRST_NAME, LAST_NAME;</sql><html>
    -
    -									<p>
    -										Here is how it's done with jOOQ:
    -									</p>
    -									
    -</html><java>Record record = create.select(
    -         concat(AUTHOR.FIRST_NAME, val(" "), AUTHOR.LAST_NAME).as("author"),
    -         count().as("books"))
    -      .from(AUTHOR)
    -      .join(BOOK).on(AUTHOR.ID.equal(BOOK.AUTHOR_ID))
    -      .groupBy(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME).fetchAny();</java><html>
    -      
    -      								<p>
    -      									When you alias Fields like above, you can access those Fields' values using the alias name:
    -  									</p>
    -  									
    -</html><java>System.out.println("Author : " + record.getValue("author"));
    -System.out.println("Books  : " + record.getValue("books"));</java></content>
    -							</section>
    -
    -							<section id="cast-expressions">
    -								<title>Cast expressions</title>
    -								<content><html>
    -									<p>
    -										jOOQ's source code generator tries to find the most accurate type mapping between your vendor-specific data types and a matching Java type. For instance, most VARCHAR, CHAR, CLOB types will map to String. Most BINARY, BYTEA, BLOB types will map to byte[]. NUMERIC types will default to java.math.BigDecimal, but can also be any of java.math.BigInteger, Long, Integer, Short, Byte, Double, Float.
    -									</p>
    -									<p>
    -										Sometimes, this automatic mapping might not be what you needed, or jOOQ cannot know the type of a field. In those cases you would write SQL type CASTs like this:
    -									</p>
    -									
    -</html><sql>-- Let's say, your Postgres column LAST_NAME was VARCHAR(30)
    --- Then you could do this:
    -SELECT CAST(AUTHOR.LAST_NAME AS TEXT) FROM DUAL</sql><html>
    -
    -									<p>
    -										in jOOQ, you can write something like that:
    -									</p>
    -									
    -</html><java>create.select(TAuthor.LAST_NAME.cast(PostgresDataType.TEXT));</java><html>
    -
    -									<p>
    -										The same thing can be achieved by casting a Field directly to String.class, as TEXT is the default data type in Postgres to map to Java's String
    -									</p>
    -									
    -</html><java>create.select(TAuthor.LAST_NAME.cast(String.class));</java><html>
    -		
    -									<p>
    -										The complete CAST API in Field consists of these three methods:
    -									</p>
    -									
    -</html><java><![CDATA[public interface Field<T> {
    -
    -    // Cast this field to the type of another field
    -    <Z> Field<Z> cast(Field<Z> field);
    -    
    -    // Cast this field to a given DataType
    -    <Z> Field<Z> cast(DataType<Z> type);
    -    
    -    // Cast this field to the default DataType for a given Class
    -    <Z> Field<Z> cast(Class<? extends Z> type);
    -}
    -
    -// And additional convenience methods in the Factory:
    -public class Factory {
    -    <T> Field<T> cast(Object object, Field<T> field);
    -    <T> Field<T> cast(Object object, DataType<T> type);
    -    <T> Field<T> cast(Object object, Class<? extends T> type);
    -    <T> Field<T> castNull(Field<T> field);
    -    <T> Field<T> castNull(DataType<T> type);
    -    <T> Field<T> castNull(Class<? extends T> type);
    -}]]></java></content>
    -							</section>
    -
    -							<section id="arithmetic-expressions">
    -								<title>Arithmetic expressions</title>
    -								<content><html>
    -									<h3>Numeric arithmetic expressions</h3>
    -									<p>
    -										Your database can do the math for you. Arithmetic operations are implemented just like <reference id="numeric-functions" title="numeric functions"/>, with similar limitations as far as type restrictions are concerned. You can use any of these operators:
    -									</p>
    -
    -</html><config>  +  -  *  /  %</config><html>
    -
    -									<p>
    -										In order to express a SQL query like this one:
    -									</p>
    -									
    -</html><sql>SELECT ((1 + 2) * (5 - 3) / 2) % 10 FROM DUAL</sql><html>
    -							
    -									<p>
    -										You can write something like this in jOOQ:
    -									</p>
    -									
    -</html><java>create.select(val(1).add(2).mul(val(5).sub(3)).div(2).mod(10);</java><html>
    -
    -									<h3>Datetime arithmetic expressions</h3>
    -									<p>
    -										jOOQ also supports the Oracle-style syntax for adding days to a Field&lt;? extends java.util.Date&gt; 
    -									</p>
    -
    -</html><code-pair>
    -	<sql>SELECT SYSDATE + 3 FROM DUAL;</sql><java>create.select(currentTimestamp().add(3));</java>
    -</code-pair><html>
    -
    -									<p>
    -										For more advanced datetime arithmetic, use the Factory's timestampDiff() and dateDiff() functions, as well as jOOQ's built-in SQL standard INTERVAL data type support:
    -									</p>
    -									<ul>
    -										<li>INTERVAL YEAR TO MONTH: <reference class="org.jooq.types.YearToMonth"/></li>
    -										<li>INTERVAL DAY TO SECOND: <reference class="org.jooq.types.DayToSecond"/></li>
    -									</ul>
    -								</html></content>
    -							</section>
    -							
    -							<section id="string-concatenation">
    -								<title>String concatenation</title>
    -								<content><html>
    -									<p>
    -										The SQL standard defines the concatenation operator to be an infix operator, similar to the ones we've seen in the chapter about <reference id="arithmetic-expressions" title="arithmetic expressions"/>. This operator looks like this: <code>||</code>. Some other dialects do not support this operator, but expect a <code>concat()</code> function, instead. jOOQ renders the right operator / function, depending on your <reference id="sql-dialects" title="SQL dialect"/>:
    -									</p>
    -									
    -</html><code-pair>
    -<sql>SELECT 'A' || 'B' || 'C' FROM DUAL
    --- Or in MySQL:
    -SELECT concat('A', 'B', 'C') FROM DUAL</sql><java>&#160;
    -// For all RDBMS, including MySQL:
    -create.select(concat("A", "B", "C"));
    -</java>
    -</code-pair><html>								
    -								</html></content>
    -							</section>
    -
    -							<section id="general-functions">
    -								<title>General functions</title>
    -								<content><html>
    -									<p>
    -										There are a variety of general functions supported by jOOQ As discussed in the chapter about <reference id="sql-dialects" title="SQL dialects"/> functions are mostly simulated in your database, in case they are not natively supported.
    -									</p>
    -									<p>
    -										This is a list of general functions supported by jOOQ's <reference id="factory" title="Factory"/>:
    -									</p>
    -									<ul>
    -										<li><strong>COALESCE</strong>: Get the first non-null value in a list of arguments.</li>
    -										<li><strong>NULLIF</strong>: Return NULL if both arguments are equal, or the first argument, otherwise.</li>
    -										<li><strong>NVL</strong>: Get the first non-null value among two arguments.</li>
    -										<li><strong>NVL2</strong>: Get the second argument if the first is null, or the third argument, otherwise.</li>
    -									</ul>
    -																
    -									<p>
    -										Please refer to the <reference class="org.jooq.impl.Factory" title="Factory Javadoc"/> for more details.
    -									</p>
    -								</html></content>
    -							</section>
    -							
    -							<section id="numeric-functions">
    -								<title>Numeric functions</title>
    -								<content><html>
    -									<p>
    -										Math can be done efficiently in the database before returning results to your Java application. In addition to the <reference id="arithmetic-expressions" title="arithmetic expressions" /> discussed previously, jOOQ also supports a variety of numeric functions. As discussed in the chapter about <reference id="sql-dialects" title="SQL dialects"/> numeric functions (as any function type) are mostly simulated in your database, in case they are not natively supported.
    -									</p>
    -									<p>
    -										This is a list of numeric functions supported by jOOQ's <reference id="factory" title="Factory"/>:
    -									</p>
    -									
    -									<ul>
    -										<li><strong>ABS</strong>: Get the absolute value of a value.</li>
    -										<li><strong>ACOS</strong>: Get the arc cosine of a value.</li>
    -										<li><strong>ASIN</strong>: Get the arc sine of a value.</li>
    -										<li><strong>ATAN</strong>: Get the arc tangent of a value.</li>
    -										<li><strong>ATAN2</strong>: Get the atan2 function of two values.</li>
    -										<li><strong>CEIL</strong>: Get the smalles integer value larger than a given numeric value.</li>
    -										<li><strong>COS</strong>: Get the cosine of a value.</li>
    -										<li><strong>COSH</strong>: Get the hyperbolic cosine of a value.</li>
    -										<li><strong>COT</strong>: Get the cotangent of a value.</li>
    -										<li><strong>COTH</strong>: Get the hyperbolic cotangent of a value.</li>
    -										<li><strong>DEG</strong>: Transform radians into degrees.</li>
    -										<li><strong>EXP</strong>: Calculate e^value.</li>
    -										<li><strong>FLOOR</strong>: Get the largest integer value smaller than a given numeric value.</li>
    -										<li><strong>GREATEST</strong>: Finds the greatest among all argument values (can also be used with non-numeric values).</li>
    -										<li><strong>LEAST</strong>: Finds the least among all argument values (can also be used with non-numeric values).</li>
    -										<li><strong>LN</strong>: Get the natural logarithm of a value.</li>
    -										<li><strong>LOG</strong>: Get the logarithm of a value given a base.</li>
    -										<li><strong>POWER</strong>: Calculate value^exponent.</li>
    -										<li><strong>RAD</strong>: Transform degrees into radians.</li>
    -										<li><strong>RAND</strong>: Get a random number.</li>
    -										<li><strong>ROUND</strong>: Rounds a value to the nearest integer.</li>
    -										<li><strong>SIGN</strong>: Get the sign of a value (-1, 0, 1).</li>
    -										<li><strong>SIN</strong>: Get the sine of a value.</li>
    -										<li><strong>SINH</strong>: Get the hyperbolic sine of a value.</li>
    -										<li><strong>SQRT</strong>: Calculate the square root of a value.</li>
    -										<li><strong>TAN</strong>: Get the tangent of a value.</li>
    -										<li><strong>TANH</strong>: Get the hyperbolic tangent of a value.</li>
    -										<li><strong>TRUNC</strong>: Truncate the decimals off a given value.</li>
    -									</ul>
    -									
    -									<p>
    -										Please refer to the <reference class="org.jooq.impl.Factory" title="Factory Javadoc"/> for more details.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="bitwise-functions">
    -								<title>Bitwise functions</title>
    -								<content><html>
    -									<p>
    -										Interestingly, bitwise functions and bitwise arithmetic is not very popular among SQL databases. Most databases only support a few bitwise operations, while others ship with the full set of operators. jOOQ's API includes most bitwise operations as listed below. In order to avoid ambiguities with <reference id="conditional-expressions" title="conditional operators"/>, all bitwise functions are prefixed with "bit"
    -									</p>
    -									<ul>
    -										<li><strong>BIT_COUNT</strong>: Count the number of bits set to 1 in a number</li>
    -										<li><strong>BIT_AND</strong>: Set only those bits that are set in two numbers</li>
    -										<li><strong>BIT_OR</strong>: Set all bits that are set in at least one number</li>
    -										<li><strong>BIT_NAND</strong>: Set only those bits that are set in two numbers, and inverse the result</li>
    -										<li><strong>BIT_NOR</strong>: Set all bits that are set in at least one number, and inverse the result</li>
    -										<li><strong>BIT_NOT</strong>: Inverse the bits in a number</li>
    -										<li><strong>BIT_XOR</strong>: Set all bits that are set in at exactly one number</li>
    -										<li><strong>BIT_XNOR</strong>: Set all bits that are set in at exactly one number, and inverse the result</li>
    -										<li><strong>SHL</strong>: Shift bits to the left</li>
    -										<li><strong>SHR</strong>: Shift bits to the right</li>
    -									</ul>
    -									
    -									<h3>Some background about bitwise operation simulation</h3>
    -									<p>
    -										As stated before, not all databases support all of these bitwise operations. jOOQ simulates them wherever this is possible. More details can be seen in this blog post: <br/>
    -										<a href="http://blog.jooq.org/2011/10/30/the-comprehensive-sql-bitwise-operations-compatibility-list/">http://blog.jooq.org/2011/10/30/the-comprehensive-sql-bitwise-operations-compatibility-list/</a>
    -									</p>
    -									
    -								</html></content>
    -							</section>
    -
    -							<section id="string-functions">
    -								<title>String functions</title>
    -								<content><html>
    -									<p>
    -										String formatting can be done efficiently in the database before returning results to your Java application. As discussed in the chapter about <reference id="sql-dialects" title="SQL dialects"/> string functions (as any function type) are mostly simulated in your database, in case they are not natively supported.
    -									</p>
    -									<p>
    -										This is a list of numeric functions supported by jOOQ's <reference id="factory" title="Factory"/>:
    -									</p>
    -									
    -									<ul>
    -										<li><strong>ASCII</strong>: Get the ASCII code of a character.</li>
    -										<li><strong>BIT_LENGTH</strong>: Get the length of a string in bits.</li>
    -										<li><strong>CHAR_LENGTH</strong>: Get the length of a string in characters.</li>
    -										<li><strong>CONCAT</strong>: Concatenate several strings.</li>
    -										<li><strong>ESCAPE</strong>: Escape a string for use with the <reference id="like-predicate" title="LIKE predicate"/>.</li>
    -										<li><strong>LENGTH</strong>: Get the length of a string.</li>
    -										<li><strong>LOWER</strong>: Get a string in lower case letters.</li>
    -										<li><strong>LPAD</strong>: Pad a string on the left side.</li>
    -										<li><strong>LTRIM</strong>: Trim a string on the left side.</li>
    -										<li><strong>OCTET_LENGTH</strong>: Get the length of a string in octets.</li>
    -										<li><strong>POSITION</strong>: Find a string within another string.</li>
    -										<li><strong>REPEAT</strong>: Repeat a string a given number of times.</li>
    -										<li><strong>REPLACE</strong>: Replace a string within another string.</li>
    -										<li><strong>RPAD</strong>: Pad a string on the right side.</li>
    -										<li><strong>RTRIM</strong>: Trim a string on the right side.</li>
    -										<li><strong>SUBSTRING</strong>: Get a substring of a string.</li>
    -										<li><strong>TRIM</strong>: Trim a string on both sides.</li>
    -										<li><strong>UPPER</strong>: Get a string in upper case letters.</li>
    -									</ul>
    -									
    -									<p>
    -										Please refer to the <reference class="org.jooq.impl.Factory" title="Factory Javadoc"/> for more details.
    -									</p>
    -									
    -									<h3>Regular expressions, REGEXP, REGEXP_LIKE, etc.</h3>
    -									<p>
    -										Various databases have some means of searching through columns using regular expressions if the <reference id="like-predicate" title="LIKE predicate"/> does not provide sufficient pattern matching power. While there are many different functions and operators in the various databases, jOOQ settled for the SQL:2008 standard REGEX_LIKE operator. Being an operator (and not a function), you should use the corresponding method on <reference class="org.jooq.Field"/>:
    -									</p>
    -									
    -</html><java><![CDATA[create.selectFrom(BOOK).where(TITLE.likeRegex("^.*SQL.*$"));]]></java><html>
    -
    -									<p>
    -										Note that the SQL standard specifies that patterns should follow the XQuery standards. In the real world, the POSIX regular expression standard is the most used one, some use Java regular expressions, and only a few ones use Perl regular expressions. jOOQ does not make any assumptions about regular expression syntax. For cross-database compatibility, please read the relevant database manuals carefully, to learn about the appropriate syntax. Please refer to the <reference class="org.jooq.impl.Factory" title="Factory Javadoc"/> for more details.
    -									</p>
    -								</html></content>
    -								<!-- don't forget regex here! -->
    -							</section>
    -
    -							<section id="date-and-time-functions">
    -								<title>Date and time functions</title>
    -								<content><html>
    -									<p>
    -										This is a list of date and time functions supported by jOOQ's <reference id="factory" title="Factory"/>:
    -									</p>
    -									
    -									<ul>
    -										<li><strong>CURRENT_DATE</strong>: Get current date as a DATE object.</li>
    -										<li><strong>CURRENT_TIME</strong>: Get current time as a TIME object.</li>
    -										<li><strong>CURRENT_TIMESTAMP</strong>: Get current date as a TIMESTAMP object.</li>
    -										<li><strong>DATE_ADD</strong>: Add a number of days or an interval to a date.</li>
    -										<li><strong>DATE_DIFF</strong>: Get the difference in days between two dates.</li>
    -										<li><strong>TIMESTAMP_ADD</strong>: Add a number of days or an interval to a timestamp.</li>
    -										<li><strong>TIMESTAMP_DIFF</strong>: Get the difference as an INTERVAL DAY TO SECOND between two dates.</li>
    -									</ul>
    -									
    -									<h3>Intervals in jOOQ</h3>
    -									<p>
    -										jOOQ fills a gap opened by JDBC, which neglects an important SQL data type as defined by the SQL standards: INTERVAL types. See the manual's section about <reference id="data-types-intervals" title="INTERVAL data types"/> for more details.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="system-functions">
    -								<title>System functions</title>
    -								<content><html>
    -									<p>
    -										This is a list of system functions supported by jOOQ's <reference id="factory" title="Factory"/>:
    -									</p>
    -									<ul>
    -										<li><strong>CURRENT_USER</strong>: Get current user.</li>
    -									</ul>
    -								</html></content>
    -							</section>
    -
    -							<section id="aggregate-functions">
    -								<title>Aggregate functions</title>
    -								<content><html>
    -									<p>
    -										Aggregate functions work just like functions, even if they have a slightly different semantics. Here are some example aggregate functions from the <reference id="factory" title="Factory"/>:
    -									</p>
    -
    -</html><java><![CDATA[// Every-day, SQL standard aggregate functions
    -AggregateFunction<Integer>    count();
    -AggregateFunction<Integer>    count(Field<?> field);
    -AggregateFunction<T>          max  (Field<T> field);
    -AggregateFunction<T>          min  (Field<T> field);
    -AggregateFunction<BigDecimal> sum  (Field<? extends Number> field);
    -AggregateFunction<BigDecimal> avg  (Field<? extends Number> field);
    -
    -// DISTINCT keyword in aggregate functions
    -AggregateFunction<Integer>    countDistinct(Field<?> field);
    -AggregateFunction<T>          maxDistinct  (Field<T> field);
    -AggregateFunction<T>          minDistinct  (Field<T> field);
    -AggregateFunction<BigDecimal> sumDistinct  (Field<? extends Number> field);
    -AggregateFunction<BigDecimal> avgDistinct  (Field<? extends Number> field);
    -
    -// String aggregate functions
    -AggregateFunction<String> groupConcat        (Field<?> field);
    -AggregateFunction<String> groupConcatDistinct(Field<?> field);
    -OrderedAggregateFunction<String> listAgg(Field<?> field);
    -OrderedAggregateFunction<String> listAgg(Field<?> field, String separator);
    -
    -// Statistical functions
    -AggregateFunction<BigDecimal> median    (Field<? extends Number> field);
    -AggregateFunction<BigDecimal> stddevPop (Field<? extends Number> field);
    -AggregateFunction<BigDecimal> stddevSamp(Field<? extends Number> field);
    -AggregateFunction<BigDecimal> varPop    (Field<? extends Number> field);
    -AggregateFunction<BigDecimal> varSamp   (Field<? extends Number> field);
    -
    -// Linear regression functions
    -AggregateFunction<BigDecimal> regrAvgX     (Field<? extends Number> y, Field<? extends Number> x);
    -AggregateFunction<BigDecimal> regrAvgY     (Field<? extends Number> y, Field<? extends Number> x);
    -AggregateFunction<BigDecimal> regrCount    (Field<? extends Number> y, Field<? extends Number> x);
    -AggregateFunction<BigDecimal> regrIntercept(Field<? extends Number> y, Field<? extends Number> x);
    -AggregateFunction<BigDecimal> regrR2       (Field<? extends Number> y, Field<? extends Number> x);
    -AggregateFunction<BigDecimal> regrSlope    (Field<? extends Number> y, Field<? extends Number> x);
    -AggregateFunction<BigDecimal> regrSXX      (Field<? extends Number> y, Field<? extends Number> x);
    -AggregateFunction<BigDecimal> regrSXY      (Field<? extends Number> y, Field<? extends Number> x);
    -AggregateFunction<BigDecimal> regrSYY      (Field<? extends Number> y, Field<? extends Number> x);]]></java><html>
    -
    -									<p>
    -										Here's an example, counting the number of books any author has written:
    -									</p>
    -
    -</html><code-pair>
    -<sql>SELECT AUTHOR_ID, COUNT(*)
    -FROM BOOK
    -GROUP BY AUTHOR_ID</sql><java>create.select(BOOK.AUTHOR_ID, count())
    -      .from(BOOK)
    -      .groupBy(BOOK.AUTHOR_ID);</java>
    -</code-pair><html>
    -
    -									<p>
    -										Aggregate functions have strong limitations about when they may be used and when not. For instance, you can use aggregate functions in scalar queries. Typically, this means you only select aggregate functions, no <reference id="table-columns" title="regular columns"/> or other <reference id="column-expressions" title="column expressions"/>. Another use case is to use them along with a <reference id="group-by-clause" title="GROUP BY clause"/> as seen in the previous example. Note, that jOOQ does not check whether your using of aggregate functions is correct according to the SQL standards, or according to your database's behaviour.
    -									</p>
    -
    -		                            <h3>Ordered aggregate functions</h3>
    -		                            <p>
    -		                            	Oracle and some other databases support "ordered aggregate functions". This means you can provide an ORDER BY clause to an aggregate function, which will be taken into consideration when aggregating. The best example for this is Oracle's <code>LISTAGG()</code> (also known as <code>GROUP_CONCAT</code> in other <reference id="sql-dialects" title="SQL dialects"/>). The following query groups by authors and concatenates their books' titles
    -		                           	</p>
    -</html><code-pair>
    -<sql>SELECT   LISTAGG(TITLE, ', ')
    -         WITHIN GROUP (ORDER BY TITLE)
    -FROM     BOOK
    -GROUP BY AUTHOR_ID</sql><java>create.select(listAgg(BOOK.TITLE, ", ")
    -      .withinGroupOrderBy(BOOK.TITLE))
    -      .from(BOOK)
    -      .groupBy(BOOK.AUTHOR_ID)</java>
    -</code-pair><html>
    -
    -									<p>
    -										The above query might yield:
    -									</p>
    -
    -</html><text>+---------------------+
    -| LISTAGG             |
    -+---------------------+
    -| 1984, Animal Farm   |
    -| O Alquimista, Brida |
    -+---------------------+</text><html>
    -
    -									<h3>FIRST and LAST: Oracle's "ranked" aggregate functions</h3>
    -									<p>
    -										Oracle allows for restricting aggregate functions using the <code>KEEP()</code> clause, which is supported by jOOQ. In Oracle, some aggregate functions (MIN, MAX, SUM, AVG, COUNT, VARIANCE, or STDDEV) can be restricted by this clause, hence <reference class="org.jooq.AggregateFunction"/> also allows for specifying it. Here are a couple of examples using this clause:
    -									</p>
    -
    -</html><code-pair>
    -<sql>SUM(BOOK.AMOUNT_SOLD)
    -  KEEP(DENSE_RANK FIRST ORDER BY BOOK.AUTHOR_ID)</sql><java>sum(BOOK.AMOUNT_SOLD)
    -  .keepDenseRankFirstOrderBy(BOOK.AUTHOR_ID)</java>
    -</code-pair><html>
    -
    -									<h3>User-defined aggregate functions</h3>
    -									<p>
    -										jOOQ also supports using your own user-defined aggregate functions. See the manual's section about <reference id="user-defined-aggregate-functions" title="user-defined aggregate functions"/> for more details.
    -									</p>
    -
    -									<h3>Window functions / analytical functions</h3>
    -									<p>
    -										In those databases that support <reference id="window-functions" title="window functions"/>, jOOQ's <reference class="org.jooq.AggregateFunction"/> can be transformed into a window function / analytical function by calling <code>over()</code> on it. See the manual's section about <reference id="window-functions" title="window functions"/> for more details.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="window-functions">
    -								<title>Window functions</title>
    -								<content><html>
    -									<p>
    -										Most major RDBMS support the concept of window functions. jOOQ knows of implementations in DB2, Oracle, Postgres, SQL Server, and Sybase SQL Anywhere, and supports most of their specific syntaxes. Note, that H2 and HSQLDB have implemented <code>ROW_NUMBER()</code> functions, without true windowing support.
    -									</p>
    -									<p>
    -										As previously discussed, any <reference class="org.jooq.AggregateFunction"/> can be transformed into a window function using the <code>over()</code> method. See the chapter about <reference id="aggregate-functions" title="aggregate functions"/> for details. In addition to those, there are also some more window functions supported by jOOQ, as declared in the <reference id="factory" title="Factory"/>:
    -									</p>
    -
    -</html><java><![CDATA[// Ranking functions
    -    WindowOverStep<Integer>    rowNumber();
    -    WindowOverStep<Integer>    rank();
    -    WindowOverStep<Integer>    denseRank();
    -    WindowOverStep<BigDecimal> percentRank();
    -    
    -// Windowing functions
    -<T> WindowIgnoreNullsStep<T>   firstValue(Field<T> field);
    -<T> WindowIgnoreNullsStep<T>   lastValue(Field<T> field)
    -<T> WindowIgnoreNullsStep<T>   lead(Field<T> field);
    -<T> WindowIgnoreNullsStep<T>   lead(Field<T> field, int offset);
    -<T> WindowIgnoreNullsStep<T>   lead(Field<T> field, int offset, T defaultValue);
    -<T> WindowIgnoreNullsStep<T>   lead(Field<T> field, int offset, Field<T> defaultValue);
    -<T> WindowIgnoreNullsStep<T>   lag(Field<T> field);
    -<T> WindowIgnoreNullsStep<T>   lag(Field<T> field, int offset);
    -<T> WindowIgnoreNullsStep<T>   lag(Field<T> field, int offset, T defaultValue);
    -<T> WindowIgnoreNullsStep<T>   lag(Field<T> field, int offset, Field<T> defaultValue);
    -
    -// Statistical functions
    -    WindowOverStep<BigDecimal> cumeDist();
    -    WindowOverStep<Integer>    ntile(int number);]]></java><html>	
    -    								
    -    								<p>
    -    									SQL distinguishes between various window function types (e.g. "ranking functions"). Depending on the function, SQL expects mandatory <code>PARTITION BY</code> or <code>ORDER BY</code> clauses within the <code>OVER()</code> clause. jOOQ does not enforce those rules for two reasons:
    -    								</p>
    -    								<ul>
    -    									<li>Your JDBC driver or database already checks SQL syntax semantics</li>
    -    									<li>Not all databases behave correctly according to the SQL standard</li>
    -    								</ul>
    -    								<p>
    -    									If possible, however, jOOQ tries to render missing clauses for you, if a given <reference id="sql-dialects" title="SQL dialect"/> is more restrictive.
    -    								</p>
    -    								<h3>Some examples</h3>
    -									<p>
    -										 Here are some simple examples of window functions with jOOQ:
    -									</p>
    -									
    -</html><code-pair>
    -<sql>-- Sample uses of ROW_NUMBER()
    -ROW_NUMBER() OVER()
    -ROW_NUMBER() OVER(PARTITION BY 1)
    -ROW_NUMBER() OVER(ORDER BY BOOK.ID)
    -ROW_NUMBER() OVER(PARTITION BY BOOK.AUTHOR_ID ORDER BY BOOK.ID)
    -                  
    --- Sample uses of FIRST_VALUE
    -FIRST_VALUE(BOOK.ID) OVER()
    -FIRST_VALUE(BOOK.ID IGNORE NULLS) OVER()
    -FIRST_VALUE(BOOK.ID RESPECT NULLS) OVER()
    -</sql><java>// Sample uses of rowNumber()
    -rowNumber().over()
    -rowNumber().over().partitionByOne()
    -rowNumber().over().partitionBy(BOOK.AUTHOR_ID)
    -rowNumber().over().partitionBy(BOOK.AUTHOR_ID).orderBy(BOOK.ID)
    -                  
    -// Sample uses of firstValue()
    -firstValue(BOOK.ID).over()
    -firstValue(BOOK.ID).ignoreNulls().over()
    -firstValue(BOOK.ID).respectNulls().over()
    -</java>
    -</code-pair><html>
    -    								
    -									<h3>An advanced window function example</h3>
    -									<p>
    -										Window functions can be used for things like calculating a "running total". The following example fetches transactions and the running total for every transaction going back to the beginning of the transaction table (ordered by booked_at). Window functions are accessible from the previously seen <reference class="org.jooq.AggregateFunction"/> type using the <code>over()</code> method:
    -									</p>
    -
    -</html><code-pair>
    -<sql>SELECT booked_at, amount,
    -   SUM(amount) OVER (PARTITION BY 1
    -                     ORDER BY booked_at
    -                     ROWS BETWEEN UNBOUNDED PRECEDING
    -                     AND CURRENT ROW) AS total
    -  FROM transactions</sql><java>create.select(t.BOOKED_AT, t.AMOUNT,
    -         sum(t.AMOUNT).over().partitionByOne()
    -                      .orderBy(t.BOOKED_AT)
    -                      .rowsBetweenUnboundedPreceding()
    -                      .andCurrentRow().as("total")
    -      .from(TRANSACTIONS.as("t"));</java>
    -</code-pair><html>
    -
    -
    -									<h3>Window functions created from ordered aggregate functions</h3>
    -									<p>
    -										In the previous chapter about <reference id="aggregate-functions" title="aggregate functions"/>, we have seen the concept of "ordered aggregate functions", such as Oracle's <code>LISTAGG()</code>. These functions have a window function / analytical function variant, as well. For example:
    -									</p>
    -									
    -</html><code-pair>
    -<sql>SELECT   LISTAGG(TITLE, ', ')
    -         WITHIN GROUP (ORDER BY TITLE)
    -         OVER (PARTITION BY BOOK.AUTHOR_ID)
    -FROM     BOOK</sql><java>create.select(listAgg(BOOK.TITLE, ", ")
    -      .withinGroupOrderBy(BOOK.TITLE)
    -      .over().partitionBy(BOOK.AUTHOR_ID))
    -      .from(BOOK)</java>
    -</code-pair><html>
    -
    -									<h3>Window functions created from Oracle's FIRST and LAST aggregate functions</h3>
    -									<p>
    -										In the previous chapter about <reference id="aggregate-functions" title="aggregate functions"/>, we have seen the concept of "FIRST and LAST aggregate functions". These functions have a window function / analytical function variant, as well. For example:
    -									</p>
    -
    -</html><code-pair>
    -<sql>SUM(BOOK.AMOUNT_SOLD)
    -  KEEP(DENSE_RANK FIRST ORDER BY BOOK.AUTHOR_ID)
    -  OVER(PARTITION BY 1)</sql><java>sum(BOOK.AMOUNT_SOLD)
    -  .keepDenseRankFirstOrderBy(BOOK.AUTHOR_ID)
    -  .over().partitionByOne()</java>
    -</code-pair><html>
    -
    -
    -									<h3>Window functions created from user-defined aggregate functions</h3>
    -									<p>
    -										User-defined aggregate functions also implement <reference class="org.jooq.AggregateFunction"/>, hence they can also be transformed into window functions using <code>over()</code>. This is supported by Oracle in particular. See the manual's section about <reference id="user-defined-aggregate-functions" title="user-defined aggregate functions"/> for more details.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="grouping-functions">
    -								<title>Grouping functions</title>
    -								<content><html>
    -									<h3>ROLLUP() explained in SQL</h3>
    -									<p>
    -										The SQL standard defines special functions that can be used in the <reference id="group-by-clause" title="GROUP BY clause"/>: the grouping functions. These functions can be used to generate several groupings in a single clause. This can best be explained in SQL. Let's take ROLLUP() for instance:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[-- ROLLUP() with one argument 
    -SELECT AUTHOR_ID, COUNT(*)
    -FROM BOOK
    -GROUP BY ROLLUP(AUTHOR_ID)
    -
    -
    --- ROLLUP() with two arguments
    -SELECT AUTHOR_ID, PUBLISHED_IN, COUNT(*)
    -FROM BOOK
    -GROUP BY ROLLUP(AUTHOR_ID, PUBLISHED_IN)
    -
    -
    -
    -
    -
    -
    -
    -]]></sql><sql><![CDATA[-- The same query using UNION ALL:
    -  SELECT AUTHOR_ID, COUNT(*) FROM BOOK GROUP BY (AUTHOR_ID)
    -UNION ALL
    -  SELECT NULL, COUNT(*) FROM BOOK GROUP BY ()
    -ORDER BY 1 NULLS LAST
    -
    --- The same query using UNION ALL:
    -  SELECT AUTHOR_ID, PUBLISHED_IN, COUNT(*) 
    -  FROM BOOK GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -UNION ALL
    -  SELECT AUTHOR_ID, NULL, COUNT(*) 
    -  FROM BOOK GROUP BY (AUTHOR_ID)
    -UNION ALL
    -  SELECT NULL, NULL, COUNT(*) 
    -  FROM BOOK GROUP BY ()
    -ORDER BY 1 NULLS LAST, 2 NULLS LAST
    -]]></sql>
    -</code-pair><html>
    -
    -									<p>
    -										In English, the <code>ROLLUP()</code> grouping function provides <code>N+1</code> groupings, when <code>N</code> is the number of arguments to the <code>ROLLUP()</code> function. Each grouping has an additional group field from the <code>ROLLUP()</code> argument field list. The results of the second query might look something like this:
    -									</p>
    -									
    -</html><text><![CDATA[+-----------+--------------+----------+
    -| AUTHOR_ID | PUBLISHED_IN | COUNT(*) |
    -+-----------+--------------+----------+
    -|         1 |         1945 |        1 | <- GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -|         1 |         1948 |        1 | <- GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -|         1 |         NULL |        2 | <- GROUP BY (AUTHOR_ID)
    -|         2 |         1988 |        1 | <- GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -|         2 |         1990 |        1 | <- GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -|         2 |         NULL |        2 | <- GROUP BY (AUTHOR_ID)
    -|      NULL |         NULL |        4 | <- GROUP BY ()
    -+-----------+--------------+----------+]]></text><html>
    -
    -									<h3>CUBE() explained in SQL</h3>
    -									<p>
    -										<code>CUBE()</code> is different from <code>ROLLUP()</code> in the way that it doesn't just create <code>N+1</code> groupings, it creates all <code>2^N</code> possible combinations between all group fields in the <code>CUBE()</code> function argument list. Let's re-consider our second query from before:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[-- CUBE() with two arguments
    -SELECT AUTHOR_ID, PUBLISHED_IN, COUNT(*)
    -FROM BOOK
    -GROUP BY CUBE(AUTHOR_ID, PUBLISHED_IN)
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -]]></sql><sql><![CDATA[-- The same query using UNION ALL:
    -  SELECT AUTHOR_ID, PUBLISHED_IN, COUNT(*) 
    -  FROM BOOK GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -UNION ALL
    -  SELECT AUTHOR_ID, NULL, COUNT(*) 
    -  FROM BOOK GROUP BY (AUTHOR_ID)
    -UNION ALL
    -  SELECT NULL, PUBLISHED_IN, COUNT(*) 
    -  FROM BOOK GROUP BY (PUBLISHED_IN)
    -UNION ALL
    -  SELECT NULL, NULL, COUNT(*) 
    -  FROM BOOK GROUP BY ()
    -ORDER BY 1 NULLS FIRST, 2 NULLS FIRST
    -]]></sql>
    -</code-pair><html>
    -
    -									<p>
    -										The results would then hold:
    -									</p>
    -
    -</html><text><![CDATA[+-----------+--------------+----------+
    -| AUTHOR_ID | PUBLISHED_IN | COUNT(*) |
    -+-----------+--------------+----------+
    -|      NULL |         NULL |        2 | <- GROUP BY ()
    -|      NULL |         1945 |        1 | <- GROUP BY (PUBLISHED_IN)
    -|      NULL |         1948 |        1 | <- GROUP BY (PUBLISHED_IN)
    -|      NULL |         1988 |        1 | <- GROUP BY (PUBLISHED_IN)
    -|      NULL |         1990 |        1 | <- GROUP BY (PUBLISHED_IN)
    -|         1 |         NULL |        2 | <- GROUP BY (AUTHOR_ID)
    -|         1 |         1945 |        1 | <- GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -|         1 |         1948 |        1 | <- GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -|         2 |         NULL |        2 | <- GROUP BY (AUTHOR_ID)
    -|         2 |         1988 |        1 | <- GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -|         2 |         1990 |        1 | <- GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -+-----------+--------------+----------+]]></text><html>
    -
    -									<h3>GROUPING SETS()</h3>
    -									<p>
    -										<code>GROUPING SETS()</code> are the generalised way to create multiple groupings. From our previous examples 
    -									</p>
    -									<ul>
    -										<li><code>ROLLUP(AUTHOR_ID, PUBLISHED_IN)</code> corresponds to <code>GROUPING SETS((AUTHOR_ID, PUBLISHED_IN), (AUTHOR_ID), ())</code></li>
    -										<li><code>CUBE(AUTHOR_ID, PUBLISHED_IN)</code> corresponds to <code>GROUPING SETS((AUTHOR_ID, PUBLISHED_IN), (AUTHOR_ID), (PUBLISHED_IN), ())</code></li>
    -									</ul>
    -									<p>
    -										This is nicely explained in the SQL Server manual pages about <code>GROUPING SETS()</code> and other grouping functions:<br/>
    -										<a href="http://msdn.microsoft.com/en-us/library/bb510427(v=sql.105)">http://msdn.microsoft.com/en-us/library/bb510427(v=sql.105)</a>
    -									</p>
    -									
    -									<h3>jOOQ's support for ROLLUP(), CUBE(), GROUPING SETS()</h3>
    -									<p>
    -										jOOQ fully supports all of these functions, as well as the utility functions <code>GROUPING()</code> and <code>GROUPING_ID()</code>, used for identifying the grouping set ID of a record. The <reference id="factory" title="Factory API"/> thus includes:
    -									</p>
    -									
    -</html><java><![CDATA[// The various grouping function constructors
    -Field<?> rollup(Field<?>... fields);
    -Field<?> cube(Field<?>... fields);
    -Field<?> groupingSets(Field<?>... fields);
    -Field<?> groupingSets(Field<?>[]... fields);
    -Field<?> groupingSets(Collection<Field<?>>... fields);
    -
    -// The utility functions generating IDs per GROUPING SET
    -Field<Integer> grouping(Field<?>);
    -Field<Integer> groupingId(Field<?>...);]]></java><html>
    -
    -									<h3>MySQL's and CUBRID's WITH ROLLUP syntax</h3>
    -									<p>
    -										MySQL and CUBRID don't know any grouping functions, but they support a <code>WITH ROLLUP</code> clause, that is equivalent to simple <code>ROLLUP()</code> grouping functions. jOOQ simulates <code>ROLLUP()</code> in MySQL and CUBRID, by rendering this <code>WITH ROLLUP</code> clause. The following two statements mean the same:
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[-- Statement 1: SQL standard
    -GROUP BY ROLLUP(A, B, C)
    -
    --- Statement 2: SQL standard
    -GROUP BY A, ROLLUP(B, C)]]></sql><sql><![CDATA[-- Statement 1: MySQL
    -GROUP BY A, B, C WITH ROLLUP
    -
    --- Statement 2: MySQL
    --- This is not supported in MySQL]]></sql>
    -</code-pair><html>
    -								</html></content>
    -							</section>
    -
    -							<section id="user-defined-functions">
    -								<title>User-defined functions</title>
    -								<content><html>
    -									<p>
    -										Some databases support user-defined functions, which can be embedded in any SQL statement, if you're using jOOQ's <reference id="code-generation" title="code generator"/>. Let's say you have the following simple function in Oracle SQL:
    -									</p>
    -									
    -</html><sql><![CDATA[CREATE OR REPLACE FUNCTION echo (INPUT NUMBER)
    -RETURN NUMBER
    -IS
    -BEGIN
    -    RETURN INPUT;
    -END echo;
    -]]></sql><html>
    -
    -                                    <p>
    -                                    	The above function will be made available from a generated <reference id="codegen-procedures" title="Routines"/> class. You can use it like any other <reference id="column-expressions" title="column expression"/>:
    -                                    </p>
    -                                    
    -</html><code-pair>
    -<sql><![CDATA[SELECT echo(1) FROM DUAL WHERE echo(2) = 2]]></sql><java><![CDATA[create.select(echo(1)).where(echo(2).equal(2));]]></java>
    -</code-pair><html>
    -                                
    -                                	<p>
    -                                		Note that user-defined functions returning <reference id="data-types-cursors" title="CURSOR"/> or <reference id="data-types-arrays" title="ARRAY"/> data types can also be used wherever <reference id="table-expressions" title="table expressions"/> can be used, if they are <reference id="array-and-cursor-unnesting" title="unnested"/>
    -                                	</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="user-defined-aggregate-functions">
    -								<title>User-defined aggregate functions</title>
    -								<content><html>
    -									<p>
    -										Some databases support user-defined aggregate functions, which can then be used along with <reference id="group-by-clause" title="GROUP BY clauses"/> or as <reference id="window-functions" title="window functions"/>. An example for such a database is Oracle. With Oracle, you can define the following OBJECT type (the example was taken from the <a href="http://docs.oracle.com/cd/B28359_01/appdev.111/b28425/ext_agg_ref.htm">Oracle 11g documentation</a>): 
    -									</p>
    -									
    -</html><sql><![CDATA[CREATE TYPE U_SECOND_MAX AS OBJECT
    -(
    -  MAX NUMBER, -- highest value seen so far
    -  SECMAX NUMBER, -- second highest value seen so far
    -  STATIC FUNCTION ODCIAggregateInitialize(sctx IN OUT U_SECOND_MAX) RETURN NUMBER,
    -  MEMBER FUNCTION ODCIAggregateIterate(self IN OUT U_SECOND_MAX, value IN NUMBER) RETURN NUMBER,
    -  MEMBER FUNCTION ODCIAggregateTerminate(self IN U_SECOND_MAX, returnValue OUT NUMBER, flags IN NUMBER) RETURN NUMBER,
    -  MEMBER FUNCTION ODCIAggregateMerge(self IN OUT U_SECOND_MAX, ctx2 IN U_SECOND_MAX) RETURN NUMBER
    -);
    -
    -CREATE OR REPLACE TYPE BODY U_SECOND_MAX IS
    -STATIC FUNCTION ODCIAggregateInitialize(sctx IN OUT U_SECOND_MAX)
    -RETURN NUMBER IS
    -BEGIN
    -  SCTX := U_SECOND_MAX(0, 0);
    -  RETURN ODCIConst.Success;
    -END;
    -
    -MEMBER FUNCTION ODCIAggregateIterate(self IN OUT U_SECOND_MAX, value IN NUMBER) RETURN NUMBER IS
    -BEGIN
    -  IF VALUE > SELF.MAX THEN
    -    SELF.SECMAX := SELF.MAX;
    -    SELF.MAX := VALUE;
    -  ELSIF VALUE > SELF.SECMAX THEN
    -    SELF.SECMAX := VALUE;
    -  END IF;
    -  RETURN ODCIConst.Success;
    -END;
    -
    -MEMBER FUNCTION ODCIAggregateTerminate(self IN U_SECOND_MAX, returnValue OUT NUMBER, flags IN NUMBER) RETURN NUMBER IS
    -BEGIN
    -  RETURNVALUE := SELF.SECMAX;
    -  RETURN ODCIConst.Success;
    -END;
    -
    -MEMBER FUNCTION ODCIAggregateMerge(self IN OUT U_SECOND_MAX, ctx2 IN U_SECOND_MAX) RETURN NUMBER IS
    -BEGIN
    -  IF CTX2.MAX > SELF.MAX THEN
    -    IF CTX2.SECMAX > SELF.SECMAX THEN
    -      SELF.SECMAX := CTX2.SECMAX;
    -    ELSE
    -      SELF.SECMAX := SELF.MAX;
    -    END IF;
    -    SELF.MAX := CTX2.MAX;
    -  ELSIF CTX2.MAX > SELF.SECMAX THEN
    -    SELF.SECMAX := CTX2.MAX;
    -  END IF;
    -  RETURN ODCIConst.Success;
    -END;
    -END;]]></sql><html>
    -
    -									<p>
    -										The above OBJECT type is then available to function declarations as such:
    -									</p>
    -
    -</html><sql><![CDATA[
    -CREATE FUNCTION SECOND_MAX (input NUMBER) RETURN NUMBER
    -PARALLEL_ENABLE AGGREGATE USING U_SECOND_MAX;]]></sql><html>
    -
    -									<h3>Using the generated aggregate function</h3>
    -									<p>
    -										jOOQ's <reference id="code-generation" title="code generator"/> will detect such aggregate functions and generate them differently from regular <reference id="user-defined-functions" title="user-defined functions"/>. They implement the <reference class="org.jooq.AggregateFunction"/> type, as mentioned in the manual's section about <reference id="aggregate-functions" title="aggregate functions"/>. Here's how you can use the SECOND_MAX() aggregate function with jOOQ:
    -									</p>
    -				
    -</html><code-pair>					
    -<sql><![CDATA[-- Get the second-latest publishing date by author
    -SELECT SECOND_MAX(PUBLISHED_IN) 
    -FROM BOOK
    -GROUP BY AUTHOR_ID]]></sql><java><![CDATA[// Routines.secondMax() can be static-imported
    -create.select(secondMax(BOOK.PUBLISHED_IN))
    -      .from(BOOK)
    -      .groupBy(BOOK.AUTHOR_ID)]]></java>
    -</code-pair><html>
    -								</html></content>
    -							</section>
    -
    -							<section id="case-expressions">
    -								<title>The CASE expression</title>
    -								<content><html>
    -									<p>
    -										The CASE expression is part of the standard SQL syntax. While some RDBMS also offer an IF expression, or a DECODE function, you can always rely on the two types of CASE syntax:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[CASE WHEN AUTHOR.FIRST_NAME = 'Paulo'  THEN 'brazilian'
    -     WHEN AUTHOR.FIRST_NAME = 'George' THEN 'english'
    -                                       ELSE 'unknown'
    -END
    -
    --- OR:
    -
    -CASE AUTHOR.FIRST_NAME WHEN 'Paulo'  THEN 'brazilian'
    -                       WHEN 'George' THEN 'english'
    -                                     ELSE 'unknown'
    -END]]></sql><java><![CDATA[create.decode()
    -      .when(AUTHOR.FIRST_NAME.equal("Paulo"), "brazilian")
    -      .when(AUTHOR.FIRST_NAME.equal("George"), "english")
    -      .otherwise("unknown");
    -
    -// OR:
    -
    -create.decode().value(AUTHOR.FIRST_NAME)
    -               .when("Paulo", "brazilian")
    -               .when("George", "english")
    -               .otherwise("unknown");]]></java>
    -</code-pair><html>
    -
    -								<p>
    -									In jOOQ, both syntaxes are supported (The second one is simulated in Derby, which only knows the first one). Unfortunately, both case and else are reserved words in Java. jOOQ chose to use decode() from the Oracle DECODE function, and otherwise(), which means the same as else.
    -								</p>
    -
    -								<p>
    -									A CASE expression can be used anywhere where you can place a <reference id="column-expressions" title="column expression (or Field)"/>. For instance, you can SELECT the above expression, if you're selecting from AUTHOR:
    -							 	</p>
    -
    -</html><sql>SELECT AUTHOR.FIRST_NAME, [... CASE EXPR ...] AS nationality
    -  FROM AUTHOR</sql><html>
    -
    -								<h3>The Oracle DECODE() function</h3>
    -								<p>
    -									Oracle knows a more succinct, but maybe less readable DECODE() function with a variable number of arguments. This function roughly does the same as the second case expression syntax. jOOQ supports the DECODE() function and simulates it using CASE expressions in all dialects other than Oracle:
    -								</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[-- Oracle:
    -DECODE(FIRST_NAME, 'Paulo', 'brazilian',
    -                   'George', 'english',
    -                   'unknown');
    -
    --- Other SQL dialects
    -CASE AUTHOR.FIRST_NAME WHEN 'Paulo'  THEN 'brazilian'
    -                       WHEN 'George' THEN 'english'
    -                                     ELSE 'unknown'
    -END]]></sql><java><![CDATA[
    -
    -
    -
    -
    -// Use the Oracle-style DECODE() function with jOOQ.
    -// Note, that you will not be able to rely on type-safety
    -create.decode(AUTHOR.FIRST_NAME,
    -    "Paulo", "brazilian",
    -    "George", "english",
    -    "unknown");]]></java>
    -</code-pair><html>
    -
    -		  							<h3>CASE clauses in an ORDER BY clause</h3>
    -									<p>
    -										Sort indirection is often implemented with a CASE clause of a SELECT's ORDER BY clause. See the manual's section about the <reference id="order-by-clause" title="ORDER BY clause"/> for more details.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="sequences-and-serials">
    -								<title>Sequences and serials</title>
    -								<content><html>
    -									<p>
    -										Sequences implement the <reference class="org.jooq.Sequence"/> interface, providing essentially this functionality:
    -									</p>
    -
    -</html><java><![CDATA[// Get a field for the CURRVAL sequence property
    -Field<T> currval();
    -
    -// Get a field for the NEXTVAL sequence property
    -Field<T> nextval();]]></java><html>
    -
    -									<p>
    -										So if you have a sequence like this in Oracle:
    -									</p>
    -
    -</html><sql>CREATE SEQUENCE s_author_id</sql><html>
    -
    -									<p>
    -										You can then use your <reference id="codegen-sequences" title="generated sequence"/> object directly in a SQL statement as such:
    -									</p>
    -
    -</html><java><![CDATA[// Reference the sequence in a SELECT statement:
    -BigInteger nextID = create.select(s).fetchOne(S_AUTHOR_ID.nextval());
    -
    -// Reference the sequence in an INSERT statement:
    -create.insertInto(AUTHOR, AUTHOR.ID, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -      .values(S_AUTHOR_ID.nextval(), val("William"), val("Shakespeare"));
    -]]></java><html>
    -
    -									<ul>
    -										<li>For more information about generated sequences, refer to the manual's section about <reference id="codegen-sequences" title="generated sequences"/></li>
    -										<li>For more information about executing standalone calls to sequences, refer to the manual's section about <reference id="sequence-execution" title="sequence execution"/></li>
    -									</ul>
    -								</html></content>
    -							</section>
    -							
    -							<section id="row-value-expressions">
    -								<title>Tuples or row value expressions</title>
    -								<content><html>
    -									<p>
    -										According to the SQL standard, row value expressions can have a degree of more than one. This is commonly used in the <reference id="insert-statement" title="INSERT statement"/>, where the VALUES row value constructor allows for providing a row value expression as a source for INSERT data. Row value expressions can appear in various other places, though. They are supported by jOOQ as s / rows. jOOQ's <reference id="factory" title="Factory"/> allows for the construction of type-safe s up to the degree / arity of 8. Higher-degree s are supported as well, but without any type-safety.  types are modelled as follows:
    -									</p>
    -									
    -</html><java><![CDATA[// The Factory provides overloaded row value expression constructor methods:
    -public static <T1> Row1<T1> row(T1 t1) { ... }
    -public static <T1, T2> Row2<T1, T2> row(T1 t1, T2 t2) { ... }
    -public static <T1, T2, T3> Row3<T1, T2, T3> row(T1 t1, T2 t2, T3 t3) { ... }
    -public static <T1, T2, T3, T4> Row4<T1, T2, T3, T4> row(T1 t1, T2 t2, T3 t3, T4 t4) { ... }
    -
    -// [ ... idem for Row5, Row6, Row7, Row8 ... ]
    -
    -// Degrees of more than 8 are supported without type-safety
    -public static RowN row(Object... values) { ... }]]></java><html>
    -
    -									<h3>Using row value expressions in predicates</h3>
    -                                	<p>
    -                                		Row value expressions are incompatible with most other <reference id="queryparts" title="QueryParts"/>, but they can be used as a basis for constructing various <reference id="conditional-expressions" title="conditional expressions"/>, such as <reference id="comparison-predicate" title="comparison predicates"/>, <reference id="in-predicate" title="IN predicates"/>, or the "degree 2 row value expression only" <reference id="overlaps-predicate" title="OVERLAPS predicate"/>. See the relevant sections for more details about how to use row value expressions in predicates.
    -                                	</p>
    -                                	
    -                                	<h3>Using row value expressions in UPDATE statements</h3>
    -                                	<p>
    -                                		The <reference id="update-statement" title="UPDATE statement"/> also supports a variant where row value expressions are updated, rather than single columns. See the relevant section for more details
    -                                	</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -					<section id="conditional-expressions">
    -					    <title>Conditional expressions</title>
    -						<content><html>
    -							<p>
    -								Conditions or conditional expressions are widely used in SQL and in the jOOQ API. They can be used in
    -							</p>
    -							<ul>
    -								<li>The <reference id="case-expressions" title="CASE expression"/></li>
    -								<li>The <reference id="join-clause" title="JOIN clause"/> (or JOIN .. ON clause, to be precise) of a <reference id="select-statement" title="SELECT statement"/>, <reference id="update-statement" title="UPDATE statement"/>, <reference id="delete-statement" title="DELETE statement"/></li>
    -								<li>The <reference id="where-clause" title="WHERE clause"/> of a <reference id="select-statement" title="SELECT statement"/>, <reference id="update-statement" title="UPDATE statement"/>, <reference id="delete-statement" title="DELETE statement"/></li>
    -								<li>The <reference id="connect-by-clause" title="CONNECT BY clause"/> of a <reference id="select-statement" title="SELECT statement"/></li>
    -								<li>The <reference id="having-clause" title="HAVING clause"/> of a <reference id="select-statement" title="SELECT statement"/></li>
    -								<li>The <reference id="merge-statement" title="MERGE statement"/>'s ON clause</li>
    -							</ul>
    -							
    -							<h3>Boolean types in SQL</h3>
    -							<p>
    -								Before SQL:1999, boolean types did not really exist in SQL. They were modelled by 0 and 1 numeric/char values. With SQL:1999, true booleans were introduced and are now supported by most databases. In short, these are possible boolean values:
    -							</p>
    -							<ul>
    -								<li>1 or TRUE</li>
    -								<li>0 or FALSE</li>
    -								<li>NULL or UNKNOWN</li>
    -							</ul>
    -							<p>
    -								It is important to know that SQL differs from many other languages in the way it interprets the NULL boolean value. Most importantly, the following facts are to be remembered:
    -							</p>
    -							<ul>
    -								<li>[ANY] = NULL yields NULL (not FALSE)</li>
    -								<li>[ANY] != NULL yields NULL (not TRUE)</li>
    -								<li>NULL = NULL yields NULL (not TRUE)</li>
    -								<li>NULL != NULL yields NULL (not FALSE)</li>
    -							</ul>
    -							<p>
    -								For simplified NULL handling, please refer to the section about the <reference id="distinct-predicate" title="DISTINCT predicate"/>.
    -							</p>
    -							<p>
    -								Note that jOOQ does not model these values as actual <reference id="column-expressions" title="column expression"/> compatible.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -						    <section id="condition-building">
    -							    <title>Condition building</title>
    -								<content><html>
    -									<p>
    -										With jOOQ, most <reference id="conditional-expressions" title="conditional expressions"/> are built from <reference id="column-expressions" title="column expressions"/>, calling various methods on them. For instance, to build a <reference id="comparison-predicate" title="comparison predicate"/>, you can write the following expression:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[TITLE  = 'Animal Farm'
    -TITLE != 'Animal Farm']]></sql><java><![CDATA[BOOK.TITLE.equal("Animal Farm")
    -BOOK.TITLE.notEqual("Animal Farm")]]></java>
    -</code-pair><html>
    -
    -									<h3>Create conditions from the Factory</h3>
    -									<p>
    -										There are a few types of conditions, that can be created statically from the <reference id="factory" title="Factory"/>. These are:
    -									</p>
    -									<ul>
    -										<li><reference id="plain-sql" title="plain SQL conditions"/>, that allow you to phrase your own SQL string <reference id="conditional-expressions" title="conditional expression"/></li>
    -										<li>The <reference id="exists-predicate" title="EXISTS predicate"/>, a standalone predicate that creates a conditional expression</li>
    -										<li>Constant TRUE and FALSE conditional expressions</li>
    -									</ul>
    -
    -									<h3>Connect conditions using boolean operators</h3>
    -									<p>
    -										Conditions can also be connected using <reference id="boolean-operators" title="boolean operators"/> as will be discussed in a subsequent chapter.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -						    <section id="boolean-operators">
    -							    <title>AND, OR, NOT boolean operators</title>
    -								<content><html>
    -									<p>
    -										In SQL, as in most other languages, <reference id="conditional-expressions" title="conditional expressions"/> can be connected using the AND and OR binary operators, as well as the NOT unary operator, to form new conditional expressions. In jOOQ, this is modelled as such: 
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[-- A simple conditional expression
    -TITLE = 'Animal Farm' OR TITLE = '1984'
    -
    --- A more complex conditional expression
    -        (TITLE = 'Animal Farm' OR TITLE = '1984') 
    -AND NOT (AUTHOR.LAST_NAME = 'Orwell')]]></sql><java><![CDATA[// A simple boolean connection
    -BOOK.TITLE.equal("Animal Farm").or(BOOK.TITLE.equal("1984"))
    -
    -// A more complex conditional expression
    -BOOK.TITLE.equal("Animal Farm").or(BOOK.TITLE.equal("1984"))
    -    .andNot(AUTHOR.LAST_NAME.equal("Orwell"))]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										The above example shows that the number of parentheses in Java can quickly explode. Proper indentation may become crucial in making such code readable. In order to understand how jOOQ composes combined conditional expressions, let's assign component expressions first:
    -									</p>
    -
    -</html><java><![CDATA[Condition a = BOOK.TITLE.equal("Animal Farm");
    -Condition b = BOOK.TITLE.equal("1984");
    -Condition c = AUTHOR.LAST_NAME.equal("Orwell");
    -
    -Condition combined1 = a.or(b);             // These OR-connected conditions form a new condition, wrapped in parentheses
    -Condition combined2 = combined1.andNot(c); // The left-hand side of the AND NOT () operator is already wrapped in parentheses]]></java><html>
    -
    -									<h3>The Condition API</h3>
    -									<p>
    -										Here are all boolean operators on the <reference class="org.jooq.Condition"/> interface:
    -									</p>
    -									
    -</html><java><![CDATA[and(Condition)            // Combine conditions with AND
    -and(String)               // Combine conditions with AND. Convenience for adding plain SQL to the right-hand side
    -and(String, Object...)    // Combine conditions with AND. Convenience for adding plain SQL to the right-hand side
    -and(String, QueryPart...) // Combine conditions with AND. Convenience for adding plain SQL to the right-hand side
    -andExists(Select<?>)      // Combine conditions with AND. Convenience for adding an exists predicate to the rhs
    -andNot(Condition)         // Combine conditions with AND. Convenience for adding an inverted condition to the rhs
    -andNotExists(Select<?>)   // Combine conditions with AND. Convenience for adding an inverted exists predicate to the rhs
    -
    -or(Condition)             // Combine conditions with OR
    -or(String)                // Combine conditions with OR. Convenience for adding plain SQL to the right-hand side
    -or(String, Object...)     // Combine conditions with OR. Convenience for adding plain SQL to the right-hand side
    -or(String, QueryPart...)  // Combine conditions with OR. Convenience for adding plain SQL to the right-hand side
    -orExists(Select<?>)       // Combine conditions with OR. Convenience for adding an exists predicate to the rhs
    -orNot(Condition)          // Combine conditions with OR. Convenience for adding an inverted condition to the rhs
    -orNotExists(Select<?>)    // Combine conditions with OR. Convenience for adding an inverted exists predicate to the rhs
    -
    -not()                     // Invert a condition (synonym for Factory.not(Condition)]]></java></content>
    -							</section>
    -
    -						    <section id="comparison-predicate">
    -							    <title>Comparison predicate</title>
    -								<content><html>
    -									<p>
    -										In SQL, comparison predicates are formed using common comparison operators:
    -									</p>
    -									<ul>
    -										<li><strong>=</strong> to test for equality</li>
    -										<li><strong>&lt;&gt;</strong> or <strong>!=</strong> to test for non-equality</li>
    -										<li><strong>&gt;</strong> to test for being strictly greater</li>
    -										<li><strong>&gt;=</strong> to test for being greater or equal</li>
    -										<li><strong>&lt;</strong> to test for being strictly less</li>
    -										<li><strong>&lt;=</strong> to test for being less or equal</li>
    -									</ul>
    -									
    -									<p>
    -										Unfortunately, Java does not support operator overloading, hence these operators are also implemented as methods in jOOQ, like any other SQL syntax elements. The relevant parts of the <reference class="org.jooq.Field"/> interface are these:
    -									</p>
    -									
    -</html><java><![CDATA[eq or equal(T);                  // =  (some bind value)
    -eq or equal(Field<T>);           // =  (some column expression)
    -eq or equal(Select<T>);          // =  (some scalar SELECT statement)
    -ne or notEqual(T);               // <> (some bind value)
    -ne or notEqual(Field<T>);        // <> (some column expression)
    -ne or notEqual(Select<T>);       // <> (some scalar SELECT statement)
    -lt or lessThan(T);               // <  (some bind value)
    -lt or lessThan(Field<T>);        // <  (some column expression)
    -lt or lessThan(Select<T>);       // <  (some scalar SELECT statement)
    -le or lessOrEqual(T);            // <= (some bind value)
    -le or lessOrEqual(Field<T>);     // <= (some column expression)
    -le or lessOrEqual(Select<T>);    // <= (some scalar SELECT statement)
    -gt or greaterThan(T);            // >  (some bind value)
    -gt or greaterThan(Field<T>);     // >  (some column expression)
    -gt or greaterThan(Select<T>);    // >  (some scalar SELECT statement)
    -ge or greaterOrEqual(T);         // >= (some bind value)
    -ge or greaterOrEqual(Field<T>);  // >= (some column expression)
    -ge or greaterOrEqual(Select<T>); // >= (some scalar SELECT statement)]]></java><html>
    -
    -									<p>
    -										Note that every operator is represented by two methods. A verbose one (such as equal()) and a two-character one (such as eq()). Both methods are the same. You may choose either one, depending on your taste. The manual will always use the more verbose one.
    -									</p>
    -									
    -									<h3>NULL in jOOQ's comparison predicates</h3>
    -									<p>
    -										jOOQ has a special way of dealing with null bind values, when you pass them to comparison predicates equal() and notEqual(). For convenience, jOOQ will render <reference id="null-predicate" title="IS NULL or IS NOT NULL"/> predicates.
    -									</p>
    -
    -									<h3>jOOQ's convenience methods using comparison operators</h3>
    -									<p>
    -										In addition to the above, jOOQ provides a few convenience methods for common operations performed on strings using comparison predicates:
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[-- case insensitivity
    -LOWER(TITLE)  = LOWER('animal farm')
    -LOWER(TITLE) <> LOWER('animal farm')]]></sql><java><![CDATA[// case insensitivity
    -BOOK.TITLE.equalIgnoreCase("animal farm")
    -BOOK.TITLE.notEqualIgnoreCase("animal farm")]]></java>
    -</code-pair><html>
    -								</html></content>
    -							</section>
    -
    -						    <section id="quantified-comparison-predicate">
    -							    <title>Quantified comparison predicate</title>
    -								<content><html>
    -									<p>
    -										If the right-hand side of a <reference id="comparison-predicate" title="comparison predicate"/> turns out to be a non-scalar table subquery, you can wrap that subquery in a quantifier, such as ALL, ANY, or SOME. Note that the SQL standard defines ANY and SOME to be equivalent. jOOQ settled for the more intuitive ANY and doesn't support SOME. Here are some examples, supported by jOOQ:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[TITLE = ANY('Animal Farm', '1982')
    -PUBLISHED_IN > ALL(1920, 1940)]]></sql><java><![CDATA[BOOK.TITLE.equalAny("Animal Farm", "1982");
    -BOOK.PUBLISHED_IN.greaterThanAll(1920, 1940);]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										For the example, the right-hand side of the quantified comparison predicates were filled with argument lists. But it is easy to imagine that the source of values results from a <reference id="nested-selects" title="subselect"/>.
    -									</p>
    -
    -									<h3>ANY and the IN predicate</h3>
    -									<p>
    -										It is interesting to note that the SQL standard defines the <reference id="in-predicate" title="IN predicate"/> in terms of the ANY-quantified predicate. The following two expressions are equivalent:
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[[ROW VALUE EXPRESSION] IN [IN PREDICATE VALUE]]]></sql><sql><![CDATA[[ROW VALUE EXPRESSION] = ANY [IN PREDICATE VALUE]]]></sql>
    -</code-pair><html>
    -
    -									<p>
    -										Typically, the <reference id="in-predicate" title="IN predicate"/> is more readable than the quantified comparison predicate.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -						    <section id="null-predicate">
    -							    <title>NULL predicate</title>
    -								<content><html>
    -									<p>
    -										In SQL, you cannot compare NULL with any value using <reference id="comparison-predicate" title="comparison predicates"/>, as the result would yield NULL again, which is neither TRUE nor FALSE (see also the manual's section about <reference id="conditional-expressions" title="conditional expressions"/>). In order to test a <reference id="column-expressions" title="column expression"/> for NULL, use the NULL predicate as such:
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[TITLE IS NULL
    -TITLE IS NOT NULL]]></sql><java><![CDATA[BOOK.TITLE.isNull()
    -BOOK.TITLE.isNotNull()]]></java>
    -</code-pair><html>
    -
    -								</html></content>
    -							</section>
    -
    -						    <section id="distinct-predicate">
    -							    <title>DISTINCT predicate</title>
    -								<content><html>
    -									<p>
    -										Some databases support the DISTINCT predicate, which serves as a convenient, NULL-safe <reference id="comparison-predicate" title="comparison predicate"/>. With the DISTINCT predicate, the following truth table can be assumed:
    -									</p>
    -									<ul>
    -										<li>[ANY] IS DISTINCT FROM NULL yields TRUE</li>
    -										<li>[ANY] IS NOT DISTINCT FROM NULL yields FALSE</li>
    -										<li>NULL IS DISTINCT FROM NULL yields FALSE</li>
    -										<li>NULL IS NOT DISTINCT FROM NULL yields TRUE</li>
    -									</ul>
    -									<p>
    -										For instance, you can compare two fields for distinctness, ignoring the fact that any of the two could be NULL, which would lead to funny results. This is supported by jOOQ as such:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[TITLE IS DISTINCT FROM SUB_TITLE
    -TITLE IS NOT DISTINCT FROM SUB_TITLE]]></sql><java><![CDATA[BOOK.TITLE.isDistinctFrom(BOOK.SUB_TITLE)
    -BOOK.TITLE.isNotDistinctFrom(BOOK.SUB_TITLE)]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										If your database does not natively support the DISTINCT predicate, jOOQ simulates it with an equivalent <reference id="case-expressions" title="CASE expression"/>, modelling the above truth table:
    -									</p>
    -	
    -</html><code-pair>								
    -<sql><![CDATA[-- [A] IS DISTINCT FROM [B] 
    -CASE WHEN [A] IS     NULL AND [B] IS     NULL THEN FALSE
    -     WHEN [A] IS     NULL AND [B] IS NOT NULL THEN TRUE
    -     WHEN [A] IS NOT NULL AND [B] IS     NULL THEN TRUE
    -     WHEN [A] =               [B]             THEN FALSE
    -     ELSE                                          TRUE
    -END
    -]]></sql><sql><![CDATA[-- [A] IS NOT DISTINCT FROM [B] 
    -CASE WHEN [A] IS     NULL AND [B] IS     NULL THEN TRUE
    -     WHEN [A] IS     NULL AND [B] IS NOT NULL THEN FALSE
    -     WHEN [A] IS NOT NULL AND [B] IS     NULL THEN FALSE
    -     WHEN [A] =               [B]             THEN TRUE
    -     ELSE                                          FALSE
    -END
    -]]></sql>
    -</code-pair><html>							
    -								</html></content>
    -							</section>
    -
    -						    <section id="between-predicate">
    -							    <title>BETWEEN predicate</title>
    -								<content><html>
    -									<p>
    -										The BETWEEN predicate can be seen as syntactic sugar for a pair of <reference id="comparison-predicate" title="comparison predicates"/>. According to the SQL standard, the following two predicates are equivalent:
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[[A] BETWEEN [B] AND [C]]]></sql><sql><![CDATA[[A] >= [B] AND [A] <= [C]]]></sql>
    -</code-pair><html>
    -
    -									<p>
    -										Note the inclusiveness of range boundaries in the definition of the BETWEEN predicate. Intuitively, this is supported in jOOQ as such:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[PUBLISHED_IN     BETWEEN 1920 AND 1940
    -PUBLISHED_IN NOT BETWEEN 1920 AND 1940]]></sql><java><![CDATA[BOOK.PUBLISHED_IN.between(1920).and(1940)
    -BOOK.PUBLISHED_IN.notBetween(1920).and(1940)]]></java>
    -</code-pair><html>
    -
    -									<h3>BETWEEN SYMMETRIC</h3>
    -									<p>
    -										The SQL standard defines the SYMMETRIC keyword to be used along with BETWEEN to indicate that you do not care which bound of the range is larger than the other. A database system should simply swap range bounds, in case the first bound is greater than the second one. jOOQ supports this keyword as well, simulating it if necessary.
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[PUBLISHED_IN     BETWEEN SYMMETRIC 1940 AND 1920
    -PUBLISHED_IN NOT BETWEEN SYMMETRIC 1940 AND 1920]]></sql><java><![CDATA[BOOK.PUBLISHED_IN.betweenSymmetric(1940).and(1920)
    -BOOK.PUBLISHED_IN.notBetweenSymmetric(1940).and(1920)]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										The simulation is done trivially:
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[[A] BETWEEN SYMMETRIC [B] AND [C]]]></sql><sql><![CDATA[([A] BETWEEN [B] AND [C]) OR ([A] BETWEEN [C] AND [B])]]></sql>
    -</code-pair><html>
    -
    -								</html></content>
    -							</section>
    -
    -						    <section id="like-predicate">
    -							    <title>LIKE predicate</title>
    -								<content><html>
    -									<p>
    -										LIKE predicates are popular for simple wildcard-enabled pattern matching. Supported wildcards in all SQL databases are:
    -									</p>
    -									<ul>
    -										<li><strong>_</strong>: (single-character wildcard)</li>
    -										<li><strong>%</strong>: (multi-character wildcard)</li>
    -									</ul>
    -									<p>
    -										With jOOQ, the LIKE predicate can be created from any <reference id="column-expressions" title="column expression"/> as such:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[TITLE     LIKE '%abc%'
    -TITLE NOT LIKE '%abc%']]></sql><java><![CDATA[BOOK.TITLE.like("%abc%")
    -BOOK.TITLE.notLike("%abc%")]]></java>
    -</code-pair><html>
    -									
    -									<h3>Escaping operands with the LIKE predicate</h3>
    -									<p>
    -										Often, your pattern may contain any of the wildcard characters "_" and "%", in case of which you may want to escape them. jOOQ does not automatically escape patterns in like() and notLike() methods. Instead, you can explicitly define an escape character as such:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[TITLE     LIKE '%The !%-Sign Book%' ESCAPE '!'
    -TITLE NOT LIKE '%The !%-Sign Book%' ESCAPE '!']]></sql><java><![CDATA[BOOK.TITLE.like("%The !%-Sign Book%", '!')
    -BOOK.TITLE.notLike("%The !%-Sign Book%", '!')]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										In the above predicate expressions, the exclamation mark character is passed as the escape character to escape wildcard characters "!_" and "!%", as well as to escape the escape character itself: "!!"
    -									</p>
    -									<p>
    -										Please refer to your database manual for more details about escaping patterns with the LIKE predicate.
    -									</p>
    -									
    -									<h3>jOOQ's convenience methods using the LIKE predicate</h3>
    -									<p>
    -										In addition to the above, jOOQ provides a few convenience methods for common operations performed on strings using the LIKE predicate. Typical operations are "contains predicates", "starts with predicates", "ends with predicates", etc. Here is the full convenience API wrapping LIKE predicates:
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[-- case insensitivity
    -LOWER(TITLE) LIKE LOWER('%abc%')
    -LOWER(TITLE) NOT LIKE LOWER('%abc%')
    -
    --- contains and similar methods
    -TITLE LIKE '%' || 'abc' || '%'
    -TITLE LIKE 'abc' || '%'
    -TITLE LIKE '%' || 'abc']]></sql><java><![CDATA[// case insensitivity
    -BOOK.TITLE.likeIgnoreCase("%abc%")
    -BOOK.TITLE.notLikeIgnoreCase("%abc%")
    -
    -// contains and similar methods
    -BOOK.TITLE.contains("abc")
    -BOOK.TITLE.startsWith("abc")
    -BOOK.TITLE.endsWith("abc")]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										Note, that jOOQ escapes % and _ characters in value in some of the above predicate implementations. For simplicity, this has been omitted in this manual.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -						    <section id="in-predicate">
    -							    <title>IN predicate</title>
    -								<content><html>
    -									<p>
    -										In SQL, apart from comparing a value against several values, the IN predicate can be used to create semi-joins or anti-joins. jOOQ knows the following methods on the <reference class="org.jooq.Field" /> interface, to construct such IN predicates:
    -									</p>
    -
    -</html><java><![CDATA[in(Collection<T>)    // Construct an IN predicate from a collection of bind values
    -in(T...)             // Construct an IN predicate from bind values
    -in(Field<?>...)      // Construct an IN predicate from column expressions
    -in(Select<?>)        // Construct an IN predicate from a subselect
    -notIn(Collection<T>) // Construct a NOT IN predicate from a collection of bind values
    -notIn(T...)          // Construct a NOT IN predicate from bind values
    -notIn(Field<?>...)   // Construct a NOT IN predicate from column expressions
    -notIn(Select<?>)     // Construct a NOT IN predicate from a subselect]]></java><html>
    -
    -									<p>
    -										A sample IN predicate might look like this:
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[TITLE     IN ('Animal Farm', '1984')
    -TITLE NOT IN ('Animal Farm', '1984')]]></sql><java><![CDATA[BOOK.TITLE.in("Animal Farm", "1984")
    -BOOK.TITLE.notIn("Animal Farm", "1984")]]></java>
    -</code-pair><html>
    -
    -									
    -									<h3>NOT IN and NULL values</h3>
    -									<p>
    -										Beware that you should probably not have any NULL values in the right hand side of a NOT IN predicate, as the whole expression would evaluate to NULL, which is rarely desired. This can be shown informally using the following reasoning:
    -									</p>
    -									
    -</html><sql>-- The following conditional expressions are formally or informally equivalent
    -A NOT IN (B, C)
    -A != ANY(B, C)
    -A != B AND A != C
    -
    --- Substitute C for NULL, you'll get
    -A NOT IN (B, NULL)   -- Substitute C for NULL
    -A != B AND A != NULL -- From the above rules
    -A != B AND NULL      -- [ANY] != NULL yields NULL
    -NULL                 -- [ANY] AND NULL yields NULL</sql><html>
    -
    -									<p>
    -										A good way to prevent this from happening is to use the <reference id="exists-predicate" title="EXISTS predicate"/> for anti-joins, which is NULL-value insensitive. See the manual's section about <reference id="conditional-expressions" title="conditional expressions"/> to see a boolean truth table.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -						    <section id="exists-predicate">
    -							    <title>EXISTS predicate</title>
    -								<content><html>
    -									<p>
    -										Slightly less intuitive, yet more powerful than the previously discussed <reference id="in-predicate" title="IN predicate"/> is the EXISTS predicate, that can be used to form semi-joins or anti-joins. With jOOQ, the EXISTS predicate can be formed in various ways:
    -									</p>
    -									<ul>
    -										<li>From the <reference id="factory" title="Factory"/>, using static methods. This is probably the most used case</li>
    -										<li>From a <reference id="conditional-expressions" title="conditional expression"/> using <reference id="boolean-operators" title="convenience methods attached to boolean operators"/></li>
    -										<li>From a <reference id="select-statement" title="SELECT statement"/> using <reference id="where-clause" title="convenience methods attached to the where clause"/>, and from other clauses</li>
    -									</ul>
    -									
    -									<p>
    -										An example of an EXISTS predicate can be seen here:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[    EXISTS (SELECT 1 FROM BOOK 
    -            WHERE AUTHOR_ID = 3)
    -NOT EXISTS (SELECT 1 FROM BOOK 
    -            WHERE AUTHOR_ID = 3)]]></sql><java><![CDATA[   exists(create.selectOne().from(BOOK)
    -                .where(BOOK.AUTHOR_ID.equal(3)));
    -notExists(create.selectOne().from(BOOK)
    -                .where(BOOK.AUTHOR_ID.equal(3)));]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										Note that in SQL, the projection of a subselect in an EXISTS predicate is irrelevant. To help you write queries like the above, you can use jOOQ's selectZero() or selectOne() <reference id="factory" title="Factory"/> methods
    -									</p>
    -									
    -									<h3>Performance of IN vs. EXISTS</h3>
    -									<p>
    -										In theory, the two types of predicates can perform equally well. If your database system ships with a sophisticated cost-based optimiser, it will be able to transform one predicate into the other, if you have all necessary constraints set (e.g. referential constraints, not null constraints). However, in reality, performance between the two might differ substantially. An interesting blog post investigating this topic on the MySQL database can be seen here:<br/>
    -										<a href="http://blog.jooq.org/2012/07/27/not-in-vs-not-exists-vs-left-join-is-null-mysql/">http://blog.jooq.org/2012/07/27/not-in-vs-not-exists-vs-left-join-is-null-mysql/</a>
    -									</p>
    -								</html></content>
    -							</section>
    -							
    -							<section id="overlaps-predicate">
    -								<title>OVERLAPS predicate</title>
    -								<content><html>
    -									<p>
    -										When comparing dates, the SQL standard allows for using a special OVERLAPS predicate, which checks whether two date ranges overlap each other. The following can be said:
    -									</p>
    -
    -</html><sql><![CDATA[-- This yields true
    -(DATE '2010-01-01', DATE '2010-01-03') OVERLAPS (DATE '2010-01-02' DATE '2010-01-04')
    -
    --- INTERVAL data types are also supported. This is equivalent to the above
    -(DATE '2010-01-01', CAST('+2 00:00:00' AS INTERVAL DAY TO SECOND)) OVERLAPS 
    -(DATE '2010-01-02', CAST('+2 00:00:00' AS INTERVAL DAY TO SECOND))]]></sql><html>
    -
    -									<h3>The OVERLAPS predicate in jOOQ</h3>
    -									<p>
    -									    jOOQ supports the OVERLAPS predicate on <reference id="row-value-expressions" title="row value expressions of degree 2"/>. The following methods are contained in <reference class="org.jooq.Row2"/>:
    -									</p>
    -
    -</html><java><![CDATA[Condition overlaps(T1 t1, T2 t2);
    -Condition overlaps(Field<T1> t1, Field<T2> t2);
    -Condition overlaps(Row2<T1, T2> row);]]></java><html>
    -
    -									<p>
    -										This allows for expressing the above predicates as such:
    -									</p>																		
    -
    -</html><java><![CDATA[// The date range tuples version
    -row(Date.valueOf('2010-01-01'), Date.valueOf('2010-01-03')).overlaps(Date.valueOf('2010-01-02'), Date.valueOf('2010-01-04'))
    -
    -// The INTERVAL tuples version
    -row(Date.valueOf('2010-01-01'), new DayToSecond(2)).overlaps(Date.valueOf('2010-01-02'), new DayToSecond(2))]]></java><html>
    -
    -									<h3>jOOQ's extensions to the standard</h3>
    -									<p>
    -										Unlike the standard (or any database implementing the standard), jOOQ also supports the OVERLAPS predicate for comparing arbitrary <reference id="row-value-expressions" title="row vlaue expressions of degree 2"/>. For instance, (1, 3) OVERLAPS (2, 4) will yield true in jOOQ. This is simulated as such
    -									</p>
    -									
    -</html><sql><![CDATA[-- This predicate
    -(A, B) OVERLAPS (C, D)
    -
    --- can be simulated as such
    -(C <= B) AND (A <= D)]]></sql></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -					<section id="plain-sql">
    -						<title>Plain SQL</title>
    -						<content><html>
    -							<p>
    -								A DSL is a nice thing to have, it feels "fluent" and "natural", especially if it models a well-known language, such as SQL. But a DSL is always expressed in a host language (Java in this case), which was not made for exactly the same purposes as its hosted DSL. If it were, then jOOQ would be implemented on a compiler-level, similar to LINQ in .NET. But it's not, and so, the DSL is limited by language constraints of its host language. We have seen many functionalities where the DSL becomes a bit verbose. This can be especially true for:
    -							</p>
    -							<ul>
    -								<li><reference id="aliased-columns" title="aliasing"/></li>
    -								<li><reference id="nested-selects" title="nested selects"/></li>
    -								<li><reference id="arithmetic-expressions" title="arithmetic expressions"/></li>
    -								<li><reference id="cast-expressions" title="casting"/></li>
    -							</ul>
    -							
    -							<p>
    -								You'll probably find other examples. If verbosity scares you off, don't worry. The verbose use-cases for jOOQ are rather rare, and when they come up, you do have an option. Just write SQL the way you're used to!
    -							</p>
    -							<p>
    -								jOOQ allows you to embed SQL as a String into any supported <reference id="sql-statements" title="statement"/> in these contexts:
    -							</p>
    -							<ul>
    -								<li>Plain SQL as a <reference id="conditional-expressions" title="conditional expression"/></li>
    -								<li>Plain SQL as a <reference id="column-expressions" title="column expression"/></li>
    -								<li>Plain SQL as a <reference id="column-expressions" title="function"/></li>
    -								<li>Plain SQL as a <reference id="table-expressions" title="table expression"/></li>
    -								<li>Plain SQL as a <reference id="query-vs-resultquery" title="query"/></li>
    -							</ul>
    -
    -							<h3>The Factory plain SQL API</h3>
    -							<p>
    -								Plain SQL API methods are usually overloaded in three ways. Let's look at the <code>condition</code> query part constructor:
    -							</p>
    -</html><java><![CDATA[// Construct a condition without bind values
    -// Example: condition("a = b")
    -Condition condition(String sql);
    -
    -// Construct a condition with bind values
    -// Example: condition("a = ?", 1);
    -Condition condition(String sql, Object... bindings);
    -
    -// Construct a condition taking other jOOQ object arguments
    -// Example: condition("a = {0}", val(1));
    -Condition condition(String sql, QueryPart... parts);]]></java><html>
    -							
    -							<p>
    -								Please refer to the <reference class="org.jooq.impl.Factory"/> Javadoc for more details. The following is a more complete listing of plain SQL construction methods from the Factory:
    -							</p>
    -
    -</html><java><![CDATA[// A condition
    -Condition condition(String sql);
    -Condition condition(String sql, Object... bindings);
    -Condition condition(String sql, QueryPart... parts);
    -
    -// A field with an unknown data type
    -Field<Object> field(String sql);
    -Field<Object> field(String sql, Object... bindings);
    -Field<Object> field(String sql, QueryPart... parts);
    -
    -// A field with a known data type
    -<T> Field<T> field(String sql, Class<T> type);
    -<T> Field<T> field(String sql, Class<T> type, Object... bindings);
    -<T> Field<T> field(String sql, Class<T> type, QueryPart... parts);
    -<T> Field<T> field(String sql, DataType<T> type);
    -<T> Field<T> field(String sql, DataType<T> type, Object... bindings);
    -<T> Field<T> field(String sql, DataType<T> type, QueryPart... parts);
    -
    -// A field with a known name (properly escaped)
    -Field<Object> fieldByName(String... fieldName);
    -<T> Field<T>  fieldByName(Class<T> type, String... fieldName);
    -<T> Field<T>  fieldByName(DataType<T> type, String... fieldName)
    -
    -// A function
    -<T> Field<T> function(String name, Class<T> type, Field<?>... arguments);
    -<T> Field<T> function(String name, DataType<T> type, Field<?>... arguments);
    -
    -// A table
    -Table<?> table(String sql);
    -Table<?> table(String sql, Object... bindings);
    -Table<?> table(String sql, QueryPart... parts);
    -
    -// A table with a known name (properly escaped)
    -Table<Record> tableByName(String... fieldName);
    -
    -// A query without results (update, insert, etc)
    -Query query(String sql);
    -Query query(String sql, Object... bindings);
    -Query query(String sql, QueryPart... parts);
    -
    -// A query with results
    -ResultQuery<Record> resultQuery(String sql);
    -ResultQuery<Record> resultQuery(String sql, Object... bindings);
    -ResultQuery<Record> resultQuery(String sql, QueryPart... parts);
    -
    -// A query with results. This is the same as resultQuery(...).fetch();
    -Result<Record> fetch(String sql);
    -Result<Record> fetch(String sql, Object... bindings);
    -Result<Record> fetch(String sql, QueryPart... parts);]]></java><html>
    -
    -							<p>
    -								Apart from the general factory methods, plain SQL is also available in various other contexts. For instance, when adding a .where("a = b") clause to a query. Hence, there exist several convenience methods where plain SQL can be inserted usefully. This is an example displaying all various use-cases in one single query:
    -							</p>
    -							
    -</html><java><![CDATA[// You can use your table aliases in plain SQL fields
    -// As long as that will produce syntactically correct SQL
    -Field<?> LAST_NAME    = create.field("a.LAST_NAME");
    -
    -// You can alias your plain SQL fields
    -Field<?> COUNT1       = create.field("count(*) x");
    -
    -// If you know a reasonable Java type for your field, you
    -// can also provide jOOQ with that type
    -Field<Integer> COUNT2 = create.field("count(*) y", Integer.class);
    -
    -       // Use plain SQL as select fields
    -create.select(LAST_NAME, COUNT1, COUNT2)
    -
    -       // Use plain SQL as aliased tables (be aware of syntax!)
    -      .from("author a")
    -      .join("book b")
    -
    -       // Use plain SQL for conditions both in JOIN and WHERE clauses
    -      .on("a.id = b.author_id")
    -
    -       // Bind a variable in plain SQL
    -      .where("b.title != ?", "Brida")
    -
    -       // Use plain SQL again as fields in GROUP BY and ORDER BY clauses
    -      .groupBy(LAST_NAME)
    -      .orderBy(LAST_NAME);]]></java><html>
    -
    -							<h3>Important things to note about plain SQL!</h3>
    -							<p>
    -								There are some important things to keep in mind when using plain SQL:
    -							</p>
    -							<ul>
    -								<li>jOOQ doesn't know what you're doing. You're on your own again!</li>
    -								<li>You have to provide something that will be syntactically correct. If it's not, then jOOQ won't know. Only your JDBC driver or your RDBMS will detect the syntax error.</li>
    -								<li>You have to provide consistency when you use variable binding. The number of ? must match the number of variables</li>
    -								<li>Your SQL is inserted into jOOQ queries without further checks. Hence, jOOQ can't prevent SQL injection. </li>
    -							</ul>
    -						</html></content>
    -					</section>
    -
    -					<section id="bind-values">
    -					    <title>Bind values and parameters</title>
    -						<content><html>
    -							<p>
    -								Bind values are used in SQL / JDBC for various reasons. Among the most obvious ones are:
    -							</p>
    -							<ul>
    -								<li>
    -									Protection against SQL injection. Instead of inlining values possibly originating from user input, you bind those values to your prepared statement and let the JDBC driver / database take care of handling security aspects.
    -								</li>
    -								<li>
    -									Increased speed. Advanced databases such as Oracle can keep execution plans of similar queries in a dedicated cache to prevent hard-parsing your query again and again. In many cases, the actual value of a bind variable does not influence the execution plan, hence it can be reused. Preparing a statement will thus be faster
    -								</li>
    -								<li>
    -									On a JDBC level, you can also reuse the SQL string and prepared statement object instead of constructing it again, as you can bind new values to the prepared statement. jOOQ currently does not cache prepared statements, internally.
    -								</li>
    -							</ul>
    -							
    -							<p>
    -								The following sections explain how you can introduce bind values in jOOQ, and how you can control the way they are rendered and bound to SQL.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -						    <section id="indexed-parameters">
    -							    <title>Indexed parameters</title>
    -								<content><html>
    -									<p>
    -										JDBC only knows indexed bind values. A typical example for using bind values with JDBC is this:
    -									</p>
    -									
    -</html><java><![CDATA[PreparedStatement stmt = connection.prepareStatement("SELECT * FROM BOOK WHERE ID = ? AND TITLE = ?");
    -
    -// bind values to the above statement for appropriate indexes 
    -stmt.setInt(1, 5);
    -stmt.setString(2, "Animal Farm");
    -stmm.executeQuery();]]></java><html>
    -
    -									<p>
    -										With dynamic SQL, keeping track of the number of question marks and their corresponding index may turn out to be hard. jOOQ abstracts this and lets you provide the bind value right where it is needed. A trivial example is this:
    -									</p>
    -									
    -</html><java><![CDATA[create.select().from(BOOK).where(BOOK.ID.equal(5)).and(BOOK.TITLE.equal("Animal Farm"));
    -
    -// This notation is in fact a short form for the equivalent:
    -create.select().from(BOOK).where(BOOK.ID.equal(val(5))).and(BOOK.TITLE.equal(val("Animal Farm")));]]></java><html>
    -
    -									<p>
    -										Note the using of <reference class="org.jooq.impl.Factory" anchor="#val(java.lang.Object)" title="Factory.val()"/> to explicitly create an indexed bind value. You don't have to worry about that index. When the query is <reference id="sql-rendering" title="rendered"/>, each bind value will render a question mark. When the query <reference id="variable-binding" title="binds its variables"/>, each bind value will generate the appropriate bind value index. 
    -									</p>
    -									
    -									<h3>Extract bind values from a query</h3>
    -									<p>
    -										Should you decide to run the above query outside of jOOQ, using your own <reference class="java.sql.PreparedStatement"/>, you can do so as follows:
    -									</p>
    -									
    -</html><java><![CDATA[Select<?> select = create.select().from(BOOK).where(BOOK.ID.equal(5)).and(BOOK.TITLE.equal("Animal Farm"));
    -
    -// Render the SQL statement:
    -String sql = select.getSQL();
    -assertEquals("SELECT * FROM BOOK WHERE ID = ? AND TITLE = ?", sql);
    -
    -// Get the bind values:
    -List<Object> values = select.getBindValues();
    -assertEquals(2, values.size());
    -assertEquals(5, values.get(0));
    -assertEquals("Animal Farm", values.get(1));]]></java><html>
    -
    -									<p>
    -										You can also extract specific bind values by index from a query, if you wish to modify their underlying value after creating a query. This can be achieved as such:
    -									</p>
    -
    -</html><java><![CDATA[Select<?> select = create.select().from(BOOK).where(BOOK.ID.equal(5)).and(BOOK.TITLE.equal("Animal Farm"));
    -Param<?> param = select.getParam("2");
    -
    -// You could now modify the Query's underlying bind value:
    -if ("Animal Farm".equals(param.getValue())) {
    -    param.setConverted("1984");
    -}]]></java><html>
    -
    -									<p>
    -										For more details about jOOQ's internals, see the manual's section about <reference id="queryparts" title="QueryParts"/>.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -						    <section id="named-parameters">
    -							    <title>Named parameters</title>
    -								<content><html>
    -									<p>
    -										Some SQL access abstractions that are built on top of JDBC, or some that bypass JDBC may support named parameters. jOOQ allows you to give names to your parameters as well, although those names are not rendered to SQL strings by default. Here is an example of how to create named parameters using the <reference class="org.jooq.Param"/> type:
    -									</p>
    -
    -</html><java><![CDATA[// Create a query with a named parameter. You can then use that name for accessing the parameter again
    -Query query1 = create.select().from(AUTHOR).where(LAST_NAME.equal(param("lastName", "Poe")));
    -Param<?> param1 = query.getParam("lastName");
    -
    -// Or, keep a reference to the typed parameter in order not to lose the <T> type information:
    -Param<String> param2 = param("lastName", "Poe");
    -Query query2 = create.select().from(AUTHOR).where(LAST_NAME.equal(param2));
    -
    -// You can now change the bind value directly on the Param reference:
    -param2.setValue("Orwell");]]></java><html>
    -
    -									<p>
    -										The <reference class="org.jooq.Query"/> interface also allows for setting new bind values directly, without accessing the Param type:
    -									</p>
    -
    -</html><java><![CDATA[Query query1 = create.select().from(AUTHOR).where(LAST_NAME.equal("Poe"));
    -query1.bind(1, "Orwell");
    -
    -// Or, with named parameters
    -Query query2 = create.select().from(AUTHOR).where(LAST_NAME.equal(param("lastName", "Poe")));
    -query2.bind("lastName", "Orwell");]]></java><html>
    -
    -									<p>
    -										In order to actually render named parameter names in generated SQL, use the <reference class="org.jooq.impl.Factory" anchor="#renderNamedParams(org.jooq.QueryPart)" title="Factory.renderNamedParams()"/> method:
    -									</p>
    -
    -</html><code-pair>
    -<java><![CDATA[create.renderNamedParams(
    -    create.select()
    -          .from(AUTHOR)
    -          .where(LAST_NAME.equal(
    -                 param("lastName", "Poe"))));]]></java><sql><![CDATA[-- The named bind variable can be rendered
    -
    -SELECT *
    -FROM AUTHOR
    -WHERE LAST_NAME = :lastName]]></sql>
    -</code-pair><html>
    -								</html></content>
    -							</section>
    -
    -						    <section id="inlined-parameters">
    -							    <title>Inlined parameters</title>
    -								<content><html>
    -									<p>
    -										Sometimes, you may wish to avoid rendering bind variables while still using custom values in SQL. jOOQ refers to that as "inlined" bind values. When bind values are inlined, they render the actual value in SQL rather than a JDBC question mark. Bind value inlining can be achieved in two ways:
    -									</p>
    -									<ul>
    -										<li>
    -											By using the <reference id="custom-settings" title="Settings"/> and setting the <reference class="org.jooq.conf.StatementType"/> to STATIC_STATEMENT. This will inline all bind values for SQL statements rendered from such a Factory.
    -										</li>
    -										<li>
    -											By using <reference class="org.jooq.impl.Factory" anchor="#inline(java.lang.Object)" title="Factory.inline()"/> methods.
    -										</li>
    -									</ul>
    -									<p>
    -										In both cases, your inlined bind values will be properly escaped to avoid SQL syntax errors and SQL injection. Some examples:
    -									</p>
    -
    -</html><java><![CDATA[
    -// Use dedicated calls to inline() in order to specify
    -// single bind values to be rendered as inline values
    -// --------------------------------------------------
    -create.select()
    -      .from(AUTHOR)
    -      .where(LAST_NAME.equal(inline("Poe")));
    -
    -// Or render the whole query with inlined values
    -// --------------------------------------------------
    -Settings settings = new Settings()
    -    .withStatementType(StatementType.STATIC_STATEMENT);
    -
    -// Add the settings to the factory
    -Factory create = new Factory(connection, SQLDialect.ORACLE, settings);
    -
    -// Run queries that omit rendering schema names
    -create.select()
    -      .from(AUTHOR)
    -      .where(LAST_NAME.equal("Poe"));]]></java></content>
    -							</section>
    -
    -						    <section id="sql-injection-and-plain-sql-queryparts">
    -							    <title>SQL injection and plain SQL QueryParts</title>
    -								<content><html>
    -									<p>
    -										Special care needs to be taken when using <reference id="plain-sql" title="plain SQL QueryParts"/>. While jOOQ's API allows you to specify bind values for use with plain SQL, you're not forced to do that. For instance, both of the following queries will lead to the same, valid result:
    -									</p>
    -									
    -</html><java><![CDATA[// This query will use bind values, internally.
    -create.fetch("SELECT * FROM BOOK WHERE ID = ? AND TITLE = ?", 5 "Animal Farm");
    -
    -// This query will not use bind values, internally.
    -create.fetch("SELECT * FROM BOOK WHERE ID = 5 AND TITLE = 'Animal Farm'");]]></java><html>
    -
    -									<p>
    -										All methods in the jOOQ API that allow for plain (unescaped, untreated) SQL contain a warning message in their relevant Javadoc, to remind you of the risk of SQL injection in what is otherwise a SQL-injection-safe API.
    -									</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -					<section id="queryparts">
    -					    <title>QueryParts</title>
    -						<content><html>
    -							<p>
    -								A <reference class="org.jooq.Query" /> and all its contained objects is a <reference class="org.jooq.QueryPart" />. QueryParts essentially provide this functionality:
    -							</p>
    -							<ul>
    -								<li>they can <reference id="sql-rendering" title="render SQL"/> using the <reference class="org.jooq.QueryPartInternal" anchor="#toSQL(org.jooq.RenderContext)" title="toSQL(RenderContext)"/> method</li>
    -								<li>they can <reference id="variable-binding" title="bind variables"/> using the <reference class="org.jooq.QueryPartInternal" anchor="#bind(org.jooq.BindContext)" title="bind(BindContext)"/> method</li>
    -							</ul>
    -
    -							<p>
    -								Both of these methods are contained in jOOQ's internal API's <reference class="org.jooq.QueryPartInternal"/>, which is internally implemented by every QueryPart.
    -							</p>
    -
    -							<p>
    -								The following sections explain some more details about <reference id="sql-rendering" title="SQL rendering"/> and <reference id="variable-binding" title="variable binding"/>, as well as other implementation details about QueryParts in general.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -						    <section id="sql-rendering">
    -							    <title>SQL rendering</title>
    -								<content><html>
    -									<p>
    -										Every <reference class="org.jooq.QueryPart"/> must implement the <reference class="org.jooq.QueryPartInternal" anchor="#toSQL(org.jooq.RenderContext)" title="toSQL(RenderContext)"/> method to render its SQL string to a <reference class="org.jooq.RenderContext"/>. This RenderContext has two purposes:
    -									</p>
    -									<ul>
    -										<li>It provides some information about the "state" of SQL rendering.</li>
    -										<li>It provides a common API for constructing SQL strings on the context's internal <reference class="java.lang.StringBuilder"/></li>
    -									</ul>
    -									<p>
    -										An overview of the <reference class="org.jooq.RenderContext"/> API is given here:
    -									</p>
    -
    -</html><java><![CDATA[// These methods are useful for generating unique aliases within a RenderContext (and thus within a Query)
    -String peekAlias();
    -String nextAlias();
    -
    -// These methods return rendered SQL
    -String render();
    -String render(QueryPart part);
    -
    -// These methods allow for fluent appending of SQL to the RenderContext's internal StringBuilder
    -RenderContext keyword(String keyword);
    -RenderContext literal(String literal);
    -RenderContext sql(String sql);
    -RenderContext sql(char sql);
    -RenderContext sql(int sql);
    -RenderContext sql(QueryPart part);
    -
    -// These methods allow for controlling formatting of SQL, if the relevant Setting is active
    -RenderContext formatNewLine();
    -RenderContext formatSeparator();
    -RenderContext formatIndentStart();
    -RenderContext formatIndentStart(int indent);
    -RenderContext formatIndentLockStart();
    -RenderContext formatIndentEnd();
    -RenderContext formatIndentEnd(int indent);
    -RenderContext formatIndentLockEnd();
    -
    -// These methods control the RenderContext's internal state
    -boolean       inline();
    -RenderContext inline(boolean inline);
    -boolean       qualify();
    -RenderContext qualify(boolean qualify);
    -boolean       namedParams();
    -RenderContext namedParams(boolean renderNamedParams);
    -CastMode      castMode();
    -RenderContext castMode(CastMode mode);
    -Boolean       cast();
    -RenderContext castModeSome(SQLDialect... dialects);]]></java><html>
    -
    -									<p>
    -										The following additional methods are inherited from a common <reference class="org.jooq.Context"/>, which is shared among <reference class="org.jooq.RenderContext"/> and <reference class="org.jooq.BindContext"/>:
    -									</p>
    -
    -</html><java><![CDATA[// These methods indicate whether fields or tables are being declared (MY_TABLE AS MY_ALIAS) or referenced (MY_ALIAS)
    -boolean declareFields();
    -Context declareFields(boolean declareFields);
    -boolean declareTables();
    -Context declareTables(boolean declareTables);
    -
    -// These methods indicate whether a top-level query is being rendered, or a subquery
    -boolean subquery();
    -Context subquery(boolean subquery);
    -
    -// These methods provide the bind value indices within the scope of the whole Context (and thus of the whole Query)
    -int nextIndex();
    -int peekIndex();]]></java><html>
    -
    -									<h3>An example of rendering SQL</h3>
    -								   	<p>
    -								   		A simple example can be provided by checking out jOOQ's internal representation of a (simplified) <reference id="comparison-predicate" title="CompareCondition"/>. It is used for any <reference class="org.jooq.Condition"/> comparing two fields as for example the AUTHOR.ID = BOOK.AUTHOR_ID condition here:
    -							   		</p>
    -							   		
    -</html><sql>-- [...]
    -FROM AUTHOR
    -JOIN BOOK ON AUTHOR.ID = BOOK.AUTHOR_ID
    --- [...]</sql><html>
    -
    -									<p>
    -										This is how jOOQ renders such a condition:
    -									</p>
    -
    -</html><java><![CDATA[@Override
    -public final void toSQL(RenderContext context) {
    -    // The CompareCondition delegates rendering of the Fields to the Fields
    -    // themselves and connects them using the Condition's comparator operator:
    -    context.sql(field1)
    -           .sql(" ");
    -
    -    // If the second field is null, some convenience behaviour can be
    -    // implemented here
    -    if (field2.isNullLiteral()) {
    -        switch (comparator) {
    -            case EQUALS:
    -                context.sql("is null");
    -                break;
    -
    -            case NOT_EQUALS:
    -                context.sql("is not null");
    -                break;
    -
    -            default:
    -                throw new IllegalStateException("Cannot compare null with " + comparator);
    -        }
    -    }
    -
    -    // By default, also delegate the right hand side's SQL rendering to the
    -    // underlying field
    -    else {
    -        context.sql(comparator.toSQL())
    -               .sql(" ")
    -               .sql(field2);
    -    }
    -}]]></java><html>
    -
    -									<p>
    -										See the manual's sections about <reference id="custom-queryparts" title="custom QueryParts"/> and <reference id="plain-sql-queryparts" title="plain SQL QueryParts"/> to learn about how to write your own query parts in order to extend jOOQ.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="pretty-printing">
    -								<title>Pretty printing SQL</title>
    -								<content><html>
    -									<p>
    -										As mentioned in the previous chapter about <reference id="sql-rendering" title="SQL rendering"/>, there are some elements in the <reference class="org.jooq.RenderContext"/> that are used for formatting / pretty-printing rendered SQL. In order to obtain pretty-printed SQL, just use the following <reference id="custom-settings" title="custom settings"/>: 
    -									</p>
    -	
    -	
    -</html><java><![CDATA[// Create a factory that will render "formatted" SQL
    -Factory pretty = new Factory(dialect, new Settings().withRenderFormatted(true));]]></java><html>
    -
    -									<p>
    -										And then, use the above factory to render pretty-printed SQL:
    -									</p>
    -									
    -</html><code-pair>
    -<java><![CDATA[String sql = pretty.select(
    -                       AUTHOR.LAST_NAME, count().as("c"))
    -                   .from(BOOK)
    -                   .join(AUTHOR)
    -                   .on(BOOK.AUTHOR_ID.equal(AUTHOR.ID))
    -                   .where(BOOK.TITLE.notEqual("1984"))
    -                   .groupBy(AUTHOR.LAST_NAME)
    -                   .having(count().equal(2))
    -                   .getSQL();]]></java><sql><![CDATA[select 
    -  "TEST"."AUTHOR"."LAST_NAME", 
    -  count(*) "c"
    -from "TEST"."BOOK"
    -  join "TEST"."AUTHOR"
    -  on "TEST"."BOOK"."AUTHOR_ID" = "TEST"."AUTHOR"."ID"
    -where "TEST"."BOOK"."TITLE" <> '1984'
    -group by "TEST"."AUTHOR"."LAST_NAME"
    -having count(*) = 2]]></sql>
    -</code-pair><html>
    -
    -									<p>
    -										The section about <reference id="execute-listeners" title="ExecuteListeners"/> shows an example of how such pretty printing can be used to log readable SQL to the stdout.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -						    <section id="variable-binding">
    -							    <title>Variable binding</title>
    -								<content><html>
    -									<p>
    -										Every <reference class="org.jooq.QueryPart"/> must implement the <reference class="org.jooq.QueryPartInternal" anchor="#bind(org.jooq.BindContext)" title="bind(BindContext)"/> method. This BindContext has two purposes:
    -									</p>
    -									<ul>
    -										<li>It provides some information about the "state" of the variable binding in process.</li>
    -										<li>It provides a common API for binding values to the context's internal <reference class="java.sql.PreparedStatement"/></li>
    -									</ul>
    -									<p>
    -										An overview of the <reference class="org.jooq.RenderContext"/> API is given here:
    -									</p>
    -
    -</html><java><![CDATA[// This method provides access to the PreparedStatement to which bind values are bound
    -PreparedStatement statement();
    -
    -// These methods provide convenience to delegate variable binding
    -BindContext bind(QueryPart part) throws DataAccessException;
    -BindContext bind(Collection<? extends QueryPart> parts) throws DataAccessException;
    -BindContext bind(QueryPart[] parts) throws DataAccessException;
    -
    -// These methods perform the actual variable binding
    -BindContext bindValue(Object value, Class<?> type) throws DataAccessException;
    -BindContext bindValues(Object... values) throws DataAccessException;]]></java><html>
    -
    -									<p>
    -										Some additional methods are inherited from a common <reference class="org.jooq.Context"/>, which is shared among <reference class="org.jooq.RenderContext"/> and <reference class="org.jooq.BindContext"/>. Details are documented in the previous chapter about <reference id="sql-rendering" title="SQL rendering"/>
    -									</p>
    -
    -									<h3>An example of binding values to SQL</h3>
    -								   	<p>
    -								   		A simple example can be provided by checking out jOOQ's internal representation of a (simplified) <reference id="comparison-predicate" title="CompareCondition"/>. It is used for any <reference class="org.jooq.Condition"/> comparing two fields as for example the AUTHOR.ID = BOOK.AUTHOR_ID condition here:
    -							   		</p>
    -							   		
    -</html><sql>-- [...]
    -WHERE AUTHOR.ID = ?
    --- [...]</sql><html>
    -
    -									<p>
    -										This is how jOOQ binds values on such a condition:
    -									</p>
    -</html><java><![CDATA[@Override
    -public final void bind(BindContext context) throws DataAccessException {
    -    // The CompareCondition itself does not bind any variables.
    -    // But the two fields involved in the condition might do so...
    -    context.bind(field1).bind(field2);
    -}]]></java><html>
    -
    -									<p>
    -										See the manual's sections about <reference id="custom-queryparts" title="custom QueryParts"/> and <reference id="plain-sql-queryparts" title="plain SQL QueryParts"/> to learn about how to write your own query parts in order to extend jOOQ.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -						    <section id="custom-queryparts">
    -							    <title>Extend jOOQ with custom types</title>
    -								<content><html>
    -									<p>
    -										If a SQL clause is too complex to express with jOOQ, you can extend either one of the following types for use directly in a jOOQ query:
    -									</p>
    -									
    -</html><java><![CDATA[public abstract class CustomField<T> extends AbstractField<T> {}
    -public abstract class CustomCondition extends AbstractCondition {}
    -public abstract class CustomTable<R extends TableRecord<R>> extends TableImpl<R> {}
    -public abstract class CustomRecord<R extends TableRecord<R>> extends TableRecordImpl<R> {}]]></java><html>
    -
    -									<p>
    -										These classes are declared public and covered by jOOQ's integration tests. When you extend these classes, you will have to provide your own implementations for the <reference id="queryparts" title="QueryParts'"/> <reference id="sql-rendering" title="toSQL()"/> and <reference id="variable-binding" title="bind()"/> methods, as discussed before:
    -									</p>
    -									
    -</html><java><![CDATA[// This method must produce valid SQL. If your QueryPart contains other QueryParts, you may delegate SQL generation to them
    -// in the correct order, passing the render context.
    -//
    -// If context.inline() is true, you must inline all bind variables
    -// If context.inline() is false, you must generate ? for your bind variables
    -public void toSQL(RenderContext context);
    -
    -// This method must bind all bind variables to a PreparedStatement. If your QueryPart contains other QueryParts, $
    -// you may delegate variable binding to them in the correct order, passing the bind context.
    -//
    -// Every QueryPart must ensure, that it starts binding its variables at context.nextIndex().
    -public void bind(BindContext context) throws DataAccessException;]]></java><html>
    -
    -									<p>
    -										The above contract may be a bit tricky to understand at first. The best thing is to check out jOOQ source code and have a look at a couple of QueryParts, to see how it's done. Here's an example <reference class="org.jooq.impl.CustomField"/> showing how to create a field multiplying another field by 2
    -									</p>
    -									
    -</html><java><![CDATA[// Create an anonymous CustomField, initialised with BOOK.ID arguments
    -final Field<Integer> IDx2 = new CustomField<Integer>(BOOK.ID.getName(), BOOK.ID.getDataType()) {
    -    @Override
    -    public void toSQL(RenderContext context) {
    -    
    -        // In inline mode, render the multiplication directly
    -        if (context.inline()) {
    -            context.sql(BOOK.ID).sql(" * 2");
    -        }
    -        
    -        // In non-inline mode, render a bind value
    -        else {
    -            context.sql(BOOK.ID).sql(" * ?");
    -        }
    -    }
    -
    -    @Override
    -    public void bind(BindContext context) {
    -        try {
    -        
    -            // Manually bind the value 2
    -            context.statement().setInt(context.nextIndex(), 2);
    -            
    -            // Alternatively, you could also write:
    -            // context.bind(Factory.val(2));
    -        }
    -        catch (SQLException e) {
    -            throw translate(getSQL(), e);
    -        }
    -    }
    -};
    -
    -// Use the above field in a SQL statement:
    -create.select(IDx2).from(BOOK);]]></java></content>
    -							</section>
    -
    -						    <section id="plain-sql-queryparts">
    -							    <title>Plain SQL QueryParts</title>
    -								<content><html>
    -									<p>
    -										If you don't need the integration of rather complex QueryParts into jOOQ, then you might be safer using simple <reference id="plain-sql" title="Plain SQL"/> functionality, where you can provide jOOQ with a simple String representation of your embedded SQL. Plain SQL methods in jOOQ's API come in two flavours. 
    -									</p>
    -									<ul>
    -										<li><strong>method(String, Object...)</strong>: This is a method that accepts a SQL string and a list of bind values that are to be bound to the variables contained in the SQL string</li>
    -										<li><strong>method(String, QueryPart...)</strong>: This is a method that accepts a SQL string and a list of QueryParts that are "injected" at the position of their respective placeholders in the SQL string</li>
    -									</ul>
    -									<p>
    -										The above distinction is best explained using an example:
    -									</p>
    -									
    -</html><java><![CDATA[// Plain SQL using bind values. The value 5 is bound to the first variable, "Animal Farm" to the second variable:
    -create.selectFrom(BOOK).where("BOOK.ID = ? AND TITLE = ?", 5, "Animal Farm");
    -
    -// Plain SQL using placeholders (counting from zero). 
    -// The QueryPart "id" is substituted for the placeholder {0}, the QueryPart "title" for {1}
    -Field<Integer> id   = val(5);
    -Field<String> title = val("Animal Farm");
    -create.selectFrom(BOOK).where("BOOK.ID = {0} AND TITLE = {1}", id, title);]]></java><html>
    -
    -									<p>
    -										The above technique allows for creating rather complex SQL clauses that are currently not supported by jOOQ, without extending any of the <reference id="custom-queryparts" title="custom QueryParts"/> as indicated in the previous chapter.
    -									</p>									
    -								</html></content>
    -							</section>
    -
    -						    <section id="serializability">
    -							    <title>Serializability</title>
    -								<content><html>
    -									<p>
    -										The only transient, non-serializable element in any jOOQ object is the <reference id="factory" title="Factory's"/> underlying <reference class="java.sql.Connection"/>. When you want to execute queries after de-serialisation, or when you want to store/refresh/delete <reference id="crud-with-updatablerecords" title="Updatable Records"/>, you will have to "re-attach" them to a Factory
    -									</p>
    -
    -</html><java><![CDATA[// Deserialise a SELECT statement
    -ObjectInputStream in = new ObjectInputStream(...);
    -Select<?> select = (Select<?>) in.readObject();
    -
    -// This will throw a DetachedException:
    -select.execute();
    -
    -// In order to execute the above select, attach it first
    -Factory create = new Factory(connection, SQLDialect.ORACLE);
    -create.attach(select);]]></java><html>
    -
    -									<h3>Automatically attaching QueryParts</h3>
    -									<p>
    -										Another way of attaching QueryParts automatically, or rather providing them with a new <reference class="java.sql.Connection"/> at will, is to hook into the <reference id="execute-listeners" title="Execute Listener support"/>. More details about this can be found in the manual's chapter about <reference id="execute-listeners" title="ExecuteListeners"/>
    -									</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -					
    -					<section id="scala-sql-building">
    -						<title>SQL building in Scala</title>
    -						<content><html>
    -							<p>
    -								jOOQ-Scala is a maven module used for leveraging some advanced Scala features for those users that wish to use jOOQ with Scala.
    -							</p>
    -							
    -							<h3>Using Scala's implicit defs to allow for operator overloading</h3>
    -							<p>
    -								The most obvious Scala feature to use in jOOQ are implicit defs for implicit conversions in order to enhance the <reference class="org.jooq.Field"/> type with SQL-esque operators. 
    -							</p>
    -							<p>
    -								The following depicts a trait which wraps all fields:
    -							</p>
    -							
    -</html><scala><![CDATA[/**
    - * A Scala-esque representation of {@link org.jooq.Field}, adding overloaded
    - * operators for common jOOQ operations to arbitrary fields
    - */
    -trait SAnyField[T] extends Field[T] {
    -
    -    // String operations
    -    // -----------------
    -
    -    def ||(value : String)            : Field[String]
    -    def ||(value : Field[_])          : Field[String]
    -
    -    // Comparison predicates
    -    // ---------------------
    -
    -    def ===(value : T)                : Condition
    -    def ===(value : Field[T])         : Condition
    -
    -    def !==(value : T)                : Condition
    -    def !==(value : Field[T])         : Condition
    -
    -    def <>(value : T)                 : Condition
    -    def <>(value : Field[T])          : Condition
    -
    -    def >(value : T)                  : Condition
    -    def >(value : Field[T])           : Condition
    -
    -    def >=(value : T)                 : Condition
    -    def >=(value : Field[T])          : Condition
    -
    -    def <(value : T)                  : Condition
    -    def <(value : Field[T])           : Condition
    -
    -    def <=(value : T)                 : Condition
    -    def <=(value : Field[T])          : Condition
    -
    -    def <=>(value : T)                : Condition
    -    def <=>(value : Field[T])         : Condition
    -}]]></scala><html>
    -
    -							<p>
    -								The following depicts a trait which wraps numeric fields:
    -							</p>
    -							
    -</html><scala><![CDATA[/**
    - * A Scala-esque representation of {@link org.jooq.Field}, adding overloaded
    - * operators for common jOOQ operations to numeric fields
    - */
    -trait SNumberField[T <: Number] extends SAnyField[T] {
    -
    -    // Arithmetic operations
    -    // ---------------------
    -
    -    def unary_-                       : Field[T]
    -
    -    def +(value : Number)             : Field[T]
    -    def +(value : Field[_ <: Number]) : Field[T]
    -
    -    def -(value : Number)             : Field[T]
    -    def -(value : Field[_ <: Number]) : Field[T]
    -
    -    def *(value : Number)             : Field[T]
    -    def *(value : Field[_ <: Number]) : Field[T]
    -
    -    def /(value : Number)             : Field[T]
    -    def /(value : Field[_ <: Number]) : Field[T]
    -
    -    def %(value : Number)             : Field[T]
    -    def %(value : Field[_ <: Number]) : Field[T]
    -
    -    // Bitwise operations
    -    // ------------------
    -
    -    def unary_~                       : Field[T]
    -
    -    def &(value : T)                  : Field[T]
    -    def &(value : Field[T])           : Field[T]
    -
    -    def |(value : T)                  : Field[T]
    -    def |(value : Field[T])           : Field[T]
    -
    -    def ^(value : T)                  : Field[T]
    -    def ^(value : Field[T])           : Field[T]
    -
    -    def <<(value : T)                 : Field[T]
    -    def <<(value : Field[T])          : Field[T]
    -
    -    def >>(value : T)                 : Field[T]
    -    def >>(value : Field[T])          : Field[T]
    -}]]></scala><html>
    -
    -							<p>
    -								An example query using such overloaded operators would then look like this:
    -							</p>
    -							
    -</html><scala><![CDATA[select (
    -  T_BOOK.ID * T_BOOK.AUTHOR_ID,
    -  T_BOOK.ID + T_BOOK.AUTHOR_ID * 3 + 4,
    -  T_BOOK.TITLE || " abc" || " xy")
    -from T_BOOK
    -leftOuterJoin (
    -  f select (x.ID, x.YEAR_OF_BIRTH)
    -  from x
    -  limit 1
    -  asTable x.getName()
    -)
    -on T_BOOK.AUTHOR_ID === x.ID
    -where (T_BOOK.ID <> 2)
    -or (T_BOOK.TITLE in ("O Alquimista", "Brida"))
    -fetch]]></scala><html>
    -
    -							<h3>Scala 2.10 Macros</h3>
    -							<p>
    -								This feature is still being experimented with. With Scala Macros, it might be possible to inline a true SQL dialect into the Scala syntax, backed by the jOOQ API. Stay tuned!
    -							</p>
    -						</html></content>
    -					</section>
    -				</sections>
    -			</section>
    -
    -			<section id="sql-execution">
    -				<title>SQL execution</title>
    -				<content><html>
    -					<p>
    -						In a previous section of the manual, we've seen how jOOQ can be used to <reference id="sql-building" title="build SQL"/> that can be executed with any API including JDBC or ... jOOQ. This section of the manual deals with various means of actually executing SQL with jOOQ.
    -					</p>
    -					
    -					<h3>SQL execution with JDBC</h3>
    -					<p>
    -						JDBC calls executable objects "<reference class="java.sql.Statement"/>". It distinguishes between three types of statements:
    -					</p>
    -					<ul>
    -						<li><reference class="java.sql.Statement"/>, or "static statement": This statement type is used for any arbitrary type of SQL statement. It is particularly useful with <reference id="inlined-parameters" title="inlined parameters"/></li>
    -						<li><reference class="java.sql.PreparedStatement"/>: This statement type is used for any arbitrary type of SQL statement. It is particularly useful with <reference id="indexed-parameters" title="indexed parameters"/> (note that JDBC does not support <reference id="named-parameters" title="named parameters"/>)</li>
    -						<li><reference class="java.sql.CallableStatement"/>: This statement type is used for SQL statements that are "called" rather than "executed". In particular, this includes calls to <reference id="stored-procedures" title="stored procedures"/>. Callable statements can register OUT parameters</li>
    -					</ul>
    -					<p>
    -						Today, the JDBC API may look weird to users being used to object-oriented design. While statements hide a lot of SQL dialect-specific implementation details quite well, they assume a lot of knowledge about the internal state of a statement. For instance, you can use the <reference class="java.sql.PreparedStatement" anchor="#addBatch()" title="PreparedStatement.addBatch()"/> method, to add a the prepared statement being created to an "internal list" of batch statements. Instead of returning a new type, this method forces user to reflect on the prepared statement's internal state or "mode".
    -					</p>
    -					
    -					<h3>jOOQ is wrapping JDBC</h3>
    -					<p>						
    -						These things are abstracted away by jOOQ, which exposes such concepts in a more object-oriented way. For more details about jOOQ's batch query execution, see the manual's section about <reference id="batch-execution" title="batch execution"/>.
    -					</p> 
    -					<p>
    -						The following sections of this manual will show how jOOQ is wrapping JDBC for SQL execution
    -					</p>
    -				</html></content>
    -
    -				<sections>
    -					<section id="comparison-with-jdbc">
    -						<title>Comparison between jOOQ and JDBC</title>
    -						<content><html>
    -							<h3>Similarities with JDBC</h3>
    -							<p>
    -								Even if there are <reference id="query-vs-resultquery" title="two general types of Query"/>, there are a lot of similarities between JDBC and jOOQ. Just to name a few:
    -							</p>
    -							<ul>
    -								<li>Both APIs return the number of affected records in non-result queries. JDBC: <reference class="java.sql.Statement" anchor="#executeUpdate(java.lang.String)" title="Statement.executeUpdate()"/>, jOOQ: <reference class="org.jooq.Query" anchor="#execute()" title="Query.execute()"/></li>
    -								<li>Both APIs return a scrollable result set type from result queries. JDBC: <reference class="java.sql.ResultSet"/>, jOOQ: <reference class="org.jooq.Result"/></li>
    -							</ul>
    -							
    -							<h3>Differences to JDBC</h3>
    -							<p>
    -								Some of the most important differences between JDBC and jOOQ are listed here:
    -							</p>
    -							<ul>
    -								<li><reference id="query-vs-resultquery" title="Query vs. ResultQuery"/>: JDBC does not formally distinguish between queries that can return results, and queries that cannot. The same API is used for both. This greatly reduces the possibility for <reference id="fetching" title="fetching convenience methods"/></li>
    -								<li><reference id="exception-handling" title="Exception handling"/>: While SQL uses the checked <reference class="java.sql.SQLException"/>, jOOQ wraps all exceptions in an unchecked <reference class="org.jooq.exception.DataAccessException"/></li>
    -								<li><reference class="org.jooq.Result"/>: Unlike its JDBC counter-part, this type implements <reference class="java.util.List"/> and is fully loaded into Java memory, freeing resources as early as possible. Just like statements, this means that users don't have to deal with a "weird" internal result set state.</li>
    -								<li><reference class="org.jooq.Cursor"/>: If you want more fine-grained control over how many records are fetched into memory at once, you can still do that using jOOQ's <reference id="lazy-fetching" title="lazy fetching"/> feature</li>
    -								<li><reference id="statement-type" title="Statement type"/>: jOOQ does not formally distinguish between static statements and prepared statements. By default, all statements are prepared statements in jOOQ, internally. Executing a statement as a static statement can be done simply using a <reference id="custom-settings" title="custom settings flag"/></li>
    -								<li><reference id="reusing-statements" title="Closing Statements"/>: JDBC keeps open resources even if they are already consumed. With JDBC, there is a lot of verbosity around safely closing resources. In jOOQ, resources are closed after consumption, by default. If you want to keep them open after consumption, you have to explicitly say so.</li>
    -							</ul>
    -						</html></content>
    -					</section>
    -				    
    -				    <section id="query-vs-resultquery">
    -						<title>Query vs. ResultQuery</title>
    -						<content><html>
    -							<p>
    -								Unlike JDBC, jOOQ has a lot of knowledge about a SQL query's structure and internals (see the manual's section about <reference id="sql-building" title="SQL building"/>). Hence, jOOQ distinguishes between these two fundamental types of queries. While every <reference class="org.jooq.Query"/> can be executed, only <reference class="org.jooq.ResultQuery"/> can return results (see the manual's section about <reference id="fetching" title="fetching"/> to learn more about fetching results). With plain SQL, the distinction can be made clear most easily:
    -							</p>
    -							
    -</html><java><![CDATA[// Create a Query object and execute it:
    -Query query = create.query("DELETE FROM BOOK");
    -query.execute();
    -
    -// Create a ResultQuery object and execute it, fetching results:
    -ResultQuery<Record> resultQuery = create.resultQuery("SELECT * FROM BOOK");
    -Result<Record> resultQuery.fetch();]]></java></content>
    -					</section>
    -
    -				    <section id="fetching">
    -						<title>Fetching</title>
    -						<content><html>
    -							<p>
    -								Fetching is something that has been completely neglegted by JDBC and also by various other database abstraction libraries. Fetching is much more than just looping or listing records or mapped objects. There are so many ways you may want to fetch data from a database, it should be considered a first-class feature of any database abstraction API. Just to name a few, here are some of jOOQ's fetching modes:
    -							</p>
    -							<ul>
    -								<li><reference id="record-vs-tablerecord" title="Untyped vs. typed fetching"/>: Sometimes you care about the returned type of your records, sometimes (with arbitrary projections) you don't.</li>
    -								<li><reference id="arrays-maps-and-lists" title="Fetching arrays, maps, or lists"/>: Instead of letting you transform your result sets into any more suitable data type, a library should do that work for you.</li>
    -								<li><reference id="recordhandler" title="Fetching through handler callbacks"/>: This is an entirely different fetching paradigm. With Java 8's lambda expressions, this will become even more powerful.</li>
    -								<li><reference id="recordmapper" title="Fetching through mapper callbacks"/>: This is an entirely different fetching paradigm. With Java 8's lambda expressions, this will become even more powerful.</li>
    -								<li><reference id="pojos" title="Fetching custom POJOs"/>: This is what made Hibernate and JPA so strong. Automatic mapping of tables to custom POJOs.</li>
    -								<li><reference id="lazy-fetching" title="Lazy vs. eager fetching"/>: It should be easy to distinguish these two fetch modes.</li>
    -								<li><reference id="many-fetching" title="Fetching many results"/>: Some databases allow for returning many result sets from a single query. JDBC can handle this but it's very verbose. A list of results should be returned instead.</li>
    -								<li><reference id="later-fetching" title="Fetching data asynchronously"/>: Some queries take too long to execute to wait for their results. You should be able to spawn query execution in a separate process.</li>
    -							</ul>
    -							
    -							<h3>Convenience and how ResultQuery, Result, and Record share API</h3>
    -							<p>
    -								The term "fetch" is always reused in jOOQ when you can fetch data from the database. An <reference class="org.jooq.ResultQuery"/> provides many overloaded means of fetching data:
    -							</p>
    -							
    -							<h3>Various modes of fetching</h3>
    -							<p>
    -								These modes of fetching are also documented in subsequent sections of the manual
    -							</p>
    -							
    -</html><java><![CDATA[// The "standard" fetch
    -Result<R> fetch();    
    -
    -// The "standard" fetch when you know your query returns only one record
    -R fetchOne();
    -
    -// The "standard" fetch when you only want to fetch the first record
    -R fetchAny();
    -
    -// Create a "lazy" Cursor, that keeps an open underlying JDBC ResultSet
    -Cursor<R> fetchLazy();
    -Cursor<R> fetchLazy(int fetchSize);
    -
    -// Create a java.util.concurrent.Future, to handle asynchronous execution of the ResultQuery
    -FutureResult<R> fetchLater();
    -FutureResult<R> fetchLater(ExecutorService executor);
    -
    -// Fetch several results at once
    -List<Result<Record>> fetchMany();
    -
    -// Fetch records into a custom callback
    -<H extends RecordHandler<R>> H fetchInto(H handler);
    -
    -// Map records using a custom callback
    -<E> List<E> fetch(RecordMapper<? super R, E> mapper);
    -
    -// Execute a ResultQuery with jOOQ, but return a JDBC ResultSet, not a jOOQ object
    -ResultSet fetchResultSet();]]></java><html>
    -							
    -							<h3>Fetch convenience</h3>
    -							<p>
    -								These means of fetching are also available from <reference class="org.jooq.Result"/> and <reference class="org.jooq.Record"/> APIs
    -							</p>
    -
    -</html><java><![CDATA[// These methods are convenience for fetching only a single field, 
    -// possibly converting results to another type
    -<T>    List<T> fetch(Field<T> field);
    -<T>    List<T> fetch(Field<?> field, Class<? extends T> type);
    -<T, U> List<U> fetch(Field<T> field, Converter<? super T, U> converter);
    -       List<?> fetch(int fieldIndex);
    -<T>    List<T> fetch(int fieldIndex, Class<? extends T> type);
    -<U>    List<U> fetch(int fieldIndex, Converter<?, U> converter);
    -       List<?> fetch(String fieldName);
    -<T>    List<T> fetch(String fieldName, Class<? extends T> type);
    -<U>    List<U> fetch(String fieldName, Converter<?, U> converter);
    -
    -// These methods are convenience for fetching only a single field, possibly converting results to another type
    -// Instead of returning lists, these return arrays
    -<T>    T[]      fetchArray(Field<T> field);
    -<T>    T[]      fetchArray(Field<?> field, Class<? extends T> type);
    -<T, U> U[]      fetchArray(Field<T> field, Converter<? super T, U> converter);
    -       Object[] fetchArray(int fieldIndex);
    -<T>    T[]      fetchArray(int fieldIndex, Class<? extends T> type);
    -<U>    U[]      fetchArray(int fieldIndex, Converter<?, U> converter);
    -       Object[] fetchArray(String fieldName);
    -<T>    T[]      fetchArray(String fieldName, Class<? extends T> type);
    -<U>    U[]      fetchArray(String fieldName, Converter<?, U> converter);
    -
    -// These methods are convenience for fetching only a single field from a single record, 
    -// possibly converting results to another type
    -<T>    T      fetchOne(Field<T> field);
    -<T>    T      fetchOne(Field<?> field, Class<? extends T> type);
    -<T, U> U      fetchOne(Field<T> field, Converter<? super T, U> converter);
    -       Object fetchOne(int fieldIndex);
    -<T>    T      fetchOne(int fieldIndex, Class<? extends T> type);
    -<U>    U      fetchOne(int fieldIndex, Converter<?, U> converter);
    -       Object fetchOne(String fieldName);
    -<T>    T      fetchOne(String fieldName, Class<? extends T> type);
    -<U>    U      fetchOne(String fieldName, Converter<?, U> converter);]]></java><html>
    -
    -							<h3>Fetch transformations</h3>
    -							<p>
    -								These means of fetching are also available from <reference class="org.jooq.Result"/> and <reference class="org.jooq.Record"/> APIs
    -							</p>
    -							
    -</html><java><![CDATA[// Transform your Records into arrays, Results into matrices
    -       Object[][] fetchArrays();
    -       Object[]   fetchOneArray();
    -       
    -// Reduce your Result object into maps
    -<K>    Map<K, R>      fetchMap(Field<K> key);
    -<K, V> Map<K, V>      fetchMap(Field<K> key, Field<V> value);
    -<K, E> Map<K, E>      fetchMap(Field<K> key, Class<E> value);
    -       Map<Record, R> fetchMap(Field<?>[] key);
    -<E>    Map<Record, E> fetchMap(Field<?>[] key, Class<E> value);       
    -
    -// Transform your Result object into maps
    -       List<Map<String, Object>> fetchMaps();
    -       Map<String, Object>       fetchOneMap();
    -
    -// Transform your Result object into groups
    -<K>    Map<K, Result<R>>      fetchGroups(Field<K> key);
    -<K, V> Map<K, List<V>>        fetchGroups(Field<K> key, Field<V> value);
    -<K, E> Map<K, List<E>>        fetchGroups(Field<K> key, Class<E> value);
    -       Map<Record, Result<R>> fetchGroups(Field<?>[] key);
    -<E>    Map<Record, List<E>>   fetchGroups(Field<?>[] key, Class<E> value);
    -
    -// Transform your Records into custom POJOs
    -<E>    List<E> fetchInto(Class<? extends E> type);
    -
    -// Transform your records into another table type
    -<Z extends Record> Result<Z> fetchInto(Table<Z> table);]]></java><html>
    -
    -							<p>
    -								Note, that apart from the <reference class="org.jooq.ResultQuery" anchor="#fetchLazy()" title="fetchLazy()"/> methods, all fetch() methods will immediately close underlying JDBC result sets.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="record-vs-tablerecord">
    -								<title>Record vs. TableRecord</title>
    -								<content><html>
    -									<p>
    -										jOOQ understands that SQL is much more expressive than Java, when it comes to the declarative typing of <reference id="table-expressions" title="table expressions"/>. As a declarative language, SQL allows for creating ad-hoc row value expressions (records with indexed columns) and records (records with named columns). In Java, this is not possible to the same extent. Yet, still, sometimes you wish to use strongly typed records, when you know that you're selecting only from a single table
    -									</p>
    -									
    -									<h3>Fetching strongly or weakly typed records</h3>
    -									<p>
    -										When fetching data only from a single table, the <reference id="table-expressions" title="table expression's"/> type is known to jOOQ if you use jOOQ's <reference id="code-generation" title="code generator"/> to generate <reference id="codegen-records" title="TableRecords"/> for your database tables. In order to fetch such strongly typed records, you will have to use the <reference id="select-statement" title="simple select API"/>:
    -									</p>
    -
    -</html><java><![CDATA[// Use the selectFrom() method:
    -BookRecord book = create.selectFrom(BOOK).where(BOOK.ID.equal(1)).fetchOne();
    -
    -// Typesafe field access is now possible:
    -System.out.println("Title       : " + book.getTitle());
    -System.out.println("Published in: " + book.getPublishedIn());]]></java><html>
    -									
    -									<p>
    -										When you use the <reference class="org.jooq.FactoryOperations" anchor="#selectFrom(org.jooq.Table)" title="Factory.selectFrom()"/> method, jOOQ will return the record type supplied with the argument table. Beware though, that you will no longer be able to use any clause that modifies the type of your <reference id="table-expressions" title="table expression"/>. This includes: 
    -									</p>
    -									<ul>
    -                   						<li><reference id="select-clause" title="The SELECT clause"/></li>
    -                   						<li><reference id="join-clause" title="The JOIN clause"/></li>
    -                   						<li><reference id="group-by-clause" title="The GROUP BY clause"/></li>
    -                   						<li><reference id="having-clause" title="The HAVING clause"/></li>
    -                   					</ul>		
    -								</html></content>
    -							</section>
    -
    -							<section id="arrays-maps-and-lists">
    -								<title>Arrays, Maps and Lists</title>
    -								<content><html>
    -									<p>
    -										By default, jOOQ returns an <reference class="org.jooq.Result"/> object, which is essentially a <reference class="java.util.List"/> of <reference class="org.jooq.Record"/>. Often, you will find yourself wanting to transform this result object into a type that corresponds more to your specific needs. Or you just want to list all values of one specific column. Here are some examples to illustrate those use cases:
    -									</p>
    -									
    -</html><java><![CDATA[// Fetching only book titles (the two calls are equivalent):
    -List<String> titles1 = create.select().from(BOOK).fetch().getValues(BOOK.TITLE);
    -List<String> titles2 = create.select().from(BOOK).fetch(BOOK.TITLE);
    -String[]     titles3 = create.select().from(BOOK).fetchArray(BOOK.TITLE);
    -
    -// Fetching only book IDs, converted to Long
    -List<Long> ids1 = create.select().from(BOOK).fetch().getValues(BOOK.ID, Long.class);
    -List<Long> ids2 = create.select().from(BOOK).fetch(BOOK.ID, Long.class);
    -Long[]     ids3 = create.select().from(BOOK).fetchArray(BOOK.ID, Long.class);
    -
    -// Fetching book IDs and mapping each ID to their records or titles
    -Map<Integer, BookRecord> map1 = create.selectFrom(BOOK).fetch().intoMap(BOOK.ID);
    -Map<Integer, BookRecord> map2 = create.selectFrom(BOOK).fetchMap(BOOK.ID);
    -Map<Integer, String>     map3 = create.selectFrom(BOOK).fetch().intoMap(BOOK.ID, BOOK.TITLE);
    -Map<Integer, String>     map4 = create.selectFrom(BOOK).fetchMap(BOOK.ID, BOOK.TITLE);
    -
    -// Group by AUTHOR_ID and list all books written by any author:       
    -Map<Integer, Result<BookRecord>> group1 = create.selectFrom(BOOK).fetch().intoGroups(BOOK.AUTHOR_ID);
    -Map<Integer, Result<BookRecord>> group2 = create.selectFrom(BOOK).fetchGroups(BOOK.AUTHOR_ID);
    -Map<Integer, List<String>>       group3 = create.selectFrom(BOOK).fetch().intoGroups(BOOK.AUTHOR_ID, BOOK.TITLE);
    -Map<Integer, List<String>>       group4 = create.selectFrom(BOOK).fetchGroups(BOOK.AUTHOR_ID, BOOK.TITLE);]]></java><html>									
    -
    -									<p>
    -										Note that most of these convenience methods are available both through <reference class="org.jooq.ResultQuery"/> and <reference class="org.jooq.Result"/>, some are even available through <reference class="org.jooq.Record"/> as well.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="recordhandler">
    -								<title>RecordHandler</title>
    -								<content><html>
    -									<p>
    -										In a more functional operating mode, you might want to write callbacks that receive records from your select statement results in order to do some processing. This is a common data access pattern in Spring's JdbcTemplate, and it is also available in jOOQ. With jOOQ, you can implement your own <reference class="org.jooq.RecordHandler"/> classes and plug them into jOOQ's <reference class="org.jooq.ResultQuery"/>:
    -									</p>
    -									
    -</html><java><![CDATA[// Write callbacks to receive records from select statements
    -create.selectFrom(BOOK)
    -      .orderBy(BOOK.ID)
    -      .fetch()
    -      .into(new RecordHandler<BookRecord>() {
    -          @Override
    -          public void next(BookRecord book) {
    -              Util.doThingsWithBook(book);
    -          }
    -      });
    -      
    -// Or more concisely
    -create.selectFrom(BOOK)
    -      .orderBy(BOOK.ID)
    -      .fetchInto(new RecordHandler<BookRecord>() {...});
    -      
    -// Or even more concisely with Java 8's lambda expressions:
    -create.selectFrom(BOOK)
    -      .orderBy(BOOK.ID)
    -      .fetchInto(book -> { Util.doThingsWithBook(book); }; );
    -]]></java><html>
    -
    -									<p>
    -										See also the manual's section about the <reference id="recordmapper" title="RecordMapper"/>, which provides similar features
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="recordmapper">
    -								<title>RecordMapper</title>
    -								<content><html>
    -									<p>
    -										In a more functional operating mode, you might want to write callbacks that map records from your select statement results in order to do some processing. This is a common data access pattern in Spring's JdbcTemplate, and it is also available in jOOQ. With jOOQ, you can implement your own <reference class="org.jooq.RecordMapper"/> classes and plug them into jOOQ's <reference class="org.jooq.ResultQuery"/>:
    -									</p>
    -									
    -</html><java><![CDATA[// Write callbacks to receive records from select statements
    -List<Integer> ids =
    -create.selectFrom(BOOK)
    -      .orderBy(BOOK.ID)
    -      .fetch()
    -      .map(new RecordMapper<BookRecord, Integer>() {
    -          @Override
    -          public Integer map(BookRecord book) {
    -              return book.getId();
    -          }
    -      });
    -      
    -// Or more concisely
    -create.selectFrom(BOOK)
    -      .orderBy(BOOK.ID)
    -      .fetch(new RecordMapper<BookRecord, Integer>() {...});
    -      
    -// Or even more concisely with Java 8's lambda expressions:
    -create.selectFrom(BOOK)
    -      .orderBy(BOOK.ID)
    -      .fetch(book -> book.getId());
    -]]></java><html>
    -
    -									<p>
    -										See also the manual's section about the <reference id="recordhandler" title="RecordHandler"/>, which provides similar features
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="pojos">
    -								<title>POJOs</title>
    -								<content><html>
    -									<p>
    -										Fetching data in records is fine as long as your application is not really layered, or as long as you're still writing code in the DAO layer. But if you have a more advanced application architecture, you may not want to allow for jOOQ artefacts to leak into other layers. You may choose to write POJOs (Plain Old Java Objects) as your primary DTOs (Data Transfer Objects), without any dependencies on jOOQ's <reference class="org.jooq.Record"/> types, which may even potentially hold a reference to a <reference id="factory" title="Factory"/>, and thus a JDBC <reference class="java.sql.Connection"/>. Like Hibernate/JPA, jOOQ allows you to operate with POJOs. Unlike Hibernate/JPA, jOOQ does not "attach" those POJOs or create proxies with any magic in them.
    -									</p>
    -									<p>
    -										If you're using jOOQ's <reference id="code-generation" title="code generator"/>, you can configure it to <reference id="codegen-pojos" title="generate POJOs"/> for you, but you're not required to use those generated POJOs. You can use your own.
    -									</p>
    -									
    -									<h3>Using JPA-annotated POJOs</h3>									
    -									<p>
    -										jOOQ tries to find JPA annotations on your POJO types. If it finds any, they are used as the primary source for mapping meta-information. Only the <reference class="javax.persistence.Column"/> annotation is used and understood by jOOQ. An example:
    -									</p>
    -
    -</html><java><![CDATA[// A JPA-annotated POJO class
    -public class MyBook {
    -  @Column(name = "ID")
    -  public int myId;
    -  
    -  @Column(name = "TITLE")
    -  public String myTitle;
    -}
    -
    -// The various "into()" methods allow for fetching records into your custom POJOs:
    -MyBook myBook        = create.select().from(BOOK).fetchAny().into(MyBook.class); 
    -List<MyBook> myBooks = create.select().from(BOOK).fetch().into(MyBook.class);
    -List<MyBook> myBooks = create.select().from(BOOK).fetchInto(MyBook.class);]]></java><html>									
    -									
    -									<p>
    -										Just as with any other JPA implementation, you can put the <reference class="javax.persistence.Column"/> annotation on any class member, including attributes, setters and getters. Please refer to the <reference class="org.jooq.Record" anchor="#into(java.lang.Class)" title="Record.into()"/> Javadoc for more details.
    -									</p>
    -									
    -									<h3>Using simple POJOs</h3>
    -									<p>
    -										If jOOQ does not find any JPA-annotations, columns are mapped to the "best-matching" constructor, attribute or setter. An example illustrates this:
    -									</p>
    -									
    -</html><java><![CDATA[// A "mutable" POJO class
    -public class MyBook1 {
    -  public int id;
    -  public String title;
    -}
    -
    -// The various "into()" methods allow for fetching records into your custom POJOs:
    -MyBook1 myBook        = create.select().from(BOOK).fetchAny().into(MyBook1.class); 
    -List<MyBook1> myBooks = create.select().from(BOOK).fetch().into(MyBook1.class);
    -List<MyBook1> myBooks = create.select().from(BOOK).fetchInto(MyBook1.class);]]></java><html>	
    -
    -									<p>
    -										Please refer to the <reference class="org.jooq.Record" anchor="#into(java.lang.Class)" title="Record.into()"/> Javadoc for more details.
    -									</p>
    -									
    -									<h3>Using "immutable" POJOs</h3>
    -									<p>
    -										If jOOQ does not find any default constructor, columns are mapped to the "best-matching" constructor. This allows for using "immutable" POJOs with jOOQ. An example illustrates this:
    -									</p>
    -									
    -</html><java><![CDATA[// An "immutable" POJO class
    -public class MyBook2 {
    -  public final int id;
    -  public final String title;
    -  
    -  public MyBook2(int id, String title) {
    -    this.id = id;
    -    this.title = title;
    -  }
    -}
    -
    -// With "immutable" POJO classes, there must be an exact match between projected fields and available constructors:
    -MyBook2 myBook        = create.select(BOOK.ID, BOOK.TITLE).from(BOOK).fetchAny().into(MyBook2.class); 
    -List<MyBook2> myBooks = create.select(BOOK.ID, BOOK.TITLE).from(BOOK).fetch().into(MyBook2.class);
    -List<MyBook2> myBooks = create.select(BOOK.ID, BOOK.TITLE).from(BOOK).fetchInto(MyBook2.class);
    -
    -// An "immutable" POJO class with a java.beans.ConstructorProperties annotation
    -public class MyBook3 {
    -  public final String title;
    -  public final int id;
    -  
    -  @ConstructorProperties({ "title", "id"})
    -  public MyBook2(String title, int id) {
    -    this.title = title;
    -    this.id = id;
    -  }
    -}
    -
    -// With annotated "immutable" POJO classes, there doesn't need to be an exact match between fields and constructor arguments.
    -// In the below cases, only BOOK.ID is really set onto the POJO, BOOK.TITLE remains null and BOOK.AUTHOR_ID is ignored
    -MyBook3 myBook        = create.select(BOOK.ID, BOOK.AUTHOR_ID).from(BOOK).fetchAny().into(MyBook3.class); 
    -List<MyBook3> myBooks = create.select(BOOK.ID, BOOK.AUTHOR_ID).from(BOOK).fetch().into(MyBook3.class);
    -List<MyBook3> myBooks = create.select(BOOK.ID, BOOK.AUTHOR_ID).from(BOOK).fetchInto(MyBook3.class);
    -]]></java><html>	
    -									
    -									<p>
    -										Please refer to the <reference class="org.jooq.Record" anchor="#into(java.lang.Class)" title="Record.into()"/> Javadoc for more details.
    -									</p>
    -
    -									<h3>Using proxyable types</h3>
    -									<p>
    -										jOOQ also allows for fetching data into abstract classes or interfaces, or in other words, "proxyable" types. This means that jOOQ will return a <reference class="java.util.HashMap"/> wrapped in a <reference class="java.lang.reflect.Proxy"/> implementing your custom type. An example of this is given here:
    -									</p>
    -									
    -</html><java><![CDATA[// A "proxyable" type
    -public interface MyBook3 {
    -  int getId(); 
    -  void setId(int id);
    -  
    -  String getTitle();
    -  void setTitle(String title);
    -}
    -
    -// The various "into()" methods allow for fetching records into your custom POJOs:
    -MyBook3 myBook        = create.select(BOOK.ID, BOOK.TITLE).from(BOOK).fetchAny().into(MyBook3.class); 
    -List<MyBook3> myBooks = create.select(BOOK.ID, BOOK.TITLE).from(BOOK).fetch().into(MyBook3.class);
    -List<MyBook3> myBooks = create.select(BOOK.ID, BOOK.TITLE).from(BOOK).fetchInto(MyBook3.class);]]></java><html>									
    -
    -									<p>
    -										Please refer to the <reference class="org.jooq.Record" anchor="#into(java.lang.Class)" title="Record.into()"/> Javadoc for more details.
    -									</p>
    -
    -									<h3>Loading POJOs back into Records to store them</h3>
    -									<p>
    -										The above examples show how to fetch data into your own custom POJOs / DTOs. When you have modified the data contained in POJOs, you probably want to store those modifications back to the database. An example of this is given here:
    -									</p>
    -
    -</html><java><![CDATA[// A "mutable" POJO class
    -public class MyBook {
    -  public int id;
    -  public String title;
    -}
    -
    -// Create a new POJO instance
    -MyBook myBook = new MyBook();
    -myBook.id = 10;
    -myBook.title = "Animal Farm";
    -
    -// Load a jOOQ-generated BookRecord from your POJO
    -BookRecord book = create.newRecord(BOOK, myBook); 
    -
    -// Insert it (implicitly)
    -book.store();
    -
    -// Insert it (explicitly)
    -create.executeInsert(book);
    -
    -// or update it (ID = 10)
    -create.executeUpdate(book);]]></java><html>
    -							
    -									<p>
    -										Note: Because of your manual setting of ID = 10, jOOQ's store() method will asume that you want to insert a new record. See the manual's section about <reference id="crud-with-updatablerecords" title="CRUD with UpdatableRecords"/> for more details on this.
    -									</p>
    -											
    -									<h3>Interaction with DAOs</h3>
    -									<p>
    -										If you're using jOOQ's <reference id="code-generation" title="code generator"/>, you can configure it to <reference id="codegen-daos" title="generate DAOs"/> for you. Those DAOs operate on <reference id="codegen-pojos" title="generated POJOs"/>. An example of using such a DAO is given here:
    -									</p>
    -
    -</html><java><![CDATA[// Initialise a Factory
    -Factory create = new Factory(connection, SQLDialect.ORACLE);
    -
    -// Initialise the DAO with the Factory
    -BookDao bookDao = new BookDao(create);
    -
    -// Start using the DAO
    -Book book = bookDao.findById(5);
    -
    -// Modify and update the POJO
    -book.setTitle("1984");
    -book.setPublishedIn(1948);
    -bookDao.update(book);
    -
    -// Delete it again
    -bookDao.delete(book);]]></java><html>
    -									
    -									<h3>More complex data structures</h3>
    -									<p>
    -										jOOQ currently doesn't support more complex data structures, the way Hibernate/JPA attempt to map relational data onto POJOs. While future developments in this direction are not excluded, jOOQ claims that generic mapping strategies lead to an enormous additional complexity that only serves very few use cases. You are likely to find a solution using any of jOOQ's various <reference id="fetching" title="fetching modes"/>, with only little boiler-plate code on the client side.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="lazy-fetching">
    -								<title>Lazy fetching</title>
    -								<content><html>
    -									<p>
    -										Unlike JDBC's <reference class="java.sql.ResultSet"/>, jOOQ's <reference class="org.jooq.Result"/> does not represent an open database cursor with various fetch modes and scroll modes, that needs to be closed after usage. jOOQ's results are simple in-memory Java <reference class="java.util.List"/> objects, containing all of the result values. If your result sets are large, or if you have a lot of network latency, you may wish to fetch records one-by-one, or in small chunks. jOOQ supports a <reference class="org.jooq.Cursor"/> type for that purpose. In order to obtain such a reference, use the <reference class="org.jooq.ResultQuery" anchor="#fetchLazy()" title="ResultQuery.fetchLazy()"/> method. An example is given here:
    -									</p>
    -									
    -</html><java><![CDATA[// Obtain a Cursor reference:
    -Cursor<BookRecord> cursor = null;
    -
    -try {
    -    cursor = create.selectFrom(BOOK).fetchLazy();
    -
    -    // Cursor has similar methods as Iterator<R>
    -    while (cursor.hasNext()) {
    -        BookRecord book = cursor.fetchOne();
    -        
    -        Util.doThingsWithBook(book);
    -    }
    -}
    -
    -// Close the cursor and the cursor's underlying JDBC ResultSet
    -finally {
    -    if (cursor != null) {
    -        cursor.close();
    -    }
    -}]]></java><html>
    -
    -									<p>
    -										As a <reference class="org.jooq.Cursor"/> holds an internal reference to an open <reference class="java.sql.ResultSet"/>, it may need to be closed at the end of iteration. If a cursor is completely scrolled through, it will conveniently close the underlying ResultSet. However, you should not rely on that.
    -									</p>
    -									
    -									<h3>Cursors ship with all the other fetch features</h3>
    -									<p>
    -										Like <reference class="org.jooq.ResultQuery"/> or <reference class="org.jooq.Result"/>, <reference class="org.jooq.Cursor"/> gives access to all of the other fetch features that we've seen so far, i.e.
    -									</p>
    -									<ul>
    -										<li><reference id="record-vs-tablerecord" title="Strongly or weakly typed records"/>: Cursors are also typed with the &lt;R&gt; type, allowing to fetch custom, generated <reference class="org.jooq.TableRecord"/> or plain <reference class="org.jooq.Record"/> types.</li>
    -										<li><reference id="recordhandler" title="RecordHandler callbacks"/>: You can use your own <reference class="org.jooq.RecordHandler"/> callbacks to receive lazily fetched records.</li>
    -										<li><reference id="recordmapper" title="RecordMapper callbacks"/>: You can use your own <reference class="org.jooq.RecordMapper"/> callbacks to map lazily fetched records.</li>
    -										<li><reference id="pojos" title="POJOs"/>: You can fetch data into your own custom POJO types.</li>
    -									</ul>
    -								</html></content>
    -							</section>
    -
    -							<section id="many-fetching">
    -								<title>Many fetching</title>
    -								<content><html>
    -									<p>
    -										Many databases support returning several result sets, or cursors, from single queries. An example for this is Sybase ASE's sp_help command:
    -									</p>
    -</html><text><![CDATA[> sp_help 'author'
    -
    -+--------+-----+-----------+-------------+-------------------+
    -|Name    |Owner|Object_type|Object_status|Create_date        |
    -+--------+-----+-----------+-------------+-------------------+
    -|  author|dbo  |user table | -- none --  |Sep 22 2011 11:20PM|
    -+--------+-----+-----------+-------------+-------------------+
    -
    -+-------------+-------+------+----+-----+-----+
    -|Column_name  |Type   |Length|Prec|Scale|...  |
    -+-------------+-------+------+----+-----+-----+
    -|id           |int    |     4|NULL| NULL|    0|
    -|first_name   |varchar|    50|NULL| NULL|    1|
    -|last_name    |varchar|    50|NULL| NULL|    0|
    -|date_of_birth|date   |     4|NULL| NULL|    1|
    -|year_of_birth|int    |     4|NULL| NULL|    1|
    -+-------------+-------+------+----+-----+-----+]]></text><html>
    -
    -
    -									<p>
    -										The correct (and verbose) way to do this with JDBC is as follows:
    -									</p>
    -									
    -</html><java><![CDATA[ResultSet rs = statement.executeQuery();
    -
    -// Repeat until there are no more result sets
    -for (;;) {
    -
    -  // Empty the current result set
    -  while (rs.next()) {
    -    // [ .. do something with it .. ]
    -  }
    -
    -  // Get the next result set, if available
    -  if (statement.getMoreResults()) {
    -    rs = statement.getResultSet();
    -  }
    -  else {
    -    break;
    -  }
    -}
    -
    -// Be sure that all result sets are closed
    -statement.getMoreResults(Statement.CLOSE_ALL_RESULTS);
    -statement.close();]]></java><html>
    -
    -									<p>
    -										As previously discussed in the chapter about <reference id="comparison-with-jdbc" title="differences between jOOQ and JDBC"/>, jOOQ does not rely on an internal state of any JDBC object, which is "externalised" by Javadoc. Instead, it has a straight-forward API allowing you to do the above in a one-liner: 
    -									</p>
    -									
    -</html><java><![CDATA[// Get some information about the author table, its columns, keys, indexes, etc
    -List<Result<Record>> results = create.fetchMany("sp_help 'author'");]]></java><html>
    -
    -									<p>
    -										Using generics, the resulting structure is immediately clear.
    -									</p>									
    -								</html></content>
    -							</section>
    -
    -							<section id="later-fetching">
    -								<title>Later fetching</title>
    -								<content><html>
    -									<p>
    -										Some queries take very long to execute, yet they are not crucial for the continuation of the main program. For instance, you could be generating a complicated report in a Swing application, and while this report is being calculated in your database, you want to display a background progress bar, allowing the user to pursue some other work. This can be achived simply with jOOQ, by creating a <reference class="org.jooq.FutureResult"/>, a type that extends <reference class="java.util.concurrent.Future"/>. An example is given here:
    -									</p>
    -									
    -</html><java><![CDATA[// Spawn off this query in a separate process:
    -FutureResult<BookRecord> future = create.selectFrom(BOOK).where(... complex predicates ...).fetchLater();
    -
    -// This example actively waits for the result to be done
    -while (!future.isDone()) {
    -    progressBar.increment(1);
    -    Thread.sleep(50);
    -}
    -
    -// The result should be ready, now
    -Result<BookRecord> result = future.get();]]></java><html>
    -
    -									<p>
    -										Note, that instead of letting jOOQ spawn a new thread, you can also provide jOOQ with your own <reference class="java.util.concurrent.ExecutorService"/>:
    -									</p>
    -									
    -</html><java><![CDATA[// Spawn off this query in a separate process:
    -ExecutorService service = // [...]
    -FutureResult<BookRecord> future = create.selectFrom(BOOK).where(... complex predicates ...).fetchLater(service);]]></java></content>
    -							</section>
    -
    -							<section id="resultset-fetching">
    -								<title>ResultSet fetching</title>
    -								<content><html>
    -									<p>
    -										When interacting with legacy applications, you may prefer to have jOOQ return a <reference class="java.sql.ResultSet"/>, rather than jOOQ's own <reference class="org.jooq.Result"/> types. This can be done simply, in two ways:
    -									</p>
    -									
    -</html><java><![CDATA[// jOOQ's Cursor type exposes the underlying ResultSet:
    -ResultSet rs1 = create.selectFrom(BOOK).fetchLazy().resultSet();
    -
    -// But you can also directly access that ResultSet from ResultQuery:
    -ResultSet rs2 = create.selectFrom(BOOK).fetchResultSet();
    -
    -// Don't forget to close these, though!
    -rs1.close();
    -rs2.close();]]></java><html>
    -
    -									<h3>Transform jOOQ's Result into a JDBC ResultSet</h3>
    -									<p>
    -										Instead of operating on a JDBC ResultSet holding an open resource from your database, you can also let jOOQ's <reference class="org.jooq.Result"/> wrap itself in a <reference class="java.sql.ResultSet"/>. The advantage of this is that the so-created ResultSet has no open connection to the database. It is a completely in-memory ResultSet:								
    -									</p>
    -
    -</html><java><![CDATA[// Transform a jOOQ Result into a ResultSet
    -Result<BookRecord> result = create.selectFrom(BOOK).fetch();
    -ResultSet rs = result.intoResultSet();]]></java><html>
    -
    -									<h3>The inverse: Fetch data from a legacy ResultSet using jOOQ</h3>
    -									<p>
    -										The inverse of the above is possible too. Maybe, a legacy part of your application produces JDBC <reference class="java.sql.ResultSet"/>, and you want to turn them into a <reference class="org.jooq.Result"/>: 
    -									</p>
    -
    -</html><java><![CDATA[// Transform a JDBC ResultSet into a jOOQ Result
    -ResultSet rs = connection.createStatement().executeQuery("SELECT * FROM BOOK");
    -
    -// As a Result:
    -Result<Record> result = create.fetch(rs);
    -
    -// As a Cursor
    -Cursor<Record> cursor = create.fetchLazy(rs);]]></java></content>
    -							</section>
    -
    -							<section id="data-type-conversion">
    -								<title>Data type conversion</title>
    -								<content><html>
    -									<p>
    -										Apart from a few extra features (see the manual's section about <reference id="master-data-types" title="master data types"/> and <reference id="codegen-udts" title="user-defined types"/>), jOOQ only supports basic types as supported by the JDBC API. In your application, you may choose to transform these data types into your own ones, without writing too much boiler-plate code. This can be done using jOOQ's <reference class="org.jooq.Converter"/> types. A converter essentially allows for two-way conversion between two Java data types &lt;T&gt; and &lt;U&gt;. By convention, the &lt;T&gt; type corresponds to the type in your database whereas the &gt;U&gt; type corresponds to your own user type. The Converter API is given here:
    -									</p>
    -									
    -</html><java><![CDATA[public interface Converter<T, U> extends Serializable {
    -
    -    /**
    -     * Convert a database object to a user object
    -     */
    -    U from(T databaseObject);
    -
    -    /**
    -     * Convert a user object to a database object
    -     */
    -    T to(U userObject);
    -
    -    /**
    -     * The database type
    -     */
    -    Class<T> fromType();
    -
    -    /**
    -     * The user type
    -     */
    -    Class<U> toType();
    -}]]></java><html>
    -
    -									<p>
    -										Such a converter can be used in many parts of the jOOQ API. Some examples have been illustrated in the manual's section about <reference id="fetching" title="fetching"/>.
    -									</p>
    -									
    -									<h3>A Converter for GregorianCalendar</h3>
    -									<p>
    -										Here is a some more elaborate example involving a Converter for <reference class="java.util.GregorianCalendar"/>: 
    -									</p>
    -									
    -</html><java><![CDATA[// You may prefer Java Calendars over JDBC Timestamps
    -public class CalendarConverter implements Converter<Timestamp, GregorianCalendar> {
    -
    -    @Override
    -    public GregorianCalendar from(Timestamp databaseObject) {
    -        GregorianCalendar calendar = (GregorianCalendar) Calendar.getInstance();
    -        calendar.setTimeInMillis(databaseObject.getTime());
    -        return calendar;
    -    }
    -
    -    @Override
    -    public Timestamp to(GregorianCalendar userObject) {
    -        return new Timestamp(userObject.getTime().getTime());
    -    }
    -
    -    @Override
    -    public Class<Timestamp> fromType() {
    -        return Timestamp.class;
    -    }
    -
    -    @Override
    -    public Class<GregorianCalendar> toType() {
    -        return GregorianCalendar.class;
    -    }
    -}
    -
    -// Now you can fetch calendar values from jOOQ's API:
    -List<GregorianCalendar> dates1 = create.selectFrom(BOOK).fetch().getValues(BOOK.PUBLISHING_DATE, new CalendarConverter());
    -List<GregorianCalendar> dates2 = create.selectFrom(BOOK).fetch(BOOK.PUBLISHING_DATE, new CalendarConverter());
    -]]></java><html>									
    -									
    -									<h3>Enum Converters</h3>
    -									<p>
    -										jOOQ ships with a built-in default <reference class="org.jooq.impl.EnumConverter"/>, that you can use to map VARCHAR values to enum literals or NUMBER values to enum ordinals (both modes are supported). Let's say, you want to map a YES / NO / MAYBE column to a custom Enum:
    -									</p>
    -									
    -</html><java><![CDATA[// Define your Enum
    -public enum YNM {
    -    YES, NO, MAYBE
    -}
    -
    -// Define your converter
    -public class YNMConverter extends EnumConverter<String, YNM> {
    -    public YNMConverter() {
    -        super(String.class, YNM.class);
    -    }
    -}
    -
    -// And you're all set for converting records to your custom Enum:
    -for (BookRecord book : create.selectFrom(BOOK).fetch()) {
    -    switch (book.getValue(BOOK.I_LIKE, new YNMConverter())) {
    -        case YES:    System.out.println("I like this book             : " + book.getTitle()); break;
    -        case NO:     System.out.println("I didn't like this book      : " + book.getTitle()); break;
    -        case MAYBE:  System.out.println("I'm not sure about this book : " + book.getTitle()); break;
    -    }
    -}]]></java><html>
    -									
    -									<h3>Using Converters in generated source code</h3>
    -									<p>
    -										jOOQ also allows for generated source code to reference your own custom converters, in order to permanently replace a <reference id="table-columns" title="table column's"/> &lt;T&gt; type by your own, custom &lt;U&gt; type. See the manual's section about <reference id="custom-data-types" title="custom data types"/> for details.
    -									</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -					
    -					<section id="statement-type">
    -						<title>Static statements vs. Prepared Statements</title>
    -						<content><html>
    -							<p>
    -								With JDBC, you have full control over your SQL statements. You can decide yourself, if you want to execute a static <reference class="java.sql.Statement"/> without bind values, or a <reference class="java.sql.PreparedStatement"/> with (or without) bind values. But you have to decide early, which way to go. And you'll have to prevent SQL injection and syntax errors manually, when inlining your bind variables.
    -							</p>
    -							<p>
    -								With jOOQ, this is easier. As a matter of fact, it is plain simple. With jOOQ, you can just set a flag in your <reference id="factory" title="Factory's"/> <reference id="custom-settings" title="Settings"/>, and all queries produced by that factory will be executed as static statements, with all bind values inlined. An example is given here:
    -							</p>
    -							
    -</html><code-pair>
    -<sql><![CDATA[
    -
    -
    -
    -
    -
    -
    --- These statements are rendered by the two factories:
    -SELECT ? FROM DUAL WHERE ? = ?
    -SELECT 1 FROM DUAL WHERE 1 = 1]]></sql><java><![CDATA[// This Factory executes PreparedStatements
    -Factory prepare = new Factory(connection, SQLDialect.ORACLE);
    -
    -// This Factory exeecutes static Statements
    -Factory inlined = new Factory(connection, SQLDialect.ORACLE, 
    -  new Settings().withStatementType(StatementType.STATIC_STATEMENT));
    -  
    -prepare.select(val(1)).where(val(1).equal(1)).fetch();
    -inlined.select(val(1)).where(val(1).equal(1)).fetch();]]></java>
    -</code-pair><html>
    -
    -							<h3>Reasons for choosing one or the other</h3>
    -							<p>
    -								Not all databases are equal. Some databases show improved performance if you use <reference class="java.sql.PreparedStatement"/>, as the database will then be able to re-use execution plans for identical SQL statements, regardless of actual bind values. This heavily improves the time it takes for soft-parsing a SQL statement. In other situations, assuming that bind values are irrelevant for SQL execution plans may be a bad idea, as you might run into "bind value peeking" issues. You may be better off spending the extra cost for a new hard-parse of your SQL statement and instead having the database fine-tune the new plan to the concrete bind values.
    -							</p>
    -							<p>
    -								Whichever aproach is more optimal for you cannot be decided by jOOQ. In most cases, prepared statements are probably better. But you always have the option of forcing jOOQ to render inlined bind values.
    -							</p>
    -							
    -							<h3>Inlining bind values on a per-bind-value basis</h3>
    -							<p>
    -								Note that you don't have to inline all your bind values at once. If you know that a bind value is not really a variable and should be inlined explicitly, you can do so by using <reference class="org.jooq.impl.Factory" anchor="#inline(Object)" title="Factory.inline()"/>, as documented in the manual's section about <reference id="inlined-parameters" title="inlined parameters"/>
    -							</p>
    -						</html></content>
    -					</section>
    -
    -					<section id="reusing-statements">
    -						<title>Reusing a Query's PreparedStatement</title>
    -						<content><html>
    -							<p>
    -								As previously discussed in the chapter about <reference id="comparison-with-jdbc" title="differences between jOOQ and JDBC"/>, reusing PreparedStatements is handled a bit differently in jOOQ from how it is handled in JDBC
    -							</p>
    -							
    -							<h3>Keeping open PreparedStatements with JDBC</h3>
    -							<p>
    -								With JDBC, you can easily reuse a <reference class="java.sql.PreparedStatement"/> by not closing it between subsequent executions. An example is given here:
    -							</p>
    -							
    -</html><java><![CDATA[PreparedStatement stmt = null;
    -ResultSet rs1 = null;
    -ResultSet rs2 = null;
    -
    -try {
    -    // Execute the statement and fetch a first ResultSet
    -    stmt = connection.prepareStatement("SELECT 1 FROM DUAL");
    -    rs1  = stmt.executeQuery();
    -
    -    // Without closing the statement, execute it again to fetch another ResultSet
    -    rs2  = stmt.executeQuery();
    -}
    -finally {
    -    try { rs1.close();  } catch (Exception ignore) {}
    -    try { rs2.close();  } catch (Exception ignore) {}
    -    try { stmt.close(); } catch (Exception ignore) {}
    -}]]></java><html>
    -
    -							<p>
    -								The above technique can be quite useful when you want to reuse expensive database resources. This can be the case when your statement is executed very frequently and your database would take non-negligible time to soft-parse the prepared statement and generate a new statement / cursor resource.
    -							</p>
    -							
    -							<h3>Keeping open PreparedStatements with jOOQ</h3>
    -							<p>
    -								This is also modeled in jOOQ. However, the difference to JDBC is that closing a statement is the default action, whereas keeping it open has to be configured explicitly. This is better than JDBC, because the default action should be the one that is used most often. Keeping open statements is rarely done in average applications. Here's an example of how to keep open PreparedStatements with jOOQ:
    -							</p>
    -							
    -</html><java><![CDATA[// Create a query which is configured to keep its underlying PreparedStatement open
    -ResultQuery<Record> query = create.selectOne().keepStatement(true);
    -
    -// Execute the query twice, against the same underlying PreparedStatement:
    -try {
    -    Result<Record> result1 = query.fetch(); // This will lazily create a new PreparedStatement
    -    Result<Record> result2 = query.fetch(); // This will reuse the previous PreparedStatement
    -}
    -
    -// ... but now, you must not forget to close the query
    -finally {
    -    query.close();
    -}]]></java><html>
    -
    -							<p>
    -								The above example shows how a query can be executed twice against the same underlying PreparedStatement. Unlike in other execution scenarios, you must not forget to close this query now
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="batch-execution">
    -						<title>Using JDBC batch operations</title>
    -						<content><html>
    -							<p>
    -								With JDBC, you can easily execute several statements at once using the addBatch() method. Essentially, there are two modes in JDBC
    -							</p>
    -
    -							<ul>
    -								<li>Execute several queries without bind values</li>
    -								<li>Execute one query several times with bind values</li>
    -							</ul>
    -
    -							<p>
    -								In code, this looks like the following snippet:
    -							</p>
    -</html><java><![CDATA[// 1. several queries
    -// ------------------
    -Statement stmt = connection.createStatement();
    -stmt.addBatch("INSERT INTO author VALUES (1, 'Erich Gamma')");
    -stmt.addBatch("INSERT INTO author VALUES (2, 'Richard Helm')");
    -stmt.addBatch("INSERT INTO author VALUES (3, 'Ralph Johnson')");
    -stmt.addBatch("INSERT INTO author VALUES (4, 'John Vlissides')");
    -int[] result = stmt.executeBatch();
    -
    -// 2. a single query
    -// -----------------
    -PreparedStatement stmt = connection.prepareStatement("INSERT INTO autho VALUES (?, ?)");
    -stmt.setInt(1, 1);
    -stmt.setString(2, "Erich Gamma");
    -stmt.addBatch();
    -
    -stmt.setInt(1, 2);
    -stmt.setString(2, "Richard Helm");
    -stmt.addBatch();
    -
    -stmt.setInt(1, 3);
    -stmt.setString(2, "Ralph Johnson");
    -stmt.addBatch();
    -
    -stmt.setInt(1, 4);
    -stmt.setString(2, "John Vlissides");
    -stmt.addBatch();
    -
    -int[] result = stmt.executeBatch();]]></java><html>
    -
    -
    -							<h3>This will also be supported by jOOQ</h3>
    -							<p>
    -								jOOQ supports executing queries in batch mode as follows:
    -							</p>
    -							
    -</html><java><![CDATA[// 1. several queries
    -// ------------------
    -create.batch(
    -	create.insertInto(AUTHOR, ID, NAME).values(1, "Erich Gamma"),
    -	create.insertInto(AUTHOR, ID, NAME).values(2, "Richard Helm"),
    -	create.insertInto(AUTHOR, ID, NAME).values(3, "Ralph Johnson"),
    -	create.insertInto(AUTHOR, ID, NAME).values(4, "John Vlissides"))
    -.execute();
    -
    -// 2. a single query
    -// -----------------
    -create.batch(create.insertInto(AUTHOR, ID, NAME).values("?", "?"))
    -	  .bind(1, "Erich Gamma")
    -	  .bind(2, "Richard Helm")
    -	  .bind(3, "Ralph Johnson")
    -	  .bind(4, "John Vlissides")
    -	  .execute();]]></java></content>
    -					</section>
    -
    -				    <section id="sequence-execution">
    -						<title>Sequence execution</title>
    -						<content><html>
    -							<p>
    -								Most databases support sequences of some sort, to provide you with unique values to be used for primary keys and other enumerations. If you're using jOOQ's <reference id="code-generation" title="code generator"/>, it will generate a sequence object per sequence for you. There are two ways of using such a sequence object:
    -							</p>
    -
    -							<h3>Standalone calls to sequences</h3>
    -							<p>
    -								Instead of actually phrasing a select statement, you can also use the <reference id="factory" title="Factory's"/> convenience methods:
    -							</p>							
    -							
    -</html><java><![CDATA[// Fetch the next value from a sequence
    -BigInteger nextID = create.nextval(S_AUTHOR_ID);
    -
    -// Fetch the current value from a sequence
    -BigInteger currID = create.currval(S_AUTHOR_ID);]]></java><html>
    -							
    -							<h3>Inlining sequence references in SQL</h3>
    -							<p>
    -								You can inline sequence references in jOOQ SQL statements. The following are examples of how to do that:
    -							</p>
    -							
    -</html><java><![CDATA[// Reference the sequence in a SELECT statement:
    -BigInteger nextID = create.select(s).fetchOne(S_AUTHOR_ID.nextval());
    -
    -// Reference the sequence in an INSERT statement:
    -create.insertInto(AUTHOR, AUTHOR.ID, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -      .values(S_AUTHOR_ID.nextval(), val("William"), val("Shakespeare"));
    -]]></java><html>
    -
    -							<p>
    -								For more info about inlining sequence references in SQL statements, please refer to the manual's section about <reference id="sequences-and-serials" title="sequences and serials"/>.
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="stored-procedures">
    -						<title>Stored procedures and functions</title>
    -						<content><html>
    -							<p>
    -								Many RDBMS support the concept of "routines", usually calling them procedures and/or functions. These concepts have been around in programming languages for a while, also outside of databases. Famous languages distinguishing procedures from functions are:
    -							</p>
    -							<ul>
    -								<li>Ada</li>
    -								<li>BASIC</li>
    -								<li>Pascal</li>
    -								<li>etc...</li>
    -							</ul>
    -							<p>
    -								The general distinction between (stored) procedures and (stored) functions can be summarised like this:
    -							</p>
    -							
    -							<h3>Procedures</h3>
    -							<ul>
    -								<li>Are called using JDBC CallableStatement</li>
    -								<li>Have no return value</li>
    -								<li>Usually support OUT parameters</li>
    -							</ul>
    -							
    -							<h3>Functions</h3>
    -							<ul>
    -								<li>Can be used in SQL statements</li>
    -								<li>Have a return value</li>
    -								<li>Usually don't support OUT parameters</li>
    -							</ul>
    -							
    -							<h3>Exceptions to these rules</h3>
    -							<ul>
    -								<li>DB2, H2, and HSQLDB don't allow for JDBC escape syntax when calling functions. Functions must be used in a SELECT statement</li>
    -								<li>H2 only knows functions (without OUT parameters)</li>
    -								<li>Oracle functions may have OUT parameters</li>
    -								<li>Oracle knows functions that must not be used in SQL statements for transactional reasons</li>
    -								<li>Postgres only knows functions (with all features combined). OUT parameters can also be interpreted as return values, which is quite elegant/surprising, depending on your taste</li>
    -								<li>The Sybase jconn3 JDBC driver doesn't handle null values correctly when using the JDBC escape syntax on functions</li>
    -							</ul>
    -							<p>
    -								In general, it can be said that the field of routines (procedures / functions) is far from being standardised in modern RDBMS even if the SQL:2008 standard specifies things quite well. Every database has its ways and JDBC only provides little abstraction over the great variety of procedures / functions implementations, especially when advanced data types such as cursors / UDT's / arrays are involved.
    -							</p>
    -							<p>
    -								To simplify things a little bit, jOOQ handles both procedures and functions the same way, using a more general <reference class="org.jooq.Routine"/> type.
    -							</p>
    -							
    -							<h3>Using jOOQ for standalone calls to stored procedures and functions</h3>
    -							<p>
    -								If you're using jOOQ's <reference id="code-generation" title="code generator"/>, it will generate <reference class="org.jooq.Routine"/> objects for you. Let's consider the following example:
    -							</p>
    -							
    -</html><sql><![CDATA[-- Check whether there is an author in AUTHOR by that name and get his ID
    -CREATE OR REPLACE PROCEDURE author_exists (author_name VARCHAR2, result OUT NUMBER, id OUT NUMBER);]]></sql><html>
    -
    -							<p>
    -								The generated artefacts can then be used as follows:
    -							</p>
    -							
    -</html><java><![CDATA[// Make an explicit call to the generated procedure object:
    -AuthorExists procedure = new AuthorExists();
    -
    -// All IN and IN OUT parameters generate setters
    -procedure.setAuthorName("Paulo");
    -procedure.execute(configuration);
    -
    -// All OUT and IN OUT parameters generate getters
    -assertEquals(new BigDecimal("1"), procedure.getResult());
    -assertEquals(new BigDecimal("2"), procedure.getId();]]></java><html>							
    -							
    -							<p>
    -								But you can also call the procedure using a generated convenience method in a global Routines class:
    -							</p>
    -
    -</html><java><![CDATA[// The generated Routines class contains static methods for every procedure.
    -// Results are also returned in a generated object, holding getters for every OUT or IN OUT parameter.
    -AuthorExists result = Routines.authorExists("Paulo");
    -
    -// All OUT and IN OUT parameters generate getters
    -assertEquals(new BigDecimal("1"), procedure.getResult());
    -assertEquals(new BigDecimal("2"), procedure.getId();]]></java><html>			
    -
    -							<p>
    -								For more details about <reference id="code-generation" title="code generation"/> for procedures, see the manual's section about <reference id="codegen-procedures" title="procedures and code generation"/>.
    -							</p>				
    -							
    -							<h3>Inlining stored function references in SQL</h3>
    -							<p>
    -								Unlike procedures, functions can be inlined in SQL statements to generate <reference id="column-expressions" title="column expressions"/> or <reference id="table-expressions" title="table expressions"/>, if you're using <reference id="array-and-cursor-unnesting" title="unnesting operators"/>. Assume you have a function like this:
    -							</p>
    -
    -</html><sql><![CDATA[-- Check whether there is an author in AUTHOR by that name and get his ID
    -CREATE OR REPLACE FUNCTION author_exists (author_name VARCHAR2) RETURN NUMBER;]]></sql><html>
    -							
    -							<p>
    -								The generated artefacts can then be used as follows:
    -							</p>
    -							
    -</html><code-pair>
    -<sql><![CDATA[-- This is the rendered SQL
    -
    -SELECT AUTHOR_EXISTS('Paulo') FROM DUAL]]></sql><java><![CDATA[// Use the static-imported method from Routines:
    -boolean exists = 
    -create.select(authorExists("Paulo")).fetchOne(0, boolean.class);]]></java>							
    -</code-pair><html>
    -							
    -							<p>
    -								For more info about inlining stored function references in SQL statements, please refer to the manual's section about <reference id="user-defined-functions" title="user-defined functions"/>.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="oracle-packages">
    -								<title>Oracle Packages</title>
    -								<content><html>
    -									<p>
    -										Oracle uses the concept of a PACKAGE to group several procedures/functions into a sort of namespace. The <a href="http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt" title="SQL 92 standard">SQL 92 standard</a> talks about "modules", to represent this concept, even if this is rarely implemented as such. This is reflected in jOOQ by the use of Java sub-packages in the <reference id="code-generation" title="source code generation"/> destination package. Every Oracle package will be reflected by
    -									</p>
    -									<ul>
    -										<li>A Java package holding classes for formal Java representations of the procedure/function in that package</li>
    -										<li>A Java class holding convenience methods to facilitate calling those procedures/functions</li>
    -									</ul>
    -									<p>
    -										Apart from this, the generated source code looks exactly like the one for standalone procedures/functions.
    -									</p>
    -									<p>
    -										For more details about <reference id="code-generation" title="code generation"/> for procedures and packages see the manual's section about <reference id="codegen-procedures" title="procedures and code generation"/>.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="oracle-member-procedures">
    -								<title>Oracle member procedures</title>
    -								<content><html>
    -									<p>
    -										Oracle UDTs can have object-oriented structures including member functions and procedures. With Oracle, you can do things like this:
    -									</p>
    -									
    -</html><sql><![CDATA[CREATE OR REPLACE TYPE u_author_type AS OBJECT (
    -  id NUMBER(7),
    -  first_name VARCHAR2(50),
    -  last_name VARCHAR2(50),
    -
    -  MEMBER PROCEDURE LOAD,
    -  MEMBER FUNCTION counBOOKs RETURN NUMBER
    -)
    -
    --- The type body is omitted for the example]]></sql><html>
    -
    -									<p>
    -										These member functions and procedures can simply be mapped to Java methods:
    -									</p>
    -
    -</html><java><![CDATA[// Create an empty, attached UDT record from the Factory
    -UAuthorType author = create.newRecord(U_AUTHOR_TYPE);
    -
    -// Set the author ID and load the record using the LOAD procedure
    -author.setId(1);
    -author.load();
    -
    -// The record is now updated with the LOAD implementation's content
    -assertNotNull(author.getFirstName());
    -assertNotNull(author.getLastName());]]></java><html>
    -
    -									<p>
    -										For more details about <reference id="code-generation" title="code generation"/> for UDTs see the manual's section about <reference id="codegen-udts" title="user-defined types and code generation"/>.
    -									</p>								
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -				    <section id="exporting">
    -						<title>Exporting to XML, CSV, JSON, HTML, Text</title>
    -						<content><html>
    -							<p>
    -								If you are using jOOQ for scripting purposes or in a slim, unlayered application server, you might be interested in using jOOQ's exporting functionality (see also the <reference id="importing" title="importing functionality"/>). You can export any Result&lt;Record&gt; into the formats discussed in the subsequent chapters of the manual
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="exporting-xml">
    -								<title>Exporting XML</title>
    -								<content><java>// Fetch books and format them as XML
    -String xml = create.selectFrom(BOOK).fetch().formatXML();</java><html>
    -
    -									<p>
    -										The above query will result in an XML document looking like the following one:
    -									</p>
    -
    -</html><xml><![CDATA[<result xmlns="http://www.jooq.org/xsd/jooq-export-2.6.0.xsd">
    -  <fields>
    -    <field name="ID" type="INTEGER"/>
    -    <field name="AUTHOR_ID" type="INTEGER"/>
    -    <field name="TITLE" type="VARCHAR"/>
    -  </fields>
    -  <records>
    -    <record>
    -      <value field="ID">1</value>
    -      <value field="AUTHOR_ID">1</value>
    -      <value field="TITLE">1984</value>
    -    </record>
    -    <record>
    -      <value field="ID">2</value>
    -      <value field="AUTHOR_ID">1</value>
    -      <value field="TITLE">Animal Farm</value>
    -    </record>
    -  </records>
    -</result>]]></xml><html>
    -
    -									<p>
    -										The same result as an <reference class="org.w3c.dom.Document"/> can be obtained using the Result.intoXML() method:
    -									</p>
    -
    -
    -</html><java>// Fetch books and format them as XML
    -Document xml = create.selectFrom(BOOK).fetch().intoXML();</java><html>
    -
    -									<p>
    -										See the XSD schema definition here, for a formal definition of the XML export format:<br/>
    -										<a href="http://www.jooq.org/xsd/jooq-export-1.6.2.xsd">http://www.jooq.org/xsd/jooq-export-1.6.2.xsd</a>
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="exporting-csv">
    -								<title>Exporting CSV</title>
    -								<content><java>// Fetch books and format them as CSV
    -String csv = create.selectFrom(BOOK).fetch().formatCSV();</java><html>
    -
    -									<p>
    -										The above query will result in a CSV document looking like the following one:
    -									</p>
    -
    -</html><text>ID,AUTHOR_ID,TITLE
    -1,1,1984
    -2,1,Animal Farm</text><html>
    -
    -									<p>
    -										In addition to the standard behaviour, you can also specify a separator character, as well as a special string to represent NULL values (which cannot be represented in standard CSV):
    -									</p>
    -
    -</html><java>// Use ";" as the separator character
    -String csv = create.selectFrom(BOOK).fetch().formatCSV(';');
    -
    -// Specify "{null}" as a representation for NULL values
    -String csv = create.selectFrom(BOOK).fetch().formatCSV(';', "{null}");</java></content>
    -							</section>
    -
    -							<section id="exporting-json">
    -								<title>Exporting JSON</title>
    -								<content><java>// Fetch books and format them as JSON
    -String json = create.selectFrom(BOOK).fetch().formatJSON();</java><html>
    -
    -									<p>
    -										The above query will result in a JSON document looking like the following one:
    -									</p>
    -
    -</html><text>{"fields":[{"name":"field-1","type":"type-1"},
    -           {"name":"field-2","type":"type-2"},
    -           ...,
    -           {"name":"field-n","type":"type-n"}],
    - "records":[[value-1-1,value-1-2,...,value-1-n],
    -            [value-2-1,value-2-2,...,value-2-n]]}</text><html>
    -             
    -             						<p>
    -             							Note: This format has changed in jOOQ 2.6.0
    -             						</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="exporting-html">
    -								<title>Exporting HTML</title>
    -								<content><java>// Fetch books and format them as HTML
    -String html = create.selectFrom(BOOK).fetch().formatHTML();</java><html>
    -
    -									<p>
    -										The above query will result in an HTML document looking like the following one
    -									</p>
    -
    -</html><xml><![CDATA[<table>
    -  <thead>
    -    <tr>
    -      <th>ID</th>
    -      <th>AUTHOR_ID</th>
    -      <th>TITLE</th>
    -    </tr>
    -  </thead>
    -  <tbody>
    -    <tr>
    -      <td>1</td>
    -      <td>1</td>
    -      <td>1984</td>
    -    </tr>
    -    <tr>
    -      <td>2</td>
    -      <td>1</td>
    -      <td>Animal Farm</td>
    -    </tr>
    -  </tbody>
    -</table>]]></xml></content>
    -							</section>
    -
    -							<section id="exporting-text">
    -								<title>Exporting Text</title>
    -								<content><java>// Fetch books and format them as text
    -String text = create.selectFrom(BOOK).fetch().format();</java><html>
    -
    -									<p>
    -										The above query will result in a text document looking like the following one
    -									</p>
    -
    -</html><text>+---+---------+-----------+
    -| ID|AUTHOR_ID|TITLE      |
    -+---+---------+-----------+
    -|  1|        1|1984       |
    -|  2|        1|Animal Farm|
    -+---+---------+-----------+</text><html>
    -
    -									<p>
    -										A simple text representation can also be obtained by calling toString() on a Result object. See also the manual's section about <reference id="logging" title="DEBUG logging"/>
    -									</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -				    <section id="importing">
    -						<title>Importing data</title>
    -						<content><html>
    -							<p>
    -								If you are using jOOQ for scripting purposes or in a slim, unlayered application server, you might be interested in using jOOQ's importing functionality (see also exporting functionality). You can import data directly into a table from the formats described in the subsequent sections of this manual.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="importing-csv">
    -								<title>Importing CSV</title>
    -								<content><html>
    -
    -									<p>
    -										The below CSV data represents two author records that may have been exported previously, by jOOQ's <reference id="exporting" title="exporting functionality"/>, and then modified in Microsoft Excel or any other spreadsheet tool:
    -									</p>
    -
    -</html><text>ID;AUTHOR_ID;TITLE
    -1;1;1984
    -2;1;Animal Farm</text><html>
    -
    -									<p>
    -										With jOOQ, you can load this data using various parameters from the	loader API. A simple load may look like this:
    -									</p>
    -
    -</html><java>Factory create = new Factory(connection, dialect);
    -
    -// Load data into the AUTHOR table from an input stream
    -// holding the CSV data.
    -create.loadInto(AUTHOR)
    -      .loadCSV(inputstream)
    -      .fields(ID, AUTHOR_ID, TITLE)
    -      .execute();</java><html>
    -
    -      								<p>
    -      									Here are various other examples:
    -   									</p>
    -
    -</html><java>// Ignore the AUTHOR_ID column from the CSV file when inserting
    -create.loadInto(AUTHOR)
    -      .loadCSV(inputstream)
    -      .fields(ID, null, TITLE)
    -      .execute();
    -
    -// Specify behaviour for duplicate records.
    -create.loadInto(AUTHOR)
    -
    -      // choose any of these methods
    -      .onDuplicateKeyUpdate()
    -      .onDuplicateKeyIgnore()
    -      .onDuplicateKeyError() // the default
    -
    -      .loadCSV(inputstream)
    -      .fields(ID, null, TITLE)
    -      .execute();
    -
    -// Specify behaviour when errors occur.
    -create.loadInto(AUTHOR)
    -
    -      // choose any of these methods
    -      .onErrorIgnore()
    -      .onErrorAbort() // the default
    -
    -      .loadCSV(inputstream)
    -      .fields(ID, null, TITLE)
    -      .execute();
    -
    -// Specify transactional behaviour where this is possible
    -// (e.g. not in container-managed transactions)
    -create.loadInto(AUTHOR)
    -
    -      // choose any of these methods
    -      .commitEach()
    -      .commitAfter(10)
    -      .commitAll()
    -      .commitNone() // the default
    -
    -      .loadCSV(inputstream)
    -      .fields(ID, null, TITLE)
    -      .execute();</java><html>
    -
    -									<p>
    -										Any of the above configuration methods can be combined to achieve the type of load you need. Please refer to the API's Javadoc to learn about more details. Errors that occur during the load are reported by the execute method's result:
    -									</p>
    -
    -</html><java><![CDATA[Loader<Author> loader = /* .. */ .execute();
    -
    -// The number of processed rows
    -int processed = loader.processed();
    -
    -// The number of stored rows (INSERT or UPDATE)
    -int stored = loader.stored();
    -
    -// The number of ignored rows (due to errors, or duplicate rule)
    -int ignored = loader.ignored();
    -
    -// The errors that may have occurred during loading
    -List<LoaderError> errors = loader.errors();
    -LoaderError error = errors.get(0);
    -
    -// The exception that caused the error
    -DataAccessException exception = error.exception();
    -
    -// The row that caused the error
    -int rowIndex = error.rowIndex();
    -String[] row = error.row();
    -
    -// The query that caused the error
    -Query query = error.query();]]></java></content>
    -							</section>
    -
    -							<section id="importing-xml">
    -								<title>Importing XML</title>
    -								<content><html>
    -									<p>This is not yet supported</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -				    <section id="crud-with-updatablerecords">
    -						<title>CRUD with UpdatableRecords</title>
    -						<content><html>
    -							<p>
    -								Your database application probably consists of 50% - 80% CRUD, whereas only the remaining 20% - 50% of querying is actual querying. Most often, you will operate on records of tables without using any advanced relational concepts. This is called CRUD for
    -							</p>
    -							<ul>
    -								<li>Create (<reference id="insert-statement" title="INSERT"/>)</li>
    -								<li>Read (<reference id="select-statement" title="SELECT"/>)</li>
    -								<li>Update (<reference id="update-statement" title="UPDATE"/>)</li>
    -								<li>Delete (<reference id="delete-statement" title="DELETE"/>)</li>
    -							</ul>
    -							<p>								
    -								CRUD always uses the same patterns, regardless of the nature of underlying tables. This again, leads to a lot of boilerplate code, if you have to issue your statements yourself. Like Hibernate / JPA and other ORMs, jOOQ facilitates CRUD using a specific API involving <reference class="org.jooq.UpdatableRecord"/> types.
    -							</p>
    -							
    -							<h3>Primary keys and updatability</h3>
    -							<p>
    -								In normalised databases, every table has a primary key by which a tuple/record within that table can be uniquely identified. In simple cases, this is a (possibly auto-generated) number called ID. But in many cases, primary keys include several non-numeric columns. An important feature of such keys is the fact that in most databases, they are enforced using an index that allows for very fast random access to the table. A typical way to access / modify / delete a book is this:
    -							</p>
    -							
    -</html><sql><![CDATA[-- Inserting uses a previously generated key value or generates it afresh
    -INSERT INTO BOOK (ID, TITLE) VALUES (5, 'Animal Farm');
    -
    --- Other operations can use a previously generated key value
    -SELECT * FROM BOOK WHERE ID = 5;
    -UPDATE BOOK SET TITLE = '1984' WHERE ID = 5;
    -DELETE FROM BOOK WHERE ID = 5;]]></sql><html>
    -							
    -							<p>
    -								Normalised databases assume that a primary key is unique "forever", i.e. that a key, once inserted into a table, will never be changed or re-inserted after deletion. In order to use jOOQ's <reference id="simple-crud" title="CRUD"/> operations correctly, you should design your database accordingly.
    -							</p>
    -							
    -							<h3>Main UNIQUE keys</h3>
    -							<p>
    -								In SQL, a primary key is always also a unique key. In fact, unique keys have very similar properties as primary keys. For instance, they can be referenced from other tables' foreign keys in most databases. In the absence of a formal primary key, jOOQ assumes that the first unique key it encounters will serve as a primary key substitute. This is called the "main key" in jOOQ. In other words, a main key is:
    -							</p>
    -							<ul>
    -								<li>The primary key, if available</li>
    -								<li>The first unique key, otherwise</li>
    -							</ul>
    -							
    -							<p>
    -								For simplicity, the term "primary key" will be used in the sense of such a "main unique key" in this manual.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="simple-crud">
    -								<title>Simple CRUD</title>
    -								<content><html>
    -									<p>
    -										If you're using jOOQ's <reference id="code-generation" title="code generator"/>, it will generate <reference class="org.jooq.UpdatableRecord"/> implementations for every table that has a primary key. When <reference id="fetching" title="fetching"/> such a record form the database, these records are "attached" to the <reference id="factory" title="Factory" /> that created them. This means that they hold an internal reference to the same database connection that was used to fetch them. This connection is used internally by any of the following methods of the UpdatableRecord:
    -									</p>
    -									
    -</html><java><![CDATA[// Refresh a record from the database.
    -void refresh() throws DataAccessException;
    -
    -// Store (insert or update) a record to the database.
    -int store() throws DataAccessException;
    -
    -// Delete a record from the database
    -int delete() throws DataAccessException;]]></java><html>
    -									
    -									<p>
    -										See the manual's section about <reference id="serializability" title="serializability"/> for some more insight on "attached" objects. 
    -									</p>
    -									
    -									<h3>Storing</h3>
    -									<p>
    -										Storing a record will perform an <reference id="insert-statement" title="INSERT statement"/> or an <reference id="update-statement" title="UPDATE statement"/>. In general, new records are always inserted, whereas records loaded from the database are always updated. This is best visualised in code:
    -									</p>
    -
    -</html><java><![CDATA[// Create a new record
    -BookRecord book1 = create.newRecord(BOOK);
    -
    -// Insert the record: INSERT INTO BOOK (TITLE) VALUES ('1984');
    -book1.setTitle("1984");
    -book1.store();
    -
    -// Update the record: UPDATE BOOK SET PUBLISHED_IN = 1984 WHERE ID = [id]
    -book1.setPublishedIn(1948);
    -book1.store();
    -
    -// Get the (possibly) auto-generated ID from the record
    -Integer id = book1.getId();
    -
    -// Get another instance of the same book
    -BookRecord book2 = create.fetchOne(BOOK, BOOK.ID.equal(id));
    -
    -// Update the record: UPDATE BOOK SET TITLE = 'Animal Farm' WHERE ID = [id]
    -book2.setTitle("Animal Farm");
    -book2.store();]]></java><html>
    -									
    -									<p>
    -										Some remarks about storing:
    -									</p>
    -									<ul>
    -										<li>jOOQ sets only modified values in <reference id="insert-statement" title="INSERT statements"/> or <reference id="update-statement" title="UPDATE statements"/>. This allows for default values to be applied to inserted records, as specified in CREATE TABLE DDL statements.</li>
    -										<li>When store() performs an <reference id="insert-statement" title="INSERT statement"/>, jOOQ attempts to load any generated keys from the database back into the record. For more details, see the manual's section about <reference id="identity-values" title="IDENTITY values"/>.</li>
    -										<li>When loading records from <reference id="pojos" title="POJOs"/>, jOOQ will assume the record is a new record. It will hence attempt to INSERT it.</li>
    -										<li>When you activate <reference id="optimistic-locking" title="optimistic locking"/>, storing a record may fail, if the underlying database record has been changed in the mean time.</li>
    -									</ul>
    -																		
    -									<h3>Deleting</h3>
    -									<p>
    -										Deleting a record will remove it from the database. Here's how you delete records:
    -									</p>
    -									
    -</html><java><![CDATA[// Get a previously inserted book
    -BookRecord book = create.fetchOne(BOOK, BOOK.ID.equal(5));
    -
    -// Delete the book
    -book.delete();]]></java><html>
    -									
    -									<h3>Refreshing</h3>
    -									<p>
    -										Refreshing a record from the database means that jOOQ will issue a <reference id="select-statement" title="SELECT statement"/> to refresh all record values that are not the primary key. This is particularly useful when you use jOOQ's <reference id="optimistic-locking" title="optimistic locking"/> feature, in case a modified record is "stale" and cannot be stored to the database, because the underlying database record has changed in the mean time.
    -									</p>
    -									<p>
    -										In order to perform a refresh, use the following Java code:
    -									</p>									
    -
    -</html><java><![CDATA[// Fetch an updatable record from the database
    -BookRecord book = create.fetchOne(BOOK, BOOK.ID.equal(5));
    -
    -// Refresh the record
    -book.refresh();]]></java><html>
    -
    -									<h3>CRUD and SELECT statements</h3>
    -									<p>
    -										CRUD operations can be combined with regular querying, if you select records from single database tables, as explained in the manual's section about <reference id="select-statement" title="SELECT statements"/>. For this, you will need to use the selectFrom() method from the <reference id="factory" title="Factory"/>:
    -									</p>
    -									
    -</html><java><![CDATA[// Loop over records returned from a SELECT statement
    -for (BookRecord book : create.fetch(BOOK, BOOK.PUBLISHED_IN.equal(1948))) {
    -
    -  // Perform actions on BookRecords depending on some conditions
    -  if ("Orwell".equals(book.fetchAuthorByAuthorId().getLastName())) {
    -    book.delete();
    -  }
    -}]]></java></content>
    -							</section>
    -
    -							<section id="identity-values">
    -								<title>IDENTITY values</title>
    -								<content><html>
    -									<p>
    -										Many databases support the concept of IDENTITY values, or <reference id="sequence-execution" title="SEQUENCE-generated"/> key values. This is reflected by JDBC's <reference class="java.sql.Statement" anchor="#getGeneratedKeys()" title="getGeneratedKeys()"/> method. jOOQ abstracts using this method as many databases and JDBC drivers behave differently with respect to generated keys. Let's assume the following SQL Server BOOK table:
    -									</p>
    -									
    -</html><sql><![CDATA[CREATE TABLE book (
    -  ID INTEGER IDENTITY(1,1) NOT NULL,
    -  
    -  -- [...]
    -  
    -  CONSTRAINT pk_book PRIMARY KEY (id)
    -)]]></sql><html>
    -
    -									<p>
    -										If you're using jOOQ's <reference id="code-generation" title="code generator"/>, the above table will generate a <reference class="org.jooq.UpdatableRecord"/> with an IDENTITY column. This information is used by jOOQ internally, to update IDs after calling <reference id="crud-with-updatablerecords" title="store()"/>: 
    -									</p>
    -									
    -</html><java><![CDATA[BookRecord book = create.newRecord(BOOK);
    -book.setTitle("1984");
    -book.store();
    -
    -// The generated ID value is fetched after the above INSERT statement
    -System.out.println(book.getId());]]></java><html>
    -
    -									<h3>Database compatibility</h3>
    -									<p>
    -										<strong>DB2, Derby, HSQLDB, Ingres</strong>
    -									</p>
    -									<p>
    -										These SQL dialects implement the standard very neatly.
    -									</p>
    -</html><sql><![CDATA[id INTEGER GENERATED BY DEFAULT AS IDENTITY
    -id INTEGER GENERATED BY DEFAULT AS IDENTITY (START WITH 1)]]></sql><html>
    -
    -									<p>
    -										<strong>H2, MySQL, Postgres, SQL Server, Sybase ASE, Sybase SQL Anywhere</strong>
    -									</p>
    -									<p>
    -										These SQL dialects implement identites, but the DDL syntax doesn’t follow the standard
    -									</p>
    -</html><sql><![CDATA[-- H2 mimicks MySQL's and SQL Server's syntax
    -ID INTEGER IDENTITY(1,1)
    -ID INTEGER AUTO_INCREMENT
    --- MySQL and SQLite
    -ID INTEGER NOT NULL AUTO_INCREMENT
    -
    --- Postgres serials implicitly create a sequence
    --- Postgres also allows for selecting from custom sequences
    --- That way, sequences can be shared among tables
    -id SERIAL NOT NULL
    -
    --- SQL Server
    -ID INTEGER IDENTITY(1,1) NOT NULL
    --- Sybase ASE
    -id INTEGER IDENTITY NOT NULL
    --- Sybase SQL Anywhere
    -id INTEGER NOT NULL IDENTITY]]></sql><html>
    -
    -									<p>
    -										<strong>Oracle</strong>
    -									</p>
    -									<p>
    -										Oracle does not know any identity columns at all. Instead, you will have to use a trigger and update the ID column yourself, using a custom sequence. Something along these lines:
    -									</p>
    -</html><sql><![CDATA[CREATE OR REPLACE TRIGGER my_trigger
    -BEFORE INSERT
    -ON my_table
    -REFERENCING NEW AS new
    -FOR EACH ROW
    -BEGIN
    -  SELECT my_sequence.nextval
    -  INTO :new.id
    -  FROM dual;
    -END my_trigger;]]></sql><html>
    -
    -									<p>
    -										Note, that this approach can be employed in most databases supporting sequences and triggers! It is a lot more flexible than standard identities
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="navigation-methods">
    -								<title>Navigation methods</title>
    -								<content><html>
    -									<p>
    -										When using jOOQ's <reference id="code-generation" title="code generator"/> along with its <reference id="codegen-records" title="record generation capabilities"/>, generated records can have navigation methods contained in them, if properly <reference id="codegen-advanced" title="configured"/>. These navigation methods allow for "navigating" inbound or outbound foreign key references by executing an appropriate query. An example is given here: 
    -									</p>
    -				
    -</html><code-pair>
    -<sql><![CDATA[CREATE TABLE book (
    -  AUTHOR_ID NUMBER(7) NOT NULL,
    -  
    -  -- [...]
    -  
    -  FOREIGN KEY (AUTHOR_ID) REFERENCES author(ID)
    -)]]></sql><java><![CDATA[BookRecord book = create.fetch(BOOK, BOOK.ID.equal(5));
    -
    -// Find the author of a book
    -AuthorRecord author = book.fetchAuthor();
    -
    -// Find other books by that author
    -List<BookRecord> books = author.fetchBookList();]]></java>
    -</code-pair><html>					
    -
    -									<p>
    -										These methods are safe for use with several foreign keys referencing the same tables:
    -									</p>
    -				
    -</html><code-pair>
    -<sql><![CDATA[CREATE TABLE book (
    -  AUTHOR_ID NUMBER(7) NOT NULL,
    -  CO_AUTHOR_ID NUMBER(7) NOT NULL,
    -  
    -  -- [...]
    -  
    -  FOREIGN KEY (AUTHOR_ID) REFERENCES author(ID),
    -  FOREIGN KEY (CO_AUTHOR_ID) REFERENCES author(ID)
    -)]]></sql><java><![CDATA[BookRecord book = create.fetch(BOOK, BOOK.ID.equal(5));
    -
    -// Find the author of a book
    -AuthorRecord author   = book.fetchAuthorByAuthorId();
    -AuthorRecord coAuthor = book.fetchAuthorByCoAuthorId();
    -
    -// Find other books by those authors
    -List<BookRecord> books = author.fetchBookListByAuthorId();
    -List<BookRecord> books = coAuthor.fetchBookListByCoAuthorId();]]></java>
    -</code-pair><html>					
    -
    -									<p>
    -										Note that, unlike in Hibernate, jOOQ's generated navigation methods will always lazy-fetch relevant records, without caching any results. In other words, every time you run such a fetch method, a new query will be issued.
    -									</p>
    -									<p>
    -										These fetch methods only work on "attached" records. See the manual's section about <reference id="serializability" title="serializability"/> for some more insight on "attached" objects.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="non-updatable-records">
    -								<title>Non-updatable records</title>
    -								<content><html>
    -									<p>
    -										Tables without UNIQUE keys are considered non-updatable by jOOQ, as jOOQ has no way of uniquely identifying such a record within the database. If you're using jOOQ's <reference id="code-generation" title="code generator"/>, such tables will generate <reference class="org.jooq.TableRecord"/> classes, instead of <reference class="org.jooq.UpdatableRecord"/> classes. When you fetch <reference id="record-vs-tablerecord" title="typed records"/> from such a table, the returned records will not allow for calling any of the <reference id="crud-with-updatablerecords" title="store(), refresh(), delete()"/> methods. 
    -									</p>
    -									
    -									<p>
    -										Note, that some databases use internal rowid or object-id values to identify such records. jOOQ does not support these vendor-specific record meta-data.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="optimistic-locking">
    -								<title>Optimistic locking</title>
    -								<content><html>
    -									<p>
    -										jOOQ allows you to perform <reference id="crud-with-updatablerecords" title="CRUD"/> operations using optimistic locking. You can immediately take advantage of this feature by activating the relevant <reference id="custom-settings" title="executeWithOptimisticLocking Setting"/>. Without any further knowledge of the underlying data semantics, this will have the following impact on store() and delete() methods:
    -									</p>
    -									<ul>
    -										<li>INSERT statements are not affected by this Setting flag</li>
    -										<li>Prior to UPDATE or DELETE statements, jOOQ will run a <reference id="for-update-clause" title="SELECT .. FOR UPDATE"/> statement, pessimistically locking the record for the subsequent UPDATE / DELETE</li>
    -										<li>The data fetched with the previous SELECT will be compared against the data in the record being stored or deleted</li>
    -										<li>An <reference class="org.jooq.exception.DataChangedException"/> is thrown if the record had been modified in the mean time</li>
    -										<li>The record is successfully stored / deleted, if the record had not been modified in the mean time.</li>
    -									</ul>
    -									<p>
    -										The above changes to jOOQ's behaviour are transparent to the API, the only thing you need to do for it to be activated is to set the Settings flag. Here is an example illustrating optimistic locking:
    -									</p>
    -
    -</html><java><![CDATA[// Properly configure the Factory
    -Factory optimistic = new Factory(connection, SQLDialect.ORACLE, 
    -  new Settings().withExecuteWithOptimisticLocking(true));
    -  
    -// Fetch a book two times
    -BookRecord book1 = optimistic.fetch(BOOK, BOOK.ID.equal(5));
    -BookRecord book2 = optimistic.fetch(BOOK, BOOK.ID.equal(5));
    -
    -// Change the title and store this book. The underlying database record has not been modified, it can be safely updated.
    -book1.setTitle("Animal Farm");
    -book1.store();
    -
    -// Book2 still references the original TITLE value, but the database holds a new value from book1.store(). 
    -// This store() will thus fail:
    -book2.setTitle("1984");
    -book2.store();]]></java><html>								
    -	
    -									<h3>Optimised optimistic locking using TIMESTAMP fields</h3>
    -									<p>
    -										If you're using jOOQ's <reference id="code-generation" title="code generator"/>, you can take indicate TIMESTAMP or UPDATE COUNTER fields for every generated table in the <reference id="codegen-advanced" title="code generation configuration"/>. Let's say we have this table:
    -									</p>
    -
    -</html><sql><![CDATA[CREATE TABLE book (
    -  
    -  -- This column indicates when each book record was modified for the last time
    -  MODIFIED TIMESTAMP NOT NULL,
    -  -- [...]
    -)]]></sql><html>									
    -
    -									<p>
    -										The MODIFIED column will contain a timestamp indicating the last modification timestamp for any book in the BOOK table. If you're using jOOQ and it's <reference id="crud-with-updatablerecords" title="store() methods on UpdatableRecords"/>, jOOQ will then generate this TIMESTAMP value for you, automatically. However, instead of running an additional <reference id="for-update-clause" title="SELECT .. FOR UPDATE"/> statement prior to an UPDATE or DELETE statement, jOOQ adds a WHERE-clause to the UPDATE or DELETE statement, checking for TIMESTAMP's integrity. This can be best illustrated with an example:   
    -									</p>
    -									
    -</html><java><![CDATA[// Properly configure the Factory
    -Factory optimistic = new Factory(connection, SQLDialect.ORACLE, 
    -  new Settings().withExecuteWithOptimisticLocking(true));
    -  
    -// Fetch a book two times
    -BookRecord book1 = optimistic.fetch(BOOK, BOOK.ID.equal(5));
    -BookRecord book2 = optimistic.fetch(BOOK, BOOK.ID.equal(5));
    -
    -// Change the title and store this book. The MODIFIED value has not been changed since the book was fetched. 
    -// It can be safely updated
    -book1.setTitle("Animal Farm");
    -book1.store();
    -
    -// Book2 still references the original MODIFIED value, but the database holds a new value from book1.store(). 
    -// This store() will thus fail:
    -book2.setTitle("1984");
    -book2.store();]]></java><html>
    -
    -									<p>
    -										As before, without the added TIMESTAMP column, optimistic locking is transparent to the API.
    -									</p>
    -									
    -									<h3>Optimised optimistic locking using VERSION fields</h3>
    -									<p>
    -										Instead of using TIMESTAMPs, you may also use numeric VERSION fields, containing version numbers that are incremented by jOOQ upon store() calls.
    -									</p>
    -
    -									<p>
    -										Note, for explicit pessimistic locking, please consider the manual's section about the <reference id="for-update-clause" title="FOR UPDATE clause"/>. For more details about how to configure TIMESTAMP or VERSION fields, consider the manual's section about <reference id="codegen-advanced" title="advanced code generator configuration"/>.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="batch-execution-for-crud">
    -								<title>Batch execution</title>
    -								<content><html>
    -									<p>
    -										When inserting, updating, deleting a lot of records, you may wish to profit from JDBC batch operations, which can be performed by jOOQ. These are available through jOOQ's <reference id="factory" title="Factory"/> as shown in the following example:
    -									</p>
    -									
    -</html><java><![CDATA[// Fetch a bunch of books
    -List<BookRecord> books = create.fetch(BOOK);
    -
    -// Modify the above books, and add some new ones:
    -modify(books);
    -addMore(books);
    -
    -// Batch-update and/or insert all of the above books
    -create.batchStore(books);]]></java><html>					
    -
    -									<p>
    -										Internally, jOOQ will render all the required SQL statements and execute them as a regular <reference id="batch-execution" title="JDBC batch execution"/>. 
    -									</p>				
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -				    <section id="daos">
    -						<title>DAOs</title>
    -						<content><html>
    -							<p>
    -								If you're using jOOQ's <reference id="code-generation" title="code generator"/>, you can configure it to generate <reference id="pojos" title="POJOs" /> and DAOs for you. jOOQ then generates one DAO per <reference id="crud-with-updatablerecords" title="UpdatableRecord"/>, i.e. per table with a single-column primary key. Generated DAOs implement a common jOOQ type called <reference class="org.jooq.DAO"/>. This type contains the following methods:
    -							</p>
    -							
    -</html><java><![CDATA[// <R> corresponds to the DAO's related table
    -// <P> corresponds to the DAO's related generated POJO type
    -// <T> corresponds to the DAO's related table's primary key type. 
    -// Note that multi-column primary keys are not yet supported by DAOs
    -public interface DAO<R extends TableRecord<R>, P, T> {
    -
    -    // These methods allow for inserting POJOs
    -    void insert(P object) throws DataAccessException;
    -    void insert(P... objects) throws DataAccessException;
    -    void insert(Collection<P> objects) throws DataAccessException;
    -    
    -    // These methods allow for updating POJOs based on their primary key
    -    void update(P object) throws DataAccessException;
    -    void update(P... objects) throws DataAccessException;
    -    void update(Collection<P> objects) throws DataAccessException;
    -    
    -    // These methods allow for deleting POJOs based on their primary key
    -    void delete(P... objects) throws DataAccessException;
    -    void delete(Collection<P> objects) throws DataAccessException;
    -    void deleteById(T... ids) throws DataAccessException;
    -    void deleteById(Collection<T> ids) throws DataAccessException;
    -    
    -    // These methods allow for checking record existence
    -    boolean exists(P object) throws DataAccessException;
    -    boolean existsById(T id) throws DataAccessException;
    -    long count() throws DataAccessException;
    -    
    -    // These methods allow for retrieving POJOs by primary key or by some other field
    -    List<P> findAll() throws DataAccessException;
    -    P findById(T id) throws DataAccessException;
    -    <Z> List<P> fetch(Field<Z> field, Z... values) throws DataAccessException;
    -    <Z> P fetchOne(Field<Z> field, Z value) throws DataAccessException;
    -
    -    // These methods provide DAO meta-information
    -    Table<R> getTable();
    -    Class<P> getType();
    -}]]></java><html>
    -
    -							<p>
    -								Besides these base methods, generated DAO classes implement various useful fetch methods. An incomplete example is given here, for the BOOK table:
    -							</p>
    -
    -</html><java><![CDATA[// An example generated BookDao class
    -public class BookDao extends DAOImpl<BookRecord, Book, Integer> {
    -
    -    // Columns with primary / unique keys produce fetchOne() methods    
    -    public Book fetchOneById(Integer value) { ... }
    -
    -    // Other columns produce fetch() methods, returning several records
    -    public List<Book> fetchByAuthorId(Integer... values) { ... }
    -    public List<Book> fetchByTitle(String... values) { ... }
    -}]]></java><html>
    -							<p>
    -								Note that you can further subtype those pre-generated DAO classes, to add more useful DAO methods to them. Using such a DAO is simple:
    -							</p>
    -							
    -</html><java><![CDATA[// Initialise a Factory
    -Factory create = new Factory(connection, SQLDialect.ORACLE);
    -
    -// Initialise the DAO with the Factory
    -BookDao bookDao = new BookDao(create);
    -
    -// Start using the DAO
    -Book book = bookDao.findById(5);
    -
    -// Modify and update the POJO
    -book.setTitle("1984");
    -book.setPublishedIn(1948);
    -bookDao.update(book);
    -
    -// Delete it again
    -bookDao.delete(book);]]></java></content>
    -					</section>
    -
    -				    <section id="exception-handling">
    -						<title>Exception handling</title>
    -						<content><html>
    -							<h3>Checked vs. unchecked exceptions</h3>
    -							<p>
    -								This is an eternal and religious debate. Pros and cons have been discussed time and again, and it still is a matter of taste, today. In this case, jOOQ clearly takes a side. jOOQ's exception strategy is simple:
    -							</p>
    -							<ul>
    -								<li>All "system exceptions" are unchecked. If in the middle of a transaction involving business logic, there is no way that you can recover sensibly from a lost database connection, or a constraint violation that indicates a bug in your understanding of your database model.</li>
    -								<li>All "business exceptions" are checked. Business exceptions are true exceptions that you should handle (e.g. not enough funds to complete a transaction).</li>
    -							</ul>
    -							<p>
    -								With jOOQ, it's simple. All of jOOQ's exceptions are "system exceptions", hence they are all unchecked.
    -							</p>
    -							
    -							<h3>jOOQ's DataAccessException</h3>
    -							<p>
    -								jOOQ uses its own <reference class="org.jooq.exception.DataAccessException"/> to wrap any underlying <reference class="java.sql.SQLException"/> that might have occurred. Note that all methods in jOOQ that may cause such a DataAccessException document this both in the Javadoc as well as in their method signature.
    -							</p>
    -							<p>
    -								DataAccessException is subtyped several times as follows:
    -							</p>
    -							<ul>
    -								<li><strong>DataAccessException</strong>: General exception usually originating from a <reference class="java.sql.SQLException"/></li>
    -								<li><strong>DataChangedException</strong>: An exception indicating that the database's underlying record has been changed in the mean time (see <reference id="optimistic-locking" title="optimistic locking"/>)</li>
    -								<li><strong>DataTypeException</strong>: Something went wrong during type conversion</li>
    -								<li><strong>DetachedException</strong>: A SQL statement was executed on a "detached" <reference id="crud-with-updatablerecords" title="UpdatableRecord"/> or a "detached" <reference id="sql-statements" title="SQL statement"/>.</li>
    -								<li><strong>InvalidResultException</strong>: An operation was performed expecting only one result, but several results were returned.</li>
    -								<li><strong>MappingException</strong>: Something went wrong when loading a record from a <reference id="pojos" title="POJO"/> or when mapping a record into a POJO</li>
    -							</ul>
    -							
    -							<h3>Override jOOQ's exception handling</h3>
    -							<p>
    -								The following section about <reference id="execute-listeners" title="execute listeners"/> documents means of overriding jOOQ's exception handling, if you wish to deal separately with some types of constraint violations, or if you raise business errors from your database, etc.
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="execute-listeners">
    -						<title>ExecuteListeners</title>
    -						<content><html>
    -							<p>
    -								The <reference id="custom-settings" title="jOOQ Factory Settings"/> let you specify a list of <reference class="org.jooq.ExecuteListener"/> classes. The ExecuteListener is essentially an event listener for Query, Routine, or ResultSet render, prepare, bind, execute, fetch steps. It is a base type for loggers, debuggers, profilers, data collectors, triggers, etc. Advanced ExecuteListeners can also provide custom implementations of Connection, PreparedStatement and ResultSet to jOOQ in apropriate methods.
    -							</p>
    -							<p>
    -								For convenience and better backwards-compatibility, consider extending <reference class="org.jooq.impl.DefaultExecuteListener"/> instead of implementing this interface.
    -							</p>
    -							<p>
    -								Here is a sample implementation of an ExecuteListener, that is simply counting the number of queries per type that are being executed using jOOQ:
    -							</p>
    -
    -</html><java><![CDATA[package com.example;
    -
    -// Extending DefaultExecuteListener, which provides empty implementations for all methods...
    -public class StatisticsListener extends DefaultExecuteListener {
    -    public static Map<ExecuteType, Integer> STATISTICS = new HashMap<ExecuteType, Integer>();
    -
    -    // Count "start" events for every type of query executed by jOOQ
    -    @Override
    -    public void start(ExecuteContext ctx) {
    -        synchronized (STATISTICS) {
    -            Integer count = STATISTICS.get(ctx.type());
    -    
    -            if (count == null) {
    -                count = 0;
    -            }
    -    
    -            STATISTICS.put(ctx.type(), count + 1);
    -        }
    -    }
    -}]]></java><html>
    -
    -							<p>
    -								Now, configure jOOQ's runtime to load your listener
    -							</p>
    -
    -</html><xml><![CDATA[<settings>
    -  <executeListeners>
    -    <executeListener>com.example.StatisticsListener</executeListener>
    -  </executeListeners>
    -</settings>]]></xml><html>
    -
    -							<p>
    -								And log results any time with a snippet like this:
    -							</p>
    -
    -</html><java><![CDATA[log.info("STATISTICS");
    -log.info("----------");
    -
    -for (ExecuteType type : ExecuteType.values()) {
    -    log.info(type.name(), StatisticsListener.STATISTICS.get(type) + " executions");
    -}]]></java><html>
    -                            <p>
    -                            	This may result in the following log output:
    -                            </p>
    -
    -</html><config>15:16:52,982  INFO - TEST STATISTICS
    -15:16:52,982  INFO - ---------------
    -15:16:52,983  INFO - READ                     : 919 executions
    -15:16:52,983  INFO - WRITE                    : 117 executions
    -15:16:52,983  INFO - DDL                      : 2 executions
    -15:16:52,983  INFO - BATCH                    : 4 executions
    -15:16:52,983  INFO - ROUTINE                  : 21 executions
    -15:16:52,983  INFO - OTHER                    : 30 executions</config><html>
    -
    -							<p>
    -								Please read the <reference class="org.jooq.ExecuteListener" title="ExecuteListener Javadoc"/> for more details
    -							</p>
    -							
    -							<h3>Writing a custom ExecuteListener for logging</h3>
    -							<p>
    -								The following depicts an example of a custom ExecuteListener, which pretty-prints all queries being executed by jOOQ to stdout:
    -							</p>
    -
    -</html><java><![CDATA[import org.jooq.ExecuteContext;
    -import org.jooq.conf.Settings;
    -import org.jooq.impl.DefaultExecuteListener;
    -import org.jooq.impl.Factory;
    -import org.jooq.tools.StringUtils;
    -
    -public class PrettyPrinter extends DefaultExecuteListener {
    -
    -    /**
    -     * Hook into the query execution lifecycle before executing queries
    -     */
    -    @Override
    -    public void executeStart(ExecuteContext ctx) {
    -
    -        // Create a new factory for logging rendering purposes
    -        // This factory doesn't need a connection, only the SQLDialect...
    -        Factory factory = new Factory(ctx.getDialect(), 
    -        
    -        // ... and the flag for pretty-printing
    -        	new Settings().withRenderFormatted(true));
    -
    -        // If we're executing a query
    -        if (ctx.query() != null) {
    -            System.out.println(factory.renderInlined(ctx.query()));
    -        }
    -        
    -        // If we're executing a routine
    -        else if (ctx.routine() != null) {
    -            System.out.println(factory.renderInlined(ctx.routine()));
    -        }
    -        
    -        // If we're executing anything else (e.g. plain SQL)
    -        else if (!StringUtils.isBlank(ctx.sql())) {
    -            System.out.println(ctx.sql());
    -        }
    -    }
    -}]]></java><html>
    -							<p>
    -								See also the manual's sections about <reference id="logging" title="logging"/> and the <reference id="jooq-console" title="jOOQ Console"/> for more sample implementations of actual ExecuteListeners.
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="logging">
    -						<title>Logging</title>
    -						<content><html>
    -							<p>
    -								jOOQ logs all SQL queries and fetched result sets to its internal DEBUG logger, which is implemented as an <reference id="execute-listeners" title="execute listener"/>. By default, execute logging is activated in the <reference id="custom-settings" title="jOOQ Factory Settings"/>. In order to see any DEBUG log output, put either log4j or slf4j on jOOQ's classpath along with their respective configuration. A sample log4j configuration can be seen here:
    -							</p>
    -							
    -</html><xml><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
    -<log4j:configuration>
    -    <appender name="stdout" class="org.apache.log4j.ConsoleAppender">
    -        <layout class="org.apache.log4j.PatternLayout">
    -            <param name="ConversionPattern" value="%m%n" />
    -        </layout>
    -    </appender>
    -
    -    <root>
    -        <priority value="debug" />
    -        <appender-ref ref="stdout" />
    -    </root>
    -</log4j:configuration>]]></xml><html>
    -
    -							<p>
    -								With the above configuration, let's fetch some data with jOOQ
    -							</p>
    -							
    -</html><java><![CDATA[// Using H2, this time
    -create.select(BOOK.ID, BOOK.TITLE).from(BOOK).orderBy(BOOK.ID).limit(1, 2).fetch();]]></java><html>
    -
    -							<p>
    -								The above query may result in the following log output:
    -							</p>
    -
    -</html><text><![CDATA[Executing query          : select "BOOK"."ID", "BOOK"."TITLE" from "BOOK" order by "BOOK"."ID" asc, limit ? offset ?
    --> with bind values      : select "BOOK"."ID", "BOOK"."TITLE" from "BOOK" order by "BOOK"."ID" asc, limit 2 offset 1
    -Query executed           : Total: 1.439ms
    -Fetched result           : +----+------------+
    -                         : |  ID|TITLE       |
    -                         : +----+------------+
    -                         : |   2|Animal Farm |
    -                         : |   3|O Alquimista|
    -                         : +----+------------+
    -Finishing                : Total: 4.814ms, +3.375ms
    -]]></text><html>
    -
    -							<p>
    -								Essentially, jOOQ will log
    -							</p>
    -							<ul>
    -								<li>The SQL statement as rendered to the prepared statement</li>
    -								<li>The SQL statement with inlined bind values (for improved debugging)</li>
    -								<li>The query execution time</li>
    -								<li>The first 5 records of the result. This is formatted using <reference id="exporting-text" title="jOOQ's text export"/></li>
    -								<li>The total execution + fetching time</li>
    -							</ul>
    -
    -							<p>
    -								If you wish to use your own logger (e.g. avoiding printing out sensitive data), you can deactivate jOOQ's logger using <reference id="custom-settings" title="your custom settings"/> and implement your own <reference id="execute-listeners" title="execute listener logger"/>.
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="performance-considerations">
    -						<title>Performance considerations</title>
    -						<content><html>
    -							<p>
    -								Many users may have switched from higher-level abstractions such as Hibernate to jOOQ, because of Hibernate's hard-to-manage performance, when it comes to large database schemas and complex second-level caching strategies. jOOQ is not a lightweight database abstraction framework, and it comes with its own overhead. Please be sure to consider the following points:
    -							</p>
    -							<ul>
    -								<li>It takes some time to construct jOOQ queries. If you can reuse the same queries, you might cache them. Beware of thread-safety issues, though, as jOOQ's <reference id="factory" title="Factory"/> is not threadsafe, and queries are "attached" to their creating Factory</li>
    -								<li>It takes some time to render SQL strings. Internally, jOOQ reuses the same <reference class="java.lang.StringBuilder"/> for the complete query, but some rendering elements may take their time. You could, of course, cache SQL generated by jOOQ and prepare your own <reference class="java.sql.PreparedStatement"/> objects</li>
    -								<li>It takes some time to bind values to prepared statements. jOOQ does not keep any open prepared statements, internally. Use a sophisticated connection pool, that will cache prepared statements and inject them into jOOQ through the standard JDBC API</li>
    -								<li>It takes some time to fetch results. By default, jOOQ will always fetch the complete <reference class="java.sql.ResultSet"/> into memory. Use <reference id="lazy-fetching" title="lazy fetching"/> to prevent that, and scroll over an open underlying database cursor</li>
    -							</ul>
    -							
    -							<h3>Optimise wisely</h3>
    -							<p>
    -								Don't be put off by the above paragraphs. You should optimise wisely, i.e. only in places where you really need very high throughput to your database. jOOQ's overhead compared to plain JDBC is typically less than 1ms per query.
    -							</p>
    -						</html></content>
    -					</section>
    -				</sections>
    -			</section>
    -
    -			<section id="code-generation">
    -				<title>Code generation</title>
    -				<content><html>
    -					<p>
    -						While optional, source code generation is one of jOOQ's main assets if you wish to increase developer productivity. jOOQ's code generator takes your database schema and reverse-engineers it into a set of Java classes modelling <reference id="table-expressions" title="tables"/>, <reference id="record-vs-tablerecord" title="records"/>, <reference id="sequence-execution" title="sequences"/>, <reference id="pojos" title="POJOs"/>, <reference id="daos" title="DAOs"/>, <reference id="stored-procedures" title="stored procedures"/>, user-defined types and many more.
    -					</p>
    -					<p>
    -						The essential ideas behind source code generation are these:
    -					</p>
    -					<ul>
    -						<li><strong>Increased IDE support</strong>: Type your Java code directly against your database schema, with all type information available</li>
    -						<li><strong>Type-safety</strong>: When your database schema changes, your generated code will change as well. Removing columns will lead to compilation errors, which you can detect early.</li>
    -					</ul>
    -					<p>
    -						The following chapters will show how to configure the code generator and how to generate various artefacts.
    -					</p>
    -				</html></content>
    -
    -				<sections>
    -				    <section id="codegen-configuration">
    -						<title>Configuration and setup of the generator</title>
    -						<content><html>
    -							<p>
    -								There are three binaries available with jOOQ, to be downloaded from <a href="https://sourceforge.net/projects/jooq/">SourceForge</a> or from Maven central:
    -							</p>
    -							<ul>
    -								<li>
    -									<strong>jooq-{jooq-version}.jar</strong>
    -									<br />
    -									The main library that you will include in your application to run jOOQ
    -								</li>
    -								<li>
    -									<strong>jooq-meta-{jooq-version}.jar</strong>
    -									<br />
    -									The utility that you will include in your build to navigate your database schema for code generation. This can be used as a schema crawler as well.
    -								</li>
    -								<li>
    -									<strong>jooq-codegen-{jooq-version}.jar</strong>
    -									<br />
    -									The utility that you will include in your build to generate your database schema
    -								</li>
    -							</ul>
    -
    -							<h3>Configure jOOQ's code generator</h3>
    -							<p>
    -								You need to tell jOOQ some things about your database connection. Here's an example of how to do it for an Oracle database
    -							</p>
    -							
    -</html><xml><![CDATA[<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    -<configuration>
    -  <!-- Configure the database connection here -->
    -  <jdbc>
    -    <driver>oracle.jdbc.OracleDriver</driver>
    -    <url>jdbc:oracle:thin:@[your jdbc connection parameters]</url>
    -    <user>[your database user]</user>
    -    <password>[your database password]</password>
    -    
    -    <!-- You can also pass user/password and other JDBC properties in the optional properties tag: -->
    -    <properties>
    -      <property><key>user</key><value>[db-user]</value></property>
    -      <property><key>password</key><value>[db-password]</value></property>
    -    </properties>
    -  </jdbc>
    -
    -  <generator>
    -    <database>
    -      <!-- The database dialect from jooq-meta. Available dialects are
    -           named org.util.[database].[database]Database. Known values are:
    -
    -           org.jooq.util.ase.ASEDatabase (to be used with Sybase ASE)
    -           org.jooq.util.cubrid.CUBRIDDatabase
    -           org.jooq.util.db2.DB2Database
    -           org.jooq.util.derby.DerbyDatabase
    -           org.jooq.util.h2.H2Database
    -           org.jooq.util.hsqldb.HSQLDBDatabase
    -           org.jooq.util.ingres.IngresDatabase
    -           org.jooq.util.mysql.MySQLDatabase
    -           org.jooq.util.oracle.OracleDatabase
    -           org.jooq.util.postgres.PostgresDatabase
    -           org.jooq.util.sqlite.SQLiteDatabase
    -           org.jooq.util.sqlserver.SQLServerDatabase
    -           org.jooq.util.sybase.SybaseDatabase (to be used with Sybase SQL Anywhere)
    -
    -           You can also provide your own org.jooq.util.Database implementation
    -           here, if your database is currently not supported or if you wish to
    -           read the database schema from a file, such as a Hibernate .hbm.xml file -->
    -      <name>org.jooq.util.oracle.OracleDatabase</name>
    -
    -      <!-- All elements that are generated from your schema (several Java
    -           regular expressions, separated by comma) Watch out for
    -           case-sensitivity. Depending on your database, this might be
    -           important! You can create case-insensitive regular expressions
    -           using this syntax: (?i:expr)A comma-separated list of regular
    -           expressions -->
    -      <includes>.*</includes>
    -
    -      <!-- All elements that are excluded from your schema (several Java
    -           regular expressions, separated by comma). Excludes match before
    -           includes -->
    -      <excludes></excludes>
    -
    -      <!-- The schema that is used locally as a source for meta information.
    -           This could be your development schema or the production schema, etc
    -           This cannot be combined with the schemata element.
    -
    -           If left empty, jOOQ will generate all available schemata. See the
    -           manual's next section to learn how to generate several schemata -->
    -      <inputSchema>[your database schema / owner / name]</inputSchema>
    -    </database>
    -
    -    <generate>
    -      <!-- Generation flags: See advanced configuration properties -->
    -    </generate>
    -
    -    <target>
    -      <!-- The destination package of your generated classes (within the
    -           destination directory) -->
    -      <packageName>[org.jooq.your.packagename]</packageName>
    -
    -      <!-- The destination directory of your generated classes -->
    -      <directory>[/path/to/your/dir]</directory>
    -    </target>
    -  </generator>
    -</configuration>]]></xml><html>
    -
    -							<p>
    -								There are also lots of advanced configuration parameters, which will be treated in the <reference id="codegen-advanced" title="manual's section about advanced code generation features"/> Note, you can find the official XSD file for a formal specification at:<br/>
    -							    <a href="http://www.jooq.org/xsd/jooq-codegen-2.5.0.xsd" title="The jOOQ-codegen configuration XSD">http://www.jooq.org/xsd/jooq-codegen-2.5.0.xsd</a>
    -						    </p>
    -
    -							<h3>Run jOOQ code generation</h3>
    -							<p>
    -								Code generation works by calling this class with the above property file as argument.
    -							</p>
    -							
    -</html><config>org.jooq.util.GenerationTool /jooq-config.xml</config><html>
    -
    -							<p>
    -								Be sure that these elements are located on the classpath:
    -							</p>
    -							
    -							<ul>
    -								<li>The XML configuration file</li>
    -								<li>jooq-{jooq-version}.jar, jooq-meta-{jooq-version}.jar, jooq-codegen-{jooq-version}.jar</li>
    -								<li>The JDBC driver you configured</li>
    -							</ul>
    -
    -							<h3>A command-line example (For Windows, unix/linux/etc will be similar)</h3>
    -							<ul>
    -								<li>Put the property file, jooq*.jar and the JDBC driver into a directory, e.g. C:\temp\jooq</li>
    -							    <li>Go to C:\temp\jooq</li>
    -							    <li>Run java -cp jooq-{jooq-version}.jar;jooq-meta-{jooq-version}.jar;jooq-codegen-{jooq-version}.jar;[JDBC-driver].jar;. org.jooq.util.GenerationTool /[XML file] </li>
    -							</ul>
    -							<p>
    -								Note that the property file must be passed as a classpath resource
    -							</p>
    -
    -							<h3>Run code generation from Eclipse</h3>
    -							<p>
    -								Of course, you can also run code generation from your IDE. In Eclipse, set up a project like this. Note that this example uses jOOQ's log4j support by adding log4j.xml and log4j.jar to the project classpath:
    -							</p>
    -							<div class="screenshot">
    -							<img class="screenshot" src="&lt;?=$root?&gt;/img/eclipse-example-01.png" alt="Eclipse configuration"/>
    -							</div>
    -
    -							<p>
    -								Once the project is set up correctly with all required artefacts on the classpath, you can configure an Eclipse Run Configuration for org.jooq.util.GenerationTool.
    -							</p>
    -							<div class="screenshot">
    -							<img class="screenshot" src="&lt;?=$root?&gt;/img/eclipse-example-02.png" alt="Eclipse configuration"/>
    -							</div>
    -
    -							<p>
    -								With the XML file as an argument
    -							</p>
    -							<div class="screenshot">
    -							<img class="screenshot" src="&lt;?=$root?&gt;/img/eclipse-example-03.png" alt="Eclipse configuration"/>
    -							</div>
    -
    -							<p>
    -								And the classpath set up correctly
    -							</p>
    -							<div class="screenshot">
    -							<img class="screenshot" src="&lt;?=$root?&gt;/img/eclipse-example-04.png" alt="Eclipse configuration"/>
    -							</div>
    -
    -							<p>
    -								Finally, run the code generation and see your generated artefacts
    -							</p>
    -							<div class="screenshot">
    -							<img class="screenshot" src="&lt;?=$root?&gt;/img/eclipse-example-05.png" alt="Eclipse configuration"/>
    -							</div>
    -
    -							<h3>Run generation with ant</h3>
    -							<p>
    -								You can also use an ant task to generate your classes. As a rule of thumb, remove the dots "." and dashes "-" from the .properties file's property names to get the ant task's arguments:
    -							</p>
    -							
    -</html><xml><![CDATA[<!-- Task definition -->
    -<taskdef name="generate-classes" classname="org.jooq.util.GenerationTask">
    -  <classpath>
    -    <fileset dir="${path.to.jooq.distribution}">
    -      <include name="jooq-{jooq-version}.jar"/>
    -      <include name="jooq-meta-{jooq-version}.jar"/>
    -      <include name="jooq-codegen-{jooq-version}.jar"/>
    -    </fileset>
    -    <fileset dir="${path.to.mysql.driver}">
    -      <include name="${mysql.driver}.jar"/>
    -    </fileset>
    -  </classpath>
    -</taskdef>
    -
    -<!-- Run the code generation task -->
    -<target name="generate-test-classes">
    -  <generate-classes
    -      jdbcurl="jdbc:mysql://localhost/test"
    -      jdbcuser="root"
    -      jdbcpassword=""
    -      generatordatabaseinputschema="test"
    -      generatortargetpackage="org.jooq.test.generatedclasses"
    -      generatortargetdirectory="${basedir}/src"/>
    -</target>]]></xml><html>
    -
    -							<p>
    -								Note that when running code generation with ant's &lt;java/&gt; task, you may have to set fork="true":
    -							</p>
    -
    -</html><xml><![CDATA[<!-- Run the code generation task -->
    -<target name="generate-test-classes">
    -  <java fork="true" classname="org.jooq.util.GenerationTool">
    -    [...]
    -  </java><html>
    -</target>
    -]]></xml><html>
    -
    -							<h3>Integrate generation with Maven</h3>
    -							<p>
    -								Using the official jOOQ-codegen-maven plugin, you can integrate source code generation in your Maven build process:
    -							</p>
    -
    -</html><xml><![CDATA[<plugin>
    -
    -  <!-- Specify the maven code generator plugin -->
    -  <groupId>org.jooq</groupId>
    -  <artifactId>jooq-codegen-maven</artifactId>
    -  <version>{jooq-version}</version>
    -
    -  <!-- The plugin should hook into the generate goal -->
    -  <executions>
    -    <execution>
    -      <goals>
    -        <goal>generate</goal>
    -      </goals>
    -    </execution>
    -  </executions>
    -
    -  <!-- Manage the plugin's dependency. In this example, we'll use a PostgreSQL database -->
    -  <dependencies>
    -    <dependency>
    -      <groupId>postgresql</groupId>
    -      <artifactId>postgresql</artifactId>
    -      <version>8.4-702.jdbc4</version>
    -    </dependency>
    -  </dependencies>
    -
    -  <!-- Specify the plugin configuration.
    -       The configuration format is the same as for the standalone code generator -->
    -  <configuration>
    -
    -    <!-- JDBC connection parameters -->
    -    <jdbc>
    -      <driver>org.postgresql.Driver</driver>
    -      <url>jdbc:postgresql:postgres</url>
    -      <user>postgres</user>
    -      <password>test</password>
    -    </jdbc>
    -
    -    <!-- Generator parameters -->
    -    <generator>
    -      <name>org.jooq.util.DefaultGenerator</name>
    -      <database>
    -        <name>org.jooq.util.postgres.PostgresDatabase</name>
    -        <includes>.*</includes>
    -        <excludes></excludes>
    -        <inputSchema>public</inputSchema>
    -      </database>
    -      <target>
    -        <packageName>org.jooq.util.maven.example</packageName>
    -        <directory>target/generated-sources/jooq</directory>
    -      </target>
    -    </generator>
    -  </configuration>
    -</plugin>
    -]]></xml><html>
    -
    -							<p>
    -								See the full example of a pom.xml including the jOOQ-codegen artefact here:<br/>
    -								<a href="https://github.com/jOOQ/jOOQ/blob/master/jOOQ-codegen-maven-example/pom.xml"
    -								  title="jOOQ-codegen-maven example pom.xml file">https://github.com/jOOQ/jOOQ/blob/master/jOOQ-codegen-maven-example/pom.xml</a>
    -							  </p>
    -
    -                            <h3>Migrate properties files from jOOQ 1.7, early versions of jOOQ 2.0.x:</h3>
    -                            <p>
    -                                Before jOOQ 2.0.4, the code generator was configured using properties files. These files are still supported for source code generation, but their syntax won't be maintained any longer. If you wish to migrate to XML, you can migrate the file using this command on the command line
    -                            </p>
    -
    -</html><config>org.jooq.util.GenerationTool /jooq-config.properties migrate</config><html>
    -
    -							<p>
    -								Using the migrate flag, jOOQ will read the properties file and output a corresponding XML file on system out
    -							</p>
    -
    -							<h3>Use jOOQ generated classes in your application</h3>
    -							<p>
    -								Be sure, both jooq-{jooq-version}.jar and your generated package (see configuration) are located on your classpath. Once this is done, you can execute SQL statements with your generated classes.
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="codegen-advanced">
    -						<title>Advanced generator configuration</title>
    -						<content><html>
    -							<p>
    -								In the <reference id="codegen-configuration" title="previous section"/> we have seen how jOOQ's source code generator is configured and run within a few steps. In this chapter we'll cover some advanced settings
    -							</p>
    -
    -</html><xml><![CDATA[<!-- These properties can be added directly to the generator element: -->
    -<generator>
    -  <!-- The default code generator. You can override this one, to generate your own code style
    -       Defaults to org.jooq.util.DefaultGenerator -->
    -  <name>org.jooq.util.DefaultGenerator</name>
    -
    -  <!-- The naming strategy used for class and field names.
    -       You may override this with your custom naming strategy. Some examples follow
    -       Defaults to org.jooq.util.DefaultGeneratorStrategy -->
    -  <strategy>
    -    <name>org.jooq.util.DefaultGeneratorStrategy</name>
    -  </strategy>
    -</generator>]]></xml><html>
    -
    -							<p>
    -								The following example shows how you can override the DefaultGeneratorStrategy to render table and column names the way they are defined in the database, rather than switching them to camel case:
    -							</p>
    -
    -</html><java><![CDATA[/**
    - * It is recommended that you extend the DefaultGeneratorStrategy. Most of the
    - * GeneratorStrategy API is already declared final. You only need to override any
    - * of the following methods, for whatever generation behaviour you'd like to achieve
    - *
    - * Beware that most methods also receive a "Mode" object, to tell you whether a
    - * TableDefinition is being rendered as a Table, Record, POJO, etc. Depending on
    - * that information, you can add a suffix only for TableRecords, not for Tables
    - */
    -public class AsInDatabaseStrategy extends DefaultGeneratorStrategy {
    -
    -    /**
    -     * Override this to specifiy what identifiers in Java should look like.
    -     * This will just take the identifier as defined in the database.
    -     */
    -    @Override
    -    public String getJavaIdentifier(Definition definition) {
    -        return definition.getOutputName();
    -    }
    -
    -    /**
    -     * Override these to specify what a setter in Java should look like. Setters
    -     * are used in TableRecords, UDTRecords, and POJOs. This example will name
    -     * setters "set[NAME_IN_DATABASE]"
    -     */
    -    @Override
    -    public String getJavaSetterName(Definition definition, Mode mode) {
    -        return "set" + definition.getOutputName();
    -    }
    -
    -    /**
    -     * Just like setters...
    -     */
    -    @Override
    -    public String getJavaGetterName(Definition definition, Mode mode) {
    -        return "get" + definition.getOutputName();
    -    }
    -
    -    /**
    -     * Override this method to define what a Java method generated from a database
    -     * Definition should look like. This is used mostly for convenience methods
    -     * when calling stored procedures and functions. This example shows how to
    -     * set a prefix to a CamelCase version of your procedure
    -     */
    -    @Override
    -    public String getJavaMethodName(Definition definition, Mode mode) {
    -        return "call" + org.jooq.tools.StringUtils.toCamelCase(definition.getOutputName());
    -    }
    -
    -    /**
    -     * Override this method to define how your Java classes and Java files should
    -     * be named. This example applies no custom setting and uses CamelCase versions
    -     * instead
    -     */
    -    @Override
    -    public String getJavaClassName(Definition definition, Mode mode) {
    -        return super.getJavaClassName(definition, mode);
    -    }
    -
    -    /**
    -     * Override this method to re-define the package names of your generated
    -     * artefacts.
    -     */
    -    @Override
    -    public String getJavaPackageName(Definition definition, Mode mode) {
    -        return super.getJavaPackageName(definition, mode);
    -    }
    -
    -    /**
    -     * Override this method to define how Java members should be named. This is
    -     * used for POJOs and method arguments
    -     */
    -    @Override
    -    public String getJavaMemberName(Definition definition, Mode mode) {
    -        return definition.getOutputName();
    -    }
    -
    -    /**
    -     * Override this method to define the base class for those artefacts that
    -     * allow for custom base classes
    -     */
    -    @Override
    -    public String getJavaClassExtends(Definition definition, Mode mode) {
    -        return Object.class.getName();
    -    }
    -
    -    /**
    -     * Override this method to define the interfaces to be implemented by those
    -     * artefacts that allow for custom interface implementation
    -     */
    -    @Override
    -    public List<String> getJavaClassImplements(Definition definition, Mode mode) {
    -        return Arrays.asList(Serializable.class.getName(), Cloneable.class.getName());
    -    }
    -
    -    /**
    -     * Override this method to define the suffix to apply to routines when
    -     * they are overloaded.
    -     *
    -     * Use this to resolve compile-time conflicts in generated source code, in
    -     * case you make heavy use of procedure overloading
    -     */
    -    @Override
    -    public String getOverloadSuffix(Definition definition, Mode mode, String overloadIndex) {
    -        return "_OverloadIndex_" + overloadIndex;
    -    }
    -}]]></java><html>
    -
    -                            <h3>jooq-meta configuration</h3>
    -							<p>
    -								Within the &lt;generator/&gt; element, there are other configuration elements:
    -							</p>
    -
    -</html><xml><![CDATA[<!-- These properties can be added to the database element: -->
    -<database>
    -
    -  <!-- All table and view columns that are used as "version" fields for
    -       optimistic locking (several Java regular expressions, separated by comma).
    -       See UpdatableRecord.store() and UpdatableRecord.delete() for details -->
    -  <recordVersionFields>REC_VERSION</recordVersionFields/>
    -
    -  <!-- All table and view columns that are used as "timestamp" fields for
    -       optimistic locking (several Java regular expressions, separated by comma).
    -       See UpdatableRecord.store() and UpdatableRecord.delete() for details -->
    -  <recordTimestampFields>REC_TIMESTAMP</recordTimestampFields/>
    -      
    -  <!-- Generate java.sql.Timestamp fields for DATE columns. This is
    -       particularly useful for Oracle databases.
    -       Defaults to false -->
    -  <dateAsTimestamp>false</dateAsTimestamp>
    -
    -  <!-- Generate jOOU data types for your unsigned data types, which are
    -       not natively supported in Java.
    -       Defaults to true -->
    -  <unsignedTypes>true</unsignedTypes>
    -
    -  <!-- The schema that is used in generated source code. This will be the
    -       production schema. Use this to override your local development
    -       schema name for source code generation. If not specified, this
    -       will be the same as the input-schema. -->
    -  <outputSchema>[your database schema / owner / name]</outputSchema>
    -
    -  <!-- A configuration element to configure several input and/or output
    -       schemata for jooq-meta, in case you're using jooq-meta in a multi-
    -       schema environment.
    -       This cannot be combined with the above inputSchema / outputSchema -->
    -  <schemata>
    -    <schema>
    -      <inputSchema>...</inputSchema>
    -      <outputSchema>...</outputSchema>
    -    </schema>
    -    [ <schema>...</schema> ... ]
    -  </schemata>
    -
    -  <!-- A configuration element to configure master data table enum classes -->
    -  <masterDataTables>...</masterDataTables>
    -
    -  <!-- A configuration element to configure custom data types -->
    -  <customTypes>...</customTypes>
    -
    -  <!-- A configuration element to configure type overrides for generated
    -       artefacts (e.g. in combination with customTypes) -->
    -  <forcedTypes>...</forcedTypes>
    -</database>]]></xml><html>
    -
    -							<p>
    -								Check out the some of the manual's "advanced" sections to find out more about the advanced configuration parameters.
    -							</p>
    -							<ul>
    -								<li><reference id="schema-mapping" title="Schema mapping"/></li>
    -								<li><reference id="master-data-types" title="Master data types"/></li>
    -								<li><reference id="custom-data-types" title="Custom types"/></li>
    -							</ul>
    -
    -							<h3>jooq-codegen configuration</h3>
    -                            <p>
    -                            	Also, you can add some optional advanced configuration parameters for the generator:
    -                           	</p>
    -
    -</html><xml><![CDATA[<!-- These properties can be added to the generate element: -->
    -<generate>
    -  <!-- Primary key / foreign key relations should be generated and used.
    -       This is a prerequisite for various advanced features.
    -       Defaults to true -->
    -  <relations>true</relations>
    -
    -  <!-- Generate navigation methods to navigate foreign key relationships
    -       directly from Record classes. This is only relevant if relations
    -       is set to true, too.
    -       Defaults to true -->
    -  <navigationMethods>true</navigationMethods>
    -
    -  <!-- Generate deprecated code for backwards compatibility
    -       Defaults to true -->
    -  <deprecated>true</deprecated>
    -
    -  <!-- Generate instance fields in your tables, as opposed to static
    -       fields. This simplifies aliasing.
    -       Defaults to true -->
    -  <instanceFields>true</instanceFields>
    -
    -  <!-- Generate the javax.annotation.Generated annotation to indicate
    -       jOOQ version used for source code.
    -       Defaults to true -->
    -  <generatedAnnotation>true</generatedAnnotation>
    -
    -  <!-- Generate jOOQ Record classes for type-safe querying. You can
    -       turn this off, if you don't need "active records" for CRUD
    -       Defaults to true -->
    -  <records>true</records>
    -
    -  <!-- Generate POJOs in addition to Record classes for usage of the
    -       ResultQuery.fetchInto(Class) API
    -       Defaults to false -->
    -  <pojos>false</pojos>
    -
    -  <!-- Generate immutable POJOs for usage of the ResultQuery.fetchInto(Class) API
    -       This overrides any value set in <pojos/>
    -       Defaults to false -->
    -  <immutablePojos>false</immutablePojos>
    -
    -  <!-- Generate interfaces that will be implemented by records and/or pojos.
    -       You can also use these interfaces in Record.into(Class<?>) and similar
    -       methods, to let jOOQ return proxy objects for them.
    -       Defaults to false -->
    -  <interfaces>false</interfaces>
    -
    -  <!-- Generate DAOs in addition to POJO classes
    -       Defaults to false -->
    -  <daos>false</daos>
    -
    -  <!-- Annotate POJOs and Records with JPA annotations for increased
    -       compatibility and better integration with JPA/Hibernate, etc
    -       Defaults to false -->
    -  <jpaAnnotations>false</jpaAnnotations>
    -
    -  <!-- Annotate POJOs and Records with JSR-303 validation annotations
    -       Defaults to false -->
    -  <validationAnnotations>false</validationAnnotations>
    -</generate>]]></xml></content>
    -					</section>
    -
    -				    <section id="codegen-globals">
    -						<title>Generated global artefacts</title>
    -						<content><html>
    -							<p>
    -								For increased convenience at the use-site, jOOQ generates "global" artefacts at the code generation root location, referencing tables, routines, sequences, etc. In detail, these global artefacts include the following:
    -							</p>
    -							<ul>
    -								<li><strong>Keys.java</strong>: This file contains all of the required primary key, unique key, foreign key and identity references in the form of static members of type <reference class="org.jooq.Key"/>.</li>
    -								<li><strong>Routines.java</strong>: This file contains all standalone routines (not in packages) in the form of static factory methods for <reference class="org.jooq.Routine"/> types.</li>
    -								<li><strong>Sequences.java</strong>: This file contains all sequence objects in the form of static members of type <reference class="org.jooq.Sequence"/>.</li>
    -								<li><strong>Tables.java</strong>: This file contains all table objects in the form of static member references to the actual singleton <reference class="org.jooq.Table"/> object</li>
    -								<li><strong>UDTs.java</strong>: This file contains all UDT objects in the form of static member references to the actual singleton <reference class="org.jooq.UDT"/> object</li>
    -							</ul>
    -							
    -							<h3>Referencing global artefacts</h3>
    -							<p>
    -								When referencing global artefacts from your client application, you would typically static import them as such:
    -							</p>
    -							
    -</html><java><![CDATA[// Static imports for all global artefacts
    -import static com.example.generated.Routines.*;
    -import static com.example.generated.Sequences.*;
    -import static com.example.generated.Tables.*;
    -
    -// You could then reference your artefacts as follows:
    -create.insertInto(MY_TABLE)
    -      .values(MY_SEQUENCE.nextval(), myFunction())
    -      
    -// as a more concise form of this:
    -create.insertInto(com.example.generated.Tables.MY_TABLE)
    -      .values(com.example.generated.Sequences.MY_SEQUENCE.nextval(), com.example.generated.Routines.myFunction())]]></java></content>
    -					</section>
    -
    -				    <section id="codegen-tables">
    -						<title>Generated tables</title>
    -						<content><html>
    -							<p>
    -								Every table in your database will generate a <reference class="org.jooq.Table"/> implementation that looks like this:
    -							</p>
    -							
    -</html><java><![CDATA[public class Book extends UpdatableTableImpl<BookRecord> {
    -
    -    // The singleton instance
    -    public static final Book BOOK = new Book();
    -
    -    // Generated columns
    -    public final TableField<BookRecord, Integer> ID        = createField("ID",        SQLDataType.INTEGER, this);
    -    public final TableField<BookRecord, Integer> AUTHOR_ID = createField("AUTHOR_ID", SQLDataType.INTEGER, this);
    -    public final TableField<BookRecord, String>  ITLE      = createField("TITLE",     SQLDataType.VARCHAR, this);
    -
    -    // Covariant aliasing method, returning a table of the same type as BOOK
    -    @Override
    -    public Book as(java.lang.String alias) {
    -        return new Book(alias);
    -    }
    -    
    -    // [...]
    -}]]></java><html>
    -
    -							<h3>Flags influencing generated tables</h3>
    -							<p>
    -								These flags from the <reference id="codegen-advanced" title="code generation configuration"/> influence generated tables:
    -							</p>
    -							<ul>
    -								<li><strong>recordVersionFields</strong>: Relevant methods from super classes are overridden to return the VERSION field</li>
    -								<li><strong>recordTimestampFields</strong>: Relevant methods from super classes are overridden to return the TIMESTAMP field</li>
    -								<li><strong>dateAsTimestamp</strong>: This influences all relevant columns</li>
    -								<li><strong>unsignedTypes</strong>: This influences all relevant columns</li>
    -								<li><strong>relations</strong>: Relevant methods from super classes are overridden to provide primary key, unique key, foreign key and identity information</li>
    -								<li><strong>instanceFields</strong>: This flag controls the "static" keyword on table columns, as well as aliasing convenience</li>
    -								<li><strong>records</strong>: The generated record type is referenced from tables allowing for type-safe single-table record fetching</li>
    -							</ul>
    -							
    -							<h3>Flags controlling table generation</h3>
    -							<p>
    -								Table generation cannot be deactivated
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="codegen-records">
    -						<title>Generated records</title>
    -						<content><html>
    -							<p>
    -								Every table in your database will generate a <reference class="org.jooq.Table"/> implementation that looks like this:
    -							</p>
    -							
    -</html><java><![CDATA[// JPA annotations can be generated, optionally
    -@Entity
    -@Table(name = "BOOK", schema = "TEST")
    -public class BookRecord extends UpdatableRecordImpl<BookRecord> 
    -
    -// An interface common to records and pojos can be generated, optionally
    -implements IBook {
    -
    -    // Every column generates a setter and a getter
    -    @Override
    -    public void setId(Integer value) {
    -        setValue(BOOK.ID, value);
    -    }
    -    
    -    @Id
    -    @Column(name = "ID", unique = true, nullable = false, precision = 7)
    -    @Override
    -    public Integer getId() {
    -        return getValue(BOOK.ID);
    -    }
    -    
    -    // More setters and getters
    -    public void setAuthorId(Integer value) {...}
    -    public Integer getAuthorId() {...}
    -    
    -    // Convenience methods for foreign key methods
    -    public void setAuthorId(AuthorRecord value) {
    -        if (value == null) {
    -            setValue(BOOK.AUTHOR_ID, null);
    -        }
    -        else {
    -            setValue(BOOK.AUTHOR_ID, value.getValue(AUTHOR.ID));
    -        }
    -    }
    -    
    -    // Navigation methods
    -    public AuthorRecord fetchAuthor() {
    -        return create().selectFrom(AUTHOR).where(AUTHOR.ID.equal(getValue(BOOK.AUTHOR_ID))).fetchOne();
    -    }
    -    
    -    // [...]
    -}]]></java><html>							
    -							
    -							<h3>Flags influencing generated records</h3>
    -							<p>
    -								These flags from the <reference id="codegen-advanced" title="code generation configuration"/> influence generated records:
    -							</p>
    -							<ul>
    -								<li><strong>dateAsTimestamp</strong>: This influences all relevant getters and setters</li>
    -								<li><strong>unsignedTypes</strong>: This influences all relevant getters and setters</li>
    -								<li><strong>relations</strong>: This is needed as a prerequisite for navigation methods</li>
    -								<li><strong>navigationMethods</strong>: This controls whether navigation methods will be generated or not</li>
    -								<li><strong>daos</strong>: Records are a pre-requisite for DAOs. If DAOs are generated, records are generated as well</li>
    -								<li><strong>interfaces</strong>: If interfaces are generated, records will implement them</li>
    -								<li><strong>jpaAnnotations</strong>: JPA annotations are used on generated records</li>
    -							</ul>
    -														
    -							<h3>Flags controlling record generation</h3>
    -							<p>
    -								Record generation can be deactivated using the <strong>records</strong> flag
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="codegen-pojos">
    -						<title>Generated POJOs</title>
    -						<content><html>
    -							<p>
    -								Every table in your database will generate a POJO implementation that looks like this:
    -							</p>
    -							
    -</html><java><![CDATA[// JPA annotations can be generated, optionally
    -@javax.persistence.Entity
    -@javax.persistence.Table(name = "BOOK", schema = "TEST")
    -public class Book implements java.io.Serializable
    -
    -// An interface common to records and pojos can be generated, optionally
    -, IBook {
    -
    -    // JSR-303 annotations can be generated, optionally
    -    @NotNull
    -    private Integer id;
    -
    -    @NotNull
    -    private Integer authorId;
    -
    -    @NotNull
    -    @Size(max = 400)
    -    private String title;
    -
    -    // Every column generates a getter and a setter
    -    @Id
    -    @Column(name = "ID", unique = true, nullable = false, precision = 7)
    -    @Override
    -    public Integer getId() {
    -        return this.id;
    -    }
    -
    -    @Override
    -    public void setId(Integer id) {
    -        this.id = id;
    -    }
    -    
    -    // [...]
    -}]]></java><html>							
    -							
    -							<h3>Flags influencing generated POJOs</h3>
    -							<p>
    -								These flags from the <reference id="codegen-advanced" title="code generation configuration"/> influence generated POJOs:
    -							</p>
    -							<ul>
    -								<li><strong>dateAsTimestamp</strong>: This influences all relevant getters and setters</li>
    -								<li><strong>unsignedTypes</strong>: This influences all relevant getters and setters</li>
    -								<li><strong>interfaces</strong>: If interfaces are generated, POJOs will implement them</li>
    -								<li><strong>immutablePojos</strong>: Immutable POJOs have final members and no setters. All members must be passed to the constructor</li>
    -								<li><strong>daos</strong>: POJOs are a pre-requisite for DAOs. If DAOs are generated, POJOs are generated as well</li>
    -								<li><strong>jpaAnnotations</strong>: JPA annotations are used on generated records</li>
    -								<li><strong>validationAnnotations</strong>: JSR-303 validation annotations are used on generated records</li>
    -							</ul>
    -														
    -							<h3>Flags controlling POJO generation</h3>
    -							<p>
    -								POJO generation can be activated using the <strong>pojos</strong> flag
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="codegen-interfaces">
    -						<title>Generated Interfaces</title>
    -						<content><html>
    -							<p>
    -								Every table in your database will generate an interface that looks like this:
    -							</p>
    -							
    -</html><java><![CDATA[public interface IBook extends java.io.Serializable {
    -
    -    // Every column generates a getter and a setter
    -    public void setId(Integer value);
    -    public Integer getId();
    -    
    -    // [...]
    -}]]></java><html>    						
    -							
    -							<h3>Flags influencing generated interfaces</h3>
    -							<p>
    -								These flags from the <reference id="codegen-advanced" title="code generation configuration"/> influence generated interfaces:
    -							</p>
    -							<ul>
    -								<li><strong>dateAsTimestamp</strong>: This influences all relevant getters and setters</li>
    -								<li><strong>unsignedTypes</strong>: This influences all relevant getters and setters</li>
    -							</ul>
    -														
    -							<h3>Flags controlling POJO generation</h3>
    -							<p>
    -								POJO generation can be activated using the <strong>interfaces</strong> flag
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="codegen-daos">
    -						<title>Generated DAOs</title>
    -						<content><html>
    -							<h3>Generated DAOs</h3>
    -							<p>
    -								Every table in your database will generate a <reference class="org.jooq.DAO"/> implementation that looks like this:
    -							</p>
    -							
    -</html><java><![CDATA[public class BookDao extends DAOImpl<BookRecord, Book, Integer> {
    -
    -    // Generated constructors
    -    public BookDao() {
    -        super(BOOK, Book.class);
    -    }
    -
    -    public BookDao(Factory factory) {
    -        super(BOOK, Book.class, factory);
    -    }
    -
    -    // Every column generates at least one fetch method
    -    public List<Book> fetchById(Integer... values) {
    -        return fetch(BOOK.ID, values);
    -    }
    -
    -    public Book fetchOneById(Integer value) {
    -        return fetchOne(BOOK.ID, value);
    -    }
    -
    -    public List<Book> fetchByAuthorId(Integer... values) {
    -        return fetch(BOOK.AUTHOR_ID, values);
    -    }
    -    
    -    // [...]
    -}]]></java><html>							
    -							
    -							<h3>Flags controlling DAO generation</h3>
    -							<p>
    -								DAO generation can be activated using the <strong>daos</strong> flag
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="codegen-sequences">
    -						<title>Generated sequences</title>
    -						<content><html>
    -							<p>
    -								Every sequence in your database will generate a <reference class="org.jooq.Sequence"/> implementation that looks like this:
    -							</p>
    -							
    -</html><java><![CDATA[public final class Sequences {
    -
    -    // Every sequence generates a member
    -    public static final Sequence<Integer> S_AUTHOR_ID = new SequenceImpl<Integer>("S_AUTHOR_ID", TEST, SQLDataType.INTEGER);
    -}]]></java><html>		
    -							
    -							<h3>Flags controlling sequence generation</h3>
    -							<p>
    -								Sequence generation cannot be deactivated
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="codegen-procedures">
    -						<title>Generated procedures</title>
    -						<content><html>
    -							<p>
    -								Every procedure or function (routine) in your database will generate a <reference class="org.jooq.Routine"/> implementation that looks like this:
    -							</p>
    -
    -</html><java><![CDATA[public class AuthorExists extends AbstractRoutine<java.lang.Void> {
    -
    -    // All IN, IN OUT, OUT parameters and function return values generate a static member
    -    public static final Parameter<String>     AUTHOR_NAME = createParameter("AUTHOR_NAME", SQLDataType.VARCHAR);
    -    public static final Parameter<BigDecimal> RESULT      = createParameter("RESULT",      SQLDataType.NUMERIC);
    -
    -    // A constructor for a new "empty" procedure call
    -    public AuthorExists() {
    -        super("AUTHOR_EXISTS", TEST);
    -
    -        addInParameter(AUTHOR_NAME);
    -        addOutParameter(RESULT);
    -    }
    -
    -    // Every IN and IN OUT parameter generates a setter
    -    public void setAuthorName(String value) {
    -        setValue(AUTHOR_NAME, value);
    -    }
    -
    -    // Every IN OUT, OUT and RETURN_VALUE generates a getter
    -    public BigDecimal getResult() {
    -        return getValue(RESULT);
    -    }
    -    
    -    // [...]
    -}]]></java><html>
    -
    -							<h3>Package and member procedures or functions</h3>
    -							<p>
    -								Procedures or functions contained in packages or UDTs are generated in a sub-package that corresponds to the package or UDT name.
    -							</p>
    -
    -							<h3>Flags controlling routine generation</h3>
    -							<p>
    -								Routine generation cannot be deactivated
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="codegen-udts">
    -						<title>Generated UDTs</title>
    -						<content><html>
    -							<p>
    -								Every UDT in your database will generate a <reference class="org.jooq.UDT"/> implementation that looks like this:
    -							</p>
    -						
    -</html><java><![CDATA[public class AddressType extends UDTImpl<AddressTypeRecord> {
    -
    -    // The singleton UDT instance
    -    public static final UAddressType U_ADDRESS_TYPE = new UAddressType();
    -
    -    // Every UDT attribute generates a static member
    -    public static final UDTField<AddressTypeRecord, String> ZIP     = 
    -      createField("ZIP",     SQLDataType.VARCHAR, U_ADDRESS_TYPE);
    -    public static final UDTField<AddressTypeRecord, String> CITY    = 
    -      createField("CITY",    SQLDataType.VARCHAR, U_ADDRESS_TYPE);
    -    public static final UDTField<AddressTypeRecord, String> COUNTRY = 
    -      createField("COUNTRY", SQLDataType.VARCHAR, U_ADDRESS_TYPE);
    -    
    -    // [...]
    -}]]></java><html>						
    -										
    -							<p>
    -								Besides the <reference class="org.jooq.UDT"/> implementation, a <reference class="org.jooq.UDTRecord"/> implementation is also generated
    -							</p>		
    -
    -</html><java><![CDATA[public class AddressTypeRecord extends UDTRecordImpl<AddressTypeRecord> {
    -
    -    // Every attribute generates a getter and a setter
    -
    -    public void setZip(String value) {...}
    -    public String getZip() {...}
    -    public void setCity(String value) {...}
    -    public String getCity() {...}
    -    public void setCountry(String value) {...}
    -    public String getCountry() {...}
    -    
    -    // [...]
    -}]]></java><html>						
    -
    -							<h3>Flags controlling UDT generation</h3>
    -							<p>
    -								UDT generation cannot be deactivated
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="master-data-types">
    -						<title>Master data and enumeration tables</title>
    -						<content><html>
    -							<p>
    -								<strong>NOTE</strong>: This feature is deprecated in jOOQ 2.5.0 and will be removed as of jOOQ 3.0
    -							</p>
    -							<p>
    -								Only MySQL and Postgres databases support true ENUM types natively. Some other RDBMS allow you to map the concept of an ENUM data type to a CHECK constraint, but those constraints can contain arbitrary SQL. With jOOQ, you can "simulate" ENUM types by declaring a table as a "master data table" in the configuration. At code-generation time, this table will be treated specially, and a Java enum type is generated from its data.
    -							</p>
    -
    -							<h3>Configure master data tables</h3>
    -							<p>
    -								As previously discussed, you can configure master data tables as follows:
    -							</p>
    -							
    -</html><xml><![CDATA[<!-- These properties can be added to the database element: -->
    -<database>
    -  <masterDataTables>
    -    <masterDataTable>
    -      <!-- The name of a master data table -->
    -      <name>[a table name]</name>
    -
    -      <!-- The column used for enum literals -->
    -      <literal>[a column name]</literal>
    -
    -      <!-- The column used for documentation -->
    -      <description>[a column name]</description>
    -    </masterDataTable>
    -
    -    [ <masterDataTable>...</masterDataTable> ... ]
    -  </masterDataTables>
    - </database>]]></xml><html>
    -
    -							<p>
    -								The results of this will be a Java enum that looks similar to this:
    -							</p>
    -							
    -</html><java><![CDATA[public enum Language implements MasterDataType<Integer> {
    -
    -  /**
    -   * English
    -   */
    -  en(1, "en", "English"),
    -
    -  /**
    -   * Deutsch
    -   */
    -  de(2, "de", "Deutsch"),
    -
    -  /**
    -   * Français
    -   */
    -  fr(3, "fr", "Français"),
    -
    -  /**
    -   * null
    -   */
    -  pt(4, "pt", null),
    -  ;
    -
    -  private final Integer id;
    -  private final String cd;
    -  private final String description;
    -
    -  // [ ... constructor and getters for the above properties ]
    -}]]></java><html>
    -
    -							<p>
    -								In the above example, you can see how the configured primary key is mapped to the id member, the configured literal column is mapped to the cd member and the configured description member is mapped to the description member and output as Javadoc. In other words, T_LANGUAGE is a table with 4 rows and at least three columns.
    -							</p>
    -							
    -							<p>
    -								The general contract is that there must be
    -							</p>
    -							<ul>
    -								<li>A single-column primary key column of character or integer type</li>
    -								<li>An optional unique literal column of character or integer type (otherwise, the primary key is used as enum literal) </li>
    -								<li>An optional description column of any type </li>
    -							</ul>
    -
    -							<h3>Using MasterDataTypes</h3>
    -							<p>
    -								The point of MasterDataTypes in jOOQ is that they behave exactly like true ENUM types. When the above T_LANGUAGE table is referenced by T_BOOK, instead of generating foreign key navigation methods and a LANGUAGE_ID Field&lt;Integer&gt;, a Field&lt;TLanguage&gt; is generated:
    -							</p>
    -
    -</html><java><![CDATA[public class Book extends UpdatableTableImpl<BookRecord> {
    -
    -  // [...]
    -  public static final TableField<BookRecord, Language> LANGUAGE_ID =
    -                  new TableFieldImpl<BookRecord, Language>( /* ... */ );
    -}]]></java><html>
    -
    -							<p>
    -								Which can then be used in the BookRecord directly:
    -							</p>
    -							
    -</html><java><![CDATA[public class BookRecord extends UpdatableRecordImpl<BookRecord> {
    -
    -  // [...]
    -  public Language getLanguageId() { // [...]
    -  public void setLanguageId(Language value) { // [...]
    -}]]></java><html>
    -
    -							<h3>When to use MasterDataTypes</h3>
    -							<p>
    -								You can use master data types when you're actually mapping master data to a Java enum. When the underlying table changes frequently, those updates will not be reflected by the statically generated code. Also, be aware that it will be difficult to perform actual JOIN operations on the underlying table with jOOQ, once the master data type is generated.
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="custom-data-types">
    -						<title>Custom data types and type conversion</title>
    -						<content><html>
    -							<p>
    -								When using a custom type in jOOQ, you need to let jOOQ know about its associated <reference class="org.jooq.Converter"/>. Ad-hoc usages of such converters has been discussed in the chapter about <reference id="data-type-conversion" title="data type conversion"/>. A more common use-case, however, is to let jOOQ know about custom types at code generation time. Use the following configuration elements to specify, that you'd like to use GregorianCalendar for all database fields that start with DATE_OF_
    -      						</p>
    -
    -</html><xml><![CDATA[<database>
    -  <!-- First, register your custom types here -->
    -  <customTypes>
    -    <customType>
    -      <!-- Specify the fully-qualified class name of your custom type -->
    -      <name>java.util.GregorianCalendar</name>
    -
    -      <!-- Associate that custom type with your converter. Note, a
    -           custom type can only have one converter in jOOQ -->
    -      <converter>com.example.CalendarConverter</converter>
    -    </customType>
    -  </customTypes>
    -
    -  <!-- Then, associate custom types with database columns -->
    -  <forcedTypes>
    -    <forcedType>
    -      <!-- Specify again he fully-qualified class name of your custom type -->
    -      <name>java.util.GregorianCalendar</name>
    -
    -      <!-- Add a list of comma-separated regular expressions matching columns -->
    -      <expressions>.*\.DATE_OF_.*</expressions>
    -    </forcedType>
    -  </forcedTypes>
    -</database>]]></xml><html>
    -
    -                            <p>
    -                            	The above configuration will lead to AUTHOR.DATE_OF_BIRTH being generated like this:
    -                            </p>
    -
    -</html><java><![CDATA[public class TAuthor extends UpdatableTableImpl<TAuthorRecord> {
    -
    -    // [...]
    -    public final TableField<TAuthorRecord, GregorianCalendar> DATE_OF_BIRTH =    // [...]
    -    // [...]
    -
    -}]]></java><html>
    -
    -                            <p>
    -                            	This means that the bound type of &lt;T&gt; will be GregorianCalendar, wherever you reference DATE_OF_BIRTH. jOOQ will use your custom converter when binding variables and when fetching data from <reference class="java.util.ResultSet"/>:
    -                            </p>
    -
    -</html><java><![CDATA[// Get all date of births of authors born after 1980
    -List<GregorianCalendar> result =
    -create.selectFrom(AUTHOR)
    -      .where(AUTHOR.DATE_OF_BIRTH.greaterThan(new GregorianCalendar(1980, 0, 1)))
    -      .fetch(AUTHOR.DATE_OF_BIRTH);]]></java></content>
    -					</section>
    -
    -				    <section id="schema-mapping">
    -						<title>Mapping generated schemata and tables</title>
    -						<content><html>
    -							<p>
    -								We've seen previously in the chapter about <reference id="runtime-schema-mapping" title="runtime schema mapping"/>, that schemata and tables can be mapped at runtime to other names. But you can also hard-wire schema mapping in generated artefacts at code generation time, e.g. when you have 5 developers with their own dedicated developer databases, and a common integration database. In the code generation configuration, you would then write.
    -							</p>
    -
    -</html><xml><![CDATA[<schemata>
    -  <schema>
    -    <!-- Use this as the developer's schema: -->
    -    <inputSchema>LUKAS_DEV_SCHEMA</inputSchema>
    -
    -    <!-- Use this as the integration / production database: -->
    -    <outputSchema>PROD</outputSchema>
    -  </schema>
    -</schemata>]]></xml></content>
    -					</section>
    -				</sections>
    -			</section>
    -
    -			<section id="tools">
    -				<title>Tools</title>
    -				<content><html>
    -					<p>
    -						These chapters hold some information about tools to be used with jOOQ
    -					</p>
    -				</html></content>
    -
    -				<sections>
    -					<section id="jooq-console">
    -						<title>jOOQ Console</title>
    -						<content><html>
    -							<p>
    -							    The <reference id="execute-listeners" title="ExecuteListener API"/> was driven by a feature request by Christopher Deckers, who has had the courtesy to contribute the jOOQ Console, a sample application interfacing with jOOQ's ExecuteListeners. The jOOQ Console logs all queries executed by jOOQ and displays them nicely in a Swing application. With the jOOQ Console's logger, you can:
    -						    </p>
    -						    <ul>
    -						    	<li>Activate the console's DebugListener anytime (in-process or if the remote server is active).</li>
    -						    	<li>View simple and batch queries and their parameters.</li>
    -						    	<li>Reformat queries along with syntax highlighting for better readability.</li>
    -						    	<li>View stack trace of originator of the call.</li>
    -						    	<li>Dump the stack to stdout when in an IDE, to directly navigate to relevant classes.</li>
    -						    	<li>Track execution time, binding time, parsing time, rows read, fields read.</li>
    -						    	<li>Show/hide queries depending on their type (SELECT, UPDATE, etc.).</li>
    -						    	<li>Sort any column (timing columns, queries, types, etc.)</li>
    -						    	<li>Easy copy paste of rows/columns to Spreadsheet editors.</li>
    -						    </ul>
    -
    -						    <p>
    -						    	A short overview of such a debugging session can be seen here:
    -						    </p>
    -   							<div class="screenshot">
    -								<img class="screenshot" src="&lt;?=$root?&gt;/img/jooq-console-01.png" alt="jOOQ Console example"/>
    -							</div>
    -						    <p>
    -							    Please note that the jOOQ Console is still experimental. Any feedback is very welcome on <br/>
    -							    <a href="http://groups.google.com/group/jooq-user" title="the jooq-user group">the jooq-user group</a>
    -							</p>
    -
    -							<h3>jOOQ Console operation modes</h3>
    -							<p>
    -								The jOOQ Console can be run in two different modes:
    -							</p>
    -							<ul>
    -								<li>In-process mode: running in the same process as the queries you're analysing</li>
    -								<li>"headless" mode: running remotely</li>
    -							</ul>
    -
    -							<p>
    -								Both modes will require that you set the <reference class="org.jooq.debug.impl.DebugListener"/> in the Factory's settings. When using XML settings:
    -							</p>
    -
    -</html><xml><![CDATA[<settings>
    -  <executeListeners>
    -    <executeListener>org.jooq.debug.impl.DebugListener</executeListener>
    -  </executeListeners>
    -</settings>]]></xml><html>
    -
    -							<p>
    -								Or when using programmatic settings:
    -							</p>
    -							
    -</html><java><![CDATA[Settings settings = new Settings()
    -    .getExecuteListeners().add("org.jooq.debug.impl.DebugListener");
    -Factory factory = new Factory(connection, dialect, settings);]]></java><html>
    -
    -							<h3>In-process mode</h3>
    -							<p>
    -								The in-process mode is useful for Swing applications or other, locally run Java programs accessing the database via jOOQ. In order to launch the jOOQ Console "in-process", specify the previously documented settings and launch the Console as follows:
    -							</p>
    -
    -</html><java><![CDATA[// Define a DatabaseDescriptor for the "in-process" mode
    -// It is needed for the "Editor" tab
    -DatabaseDescriptor descriptor = new DatabaseDescriptor() {
    -
    -    // Return your generated schema. This is used by the console
    -    // to introspect your schema data
    -    @Override
    -    public Schema getSchema() {
    -        return com.example.MySchema.MY_SCHEMA;
    -    }
    -
    -    // Return the SQL dialect that you're using
    -    @Override
    -    public SQLDialect getSQLDialect() {
    -        return SQLDialect.ORACLE;
    -    }
    -
    -    // Return a connection
    -    @Override
    -    public Connection createConnection() {
    -        try {
    -            return DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "test", "test");
    -        }
    -        catch (Exception ignore) {}
    -    }
    -};
    -
    -// Now pass this database descriptor to the Console and make it visible
    -try {
    -
    -    // Use this for a nicer look-and-feel
    -    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    -
    -    // Create a new Console
    -    Console console = new Console(descriptor, true);
    -    console.setLoggingActive(true);
    -    console.setVisible(true);
    -}
    -catch (Exception ignore) {}
    -]]></java><html>
    -
    -							<p>
    -								Only in the in-process mode, you can execute ad-hoc queries directly from the console, if you provide it with proper DatabaseDescriptor. These queries are executed from the Editor pane which features:
    -							</p>
    -							<ul>
    -								<li>SQL editing within the console.</li>
    -								<li>Incremental search on tables.</li>
    -								<li>Simple code completion with tables/columns/SQL keywords.</li>
    -								<li>Syntax highlighting and formatting capabilities.</li>
    -								<li>Results shown in one or several tabs.</li>
    -								<li>Easy analysis of Logger output by copy/pasting/running queries in the Editor.</li>
    -							</ul>
    -   							<div class="screenshot">
    -								<img class="screenshot" src="&lt;?=$root?&gt;/img/jooq-console-02.png" alt="jOOQ Console example"/>
    -							</div>
    -
    -                            <h3>"Headless" mode</h3>
    -							<p>
    -								In J2EE or other server/client environments, you may not be able to run the console in the same process as your application. You can then run the jOOQ Console in "headless" mode. In addition to the previously documented settings, you'll have to start a debugger server in your application process, that the console can connect to:
    -							</p>
    -
    -</html><java>// Create a new RemoteDebuggerServer in your application that listens to
    -// incoming connections on a given port
    -SERVER = new RemoteDebuggerServer(DEBUGGER_PORT);</java><html>
    -
    -							<p>
    -								Now start your application along with the debugger server and launch the console with this command:
    -							</p>
    -
    -</html><config>java -jar jooq-console-2.1.0.jar [host] [port]</config><html>
    -
    -							<p>
    -								Depending on your distribution, you may have to manually add rsyntaxtextarea-1.5.0.jar and jOOQ artefacts on your classpath.
    -							</p>
    -						</html></content>
    -					</section>
    -				</sections>
    -			</section>
    -
    -			<section id="reference">
    -				<title>Reference</title>
    -				<content><html>
    -					<p>
    -						These chapters hold some general jOOQ reference information
    -					</p>
    -				</html></content>
    -
    -				<sections>
    -					<section id="supported-rdbms">
    -						<title>Supported RDBMS</title>
    -						<content><html>
    -							<h3>A list of supported databases</h3>
    -							<p>
    -						   		Every RDMBS out there has its own little specialties. jOOQ considers those specialties as much as possible, while trying to standardise the behaviour in jOOQ. In order to increase the quality of jOOQ, some 70 unit tests are run for syntax and variable binding verification, as well as some 180 integration tests with an overall of around 1200 queries for any of these databases:
    -					   		</p>
    -							<ul>
    -							    <li>CUBRID 8.4.1</li>
    -							    <li>DB2 9.7</li>
    -							    <li>Derby 10.8</li>
    -							    <li>Firebird 2.5.1</li>
    -							    <li>H2 1.3.161</li>
    -							    <li>HSQLDB 2.2.5</li>
    -							    <li>Ingres 10.1.0</li>
    -							    <li>MySQL 5.1.41 and 5.5.8</li>
    -							    <li>Oracle XE 10.2.0.1.0 and 11g</li>
    -							    <li>PostgreSQL 9.0</li>
    -							    <li>SQLite with inofficial JDBC driver v056</li>
    -							    <li>SQL Server 2008 R8</li>
    -							    <li>Sybase Adaptive Server Enterprise 15.5</li>
    -							    <li>Sybase SQL Anywhere 12</li>
    -							</ul>
    -							<p>
    -								These platforms have been observed to work as well, but are not integration-tested
    -							</p>
    -							<ul>
    -								<li>Google Cloud SQL (MySQL)</li>
    -							</ul>
    -								
    -							<h3>Databases planned for support</h3>
    -							<p>
    -								Any of the following databases might be available in the future
    -							</p>
    -						    <ul>
    -							    <li>Informix</li>
    -							    <li>Interbase</li>
    -							    <li>MS Access</li>
    -							    <li>MS Excel</li>
    -							    <li>SQL Azure</li>
    -							    <li>Sybase SQL Anywhere OnDemand</li>
    -							    <li>Teradata</li>
    -						    </ul>
    -						    
    -							<h3>Databases being watched</h3>
    -							<p>
    -								Any of the following databases are being observed for a potential integration
    -							</p>
    -							<ul>
    -								<li>Mondrian</li>
    -								<li>Netezza</li>
    -								<li>SQLFire</li>
    -								<li>Vectorwise</li>
    -								<li>Vertica</li>
    -								<li>VoltDB</li>
    -							</ul>
    -
    -							<h3>Feature matrix</h3>
    -							<p>
    -								This section will soon contain a feature matrix, documenting what feature is available for which database.
    -							</p>
    -						</html></content>
    -					</section>
    -
    -					<section id="reference-data-types">
    -						<title>Data types</title>
    -						<content><html>
    -							<p>
    -								There is always a small mismatch between SQL data types and Java data types. This is for two reasons:
    -							</p>
    -							<ul>
    -								<li>SQL data types are insufficiently covered by the JDBC API.</li>
    -								<li>Java data types are often less expressive than SQL data types</li>
    -							</ul>
    -							<p>
    -								This chapter should document the most important notes about SQL, JDBC and jOOQ data types.
    -							</p>
    -						</html></content>
    -						
    -						<sections>
    -							<section id="data-types-lobs">
    -								<title>BLOBs and CLOBs</title>
    -								<content><html>
    -									<p>
    -										jOOQ currently doesn't explicitly support JDBC BLOB and CLOB data types. If you use any of these data types in your database, jOOQ will map them to byte[] and String instead. In simple cases (small data), this simplification is sufficient. In more sophisticated cases, you may have to bypass jOOQ, in order to deal with these data types and their respective resources. True support for LOBs is on the roadmap, though.
    -									</p>
    -								</html></content>
    -							</section>
    -							
    -							<section id="data-types-unsigned">
    -								<title>Unsigned integer types</title>
    -								<content><html>
    -									<p>
    -										Some databases explicitly support unsigned integer data types. In most normal JDBC-based applications, they would just be mapped to their signed counterparts letting bit-wise shifting and tweaking to the user. jOOQ ships with a set of unsigned <reference class="java.lang.Number"/> implementations modelling the following types:
    -									</p>
    -									<ul>
    -										<li><reference class="org.jooq.tools.unsigned.UByte"/>: Unsigned byte, an 8-bit unsigned integer</li>
    -										<li><reference class="org.jooq.tools.unsigned.UShort"/>: Unsigned short, a 16-bit unsigned integer</li>
    -										<li><reference class="org.jooq.tools.unsigned.UInteger"/>: Unsigned int, a 32-bit unsigned integer</li>
    -										<li><reference class="org.jooq.tools.unsigned.ULong"/>: Unsigned long, a 64-bit unsigned integer</li>
    -									</ul>
    -									<p>
    -										Each of these wrapper types extends <reference class="java.lang.Number"/>, wrapping a higher-level integer type, internally:
    -									</p>
    -									<ul>
    -										<li>UByte wraps <reference class="java.lang.Short"/></li>
    -										<li>UShort wraps <reference class="java.lang.Integer"/></li>
    -										<li>UInteger wraps <reference class="java.lang.Long"/></li>
    -										<li>ULong wraps <reference class="java.math.BigInteger"/></li>
    -									</ul>
    -								</html></content>
    -							</section>
    -							
    -							<section id="data-types-intervals">
    -								<title>INTERVAL data types</title>
    -								<content><html>
    -									<p>
    -										jOOQ fills a gap opened by JDBC, which neglects an important SQL data type as defined by the SQL standards: INTERVAL types. SQL knows two different types of intervals:
    -									</p>
    -									<ul>
    -										<li><strong>YEAR TO MONTH</strong>: This interval type models a number of months and years</li>
    -										<li><strong>DAY TO SECOND</strong>: This interval type models a number of days, hours, minutes, seconds and milliseconds</li>
    -									</ul>
    -									
    -									<p>
    -										Both interval types ship with a variant of subtypes, such as DAY TO HOUR, HOUR TO SECOND, etc. jOOQ models these types as Java objects extending <reference class="java.lang.Number"/>: <reference class="org.jooq.types.YearToMonth"/> (where Number.intValue() corresponds to the absolute number of months) and <reference class="org.jooq.types.DayToSecond"/> (where Number.intValue() corresponds to the absolute number of milliseconds)
    -									</p>
    -									
    -									<h3>Interval arithmetic</h3>
    -									<p>
    -										In addition to the <reference id="arithmetic-expressions" title="arithmetic expressions"/> documented previously, interval arithmetic is also supported by jOOQ. Essentially, the following operations are supported:
    -									</p>
    -									<ul>
    -										<li>DATETIME - DATETIME => INTERVAL</li>
    -										<li>DATETIME + or - INTERVAL => DATETIME</li>
    -										<li>INTERVAL + DATETIME => DATETIME</li>
    -										<li>INTERVAL + - INTERVAL => INTERVAL</li>
    -										<li>INTERVAL * or / NUMERIC => INTERVAL</li>
    -										<li>NUMERIC * INTERVAL => INTERVAL</li>
    -									</ul>
    -								</html></content>
    -							</section>
    -							
    -							<section id="data-types-xml">
    -								<title>XML data types</title>
    -								<content><html>
    -									<p>
    -										XML data types are currently not supported
    -									</p>
    -								</html></content>
    -							</section>
    -							
    -							<section id="data-types-geospacial">
    -								<title>Geospacial data types</title>
    -								<content><html>
    -									<h3>Geospacial data types</h3>
    -									<p>
    -										Geospacial data types are currently not supported
    -									</p>
    -								</html></content>
    -							</section>
    -							
    -							<section id="data-types-cursors">
    -								<title>CURSOR data types</title>
    -								<content><html>
    -									<p>
    -										Some databases support cursors returned from stored procedures. They are mapped to the following jOOQ data type:
    -									</p>
    -
    -</html><java><![CDATA[Field<Result<Record>> cursor;]]></java><html>
    -									
    -									<p>
    -										In fact, such a cursor will be fetched immediately by jOOQ and wrapped in an <reference class="org.jooq.Result"/> object.
    -									</p>
    -								</html></content>
    -							</section>
    -							
    -							<section id="data-types-arrays">
    -								<title>ARRAY and TABLE data types</title>
    -								<content><html>
    -									<p>
    -										The SQL standard specifies ARRAY data types, that can be mapped to Java arrays as such:
    -									</p>
    -									
    -</html><java><![CDATA[Field<Integer[]> intArray;]]></java><html>
    -										
    -									<p>
    -										The above array type is supported by these SQL dialects:
    -									</p>
    -									<ul>
    -										<li>H2</li>
    -										<li>HSQLDB</li>
    -										<li>Postgres</li>
    -									</ul>
    -									
    -									<h3>Oracle typed arrays</h3>
    -									<p>
    -										Oracle has strongly-typed arrays and table types (as opposed to the previously seen anonymously typed arrays). These arrays are wrapped by <reference class="org.jooq.ArrayRecord"/> types.
    -									</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -					<section id="reference-bnf-notation">
    -						<title>jOOQ's BNF pseudo-notation</title>
    -						<content><html>
    -							<p>
    -								This chapter will soon contain an overview over jOOQ's API using a pseudo BNF notation.
    -							</p>
    -						</html></content>
    -					</section>
    -
    -					<section id="reference-credits">
    -						<title>Credits</title>
    -						<content><html>
    -							<p>
    -								jOOQ lives in a very challenging ecosystem. The Java to SQL interface is still one of the most important system interfaces. Yet there are still a lot of open questions, best practices and no "true" standard has been established. This situation gave way to a lot of tools, APIs, utilities which essentially tackle the same problem domain as jOOQ. jOOQ has gotten great inspiration from pre-existing tools and this section should give them some credit. Here is a list of inspirational tools in alphabetical order:
    -							</p>
    -							<ul>
    -								<li><a href="http://avaje.org">Avajé EBean</a>: Play! Framework's preferred ORM has a feature called asynchronous query execution. This idea made it into jOOQ as <reference class="org.jooq.ResultQuery" anchor="#fetchLater()"/></li>
    -								<li><a href="http://www.hibernate.org">Hibernate</a>: The de-facto standard (JPA) with its useful table-to-POJO mapping features have influenced jOOQ's <reference class="org.jooq.ResultQuery" anchor="#fetchInto(java.lang.Class)"/> facilities</li>
    -								<li><a href="http://www.h2database.com/html/jaqu.html">JaQu</a>: H2's own fluent API for querying databases</li>
    -								<li><a href="http://www.oracle.com/technetwork/java/javaee/tech/persistence-jsp-140049.html">JPA</a>: The de-facto standard in the javax.persistence packages, supplied by Oracle. Its annotations are useful to jOOQ as well.</li>
    -								<li><a href="http://onewebsql.com">OneWebSQL</a>: A commercial SQL abstraction API with support for DAO source code generation, which was integrated also in jOOQ</li>
    -								<li><a href="http://www.querydsl.com">QueryDSL</a>: A "LINQ-port" to Java. It has a similar fluent API, a similar code-generation facility, yet quite a different purpose. While jOOQ is all about SQL, QueryDSL (like LINQ) is mostly about querying.</li>
    -								<li><a href="http://www.springsource.org/features/data-access">Spring Data</a>: Spring's JdbcTemplate knows RowMappers, which are reflected by jOOQ's <reference id="recordhandler"/> or <reference id="recordmapper"/></li>
    -							</ul>
    -						</html></content>
    -					</section>
    -				</sections>
    -			</section>
    -		</sections>
    -	</section>
    -</manual>
    diff --git a/jOOQ-website/src/main/resources/manual-3.0.xml b/jOOQ-website/src/main/resources/manual-3.0.xml
    deleted file mode 100644
    index 8d7967763e..0000000000
    --- a/jOOQ-website/src/main/resources/manual-3.0.xml
    +++ /dev/null
    @@ -1,10436 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?>
    -<!-- 
    -  - Copyright (c) 2009-2013, Lukas Eder, lukas.eder@gmail.com
    -  - All rights reserved.
    -  -
    -  - This software is licensed to you under the Apache License, Version 2.0
    -  - (the "License"); You may obtain a copy of the License at
    -  -
    -  -   http://www.apache.org/licenses/LICENSE-2.0
    -  -
    -  - Redistribution and use in source and binary forms, with or without
    -  - modification, are permitted provided that the following conditions are met:
    -  -
    -  - . Redistributions of source code must retain the above copyright notice, this
    -  -   list of conditions and the following disclaimer.
    -  -
    -  - . Redistributions in binary form must reproduce the above copyright notice,
    -  -   this list of conditions and the following disclaimer in the documentation
    -  -   and/or other materials provided with the distribution.
    -  -
    -  - . Neither the name "jOOQ" nor the names of its contributors may be
    -  -   used to endorse or promote products derived from this software without
    -  -   specific prior written permission.
    -  -
    -  - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    -  - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    -  - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    -  - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
    -  - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
    -  - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
    -  - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
    -  - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
    -  - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
    -  - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
    -  - POSSIBILITY OF SUCH DAMAGE.
    -  -->
    -<manual>
    -	<section id="manual">
    -		<title>The jOOQ User Manual. Multiple Pages</title>
    -		<content><html>
    -			<h2 id="Overview"><a href="#Overview" name="Overview">#</a> Overview</h2>
    -			<p>This manual is divided into six main sections:</p>
    -
    -			<ul>
    -				<li>
    -					<reference id="getting-started"/>
    -					<p>
    -						This section will get you started with jOOQ quickly. It contains
    -						simple explanations about what jOOQ is, what jOOQ isn't and how
    -						to set it up for the first time
    -					</p>
    -				</li>
    -				<li>
    -					<reference id="sql-building"/>
    -					<p>
    -						This section explains all about the jOOQ syntax used for building
    -						queries. It explains the central factories, the supported SQL
    -						statements and various other syntax elements
    -					</p>
    -				</li>
    -				<li>
    -					<reference id="code-generation"/>
    -					<p>
    -						This section explains how to configure and use the built-in source code
    -						generator
    -					</p>
    -				</li>
    -				<li>
    -					<reference id="sql-execution"/>
    -					<p>
    -						This section will get you through the specifics of what can be done
    -						with jOOQ at runtime, in order to execute queries, perform CRUD
    -						operations, import and export data, and hook into the jOOQ execution
    -						lifecycle for debugging
    -					</p>
    -				</li>
    -				<li>
    -					<reference id="tools"/>
    -					<p>
    -						This section is dedicated to tools that ship with jOOQ, such as the
    -						jOOQ console
    -					</p>
    -				</li>
    -				<li>
    -					<reference id="reference"/>
    -					<p>
    -						This section is a reference for elements in this manual
    -					</p>
    -				</li>
    -			</ul>
    -		</html></content>
    -
    -		<sections>
    -			<section id="preface">
    -				<title>Preface</title>
    -				<content><html>
    -					<h3>jOOQ's reason for being - compared to JPA</h3>
    -					<p>
    -						Java and SQL have come a long way. SQL is an "ancient", yet established and well-understood technology. Java is a legacy too, although its platform JVM allows for many new and contemporary languages built on top of it. Yet, after all these years, libraries dealing with the interface between SQL and Java have come and gone, leaving JPA to be a standard that is accepted only with doubts, short of any surviving options.
    -					</p>
    -					<p>
    -						So far, there had been only few database abstraction frameworks or libraries, that truly respected SQL as a first class citizen among languages. Most frameworks, including the industry standards JPA, EJB, Hibernate, JDO, Criteria Query, and many others try to hide SQL itself, minimising its scope to things called JPQL, HQL, JDOQL and various other inferior query languages
    -					</p>
    -					<p>
    -						jOOQ has come to fill this gap.
    -					</p>
    -
    -					<h3>jOOQ's reason for being - compared to LINQ</h3>
    -					<p>
    -						Other platforms incorporate ideas such as LINQ (with LINQ-to-SQL), or Scala's SLICK, or also Java's QueryDSL to better integrate querying as a concept into their respective language. By querying, they understand querying of arbitrary targets, such as SQL, XML, Collections and other heterogeneous data stores. jOOQ claims that this is going the wrong way too.
    -					</p>
    -					<p>
    - 						In more advanced querying use-cases (more than simple CRUD and the occasional JOIN), people will want to profit from the expressivity of SQL. Due to the relational nature of SQL, this is quite different from what object-oriented and partially functional languages such as C#, Scala, or Java can offer.
    - 					</p>
    - 					<p>
    - 						It is very hard to formally express and validate joins and the ad-hoc table expression types they create. It gets even harder when you want support for more advanced table expressions, such as pivot tables, unnested cursors, or just arbitrary projections from derived tables. With a very strong object-oriented typing model, these features will probably stay out of scope.
    - 					</p>
    - 					<p>
    - 						In essence, the decision of creating an API that looks like SQL or one that looks like C#, Scala, Java is a definite decision in favour of one or the other platform. While it will be easier to evolve SLICK in similar ways as LINQ (or QueryDSL in the Java world), SQL feature scope that clearly communicates its underlying intent will be very hard to add, later on (e.g. how would you model Oracle's partitioned outer join syntax? How would you model ANSI/ISO SQL:1999 grouping sets? How can you support scalar subquery caching? etc...).					
    -					</p>
    -					<p>
    -						jOOQ has come to fill this gap.
    -					</p>
    -					
    -					<h3>jOOQ's reason for being - compared to SQL / JDBC</h3>
    -					<p>
    -						So why not just use SQL?
    -					</p> 
    -					<p>
    -						SQL can be written as plain text and passed through the JDBC API. Over the years, people have become wary of this approach for many reasons:
    -					</p>
    -					<ul>
    -						<li>No typesafety</li>
    -						<li>No syntax safety</li>
    -						<li>No bind value index safety</li>
    -						<li>Verbose SQL String concatenation</li>
    -						<li>Boring bind value indexing techniques</li>
    -						<li>Verbose resource and exception handling in JDBC</li>
    -						<li>A very "stateful", not very object-oriented JDBC API, which is hard to use</li>
    -					</ul>
    -					<p>
    -						For these many reasons, other frameworks have tried to abstract JDBC away in the past in one way or another. Unfortunately, many have completely abstracted SQL away as well
    -					</p>
    -					<p>
    -						jOOQ has come to fill this gap.
    -					</p>					
    -					
    -					<h3>jOOQ is different</h3>
    -					<p>
    -						SQL was never meant to be abstracted. To be confined in the narrow boundaries of heavy mappers, hiding the beauty and simplicity of relational data. SQL was never meant to be object-oriented. SQL was never meant to be anything other than... SQL!
    -					</p>					
    -				</html></content>
    -			</section>
    -			
    -			<section id="copyright">
    -				<title>Copyright, License, and Trademarks</title>
    -				<content><html>
    -                    <p>
    -                        This section lists the various licenses that apply to different versions of jOOQ. Prior to version 3.2, jOOQ was shipped for free under the terms of the <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache Software License 2.0</a>. With jOOQ 3.2, jOOQ became dual-licensed: <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache Software License 2.0</a> (for use with Open Source databases) and <a href="http://www.jooq.org/licensing">commercial</a> (for use with commercial databases). Please contact <a href="mailto:sales@datageekery.com">sales@datageekery.com</a>, should you have any questions regarding licensing.
    -                    </p>
    -                    <h3>License for jOOQ 1.x, 2.x, 3.0, 3.1</h3>
    -                    
    -</html><text>Copyright (c) 2009-2013, Lukas Eder, lukas.eder@gmail.com
    -All rights reserved.
    -
    -This software is licensed to you under the Apache License, Version 2.0
    -(the "License"); You may obtain a copy of the License at
    -
    -  http://www.apache.org/licenses/LICENSE-2.0
    -
    -Redistribution and use in source and binary forms, with or without
    -modification, are permitted provided that the following conditions are met:
    -
    -. Redistributions of source code must retain the above copyright notice, this
    -  list of conditions and the following disclaimer.
    -
    -. Redistributions in binary form must reproduce the above copyright notice,
    -  this list of conditions and the following disclaimer in the documentation
    -  and/or other materials provided with the distribution.
    -
    -. Neither the name "jOOQ" nor the names of its contributors may be
    -  used to endorse or promote products derived from this software without
    -  specific prior written permission.
    -
    -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
    -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
    -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
    -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
    -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
    -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
    -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
    -POSSIBILITY OF SUCH DAMAGE.</text><html>
    -
    -                    <h3>License for jOOQ 3.2 and later</h3>
    -                    
    -</html><text>Copyright (c) 2009-2013, Data Geekery GmbH (http://www.datageekery.com)
    -All rights reserved.
    -
    -This work is dual-licensed
    -- under the Apache Software License 2.0 (the "ASL")
    -- under the jOOQ License and Maintenance Agreement (the "jOOQ License")
    -=============================================================================
    -You may choose which license applies to you:
    -
    -- If you're using this work with Open Source databases, you may choose
    -  either ASL or jOOQ License.
    -- If you're using this work with at least one commercial database, you must
    -  choose jOOQ License
    -
    -For more information, please visit http://www.jooq.org/licenses
    -
    -Apache Software License 2.0:
    ------------------------------------------------------------------------------
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    - http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -
    -jOOQ License and Maintenance Agreement:
    ------------------------------------------------------------------------------
    -Data Geekery grants the Customer the non-exclusive, timely limited and
    -non-transferable license to install and use the Software under the terms of
    -the jOOQ License and Maintenance Agreement.
    -
    -This library is distributed with a LIMITED WARRANTY. See the jOOQ License
    -and Maintenance Agreement for more details: http://www.jooq.org/licensing</text><html>
    -
    -                    <h3>Trademarks owned by Data Geekeryâ„¢ GmbH</h3>
    -                    <ul>
    -                        <li>jOOQâ„¢ is a trademark by Data Geekeryâ„¢ GmbH</li>
    -                        <li>jOOXâ„¢ is a trademark by Data Geekeryâ„¢ GmbH</li>
    -                        <li>jOORâ„¢ is a trademark by Data Geekeryâ„¢ GmbH</li>
    -                        <li>jOOUâ„¢ is a trademark by Data Geekeryâ„¢ GmbH</li>
    -                    </ul>
    -                    
    -                    <h3>Trademarks owned by database vendors with no affiliation to Data Geekeryâ„¢ GmbH</h3>
    -                    <ul>
    -                        <li>Access® is a registered trademark of Microsoft® Inc.</li>
    -                        <li>Adaptive Server® Enterprise is a registered trademark of Sybase®, Inc.</li>
    -                        <li>CUBRID™ is a trademark of NHN® Corp.</li>
    -                        <li>DB2® is a registered trademark of IBM® Corp.</li>
    -                        <li>Derby is a trademark of the Apacheâ„¢ Software Foundation</li>
    -                        <li>H2 is a trademark of the H2 Group</li>
    -                        <li>HSQLDB is a trademark of The hsql Development Group</li>
    -                        <li>Ingres is a trademark of Actianâ„¢ Corp.</li>
    -                        <li>MariaDB is a trademark of Monty Program Ab</li>
    -                        <li>MySQL® is a registered trademark of Oracle® Corp.</li>
    -                        <li>Firebird® is a registered trademark of Firebird Foundation Inc.</li>
    -                        <li>Oracle® database is a registered trademark of Oracle® Corp.</li>
    -                        <li>PostgreSQL® is a registered trademark of The PostgreSQL Global Development Group</li>
    -                        <li>Postgres Plus® is a registered trademark of EnterpriseDB® software</li>
    -                        <li>SQL Anywhere® is a registered trademark of Sybase®, Inc.</li>
    -                        <li>SQL Server® is a registered trademark of Microsoft® Inc.</li>
    -                        <li>SQLite is a trademark of Hipp, Wyrick &amp; Company, Inc.</li>
    -                    </ul>
    -                    
    -                    <h3>Other trademarks by vendors with no affiliation to Data Geekeryâ„¢ GmbH</h3>
    -                    <ul>
    -                        <li>Java® is a registered trademark by Oracle® Corp. and/or its affiliates</li>
    -                        <li>Scala is a trademark of EPFL</li>
    -                    </ul>
    -                    
    -                    <h3>Other trademark remarks</h3>
    -                    <p>
    -                        Other names may be trademarks of their respective owners.
    -                    </p>
    -                    
    -                    <p>
    -                        Throughout the manual, the above trademarks are referenced without a formal ® (R) or ™ (TM) symbol. It is believed that referencing third-party trademarks in this manual or on the jOOQ website constitutes "fair use". Please <a href="mailto:contact@datageekery.com">contact us</a> if you think that your trademark(s) are not properly attributed.
    -                    </p>
    -				</html></content>
    -			</section>
    -			
    -			<section id="getting-started">
    -				<title>Getting started with jOOQ</title>
    -				<content><html>
    -					<p>
    -						These chapters contain a quick overview of how to get started with this manual and with jOOQ. While the subsequent chapters contain a lot of reference information, this chapter here just wraps up the essentials.
    -					</p>
    -				</html></content>
    -
    -				<sections>
    -					<section id="the-manual">
    -					    <title>How to read this manual</title>
    -						<content><html>
    -							<p>
    -								This section helps you correctly interpret this manual in the context of jOOQ.
    -							</p>
    -							
    -							<h3>Code blocks</h3>
    -							<p>
    -								The following are code blocks:
    -							</p>
    -							
    -</html><sql><![CDATA[-- A SQL code block
    -SELECT 1 FROM DUAL]]></sql><java><![CDATA[// A Java code block
    -for (int i = 0; i < 10; i++);]]></java><xml><![CDATA[<!-- An XML code block -->
    -<hello what="world"></hello>]]></xml><config><![CDATA[# A config file code block
    -org.jooq.property=value]]></config><html>		
    -
    -							<p>
    -								These are useful to provide examples in code. Often, with jOOQ, it is even more useful to compare SQL code with its corresponding Java/jOOQ code. When this is done, the blocks are aligned side-by-side, with SQL usually being on the left, and Java usually being on the right:
    -							</p>					
    -							
    -</html><code-pair>
    -<sql><![CDATA[-- In SQL:
    -SELECT 1 FROM DUAL]]></sql><java><![CDATA[// Using jOOQ:
    -create.selectOne()]]></java>
    -</code-pair><html>
    -
    -							<h3>Code block contents</h3>
    -							<p>
    -								The contents of code blocks follow conventions, too. If nothing else is mentioned next to any given code block, then the following can be assumed:
    -							</p>
    -							
    -							
    -</html><sql><![CDATA[-- SQL assumptions
    -------------------
    -
    --- If nothing else is specified, assume that the Oracle syntax is used 
    -SELECT 1 FROM DUAL]]></sql><java><![CDATA[// Java assumptions
    -// ----------------
    - 
    -// Whenever you see "standalone functions", assume they were static imported from org.jooq.impl.DSL 
    -exists(); max(); min(); val(); inline(); // correspond to DSL.exists(); DSL.max(); DSL.min(); etc...
    -
    -// Whenever you see BOOK/Book, AUTHOR/Author and similar entities, assume they were (static) imported from the generated schema
    -BOOK.TITLE, AUTHOR.LAST_NAME // correspond to com.example.generated.Tables.BOOK.TITLE, com.example.generated.Tables.BOOK.TITLE
    -
    -// Whenever you see "create" being used in Java code, assume that this is an instance of org.jooq.DSLContext.
    -// The reason why it is called "create" is the fact, that a jOOQ QueryPart is being created from the DSL object:
    -DSLContext create = DSL.using(connection, SQLDialect.ORACLE);]]></java><html>
    -
    -                            <p>
    -                                Your naming may differ, of course. For instance, you could name the "create" instance "db", instead.
    -                            </p>
    -
    -							<h3>Degree (arity)</h3>
    -							<p>
    -							    jOOQ records (and many other API elements) have a degree N between 1 and {max-row-degree}. The variable degree of an API element is denoted as [N], e.g. Row[N] or Record[N]. The term "degree" is preferred over arity, as "degree" is the term used in the SQL standard, whereas "arity" is used more often in mathematics and relational theory.
    -							</p>
    -
    -							<h3>Settings</h3>
    -							<p>
    -								jOOQ allows to override runtime behaviour using <reference class="org.jooq.conf.Settings"/>. If nothing is specified, the default runtime settings are assumed.
    -							</p>
    -							
    -							<h3>Sample database</h3>
    -							<p>
    -								jOOQ query examples run against the sample database. See the manual's section about <reference id="sample-database" title="the sample database used in this manual"/> to learn more about the sample database.
    -							</p>
    -						</html></content>
    -					</section>
    -
    -					<section id="sample-database">
    -					    <title>The sample database used in this manual</title>
    -						<content><html>
    -							<p>
    -							For the examples in this manual, the same database will always be referred to. It essentially consists of these entities created using the Oracle dialect
    -							</p>
    -</html><sql>CREATE TABLE language (
    -  id              NUMBER(7)     NOT NULL PRIMARY KEY,
    -  cd              CHAR(2)       NOT NULL,
    -  description     VARCHAR2(50)
    -)
    -
    -CREATE TABLE author (
    -  id              NUMBER(7)     NOT NULL PRIMARY KEY,
    -  first_name      VARCHAR2(50),
    -  last_name       VARCHAR2(50)  NOT NULL,
    -  date_of_birth   DATE,
    -  year_of_birth   NUMBER(7),
    -  distinguished   NUMBER(1)
    -)
    -
    -CREATE TABLE book (
    -  id              NUMBER(7)     NOT NULL PRIMARY KEY,
    -  author_id       NUMBER(7)     NOT NULL,
    -  title           VARCHAR2(400) NOT NULL,
    -  published_in    NUMBER(7)     NOT NULL,
    -  language_id     NUMBER(7)     NOT NULL,
    -  
    -  CONSTRAINT fk_book_author     FOREIGN KEY (author_id)   REFERENCES author(id),
    -  CONSTRAINT fk_book_language   FOREIGN KEY (language_id) REFERENCES language(id)
    -)
    -
    -CREATE TABLE book_store (
    -  name            VARCHAR2(400) NOT NULL UNIQUE
    -)
    -
    -CREATE TABLE book_to_book_store (
    -  name            VARCHAR2(400) NOT NULL,
    -  book_id         INTEGER       NOT NULL,
    -  stock           INTEGER,
    -  
    -  PRIMARY KEY(name, book_id),
    -  CONSTRAINT fk_b2bs_book_store FOREIGN KEY (name)        REFERENCES book_store (name) ON DELETE CASCADE,
    -  CONSTRAINT fk_b2bs_book       FOREIGN KEY (book_id)     REFERENCES book (id)         ON DELETE CASCADE
    -)</sql><html>
    -							<p>
    -								More entities, types (e.g. UDT's, ARRAY types, ENUM types, etc), stored procedures and packages are introduced for specific examples
    -							</p>
    -						</html></content>
    -					</section>
    -
    -					<section id="use-cases">
    -						<title>Different use cases for jOOQ</title>
    -						<content><html>
    -							<p>
    -								jOOQ has originally been created as a library for complete abstraction of JDBC and all database interaction. Various best practices that are frequently encountered in pre-existing software products are applied to this library. This includes:
    -							</p>
    -							<ul>
    -								<li>Typesafe database object referencing through generated schema, table, column, record, procedure, type, dao, pojo artefacts (see the chapter about <reference id="code-generation" title="code generation"/>)</li>
    -								<li>Typesafe SQL construction through a complete API modelling SQL as a domain specific language in Java (see the chapter about <reference id="dsl-and-non-dsl" title="the DSL API"/>)</li>
    -								<li>Convenient query execution through an improved API for result fetching (see the chapters about <reference id="fetching" title="the various types of data fetching"/>)</li>
    -								<li>SQL dialect abstraction and SQL clause simulation to improve cross-database compatibility and to enable missing features in simpler databases (see the chapter about <reference id="sql-dialects" title="SQL dialects"/>)</li>
    -								<li>SQL logging and debugging using jOOQ as an integral part of your development process (see the chapters about <reference id="logging" title="logging"/> and about the <reference id="jooq-console" title="jOOQ Console"/>)</li>
    -							</ul>
    -							<p>
    -								Effectively, jOOQ was originally designed to replace any other database abstraction framework short of the ones handling connection pooling and transaction management (see also the <reference id="reference-credits" title="credits for other database abstraction libraries"/>)
    -							</p>
    -							
    -							<h3>Use jOOQ the way you prefer</h3>
    -							<p>
    -								... but open source is community-driven. And the community has shown various ways of using jOOQ that diverge from its original intent. Some use cases encountered are:
    -							</p>
    -							<ul>
    -								<li>Using Hibernate for 70% of the queries (i.e. <reference id="crud-with-updatablerecords" title="CRUD"/>) and jOOQ for the remaining 30% where SQL is really needed</li>
    -								<li>Using jOOQ for SQL building and JDBC for SQL execution</li> 
    -								<li>Using jOOQ for SQL building and Spring Data for SQL execution</li>
    -								<li>Using jOOQ without the <reference id="code-generation" title="source code generator"/> to build the basis of a framework for dynamic SQL execution.</li> 
    -							</ul>
    -							
    -							<p>
    -								The following sections explain about various use cases for using jOOQ in your application.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="jooq-as-a-standalone-sql-builder">
    -								<title>jOOQ as a SQL builder</title>
    -								<content><html>
    -									<p>
    -										This is the most simple of all use cases, allowing for construction of valid SQL for any database. In this use case, you will not use <reference id="jooq-as-a-sql-builder-with-code-generation" title="jOOQ's code generator"/> and probably not even <reference id="jooq-as-a-sql-executor" title="jOOQ's query execution facilities"/>. Instead, you'll use jOOQ to wrap strings, literals and other user-defined objects into an object-oriented, type-safe AST modelling your SQL statements. An example is given here: 
    -									</p>
    -									
    -</html><java><![CDATA[// Fetch a SQL string from a jOOQ Query in order to manually execute it with another tool.
    -String sql = create.select(fieldByName("BOOK","TITLE"), fieldByName("AUTHOR","FIRST_NAME"), fieldByName("AUTHOR","LAST_NAME"))
    -                   .from(tableByName("BOOK"))
    -                   .join(tableByName("AUTHOR"))
    -                   .on(fieldByName("BOOK", "AUTHOR_ID").equal("AUTHOR", "ID"))
    -                   .where(fieldByName("BOOK", "PUBLISHED_IN").equal(1948))
    -                   .getSQL();]]></java><html>
    -                   
    -                   					<p>
    -                   						The SQL string that you can generate as such can then be executed using JDBC directly, using Spring's JdbcTemplate, using Apache DbUtils and many other tools.
    -                   					</p>
    -                   					<p>
    -                   						If you wish to use jOOQ only as a SQL builder, the following sections of the manual will be of interest to you:
    -                  					</p>
    -                  					<ul>
    -                  						<li><reference id="sql-building" title="SQL building"/>: This section contains a lot of information about creating SQL statements using the jOOQ API</li>
    -                  						<li><reference id="plain-sql" title="Plain SQL"/>: This section contains information useful in particular to those that want to supply <reference id="table-expressions" title="table expressions"/>, <reference id="column-expressions" title="column expressions"/>, etc. as plain SQL to jOOQ, rather than through generated artefacts</li>
    -                  					</ul>
    -								</html></content>
    -							</section>
    -
    -							<section id="jooq-as-a-sql-builder-with-code-generation">
    -								<title>jOOQ as a SQL builder with code generation</title>
    -								<content><html>
    -									<p>
    -										In addition to using jOOQ as a <reference id="jooq-as-a-standalone-sql-builder" title="standalone SQL builder"/>, you can also use jOOQ's code generation features in order to compile your SQL statements using a Java compiler against an actual database schema. This adds a lot of power and expressiveness to just simply constructing SQL using custom strings and literals, as you can be sure that all database artefacts actually exist in the database, and that their type is correct. An example is given here: 
    -									</p>
    -
    -</html><java><![CDATA[// Fetch a SQL string from a jOOQ Query in order to manually execute it with another tool.
    -String sql = create.select(BOOK.TITLE, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -                   .from(BOOK)
    -                   .join(AUTHOR)
    -                   .on(BOOK.AUTHOR_ID.equal(AUTHOR.ID))
    -                   .where(BOOK.PUBLISHED_IN.equal(1948))
    -                   .getSQL();]]></java><html>
    -                   
    -                   					<p>
    -                   						The SQL string that you can generate as such can then be executed using JDBC directly, using Spring's JdbcTemplate, using Apache DbUtils and many other tools.
    -                   					</p>
    -                   					<p>
    -                   						If you wish to use jOOQ only as a SQL builder with code generation, the following sections of the manual will be of interest to you:
    -                  					</p>
    -                  					<ul>
    -                  						<li><reference id="sql-building" title="SQL building"/>: This section contains a lot of information about creating SQL statements using the jOOQ API</li>
    -                  						<li><reference id="code-generation" title="Code generation"/>: This section contains the necessary information to run jOOQ's code generator against your developer database</li>
    -                  					</ul>
    -								</html></content>
    -							</section>
    -
    -							<section id="jooq-as-a-sql-executor">
    -								<title>jOOQ as a SQL executor</title>
    -								<content><html>
    -									<p>
    -										Instead of any tool mentioned in the previous chapters, you can also use jOOQ directly to execute your jOOQ-generated SQL statements. This will add a lot of convenience on top of the previously discussed API for typesafe SQL construction, when you can re-use the information from generated classes to fetch records and custom data types. An example is given here:
    -									</p>
    -									
    -</html><java><![CDATA[// Typesafely execute the SQL statement directly with jOOQ
    -Result<Record3<String, String, String>> result = 
    -create.select(BOOK.TITLE, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -      .from(BOOK)
    -      .join(AUTHOR)
    -      .on(BOOK.AUTHOR_ID.equal(AUTHOR.ID))
    -      .where(BOOK.PUBLISHED_IN.equal(1948))
    -      .fetch();]]></java><html>
    -
    -									<p>
    -										jOOQ doesn't stop here, though! You can execute any SQL with jOOQ. In other words, you can use any other SQL building tool and run the SQL statements with jOOQ. An example is given here:
    -									</p>
    -
    -</html><java><![CDATA[// Use your favourite tool to construct SQL strings:
    -String sql = "SELECT title, first_name, last_name FROM book JOIN author ON book.author_id = author.id " +
    -             "WHERE book.published_in = 1984";
    -
    -// Fetch results using jOOQ
    -Result<Record> result = create.fetch(sql);
    -
    -// Or execute that SQL with JDBC, fetching the ResultSet with jOOQ:
    -ResultSet rs = connection.createStatement().executeQuery(sql);
    -Result<Record> result = create.fetch(rs);]]></java><html>
    -
    -									<p>
    -                   						If you wish to use jOOQ as a SQL executor with (or without) code generation, the following sections of the manual will be of interest to you:
    -                  					</p>
    -                  					<ul>
    -                  						<li><reference id="sql-building" title="SQL building"/>: This section contains a lot of information about creating SQL statements using the jOOQ API</li>
    -                  						<li><reference id="code-generation" title="Code generation"/>: This section contains the necessary information to run jOOQ's code generator against your developer database</li>
    -                  						<li><reference id="sql-execution" title="SQL execution"/>: This section contains a lot of information about executing SQL statements using the jOOQ API</li>
    -                  						<li><reference id="fetching"/>: This section contains some useful information about the various ways of fetching data with jOOQ</li>
    -                  					</ul>
    -								</html></content>
    -							</section>
    -
    -							<section id="jooq-for-crud">
    -								<title>jOOQ for CRUD</title>
    -								<content><html>
    -									<p>
    -										This is probably the most complete use-case for jOOQ: Use all of jOOQ's features. Apart from jOOQ's fluent API for query construction, jOOQ can also help you execute everyday CRUD operations. An example is given here:
    -									</p>
    -
    -</html><java><![CDATA[// Fetch all authors
    -for (AuthorRecord author : create.fetch(AUTHOR)) {
    -
    -    // Skip previously distinguished authors  
    -    if ((int) author.getDistinguished() == 1)
    -        continue;
    -  
    -    // Check if the author has written more than 5 books
    -    if (author.fetchChildren(FK_BOOK_AUTHOR).size() > 5) {
    -    
    -        // Mark the author as a "distinguished" author
    -        author.setDistinguished(1);
    -        author.store();
    -    }
    -}]]></java><html>
    -
    -									<p>
    -                   						If you wish to use all of jOOQ's features, the following sections of the manual will be of interest to you (including all sub-sections):
    -                  					</p>
    -                  					<ul>
    -                  						<li><reference id="sql-building" title="SQL building"/>: This section contains a lot of information about creating SQL statements using the jOOQ API</li>
    -                  						<li><reference id="code-generation" title="Code generation"/>: This section contains the necessary information to run jOOQ's code generator against your developer database</li>
    -                  						<li><reference id="sql-execution" title="SQL execution"/>: This section contains a lot of information about executing SQL statements using the jOOQ API</li>
    -                  					</ul>
    -								</html></content>
    -							</section>
    -							
    -							<section id="jooq-for-pros">
    -								<title>jOOQ for PROs</title>
    -								<content><html>
    -									<p>
    -										jOOQ isn't just a library that helps you <reference id="sql-building" title="build"/> and <reference id="sql-execution" title="execute"/> SQL against your <reference id="code-generation" title="generated, compilable schema"/>. jOOQ ships with a lot of tools. Here are some of the most important tools shipped with jOOQ:
    -									</p>
    -									<ul>
    -										<li><reference id="jooq-console" title="jOOQ Console"/>: This small application hooks into jOOQ's execute listener support to allow for tracing, debugging and introspecting any SQL statement executed through the jOOQ API. This includes setting breakpoints, introspecting bind values, running probe SQL statements, ad-hoc patching of SQL, measuring execution times, exporting stack traces. Use this tool to better know your SQL!</li>
    -										<li><reference id="execute-listeners" title="jOOQ's Execute Listeners"/>: jOOQ allows you to hook your custom execute listeners into jOOQ's SQL statement execution lifecycle in order to centrally coordinate any arbitrary operation performed on SQL being executed. Use this for logging, identity generation, SQL tracing, performance measurements, etc.</li>
    -										<li><reference id="logging" title="Logging"/>: jOOQ has a standard DEBUG logger built-in, for logging and tracing all your executed SQL statements and fetched result sets</li>
    -										<li><reference id="stored-procedures" title="Stored Procedures"/>: jOOQ supports stored procedures and functions of your favourite database. All routines and user-defined types are generated and can be included in jOOQ's SQL building API as function references.</li>
    -										<li><reference id="batch-execution" title="Batch execution"/>: Batch execution is important when executing a big load of SQL statements. jOOQ simplifies these operations compared to JDBC</li>
    -										<li><reference id="exporting" title="Exporting"/> and <reference id="importing" title="Importing"/>: jOOQ ships with an API to easily export/import data in various formats</li>
    -									</ul>
    -									<p>
    -										If you're a power user of your favourite, feature-rich database, jOOQ will help you access all of your database's vendor-specific features, such as OLAP features, stored procedures, user-defined types, vendor-specific SQL, functions, etc. Examples are given throughout this manual.
    -									</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -					<section id="tutorials">
    -						<title>Tutorials</title>
    -						<content><html>
    -							<p>
    -								Don't have time to read the full manual? Here are a couple of tutorials that will get you into the most essential parts of jOOQ as quick as possible.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="jooq-in-7-steps">
    -								<title>jOOQ in 7 easy steps</title>
    -								<content><html>
    -									<p>
    -										This manual section is intended for new users, to help them get a running application with jOOQ, quickly.
    -									</p>
    -								</html></content>
    -								
    -								<sections>
    -									<section id="jooq-in-7-steps-step1">
    -										<title>Step 1: Preparation</title>
    -										<content><html>
    -											<p>
    -												If you haven't already downloaded it, download jOOQ:<br/>
    -												<a href="https://sourceforge.net/projects/jooq/files/Release/" title="jOOQ download">https://sourceforge.net/projects/jooq/files/Release/</a>
    -											</p>
    -											
    -											<p>
    -												Alternatively, you can create a Maven dependency to download jOOQ artefacts:
    -											</p>
    -</html><xml><![CDATA[<dependency>
    -  <groupId>org.jooq</groupId>
    -  <artifactId>jooq</artifactId>
    -  <version>{jooq-version}</version>
    -</dependency>
    -<dependency>
    -  <groupId>org.jooq</groupId>
    -  <artifactId>jooq-meta</artifactId>
    -  <version>{jooq-version}</version>
    -</dependency>
    -<dependency>
    -  <groupId>org.jooq</groupId>
    -  <artifactId>jooq-codegen</artifactId>
    -  <version>{jooq-version}</version>
    -</dependency>]]></xml><html>
    -
    -											<p>
    -												Please refer to the manual's section about <reference id="codegen-configuration" title="Code generation configuration"/> to learn how to use jOOQ's code generator with Maven.
    -											</p>
    -
    -											<p>
    -												For this example, we'll be using MySQL. If you haven't already downloaded MySQL Connector/J, download it here:<br/>
    -												<a href="http://dev.mysql.com/downloads/connector/j/" target="_blank" title="MySQL JDBC driver">http://dev.mysql.com/downloads/connector/j/</a>
    -											</p>
    -
    -											<p>
    -												If you don't have a MySQL instance up and running yet, get <a href="http://www.apachefriends.org/en/xampp.html" title="XAMPP">XAMPP</a> now! XAMPP is a simple installation bundle for Apache, MySQL, PHP and Perl
    -											</p>
    -										</html></content>
    -									</section>
    -									
    -									<section id="jooq-in-7-steps-step2">
    -										<title>Step 2: Your database</title>
    -										<content><html>
    -											<p>
    -												We're going to create a database called "guestbook" and a corresponding "posts" table. Connect to MySQL via your command line client and type the following:
    -											</p>
    -											
    -</html><sql>CREATE DATABASE guestbook;
    -
    -CREATE TABLE `posts` (
    -  `id` bigint(20) NOT NULL,
    -  `body` varchar(255) DEFAULT NULL,
    -  `timestamp` datetime DEFAULT NULL,
    -  `title` varchar(255) DEFAULT NULL,
    -  PRIMARY KEY (`id`)
    -);
    -</sql></content>
    -									</section>
    -									
    -									<section id="jooq-in-7-steps-step3">
    -										<title>Step 3: Code generation</title>
    -										<content><html>
    -											<p>
    -												In this step, we're going to use jOOQ's command line tools to generate classes that map to the Posts table we just created. More detailed information about how to set up the jOOQ code generator can be found here:<br/>
    -												<reference id="code-generation" title="jOOQ manual pages about setting up the code generator"/>
    -											</p>
    -
    -											<p>
    -												The easiest way to generate a schema is to copy the jOOQ jar files (there should be 3) and the MySQL Connector jar file to a temporary directory. Then, create a guestbook.xml that looks like this:
    -											</p>
    -											
    -</html><xml><![CDATA[<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    -<configuration xmlns="http://www.jooq.org/xsd/jooq-codegen-{codegen-xsd-version}.xsd">
    -  <!-- Configure the database connection here -->
    -  <jdbc>
    -    <driver>com.mysql.jdbc.Driver</driver>
    -    <url>jdbc:mysql://localhost:3306/guestbook</url>
    -    <user>root</user>
    -    <password></password>
    -  </jdbc>
    -
    -  <generator>
    -    <!-- The default code generator. You can override this one, to generate your own code style
    -         Defaults to org.jooq.util.DefaultGenerator -->
    -    <name>org.jooq.util.DefaultGenerator</name>
    -
    -    <database>
    -      <!-- The database type. The format here is:
    -           org.util.[database].[database]Database -->
    -      <name>org.jooq.util.mysql.MySQLDatabase</name>
    -
    -      <!-- The database schema (or in the absence of schema support, in your RDBMS this
    -           can be the owner, user, database name) to be generated -->
    -      <inputSchema>guestbook</inputSchema>
    -
    -      <!-- All elements that are generated from your schema 
    -           (A Java regular expression. Use the pipe to separate several expressions)
    -           Watch out for case-sensitivity. Depending on your database, this might be important! -->
    -      <includes>.*</includes>
    -
    -      <!-- All elements that are excluded from your schema 
    -           (A Java regular expression. Use the pipe to separate several expressions).
    -           Excludes match before includes -->
    -      <excludes></excludes>
    -    </database>
    -
    -    <target>
    -      <!-- The destination package of your generated classes (within the destination directory) -->
    -      <packageName>test.generated</packageName>
    -
    -      <!-- The destination directory of your generated classes -->
    -      <directory>C:/workspace/MySQLTest/src</directory>
    -    </target>
    -  </generator>
    -</configuration>]]></xml><html>
    -											<p>
    -												Replace the username with whatever user has the appropriate privileges to query the database meta data. You'll also want to look at the other values and replace as necessary. Here are the two interesting properties:
    -											</p>
    -											<p>
    -												<code>generator.target.package</code> - set this to the parent package you want to create for the generated classes. The setting of <code>test.generated</code> will cause the <code>test.generated.Posts</code> and <code>test.generated.PostsRecord</code> to be created
    -											</p>
    -											<p>
    -												<code>generator.target.directory</code> - the directory to output to.
    -											</p>
    -											
    -											<p>
    -												Once you have the JAR files and guestbook.xml in your temp directory, type this (use colons instead of semi-colons on UNIX/Linux systems):
    -											</p>
    -
    -</html><text>java -classpath jooq-{jooq-version}.jar;jooq-meta-{jooq-version}.jar;jooq-codegen-{jooq-version}.jar;mysql-connector-java-5.1.18-bin.jar;. 
    -  org.jooq.util.GenerationTool /guestbook.xml
    -</text><html>
    -
    -											<p>
    -												Note the prefix slash before guestbook.xml. Even though it's in our working directory, we need to prepend a slash, as the configuration file is loaded from the classpath. Replace the filenames with your filenames. In this example, jOOQ {jooq-version} is being used. If everything has worked, you should see this in your console output:
    -											</p>
    -
    -</html><text>Nov 1, 2011 7:25:06 PM org.jooq.impl.JooqLogger info
    -INFO: Initialising properties  : /guestbook.xml
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Database parameters
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: ----------------------------------------------------------
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO:   dialect                : MYSQL
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO:   schema                 : guestbook
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO:   target dir             : C:/workspace/MySQLTest/src
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO:   target package         : test.generated
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: ----------------------------------------------------------
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Emptying                 : C:/workspace/MySQLTest/src/test/generated
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Generating classes in    : C:/workspace/MySQLTest/src/test/generated
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Generating schema        : Guestbook.java
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Schema generated         : Total: 122.18ms
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Sequences fetched        : 0 (0 included, 0 excluded)
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Tables fetched           : 5 (5 included, 0 excluded)
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Generating tables        : C:/workspace/MySQLTest/src/test/generated/tables
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: ARRAYs fetched           : 0 (0 included, 0 excluded)
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Enums fetched            : 0 (0 included, 0 excluded)
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: UDTs fetched             : 0 (0 included, 0 excluded)
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Generating table         : Posts.java
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Tables generated         : Total: 680.464ms, +558.284ms
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Generating Keys          : C:/workspace/MySQLTest/src/test/generated/tables
    -Nov 1, 2011 7:25:08 PM org.jooq.impl.JooqLogger info
    -INFO: Keys generated           : Total: 718.621ms, +38.157ms
    -Nov 1, 2011 7:25:08 PM org.jooq.impl.JooqLogger info
    -INFO: Generating records       : C:/workspace/MySQLTest/src/test/generated/tables/records
    -Nov 1, 2011 7:25:08 PM org.jooq.impl.JooqLogger info
    -INFO: Generating record        : PostsRecord.java
    -Nov 1, 2011 7:25:08 PM org.jooq.impl.JooqLogger info
    -INFO: Table records generated  : Total: 782.545ms, +63.924ms
    -Nov 1, 2011 7:25:08 PM org.jooq.impl.JooqLogger info
    -INFO: Routines fetched         : 0 (0 included, 0 excluded)
    -Nov 1, 2011 7:25:08 PM org.jooq.impl.JooqLogger info
    -INFO: Packages fetched         : 0 (0 included, 0 excluded)
    -Nov 1, 2011 7:25:08 PM org.jooq.impl.JooqLogger info
    -INFO: GENERATION FINISHED!     : Total: 791.688ms, +9.143ms
    -</text></content>
    -									</section>
    -									
    -									<section id="jooq-in-7-steps-step4">
    -										<title>Step 4: Connect to your database</title>
    -										<content><html>
    -											<p>
    -												Let's just write a vanilla main class in the project containing the generated classes:
    -											</p>
    -											
    -</html><java><![CDATA[// For convenience, always static import your generated tables and jOOQ functions to decrease verbosity:
    -import static test.generated.Tables.*;
    -import static org.jooq.impl.DSL.*;
    -
    -public class Main {
    -    public static void main(String[] args) {
    -        Connection conn = null;
    -
    -        String userName = "root";
    -        String password = "";
    -        String url = "jdbc:mysql://localhost:3306/guestbook";
    -
    -        try {
    -            Class.forName("com.mysql.jdbc.Driver").newInstance();
    -            conn = DriverManager.getConnection(url, userName, password);
    -        } catch (Exception e) {
    -            // For the sake of this tutorial, let's keep exception handling simple
    -            e.printStackTrace();
    -        } finally {
    -            if (conn != null) {
    -                try {
    -                    conn.close();
    -                } catch (SQLException ignore) {
    -                }
    -            }
    -        }
    -    }
    -}]]></java><html>
    -
    -											<p>
    -												This is pretty standard code for establishing a MySQL connection.
    -											</p>
    -										</html></content>
    -									</section>
    -									
    -									<section id="jooq-in-7-steps-step5">
    -										<title>Step 5: Querying</title>
    -										<content><html>
    -											<p>
    -												Let's add a simple query:
    -											</p>
    -											
    -</html><java><![CDATA[DSLContext create = DSL.using(conn, SQLDialect.MYSQL);
    -Result<Record> result = create.select().from(POSTS).fetch();]]></java><html>
    -
    -											<p>
    -												First get an instance of <code>DSLContext</code> so we can write a simple <code>SELECT</code> query. We pass an instance of the MySQL connection to <code>DSL</code>. Note that the DSLContext doesn't close the connection. We'll have to do that ourselves.
    -											</p>
    -											<p>
    -												We then use jOOQ's DSL to return an instance of Result. We'll be using this result in the next step.
    -											</p>
    -										</html></content>
    -									</section>
    -									
    -									<section id="jooq-in-7-steps-step6">
    -										<title>Step 6: Iterating</title>
    -										<content><html>
    -											<p>
    -												After the line where we retrieve the results, let's iterate over the results and print out the data:
    -											</p>
    -
    -</html><java><![CDATA[for (Record r : result) {
    -    Long id = r.getValue(POSTS.ID);
    -    String title = r.getValue(POSTS.TITLE);
    -    String description = r.getValue(POSTS.BODY);
    -
    -    System.out.println("ID: " + id + " title: " + title + " desciption: " + description);
    -}]]></java><html>
    -
    -											<p>
    -												The full program should now look like this:
    -											</p>
    -											
    -</html><java><![CDATA[package test;
    -
    -// For convenience, always static import your generated tables and
    -// jOOQ functions to decrease verbosity:
    -import static test.generated.Tables.*;
    -import static org.jooq.impl.DSL.*;
    -
    -import java.sql.*;
    -
    -import org.jooq.*;
    -import org.jooq.impl.*;
    -
    -public class Main {
    -
    -    /**
    -     * @param args
    -     */
    -    public static void main(String[] args) {
    -        Connection conn = null;
    -
    -        String userName = "root";
    -        String password = "";
    -        String url = "jdbc:mysql://localhost:3306/guestbook";
    -
    -        try {
    -            Class.forName("com.mysql.jdbc.Driver").newInstance();
    -            conn = DriverManager.getConnection(url, userName, password);
    -
    -            DSLContext create = DSL.using(conn, SQLDialect.MYSQL);
    -            Result<Record> result = create.select().from(POSTS).fetch();
    -
    -            for (Record r : result) {
    -                Long id = r.getValue(POSTS.ID);
    -                String title = r.getValue(POSTS.TITLE);
    -                String description = r.getValue(POSTS.BODY);
    -
    -                System.out.println("ID: " + id + " title: " + title + " desciption: " + description);
    -            }
    -        } catch (Exception e) {
    -            // For the sake of this tutorial, let's keep exception handling simple
    -            e.printStackTrace();
    -        } finally {
    -            if (conn != null) {
    -                try {
    -                    conn.close();
    -                } catch (SQLException ignore) {
    -                }
    -            }
    -        }
    -    }
    -}]]></java></content>
    -									</section>
    -									
    -									<section id="jooq-in-7-steps-step7">
    -										<title>Step 7: Explore!</title>
    -										<content><html>
    -											<p>
    -												jOOQ has grown to be a comprehensive SQL library. For more information, please consider the documentation:<br/>
    -												<a href="http://www.jooq.org/learn.php" title="jOOQ Manual">http://www.jooq.org/learn.php</a>
    -											</p>
    -											<p>
    -												... explore the Javadoc:<br/>
    -												<a href="http://www.jooq.org/javadoc/latest/" title="jOOQ Javadoc">http://www.jooq.org/javadoc/latest/</a>
    -											</p>
    -											<p>
    -												... or join the news group:<br/>
    -												<a href="https://groups.google.com/forum/#!forum/jooq-user" title="jOOQ news group">https://groups.google.com/forum/#!forum/jooq-user</a>
    -											</p>
    -											<p>
    -											    This tutorial is the courtesy of Ikai Lan. See the original source here:<br/>
    -											    <a href="http://ikaisays.com/2011/11/01/getting-started-with-jooq-a-tutorial/" target="_blank" title="Ikai Lan's jOOQ tutorial">http://ikaisays.com/2011/11/01/getting-started-with-jooq-a-tutorial/</a>
    -											</p>
    -										</html></content>
    -									</section>
    -								</sections>
    -							</section>
    -
    -							<section id="jooq-in-modern-ides">
    -								<title>Using jOOQ in modern IDEs</title>
    -								<content><html>
    -									<p>Feel free to contribute a tutorial!</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="jooq-with-spring">
    -								<title>Using jOOQ with Spring</title>
    -								<content><html>
    -									<p>Feel free to contribute a tutorial!</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="a-simple-web-application">
    -								<title>A simple web application with jOOQ</title>
    -								<content><html>
    -									<p>Feel free to contribute a tutorial!</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -					
    -					<section id="jooq-and-scala">
    -						<title>jOOQ and Scala</title>
    -						<content><html>
    -							<p>
    -								As any other library, jOOQ can be easily used in Scala, taking advantage of the many Scala language features such as for example:
    -							</p>
    -							<ul>
    -								<li>Optional "." to dereference methods from expressions</li>
    -								<li>Optional "(" and ")" to delimit method argument lists</li>
    -								<li>Optioanl ";" at the end of a Scala statement</li>
    -								<li>Type inference using "var" and "val" keywords</li>
    -							</ul>
    -						
    -							<p>
    -								But jOOQ also leverages other useful Scala features, such as
    -							</p>
    -							<ul>
    -								<li>implicit defs for operator overloading</li>
    -								<li>Scala Macros (soon to come)</li>
    -							</ul>
    -							
    -							<p>
    -								A short example jOOQ application in Scala might look like this:
    -							</p>
    -							
    -</html><scala><![CDATA[
    -import collection.JavaConversions._                                  // Import implicit defs for iteration over org.jooq.Result
    -                                                                     //
    -import java.sql.DriverManager                                        //
    -                                                                     //
    -import org.jooq._                                                    //
    -import org.jooq.impl._                                               //
    -import org.jooq.impl.DSL._                                           //
    -import org.jooq.scala.example.h2.Tables._                            //
    -import org.jooq.scala.Conversions._                                  // Import implicit defs for overloaded jOOQ/SQL operators
    -                                                                     //
    -object Test {                                                        //
    -  def main(args: Array[String]): Unit = {                            //
    -    val c = DriverManager.getConnection("jdbc:h2:~/test", "sa", ""); // Standard JDBC connection
    -    val e = DSL.using(c, SQLDialect.H2);                             //
    -    val x = T_AUTHOR as "x"                                          // SQL-esque table aliasing
    -                                                                     //
    -    for (r <- e                                                      // Iteration over Result. "r" is an org.jooq.Record3
    -        select (                                                     //
    -          T_BOOK.ID * T_BOOK.AUTHOR_ID,                              // Using the overloaded "*" operator
    -          T_BOOK.ID + T_BOOK.AUTHOR_ID * 3 + 4,                      // Using the overloaded "+" operator
    -          T_BOOK.TITLE || " abc" || " xy"                            // Using the overloaded "||" operator
    -        )                                                            //
    -        from T_BOOK                                                  // No need to use parentheses or "." here
    -        leftOuterJoin (                                              //
    -          select (x.ID, x.YEAR_OF_BIRTH)                             // Dereference fields from aliased table
    -          from x                                                     //
    -          limit 1                                                    //
    -          asTable x.getName()                                        //
    -        )                                                            //
    -        on T_BOOK.AUTHOR_ID === x.ID                                 // Using the overloaded "===" operator
    -        where (T_BOOK.ID <> 2)                                       // Using the olerloaded "<>" operator
    -        or (T_BOOK.TITLE in ("O Alquimista", "Brida"))               // Neat IN predicate expression
    -        fetch                                                        //
    -    ) {                                                              //
    -      println(r)                                                     //
    -    }                                                                //
    -  }                                                                  //
    -}]]></scala><html>
    -
    -							<p>
    -								For more details about jOOQ's Scala integration, please refer to the manual's section about <reference id="scala-sql-building" title="SQL building with Scala"/>.
    -							</p>
    -						</html></content>
    -					</section>
    -					
    -					<section id="dependencies">
    -						<title>Dependencies</title>
    -						<content><html>
    -							<p>
    -								Dependencies are a big hassle in modern software. Many libraries depend on other, non-JDK library parts that come in different, incompatible versions, potentially causing trouble in your runtime environment. jOOQ has no external dependencies on any third-party libraries.
    -							</p>
    -							<p>
    -								However, the above rule has some exceptions:
    -							</p>
    -							<ul>
    -								<li><reference id="logging" title="logging APIs"/> are referenced as "optional dependencies". jOOQ tries to find <a href="http://www.slf4j.org/">slf4j</a> or <a href="http://logging.apache.org/log4j">log4j</a> on the classpath. If it fails, it will use the <reference class="java.util.logging.Logger"/></li>
    -								<li>Oracle ojdbc types used for array creation are loaded using reflection. The same applies to Postgres PG* types.</li>
    -								<li>Small libraries with compatible licenses are incorporated into jOOQ. These include <a href="https://github.com/jOOQ/jOOR">jOOR</a>, <a href="https://github.com/jOOQ/jOOU">jOOU</a>, parts of <a href="http://opencsv.sourceforge.net/">OpenCSV</a>, <a href="http://code.google.com/p/json-simple/">json simple</a>, parts of <a href="http://commons.apache.org/lang/">commons-lang</a></li>
    -								<li><a href="http://docs.oracle.com/javaee/6/api/javax/persistence/package-summary.html">javax.persistence</a> and <a href="http://docs.oracle.com/javaee/6/api/javax/validation/package-summary.html">javax.validation</a> will be needed if you activate the relevant <reference id="code-generation" title="code generation flags"/></li>
    -							</ul>
    -						</html></content>
    -					</section>
    -					
    -					<section id="build-your-own">
    -						<title>Build your own</title>
    -						<content><html>
    -							<p>
    -								In order to build jOOQ yourself, please download the sources from <a href="https://github.com/jOOQ/jOOQ">https://github.com/jOOQ/jOOQ</a> and use Maven to build jOOQ, preferably in Eclipse. jOOQ requires Java 6+ to compile and run.
    -							</p>
    -							<p>
    -								Some useful hints to build jOOQ yourself:
    -							</p>
    -							<ul>
    -								<li>Get the latest version of <a href="http://git-scm.com">Git</a> or <a href="http://www.eclipse.org/egit">EGit</a></li>
    -								<li>Get the latest version of <a href="http://maven.apache.org">Maven</a> or <a href="http://eclipse.org/m2e">M2E</a></li>
    -								<li>Check out the jOOQ sources from <a href="https://github.com/jOOQ/jOOQ">https://github.com/jOOQ/jOOQ</a></li>
    -								<li>Optionally, import Maven artefacts into an Eclipse workspace using the following command (see the <a href="http://maven.apache.org/plugins/maven-eclipse-plugin/">maven-eclipse-plugin</a> documentation for details):
    -									<ul>
    -										<li><code>mvn eclipse:eclipse</code></li>
    -									</ul>
    -								</li>
    -								<li>Build the <code>jooq-parent</code> artefact by using any of these commands:
    -									<ul>
    -										<li><code>mvn clean package</code><br/>create .jar files in <code>${project.build.directory}</code></li>
    -										<li><code>mvn clean install</code><br/>install the .jar files in your local repository (e.g. <code>~/.m2</code>)</li>
    -										<li><code>mvn clean {goal} -Dmaven.test.skip=true</code><br/>don't run unit tests when building artefacts</li>
    -									</ul>
    -								</li>
    -							</ul>
    -						</html></content>
    -					</section>
    -					
    -					<section id="semantic-versioning">
    -						<title>jOOQ and backwards-compatibility</title>
    -						<content><html>
    -							<p>
    -								jOOQ follows the rules of semantic versioning according to <a href="http://semver.org">http://semver.org</a> quite strictly. Those rules impose a versioning scheme [X].[Y].[Z] that can be summarised as follows:
    -							</p>
    -							<ul>
    -								<li>If a patch release includes bugfixes, performance improvements and API-irrelevant new features, [Z] is incremented by one.</li>
    -								<li>If a minor release includes backwards-compatible, API-relevant new features, [Y] is incremented by one and [Z] is reset to zero.</li>
    -								<li>If a major release includes backwards-incompatible, API-relevant new features, [X] is incremented by one and [Y], [Z] are reset to zero.</li>
    -							</ul>
    -							
    -							<h3>jOOQ's understanding of backwards-compatibility</h3>
    -							<p>
    -								Backwards-compatibility is important to jOOQ. You've chosen jOOQ as a strategic SQL engine and you don't want your SQL to break. That is why there is at most one major release per year, which changes only those parts of jOOQ's API and functionality, which were agreed upon on the user group. During the year, only minor releases are shipped, adding new features in a backwards-compatible way
    -							</p>
    -							<p>
    -								However, there are some elements of API evolution that would be considered backwards-incompatible in other APIs, but not in jOOQ. As discussed later on in the section about <reference id="dsl-and-non-dsl" title="jOOQ's DSL API"/>, much of jOOQ's API is indeed an internal domain-specific language implemented mostly using Java interfaces. Adding language elements to these interfaces means any of these actions:  
    -							</p>
    -							<ul>
    -								<li>Adding methods to the interface</li>
    -								<li>Overloading methods for convenience</li>
    -								<li>Changing the type hierarchy of interfaces</li>
    -							</ul>
    -							
    -							<p>
    -								It becomes obvious that it would be impossible to add new language elements (e.g. new <reference id="column-expressions" title="SQL functions"/>, new <reference id="select-statement" title="SELECT clauses"/>) to the API without breaking any client code that actually implements those interfaces. Hence, the following rule should be observed: 
    -							</p>
    -							
    -							<p>jOOQ's DSL interfaces should not be implemented by client code! Extend only those extension points that are explicitly documented as "extendable" (e.g. <reference id="custom-queryparts" title="custom QueryParts"/>)</p>
    -						</html></content>
    -					</section>
    -				</sections>
    -			</section>
    -
    -			<section id="sql-building">
    -				<title>SQL building</title>
    -				<content><html>
    -					<p>
    -					    SQL is a declarative language that is hard to integrate into procedural, object-oriented, functional or any other type of programming languages. jOOQ's philosophy is to give SQL the credit it deserves and integrate SQL itself as an <a href="http://en.wikipedia.org/wiki/Domain_Specific_Language">"internal domain specific language"</a> directly into Java.
    -					</p>
    -					<p>
    -						With this philosophy in mind, SQL building is the main feature of jOOQ. All other features (such as <reference id="sql-execution" title="SQL execution"/> and <reference id="code-generation" title="code generation"/>) are mere convenience built on top of jOOQ's SQL building capabilities.
    -					</p>
    -					<p>
    -						This section explains all about the various syntax elements involved with jOOQ's SQL building capabilities. For a complete overview of all syntax elements, please refer to the manual's section about <reference id="reference-bnf-notation"/>
    -					</p>
    -				</html></content>
    -
    -				<sections>
    -                    <redirect id="factory" redirect-to="dsl">
    -                        <redirect id="factory-subclasses" redirect-to="dsl-subclasses"/>
    -                    </redirect>
    -                    
    -					<section id="dsl">
    -					    <title>The DSL type</title>
    -					    <content><html>
    -							<p>
    -								jOOQ exposes a lot of interfaces and hides most implementation facts from client code. The reasons for this are:
    -							</p>
    -							<ul>
    -								<li>Interface-driven design. This allows for modelling queries in a fluent API most efficiently</li>
    -								<li>Reduction of complexity for client code.</li>
    -								<li>API guarantee. You only depend on the exposed interfaces, not concrete (potentially dialect-specific) implementations.</li>
    -							</ul>
    -							<p>
    -								The <reference class="org.jooq.impl.DSL"/> class is the main class from where you will create all jOOQ objects.	It serves as a static factory for <reference id="table-expressions" title="table expressions"/>, <reference id="column-expressions" title="column expressions"/> (or "fields"), <reference id="conditional-expressions" title="conditional expressions"/> and many other <reference id="queryparts" title="QueryParts"/>.
    -							</p>
    -
    -							<h3>The static DSL API</h3>
    -							<p>
    -								With jOOQ 2.0, static factory methods have been introduced in order to make client code look more like SQL. Ideally, when working with jOOQ, you will simply static import all methods from the DSL class:
    -							</p>
    -
    -</html><java>import static org.jooq.impl.DSL.*;</java><html>
    -
    -							<p>
    -							    Note, that when working with Eclipse, you could also add the DSL to your favourites. This will allow to access functions even more fluently:
    -							</p>
    -</html><java>concat(trim(FIRST_NAME), trim(LAST_NAME));
    -
    -// ... which is in fact the same as:
    -DSL.concat(DSL.trim(FIRST_NAME), DSL.trim(LAST_NAME));</java></content>
    -					    
    -					    <sections>
    -							<section id="dsl-subclasses">
    -								<title>DSL subclasses</title>
    -								<content><html>
    -									<p>
    -										There are a couple of subclasses for the general DSL. Each SQL dialect has its own dialect-specific DSL. For instance, if you're only using the MySQL dialect, you can choose to reference the MySQLDSL instead of the standard DSL:
    -									</p>
    -									<p>
    -										The advantage of referencing a dialect-specific DSL lies in the fact that you have access to more proprietary RDMBS functionality. This may include:
    -									</p>
    -									<ul>
    -		    							<li>MySQL's encryption functions</li>
    -		    							<li>PL/SQL constructs, pgplsql, or any other dialect's ROUTINE-language (maybe in the future)</li>
    -									</ul>
    -								</html></content>
    -							</section>
    -					    </sections>
    -					</section>
    -                    
    -                    <redirect id="executor" redirect-to="dsl-context">
    -                        <redirect id="sql-dialects" redirect-to="sql-dialects"/>
    -                        <redirect id="connection-vs-datasource" redirect-to="connection-vs-datasource"/>
    -                        <redirect id="custom-data" redirect-to="custom-data"/>
    -                        <redirect id="custom-execute-listeners" redirect-to="custom-execute-listeners"/>
    -                        <redirect id="custom-settings" redirect-to="custom-settings"/>
    -                        <redirect id="runtime-schema-mapping" redirect-to="runtime-schema-mapping"/>
    -                    </redirect>
    -					
    -					<section id="dsl-context">
    -						<title>The DSLContext class</title>
    -						<content><html>
    -							<p>
    -							    DSLContext references a <reference class="org.jooq.Configuration"/>, an object that configures jOOQ's behaviour when executing queries (see <reference id="sql-execution"/> for more details). Unlike the static DSL, the DSLContext allow for creating <reference id="sql-statements" title="SQL statements"/> that are already "configured" and ready for execution.
    -							</p>
    -							
    -                            <h3>Fluent creation of a DSLContext object</h3>
    -                            <p>
    -                                The DSLContext object can be created fluently from the <reference id="dsl" title="DSL type"/>:
    -                            </p>
    -
    -</html><java><![CDATA[// Create it from a pre-existing configuration
    -DSLContext create = DSL.using(configuration);
    -
    -// Create it from ad-hoc arguments
    -DSLContext create = DSL.using(connection, dialect);]]></java><html>
    -
    -                            <p>
    -                                If you do not have a reference to a pre-existing Configuration object (e.g. created from <reference class="org.jooq.impl.DefaultConfiguration"/>), the various overloaded <code>DSL.using()</code> methods will create one for you.
    -                            </p>
    -                            
    -							<h3>Contents of a Configuration object</h3>
    -							<p>
    -							    A Configuration can be supplied with these objects:
    -							</p>
    -							<ul>
    -								<li><reference class="org.jooq.SQLDialect"/> : The dialect of your database. This may be any of the currently supported database types (see <reference id="sql-dialects"/> for more details)</li>
    -    							<li><reference class="org.jooq.conf.Settings"/> : An optional runtime configuration (see <reference id="custom-settings"/> for more details)</li>
    -								<li><reference class="org.jooq.ExecuteListenerProvider"/> : An optional reference to a provider class that can provide execute listeners to jOOQ (see <reference id="execute-listeners"/> for more details)</li>
    -                                <li>
    -									Any of these:
    -									<ul>
    -										<li><reference class="java.sql.Connection"/> : An optional JDBC Connection that will be re-used for the whole lifecycle of your Configuration (see <reference id="connection-vs-datasource"/> for more details). For simplicity, this is the use-case referenced from this manual, most of the time.</li>
    -		    							<li><reference class="java.sql.DataSource"/> : An optional JDBC DataSource that will be re-used for the whole lifecycle of your Configuration. If you prefer using DataSources over Connections, jOOQ will internally fetch new Connections from your DataSource, conveniently closing them again after query execution. This is particularly useful in J2EE or Spring contexts (see <reference id="connection-vs-datasource"/> for more details)</li>
    -		    							<li><reference class="org.jooq.ConnectionProvider"/> : A custom abstraction that is used by jOOQ to "acquire" and "release" connections. jOOQ will internally "acquire" new Connections from your ConnectionProvider, conveniently "releasing" them again after query execution. (see <reference id="connection-vs-datasource"/> for more details)</li>
    -									</ul>
    -								</li>
    -							</ul>
    -							
    -							<p>
    -								Wrapping a Configuration object, a DSLContext can construct <reference id="sql-statements" title="statements"/>, for later <reference id="sql-execution" title="execution"/>. An example is given here:
    -							</p>
    -</html><java><![CDATA[// The DSLContext is "configured" with a Connection and a SQLDialect
    -DSLContext create = DSL.using(connection, dialect);
    -
    -// This select statement contains an internal reference to the DSLContext's Configuration:
    -Select<?> select = create.selectOne();
    -
    -// Using the internally referenced Configuration, the select statement can now be executed:
    -Result<?> result = select.fetch();]]></java><html>
    -
    -                            <p>
    -                                Note that you do not need to keep a reference to a DSLContext. You may as well inline your local variable, and fluently execute a SQL statement as such:
    -                            </p>
    -
    -</html><java><![CDATA[// Execute a statement from a single execution chain:
    -Result<?> result =
    -DSL.using(connection, dialect)
    -   .select()
    -   .from(BOOK)
    -   .where(BOOK.TITLE.like("Animal%"))
    -   .fetch();]]></java></content>
    -
    -						<sections>
    -							<section id="sql-dialects">
    -								<title>SQL Dialect</title>
    -								<content><html>
    -									<p>
    -										While jOOQ tries to represent the SQL standard as much as possible, many features are vendor-specific to a given database and to its "SQL dialect". jOOQ models this using the <reference class="org.jooq.SQLDialect"/> enum type.
    -									</p>
    -									<p>
    -										The SQL dialect is one of the main attributes of a <reference id="dsl-context" title="Configuration"/>. Queries created from DSLContexts will assume dialect-specific behaviour when <reference id="sql-rendering" title="rendering SQL"/> and <reference id="variable-binding" title="binding bind values"/>.
    -									</p>
    -									<p>
    -										Some parts of the jOOQ API are officially supported only by a given subset of the supported SQL dialects. For instance, the <reference id="connect-by-clause" title="Oracle CONNECT BY clause"/>, which is supported by the Oracle and CUBRID databases, is annotated with a <reference class="org.jooq.Support"/> annotation, as such:
    -									</p>
    -</html><java><![CDATA[/**
    - * Add an Oracle-specific <code>CONNECT BY</code> clause to the query
    - */
    -@Support({ SQLDialect.CUBRID, SQLDialect.ORACLE })
    -SelectConnectByConditionStep<R> connectBy(Condition condition);]]></java><html>
    -
    -									<p>
    -									    jOOQ API methods which are not annotated with the <reference class="org.jooq.Support"/> annotation, or which are annotated with the Support annotation, but without any SQL dialects can be safely used in all SQL dialects. An example for this is the <reference id="select-statement" title="SELECT statement"/> factory method:
    -									</p>
    -</html><java><![CDATA[/**
    - * Create a new DSL select statement.
    - */
    -@Support
    -SelectSelectStep<R> select(Field<?>... fields);]]></java><html>
    -
    -									<h3>jOOQ's SQL clause simulation capabilities</h3>
    -									<p>
    -										The aforementioned Support annotation does not only designate, which databases natively support a feature. It also indicates that a feature is simulated by jOOQ for some databases lacking this feature. An example of this is the <reference id="distinct-predicate" title="DISTINCT predicate"/>, a predicate syntax defined by SQL:1999 and implemented only by H2, HSQLDB, and Postgres:
    -									</p>
    -
    -</html><sql><![CDATA[A IS DISTINCT FROM B]]></sql><html>
    -
    -									<p>
    -										Nevertheless, the <code>IS DISTINCT FROM</code> predicate is supported by jOOQ in all dialects, as its semantics can be expressed with an equivalent <reference id="case-expressions" title="CASE expression"/>. For more details, see the manual's section about the <reference id="distinct-predicate" title="DISTINCT predicate"/>.
    -									</p>
    -									
    -									<h3>jOOQ and the Oracle SQL dialect</h3>
    -									<p>
    -										Oracle SQL is much more expressive than many other SQL dialects. It features many unique keywords, clauses and functions that are out of scope for the SQL standard. Some examples for this are
    -									</p>
    -									<ul>
    -										<li>The <reference id="connect-by-clause" title="CONNECT BY clause"/>, for hierarchical queries</li>
    -										<li>The <reference id="pivot-tables" title="PIVOT"/> keyword for creating PIVOT tables</li>
    -										<li><reference id="oracle-packages" title="Packages"/>, <reference id="oracle-member-procedures" title="object-oriented user-defined types, member procedures"/> as described in the section about <reference id="stored-procedures" title="stored procedures and functions"/></li>
    -										<li>Advanced analytical functions as described in the section about <reference id="window-functions" title="window functions"/></li>
    -									</ul>
    -
    -									<p>
    -										jOOQ has a historic affinity to Oracle's SQL extensions. If something is supported in Oracle SQL, it has a high probability of making it into the jOOQ API
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="connection-vs-datasource">
    -								<title>Connection vs. DataSource</title>
    -								<content><html>
    -									<h3>Interact with JDBC Connections</h3>
    -									<p>
    -										While you can use jOOQ for <reference id="sql-building" title="SQL building"/> only, you can also run queries against a JDBC <reference class="java.sql.Connection"/>. Internally, jOOQ creates <reference class="java.sql.Statement"/> or <reference class="java.sql.PreparedStatement"/> objects from such a Connection, in order to execute statements. The normal operation mode is to provide a <reference id="dsl-context" title="Configuration"/> with a JDBC Connection, whose lifecycle you will control yourself. This means that jOOQ will not actively close connections, rollback or commit transactions.
    -									</p>
    -									<p>
    -										Note, in this case, jOOQ will internally use a <reference class="org.jooq.impl.DefaultConnectionProvider"/>, which you can reference directly if you prefer that. The DefaultConnectionProvider exposes various transaction-control methods, such as commit(), rollback(), etc.
    -									</p>
    -									
    -									<h3>Interact with JDBC DataSources</h3>
    -									<p>
    -										If you're in a J2EE or Spring context, however, you may wish to use a <reference class="javax.sql.DataSource"/> instead. Connections obtained from such a DataSource will be closed after query execution by jOOQ. The semantics of such a close operation should be the returning of the connection into a connection pool, not the actual closing of the underlying physical connection. Typically, this makes sense in an environment using distributed JTA transactions. An example of using DataSources with jOOQ can be seen in the tutorial section about <reference id="jooq-with-spring" title="using jOOQ with Spring"/>.
    -									</p>
    -									<p>
    -										Note, in this case, jOOQ iwll internally use a <reference class="org.jooq.impl.DataSourceConnectionProvider"/>, which you can reference directly if you prefer that.
    -									</p>
    -									
    -									<h3>Inject custom behaviour</h3>
    -									<p>
    -										If your specific environment works differently from any of the above approaches, you can inject your own custom implementation of a ConnectionProvider into jOOQ. This is the API contract you have to fulfil:
    -									</p>
    -									
    -</html><java><![CDATA[public interface ConnectionProvider {
    -
    -    // Provide jOOQ with a connection
    -    Connection acquire() throws DataAccessException;
    -  
    -    // Get a connection back from jOOQ
    -    void release(Connection connection) throws DataAccessException;
    -}]]></java><html>
    -
    -									<p>
    -									    Note that <code>acquire()</code> should always return the same Connection until this connection is returned via <code>release()</code> 
    -									</p>
    -								</html></content>
    -							</section>
    -							
    -							<section id="custom-data">
    -								<title>Custom data</title>
    -								<content><html>
    -									<p>
    -										In advanced use cases of integrating your application with jOOQ, you may want to put custom data into your <reference id="dsl-context" title="Configuration"/>, which you can then access from your...
    -									</p>
    -									
    -									<ul>
    -										<li><reference id="custom-execute-listeners" title="Custom ExecuteListeners"/></li>
    -										<li><reference id="custom-queryparts" title="Custom QueryParts"/></li>
    -									</ul>
    -									
    -									<p>
    -										Here is an example of how to use the custom data API. Let's assume that you have written an <reference id="execute-listeners" title="ExecuteListener"/>, that prevents <code>INSERT</code> statements, when a given flag is set to <code>true</code>: 
    -									</p>
    -
    -</html><java><![CDATA[// Implement an ExecuteListener
    -public class NoInsertListener extends DefaultExecuteListener {
    -
    -    @Override
    -    public void start(ExecuteContext ctx) {
    -    
    -        // This listener is active only, when your custom flag is set to true
    -        if (Boolean.TRUE.equals(ctx.configuration().data("com.example.my-namespace.no-inserts"))) {
    -        
    -            // If active, fail this execution, if an INSERT statement is being executed
    -            if (ctx.query() instanceof Insert) {
    -                throw new DataAccessException("No INSERT statements allowed");
    -            }
    -        }
    -    }
    -}]]></java><html>
    -									<p>
    -										See the manual's section about <reference id="execute-listeners" title="ExecuteListeners"/> to learn more about how to implement an <code>ExecuteListener</code>.
    -									</p>
    -									
    -									<p>
    -										Now, the above listener can be added to your <reference id="dsl-context" title="Configuration"/>, but you will also need to pass the flag to the <code>Configuration</code>, in order for the listener to work:
    -									</p>
    -									
    -</html><java><![CDATA[// Create your Configuration
    -Configuration configuration = new DefaultConfiguration().set(connection).set(dialect);
    -
    -// Set a new execute listener provider onto the configuration:
    -configuration.set(new DefaultExecuteListenerProvider(new NoInsertListener()));
    -
    -// Use any String literal to identify your custom data
    -configuration.data("com.example.my-namespace.no-inserts", true);
    -
    -// Try to execute an INSERT statement
    -try {
    -    DSL.using(configuration)
    -       .insertInto(AUTHOR, AUTHOR.ID, AUTHOR.LAST_NAME)
    -       .values(1, "Orwell")
    -       .execute();
    -          
    -    // You shouldn't get here
    -    Assert.fail();
    -}
    -
    -// Your NoInsertListener should be throwing this exception here:
    -catch (DataAccessException expected) {
    -    Assert.assertEquals("No INSERT statements allowed", expected.getMessage());
    -}]]></java><html>
    -
    -									<p>
    -										Using the <code>data()</code> methods, you can store and retrieve custom data in your <code>Configurations</code>.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="custom-execute-listeners">
    -								<title>Custom ExecuteListeners</title>
    -								<content><html>
    -									<p>
    -										<code>ExecuteListeners</code> are a useful tool to...
    -									</p>
    -									
    -									<ul>
    -										<li>implement custom logging</li>
    -										<li>apply triggers written in Java</li>
    -										<li>collect query execution statistics</li>
    -										<li>integrate with the <reference id="jooq-console" title="jOOQ Console"/></li>
    -									</ul>
    -									
    -									<p>
    -										ExecuteListeners are hooked into your <reference id="dsl-context" title="Configuration"/> by returning them from an <reference class="org.jooq.ExecuteListenerProvider"/>:
    -									</p>
    -
    -</html><java><![CDATA[// Create your Configuration
    -Configuration configuration = new DefaultConfiguration().set(connection).set(dialect);
    -
    -// Hook your listener providers into the configuration:
    -configuration.set(
    -    new DefaultExecuteListenerProvider(new MyFirstListener()),
    -    new DefaultExecuteListenerProvider(new PerformanceLoggingListener()),
    -    new DefaultExecuteListenerProvider(new NoInsertListener())
    -);]]></java><html>
    -									
    -									<p>
    -										See the manual's section about <reference id="execute-listeners" title="ExecuteListeners"/> to see examples of such listener implementations.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="custom-settings">
    -								<title>Custom Settings</title>
    -								<content><html>
    -									<p>
    -										The jOOQ Configuration allows for some optional configuration elements to be used by advanced users. The <reference class="org.jooq.conf.Settings" /> class is a JAXB-annotated type, that can be provided to a Configuration in several ways:
    -									</p>
    -									<ul>
    -										<li>In the DSLContext constructor (<code>DSL.using()</code>). This will override default settings below</li>
    -										<li>in the <reference class="org.jooq.impl.DefaultConfiguration"/> constructor. This will override default settings below</li>
    -                                        <li>From a location specified by a JVM parameter: -Dorg.jooq.settings</li>
    -										<li>From the classpath at /jooq-settings.xml</li>
    -										<li>From the settings defaults, as specified in <a href="http://www.jooq.org/xsd/jooq-runtime-{runtime-xsd-version}.xsd" title="The jOOQ Runtime configuration XSD">http://www.jooq.org/xsd/jooq-runtime-{runtime-xsd-version}.xsd</a></li>
    -									</ul>
    -									<h3>Example</h3>
    -									<p>
    -										For example, if you want to indicate to jOOQ, that it should inline all bind variables, and execute static <reference class="java.sql.Statement"/> instead of binding its variables to <reference class="java.sql.PreparedStatement"/>, you can do so by creating the following DSLContext:
    -									</p>
    -</html><java><![CDATA[Settings settings = new Settings();
    -settings.setStatementType(StatementType.STATIC_STATEMENT);
    -DSLContext create = DSL.using(connection, dialect, settings);]]></java><html>
    -									<p>
    -										Subsequent sections of the manual contain some more in-depth explanations about these settings:
    -									</p>
    -									<ul>
    -										<li>
    -		     								<reference id="schema-mapping" title="Runtime schema and table mapping"/>
    -		   								</li>
    -		     							<li>
    -		     								<reference id="optimistic-locking" title="Execute CRUD with optimistic locking enabled"/>
    -		     							</li>
    -		     							<li>
    -		     								<reference id="logging" title="Enabling DEBUG logging of all executed SQL"/>
    -		     							</li>
    -		   							</ul>
    -		   							<p>
    -										Please refer to the jOOQ runtime configuration XSD for more details:<br/>
    -										<a href="http://www.jooq.org/xsd/jooq-runtime-{runtime-xsd-version}.xsd" title="The jOOQ Runtime configuration XSD">http://www.jooq.org/xsd/jooq-runtime-{runtime-xsd-version}.xsd</a>
    -									</p>
    -								</html></content>
    -							</section>
    -							
    -							<section id="runtime-schema-mapping">
    -								<title>Runtime schema and table mapping</title>
    -								<content><html>
    -									<h3>Mapping your DEV schema to a productive environment</h3>
    -									<p>
    -										You may wish to design your database in a way that you have several instances of your schema. This is useful when you want to cleanly separate data belonging to several customers / organisation units / branches / users and put each of those entities' data in a separate database or schema.
    -									</p>
    -									
    -									<p>
    -										In our AUTHOR example this would mean that you provide a book reference database to several companies, such as My Book World and Books R Us. In that case, you'll probably have a schema setup like this:
    -									</p>
    -									<ul>
    -										<li>DEV: Your development schema. This will be the schema that you base code generation upon, with jOOQ </li>
    -										<li>MY_BOOK_WORLD: The schema instance for My Book World </li>
    -										<li>BOOKS_R_US: The schema instance for Books R Us </li>
    -									</ul>
    -
    -									<h3>Mapping DEV to MY_BOOK_WORLD with jOOQ</h3>
    -									<p>
    -										When a user from My Book World logs in, you want them to access the MY_BOOK_WORLD schema using classes generated from DEV. This can be achieved with the <reference class="org.jooq.conf.RenderMapping"/> class, that you can equip your Configuration's <reference id="custom-settings" title="settings"/> with. Take the following example:
    -									</p>
    -
    -</html><java>Settings settings = new Settings()
    -    .withRenderMapping(new RenderMapping()
    -    .withSchemata(
    -        new MappedSchema().withInput("DEV")
    -                          .withOutput("MY_BOOK_WORLD")));
    -
    -// Add the settings to the DSLContext
    -DSLContext create = DSL.using(connection, SQLDialect.ORACLE, settings);
    -
    -// Run queries with the "mapped" Configuration
    -create.selectFrom(AUTHOR).fetch();</java><html>
    -
    -									<p>
    -										The query executed with a Configuration equipped with the above mapping will in fact produce this SQL statement:
    -									</p>
    -									
    -</html><sql>SELECT * FROM MY_BOOK_WORLD.AUTHOR</sql><html>
    -									<p>
    -										Even if AUTHOR was generated from DEV.
    -									</p>
    -
    -									<h3>Mapping several schemata</h3>
    -									<p>
    -										Your development database may not be restricted to hold only one DEV schema. You may also have a LOG schema and a MASTER schema. Let's say the MASTER schema is shared among all customers, but each customer has their own LOG schema instance. Then you can enhance your RenderMapping like this (e.g. using an XML configuration file):
    -									</p>
    -
    -</html><xml><![CDATA[<settings xmlns="http://www.jooq.org/xsd/jooq-runtime-{runtime-xsd-version}.xsd">
    -  <renderMapping>
    -    <schemata>
    -      <schema>
    -        <input>DEV</input>
    -        <output>MY_BOOK_WORLD</output>
    -      </schema>
    -      <schema>
    -        <input>LOG</input>
    -        <output>MY_BOOK_WORLD_LOG</output>
    -      </schema>
    -    </schemata>
    -  </renderMapping>
    -</settings>]]></xml><html>
    -
    -                            		<p>
    -                            			Note, you can load the above XML file like this:
    -                           			</p>
    -
    -</html><java>Settings settings = JAXB.unmarshal(new File("jooq-runtime.xml"), Settings.class);</java><html>
    -
    -									<p>
    -										This will map generated classes from DEV to MY_BOOK_WORLD, from LOG to MY_BOOK_WORLD_LOG, but leave the MASTER schema alone. Whenever you want to change your mapping configuration, you will have to create a new Configuration.
    -									</p>
    -
    -
    -									<h3>Using a default schema</h3>
    -                            		<p>
    -                            			If you wish not to render any schema name at all, use the following Settings property for this:
    -                           			</p>
    -
    -
    -</html><java>Settings settings = new Settings()
    -    .withRenderSchema(false);
    -
    -// Add the settings to the Configuration
    -DSLContext create = DSL.using(connection, SQLDialect.ORACLE, settings);
    -
    -// Run queries that omit rendering schema names
    -create.selectFrom(AUTHOR).fetch();</java><html>
    -
    -									<h3>Mapping of tables</h3>
    -									<p>
    -										Not only schemata can be mapped, but also tables. If you are not the owner of the database your application connects to, you might need to install your schema with some sort of prefix to every table. In our examples, this might mean that you will have to map DEV.AUTHOR to something MY_BOOK_WORLD.MY_APP__AUTHOR, where MY_APP__ is a prefix applied to all of your tables. This can be achieved by creating the following mapping: 
    -									</p>
    -
    -</html><java>Settings settings = new Settings()
    -    .withRenderMapping(new RenderMapping()
    -    .withSchemata(
    -        new MappedSchema().withInput("DEV")
    -                          .withOutput("MY_BOOK_WORLD")
    -                          .withTables(
    -         new MappedTable().withInput("AUTHOR")
    -                          .withOutput("MY_APP__AUTHOR"))));
    -
    -// Add the settings to the Configuration
    -DSLContext create = DSL.using(connection, SQLDialect.ORACLE, settings);
    -
    -// Run queries with the "mapped" configuration
    -create.selectFrom(AUTHOR).fetch();</java><html>
    -
    -									<p>
    -										The query executed with a Configuration equipped with the above mapping will in fact produce this SQL statement:
    -									</p>
    -									
    -</html><sql>SELECT * FROM MY_BOOK_WORLD.MY_APP__AUTHOR</sql><html>
    -
    -		                            <p>
    -		                           		Table mapping and schema mapping can be applied independently, by specifying several MappedSchema entries in the above configuration. jOOQ will process them in order of appearance and map at first match. Note that you can always omit a MappedSchema's output value, in case of which, only the table mapping is applied. If you omit a MappedSchema's input value, the table mapping is applied to all schemata!
    -		                            </p>
    -
    -									<h3>Hard-wiring mappings at code-generation time</h3>
    -									<p>
    -										Note that the manual's section about <reference id="schema-mapping" title="code generation schema mapping"/> explains how you can hard-wire your schema mappings at code generation time
    -									</p>									
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -					<section id="sql-statements">
    -						<title>SQL Statements</title>
    -						<content><html>
    -							<p>
    -								jOOQ currently supports 6 types of SQL statements. All of these statements are constructed from a DSLContext instance with an optional <reference id="connection-vs-datasource" title="JDBC Connection or DataSource"/>. If supplied with a Connection or DataSource, they can be executed. Depending on the <reference id="query-vs-resultquery" title="query type"/>, executed queries can return results.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="dsl-and-non-dsl">
    -								<title>jOOQ's DSL and model API</title>
    -								<content><html>
    -									<p>
    -										jOOQ ships with its own DSL (or	<a href="http://en.wikipedia.org/wiki/Domain-specific_language" title="Domain Specific Language">Domain Specific Language</a>) that	simulates SQL in Java. This means, that you can	write SQL statements almost as if Java natively supported it, just like .NET's C# does with <a href="http://msdn.microsoft.com/en-us/library/bb425822.aspx">LINQ to SQL.</a>
    -									</p>
    -									<p>
    -										Here is an example to illustrate what that means:
    -									</p>
    -									
    -</html><code-pair><sql><![CDATA[-- Select all books by authors born after 1920,
    --- named "Paulo" from a catalogue:
    -SELECT *
    -  FROM author a
    -  JOIN book b ON a.id = b.author_id
    - WHERE a.year_of_birth > 1920
    -   AND a.first_name = 'Paulo'
    - ORDER BY b.title]]></sql><java><![CDATA[Result<Record> result =
    -create.select()
    -      .from(AUTHOR.as("a"))
    -      .join(BOOK.as("b")).on(a.ID.equal(b.AUTHOR_ID))
    -      .where(a.YEAR_OF_BIRTH.greaterThan(1920)
    -      .and(a.FIRST_NAME.equal("Paulo")))
    -      .orderBy(b.TITLE)
    -      .fetch();]]></java></code-pair><html>
    -
    -									<p>
    -										We'll see how the aliasing works later in the section about <reference id="aliased-tables" title="aliased tables"/>
    -									</p>
    -
    -									<h3>jOOQ as an internal domain specific language in Java (a.k.a. the DSL API)</h3>
    -									<p>
    -										Many other frameworks have similar APIs with similar feature sets. Yet, what makes jOOQ special is its informal <reference id="reference-bnf-notation" title="BNF notation"/> modelling a unified SQL dialect suitable for many vendor-specific dialects, and implementing that BNF notation as a hierarchy of interfaces in Java. This concept is extremely powerful, when <reference id="jooq-in-modern-ides" title="using jOOQ in modern IDEs" /> with syntax completion. Not only can you code much faster, your SQL code will be compile-checked to a certain extent. An example of a DSL query equivalent to the previous one is given here:
    -									</p>
    -									
    -</html><java><![CDATA[DSLContext create = DSL.using(connection, dialect);
    -Result<?> result = create.select()
    -                         .from(AUTHOR)
    -                         .join(BOOK).on(BOOK.AUTHOR_ID.equal(AUTHOR.ID))
    -                         .fetch();]]></java><html>
    -
    -                         			<p>
    -                         				Unlike other, simpler frameworks that use <a href="http://en.wikipedia.org/wiki/Fluent_interface">"fluent APIs"</a> or <a href="http://en.wikipedia.org/wiki/Method_chaining">"method chaining"</a>, jOOQ's BNF-based interface hierarchy will not allow bad query syntax. The following will not compile, for instance:
    -                         			</p>
    -</html><java><![CDATA[DSLContext create = DSL.using(connection, dialect);
    -Result<?> result = create.select()
    -                         .join(BOOK).on(BOOK.AUTHOR_ID.equal(AUTHOR.ID))
    -                      //  ^^^^ "join" is not possible here
    -                         .from(AUTHOR)
    -                         .fetch();
    -
    -Result<?> result = create.select()
    -                         .from(AUTHOR)
    -                         .join(BOOK)
    -                         .fetch();
    -                      //  ^^^^^ "on" is missing here
    -
    -Result<?> result = create.select(rowNumber())
    -                      //         ^^^^^^^^^ "over()" is missing here
    -                         .from(AUTHOR)
    -                         .fetch();
    -
    -Result<?> result = create.select()
    -                         .from(AUTHOR)
    -                         .where(AUTHOR.ID.in(select(BOOK.TITLE).from(BOOK)))
    -                      //                     ^^^^^^^^^^^^^^^^^^
    -                      // AUTHOR.ID is of type Field<Integer> but subselect returns Record1<String>
    -                         .fetch();
    -
    -Result<?> result = create.select()
    -                         .from(AUTHOR)
    -                         .where(AUTHOR.ID.in(select(BOOK.AUTHOR_ID, BOOK.ID).from(BOOK)))
    -                      //                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    -                      // AUTHOR.ID is of degree 1 but subselect returns Record2<Integer, Integer>
    -                         .fetch();]]></java><html>
    -
    -									<h3>History of SQL building and incremental query building (a.k.a. the model API)</h3>
    -									<p>
    -										Historically, jOOQ started out as an object-oriented SQL builder library like any other. This meant that all queries and their syntactic components were modeled as so-called <reference id="queryparts" title="QueryParts"/>, which delegate <reference id="sql-rendering" title="SQL rendering"/> and <reference id="variable-binding" title="variable binding"/> to child components. This part of the API will be referred to as the model API (or non-DSL API), which is still maintained and used internally by jOOQ for incremental query building. An example of incremental query building is given here:
    -									</p>
    -									
    -</html><java><![CDATA[DSLContext create = DSL.using(connection, dialect);
    -SelectQuery<Record> query = create.selectQuery();
    -query.addFrom(AUTHOR);
    -
    -// Join books only under certain circumstances
    -if (join) {
    -    query.addJoin(BOOK, BOOK.AUTHOR_ID.equal(AUTHOR.ID));
    -}
    -
    -Result<?> result = query.fetch();]]></java><html>
    -
    -									<p>
    -										This query is equivalent to the one shown before using the DSL syntax. In fact, internally, the DSL API constructs precisely this SelectQuery object. Note, that you can always access the SelectQuery object to switch between DSL and model APIs:
    -									</p>
    -
    -</html><java><![CDATA[DSLContext create = DSL.using(connection, dialect);
    -SelectFinalStep<?> select = create.select().from(AUTHOR);
    -
    -// Add the JOIN clause on the internal QueryObject representation
    -SelectQuery<?> query = select.getQuery();
    -query.addJoin(BOOK, BOOK.AUTHOR_ID.equal(AUTHOR.ID));]]></java><html>
    -
    -									<h3>Mutability</h3>
    -									<p>
    -										Note, that for historic reasons, the DSL API mixes mutable and immutable behaviour with respect to the internal representation of the <reference id="queryparts" title="QueryPart"/> being constructed. While creating <reference id="conditional-expressions" title="conditional expressions"/>, <reference id="column-expressions" title="column expressions"/> (such as functions) assumes immutable behaviour, creating <reference id="sql-statements" title="SQL statements"/> does not. In other words, the following can be said:
    -									</p>
    -									
    -</html><java><![CDATA[// Conditional expressions (immutable)
    -// -----------------------------------
    -Condition a = BOOK.TITLE.equal("1984");
    -Condition b = BOOK.TITLE.equal("Animal Farm");
    -
    -// The following can be said
    -a       != a.or(b); // or() does not modify a
    -a.or(b) != a.or(b); // or() always creates new objects
    -
    -// Statements (mutable)
    -// --------------------
    -SelectFromStep<?> s1 = select();
    -SelectJoinStep<?> s2 = s1.from(BOOK);
    -SelectJoinStep<?> s3 = s1.from(AUTHOR);
    -
    -// The following can be said
    -s1 == s2; // The internal object is always the same
    -s2 == s3; // The internal object is always the same]]></java><html>
    -
    -									<p>
    -										On the other hand, beware that you can always extract and modify <reference id="bind-values" title="bind values"/> from any <code>QueryPart</code>.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="select-statement">
    -								<title>The SELECT statement</title>
    -								<content><html>
    -									<p>
    -										When you don't just perform <reference id="crud-with-updatablerecords" title="CRUD"/> (i.e. SELECT * FROM your_table WHERE ID = ?), you're usually generating new record types using custom projections. With jOOQ, this is as intuitive, as if using SQL directly. A more or less complete example of the "standard" SQL syntax, plus some extensions, is provided by a query like this:
    -									</p>
    -
    -									<h3>SELECT from a complex table expression</h3>
    -</html><code-pair>
    -<sql><![CDATA[-- get all authors' first and last names, and the number
    --- of books they've written in German, if they have written
    --- more than five books in German in the last three years
    --- (from 2011), and sort those authors by last names
    --- limiting results to the second and third row, locking
    --- the rows for a subsequent update... whew!
    -
    -  SELECT AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME, COUNT(*)
    -    FROM AUTHOR
    -    JOIN BOOK ON AUTHOR.ID = BOOK.AUTHOR_ID
    -   WHERE BOOK.LANGUAGE = 'DE'
    -     AND BOOK.PUBLISHED > '2008-01-01'
    -GROUP BY AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME
    -  HAVING COUNT(*) > 5
    -ORDER BY AUTHOR.LAST_NAME ASC NULLS FIRST
    -   LIMIT 2
    -  OFFSET 1
    -     FOR UPDATE]]></sql><java><![CDATA[// And with jOOQ...
    -
    -
    -
    -
    -DSLContext create = DSL.using(connection, dialect);
    -
    -create.select(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME, count())
    -      .from(AUTHOR)
    -      .join(BOOK).on(BOOK.AUTHOR_ID.equal(AUTHOR.ID))
    -      .where(BOOK.LANGUAGE.equal("DE"))
    -      .and(BOOK.PUBLISHED.greaterThan("2008-01-01"))
    -      .groupBy(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -      .having(count().greaterThan(5))
    -      .orderBy(AUTHOR.LAST_NAME.asc().nullsFirst())
    -      .limit(1)
    -      .offset(2)
    -      .forUpdate();]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										Details about the various clauses of this query will be provided in subsequent sections.
    -									</p>
    -
    -									<h3>SELECT from single physical tables</h3>
    -									<p>
    -										A very similar, but limited API is available, if you want to select from single physical tables in order to retrieve <reference id="crud-with-updatablerecords" title="TableRecords or even UpdatableRecords"/>. The decision, which type of select to create is already made at the very first step, when you create the <code>SELECT</code> statement with the DSL or DSLContext types:
    -									</p>
    -
    -</html><java><![CDATA[public <R extends Record> SelectWhereStep<R> selectFrom(Table<R> table);]]></java><html>
    -									<p>
    -										As you can see, there is no way to further restrict/project the selected fields. This just selects all known TableFields in the supplied Table, and it also binds &lt;R extends Record&gt; to your Table's associated Record. An example of such a Query would then be:
    -									</p>
    -</html><java><![CDATA[BookRecord book = create.selectFrom(BOOK)
    -                        .where(BOOK.LANGUAGE.equal("DE"))
    -                        .orderBy(BOOK.TITLE)
    -                        .fetchAny();]]></java><html>
    -
    -                   					<p>
    -                   						The "reduced" SELECT API is limited in the way that it skips DSL access to any of these clauses:
    -                   					</p>
    -                   					<ul>
    -                   						<li><reference id="select-clause"/></li>
    -                   						<li><reference id="join-clause"/></li>
    -                   					</ul>
    -                   					<p>
    -                   						In most parts of this manual, it is assumed that you do not use the "reduced" SELECT API. For more information about the simple SELECT API, see the manual's section about <reference id="record-vs-tablerecord" title="fetching strongly or weakly typed records"/>.
    -                   					</p>
    -								</html></content>
    -
    -								<sections>
    -									<section id="select-clause">
    -										<title>The SELECT clause</title>
    -										<content><html>
    -											<p>
    -												The SELECT clause lets you project your own record types, referencing table fields, functions, arithmetic expressions, etc. The DSL type provides several methods for expressing a SELECT clause:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[-- The SELECT clause
    -SELECT BOOK.ID, BOOK.TITLE
    -SELECT BOOK.ID, TRIM(BOOK.TITLE)
    -]]></sql><java><![CDATA[// Provide a varargs Fields list to the SELECT clause:
    -Select<?> s1 = create.select(BOOK.ID, BOOK.TITLE);
    -Select<?> s2 = create.select(BOOK.ID, trim(BOOK.TITLE));]]></java>
    -</code-pair><html>
    -
    -											<p>
    -												Some commonly used projections can be easily created using convenience methods:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[-- Simple SELECTs
    -SELECT COUNT(*)
    -SELECT 0 -- Not a bind variable
    -SELECT 1 -- Not a bind variable
    -]]></sql><java><![CDATA[// Select commonly used values
    -Select<?> select1 = create.selectCount();
    -Select<?> select2 = create.selectZero();
    -Select<?> select2 = create.selectOne();]]></java>
    -</code-pair><html>
    -
    -											<p>
    -												See more details about functions and expressions in the manual's section about <reference id="column-expressions"/>
    -											</p>
    -
    -											<h3>The SELECT DISTINCT clause</h3>
    -											<p>
    -												The DISTINCT keyword can be included in the method name, constructing a SELECT clause
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT DISTINCT BOOK.TITLE]]></sql><java><![CDATA[Select<?> select1 = create.selectDistinct(BOOK.TITLE);]]></java>
    -</code-pair><html>
    -
    -                                            <h3>SELECT *</h3>
    -                                            <p>
    -                                            	jOOQ does not explicitly support the asterisk operator in projections. However, you can omit the projection as in these examples:
    -                                            </p>
    -                                            
    -</html><java><![CDATA[// Explicitly selects all columns available from BOOK
    -create.select().from(BOOK);
    -
    -// Explicitly selects all columns available from BOOK and AUTHOR
    -create.select().from(BOOK, AUTHOR);
    -create.select().from(BOOK).crossJoin(AUTHOR);
    -
    -// Renders a SELECT * statement, as columns are unknown to jOOQ
    -create.select().from(tableByName("BOOK"));]]></java><html>                                            
    -
    -											<h3>Typesafe projections with degree up to {max-row-degree}</h3>
    -											<p>
    -												Since jOOQ 3.0, <reference id="record-n" title="records"/> and <reference id="row-value-expressions" title="row value expressions"/> up to degree {max-row-degree} are now generically typesafe. This is reflected by an overloaded <code>SELECT</code> (and <code>SELECT DISTINCT</code>) API in both DSL and DSLContext. An extract from the DSL type:
    -											</p>
    -											
    -</html><java><![CDATA[// Non-typesafe select methods:
    -public static SelectSelectStep<Record> select(Collection<? extends Field<?>> fields);
    -public static SelectSelectStep<Record> select(Field<?>... fields);
    -
    -// Typesafe select methods:
    -public static <T1>         SelectSelectStep<Record1<T1>>         select(Field<T1> field1);
    -public static <T1, T2>     SelectSelectStep<Record2<T1, T2>>     select(Field<T1> field1, Field<T2> field2);
    -public static <T1, T2, T3> SelectSelectStep<Record3<T1, T2, T3>> select(Field<T1> field1, Field<T2> field2, Field<T3> field3);
    -// [...]]]></java><html>
    -		
    -											<p>
    -												Since the generic R type is bound to some <reference id="record-n" title="Record[N]"/>, the associated T type information can be used in various other contexts, e.g. the <reference id="in-predicate" title="IN predicate"/>. Such a <code>SELECT</code> statement can be assigned typesafely:
    -											</p>
    -
    -</html><java><![CDATA[Select<Record2<Integer, String>> s1 = create.select(BOOK.ID, BOOK.TITLE);
    -Select<Record2<Integer, String>> s2 = create.select(BOOK.ID, trim(BOOK.TITLE));]]></java><html>
    -																				
    -											<p>
    -												For more information about typesafe record types with degree up to {max-row-degree}, see the manual's section about <reference id="record-n" title="Record1 to Record{max-row-degree}"/>.
    -											</p>
    -										</html></content>
    -									</section>
    -
    -									<section id="from-clause">
    -										<title>The FROM clause</title>
    -										<content><html>
    -											<p>
    -												The SQL FROM clause allows for specifying any number of <reference id="table-expressions" title="table expressions"/> to select data from. The following are examples of how to form normal FROM clauses:
    -											</p>
    -
    -</html><code-pair>
    -	<sql><![CDATA[SELECT 1 FROM BOOK
    -SELECT 1 FROM BOOK, AUTHOR
    -SELECT 1 FROM BOOK "b", AUTHOR "a"]]></sql><java><![CDATA[create.selectOne().from(BOOK);
    -create.selectOne().from(BOOK, AUTHOR);
    -create.selectOne().from(BOOK.as("b"), AUTHOR.as("a"));]]></java>
    -</code-pair><html>
    -
    -											<p>
    -												Read more about aliasing in the manual's section about <reference id="aliased-tables" title="aliased tables"/>.
    -											</p>
    -											
    -											<h3>More advanced table expressions</h3>
    -											<p>
    -												Apart from simple tables, you can pass any arbitrary <reference id="table-expressions" title="table expression"/> to the jOOQ FROM clause. This may include <reference id="array-and-cursor-unnesting" title="unnested cursors"/> in Oracle:
    -											</p>
    -
    -</html><code-pair>
    -	<sql><![CDATA[SELECT *
    -FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(null, null, 'ALLSTATS'));]]></sql><java><![CDATA[create.select()
    -      .from(table(DbmsXplan.displayCursor(null, null, "ALLSTATS"));]]></java>
    -</code-pair><html>
    -
    -											<p>
    -												Note, in order to access the DbmsXplan package, you can use the <reference id="code-generation" title="code generator"/> to generate Oracle's SYS schema.
    -											</p>
    -
    -
    -											<h3>Selecting FROM DUAL with jOOQ</h3>
    -											<p>
    -												In many SQL dialects, FROM is a mandatory clause, in some it isn't. jOOQ allows you to omit the FROM clause, returning just one record. An example:
    -											</p>
    -
    -</html><code-pair>
    -	<sql><![CDATA[SELECT 1 FROM DUAL
    -SELECT 1]]></sql><java><![CDATA[DSL.using(SQLDialect.ORACLE).selectOne().getSQL();
    -DSL.using(SQLDialect.POSTGRES).selectOne().getSQL();]]></java>
    -</code-pair><html>
    -
    -											<p>
    -												Read more about dual or dummy tables in the manual's section about <reference id="dual" title="the DUAL table"/>. The following are examples of how to form normal FROM clauses:
    -											</p>
    -										</html></content>
    -									</section>
    -
    -									<section id="join-clause">
    -										<title>The JOIN clause</title>
    -										<content><html>
    -											<p>
    -												jOOQ supports many different types of standard SQL JOIN operations:
    -											</p>
    -											<ul>
    -												<li>[ INNER ] JOIN</li>
    -												<li>LEFT [ OUTER ] JOIN</li>
    -												<li>RIGHT [ OUTER ] JOIN</li>
    -												<li>FULL OUTER JOIN</li>
    -												<li>CROSS JOIN</li>
    -												<li>NATURAL JOIN</li>
    -												<li>NATURAL LEFT [ OUTER ] JOIN</li>
    -												<li>NATURAL RIGHT [ OUTER ] JOIN</li>
    -											</ul>
    -
    -											<p>
    -												All of these JOIN methods can be called on <reference class="org.jooq.Table"/> types, or directly after the FROM clause for convenience. The following example joins AUTHOR and BOOK
    -											</p>
    -
    -</html><java><![CDATA[DSLContext create = DSL.using(connection, dialect);
    -
    -// Call "join" directly on the AUTHOR table
    -Result<?> result = create.select()
    -                         .from(AUTHOR.join(BOOK)
    -                                     .on(BOOK.AUTHOR_ID.equal(AUTHOR.ID)))
    -                         .fetch();
    -
    -// Call "join" on the type returned by "from"
    -Result<?> result = create.select()
    -                         .from(AUTHOR)
    -                         .join(BOOK)
    -                         .on(BOOK.AUTHOR_ID.equal(AUTHOR.ID))
    -                         .fetch();]]></java><html>
    -
    -											<p>
    -												The two syntaxes will produce the same SQL statement. However, calling "join" on <reference class="org.jooq.Table"/> objects allows for more powerful, nested JOIN expressions (if you can handle the parentheses):
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT *
    -FROM AUTHOR
    -LEFT OUTER JOIN (
    -  BOOK JOIN BOOK_TO_BOOK_STORE
    -       ON BOOK_TO_BOOK_STORE.BOOK_ID = BOOK.ID
    -)
    -ON BOOK.AUTHOR_ID = AUTHOR.ID]]></sql><java><![CDATA[// Nest joins and provide JOIN conditions only at the end
    -create.select()
    -      .from(AUTHOR
    -      .leftOuterJoin(BOOK
    -        .join(BOOK_TO_BOOK_STORE)
    -        .on(BOOK_TO_BOOK_STORE.BOOK_ID.equal(BOOK.ID)))
    -      .on(BOOK.AUTHOR_ID.equal(AUTHOR.ID)));]]></java></code-pair><html>
    -
    -      										<ul>
    -      											<li>See the section about <reference id="conditional-expressions" title="conditional expressions"/> to learn more about the many ways to create <reference class="org.jooq.Condition"/> objects in jOOQ.</li>
    -      											<li>See the section about <reference id="table-expressions" title="table expressions"/> to learn about the various ways of referencing <reference class="org.jooq.Table"/> objects in jOOQ</li>
    -      										</ul>
    -
    -											<h3>JOIN ON KEY, convenience provided by jOOQ</h3>
    -											<p>
    -												Surprisingly, the SQL standard does not allow to formally JOIN on well-known foreign key relationship information. Naturally, when you join BOOK to AUTHOR, you will want to do that based on the BOOK.AUTHOR_ID foreign key to AUTHOR.ID primary key relation. Not being able to do this in SQL leads to a lot of repetitive code, re-writing the same JOIN predicate again and again - especially, when your foreign keys contain more than one column. With jOOQ, when you use <reference id="code-generation" title="code generation"/>, you can use foreign key constraint information in JOIN expressions as such:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT *
    -FROM AUTHOR
    -JOIN BOOK ON BOOK.AUTHOR_ID = AUTHOR.ID]]></sql><java><![CDATA[create.select()
    -      .from(AUTHOR)
    -      .join(BOOK).onKey();]]></java></code-pair><html>
    -
    -      										<p>
    -      											In case of ambiguity, you can also supply field references for your foreign keys, or the generated foreign key reference to the onKey() method.
    -      										</p>
    -      										<p>
    -      											Note that formal support for the Sybase <code>JOIN ON KEY</code> syntax is on the roadmap.
    -      										</p>
    -
    -											<h3>The JOIN USING syntax</h3>
    -											<p>
    -												Most often, you will provide jOOQ with JOIN conditions in the JOIN .. ON clause. SQL supports a different means of specifying how two tables are to be joined. This is the JOIN .. USING clause. Instead of a condition, you supply a set of fields whose names are common to both tables to the left and right of a JOIN operation. This can be useful when your database schema has a high degree of <a href="http://en.wikipedia.org/wiki/Database_normalization">relational normalisation</a>. An example:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[-- Assuming that both tables contain AUTHOR_ID columns
    -SELECT *
    -FROM AUTHOR
    -JOIN BOOK USING (AUTHOR_ID)]]></sql><java><![CDATA[// join(...).using(...)
    -create.select()
    -      .from(AUTHOR)
    -      .join(BOOK).using(AUTHOR.AUTHOR_ID);]]></java></code-pair><html>
    -
    -											<p>
    -												In schemas with high degrees of normalisation, you may also choose to use NATURAL JOIN, which takes no JOIN arguments as it joins using all fields that are common to the table expressions to the left and to the right of the JOIN operator. An example:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[-- Assuming that both tables contain AUTHOR_ID columns
    -SELECT *
    -FROM AUTHOR
    -NATURAL JOIN BOOK]]></sql><java><![CDATA[// naturalJoin(...)
    -create.select()
    -      .from(AUTHOR)
    -      .naturalJoin(BOOK);]]></java></code-pair><html>
    -
    -											<h3>Oracle's partitioned OUTER JOIN</h3>
    -											<p>
    -												Oracle SQL ships with a special syntax available for OUTER JOIN clauses. According to the <a href="http://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_10002.htm#i2196190">Oracle documentation about partitioned outer joins</a> this can be used to fill gaps for simplified analytical calculations. jOOQ only supports putting the PARTITION BY clause to the right of the OUTER JOIN clause. The following example will create at least one record per AUTHOR and per existing value in BOOK.PUBLISHED_IN, regardless if an AUTHOR has actually published a book in that year.
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT *
    -FROM AUTHOR
    -LEFT OUTER JOIN BOOK
    -PARTITION BY (PUBLISHED_IN)
    -ON BOOK.AUTHOR_ID = AUTHOR.ID]]></sql><java><![CDATA[create.select()
    -      .from(AUTHOR)
    -      .leftOuterJoin(BOOK)
    -      .partitionBy(BOOK.PUBLISHED_IN)
    -      .on(BOOK.AUTHOR_ID.equal(AUTHOR.ID));]]></java></code-pair><html>
    -
    -										</html></content>
    -									</section>
    -
    -									<section id="where-clause">
    -										<title>The WHERE clause</title>
    -										<content><html>
    -											<p>
    -												The WHERE clause can be used for JOIN or filter predicates, in order to restrict the data returned by the <reference id="table-expressions" title="table expressions"/> supplied to the previously specified <reference id="from-clause" title="from clause"/> and <reference id="join-clause" title="join clause"/>. Here is an example:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT *
    -FROM BOOK
    -WHERE AUTHOR_ID = 1
    -AND TITLE = '1984']]></sql><java><![CDATA[create.select()
    -      .from(BOOK)
    -      .where(BOOK.AUTHOR_ID.equal(1))
    -      .and(BOOK.TITLE.equal("1984"));]]></java></code-pair><html>
    -
    -											<p>
    -												The above syntax is convenience provided by jOOQ, allowing you to connect the <reference class="org.jooq.Condition"/> supplied in the WHERE clause with another condition using an AND operator. You can of course also create a more complex condition and supply that to the WHERE clause directly (observe the different placing of parentheses). The results will be the same:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT *
    -FROM BOOK
    -WHERE AUTHOR_ID = 1
    -AND TITLE = '1984']]></sql><java><![CDATA[create.select()
    -      .from(BOOK)
    -      .where(BOOK.AUTHOR_ID.equal(1).and(
    -             BOOK.TITLE.equal("1984")));]]></java></code-pair><html>
    -
    -											<p>
    -												You will find more information about creating <reference id="conditional-expressions" title="conditional expressions"/> later in the manual.
    -											</p>
    -										</html></content>
    -									</section>
    -
    -									<section id="connect-by-clause">
    -										<title>The CONNECT BY clause</title>
    -										<content><html>
    -											<p>
    -												The Oracle database knows a very succinct syntax for creating hierarchical queries: the CONNECT BY clause, which is fully supported by jOOQ, including all related functions and pseudo-columns. A more or less formal definition of this clause is given here:
    -											</p>
    -</html><sql>--   SELECT ..
    ---     FROM ..
    ---    WHERE ..
    - CONNECT BY [ NOCYCLE ] condition [ AND condition, ... ] [ START WITH condition ]
    --- GROUP BY ..
    --- ORDER [ SIBLINGS ] BY ..</sql><html>
    -
    -											<p>
    -												An example for an iterative query, iterating through values between 1 and 5 is this:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT LEVEL
    -FROM DUAL
    -CONNECT BY LEVEL <= 5]]></sql><java><![CDATA[// Get a table with elements 1, 2, 3, 4, 5
    -create.select(level())
    -      .connectBy(level().lessOrEqual(5));]]></java></code-pair><html>
    -
    -											<p>
    -												Here's a more complex example where you can recursively fetch directories in your database, and concatenate them to a path:
    -											</p>
    -</html><code-pair>
    -<sql><![CDATA[SELECT 
    -  SUBSTR(SYS_CONNECT_BY_PATH(DIRECTORY.NAME, '/'), 2)
    -FROM DIRECTORY
    -CONNECT BY 
    -  PRIOR DIRECTORY.ID = DIRECTORY.PARENT_ID
    -START WITH DIRECTORY.PARENT_ID IS NULL
    -ORDER BY 1]]></sql><java><![CDATA[.select(
    -   sysConnectByPath(DIRECTORY.NAME, "/").substring(2))
    -.from(DIRECTORY)
    -.connectBy(
    -   prior(DIRECTORY.ID).equal(DIRECTORY.PARENT_ID))
    -.startWith(DIRECTORY.PARENT_ID.isNull())
    -.orderBy(1);]]></java>
    -</code-pair><html>
    -
    -    										<p>
    -    											The output might then look like this
    -   											</p>
    -
    -</html><text>+------------------------------------------------+
    -|substring                                       |
    -+------------------------------------------------+
    -|C:                                              |
    -|C:/eclipse                                      |
    -|C:/eclipse/configuration                        |
    -|C:/eclipse/dropins                              |
    -|C:/eclipse/eclipse.exe                          |
    -+------------------------------------------------+
    -|...21 record(s) truncated...
    -</text><html>
    -
    -											<p>
    -												Some of the supported functions and pseudo-columns are these (available from the <reference id="dsl" title="DSL"/>):
    -											</p>
    -
    -											<ul>
    -												<li>LEVEL</li>
    -												<li>CONNECT_BY_IS_CYCLE</li>
    -												<li>CONNECT_BY_IS_LEAF</li>
    -												<li>CONNECT_BY_ROOT</li>
    -												<li>SYS_CONNECT_BY_PATH</li>
    -												<li>PRIOR</li>
    -											</ul>
    -
    -											<p>
    -												Note that this syntax is also supported in the CUBRID database and might be simulated in other dialects supporting common table expressions in the future.
    -											</p>
    -											
    -											<h3>ORDER SIBLINGS</h3>
    -											<p>
    -												The Oracle database allows for specifying a SIBLINGS keyword in the <reference id="order-by-clause" title="ORDER BY clause"/>. Instead of ordering the overall result, this will only order siblings among each other, keeping the hierarchy intact. An example is given here:
    -											</p>
    -											
    -</html><code-pair>
    -<sql><![CDATA[SELECT DIRECTORY.NAME
    -FROM DIRECTORY
    -CONNECT BY 
    -  PRIOR DIRECTORY.ID = DIRECTORY.PARENT_ID
    -START WITH DIRECTORY.PARENT_ID IS NULL
    -ORDER SIBLINGS BY 1]]></sql><java><![CDATA[.select(DIRECTORY.NAME)
    -.from(DIRECTORY)
    -.connectBy(
    -   prior(DIRECTORY.ID).equal(DIRECTORY.PARENT_ID))
    -.startWith(DIRECTORY.PARENT_ID.isNull())
    -.orderSiblingsBy(1);]]></java>
    -</code-pair><html>
    -											
    -										</html></content>
    -									</section>
    -
    -									<section id="group-by-clause">
    -										<title>The GROUP BY clause</title>
    -										<content><html>
    -											<p>
    -												GROUP BY can be used to create unique groups of data, to form aggregations, to remove duplicates and for other reasons. It will transform your previously defined <reference id="table-expressions" title="set of table expressions"/>, and return only one record per unique group as specified in this clause. For instance, you can group books by BOOK.AUTHOR_ID:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT AUTHOR_ID, COUNT(*)
    -FROM BOOK
    -GROUP BY AUTHOR_ID]]></sql><java><![CDATA[create.select(BOOK.AUTHOR_ID, count())
    -      .from(BOOK)
    -      .groupBy(BOOK.AUTHOR_ID);]]></java></code-pair><html>
    -
    -											<p>
    -												The above example counts all books per author.
    -											</p>
    -											<p>
    -												Note, as defined in the SQL standard, when grouping, you may no longer project any columns that are not a formal part of the GROUP BY clause, or <reference id="aggregate-functions" title="aggregate functions"/>.
    -											</p>
    -											
    -											<h3>MySQL's deviation from the SQL standard</h3>
    -											<p>
    -												MySQL has a peculiar way of not adhering to this standard behaviour. This is documented in the <a href="http://dev.mysql.com/doc/refman/5.6/en/group-by-hidden-columns.html">MySQL manual</a>. In short, with MySQL, you can also project any other field that is not part of the GROUP BY clause. The projected values will just be arbitrary values from within the group. You cannot rely on any ordering. For example:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT AUTHOR_ID, TITLE
    -FROM BOOK
    -GROUP BY AUTHOR_ID]]></sql><java><![CDATA[create.select(BOOK.AUTHOR_ID, BOOK.TITLE)
    -      .from(BOOK)
    -      .groupBy(AUTHOR_ID);]]></java></code-pair><html>
    -
    -											<p>
    -												This will return an arbitrary title per author. jOOQ supports this syntax, as jOOQ is not doing any checks internally, about the consistence of tables/fields/functions that you provide it.
    -											</p>
    -
    -											<h3>Empty GROUP BY clauses</h3>
    -											<p>
    -												jOOQ supports empty <code>GROUP BY ()</code> clause as well. This will result in <reference id="select-statement" title="SELECT statements"/> that return only one record.
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT COUNT(*)
    -FROM BOOK
    -GROUP BY ()]]></sql><java><![CDATA[create.selectCount()
    -      .from(BOOK)
    -      .groupBy();]]></java></code-pair><html>
    -
    -											
    -											<h3>ROLLUP(), CUBE() and GROUPING SETS()</h3>
    -											<p>
    -												Some databases support the SQL standard grouping functions and some extensions thereof. See the manual's section about <reference id="grouping-functions" title="grouping functions"/> for more details.
    -											</p>
    -										</html></content>
    -									</section>
    -
    -									<section id="having-clause">
    -										<title>The HAVING clause</title>
    -										<content><html>
    -											<p>
    -												The HAVING clause is commonly used to further restrict data resulting from a previously issued <reference id="group-by-clause" title="GROUP BY clause"/>. An example, selecting only those authors that have written at least two books:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT AUTHOR_ID, COUNT(*)
    -FROM BOOK
    -GROUP BY AUTHOR_ID
    -HAVING COUNT(*) >= 2]]></sql><java><![CDATA[create.select(BOOK.AUTHOR_ID, count(*))
    -      .from(BOOK)
    -      .groupBy(AUTHOR_ID)
    -      .having(count().greaterOrEqual(2));]]></java></code-pair><html>
    -
    -											<p>
    -												According to the SQL standard, you may omit the GROUP BY clause and still issue a HAVING clause. This will implicitly GROUP BY (). jOOQ also supports this syntax. The following example selects one record, only if there are at least 4 books in the books table:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT COUNT(*)
    -FROM BOOK
    -HAVING COUNT(*) >= 4]]></sql><java><![CDATA[create.select(count(*))
    -      .from(BOOK)
    -      .having(count().greaterOrEqual(4));]]></java></code-pair><html>
    -
    -										</html></content>
    -									</section>
    -
    -									<section id="order-by-clause">
    -										<title>The ORDER BY clause</title>
    -										<content><html>
    -											<p>
    -												Databases are allowed to return data in any arbitrary order, unless you explicitly declare that order in the ORDER BY clause. In jOOQ, this is straight-forward:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT AUTHOR_ID, TITLE
    -FROM BOOK
    -ORDER BY AUTHOR_ID ASC, TITLE DESC]]></sql><java><![CDATA[create.select(BOOK.AUTHOR_ID, BOOK.TITLE)
    -      .from(BOOK)
    -      .orderBy(BOOK.AUTHOR_ID.asc(), BOOK.TITLE.desc());]]></java></code-pair><html>
    -
    -											<p>
    -												Any jOOQ <reference id="column-expressions" title="column expression (or field)"/> can be transformed into an <reference class="org.jooq.SortField"/> by calling the asc() and desc() methods.
    -											</p>
    -
    -											<h3>Ordering by field index</h3>
    -											<p>
    -												The SQL standard allows for specifying integer literals (<reference id="inlined-parameters" title="literals"/>, not <reference id="bind-values" title="bind values"/>!) to reference column indexes from the projection (<reference id="select-clause" title="SELECT clause"/>). This may be useful if you do not want to repeat a lengthy expression, by which you want to order - although most databases also allow for referencing <reference id="aliased-columns" title="aliased column references"/> in the ORDER BY clause. An example of this is given here:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT AUTHOR_ID, TITLE
    -FROM BOOK
    -ORDER BY 1 ASC, 2 DESC]]></sql><java><![CDATA[create.select(BOOK.AUTHOR_ID, BOOK.TITLE)
    -      .from(BOOK)
    -      .orderBy(one().asc(), inline(2).desc());]]></java></code-pair><html>
    -
    -											<p>
    -												Note, how <code>one()</code> is used as a convenience short-cut for <code>inline(1)</code>
    -											</p>
    -
    -											<h3>Ordering and NULLS</h3>
    -											<p>
    -												A few databases support the SQL standard "null ordering" clause in sort specification lists, to define whether <code>NULL</code> values should come first or last in an ordered result.
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT 
    -  BOOK.AUTHOR_ID, 
    -  BOOK.CO_AUTHOR_ID, 
    -  BOOK.TITLE
    -FROM BOOK
    -ORDER BY AUTHOR_ID ASC,
    -         CO_AUTHOR_ID ASC NULLS LAST]]></sql><java><![CDATA[create.select(
    -         BOOK.AUTHOR_ID, 
    -         BOOK.CO_AUTHOR_ID, 
    -         BOOK.TITLE)
    -      .from(BOOK)
    -      .orderBy(BOOK.AUTHOR_ID.asc(),
    -               BOOK.CO_AUTHOR_ID.asc().nullsLast());]]></java></code-pair><html>
    -
    -											<p>
    -												If your database doesn't support this syntax, jOOQ simulates it using a <reference id="case-expressions" title="CASE expression"/> as follows
    -											</p>
    -</html><code-pair>
    -<sql><![CDATA[SELECT 
    -  BOOK.AUTHOR_ID, BOOK.CO_AUTHOR_ID, BOOK.TITLE
    -FROM BOOK
    -ORDER BY AUTHOR_ID ASC,
    -         CASE WHEN CO_AUTHOR_ID IS NULL 
    -              THEN 1 ELSE 0 END ASC,
    -         CO_AUTHOR_ID ASC]]></sql><java><![CDATA[create.select(
    -         BOOK.AUTHOR_ID, 
    -         BOOK.CO_AUTHOR_ID,
    -         BOOK.TITLE)
    -      .from(BOOK)
    -      .orderBy(BOOK.AUTHOR_ID.asc(),
    -               BOOK.CO_AUTHOR_ID.asc().nullsLast());]]></java></code-pair><html>
    -
    -											<h3>Ordering using CASE expressions</h3>
    -											<p>
    -												Using <reference id="case-expressions" title="CASE expressions"/> in SQL ORDER BY clauses is a common pattern, if you want to introduce some sort indirection / sort mapping into your queries. As with SQL, you can add any type of <reference id="column-expressions" title="column expression"/> into your ORDER BY clause. For instance, if you have two favourite books that you always want to appear on top, you could write:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT *
    -FROM BOOK
    -ORDER BY CASE TITLE
    -         WHEN '1984' THEN 0
    -         WHEN 'Animal Farm' THEN 1
    -         ELSE 2 END ASC]]></sql><java><![CDATA[create.select()
    -      .from(BOOK)
    -      .orderBy(decode().value(BOOK.TITLE)
    -                       .when("1984", 0)
    -                       .when("Animal Farm", 1)
    -                       .otherwise(2).asc());]]></java></code-pair><html>
    -
    -											<p>
    -												But writing these things can become quite verbose. jOOQ supports a convenient syntax for specifying sort mappings. The same query can be written in jOOQ as such:
    -											</p>
    -
    -</html><java><![CDATA[create.select()
    -      .from(BOOK)
    -      .orderBy(BOOK.TITLE.sortAsc("1984", "Animal Farm"));]]></java><html>
    -
    -											<p>
    -												More complex sort indirections can be provided using a Map:
    -											</p>
    -
    -</html><java><![CDATA[create.select()
    -      .from(BOOK)
    -      .orderBy(BOOK.TITLE.sort(new HashMap<String, Integer>() {{
    -          put("1984", 1);
    -          put("Animal Farm", 13);
    -          put("The jOOQ book", 10);
    -      }}));]]></java><html>
    -
    -      										<p>
    -      											Of course, you can combine this feature with the previously discussed NULLS FIRST / NULLS LAST feature. So, if in fact these two books are the ones you like least, you can put all NULLS FIRST (all the other books):
    -      										</p>
    -
    -</html><java><![CDATA[create.select()
    -      .from(BOOK)
    -      .orderBy(BOOK.TITLE.sortAsc("1984", "Animal Farm").nullsFirst());]]></java><html>
    -
    -											<h3>jOOQ's understanding of SELECT .. ORDER BY</h3>
    -											<p>
    -												The SQL standard defines that a "query expression" can be ordered, and that query expressions can contain <reference id="union-clause" title="UNION, INTERSECT and EXCEPT clauses"/>, whose subqueries cannot be ordered. While this is defined as such in the SQL standard, many databases allowing for the non-standard <reference id="limit-clause" title="LIMIT clause"/> in one way or another, do not adhere to this part of the SQL standard. Hence, jOOQ allows for ordering all SELECT statements, regardless whether they are constructed as a part of a UNION or not. Corner-cases are handled internally by jOOQ, by introducing synthetic subselects to adhere to the correct syntax, where this is needed.
    -											</p>
    -											
    -											
    -											<h3>Oracle's ORDER SIBLINGS BY clause</h3>
    -											<p>
    -												jOOQ also supports Oracle's SIBLINGS keyword to be used with ORDER BY clauses for <reference id="connect-by-clause" title="hierarchical queries using CONNECT BY"/>
    -											</p>
    -										</html></content>
    -									</section>
    -
    -									<section id="limit-clause">
    -										<title>The LIMIT .. OFFSET clause</title>
    -										<content><html>
    -											<p>
    -												While being extremely useful for every application that does paging, or just to limit result sets to reasonable sizes, this clause is not yet part of any SQL standard (up until SQL:2008). Hence, there exist a variety of possible implementations in various SQL dialects, concerning this limit clause. jOOQ chose to implement the LIMIT .. OFFSET clause as understood and supported by MySQL, H2, HSQLDB, Postgres, and SQLite. Here is an example of how to apply limits with jOOQ:
    -											</p>
    -
    -</html><java><![CDATA[create.select().from(BOOK).limit(1).offset(2);]]></java><html>
    -
    -											<p>
    -												This will limit the result to 1 books starting with the 2nd book (starting at offset 0!). limit() is supported in all dialects, offset() in all but Sybase ASE, which has no reasonable means to simulate it. This is how jOOQ simulates the above query in various SQL dialects:
    -											</p>
    -
    -</html><sql><![CDATA[-- MySQL, H2, HSQLDB, Postgres, and SQLite
    -SELECT * FROM BOOK LIMIT 1 OFFSET 2
    -
    --- CUBRID supports a MySQL variant of the LIMIT .. OFFSET clause
    -SELECT * FROM BOOK LIMIT 2, 1
    -
    --- Derby
    -SELECT * FROM BOOK OFFSET 2 ROWS FETCH NEXT 1 ROWS ONLY
    -
    --- Ingres
    -SELECT * FROM BOOK OFFSET 2 FETCH FIRST 1 ROWS ONLY
    -
    --- Firebird
    -SELECT * FROM BOOK ROWS 2 TO 3
    -
    --- Sybase SQL Anywhere
    -SELECT TOP 1 ROWS START AT 3 * FROM BOOK
    -
    --- DB2 (without OFFSET)
    -SELECT * FROM BOOK FETCH FIRST 1 ROWS ONLY
    -
    --- Sybase ASE, SQL Server (without OFFSET)
    -SELECT TOP 1 * FROM BOOK
    -
    --- DB2 (with OFFSET), SQL Server (with OFFSET), Oracle (actual query may vary)
    -SELECT * FROM (
    -  SELECT LIMIT_98843777.*, ROW_NUMBER() OVER (ORDER BY ID ASC) AS ROWNUM_98843777
    -  FROM (
    -    SELECT TOP 100 PERCENT *
    -    FROM BOOK
    -    ORDER BY ID ASC
    -  ) AS LIMIT_98843777
    -) AS OUTER_LIMIT_98843777
    -WHERE ROWNUM_98843777 > 1
    -AND ROWNUM_98843777 <= 3
    -]]></sql><html>
    -
    -											<p>
    -												As you can see, jOOQ will take care of the incredibly painful ROW_NUMBER() OVER() (or ROWNUM for Oracle) filtering in subselects for you, you'll just have to write limit(1).offset(2) in any dialect.
    -											</p>
    -
    -											<h3>SQL Server's ORDER BY, TOP and subqueries</h3>
    -											<p>
    -												As can be seen in the above example, writing correct SQL can be quite tricky, depending on the SQL dialect. For instance, with SQL Server, you cannot have an ORDER BY clause in a subquery, unless you also have a TOP clause. This is illustrated by the fact that jOOQ renders a TOP 100 PERCENT clause for you. The same applies to the fact that ROW_NUMBER() OVER() needs an ORDER BY windowing clause, even if you don't provide one to the jOOQ query. By default, jOOQ adds ordering by the first column of your projection.
    -											</p>
    -										</html></content>
    -									</section>
    -
    -									<section id="for-update-clause">
    -										<title>The FOR UPDATE clause</title>
    -										<content><html>
    -											<p>
    -												For inter-process synchronisation and other reasons, you may choose to use the SELECT .. FOR UPDATE clause to indicate to the database, that a set of cells or records should be locked by a given transaction for subsequent updates. With jOOQ, this can be achieved as such:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT *
    -FROM BOOK
    -WHERE ID = 3
    -FOR UPDATE]]></sql><java><![CDATA[create.select()
    -      .from(BOOK)
    -      .where(BOOK.ID.equal(3))
    -      .forUpdate();]]></java></code-pair><html>
    -
    -											<p>
    -												The above example will produce a record-lock, locking the whole record for updates. Some databases also support cell-locks using FOR UPDATE OF ..
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT *
    -FROM BOOK
    -WHERE ID = 3
    -FOR UPDATE OF TITLE]]></sql><java><![CDATA[create.select()
    -      .from(BOOK)
    -      .where(BOOK.ID.equal(3))
    -      .forUpdate().of(BOOK.TITLE);]]></java></code-pair><html>
    -
    -											<p>
    -												Oracle goes a bit further and also allows to specify the actual locking behaviour. It features these additional clauses, which are all supported by jOOQ:
    -											</p>
    -											<ul>
    -												<li><code>FOR UPDATE NOWAIT</code>: This is the default behaviour. If the lock cannot be acquired, the query fails immediately</li>
    -												<li><code>FOR UPDATE WAIT n</code>: Try to wait for [n] seconds for the lock acquisition. The query will fail only afterwards</li>
    -												<li><code>FOR UPDATE SKIP LOCKED</code>: This peculiar syntax will skip all locked records. This is particularly useful when implementing queue tables with multiple consumers</li>
    -											</ul>
    -											<p>
    -												With jOOQ, you can use those Oracle extensions as such:
    -											</p>
    -
    -</html><java><![CDATA[create.select().from(BOOK).where(BOOK.ID.equal(3)).forUpdate().nowait();
    -create.select().from(BOOK).where(BOOK.ID.equal(3)).forUpdate().wait(5);
    -create.select().from(BOOK).where(BOOK.ID.equal(3)).forUpdate().skipLocked();]]></java><html>
    -
    -											<h3>FOR UPDATE in CUBRID and SQL Server</h3>
    -											<p>
    -												The SQL standard specifies a <code>FOR UPDATE</code> clause to be applicable for cursors. Most databases interpret this as being applicable for all <code>SELECT</code> statements. An exception to this rule are the CUBRID and SQL Server databases, that do not allow for any <code>FOR UPDATE</code> clause in a regular SQL <code>SELECT</code> statement. jOOQ simulates the <code>FOR UPDATE</code> behaviour, by locking record by record with JDBC. JDBC allows for specifying the flags <code>TYPE_SCROLL_SENSITIVE</code>, <code>CONCUR_UPDATABLE</code> for any statement, and then using ResultSet.updateXXX() methods to produce a cell-lock / row-lock. Here's a simplified example in JDBC:
    -											</p>
    -</html><java><![CDATA[PreparedStatement stmt = connection.prepareStatement(
    -  "SELECT * FROM author WHERE id IN (3, 4, 5)",
    -  ResultSet.TYPE_SCROLL_SENSITIVE,
    -  ResultSet.CONCUR_UPDATABLE);
    -ResultSet rs = stmt.executeQuery();
    -
    -while (rs.next()) {
    -  // UPDATE the primary key for row-locks, or any other columns for cell-locks
    -  rs.updateObject(1, rs.getObject(1));
    -  rs.updateRow();
    -
    -  // Do more stuff with this record
    -}]]></java><html>
    -
    -											<p>
    -												The main drawback of this approach is the fact that the database has to maintain a scrollable cursor, whose records are locked one by one. This can cause a major risk of deadlocks or race conditions if the JDBC driver can recover from the unsuccessful locking, if two Java threads execute the following statements:
    -											</p>
    -
    -</html><sql><![CDATA[-- thread 1
    -SELECT * FROM author ORDER BY id ASC;
    -
    --- thread 2
    -SELECT * FROM author ORDER BY id DESC;]]></sql><html>
    -
    -											<p>
    -												So use this technique with care, possibly only ever locking single rows!
    -											</p>
    -
    -											<h3>Pessimistic (shared) locking with the <code>FOR SHARE</code> clause</h3>
    -											<p>
    -												Some databases (MySQL, Postgres) also allow to issue a non-exclusive lock explicitly using a <code>FOR SHARE</code> clause. This is also supported by jOOQ
    -											</p>
    -
    -											<h3>Optimistic locking in jOOQ</h3>
    -											<p>
    -												Note, that jOOQ also supports optimistic locking, if you're doing simple CRUD. This is documented in the section's manual about <reference id="optimistic-locking" title="optimistic locking"/>.
    -											</p>
    -										</html></content>
    -									</section>
    -
    -									<section id="union-clause">
    -										<title>UNION, INTERSECTION and EXCEPT</title>
    -										<content><html>
    -											<p>
    -												SQL allows to perform set operations as understood in standard set theory on result sets. These operations include unions, intersections, subtractions. For two subselects to be combinable by such a set operator, each subselect must return a <reference id="table-expressions" title="table expression"/> of the same degree and type.
    -											</p>
    -											
    -											<h3>UNION and UNION ALL</h3>
    -											<p>
    -												These operators combine two results into one. While <code>UNION</code> removes all duplicate records resulting from this combination, <code>UNION ALL</code> leaves subselect results as they are. Typically, you should prefer <code>UNION ALL</code> over <code>UNION</code>, if you don't really need to remove duplicates. The following example shows how to use such a <code>UNION</code> operation in jOOQ.
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT * FROM BOOK WHERE ID = 3
    -UNION ALL
    -SELECT * FROM BOOK WHERE ID = 5]]></sql><java><![CDATA[create.selectFrom(BOOK).where(BOOK.ID.equal(3))
    -      .unionAll(
    -create.selectFrom(BOOK).where(BOOK.ID.equal(5)));]]></java></code-pair><html>
    -											
    -											<h3>INTERSECT [ ALL ] and EXCEPT [ ALL ]</h3>
    -											<p>
    -												<code>INTERSECT</code> is the operation that produces only those values that are returned by both subselects. <code>EXCEPT</code> is the operation that returns only those values that are returned exclusively in the first subselect. Both operators will remove duplicates from their results. The SQL standard allows to specify the <code>ALL</code> keyword for both of these operators as well, but this is hardly supported in any database. jOOQ does not support <code>INTERSECT ALL</code>, <code>EXEPT ALL</code> operations either. 
    -											</p>
    -											
    -											<h3>jOOQ's set operators and how they're different from standard SQL</h3>
    -											<p>
    -												As previously mentioned in the manual's section about the <reference id="order-by-clause" title="ORDER BY clause"/>, jOOQ has slightly changed the semantics of these set operators. While in SQL, a subselect may not contain any <reference id="order-by-clause" title="ORDER BY clause"/> or <reference id="limit-clause" title="LIMIT clause"/> (unless you wrap the subselect into a <reference id="nested-selects" title="nested SELECT"/>), jOOQ allows you to do so. In order to select both the youngest and the oldest author from the database, you can issue the following statement with jOOQ (rendered to the MySQL dialect):
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[  (SELECT * FROM AUTHOR 
    -   ORDER BY DATE_OF_BIRTH ASC LIMIT 1)
    -UNION
    -  (SELECT * FROM AUTHOR 
    -   ORDER BY DATE_OF_BIRTH DESC LIMIT 1)]]></sql><java><![CDATA[create.selectFrom(AUTHOR)
    -      .orderBy(AUTHOR.DATE_OF_BIRTH.asc()).limit(1)
    -      .union(
    -create.selectFrom(AUTHOR)
    -      .orderBy(AUTHOR.DATE_OF_BIRTH.desc()).limit(1));]]></java></code-pair><html>
    -		
    -											<h3>Projection typesafety for degrees between 1 and {max-row-degree}</h3>
    -											<p>
    -												Two subselects that are combined by a set operator are required to be of the same degree and, in most databases, also of the same type. jOOQ 3.0's introduction of <reference id="record-n" title="Typesafe Record[N] types"/> helps compile-checking these constraints:
    -											</p>
    -											
    -</html><java><![CDATA[// Some sample SELECT statements
    -Select<Record2<Integer, String>>  s1 = select(BOOK.ID, BOOK.TITLE).from(BOOK);
    -Select<Record1<Integer>>          s2 = selectOne();
    -Select<Record2<Integer, Integer>> s3 = select(one(), zero());
    -Select<Record2<Integer, String>>  s4 = select(one(), inline("abc"));
    -
    -// Let's try to combine them:
    -s1.union(s2); // Doesn't compile because of a degree mismatch. Expected: Record2<...>, got: Record1<...>
    -s1.union(s3); // Doesn't compile because of a type mismatch. Expected: <Integer, String>, got: <Integer, Integer>
    -s1.union(s4); // OK. The two Record[N] types match]]></java></content>
    -									</section>
    -
    -									<section id="oracle-hints">
    -										<title>Oracle-style hints</title>
    -										<content><html>
    -											<p>
    -												If you are closely coupling your application to an Oracle (or CUBRID) database,	you might need to be able to pass hints of the form <code>/*+HINT*/</code> with your SQL statements to the Oracle database. For example:
    -											</p>
    -
    -</html><sql>SELECT /*+ALL_ROWS*/ FIRST_NAME, LAST_NAME
    -  FROM AUTHOR</sql><html>
    -
    -				  							<p>
    -				  								This can be done in jOOQ using the <code>.hint()</code> clause in your SELECT statement:
    -			  								</p>
    -
    -</html><java>create.select(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -      .hint("/*+ALL_ROWS*/")
    -      .from(AUTHOR);</java><html>
    -
    -											<p>
    -												Note that you can pass any string in the <code>.hint()</code> clause. If you use that clause, the passed string will always be put in between the <code>SELECT [DISTINCT]</code> keywords and the actual projection list. This can be useful in other databases too, such as MySQL, for instance:
    -											</p>
    -											
    -</html><code-pair>
    -<sql><![CDATA[SELECT SQL_CALC_FOUND_ROWS field1, field2
    -FROM table1
    -]]></sql><java><![CDATA[create.select(field1, field2)
    -       .hint("SQL_CALC_FOUND_ROWS")
    -       .from(table1)]]></java>
    -</code-pair><html>
    -										</html></content>
    -									</section>
    -									
    -									<section id="select-lexical-vs-logical-order">
    -										<title>Lexical and logical SELECT clause order</title>
    -										<content><html>
    -											<p>
    -												SQL has a lexical and a logical order of <code>SELECT</code> clauses. The lexical order of <code>SELECT</code> clauses is inspired by the English language. As SQL statements are commands for the database, it is natural to express a statement in an imperative tense, such as "SELECT this and that!".
    -											</p>
    -											
    -											<h3>Logical SELECT clause order</h3>
    -											<p>
    -												The logical order of <code>SELECT</code> clauses, however, does not correspond to the syntax. In fact, the logical order is this:
    -											</p>
    -											
    -											<ul>
    -												<li><reference id="from-clause" title="The FROM clause"/>: First, all data sources are defined and joined</li>
    -												<li><reference id="where-clause" title="The WHERE clause"/>: Then, data is filtered as early as possible</li>
    -												<li><reference id="connect-by-clause" title="The CONNECT BY clause"/>: Then, data is traversed iteratively or recursively, to produce new tuples</li>
    -												<li><reference id="group-by-clause" title="The GROUP BY clause"/>: Then, data is reduced to groups, possibly producing new tuples if <reference id="grouping-functions" title="grouping functions like ROLLUP(), CUBE(), GROUPING SETS()"/> are used</li>
    -												<li><reference id="having-clause" title="The HAVING clause"/>: Then, data is filtered again</li>
    -												<li><reference id="select-clause" title="The SELECT clause"/>: Only now, the projection is evaluated. In case of a <code>SELECT DISTINCT</code> statement, data is further reduced to remove duplicates</li>
    -												<li><reference id="union-clause" title="The UNION clause"/>: Optionally, the above is repeated for several <code>UNION</code>-connected subqueries. Unless this is a <code>UNION ALL</code> clause, data is further reduced to remove duplicates</li>
    -												<li><reference id="order-by-clause" title="The ORDER BY clause"/>: Now, all remaining tuples are ordered</li>
    -												<li><reference id="limit-clause" title="The LIMIT clause"/>: Then, a paging view is created for the ordered tuples</li>
    -												<li><reference id="for-update-clause" title="The FOR UPDATE clause"/>: Finally, pessimistic locking is applied</li>
    -											</ul>
    -											
    -											<p>
    -												The <a href="http://msdn.microsoft.com/en-us/library/ms189499.aspx">SQL Server documentation</a> also explains this, with slightly different clauses:
    -											</p>
    -											
    -											<ul>
    -												<li><code>FROM</code></li>
    -												<li><code>ON</code></li>
    -												<li><code>JOIN</code></li>
    -												<li><code>WHERE</code></li>
    -												<li><code>GROUP BY</code></li>
    -												<li><code>WITH CUBE</code> or <code>WITH ROLLUP</code></li>
    -												<li><code>HAVING</code></li>
    -												<li><code>SELECT</code></li>
    -												<li><code>DISTINCT</code></li>
    -												<li><code>ORDER BY</code></li>
    -												<li><code>TOP</code></li>
    -											</ul>
    -											
    -											<p>
    -												As can be seen, databases have to logically reorder a SQL statement in order to determine the best execution plan. 
    -											</p>
    -											
    -											<h3>Alternative syntaxes: LINQ, SLICK</h3>
    -											<p>
    -											    Some "higher-level" abstractions, such as C#'s LINQ or Scala's SLICK try to inverse the lexical order of <code>SELECT</code> clauses to what appears to be closer to the logical order. The obvious advantage of moving the <code>SELECT</code> clause to the end is the fact that the projection type, which is the record type returned by the <code>SELECT</code> statement can be re-used more easily in the target environment of the internal domain specific language.
    -											</p>
    -											
    -											<p>
    -												A LINQ example:
    -											</p>
    -</html><java><![CDATA[// LINQ-to-SQL looks somewhat similar to SQL
    -// AS clause    // FROM clause
    -From p          In db.Products
    -
    -// WHERE clause
    -Where p.UnitsInStock <= p.ReorderLevel AndAlso Not p.Discontinued
    -
    -// SELECT clause
    -Select p]]></java><html>											
    -											
    -											<p> 
    -											    A SLICK example:
    -											</p>
    -											
    -</html><scala><![CDATA[// "for" is the "entry-point" to the DSL
    -val q = for {
    -
    -    // FROM clause   WHERE clause
    -    c <- Coffees     if c.supID === 101
    -
    -// SELECT clause and projection to a tuple
    -} yield (c.name, c.price)]]></scala><html>
    -
    -											<p>
    -												While this looks like a good idea at first, it only complicates translation to more advanced SQL statements while impairing readability for those users that are used to writing SQL. jOOQ is designed to look just like SQL. This is specifically true for SLICK, which not only changed the <code>SELECT</code> clause order, but also heavily "integrated" SQL clauses with the Scala language.
    -											</p>
    -											<p>
    -												For these reasons, the jOOQ DSL API is modelled in SQL's lexical order.
    -											</p>
    -										</html></content>
    -									</section>
    -								</sections>
    -							</section>
    -
    -							<section id="insert-statement">
    -								<title>The INSERT statement</title>
    -								<content><html>
    -									<p>
    -										The <code>INSERT</code> statement is used to insert new records into a database table. Records can either be supplied using a <code>VALUES()</code> constructor, or a <code>SELECT</code> statement. jOOQ supports both types of <code>INSERT</code> statements. An example of an <code>INSERT</code> statement using a <code>VALUES()</code> constructor is given here:
    -									</p>
    -
    -
    -</html><code-pair>
    -<sql>INSERT INTO AUTHOR 
    -       (ID, FIRST_NAME, LAST_NAME)
    -VALUES (100, 'Hermann', 'Hesse');</sql><java>create.insertInto(AUTHOR,
    -        AUTHOR.ID, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -      .values(100, "Hermann", "Hesse");</java></code-pair><html>
    -
    -									<p>
    -										Note that for explicit degrees up to {max-row-degree}, the <code>VALUES()</code> constructor provides additional typesafety. The following example illustrates this:
    -									</p>
    -
    -</html><java><![CDATA[InsertValuesStep3<AuthorRecord, Integer, String, String> step = 
    -  create.insertInto(AUTHOR, AUTHOR.ID, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME);
    -    step.values("A", "B", "C");
    -         // ^^^ Doesn't compile, the expected type is Integer]]></java><html>
    -									<h3>INSERT multiple rows with the VALUES() constructor</h3>
    -									<p>
    -										The SQL standard specifies that multiple rows can be supplied to the VALUES() constructor in an INSERT statement. Here's an example of a multi-record INSERT
    -									</p>
    -</html><code-pair>
    -<sql>INSERT INTO AUTHOR
    -       (ID, FIRST_NAME, LAST_NAME)
    -VALUES (100, 'Hermann', 'Hesse'),
    -       (101, 'Alfred', 'Döblin');</sql><java>create.insertInto(AUTHOR,
    -        AUTHOR.ID, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -      .values(100, "Hermann", "Hesse")
    -      .values(101, "Alfred", "Döblin");</java></code-pair><html>
    -
    -									<p>
    -										jOOQ tries to stay close to actual SQL. In detail, however, Java's expressiveness is limited. That's why the values() clause is repeated for every record in multi-record inserts. 
    -									</p>
    -									<p> 
    -										Some RDBMS do not support inserting several records in a single statement. In those cases, jOOQ simulates multi-record INSERTs using the following SQL:
    -									</p>
    -
    -</html><code-pair>
    -<sql>INSERT INTO AUTHOR
    -    (ID, FIRST_NAME, LAST_NAME)
    -SELECT 100, 'Hermann', 'Hesse' FROM DUAL UNION ALL
    -SELECT 101, 'Alfred', 'Döblin' FROM DUAL;</sql><java>create.insertInto(AUTHOR,
    -        AUTHOR.ID, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -      .values(100, "Hermann", "Hesse")
    -      .values(101, "Alfred", "Döblin");
    -</java></code-pair><html>
    -
    -									<h3>INSERT using jOOQ's alternative syntax</h3>
    -									<p>
    -										MySQL (and some other RDBMS) allow for using a non-SQL-standard, UPDATE-like syntax for INSERT statements. This is also supported in jOOQ, should you prefer that syntax. The above INSERT statement can also be expressed as follows:
    -									</p>
    -
    -</html><java>create.insertInto(AUTHOR)
    -      .set(AUTHOR.ID, 100)
    -      .set(AUTHOR.FIRST_NAME, "Hermann")
    -      .set(AUTHOR.LAST_NAME, "Hesse")
    -      .newRecord()
    -      .set(AUTHOR.ID, 101)
    -      .set(AUTHOR.FIRST_NAME, "Alfred")
    -      .set(AUTHOR.LAST_NAME, "Döblin");</java><html>
    -      
    -									<p>
    -										As you can see, this syntax is a bit more verbose, but also more readable, as every field can be matched with its value. Internally, the two syntaxes are strictly equivalent.
    -									</p>
    -
    -									<h3>MySQL's INSERT .. ON DUPLICATE KEY UPDATE</h3>
    -									<p>
    -										The MySQL database supports a very convenient way to INSERT or UPDATE a record. This is a non-standard extension to the SQL syntax, which is supported by jOOQ and simulated in other RDBMS, where this is possible (i.e. if they support the SQL standard <reference id="merge-statement" title="MERGE statement"/>). Here is an example how to use the ON DUPLICATE KEY UPDATE clause:
    -									</p>
    -									
    -</html><java>// Add a new author called "Koontz" with ID 3.
    -// If that ID is already present, update the author's name
    -create.insertInto(AUTHOR, AUTHOR.ID, AUTHOR.LAST_NAME)
    -      .values(3, "Koontz")
    -      .onDuplicateKeyUpdate()
    -      .set(AUTHOR.LAST_NAME, "Koontz");</java><html>
    -
    -									<h3>The synthetic ON DUPLICATE KEY IGNORE clause</h3>
    -							
    -									<p>
    -										The MySQL database also supports an INSERT IGNORE INTO clause. This is supported by jOOQ using the more convenient SQL syntax variant of ON DUPLICATE KEY IGNORE, which can be equally simulated in other databases using a <reference id="merge-statement" title="MERGE statement"/>:
    -									</p>
    -									
    -</html><java>// Add a new author called "Koontz" with ID 3.
    -// If that ID is already present, ignore the INSERT statement
    -create.insertInto(AUTHOR, AUTHOR.ID, AUTHOR.LAST_NAME)
    -      .values(3, "Koontz")
    -      .onDuplicateKeyIgnore();</java><html>
    -
    -      								<h3>Postgres's INSERT .. RETURNING</h3>
    -									<p>
    -										The Postgres database has native support for an INSERT .. RETURNING clause. This is a very powerful concept that is simulated for all other dialects using JDBC's <reference class="java.sql.Statement" anchor="#getGeneratedKeys()" title="getGeneratedKeys()"/> method. Take this example:
    -									</p>
    -
    -</html><java><![CDATA[// Add another author, with a generated ID
    -Record<?> record =
    -create.insertInto(AUTHOR, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -      .values("Charlotte", "Roche")
    -      .returning(AUTHOR.ID)
    -      .fetchOne();
    -
    -System.out.println(record.getValue(AUTHOR.ID));
    -
    -// For some RDBMS, this also works when inserting several values
    -// The following should return a 2x2 table
    -Result<?> result =
    -create.insertInto(AUTHOR, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -      .values("Johann Wolfgang", "von Goethe")
    -      .values("Friedrich", "Schiller")
    -      // You can request any field. Also trigger-generated values
    -      .returning(AUTHOR.ID, AUTHOR.CREATION_DATE)
    -      .fetch();]]></java><html>
    -
    -		      						<p>
    -		      							Some databases have poor support for returning generated keys after INSERTs. In those cases, jOOQ might need to issue another <reference id="select-statement" title="SELECT statement"/> in order to fetch an @@identity value. Be aware, that this can lead to race-conditions in those databases that cannot properly return generated ID values. For more information, please consider the jOOQ Javadoc for the returning() clause.
    -		      						</p>
    -
    -									<h3>The INSERT SELECT statement</h3>
    -							
    -									<p>
    -										In some occasions, you may prefer the INSERT SELECT syntax, for instance, when you copy records from one table to another:
    -									</p>
    -									
    -</html><java>create.insertInto(AUTHOR_ARCHIVE)
    -      .select(create.selectFrom(AUTHOR).where(AUTHOR.DECEASED.isTrue()));</java></content>
    -							</section>
    -
    -							<section id="update-statement">
    -								<title>The UPDATE statement</title>
    -								<content><html>
    -									<p>
    -										The UPDATE statement is used to modify one or several pre-existing records in a database table. UPDATE statements are only possible on single tables. Support for multi-table updates will be implemented in the near future. An example update query is given here:
    -									</p>
    -
    -</html><code-pair>
    -<sql>UPDATE AUTHOR
    -   SET FIRST_NAME = 'Hermann',
    -       LAST_NAME = 'Hesse'
    - WHERE ID = 3;</sql><java>create.update(AUTHOR)
    -      .set(AUTHOR.FIRST_NAME, "Hermann")
    -      .set(AUTHOR.LAST_NAME, "Hesse")
    -      .where(AUTHOR.ID.equal(3));</java>
    -</code-pair><html>
    -
    -									<p>
    -										Most databases allow for using scalar subselects in UPDATE statements in one way or another. jOOQ models this through a <code>set(Field&lt;T>, Select&lt;? extends Record1&lt;T>>) method in the UPDATE DSL API:</code>
    -									</p>
    -
    -</html><code-pair>
    -<sql>UPDATE AUTHOR
    -   SET FIRST_NAME = (
    -         SELECT FIRST_NAME
    -         FROM PERSON
    -         WHERE PERSON.ID = AUTHOR.ID
    -       ),
    - WHERE ID = 3;</sql><java>create.update(AUTHOR)
    -      .set(AUTHOR.FIRST_NAME, 
    -         select(PERSON.FIRST_NAME)
    -        .from(PERSON)
    -        .where(PERSON.ID.equal(AUTHOR.ID))
    -      )
    -      .where(AUTHOR.ID.equal(3));</java>
    -</code-pair><html>
    -
    -
    -									<h3>Using row value expressions in an UPDATE statement</h3>
    -									<p>
    -										jOOQ supports formal <reference id="row-value-expressions" title="row value expressions"/> in various contexts, among which the UPDATE statement. Only one row value expression can be updated at a time. Here's an example:
    -									</p>
    -									
    -</html><code-pair>
    -<sql>UPDATE AUTHOR
    -   SET (FIRST_NAME, LAST_NAME) = 
    -       ('Hermann',  'Hesse')
    - WHERE ID = 3;</sql><java>create.update(AUTHOR)
    -      .set(row(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME),
    -           row("Herman",          "Hesse"))
    -      .where(AUTHOR.ID.equal(3));</java>
    -</code-pair><html>
    -
    -									<p>
    -										This can be particularly useful when using subselects:
    -									</p>
    -
    -</html><code-pair>
    -<sql>UPDATE AUTHOR
    -   SET (FIRST_NAME, LAST_NAME) = (
    -         SELECT PERSON.FIRST_NAME, PERSON.LAST_NAME
    -         FROM PERSON
    -         WHERE PERSON.ID = AUTHOR.ID
    -       )
    - WHERE ID = 3;</sql><java>create.update(AUTHOR)
    -      .set(row(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME),
    -           select(PERSON.FIRST_NAME, PERSON.LAST_NAME)
    -          .from(PERSON)
    -          .where(PERSON.ID.equal(AUTHOR.ID))
    -      )
    -      .where(AUTHOR.ID.equal(3));</java>
    -</code-pair><html>
    -
    -									<p>
    -										The above row value expressions usages are completely typesafe.
    -									</p>
    -									
    -									<h3>UPDATE .. RETURNING</h3>
    -									<p>
    -										The Firebird and Postgres databases support a <code>RETURNING</code> clause on their <code>UPDATE</code> statements, similar as the <code>RETURNING</code> clause in <reference id="insert-statement" title="INSERT statements"/>. This is useful to fetch trigger-generated values in one go. An example is given here:
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[-- Fetch a trigger-generated value
    -UPDATE BOOK
    -SET TITLE = 'Animal Farm'
    -WHERE ID = 5
    -RETURNING UPDATE_COUNT]]></sql><java><![CDATA[int count = create.update(BOOK)
    -                  .set(BOOK.TITLE, "Animal Farm")
    -                  .where(BOOK.ID.equal(5))
    -                  .returning(BOOK.UPDATE_COUNT)
    -                  .fetchOne().getValue(BOOK.UPDATE_COUNT);]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										The <code>UPDATE .. RETURNING</code> clause is currently not simulated for other databases. Future versions might execute an additional <reference id="select-statement" title="SELECT statement"/> to fetch results.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="delete-statement">
    -								<title>The DELETE statement</title>
    -								<content><html>
    -									<p>
    -										The DELETE statement physically removes records from a database table. DELETE statements are only possible on single tables. Support for multi-table deletes will be implemented in the near future. An example delete query is given here:
    -									</p>
    -
    -</html><code-pair>
    -<sql>DELETE AUTHOR
    - WHERE ID = 100;</sql><java>create.delete(AUTHOR)
    -      .where(AUTHOR.ID.equal(100));</java>
    -</code-pair><html>
    -
    -								</html></content>
    -							</section>
    -
    -							<section id="merge-statement">
    -								<title>The MERGE statement</title>
    -								<content><html>
    -									<p>
    -										The MERGE statement is one of the most advanced standardised SQL constructs, which is supported by DB2, HSQLDB, Oracle, SQL Server and Sybase (MySQL has the similar INSERT .. ON DUPLICATE KEY UPDATE construct)
    -									</p>
    -									<p>
    -										The point of the standard MERGE statement is to take a TARGET table, and merge (INSERT, UPDATE) data from a SOURCE table into it. DB2, Oracle, SQL Server and Sybase also allow for DELETING some data and for adding many additional clauses. With jOOQ {jooq-version}, only Oracle's MERGE extensions are supported. Here is an example:
    -									</p>
    -
    -</html><code-pair>
    -<sql>-- Check if there is already an author called 'Hitchcock'
    --- If there is, rename him to John. If there isn't add him.
    -MERGE INTO AUTHOR
    -USING (SELECT 1 FROM DUAL)
    -ON (LAST_NAME = 'Hitchcock')
    -WHEN MATCHED THEN UPDATE SET FIRST_NAME = 'John'
    -WHEN NOT MATCHED THEN INSERT (LAST_NAME) VALUES ('Hitchcock')</sql><java>create.mergeInto(AUTHOR)
    -      .using(create().selectOne())
    -      .on(AUTHOR.LAST_NAME.equal("Hitchcock"))
    -      .whenMatchedThenUpdate()
    -      .set(AUTHOR.FIRST_NAME, "John")
    -      .whenNotMatchedThenInsert(AUTHOR.LAST_NAME)
    -      .values("Hitchcock");
    -
    -</java></code-pair><html>
    -
    -		                            <h3>MERGE Statement (H2-specific syntax)</h3>
    -									<p>
    -									    The H2 database ships with a somewhat less powerful but a little more intuitive syntax for its own version of the MERGE statement. An example more or less equivalent to the previous one can be seen here:
    -									</p>
    -									
    -</html><code-pair>
    -<sql>-- Check if there is already an author called 'Hitchcock'
    --- If there is, rename him to John. If there isn't add him.
    -
    -MERGE INTO AUTHOR (FIRST_NAME, LAST_NAME)
    -KEY (LAST_NAME)
    -VALUES ('John', 'Hitchcock')</sql><java>create.mergeInto(AUTHOR,
    -                 AUTHOR.FIRST_NAME,
    -                 AUTHOR.LAST_NAME)
    -      .key(AUTHOR.LAST_NAME)
    -      .values("John", "Hitchcock")
    -      .execute();
    -</java></code-pair><html>
    -
    -		                            <p>
    -		                                This syntax can be fully simulated by jOOQ for all other databases that support the SQL standard. For more information about the H2 MERGE syntax, see the documentation here:<br/>
    -		                                <a href="http://www.h2database.com/html/grammar.html#merge">http://www.h2database.com/html/grammar.html#merge</a>
    -		                            </p>
    -								
    -									<h3>Typesafety of VALUES() for degrees up to {max-row-degree}</h3>
    -									<p>
    -										Much like the <reference id="insert-statement" title="INSERT statement"/>, the <code>MERGE</code> statement's <code>VALUES()</code> clause provides typesafety for degrees up to {max-row-degree}, in both the standard syntax variant as well as the H2 variant.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="truncate-statement">
    -								<title>The TRUNCATE statement</title>
    -								<content><html>
    -									<p>
    -										The TRUNCATE statement is the only DDL statement supported by jOOQ so far. It is popular in many databases when you want to bypass constraints for table truncation. Databases may behave differently, when a truncated table is referenced by other tables. For instance, they may fail if records from a truncated table are referenced, even with ON DELETE CASCADE clauses in place. Please, consider your database manual to learn more about its TRUNCATE implementation.
    -									</p>
    -									<p>
    -										The TRUNCATE syntax is trivial:
    -									</p>
    -
    -</html><code-pair>
    -	<sql>TRUNCATE TABLE AUTHOR;</sql><java>create.truncate(AUTHOR).execute();</java>
    -</code-pair><html>
    -									
    -									<p>
    -										TRUNCATE is not supported by Ingres and SQLite. jOOQ will execute a DELETE FROM AUTHOR statement instead.
    -									</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -					<section id="table-expressions">
    -						<title>Table expressions</title>
    -						<content><html>
    -							<p>
    -								The following sections explain the various types of table expressions supported by jOOQ
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="generated-tables">
    -								<title>Generated Tables</title>
    -								<content><html>
    -									<p>
    -										Most of the times, when thinking about a <reference id="table-expressions" title="table expression"/> you're probably thinking about an actual physical table in your database schema. If you're using jOOQ's <reference id="code-generation" title="code generator"/>, you will have all tables from your database schema available to you as type safe Java objects. You can then use these tables in SQL <reference id="from-clause" title="FROM clauses"/>, <reference id="join-clause" title="JOIN clauses"/> or in other <reference id="sql-statements" title="SQL statements"/>, just like any other table expression. An example is given here:
    -									</p>
    -							
    -</html><code-pair>
    -<sql><![CDATA[SELECT *
    -FROM AUTHOR -- Table expression AUTHOR
    -JOIN BOOK   -- Table expression BOOK
    -ON (AUTHOR.ID = BOOK.AUTHOR_ID)]]></sql><java><![CDATA[create.select()
    -      .from(AUTHOR) // Table expression AUTHOR
    -      .join(BOOK)   // Table expression BOOK
    -      .on(AUTHOR.ID.equal(BOOK.AUTHOR_ID));]]></java></code-pair><html>
    -							
    -									<p>
    -										The above example shows how AUTHOR and BOOK tables are joined in a <reference id="select-statement" title="SELECT statement"/>. It also shows how you can access physical <reference id="table-columns" title="table columns"/> by dereferencing the relevant Java attributes of their tables.
    -									</p>
    -									<p>
    -										See the manual's section about <reference id="codegen-tables" title="generated tables"/> for more information about what is really generated by the <reference id="code-generation" title="code generator"/>
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="aliased-tables">
    -								<title>Aliased Tables</title>
    -								<content><html>
    -									<p>
    -										The strength of jOOQ's <reference id="code-generation" title="code generator"/> becomes more obvious when you perform table aliasing and dereference fields from generated aliased tables. This can best be shown by example:
    -									</p>
    -
    -</html><code-pair><sql><![CDATA[-- Select all books by authors born after 1920,
    --- named "Paulo" from a catalogue:
    -
    -
    -
    -SELECT *
    -  FROM author a
    -  JOIN book b ON a.id = b.author_id
    - WHERE a.year_of_birth > 1920
    -   AND a.first_name = 'Paulo'
    - ORDER BY b.title]]></sql><java><![CDATA[// Declare your aliases before using them in SQL:
    -Author a = AUTHOR.as("a");
    -Book b = BOOK.as("b");
    -
    -// Use aliased tables in your statement
    -create.select()
    -      .from(a)
    -      .join(b).on(a.ID.equal(b.AUTHOR_ID))
    -      .where(a.YEAR_OF_BIRTH.greaterThan(1920)
    -      .and(a.FIRST_NAME.equal("Paulo")))
    -      .orderBy(b.TITLE);]]></java></code-pair><html>
    -								
    -									<p>
    -										As you can see in the above example, calling <code>as()</code> on generated tables returns an object of the same type as the table. This means that the resulting object can be used to dereference fields from the aliased table. This is quite powerful in terms of having your Java compiler check the syntax of your SQL statements. If you remove a column from a table, dereferencing that column from that table alias will cause compilation errors.
    -									</p>
    -									
    -									<h3>Dereferencing columns from other table expressions</h3>
    -									<p>
    -										Only few table expressions provide the SQL syntax typesafety as shown above, where generated tables are used. Most tables, however, expose their fields through <code>field()</code> methods:
    -									</p>
    -
    -</html><java><![CDATA[// "Type-unsafe" aliased table:
    -Table<?> a = AUTHOR.as("a");
    -
    -// Get fields from a:
    -Field<?> id = a.field("ID");
    -Field<?> firstName = a.field("FIRST_NAME");]]></java><html>
    -									
    -									<h3>Derived column lists</h3>
    -									<p>
    -										The SQL standard specifies how a table can be renamed / aliased in one go along with its columns. It references the term "derived column list" for the following syntax (as supported by Postgres, for instance):
    -									</p>
    -									
    -</html><sql><![CDATA[SELECT t.a, t.b
    -FROM (
    -  SELECT 1, 2
    -) t(a, b)]]></sql><html>
    -
    -									<p>
    -										This feature is useful in various use-cases where column names are not known in advance (but the table's degree is!). An example for this are <reference id="array-and-cursor-unnesting" title="unnested tables"/>, or the <reference id="values" title="VALUES() table constructor"/>:
    -									</p>
    -
    -</html><sql><![CDATA[-- Unnested tables
    -SELECT t.a, t.b
    -FROM unnest(my_table_function()) t(a, b)
    -
    --- VALUES() constructor
    -SELECT t.a, t.b
    -FROM VALUES(1, 2),(3, 4) t(a, b)]]></sql><html>
    -
    -									<p>
    -										Only few databases really support such a syntax, but fortunately, jOOQ can simulate it easily using <code>UNION ALL</code> and an empty dummy record specifying the new column names. The two statements are equivalent:
    -									</p>
    -
    -</html><sql><![CDATA[-- Using derived column lists
    -SELECT t.a, t.b
    -FROM (
    -  SELECT 1, 2
    -) t(a, b)
    -
    --- Using UNION ALL and a dummy record
    -SELECT t.a, t.b
    -FROM (
    -  SELECT null a, null b FROM DUAL WHERE 1 = 0
    -  UNION ALL
    -  SELECT 1, 2 FROM DUAL
    -) t]]></sql><html>
    -									<p>
    -										In jOOQ, you would simply specify a varargs list of column aliases as such:
    -									</p>
    -									
    -</html><java><![CDATA[// Unnested tables
    -create.select().from(unnest(myTableFunction()).as("t", "a", "b"));
    -
    -// VALUES() constructor
    -create.select().from(values(
    -  row(1, 2),
    -  row(3, 4)
    -).as("t", "a", "b"));]]></java></content>
    -							</section>
    -
    -							<section id="joined-tables">
    -								<title>Joined tables</title>
    -								<content><html>
    -									<p>
    -										The <reference id="join-clause" title="JOIN operators"/> that can be used in <reference id="select-statement" title="SQL SELECT statements"/> are the most powerful and best supported means of creating new <reference id="table-expressions" title="table expressions"/> in SQL. Informally, the following can be said:
    -									</p>
    -									
    -</html><text>A(colA1, ..., colAn) "join" B(colB1, ..., colBm) "produces" C(colA1, ..., colAn, colB1, ..., colBm)</text><html>
    -
    -									<p>
    -										SQL and relational algebra distinguish between at least the following JOIN types (upper-case: SQL, lower-case: relational algebra):
    -									</p>
    -									<ul>
    -										<li><strong>CROSS JOIN or cartesian product</strong>: The basic JOIN in SQL, producing a relational cross product, combining every record of table A with every record of table B. Note that cartesian products can also be produced by listing comma-separated <reference id="table-expressions" title="table expressions"/> in the <reference id="from-clause" title="FROM clause"/> of a <reference id="select-statement" title="SELECT statement"/></li>
    -										<li><strong>NATURAL JOIN</strong>: The basic JOIN in relational algebra, yet a rarely used JOIN in databases with everyday degree of normalisation. This JOIN type unconditionally equi-joins two tables by all columns with the same name (requiring foreign keys and primary keys to share the same name). Note that the JOIN columns will only figure once in the resulting <reference id="table-expressions" title="table expression"/>.</li>
    -										<li><strong>INNER JOIN or equi-join</strong>: This JOIN operation performs a cartesian product (CROSS JOIN) with a <reference id="conditional-expressions" title="filtering predicate"/> being applied to the resulting <reference id="table-expressions" title="table expression"/>. Most often, a <reference id="comparison-predicate" title="equal comparison predicate"/> comparing foreign keys and primary keys will be applied as a filter, but any other predicate will work, too.</li>
    -										<li><strong>OUTER JOIN</strong>: This JOIN operation performs a cartesian product (CROSS JOIN) with a <reference id="conditional-expressions" title="filtering predicate"/> being applied to the resulting <reference id="table-expressions" title="table expression"/>. Most often, a <reference id="comparison-predicate" title="equal comparison predicate"/> comparing foreign keys and primary keys will be applied as a filter, but any other predicate will work, too. Unlike the INNER JOIN, an OUTER JOIN will add "empty records" to the left (table A) or right (table B) or both tables, in case the conditional expression fails to produce a .</li>										
    -										<li><strong>semi-join</strong>: In SQL, this JOIN operation can only be expressed implicitly using <reference id="in-predicate" title="IN predicates"/> or <reference id="exists-predicate" title="EXISTS predicates"/>. The <reference id="table-expressions" title="table expression"/> resulting from a semi-join will only contain the left-hand side table A</li>										
    -										<li><strong>anti-join</strong>: In SQL, this JOIN operation can only be expressed implicitly using <reference id="in-predicate" title="NOT IN predicates"/> or <reference id="exists-predicate" title="NOT EXISTS predicates"/>. The <reference id="table-expressions" title="table expression"/> resulting from a semi-join will only contain the left-hand side table A</li>
    -										<li><strong>division</strong>: This JOIN operation is hard to express at all, in SQL. See the manual's chapter about <reference id="relational-division" title="relational division"/> for details on how jOOQ simulates this operation.</li>
    -									</ul>									
    -									<p>
    -										jOOQ supports all of these JOIN types (except semi-join and anti-join) directly on any <reference id="table-expressions" title="table expression"/>:
    -									</p>
    -									
    -</html><java><![CDATA[// jOOQ's relational division convenience syntax 
    -DivideByOnStep divideBy(Table<?> table)
    -
    -// Various overloaded INNER JOINs
    -TableOnStep join(TableLike<?>)
    -TableOnStep join(String)
    -TableOnStep join(String, Object...)
    -TableOnStep join(String, QueryPart...)
    -
    -// Various overloaded OUTER JOINs (supporting Oracle's partitioned OUTER JOIN)
    -// Overloading is similar to that of INNER JOIN
    -TablePartitionByStep leftOuterJoin(TableLike<?>)
    -TablePartitionByStep rightOuterJoin(TableLike<?>)
    -
    -// Various overloaded FULL OUTER JOINs
    -TableOnStep fullOuterJoin(TableLike<?>)
    -
    -// Various overloaded CROSS JOINs
    -Table<Record> crossJoin(TableLike<?>)
    -
    -// Various overloaded NATURAL JOINs
    -Table<Record> naturalJoin(TableLike<?>)
    -Table<Record> naturalLeftOuterJoin(TableLike<?>)
    -Table<Record> naturalRightOuterJoin(TableLike<?>)]]></java><html>							
    -
    -									<p>
    -										Note that most of jOOQ's JOIN operations give way to a similar DSL API hierarchy as previously seen in the manual's section about the <reference id="join-clause" title="JOIN clause"/>
    -									</p>		
    -								</html></content>
    -							</section>
    -
    -							<section id="values">
    -								<title>The VALUES() table constructor</title>
    -								<content><html>
    -									<p>
    -										Some databases allow for expressing in-memory temporary tables using a <code>VALUES()</code> constructor. This constructor usually works the same way as the <code>VALUES()</code> clause known from the <reference id="insert-statement" title="INSERT statement"/> or from the <reference id="merge-statement" title="MERGE statement"/>. With jOOQ, you can also use the <code>VALUES()</code> table constructor, to create tables that can be used in a <reference id="select-statement" title="SELECT statement's"/> <reference id="from-clause" title="FROM clause"/>:
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[SELECT a, b
    -FROM VALUES(1, 'a'), 
    -           (2, 'b') t(a, b)]]></sql><java><![CDATA[create.select()
    -      .from(values(row(1, "a"),
    -                   row(2, "b")).as("t", "a", "b"));]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										Note, that it is usually quite useful to provide column aliases ("derived column lists") along with the table alias for the <code>VALUES()</code> constructor.
    -									</p>
    -									
    -									<p>
    -										The above statement is simulated by jOOQ for those databases that do not support the <code>VALUES()</code> constructor, natively (actual simulations may vary):
    -									</p>
    -									
    -</html><sql><![CDATA[-- If derived column expressions are supported:
    -SELECT a, b
    -FROM (
    -  SELECT 1, 'a' FROM DUAL UNION ALL
    -  SELECT 2, 'b' FROM DUAL
    -) t(a, b)
    -
    --- If derived column expressions are not supported:
    -SELECT a, b
    -FROM (
    -
    -  -- An empty dummy record is added to provide column names for the simulated derived column expression
    -  SELECT NULL a, NULL b FROM DUAL WHERE 1 = 0 UNION ALL
    -  
    -  -- Then, the actual VALUES() constructor is simulated
    -  SELECT 1,      'a'    FROM DUAL             UNION ALL
    -  SELECT 2,      'b'    FROM DUAL
    -) t
    -]]></sql></content>
    -							</section>
    -
    -							<section id="nested-selects">
    -								<title>Nested SELECTs</title>
    -								<content><html>
    -									<p>
    -										A <reference id="select-statement" title="SELECT statement"/> can appear almost anywhere a <reference id="table-expressions" title="table expression"/> can. Such a "nested SELECT" is often called a "derived table". Apart from many convenience methods accepting <reference class="org.jooq.Select"/> objects directly, a SELECT statement can always be transformed into a <reference class="org.jooq.Table"/> object using the asTable() method.
    -									</p>
    -									
    -									<h3>Example: Scalar subquery</h3>
    -									
    -</html><code-pair>
    -<sql>SELECT *
    -  FROM BOOK
    - WHERE BOOK.AUTHOR_ID = (
    - 		SELECT ID
    -          FROM AUTHOR
    -         WHERE LAST_NAME = 'Orwell')</sql><java>create.select()
    -      .from(BOOK)
    -      .where(BOOK.AUTHOR_ID.equal(create
    -             .select(AUTHOR.ID)
    -             .from(AUTHOR)
    -             .where(AUTHOR.LAST_NAME.equal("Orwell"))));</java>
    -</code-pair><html>
    -
    -									<h3>Example: Derived table</h3>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT nested.* FROM (
    -      SELECT AUTHOR_ID, count(*) books
    -        FROM BOOK
    -    GROUP BY AUTHOR_ID
    -) nested
    -ORDER BY nested.books DESC
    -
    -
    -
    -]]></sql><java><![CDATA[Table<Record> nested =
    -    create.select(BOOK.AUTHOR_ID, count().as("books"))
    -          .from(BOOK)
    -          .groupBy(BOOK.AUTHOR_ID).asTable("nested");
    -
    -create.select(nested.getFields())
    -      .from(nested)
    -      .orderBy(nested.getField("books"));]]></java>
    -</code-pair><html>
    -
    -									<h3>Example: Correlated subquery</h3>
    -</html><code-pair>
    -<sql><![CDATA[  SELECT LAST_NAME, (
    -      SELECT COUNT(*)
    -       FROM BOOK
    -      WHERE BOOK.AUTHOR_ID = AUTHOR.ID) books
    -    FROM AUTHOR
    -ORDER BY books DESC
    -
    -
    -
    -]]></sql><java><![CDATA[// The type of books cannot be inferred from the Select<?>
    -Field<Object> books =
    -    create.selectCount()
    -          .from(BOOK)
    -          .where(BOOK.AUTHOR_ID.equal(AUTHOR.ID))
    -          .asField("books");
    -create.select(AUTHOR.ID, books)
    -      .from(AUTHOR)
    -      .orderBy(books, AUTHOR.ID));]]></java>
    -</code-pair><html>									
    -								</html></content>
    -							</section>
    -
    -							<section id="pivot-tables">
    -								<title>The Oracle 11g PIVOT clause</title>
    -								<content><html>
    -									<p>
    -										If you are closely coupling your application to an Oracle database, you can take advantage of some Oracle-specific features, such as the PIVOT clause, used for statistical analyses. The formal syntax definition is as follows:
    -									</p>
    -									
    -</html><sql>-- SELECT ..
    -     FROM table PIVOT (aggregateFunction [, aggregateFunction] FOR column IN (expression [, expression]))
    ---  WHERE ..</sql><html>
    -		
    -									<p>
    -										The PIVOT clause is available from the <reference class="org.jooq.Table"/> type, as pivoting is done directly on a table. Currently, only Oracle's PIVOT clause is supported. Support for SQL Server's slightly different PIVOT clause will be added later. Also, jOOQ may simulate PIVOT for other dialects in the future.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="relational-division">
    -								<title>jOOQ's relational division syntax</title>
    -								<content><html>
    -									<p>
    -									    There is one operation in relational algebra that is not given a lot of attention, because it is rarely used in real-world applications. It is the relational division, the opposite operation of the cross product (or, relational multiplication). The following is an approximate definition of a relational division:
    -									</p>
    -
    -</html><config>Assume the following cross join / cartesian product
    -C = A × B
    -
    -Then it can be said that
    -A = C ÷ B
    -B = C ÷ A</config><html>
    -
    -									<p>
    -									   With jOOQ, you can simplify using relational divisions by using the following syntax:
    -									</p>
    -
    -</html><java>C.divideBy(B).on(C.ID.equal(B.C_ID)).returning(C.TEXT)</java><html>
    -
    -									<p>
    -										The above roughly translates to
    -									</p>
    -
    -</html><sql>SELECT DISTINCT C.TEXT FROM C "c1"
    -WHERE NOT EXISTS (
    -  SELECT 1 FROM B
    -  WHERE NOT EXISTS (
    -    SELECT 1 FROM C "c2"
    -    WHERE "c2".TEXT = "c1".TEXT
    -    AND "c2".ID = B.C_ID
    -  )
    -)</sql><html>
    -
    -									<p>
    -										Or in plain text: Find those TEXT values in C whose ID's correspond to all ID's in B. Note that from the above SQL statement, it is immediately clear that proper indexing is of the essence. Be sure to have indexes on all columns referenced from the on(...) and returning(...) clauses.
    -									</p>
    -
    -									<p>
    -										For more information about relational division and some nice, real-life examples, see
    -									</p>
    -
    -									<ul>
    -										<li><a href="http://en.wikipedia.org/wiki/Relational_algebra#Division" title="Wikipedia article on relational division">http://en.wikipedia.org/wiki/Relational_algebra#Division</a></li>
    -										<li><a href="http://www.simple-talk.com/sql/t-sql-programming/divided-we-stand-the-sql-of-relational-division/" title="A nice summary of what relational division is and how it is best implemented in SQL">http://www.simple-talk.com/sql/t-sql-programming/divided-we-stand-the-sql-of-relational-division/</a></li>
    -									</ul>
    -								</html></content>
    -
    -							</section>
    -
    -							<section id="array-and-cursor-unnesting">
    -								<title>Array and cursor unnesting</title>
    -								<content><html>
    -									<p>
    -										The SQL standard specifies how SQL databases should implement ARRAY and TABLE types, as well as CURSOR types. Put simply, a CURSOR is a pointer to any materialised <reference id="table-expressions" title="table expression"/>. Depending on the cursor's features, this table expression can be scrolled through in both directions, records can be locked, updated, removed, inserted, etc. Often, CURSOR types contain s, whereas ARRAY and TABLE types contain simple scalar values, although that is not a requirement
    -									</p>
    -									
    -									<p>
    -										ARRAY types in SQL are similar to Java's array types. They contain a "component type" or "element type" and a "dimension". This sort of ARRAY type is implemented in H2, HSQLDB and Postgres and supported by jOOQ as such. Oracle uses strongly-typed arrays, which means that an ARRAY type (VARRAY or TABLE type) has a name and possibly a maximum capacity associated with it.
    -									</p>
    -
    -									<h3>Unnesting array and cursor types</h3>									
    -									<p>
    -										The real power of these types become more obvious when you fetch them from <reference id="stored-procedures" title="stored procedures"/> to unnest them as <reference id="table-expressions" title="table expressions"/> and use them in your <reference id="from-clause" title="FROM clause"/>. An example is given here, where Oracle's DBMS_XPLAN package is used to fetch a cursor containing data about the most recent execution plan:
    -									</p>									
    -
    -</html><code-pair>
    -	<sql><![CDATA[SELECT *
    -FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(null, null, 'ALLSTATS'));]]></sql><java><![CDATA[create.select()
    -      .from(table(DbmsXplan.displayCursor(null, null, "ALLSTATS"));]]></java>
    -</code-pair><html>
    -									<p>
    -										Note, in order to access the DbmsXplan package, you can use the <reference id="code-generation" title="code generator"/> to generate Oracle's SYS schema.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="dual">
    -								<title>The DUAL table</title>
    -								<content><html>
    -									<p>
    -										The SQL standard specifies that the <reference id="from-clause" title="FROM clause"/> is optional in a <reference id="select-statement" title="SELECT statement"/>. However, according to the standard, you may then no longer use some other clauses, such as the <reference id="where-clause" title="WHERE clause"/>. In the real world, there exist three types of databases:
    -									</p>
    -									<ul>
    -										<li>The ones that always require a <code>FROM</code> clause</li>
    -										<li>The ones that never require a <code>FROM</code> clause (and still allow a <code>WHERE</code> clause)</li>
    -										<li>The ones that correctly implement the SQL standard</li>
    -									</ul>
    -									<p>
    -										With jOOQ, you don't have to worry about the above distinction of SQL dialects. jOOQ never requires a <code>FROM</code> clause, but renders the necessary <code>"DUAL"</code> table, if needed. The following program shows how jOOQ renders <code>"DUAL"</code> tables
    -									</p>
    -
    -</html><code-pair>
    -	<sql><![CDATA[SELECT 1
    -SELECT 1 FROM "db_root"
    -SELECT 1 FROM "SYSIBM"."DUAL"
    -SELECT 1 FROM "SYSIBM"."SYSDUMMY1"
    -SELECT 1 FROM "RDB$DATABASE"
    -SELECT 1 FROM dual
    -SELECT 1 FROM "INFORMATION_SCHEMA"."SYSTEM_USERS"
    -SELECT 1 FROM (select 1 as dual) as dual
    -SELECT 1 FROM dual
    -SELECT 1 FROM dual
    -SELECT 1
    -SELECT 1
    -SELECT 1
    -SELECT 1 FROM [SYS].[DUMMY]
    -]]></sql><java><![CDATA[DSL.using(SQLDialect.ASE      ).selectOne().getSQL();
    -DSL.using(SQLDialect.CUBRID   ).selectOne().getSQL();
    -DSL.using(SQLDialect.DB2      ).selectOne().getSQL();
    -DSL.using(SQLDialect.DERBY    ).selectOne().getSQL();
    -DSL.using(SQLDialect.FIREBIRD ).selectOne().getSQL();
    -DSL.using(SQLDialect.H2       ).selectOne().getSQL();
    -DSL.using(SQLDialect.HSQLDB   ).selectOne().getSQL();
    -DSL.using(SQLDialect.INGRES   ).selectOne().getSQL();
    -DSL.using(SQLDialect.MYSQL    ).selectOne().getSQL();
    -DSL.using(SQLDialect.ORACLE   ).selectOne().getSQL();
    -DSL.using(SQLDialect.POSTGRES ).selectOne().getSQL();
    -DSL.using(SQLDialect.SQLITE   ).selectOne().getSQL();
    -DSL.using(SQLDialect.SQLSERVER).selectOne().getSQL();
    -DSL.using(SQLDialect.SYBASE   ).selectOne().getSQL();]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										Note, that some databases (H2, MySQL) can normally do without <code>"DUAL"</code>. However, there exist some corner-cases with complex nested <code>SELECT</code> statements, where this will cause syntax errors (or parser bugs). To stay on the safe side, jOOQ will always render "dual" in those dialects.
    -									</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -					<section id="column-expressions">
    -						<title>Column expressions</title>
    -						<content><html>
    -						    <p>
    -						    	Column expressions can be used in various SQL clauses in order to refer to one or several columns. This chapter explains how to form various types of column expressions with jOOQ. A particular type of column expression is given in the section about <reference id="row-value-expressions" title="tuples or row value expressions"/>, where an expression may have a degree of more than one.
    -						    </p>
    -						
    -						    <h3>Using column expressions in jOOQ</h3>
    -							<p>
    -								jOOQ allows you to freely create arbitrary column expressions using a fluent expression construction API. Many expressions can be formed as functions from <reference id="dsl" title="DSL methods"/>, other expressions can be formed based on a pre-existing column expression. For example:
    -							</p>
    -							
    -</html><java><![CDATA[// A regular table column expression
    -Field<String> field1 = BOOK.TITLE;
    -
    -// A function created from the DSL using "prefix" notation
    -Field<String> field2 = trim(BOOK.TITLE);
    -
    -// The same function created from a pre-existing Field using "postfix" notation
    -Field<String> field3 = BOOK.TITLE.trim();
    -
    -// More complex function with advanced DSL syntax
    -Field<String> field4 = listAgg(BOOK.TITLE)
    -                          .withinGroupOrderBy(BOOK.ID.asc())
    -                          .over().partitionBy(AUTHOR.ID);]]></java><html>
    -
    -							<p>
    -								In general, it is up to you whether you want to use the "prefix" notation or the "postfix" notation to create new column expressions based on existing ones. The "SQL way" would be to use the "prefix notation", with functions created from the <reference id="dsl" title="DSL"/>. The "Java way" or "object-oriented way" would be to use the "postfix" notation with functions created from <reference class="org.jooq.Field"/> objects. Both ways ultimately create the same query part, though.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="table-columns">
    -								<title>Table columns</title>
    -								<content><html>
    -									<p>
    -										Table columns are the most simple implementations of a <reference id="column-expressions" title="column expression"/>. They are mainly produced by jOOQ's <reference id="code-generation" title="code generator"/> and can be dereferenced from the generated tables. This manual is full of examples involving table columns. Another example is given in this query:
    -									</p>
    -
    -</html><code-pair>
    -	<sql><![CDATA[SELECT BOOK.ID, BOOK.TITLE
    -FROM BOOK
    -WHERE BOOK.TITLE LIKE '%SQL%'
    -ORDER BY BOOK.TITLE]]></sql><java><![CDATA[create.select(BOOK.ID, BOOK.TITLE)
    -	  .from(BOOK)
    -	  .where(BOOK.TITLE.like("%SQL%"))
    -	  .orderBy(BOOK.TITLE);]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										Table columns implement a more specific interface called <reference class="org.jooq.TableField"/>, which is parameterised with its associated <code>&lt;R extends Record&gt;</code> record type.
    -									</p>
    -									<p>
    -										See the manual's section about <reference id="codegen-tables" title="generated tables"/> for more information about what is really generated by the <reference id="code-generation" title="code generator"/>
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="aliased-columns">
    -								<title>Aliased columns</title>
    -								<content><html>
    -									<p>
    -										Just like <reference id="aliased-tables" title="tables"/>, columns can be renamed using aliases. Here is an example:
    -									</p>
    -									
    -</html><sql>  SELECT FIRST_NAME || ' ' || LAST_NAME author, COUNT(*) books
    -    FROM AUTHOR
    -    JOIN BOOK ON AUTHOR.ID = AUTHOR_ID
    -GROUP BY FIRST_NAME, LAST_NAME;</sql><html>
    -
    -									<p>
    -										Here is how it's done with jOOQ:
    -									</p>
    -									
    -</html><java>Record record = create.select(
    -         concat(AUTHOR.FIRST_NAME, val(" "), AUTHOR.LAST_NAME).as("author"),
    -         count().as("books"))
    -      .from(AUTHOR)
    -      .join(BOOK).on(AUTHOR.ID.equal(BOOK.AUTHOR_ID))
    -      .groupBy(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME).fetchAny();</java><html>
    -      
    -      								<p>
    -      									When you alias Fields like above, you can access those Fields' values using the alias name:
    -  									</p>
    -  									
    -</html><java>System.out.println("Author : " + record.getValue("author"));
    -System.out.println("Books  : " + record.getValue("books"));</java></content>
    -							</section>
    -
    -							<section id="cast-expressions">
    -								<title>Cast expressions</title>
    -								<content><html>
    -									<p>
    -										jOOQ's source code generator tries to find the most accurate type mapping between your vendor-specific data types and a matching Java type. For instance, most <code>VARCHAR</code>, <code>CHAR</code>, <code>CLOB</code> types will map to String. Most <code>BINARY</code>, <code>BYTEA</code>, <code>BLOB</code> types will map to <code>byte[]</code>. <code>NUMERIC</code> types will default to <reference class="java.math.BigDecimal"/>, but can also be any of <reference class="java.math.BigInteger"/>, <reference class="java.lang.Long"/>, <reference class="java.lang.Integer"/>, <reference class="java.lang.Short"/>, <reference class="java.lang.Byte"/>, <reference class="java.lang.Double"/>, <reference class="java.lang.Float"/>.
    -									</p>
    -									<p>
    -										Sometimes, this automatic mapping might not be what you needed, or jOOQ cannot know the type of a field. In those cases you would write SQL type <code>CAST</code> like this:
    -									</p>
    -									
    -</html><sql>-- Let's say, your Postgres column LAST_NAME was VARCHAR(30)
    --- Then you could do this:
    -SELECT CAST(AUTHOR.LAST_NAME AS TEXT) FROM DUAL</sql><html>
    -
    -									<p>
    -										in jOOQ, you can write something like that:
    -									</p>
    -									
    -</html><java>create.select(TAuthor.LAST_NAME.cast(PostgresDataType.TEXT));</java><html>
    -
    -									<p>
    -										The same thing can be achieved by casting a Field directly to String.class, as <code>TEXT</code> is the default data type in Postgres to map to Java's String
    -									</p>
    -									
    -</html><java>create.select(TAuthor.LAST_NAME.cast(String.class));</java><html>
    -		
    -									<p>
    -										The complete <code>CAST</code> API in <reference class="org.jooq.Field"/> consists of these three methods:
    -									</p>
    -									
    -</html><java><![CDATA[public interface Field<T> {
    -
    -    // Cast this field to the type of another field
    -    <Z> Field<Z> cast(Field<Z> field);
    -    
    -    // Cast this field to a given DataType
    -    <Z> Field<Z> cast(DataType<Z> type);
    -    
    -    // Cast this field to the default DataType for a given Class
    -    <Z> Field<Z> cast(Class<? extends Z> type);
    -}
    -
    -// And additional convenience methods in the DSL:
    -public class DSL {
    -    <T> Field<T> cast(Object object, Field<T> field);
    -    <T> Field<T> cast(Object object, DataType<T> type);
    -    <T> Field<T> cast(Object object, Class<? extends T> type);
    -    <T> Field<T> castNull(Field<T> field);
    -    <T> Field<T> castNull(DataType<T> type);
    -    <T> Field<T> castNull(Class<? extends T> type);
    -}]]></java></content>
    -							</section>
    -
    -							<section id="arithmetic-expressions">
    -								<title>Arithmetic expressions</title>
    -								<content><html>
    -									<h3>Numeric arithmetic expressions</h3>
    -									<p>
    -										Your database can do the math for you. Arithmetic operations are implemented just like <reference id="numeric-functions" title="numeric functions"/>, with similar limitations as far as type restrictions are concerned. You can use any of these operators:
    -									</p>
    -
    -</html><config>  +  -  *  /  %</config><html>
    -
    -									<p>
    -										In order to express a SQL query like this one:
    -									</p>
    -									
    -</html><sql>SELECT ((1 + 2) * (5 - 3) / 2) % 10 FROM DUAL</sql><html>
    -							
    -									<p>
    -										You can write something like this in jOOQ:
    -									</p>
    -									
    -</html><java>create.select(val(1).add(2).mul(val(5).sub(3)).div(2).mod(10);</java><html>
    -
    -									<h3>Datetime arithmetic expressions</h3>
    -									<p>
    -										jOOQ also supports the Oracle-style syntax for adding days to a Field&lt;? extends java.util.Date&gt; 
    -									</p>
    -
    -</html><code-pair>
    -	<sql>SELECT SYSDATE + 3 FROM DUAL;</sql><java>create.select(currentTimestamp().add(3));</java>
    -</code-pair><html>
    -
    -									<p>
    -										For more advanced datetime arithmetic, use the DSL's timestampDiff() and dateDiff() functions, as well as jOOQ's built-in SQL standard <code>INTERVAL</code> data type support:
    -									</p>
    -									<ul>
    -										<li><code>INTERVAL YEAR TO MONTH</code>: <reference class="org.jooq.types.YearToMonth"/></li>
    -										<li><code>INTERVAL DAY TO SECOND</code>: <reference class="org.jooq.types.DayToSecond"/></li>
    -									</ul>
    -								</html></content>
    -							</section>
    -							
    -							<section id="string-concatenation">
    -								<title>String concatenation</title>
    -								<content><html>
    -									<p>
    -										The SQL standard defines the concatenation operator to be an infix operator, similar to the ones we've seen in the chapter about <reference id="arithmetic-expressions" title="arithmetic expressions"/>. This operator looks like this: <code>||</code>. Some other dialects do not support this operator, but expect a <code>concat()</code> function, instead. jOOQ renders the right operator / function, depending on your <reference id="sql-dialects" title="SQL dialect"/>:
    -									</p>
    -									
    -</html><code-pair>
    -<sql>SELECT 'A' || 'B' || 'C' FROM DUAL
    --- Or in MySQL:
    -SELECT concat('A', 'B', 'C') FROM DUAL</sql><java>&#160;
    -// For all RDBMS, including MySQL:
    -create.select(concat("A", "B", "C"));
    -</java>
    -</code-pair><html>								
    -								</html></content>
    -							</section>
    -
    -							<section id="general-functions">
    -								<title>General functions</title>
    -								<content><html>
    -									<p>
    -										There are a variety of general functions supported by jOOQ As discussed in the chapter about <reference id="sql-dialects" title="SQL dialects"/> functions are mostly simulated in your database, in case they are not natively supported.
    -									</p>
    -									<p>
    -										This is a list of general functions supported by jOOQ's <reference id="dsl" title="DSL"/>:
    -									</p>
    -									<ul>
    -										<li><strong><code>COALESCE</code></strong>: Get the first non-null value in a list of arguments.</li>
    -										<li><strong><code>NULLIF</code></strong>: Return <code>NULL</code> if both arguments are equal, or the first argument, otherwise.</li>
    -										<li><strong><code>NVL</code></strong>: Get the first non-null value among two arguments.</li>
    -										<li><strong><code>NVL2</code></strong>: Get the second argument if the first is null, or the third argument, otherwise.</li>
    -									</ul>
    -																
    -									<p>
    -										Please refer to the <reference class="org.jooq.impl.DSL" title="DSL Javadoc"/> for more details.
    -									</p>
    -								</html></content>
    -							</section>
    -							
    -							<section id="numeric-functions">
    -								<title>Numeric functions</title>
    -								<content><html>
    -									<p>
    -										Math can be done efficiently in the database before returning results to your Java application. In addition to the <reference id="arithmetic-expressions" title="arithmetic expressions" /> discussed previously, jOOQ also supports a variety of numeric functions. As discussed in the chapter about <reference id="sql-dialects" title="SQL dialects"/> numeric functions (as any function type) are mostly simulated in your database, in case they are not natively supported.
    -									</p>
    -									<p>
    -										This is a list of numeric functions supported by jOOQ's <reference id="dsl" title="DSL"/>:
    -									</p>
    -									
    -									<ul>
    -										<li><strong><code>ABS</code></strong>: Get the absolute value of a value.</li>
    -										<li><strong><code>ACOS</code></strong>: Get the arc cosine of a value.</li>
    -										<li><strong><code>ASIN</code></strong>: Get the arc sine of a value.</li>
    -										<li><strong><code>ATAN</code></strong>: Get the arc tangent of a value.</li>
    -										<li><strong><code>ATAN2</code></strong>: Get the atan2 function of two values.</li>
    -										<li><strong><code>CEIL</code></strong>: Get the smalles integer value larger than a given numeric value.</li>
    -										<li><strong><code>COS</code></strong>: Get the cosine of a value.</li>
    -										<li><strong><code>COSH</code></strong>: Get the hyperbolic cosine of a value.</li>
    -										<li><strong><code>COT</code></strong>: Get the cotangent of a value.</li>
    -										<li><strong><code>COTH</code></strong>: Get the hyperbolic cotangent of a value.</li>
    -										<li><strong><code>DEG</code></strong>: Transform radians into degrees.</li>
    -										<li><strong><code>EXP</code></strong>: Calculate e^value.</li>
    -										<li><strong><code>FLOOR</code></strong>: Get the largest integer value smaller than a given numeric value.</li>
    -										<li><strong><code>GREATEST</code></strong>: Finds the greatest among all argument values (can also be used with non-numeric values).</li>
    -										<li><strong><code>LEAST</code></strong>: Finds the least among all argument values (can also be used with non-numeric values).</li>
    -										<li><strong><code>LN</code></strong>: Get the natural logarithm of a value.</li>
    -										<li><strong><code>LOG</code></strong>: Get the logarithm of a value given a base.</li>
    -										<li><strong><code>POWER</code></strong>: Calculate value^exponent.</li>
    -										<li><strong><code>RAD</code></strong>: Transform degrees into radians.</li>
    -										<li><strong><code>RAND</code></strong>: Get a random number.</li>
    -										<li><strong><code>ROUND</code></strong>: Rounds a value to the nearest integer.</li>
    -										<li><strong><code>SIGN</code></strong>: Get the sign of a value (-1, 0, 1).</li>
    -										<li><strong><code>SIN</code></strong>: Get the sine of a value.</li>
    -										<li><strong><code>SINH</code></strong>: Get the hyperbolic sine of a value.</li>
    -										<li><strong><code>SQRT</code></strong>: Calculate the square root of a value.</li>
    -										<li><strong><code>TAN</code></strong>: Get the tangent of a value.</li>
    -										<li><strong><code>TANH</code></strong>: Get the hyperbolic tangent of a value.</li>
    -										<li><strong><code>TRUNC</code></strong>: Truncate the decimals off a given value.</li>
    -									</ul>
    -									
    -									<p>
    -										Please refer to the <reference class="org.jooq.impl.DSL" title="DSL Javadoc"/> for more details.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="bitwise-functions">
    -								<title>Bitwise functions</title>
    -								<content><html>
    -									<p>
    -										Interestingly, bitwise functions and bitwise arithmetic is not very popular among SQL databases. Most databases only support a few bitwise operations, while others ship with the full set of operators. jOOQ's API includes most bitwise operations as listed below. In order to avoid ambiguities with <reference id="conditional-expressions" title="conditional operators"/>, all bitwise functions are prefixed with "bit"
    -									</p>
    -									<ul>
    -										<li><strong><code>BIT_COUNT</code></strong>: Count the number of bits set to 1 in a number</li>
    -										<li><strong><code>BIT_AND</code></strong>: Set only those bits that are set in two numbers</li>
    -										<li><strong><code>BIT_OR</code></strong>: Set all bits that are set in at least one number</li>
    -										<li><strong><code>BIT_NAND</code></strong>: Set only those bits that are set in two numbers, and inverse the result</li>
    -										<li><strong><code>BIT_NOR</code></strong>: Set all bits that are set in at least one number, and inverse the result</li>
    -										<li><strong><code>BIT_NOT</code></strong>: Inverse the bits in a number</li>
    -										<li><strong><code>BIT_XOR</code></strong>: Set all bits that are set in at exactly one number</li>
    -										<li><strong><code>BIT_XNOR</code></strong>: Set all bits that are set in at exactly one number, and inverse the result</li>
    -										<li><strong><code>SHL</code></strong>: Shift bits to the left</li>
    -										<li><strong><code>SHR</code></strong>: Shift bits to the right</li>
    -									</ul>
    -									
    -									<h3>Some background about bitwise operation simulation</h3>
    -									<p>
    -										As stated before, not all databases support all of these bitwise operations. jOOQ simulates them wherever this is possible. More details can be seen in this blog post: <br/>
    -										<a href="http://blog.jooq.org/2011/10/30/the-comprehensive-sql-bitwise-operations-compatibility-list/">http://blog.jooq.org/2011/10/30/the-comprehensive-sql-bitwise-operations-compatibility-list/</a>
    -									</p>
    -									
    -								</html></content>
    -							</section>
    -
    -							<section id="string-functions">
    -								<title>String functions</title>
    -								<content><html>
    -									<p>
    -										String formatting can be done efficiently in the database before returning results to your Java application. As discussed in the chapter about <reference id="sql-dialects" title="SQL dialects"/> string functions (as any function type) are mostly simulated in your database, in case they are not natively supported.
    -									</p>
    -									<p>
    -										This is a list of numeric functions supported by jOOQ's <reference id="dsl" title="DSL"/>:
    -									</p>
    -									
    -									<ul>
    -										<li><strong><code>ASCII</code></strong>: Get the <code>ASCII</code> code of a character.</li>
    -										<li><strong><code>BIT_LENGTH</code></strong>: Get the length of a string in bits.</li>
    -										<li><strong><code>CHAR_LENGTH</code></strong>: Get the length of a string in characters.</li>
    -										<li><strong><code>CONCAT</code></strong>: Concatenate several strings.</li>
    -										<li><strong><code>ESCAPE</code></strong>: Escape a string for use with the <reference id="like-predicate" title="LIKE predicate"/>.</li>
    -										<li><strong><code>LENGTH</code></strong>: Get the length of a string.</li>
    -										<li><strong><code>LOWER</code></strong>: Get a string in lower case letters.</li>
    -										<li><strong><code>LPAD</code></strong>: Pad a string on the left side.</li>
    -										<li><strong><code>LTRIM</code></strong>: Trim a string on the left side.</li>
    -										<li><strong><code>OCTET_LENGTH</code></strong>: Get the length of a string in octets.</li>
    -										<li><strong><code>POSITION</code></strong>: Find a string within another string.</li>
    -										<li><strong><code>REPEAT</code></strong>: Repeat a string a given number of times.</li>
    -										<li><strong><code>REPLACE</code></strong>: Replace a string within another string.</li>
    -										<li><strong><code>RPAD</code></strong>: Pad a string on the right side.</li>
    -										<li><strong><code>RTRIM</code></strong>: Trim a string on the right side.</li>
    -										<li><strong><code>SUBSTRING</code></strong>: Get a substring of a string.</li>
    -										<li><strong><code>TRIM</code></strong>: Trim a string on both sides.</li>
    -										<li><strong><code>UPPER</code></strong>: Get a string in upper case letters.</li>
    -									</ul>
    -									
    -									<p>
    -										Please refer to the <reference class="org.jooq.impl.DSL" title="DSL Javadoc"/> for more details.
    -									</p>
    -									
    -									<h3>Regular expressions, <code>REGEXP</code>, <code>REGEXP_LIKE</code>, etc.</h3>
    -									<p>
    -										Various databases have some means of searching through columns using regular expressions if the <reference id="like-predicate" title="LIKE predicate"/> does not provide sufficient pattern matching power. While there are many different functions and operators in the various databases, jOOQ settled for the SQL:2008 standard <code>REGEX_LIKE</code> operator. Being an operator (and not a function), you should use the corresponding method on <reference class="org.jooq.Field"/>:
    -									</p>
    -									
    -</html><java><![CDATA[create.selectFrom(BOOK).where(TITLE.likeRegex("^.*SQL.*$"));]]></java><html>
    -
    -									<p>
    -										Note that the SQL standard specifies that patterns should follow the XQuery standards. In the real world, the POSIX regular expression standard is the most used one, some use Java regular expressions, and only a few ones use Perl regular expressions. jOOQ does not make any assumptions about regular expression syntax. For cross-database compatibility, please read the relevant database manuals carefully, to learn about the appropriate syntax. Please refer to the <reference class="org.jooq.impl.DSL" title="DSL Javadoc"/> for more details.
    -									</p>
    -								</html></content>
    -								<!-- don't forget regex here! -->
    -							</section>
    -
    -							<section id="date-and-time-functions">
    -								<title>Date and time functions</title>
    -								<content><html>
    -									<p>
    -										This is a list of date and time functions supported by jOOQ's <reference id="dsl" title="DSL"/>:
    -									</p>
    -									
    -									<ul>
    -										<li><strong><code>CURRENT_DATE</code></strong>: Get current date as a <code>DATE</code> object.</li>
    -										<li><strong><code>CURRENT_TIME</code></strong>: Get current time as a <code>TIME</code> object.</li>
    -										<li><strong><code>CURRENT_TIMESTAMP</code></strong>: Get current date as a <code>TIMESTAMP</code> object.</li>
    -										<li><strong><code>DATE_ADD</code></strong>: Add a number of days or an interval to a date.</li>
    -										<li><strong><code>DATE_DIFF</code></strong>: Get the difference in days between two dates.</li>
    -										<li><strong><code>TIMESTAMP_ADD</code></strong>: Add a number of days or an interval to a timestamp.</li>
    -										<li><strong><code>TIMESTAMP_DIFF</code></strong>: Get the difference as an <code>INTERVAL DAY TO SECOND</code> between two dates.</li>
    -									</ul>
    -									
    -									<h3>Intervals in jOOQ</h3>
    -									<p>
    -										jOOQ fills a gap opened by JDBC, which neglects an important SQL data type as defined by the SQL standards: <code>INTERVAL</code> types. See the manual's section about <reference id="data-types-intervals" title="INTERVAL data types"/> for more details.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="system-functions">
    -								<title>System functions</title>
    -								<content><html>
    -									<p>
    -										This is a list of system functions supported by jOOQ's <reference id="dsl" title="DSL"/>:
    -									</p>
    -									<ul>
    -										<li><strong><code>CURRENT_USER</code></strong>: Get current user.</li>
    -									</ul>
    -								</html></content>
    -							</section>
    -
    -							<section id="aggregate-functions">
    -								<title>Aggregate functions</title>
    -								<content><html>
    -									<p>
    -										Aggregate functions work just like functions, even if they have a slightly different semantics. Here are some example aggregate functions from the <reference id="dsl" title="DSL"/>:
    -									</p>
    -
    -</html><java><![CDATA[// Every-day, SQL standard aggregate functions
    -AggregateFunction<Integer>    count();
    -AggregateFunction<Integer>    count(Field<?> field);
    -AggregateFunction<T>          max  (Field<T> field);
    -AggregateFunction<T>          min  (Field<T> field);
    -AggregateFunction<BigDecimal> sum  (Field<? extends Number> field);
    -AggregateFunction<BigDecimal> avg  (Field<? extends Number> field);
    -
    -// DISTINCT keyword in aggregate functions
    -AggregateFunction<Integer>    countDistinct(Field<?> field);
    -AggregateFunction<T>          maxDistinct  (Field<T> field);
    -AggregateFunction<T>          minDistinct  (Field<T> field);
    -AggregateFunction<BigDecimal> sumDistinct  (Field<? extends Number> field);
    -AggregateFunction<BigDecimal> avgDistinct  (Field<? extends Number> field);
    -
    -// String aggregate functions
    -AggregateFunction<String> groupConcat        (Field<?> field);
    -AggregateFunction<String> groupConcatDistinct(Field<?> field);
    -OrderedAggregateFunction<String> listAgg(Field<?> field);
    -OrderedAggregateFunction<String> listAgg(Field<?> field, String separator);
    -
    -// Statistical functions
    -AggregateFunction<BigDecimal> median    (Field<? extends Number> field);
    -AggregateFunction<BigDecimal> stddevPop (Field<? extends Number> field);
    -AggregateFunction<BigDecimal> stddevSamp(Field<? extends Number> field);
    -AggregateFunction<BigDecimal> varPop    (Field<? extends Number> field);
    -AggregateFunction<BigDecimal> varSamp   (Field<? extends Number> field);
    -
    -// Linear regression functions
    -AggregateFunction<BigDecimal> regrAvgX     (Field<? extends Number> y, Field<? extends Number> x);
    -AggregateFunction<BigDecimal> regrAvgY     (Field<? extends Number> y, Field<? extends Number> x);
    -AggregateFunction<BigDecimal> regrCount    (Field<? extends Number> y, Field<? extends Number> x);
    -AggregateFunction<BigDecimal> regrIntercept(Field<? extends Number> y, Field<? extends Number> x);
    -AggregateFunction<BigDecimal> regrR2       (Field<? extends Number> y, Field<? extends Number> x);
    -AggregateFunction<BigDecimal> regrSlope    (Field<? extends Number> y, Field<? extends Number> x);
    -AggregateFunction<BigDecimal> regrSXX      (Field<? extends Number> y, Field<? extends Number> x);
    -AggregateFunction<BigDecimal> regrSXY      (Field<? extends Number> y, Field<? extends Number> x);
    -AggregateFunction<BigDecimal> regrSYY      (Field<? extends Number> y, Field<? extends Number> x);]]></java><html>
    -
    -									<p>
    -										Here's an example, counting the number of books any author has written:
    -									</p>
    -
    -</html><code-pair>
    -<sql>SELECT AUTHOR_ID, COUNT(*)
    -FROM BOOK
    -GROUP BY AUTHOR_ID</sql><java>create.select(BOOK.AUTHOR_ID, count())
    -      .from(BOOK)
    -      .groupBy(BOOK.AUTHOR_ID);</java>
    -</code-pair><html>
    -
    -									<p>
    -										Aggregate functions have strong limitations about when they may be used and when not. For instance, you can use aggregate functions in scalar queries. Typically, this means you only select aggregate functions, no <reference id="table-columns" title="regular columns"/> or other <reference id="column-expressions" title="column expressions"/>. Another use case is to use them along with a <reference id="group-by-clause" title="GROUP BY clause"/> as seen in the previous example. Note, that jOOQ does not check whether your using of aggregate functions is correct according to the SQL standards, or according to your database's behaviour.
    -									</p>
    -
    -		                            <h3>Ordered aggregate functions</h3>
    -		                            <p>
    -		                            	Oracle and some other databases support "ordered aggregate functions". This means you can provide an <code>ORDER BY</code> clause to an aggregate function, which will be taken into consideration when aggregating. The best example for this is Oracle's <code>LISTAGG()</code> (also known as <code>GROUP_CONCAT</code> in other <reference id="sql-dialects" title="SQL dialects"/>). The following query groups by authors and concatenates their books' titles
    -		                           	</p>
    -</html><code-pair>
    -<sql>SELECT   LISTAGG(TITLE, ', ')
    -         WITHIN GROUP (ORDER BY TITLE)
    -FROM     BOOK
    -GROUP BY AUTHOR_ID</sql><java>create.select(listAgg(BOOK.TITLE, ", ")
    -      .withinGroupOrderBy(BOOK.TITLE))
    -      .from(BOOK)
    -      .groupBy(BOOK.AUTHOR_ID)</java>
    -</code-pair><html>
    -
    -									<p>
    -										The above query might yield:
    -									</p>
    -
    -</html><text>+---------------------+
    -| LISTAGG             |
    -+---------------------+
    -| 1984, Animal Farm   |
    -| O Alquimista, Brida |
    -+---------------------+</text><html>
    -
    -									<h3>FIRST and LAST: Oracle's "ranked" aggregate functions</h3>
    -									<p>
    -										Oracle allows for restricting aggregate functions using the <code>KEEP()</code> clause, which is supported by jOOQ. In Oracle, some aggregate functions (<code>MIN</code>, <code>MAX</code>, <code>SUM</code>, <code>AVG</code>, <code>COUNT</code>, <code>VARIANCE</code>, or <code>STDDEV</code>) can be restricted by this clause, hence <reference class="org.jooq.AggregateFunction"/> also allows for specifying it. Here are a couple of examples using this clause:
    -									</p>
    -
    -</html><code-pair>
    -<sql>SUM(BOOK.AMOUNT_SOLD)
    -  KEEP(DENSE_RANK FIRST ORDER BY BOOK.AUTHOR_ID)</sql><java>sum(BOOK.AMOUNT_SOLD)
    -  .keepDenseRankFirstOrderBy(BOOK.AUTHOR_ID)</java>
    -</code-pair><html>
    -
    -									<h3>User-defined aggregate functions</h3>
    -									<p>
    -										jOOQ also supports using your own user-defined aggregate functions. See the manual's section about <reference id="user-defined-aggregate-functions" title="user-defined aggregate functions"/> for more details.
    -									</p>
    -
    -									<h3>Window functions / analytical functions</h3>
    -									<p>
    -										In those databases that support <reference id="window-functions" title="window functions"/>, jOOQ's <reference class="org.jooq.AggregateFunction"/> can be transformed into a window function / analytical function by calling <code>over()</code> on it. See the manual's section about <reference id="window-functions" title="window functions"/> for more details.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="window-functions">
    -								<title>Window functions</title>
    -								<content><html>
    -									<p>
    -										Most major RDBMS support the concept of window functions. jOOQ knows of implementations in DB2, Oracle, Postgres, SQL Server, and Sybase SQL Anywhere, and supports most of their specific syntaxes. Note, that H2 and HSQLDB have implemented <code>ROW_NUMBER()</code> functions, without true windowing support.
    -									</p>
    -									<p>
    -										As previously discussed, any <reference class="org.jooq.AggregateFunction"/> can be transformed into a window function using the <code>over()</code> method. See the chapter about <reference id="aggregate-functions" title="aggregate functions"/> for details. In addition to those, there are also some more window functions supported by jOOQ, as declared in the <reference id="dsl" title="DSL"/>:
    -									</p>
    -
    -</html><java><![CDATA[// Ranking functions
    -    WindowOverStep<Integer>    rowNumber();
    -    WindowOverStep<Integer>    rank();
    -    WindowOverStep<Integer>    denseRank();
    -    WindowOverStep<BigDecimal> percentRank();
    -    
    -// Windowing functions
    -<T> WindowIgnoreNullsStep<T>   firstValue(Field<T> field);
    -<T> WindowIgnoreNullsStep<T>   lastValue(Field<T> field)
    -<T> WindowIgnoreNullsStep<T>   lead(Field<T> field);
    -<T> WindowIgnoreNullsStep<T>   lead(Field<T> field, int offset);
    -<T> WindowIgnoreNullsStep<T>   lead(Field<T> field, int offset, T defaultValue);
    -<T> WindowIgnoreNullsStep<T>   lead(Field<T> field, int offset, Field<T> defaultValue);
    -<T> WindowIgnoreNullsStep<T>   lag(Field<T> field);
    -<T> WindowIgnoreNullsStep<T>   lag(Field<T> field, int offset);
    -<T> WindowIgnoreNullsStep<T>   lag(Field<T> field, int offset, T defaultValue);
    -<T> WindowIgnoreNullsStep<T>   lag(Field<T> field, int offset, Field<T> defaultValue);
    -
    -// Statistical functions
    -    WindowOverStep<BigDecimal> cumeDist();
    -    WindowOverStep<Integer>    ntile(int number);]]></java><html>	
    -    								
    -    								<p>
    -    									SQL distinguishes between various window function types (e.g. "ranking functions"). Depending on the function, SQL expects mandatory <code>PARTITION BY</code> or <code>ORDER BY</code> clauses within the <code>OVER()</code> clause. jOOQ does not enforce those rules for two reasons:
    -    								</p>
    -    								<ul>
    -    									<li>Your JDBC driver or database already checks SQL syntax semantics</li>
    -    									<li>Not all databases behave correctly according to the SQL standard</li>
    -    								</ul>
    -    								<p>
    -    									If possible, however, jOOQ tries to render missing clauses for you, if a given <reference id="sql-dialects" title="SQL dialect"/> is more restrictive.
    -    								</p>
    -    								<h3>Some examples</h3>
    -									<p>
    -										 Here are some simple examples of window functions with jOOQ:
    -									</p>
    -									
    -</html><code-pair>
    -<sql>-- Sample uses of ROW_NUMBER()
    -ROW_NUMBER() OVER()
    -ROW_NUMBER() OVER(PARTITION BY 1)
    -ROW_NUMBER() OVER(ORDER BY BOOK.ID)
    -ROW_NUMBER() OVER(PARTITION BY BOOK.AUTHOR_ID ORDER BY BOOK.ID)
    -                  
    --- Sample uses of FIRST_VALUE
    -FIRST_VALUE(BOOK.ID) OVER()
    -FIRST_VALUE(BOOK.ID IGNORE NULLS) OVER()
    -FIRST_VALUE(BOOK.ID RESPECT NULLS) OVER()
    -</sql><java>// Sample uses of rowNumber()
    -rowNumber().over()
    -rowNumber().over().partitionByOne()
    -rowNumber().over().partitionBy(BOOK.AUTHOR_ID)
    -rowNumber().over().partitionBy(BOOK.AUTHOR_ID).orderBy(BOOK.ID)
    -                  
    -// Sample uses of firstValue()
    -firstValue(BOOK.ID).over()
    -firstValue(BOOK.ID).ignoreNulls().over()
    -firstValue(BOOK.ID).respectNulls().over()
    -</java>
    -</code-pair><html>
    -    								
    -									<h3>An advanced window function example</h3>
    -									<p>
    -										Window functions can be used for things like calculating a "running total". The following example fetches transactions and the running total for every transaction going back to the beginning of the transaction table (ordered by booked_at). Window functions are accessible from the previously seen <reference class="org.jooq.AggregateFunction"/> type using the <code>over()</code> method:
    -									</p>
    -
    -</html><code-pair>
    -<sql>SELECT booked_at, amount,
    -   SUM(amount) OVER (PARTITION BY 1
    -                     ORDER BY booked_at
    -                     ROWS BETWEEN UNBOUNDED PRECEDING
    -                     AND CURRENT ROW) AS total
    -  FROM transactions</sql><java>create.select(t.BOOKED_AT, t.AMOUNT,
    -         sum(t.AMOUNT).over().partitionByOne()
    -                      .orderBy(t.BOOKED_AT)
    -                      .rowsBetweenUnboundedPreceding()
    -                      .andCurrentRow().as("total")
    -      .from(TRANSACTIONS.as("t"));</java>
    -</code-pair><html>
    -
    -
    -									<h3>Window functions created from ordered aggregate functions</h3>
    -									<p>
    -										In the previous chapter about <reference id="aggregate-functions" title="aggregate functions"/>, we have seen the concept of "ordered aggregate functions", such as Oracle's <code>LISTAGG()</code>. These functions have a window function / analytical function variant, as well. For example:
    -									</p>
    -									
    -</html><code-pair>
    -<sql>SELECT   LISTAGG(TITLE, ', ')
    -         WITHIN GROUP (ORDER BY TITLE)
    -         OVER (PARTITION BY BOOK.AUTHOR_ID)
    -FROM     BOOK</sql><java>create.select(listAgg(BOOK.TITLE, ", ")
    -      .withinGroupOrderBy(BOOK.TITLE)
    -      .over().partitionBy(BOOK.AUTHOR_ID))
    -      .from(BOOK)</java>
    -</code-pair><html>
    -
    -									<h3>Window functions created from Oracle's <code>FIRST</code> and <code>LAST</code> aggregate functions</h3>
    -									<p>
    -										In the previous chapter about <reference id="aggregate-functions" title="aggregate functions"/>, we have seen the concept of "<code>FIRST</code> and <code>LAST</code> aggregate functions". These functions have a window function / analytical function variant, as well. For example:
    -									</p>
    -
    -</html><code-pair>
    -<sql>SUM(BOOK.AMOUNT_SOLD)
    -  KEEP(DENSE_RANK FIRST ORDER BY BOOK.AUTHOR_ID)
    -  OVER(PARTITION BY 1)</sql><java>sum(BOOK.AMOUNT_SOLD)
    -  .keepDenseRankFirstOrderBy(BOOK.AUTHOR_ID)
    -  .over().partitionByOne()</java>
    -</code-pair><html>
    -
    -
    -									<h3>Window functions created from user-defined aggregate functions</h3>
    -									<p>
    -										User-defined aggregate functions also implement <reference class="org.jooq.AggregateFunction"/>, hence they can also be transformed into window functions using <code>over()</code>. This is supported by Oracle in particular. See the manual's section about <reference id="user-defined-aggregate-functions" title="user-defined aggregate functions"/> for more details.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="grouping-functions">
    -								<title>Grouping functions</title>
    -								<content><html>
    -									<h3>ROLLUP() explained in SQL</h3>
    -									<p>
    -										The SQL standard defines special functions that can be used in the <reference id="group-by-clause" title="GROUP BY clause"/>: the grouping functions. These functions can be used to generate several groupings in a single clause. This can best be explained in SQL. Let's take <code>ROLLUP()</code> for instance:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[-- ROLLUP() with one argument 
    -SELECT AUTHOR_ID, COUNT(*)
    -FROM BOOK
    -GROUP BY ROLLUP(AUTHOR_ID)
    -
    -
    --- ROLLUP() with two arguments
    -SELECT AUTHOR_ID, PUBLISHED_IN, COUNT(*)
    -FROM BOOK
    -GROUP BY ROLLUP(AUTHOR_ID, PUBLISHED_IN)
    -
    -
    -
    -
    -
    -
    -
    -]]></sql><sql><![CDATA[-- The same query using UNION ALL:
    -  SELECT AUTHOR_ID, COUNT(*) FROM BOOK GROUP BY (AUTHOR_ID)
    -UNION ALL
    -  SELECT NULL, COUNT(*) FROM BOOK GROUP BY ()
    -ORDER BY 1 NULLS LAST
    -
    --- The same query using UNION ALL:
    -  SELECT AUTHOR_ID, PUBLISHED_IN, COUNT(*) 
    -  FROM BOOK GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -UNION ALL
    -  SELECT AUTHOR_ID, NULL, COUNT(*) 
    -  FROM BOOK GROUP BY (AUTHOR_ID)
    -UNION ALL
    -  SELECT NULL, NULL, COUNT(*) 
    -  FROM BOOK GROUP BY ()
    -ORDER BY 1 NULLS LAST, 2 NULLS LAST
    -]]></sql>
    -</code-pair><html>
    -
    -									<p>
    -										In English, the <code>ROLLUP()</code> grouping function provides <code>N+1</code> groupings, when <code>N</code> is the number of arguments to the <code>ROLLUP()</code> function. Each grouping has an additional group field from the <code>ROLLUP()</code> argument field list. The results of the second query might look something like this:
    -									</p>
    -									
    -</html><text><![CDATA[+-----------+--------------+----------+
    -| AUTHOR_ID | PUBLISHED_IN | COUNT(*) |
    -+-----------+--------------+----------+
    -|         1 |         1945 |        1 | <- GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -|         1 |         1948 |        1 | <- GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -|         1 |         NULL |        2 | <- GROUP BY (AUTHOR_ID)
    -|         2 |         1988 |        1 | <- GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -|         2 |         1990 |        1 | <- GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -|         2 |         NULL |        2 | <- GROUP BY (AUTHOR_ID)
    -|      NULL |         NULL |        4 | <- GROUP BY ()
    -+-----------+--------------+----------+]]></text><html>
    -
    -									<h3>CUBE() explained in SQL</h3>
    -									<p>
    -										<code>CUBE()</code> is different from <code>ROLLUP()</code> in the way that it doesn't just create <code>N+1</code> groupings, it creates all <code>2^N</code> possible combinations between all group fields in the <code>CUBE()</code> function argument list. Let's re-consider our second query from before:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[-- CUBE() with two arguments
    -SELECT AUTHOR_ID, PUBLISHED_IN, COUNT(*)
    -FROM BOOK
    -GROUP BY CUBE(AUTHOR_ID, PUBLISHED_IN)
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -]]></sql><sql><![CDATA[-- The same query using UNION ALL:
    -  SELECT AUTHOR_ID, PUBLISHED_IN, COUNT(*) 
    -  FROM BOOK GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -UNION ALL
    -  SELECT AUTHOR_ID, NULL, COUNT(*) 
    -  FROM BOOK GROUP BY (AUTHOR_ID)
    -UNION ALL
    -  SELECT NULL, PUBLISHED_IN, COUNT(*) 
    -  FROM BOOK GROUP BY (PUBLISHED_IN)
    -UNION ALL
    -  SELECT NULL, NULL, COUNT(*) 
    -  FROM BOOK GROUP BY ()
    -ORDER BY 1 NULLS FIRST, 2 NULLS FIRST
    -]]></sql>
    -</code-pair><html>
    -
    -									<p>
    -										The results would then hold:
    -									</p>
    -
    -</html><text><![CDATA[+-----------+--------------+----------+
    -| AUTHOR_ID | PUBLISHED_IN | COUNT(*) |
    -+-----------+--------------+----------+
    -|      NULL |         NULL |        2 | <- GROUP BY ()
    -|      NULL |         1945 |        1 | <- GROUP BY (PUBLISHED_IN)
    -|      NULL |         1948 |        1 | <- GROUP BY (PUBLISHED_IN)
    -|      NULL |         1988 |        1 | <- GROUP BY (PUBLISHED_IN)
    -|      NULL |         1990 |        1 | <- GROUP BY (PUBLISHED_IN)
    -|         1 |         NULL |        2 | <- GROUP BY (AUTHOR_ID)
    -|         1 |         1945 |        1 | <- GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -|         1 |         1948 |        1 | <- GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -|         2 |         NULL |        2 | <- GROUP BY (AUTHOR_ID)
    -|         2 |         1988 |        1 | <- GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -|         2 |         1990 |        1 | <- GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -+-----------+--------------+----------+]]></text><html>
    -
    -									<h3>GROUPING SETS()</h3>
    -									<p>
    -										<code>GROUPING SETS()</code> are the generalised way to create multiple groupings. From our previous examples 
    -									</p>
    -									<ul>
    -										<li><code>ROLLUP(AUTHOR_ID, PUBLISHED_IN)</code> corresponds to <code>GROUPING SETS((AUTHOR_ID, PUBLISHED_IN), (AUTHOR_ID), ())</code></li>
    -										<li><code>CUBE(AUTHOR_ID, PUBLISHED_IN)</code> corresponds to <code>GROUPING SETS((AUTHOR_ID, PUBLISHED_IN), (AUTHOR_ID), (PUBLISHED_IN), ())</code></li>
    -									</ul>
    -									<p>
    -										This is nicely explained in the SQL Server manual pages about <code>GROUPING SETS()</code> and other grouping functions:<br/>
    -										<a href="http://msdn.microsoft.com/en-us/library/bb510427(v=sql.105)">http://msdn.microsoft.com/en-us/library/bb510427(v=sql.105)</a>
    -									</p>
    -									
    -									<h3>jOOQ's support for ROLLUP(), CUBE(), GROUPING SETS()</h3>
    -									<p>
    -										jOOQ fully supports all of these functions, as well as the utility functions <code>GROUPING()</code> and <code>GROUPING_ID()</code>, used for identifying the grouping set ID of a record. The <reference id="dsl" title="DSL API"/> thus includes:
    -									</p>
    -									
    -</html><java><![CDATA[// The various grouping function constructors
    -GroupField rollup(Field<?>... fields);
    -GroupField cube(Field<?>... fields);
    -GroupField groupingSets(Field<?>... fields);
    -GroupField groupingSets(Field<?>[]... fields);
    -GroupField groupingSets(Collection<? extends Field<?>>... fields);
    -
    -// The utility functions generating IDs per GROUPING SET
    -Field<Integer> grouping(Field<?>);
    -Field<Integer> groupingId(Field<?>...);]]></java><html>
    -
    -									<h3>MySQL's and CUBRID's WITH ROLLUP syntax</h3>
    -									<p>
    -										MySQL and CUBRID don't know any grouping functions, but they support a <code>WITH ROLLUP</code> clause, that is equivalent to simple <code>ROLLUP()</code> grouping functions. jOOQ simulates <code>ROLLUP()</code> in MySQL and CUBRID, by rendering this <code>WITH ROLLUP</code> clause. The following two statements mean the same:
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[-- Statement 1: SQL standard
    -GROUP BY ROLLUP(A, B, C)
    -
    --- Statement 2: SQL standard
    -GROUP BY A, ROLLUP(B, C)]]></sql><sql><![CDATA[-- Statement 1: MySQL
    -GROUP BY A, B, C WITH ROLLUP
    -
    --- Statement 2: MySQL
    --- This is not supported in MySQL]]></sql>
    -</code-pair><html>
    -								</html></content>
    -							</section>
    -
    -							<section id="user-defined-functions">
    -								<title>User-defined functions</title>
    -								<content><html>
    -									<p>
    -										Some databases support user-defined functions, which can be embedded in any SQL statement, if you're using jOOQ's <reference id="code-generation" title="code generator"/>. Let's say you have the following simple function in Oracle SQL:
    -									</p>
    -									
    -</html><sql><![CDATA[CREATE OR REPLACE FUNCTION echo (INPUT NUMBER)
    -RETURN NUMBER
    -IS
    -BEGIN
    -    RETURN INPUT;
    -END echo;
    -]]></sql><html>
    -
    -                                    <p>
    -                                    	The above function will be made available from a generated <reference id="codegen-procedures" title="Routines"/> class. You can use it like any other <reference id="column-expressions" title="column expression"/>:
    -                                    </p>
    -                                    
    -</html><code-pair>
    -<sql><![CDATA[SELECT echo(1) FROM DUAL WHERE echo(2) = 2]]></sql><java><![CDATA[create.select(echo(1)).where(echo(2).equal(2));]]></java>
    -</code-pair><html>
    -                                
    -                                	<p>
    -                                		Note that user-defined functions returning <reference id="data-types-cursors" title="CURSOR"/> or <reference id="data-types-arrays" title="ARRAY"/> data types can also be used wherever <reference id="table-expressions" title="table expressions"/> can be used, if they are <reference id="array-and-cursor-unnesting" title="unnested"/>
    -                                	</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="user-defined-aggregate-functions">
    -								<title>User-defined aggregate functions</title>
    -								<content><html>
    -									<p>
    -										Some databases support user-defined aggregate functions, which can then be used along with <reference id="group-by-clause" title="GROUP BY clauses"/> or as <reference id="window-functions" title="window functions"/>. An example for such a database is Oracle. With Oracle, you can define the following <code>OBJECT</code> type (the example was taken from the <a href="http://docs.oracle.com/cd/B28359_01/appdev.111/b28425/ext_agg_ref.htm">Oracle 11g documentation</a>): 
    -									</p>
    -									
    -</html><sql><![CDATA[CREATE TYPE U_SECOND_MAX AS OBJECT
    -(
    -  MAX NUMBER, -- highest value seen so far
    -  SECMAX NUMBER, -- second highest value seen so far
    -  STATIC FUNCTION ODCIAggregateInitialize(sctx IN OUT U_SECOND_MAX) RETURN NUMBER,
    -  MEMBER FUNCTION ODCIAggregateIterate(self IN OUT U_SECOND_MAX, value IN NUMBER) RETURN NUMBER,
    -  MEMBER FUNCTION ODCIAggregateTerminate(self IN U_SECOND_MAX, returnValue OUT NUMBER, flags IN NUMBER) RETURN NUMBER,
    -  MEMBER FUNCTION ODCIAggregateMerge(self IN OUT U_SECOND_MAX, ctx2 IN U_SECOND_MAX) RETURN NUMBER
    -);
    -
    -CREATE OR REPLACE TYPE BODY U_SECOND_MAX IS
    -STATIC FUNCTION ODCIAggregateInitialize(sctx IN OUT U_SECOND_MAX)
    -RETURN NUMBER IS
    -BEGIN
    -  SCTX := U_SECOND_MAX(0, 0);
    -  RETURN ODCIConst.Success;
    -END;
    -
    -MEMBER FUNCTION ODCIAggregateIterate(self IN OUT U_SECOND_MAX, value IN NUMBER) RETURN NUMBER IS
    -BEGIN
    -  IF VALUE > SELF.MAX THEN
    -    SELF.SECMAX := SELF.MAX;
    -    SELF.MAX := VALUE;
    -  ELSIF VALUE > SELF.SECMAX THEN
    -    SELF.SECMAX := VALUE;
    -  END IF;
    -  RETURN ODCIConst.Success;
    -END;
    -
    -MEMBER FUNCTION ODCIAggregateTerminate(self IN U_SECOND_MAX, returnValue OUT NUMBER, flags IN NUMBER) RETURN NUMBER IS
    -BEGIN
    -  RETURNVALUE := SELF.SECMAX;
    -  RETURN ODCIConst.Success;
    -END;
    -
    -MEMBER FUNCTION ODCIAggregateMerge(self IN OUT U_SECOND_MAX, ctx2 IN U_SECOND_MAX) RETURN NUMBER IS
    -BEGIN
    -  IF CTX2.MAX > SELF.MAX THEN
    -    IF CTX2.SECMAX > SELF.SECMAX THEN
    -      SELF.SECMAX := CTX2.SECMAX;
    -    ELSE
    -      SELF.SECMAX := SELF.MAX;
    -    END IF;
    -    SELF.MAX := CTX2.MAX;
    -  ELSIF CTX2.MAX > SELF.SECMAX THEN
    -    SELF.SECMAX := CTX2.MAX;
    -  END IF;
    -  RETURN ODCIConst.Success;
    -END;
    -END;]]></sql><html>
    -
    -									<p>
    -										The above <code>OBJECT</code> type is then available to function declarations as such:
    -									</p>
    -
    -</html><sql><![CDATA[
    -CREATE FUNCTION SECOND_MAX (input NUMBER) RETURN NUMBER
    -PARALLEL_ENABLE AGGREGATE USING U_SECOND_MAX;]]></sql><html>
    -
    -									<h3>Using the generated aggregate function</h3>
    -									<p>
    -										jOOQ's <reference id="code-generation" title="code generator"/> will detect such aggregate functions and generate them differently from regular <reference id="user-defined-functions" title="user-defined functions"/>. They implement the <reference class="org.jooq.AggregateFunction"/> type, as mentioned in the manual's section about <reference id="aggregate-functions" title="aggregate functions"/>. Here's how you can use the <code>SECOND_MAX()</code> aggregate function with jOOQ:
    -									</p>
    -				
    -</html><code-pair>					
    -<sql><![CDATA[-- Get the second-latest publishing date by author
    -SELECT SECOND_MAX(PUBLISHED_IN) 
    -FROM BOOK
    -GROUP BY AUTHOR_ID]]></sql><java><![CDATA[// Routines.secondMax() can be static-imported
    -create.select(secondMax(BOOK.PUBLISHED_IN))
    -      .from(BOOK)
    -      .groupBy(BOOK.AUTHOR_ID)]]></java>
    -</code-pair><html>
    -								</html></content>
    -							</section>
    -
    -							<section id="case-expressions">
    -								<title>The CASE expression</title>
    -								<content><html>
    -									<p>
    -										The <code>CASE</code> expression is part of the standard SQL syntax. While some RDBMS also offer an <code>IF</code> expression, or a <code>DECODE</code> function, you can always rely on the two types of <code>CASE</code> syntax:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[CASE WHEN AUTHOR.FIRST_NAME = 'Paulo'  THEN 'brazilian'
    -     WHEN AUTHOR.FIRST_NAME = 'George' THEN 'english'
    -                                       ELSE 'unknown'
    -END
    -
    --- OR:
    -
    -CASE AUTHOR.FIRST_NAME WHEN 'Paulo'  THEN 'brazilian'
    -                       WHEN 'George' THEN 'english'
    -                                     ELSE 'unknown'
    -END]]></sql><java><![CDATA[create.decode()
    -      .when(AUTHOR.FIRST_NAME.equal("Paulo"), "brazilian")
    -      .when(AUTHOR.FIRST_NAME.equal("George"), "english")
    -      .otherwise("unknown");
    -
    -// OR:
    -
    -create.decode().value(AUTHOR.FIRST_NAME)
    -               .when("Paulo", "brazilian")
    -               .when("George", "english")
    -               .otherwise("unknown");]]></java>
    -</code-pair><html>
    -
    -								<p>
    -									In jOOQ, both syntaxes are supported (The second one is simulated in Derby, which only knows the first one). Unfortunately, both case and else are reserved words in Java. jOOQ chose to use decode() from the Oracle <code>DECODE</code> function, and otherwise(), which means the same as else.
    -								</p>
    -
    -								<p>
    -									A <code>CASE</code> expression can be used anywhere where you can place a <reference id="column-expressions" title="column expression (or Field)"/>. For instance, you can <code>SELECT</code> the above expression, if you're selecting from <code>AUTHOR</code>:
    -							 	</p>
    -
    -</html><sql>SELECT AUTHOR.FIRST_NAME, [... CASE EXPR ...] AS nationality
    -  FROM AUTHOR</sql><html>
    -
    -								<h3>The Oracle DECODE() function</h3>
    -								<p>
    -									Oracle knows a more succinct, but maybe less readable <code>DECODE()</code> function with a variable number of arguments. This function roughly does the same as the second case expression syntax. jOOQ supports the <code>DECODE()</code> function and simulates it using <code>CASE</code> expressions in all dialects other than Oracle:
    -								</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[-- Oracle:
    -DECODE(FIRST_NAME, 'Paulo', 'brazilian',
    -                   'George', 'english',
    -                   'unknown');
    -
    --- Other SQL dialects
    -CASE AUTHOR.FIRST_NAME WHEN 'Paulo'  THEN 'brazilian'
    -                       WHEN 'George' THEN 'english'
    -                                     ELSE 'unknown'
    -END]]></sql><java><![CDATA[
    -
    -
    -
    -
    -// Use the Oracle-style DECODE() function with jOOQ.
    -// Note, that you will not be able to rely on type-safety
    -create.decode(AUTHOR.FIRST_NAME,
    -    "Paulo", "brazilian",
    -    "George", "english",
    -    "unknown");]]></java>
    -</code-pair><html>
    -
    -		  							<h3>CASE clauses in an ORDER BY clause</h3>
    -									<p>
    -										Sort indirection is often implemented with a <code>CASE</code> clause of a <code>SELECT</code>'s <code>ORDER BY</code> clause. See the manual's section about the <reference id="order-by-clause" title="ORDER BY clause"/> for more details.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="sequences-and-serials">
    -								<title>Sequences and serials</title>
    -								<content><html>
    -									<p>
    -										Sequences implement the <reference class="org.jooq.Sequence"/> interface, providing essentially this functionality:
    -									</p>
    -
    -</html><java><![CDATA[// Get a field for the CURRVAL sequence property
    -Field<T> currval();
    -
    -// Get a field for the NEXTVAL sequence property
    -Field<T> nextval();]]></java><html>
    -
    -									<p>
    -										So if you have a sequence like this in Oracle:
    -									</p>
    -
    -</html><sql>CREATE SEQUENCE s_author_id</sql><html>
    -
    -									<p>
    -										You can then use your <reference id="codegen-sequences" title="generated sequence"/> object directly in a SQL statement as such:
    -									</p>
    -
    -</html><java><![CDATA[// Reference the sequence in a SELECT statement:
    -BigInteger nextID = create.select(s).fetchOne(S_AUTHOR_ID.nextval());
    -
    -// Reference the sequence in an INSERT statement:
    -create.insertInto(AUTHOR, AUTHOR.ID, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -      .values(S_AUTHOR_ID.nextval(), val("William"), val("Shakespeare"));
    -]]></java><html>
    -
    -									<ul>
    -										<li>For more information about generated sequences, refer to the manual's section about <reference id="codegen-sequences" title="generated sequences"/></li>
    -										<li>For more information about executing standalone calls to sequences, refer to the manual's section about <reference id="sequence-execution" title="sequence execution"/></li>
    -									</ul>
    -								</html></content>
    -							</section>
    -							
    -							<section id="row-value-expressions">
    -								<title>Tuples or row value expressions</title>
    -								<content><html>
    -									<p>
    -										According to the SQL standard, row value expressions can have a degree of more than one. This is commonly used in the <reference id="insert-statement" title="INSERT statement"/>, where the <code>VALUES</code> row value constructor allows for providing a row value expression as a source for <code>INSERT</code> data. Row value expressions can appear in various other places, though. They are supported by jOOQ as records / rows. jOOQ's <reference id="dsl" title="DSL"/> allows for the construction of type-safe records up to the degree of {max-row-degree}. Higher-degree Rows are supported as well, but without any type-safety. Row types are modelled as follows:
    -									</p>
    -									
    -</html><java><![CDATA[// The DSL provides overloaded row value expression constructor methods:
    -public static <T1>             Row1<T1>             row(T1 t1)                      { ... }
    -public static <T1, T2>         Row2<T1, T2>         row(T1 t1, T2 t2)               { ... }
    -public static <T1, T2, T3>     Row3<T1, T2, T3>     row(T1 t1, T2 t2, T3 t3)        { ... }
    -public static <T1, T2, T3, T4> Row4<T1, T2, T3, T4> row(T1 t1, T2 t2, T3 t3, T4 t4) { ... }
    -
    -// [ ... idem for Row5, Row6, Row7, ..., Row{max-row-degree} ]
    -
    -// Degrees of more than {max-row-degree} are supported without type-safety
    -public static RowN row(Object... values) { ... }]]></java><html>
    -
    -									<h3>Using row value expressions in predicates</h3>
    -                                	<p>
    -                                		Row value expressions are incompatible with most other <reference id="queryparts" title="QueryParts"/>, but they can be used as a basis for constructing various <reference id="conditional-expressions" title="conditional expressions"/>, such as:
    -                                	</p>
    -                                	<ul>
    -                                		<li><reference id="comparison-predicate-degree-n" title="comparison predicates"/></li>
    -                                		<li><reference id="null-predicate-degree-n" title="NULL predicates"/></li>
    -                                		<li><reference id="between-predicate-degree-n" title="BETWEEN predicates"/></li>
    -                                		<li><reference id="in-predicate-degree-n" title="IN predicates"/></li>
    -                                		<li><reference id="overlaps-predicate" title="OVERLAPS predicate"/> (for degree 2 row value expressions only)</li>
    -                                	</ul>
    -                                	<p>
    -                                		See the relevant sections for more details about how to use row value expressions in predicates.
    -                                	</p>
    -                                	
    -                                	<h3>Using row value expressions in UPDATE statements</h3>
    -                                	<p>
    -                                		The <reference id="update-statement" title="UPDATE statement"/> also supports a variant where row value expressions are updated, rather than single columns. See the relevant section for more details
    -                                	</p>
    -                                	
    -									<h3>Higher-degree row value expressions</h3>
    -									<p>
    -										jOOQ chose to explicitly support degrees up to {max-row-degree} to match Scala's typesafe tuple, function and product support. Unlike Scala, however, jOOQ also supports higher degrees without the additional typesafety. 
    -									</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -					<section id="conditional-expressions">
    -					    <title>Conditional expressions</title>
    -						<content><html>
    -							<p>
    -								Conditions or conditional expressions are widely used in SQL and in the jOOQ API. They can be used in
    -							</p>
    -							<ul>
    -								<li>The <reference id="case-expressions" title="CASE expression"/></li>
    -								<li>The <reference id="join-clause" title="JOIN clause"/> (or <code>JOIN .. ON</code> clause, to be precise) of a <reference id="select-statement" title="SELECT statement"/>, <reference id="update-statement" title="UPDATE statement"/>, <reference id="delete-statement" title="DELETE statement"/></li>
    -								<li>The <reference id="where-clause" title="WHERE clause"/> of a <reference id="select-statement" title="SELECT statement"/>, <reference id="update-statement" title="UPDATE statement"/>, <reference id="delete-statement" title="DELETE statement"/></li>
    -								<li>The <reference id="connect-by-clause" title="CONNECT BY clause"/> of a <reference id="select-statement" title="SELECT statement"/></li>
    -								<li>The <reference id="having-clause" title="HAVING clause"/> of a <reference id="select-statement" title="SELECT statement"/></li>
    -								<li>The <reference id="merge-statement" title="MERGE statement"/>'s ON clause</li>
    -							</ul>
    -							
    -							<h3>Boolean types in SQL</h3>
    -							<p>
    -								Before SQL:1999, boolean types did not really exist in SQL. They were modelled by 0 and 1 numeric/char values. With SQL:1999, true booleans were introduced and are now supported by most databases. In short, these are possible boolean values:
    -							</p>
    -							<ul>
    -								<li><code>1</code> or <code>TRUE</code></li>
    -								<li><code>0</code> or <code>FALSE</code></li>
    -								<li><code>NULL</code> or <code>UNKNOWN</code></li>
    -							</ul>
    -							<p>
    -								It is important to know that SQL differs from many other languages in the way it interprets the <code>NULL</code> boolean value. Most importantly, the following facts are to be remembered:
    -							</p>
    -							<ul>
    -								<li><code>[ANY] = NULL</code> yields <code>NULL</code> (not <code>FALSE</code>)</li>
    -								<li><code>[ANY] != NULL</code> yields <code>NULL</code> (not <code>TRUE</code>)</li>
    -								<li><code>NULL = NULL</code> yields <code>NULL</code> (not <code>TRUE</code>)</li>
    -								<li><code>NULL != NULL</code> yields <code>NULL</code> (not <code>FALSE</code>)</li>
    -							</ul>
    -							<p>
    -								For simplified <code>NULL</code> handling, please refer to the section about the <reference id="distinct-predicate" title="DISTINCT predicate"/>.
    -							</p>
    -							<p>
    -								Note that jOOQ does not model these values as actual <reference id="column-expressions" title="column expression"/> compatible.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -						    <section id="condition-building">
    -							    <title>Condition building</title>
    -								<content><html>
    -									<p>
    -										With jOOQ, most <reference id="conditional-expressions" title="conditional expressions"/> are built from <reference id="column-expressions" title="column expressions"/>, calling various methods on them. For instance, to build a <reference id="comparison-predicate" title="comparison predicate"/>, you can write the following expression:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[TITLE  = 'Animal Farm'
    -TITLE != 'Animal Farm']]></sql><java><![CDATA[BOOK.TITLE.equal("Animal Farm")
    -BOOK.TITLE.notEqual("Animal Farm")]]></java>
    -</code-pair><html>
    -
    -									<h3>Create conditions from the DSL</h3>
    -									<p>
    -										There are a few types of conditions, that can be created statically from the <reference id="dsl" title="DSL"/>. These are:
    -									</p>
    -									<ul>
    -										<li><reference id="plain-sql" title="plain SQL conditions"/>, that allow you to phrase your own SQL string <reference id="conditional-expressions" title="conditional expression"/></li>
    -										<li>The <reference id="exists-predicate" title="EXISTS predicate"/>, a standalone predicate that creates a conditional expression</li>
    -										<li>Constant <code>TRUE</code> and <code>FALSE</code> conditional expressions</li>
    -									</ul>
    -
    -									<h3>Connect conditions using boolean operators</h3>
    -									<p>
    -										Conditions can also be connected using <reference id="boolean-operators" title="boolean operators"/> as will be discussed in a subsequent chapter.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -						    <section id="boolean-operators">
    -							    <title>AND, OR, NOT boolean operators</title>
    -								<content><html>
    -									<p>
    -										In SQL, as in most other languages, <reference id="conditional-expressions" title="conditional expressions"/> can be connected using the <code>AND</code> and <code>OR</code> binary operators, as well as the <code>NOT</code> unary operator, to form new conditional expressions. In jOOQ, this is modelled as such: 
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[-- A simple conditional expression
    -TITLE = 'Animal Farm' OR TITLE = '1984'
    -
    --- A more complex conditional expression
    -        (TITLE = 'Animal Farm' OR TITLE = '1984') 
    -AND NOT (AUTHOR.LAST_NAME = 'Orwell')]]></sql><java><![CDATA[// A simple boolean connection
    -BOOK.TITLE.equal("Animal Farm").or(BOOK.TITLE.equal("1984"))
    -
    -// A more complex conditional expression
    -BOOK.TITLE.equal("Animal Farm").or(BOOK.TITLE.equal("1984"))
    -    .andNot(AUTHOR.LAST_NAME.equal("Orwell"))]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										The above example shows that the number of parentheses in Java can quickly explode. Proper indentation may become crucial in making such code readable. In order to understand how jOOQ composes combined conditional expressions, let's assign component expressions first:
    -									</p>
    -
    -</html><java><![CDATA[Condition a = BOOK.TITLE.equal("Animal Farm");
    -Condition b = BOOK.TITLE.equal("1984");
    -Condition c = AUTHOR.LAST_NAME.equal("Orwell");
    -
    -Condition combined1 = a.or(b);             // These OR-connected conditions form a new condition, wrapped in parentheses
    -Condition combined2 = combined1.andNot(c); // The left-hand side of the AND NOT () operator is already wrapped in parentheses]]></java><html>
    -
    -									<h3>The Condition API</h3>
    -									<p>
    -										Here are all boolean operators on the <reference class="org.jooq.Condition"/> interface:
    -									</p>
    -									
    -</html><java><![CDATA[and(Condition)            // Combine conditions with AND
    -and(String)               // Combine conditions with AND. Convenience for adding plain SQL to the right-hand side
    -and(String, Object...)    // Combine conditions with AND. Convenience for adding plain SQL to the right-hand side
    -and(String, QueryPart...) // Combine conditions with AND. Convenience for adding plain SQL to the right-hand side
    -andExists(Select<?>)      // Combine conditions with AND. Convenience for adding an exists predicate to the rhs
    -andNot(Condition)         // Combine conditions with AND. Convenience for adding an inverted condition to the rhs
    -andNotExists(Select<?>)   // Combine conditions with AND. Convenience for adding an inverted exists predicate to the rhs
    -
    -or(Condition)             // Combine conditions with OR
    -or(String)                // Combine conditions with OR. Convenience for adding plain SQL to the right-hand side
    -or(String, Object...)     // Combine conditions with OR. Convenience for adding plain SQL to the right-hand side
    -or(String, QueryPart...)  // Combine conditions with OR. Convenience for adding plain SQL to the right-hand side
    -orExists(Select<?>)       // Combine conditions with OR. Convenience for adding an exists predicate to the rhs
    -orNot(Condition)          // Combine conditions with OR. Convenience for adding an inverted condition to the rhs
    -orNotExists(Select<?>)    // Combine conditions with OR. Convenience for adding an inverted exists predicate to the rhs
    -
    -not()                     // Invert a condition (synonym for DSL.not(Condition)]]></java></content>
    -							</section>
    -
    -						    <section id="comparison-predicate">
    -							    <title>Comparison predicate</title>
    -								<content><html>
    -									<p>
    -										In SQL, comparison predicates are formed using common comparison operators:
    -									</p>
    -									<ul>
    -										<li><strong>=</strong> to test for equality</li>
    -										<li><strong>&lt;&gt;</strong> or <strong>!=</strong> to test for non-equality</li>
    -										<li><strong>&gt;</strong> to test for being strictly greater</li>
    -										<li><strong>&gt;=</strong> to test for being greater or equal</li>
    -										<li><strong>&lt;</strong> to test for being strictly less</li>
    -										<li><strong>&lt;=</strong> to test for being less or equal</li>
    -									</ul>
    -									
    -									<p>
    -										Unfortunately, Java does not support operator overloading, hence these operators are also implemented as methods in jOOQ, like any other SQL syntax elements. The relevant parts of the <reference class="org.jooq.Field"/> interface are these:
    -									</p>
    -									
    -</html><java><![CDATA[eq or equal(T);                                     // =  (some bind value)
    -eq or equal(Field<T>);                              // =  (some column expression)
    -eq or equal(Select<? extends Record1<T>>);          // =  (some scalar SELECT statement)
    -ne or notEqual(T);                                  // <> (some bind value)
    -ne or notEqual(Field<T>);                           // <> (some column expression)
    -ne or notEqual(Select<? extends Record1<T>>);       // <> (some scalar SELECT statement)
    -lt or lessThan(T);                                  // <  (some bind value)
    -lt or lessThan(Field<T>);                           // <  (some column expression)
    -lt or lessThan(Select<? extends Record1<T>>);       // <  (some scalar SELECT statement)
    -le or lessOrEqual(T);                               // <= (some bind value)
    -le or lessOrEqual(Field<T>);                        // <= (some column expression)
    -le or lessOrEqual(Select<? extends Record1<T>>);    // <= (some scalar SELECT statement)
    -gt or greaterThan(T);                               // >  (some bind value)
    -gt or greaterThan(Field<T>);                        // >  (some column expression)
    -gt or greaterThan(Select<? extends Record1<T>>);    // >  (some scalar SELECT statement)
    -ge or greaterOrEqual(T);                            // >= (some bind value)
    -ge or greaterOrEqual(Field<T>);                     // >= (some column expression)
    -ge or greaterOrEqual(Select<? extends Record1<T>>); // >= (some scalar SELECT statement)]]></java><html>
    -
    -									<p>
    -										Note that every operator is represented by two methods. A verbose one (such as <code>equal()</code>) and a two-character one (such as <code>eq()</code>). Both methods are the same. You may choose either one, depending on your taste. The manual will always use the more verbose one.
    -									</p>
    -									
    -									<h3>jOOQ's convenience methods using comparison operators</h3>
    -									<p>
    -										In addition to the above, jOOQ provides a few convenience methods for common operations performed on strings using comparison predicates:
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[-- case insensitivity
    -LOWER(TITLE)  = LOWER('animal farm')
    -LOWER(TITLE) <> LOWER('animal farm')]]></sql><java><![CDATA[// case insensitivity
    -BOOK.TITLE.equalIgnoreCase("animal farm")
    -BOOK.TITLE.notEqualIgnoreCase("animal farm")]]></java>
    -</code-pair><html>
    -								</html></content>
    -							</section>
    -
    -							<section id="comparison-predicate-degree-n">
    -							    <title>Comparison predicate (degree > 1)</title>
    -							    <content><html>
    -							    	<p>
    -							    		All variants of the <reference id="comparison-predicate" title="comparison predicate"/> that we've seen in the previous chapter also work for <reference id="row-value-expressions" title="row value expressions"/>. If your database does not support row value expression comparison predicates, jOOQ simulates them the way they are defined in the SQL standard:
    -							    	</p>
    -	
    -</html><code-pair>
    -<sql><![CDATA[-- Row value expressions (equal)
    -(A, B)    =  (X, Y)
    -(A, B, C) =  (X, Y, Z)
    --- greater than
    -(A, B)    >  (X, Y)
    -
    -(A, B, C) >  (X, Y, Z)
    -
    -
    --- greater or equal  
    -(A, B)    >= (X, Y)
    -
    -
    -(A, B, C) >= (X, Y, Z)
    -
    -
    -
    --- Inverse comparisons
    -
    -(A, B)    <> (X, Y)
    -(A, B)    <  (X, Y)
    -(A, B)    <= (X, Y)]]></sql><sql><![CDATA[-- Equivalent factored-out predicates (equal)
    -(A = X) AND (B = Y)
    -(A = X) AND (B = Y) AND (C = Z)
    --- greater than
    -(A > X) 
    -  OR ((A = X) AND (B > Y)) 
    -(A > X) 
    -  OR ((A = X) AND (B > Y)) 
    -  OR ((A = X) AND (B = Y) AND (C > Z))
    --- greater or equal  
    -(A > X) 
    -  OR ((A = X) AND (B > Y))
    -  OR ((A = X) AND (B = Y))
    -(A > X) 
    -  OR ((A = X) AND (B > Y)) 
    -  OR ((A = X) AND (B = Y) AND (C > Z))
    -  OR ((A = X) AND (B = Y) AND (C = Z))
    --- For simplicity, these predicates are shown in terms
    --- of their negated counter parts
    -NOT((A, B) =  (X, Y))
    -NOT((A, B) >= (X, Y))
    -NOT((A, B) >  (X, Y))]]></sql>	
    -</code-pair><html>						    	
    -
    -									<p>
    -										jOOQ supports all of the above row value expression comparison predicates, both with <reference id="column-expressions" title="column expression lists"/> and <reference id="select-statement" title="scalar subselects"/> at the right-hand side:
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[-- With regular column expressions
    -(BOOK.AUTHOR_ID, BOOK.TITLE) = (1, 'Animal Farm')
    -
    --- With scalar subselects
    -(BOOK.AUTHOR_ID, BOOK.TITLE) = (
    -  SELECT PERSON.ID, 'Animal Farm'
    -  FROM PERSON
    -  WHERE PERSON.ID = 1
    -)]]></sql><java><![CDATA[// Column expressions
    -row(BOOK.AUTHOR_ID, BOOK.TITLE).equal(1, "Animal Farm");
    -
    -// Subselects
    -row(BOOK.AUTHOR_ID, BOOK.TITLE).equal(
    -  select(PERSON.ID, val("Animal Farm"))
    -  .from(PERSON)
    -  .where(PERSON.ID.equal(1))
    -);]]></java>
    -</code-pair><html>									
    -							    </html></content>
    -						    </section>
    -						    
    -						    <section id="quantified-comparison-predicate">
    -							    <title>Quantified comparison predicate</title>
    -								<content><html>
    -									<p>
    -										If the right-hand side of a <reference id="comparison-predicate" title="comparison predicate"/> turns out to be a non-scalar table subquery, you can wrap that subquery in a quantifier, such as <code>ALL</code>, <code>ANY</code>, or <code>SOME</code>. Note that the SQL standard defines <code>ANY</code> and <code>SOME</code> to be equivalent. jOOQ settled for the more intuitive <code>ANY</code> and doesn't support <code>SOME</code>. Here are some examples, supported by jOOQ:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[TITLE = ANY('Animal Farm', '1982')
    -PUBLISHED_IN > ALL(1920, 1940)]]></sql><java><![CDATA[BOOK.TITLE.equal(any("Animal Farm", "1982"));
    -BOOK.PUBLISHED_IN.greaterThan(all(1920, 1940));]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										For the example, the right-hand side of the quantified comparison predicates were filled with argument lists. But it is easy to imagine that the source of values results from a <reference id="nested-selects" title="subselect"/>.
    -									</p>
    -
    -									<h3>ANY and the IN predicate</h3>
    -									<p>
    -										It is interesting to note that the SQL standard defines the <reference id="in-predicate" title="IN predicate"/> in terms of the <code>ANY</code>-quantified predicate. The following two expressions are equivalent:
    -									</p>
    -									
    -</html><code-pair>
    -<text><![CDATA[[ROW VALUE EXPRESSION] IN [IN PREDICATE VALUE]]]></text><text><![CDATA[[ROW VALUE EXPRESSION] = ANY [IN PREDICATE VALUE]]]></text>
    -</code-pair><html>
    -
    -									<p>
    -										Typically, the <reference id="in-predicate" title="IN predicate"/> is more readable than the quantified comparison predicate.
    -									</p>
    -								</html></content>
    -							</section>
    -							
    -						    <section id="null-predicate">
    -							    <title>NULL predicate</title>
    -								<content><html>
    -									<p>
    -										In SQL, you cannot compare <code>NULL</code> with any value using <reference id="comparison-predicate" title="comparison predicates"/>, as the result would yield <code>NULL</code> again, which is neither <code>TRUE</code> nor <code>FALSE</code> (see also the manual's section about <reference id="conditional-expressions" title="conditional expressions"/>). In order to test a <reference id="column-expressions" title="column expression"/> for <code>NULL</code>, use the <code>NULL</code> predicate as such:
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[TITLE IS NULL
    -TITLE IS NOT NULL]]></sql><java><![CDATA[BOOK.TITLE.isNull()
    -BOOK.TITLE.isNotNull()]]></java>
    -</code-pair><html>
    -
    -								</html></content>
    -							</section>
    -
    -						    <section id="null-predicate-degree-n">
    -							    <title>NULL predicate (degree > 1)</title>
    -							    <content><html>
    -							    	<p>
    -							    		The SQL <code>NULL</code> predicate also works well for <reference id="row-value-expressions" title="row value expressions"/>, although it has some subtle, counter-intuitive features when it comes to inversing predicates with the <code>NOT()</code> operator! Here are some examples:
    -							    	</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[-- Row value expressions
    -(A, B) IS     NULL
    -(A, B) IS NOT NULL
    -
    --- Inverse of the above
    -NOT((A, B) IS     NULL)
    -NOT((A, B) IS NOT NULL)]]></sql><sql><![CDATA[-- Equivalent factored-out predicates
    -(A IS     NULL) AND (B IS     NULL)
    -(A IS NOT NULL) AND (B IS NOT NULL)
    -
    --- Inverse
    -(A IS NOT NULL) OR  (B IS NOT NULL)
    -(A IS     NULL) OR  (B IS     NULL)]]></sql>	
    -</code-pair><html>						    	
    -
    -									<p>
    -										The SQL standard contains a nice truth table for the above rules:
    -									</p>
    -									
    -</html><text>+-----------------------+-----------+---------------+---------------+-------------------+
    -| Expression            | R IS NULL | R IS NOT NULL | NOT R IS NULL | NOT R IS NOT NULL |
    -+-----------------------+-----------+---------------+---------------+-------------------+
    -| degree 1: null        | true      | false         | false         |  true             |
    -| degree 1: not null    | false     | true          | true          |  false            |
    -| degree > 1: all null  | true      | false         | false         |  true             |
    -| degree > 1: some null | false     | false         | true          |  true             |
    -| degree > 1: none null | false     | true          | true          |  false            |
    -+-----------------------+-----------+---------------+---------------+-------------------+</text><html>		
    -
    -									<p>
    -										In jOOQ, you would simply use the <code>isNull()</code> and <code>isNotNull()</code> methods on row value expressions. Again, as with the <reference id="comparison-predicate-degree-n" title="row value expression comparison predicate"/>, the row value expression <code>NULL</code> predicate is simulated by jOOQ, if your database does not natively support it:
    -									</p>
    -									
    -</html><java><![CDATA[row(BOOK.ID, BOOK.TITLE).isNull();
    -row(BOOK.ID, BOOK.TITLE).isNotNull();]]></java></content>
    -						    </section>
    -						    
    -						    <section id="distinct-predicate">
    -							    <title>DISTINCT predicate</title>
    -								<content><html>
    -									<p>
    -										Some databases support the <code>DISTINCT</code> predicate, which serves as a convenient, <code>NULL</code>-safe <reference id="comparison-predicate" title="comparison predicate"/>. With the <code>DISTINCT</code> predicate, the following truth table can be assumed:
    -									</p>
    -									<ul>
    -										<li><code>[ANY] IS DISTINCT FROM NULL</code> yields <code>TRUE</code></li>
    -										<li><code>[ANY] IS NOT DISTINCT FROM NULL</code> yields <code>FALSE</code></li>
    -										<li><code>NULL IS DISTINCT FROM NULL</code> yields <code>FALSE</code></li>
    -										<li><code>NULL IS NOT DISTINCT FROM NULL</code> yields <code>TRUE</code></li>
    -									</ul>
    -									<p>
    -										For instance, you can compare two fields for distinctness, ignoring the fact that any of the two could be <code>NULL</code>, which would lead to funny results. This is supported by jOOQ as such:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[TITLE IS DISTINCT FROM SUB_TITLE
    -TITLE IS NOT DISTINCT FROM SUB_TITLE]]></sql><java><![CDATA[BOOK.TITLE.isDistinctFrom(BOOK.SUB_TITLE)
    -BOOK.TITLE.isNotDistinctFrom(BOOK.SUB_TITLE)]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										If your database does not natively support the <code>DISTINCT</code> predicate, jOOQ simulates it with an equivalent <reference id="case-expressions" title="CASE expression"/>, modelling the above truth table:
    -									</p>
    -	
    -</html><code-pair>								
    -<sql><![CDATA[-- [A] IS DISTINCT FROM [B] 
    -CASE WHEN [A] IS     NULL AND [B] IS     NULL THEN FALSE
    -     WHEN [A] IS     NULL AND [B] IS NOT NULL THEN TRUE
    -     WHEN [A] IS NOT NULL AND [B] IS     NULL THEN TRUE
    -     WHEN [A] =               [B]             THEN FALSE
    -     ELSE                                          TRUE
    -END
    -]]></sql><sql><![CDATA[-- [A] IS NOT DISTINCT FROM [B] 
    -CASE WHEN [A] IS     NULL AND [B] IS     NULL THEN TRUE
    -     WHEN [A] IS     NULL AND [B] IS NOT NULL THEN FALSE
    -     WHEN [A] IS NOT NULL AND [B] IS     NULL THEN FALSE
    -     WHEN [A] =               [B]             THEN TRUE
    -     ELSE                                          FALSE
    -END
    -]]></sql>
    -</code-pair><html>							
    -								</html></content>
    -							</section>
    -
    -						    <section id="between-predicate">
    -							    <title>BETWEEN predicate</title>
    -								<content><html>
    -									<p>
    -										The <code>BETWEEN</code> predicate can be seen as syntactic sugar for a pair of <reference id="comparison-predicate" title="comparison predicates"/>. According to the SQL standard, the following two predicates are equivalent:
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[[A] BETWEEN [B] AND [C]]]></sql><sql><![CDATA[[A] >= [B] AND [A] <= [C]]]></sql>
    -</code-pair><html>
    -
    -									<p>
    -										Note the inclusiveness of range boundaries in the definition of the <code>BETWEEN</code> predicate. Intuitively, this is supported in jOOQ as such:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[PUBLISHED_IN     BETWEEN 1920 AND 1940
    -PUBLISHED_IN NOT BETWEEN 1920 AND 1940]]></sql><java><![CDATA[BOOK.PUBLISHED_IN.between(1920).and(1940)
    -BOOK.PUBLISHED_IN.notBetween(1920).and(1940)]]></java>
    -</code-pair><html>
    -
    -									<h3>BETWEEN SYMMETRIC</h3>
    -									<p>
    -										The SQL standard defines the <code>SYMMETRIC</code> keyword to be used along with <code>BETWEEN</code> to indicate that you do not care which bound of the range is larger than the other. A database system should simply swap range bounds, in case the first bound is greater than the second one. jOOQ supports this keyword as well, simulating it if necessary.
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[PUBLISHED_IN     BETWEEN SYMMETRIC 1940 AND 1920
    -PUBLISHED_IN NOT BETWEEN SYMMETRIC 1940 AND 1920]]></sql><java><![CDATA[BOOK.PUBLISHED_IN.betweenSymmetric(1940).and(1920)
    -BOOK.PUBLISHED_IN.notBetweenSymmetric(1940).and(1920)]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										The simulation is done trivially:
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[[A] BETWEEN SYMMETRIC [B] AND [C]]]></sql><sql><![CDATA[([A] BETWEEN [B] AND [C]) OR ([A] BETWEEN [C] AND [B])]]></sql>
    -</code-pair><html>
    -
    -								</html></content>
    -							</section>
    -
    -						    <section id="between-predicate-degree-n">
    -							    <title>BETWEEN predicate (degree > 1)</title>
    -							    <content><html>
    -							    	<p>
    -							    	    The SQL <code>BETWEEN</code> predicate also works well for <reference id="row-value-expressions" title="row value expressions"/>. Much like the <reference id="between-predicate" title="BETWEEN predicate for degree 1"/>, it is defined in terms of a pair of regular <reference id="comparison-predicate" title="comparison predicates"/>:
    -							    	</p>
    -							    	
    -</html><code-pair>
    -<sql><![CDATA[[A] BETWEEN           [B] AND [C]
    -[A] BETWEEN SYMMETRIC [B] AND [C]]]></sql><sql><![CDATA[ [A] >= [B] AND [A] <= [C]
    -([A] >= [B] AND [A] <= [C]) OR ([A] >= [C] AND [A] <= [B])]]></sql>
    -</code-pair><html>
    -							    	
    -							    	<p>
    -							    		The above can be factored out according to the rules listed in the manual's section about <reference id="comparison-predicate-degree-n" title="row value expression comparison predicates"/>.
    -							    	</p>
    -							    	
    -							    	<p>
    -							    		jOOQ supports the <code>BETWEEN [SYMMETRIC]</code> predicate and simulates it in all SQL dialects where necessary. An example is given here:
    -							    	</p>
    -							    	
    -</html><java><![CDATA[row(BOOK.ID, BOOK.TITLE).between(1, "A").and(10, "Z");]]></java></content>
    -							</section>
    -							
    -						    <section id="like-predicate">
    -							    <title>LIKE predicate</title>
    -								<content><html>
    -									<p>
    -										<code>LIKE</code> predicates are popular for simple wildcard-enabled pattern matching. Supported wildcards in all SQL databases are:
    -									</p>
    -									<ul>
    -										<li><strong>_</strong>: (single-character wildcard)</li>
    -										<li><strong>%</strong>: (multi-character wildcard)</li>
    -									</ul>
    -									<p>
    -										With jOOQ, the <code>LIKE</code> predicate can be created from any <reference id="column-expressions" title="column expression"/> as such:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[TITLE     LIKE '%abc%'
    -TITLE NOT LIKE '%abc%']]></sql><java><![CDATA[BOOK.TITLE.like("%abc%")
    -BOOK.TITLE.notLike("%abc%")]]></java>
    -</code-pair><html>
    -									
    -									<h3>Escaping operands with the LIKE predicate</h3>
    -									<p>
    -										Often, your pattern may contain any of the wildcard characters <code>"_"</code> and <code>"%"</code>, in case of which you may want to escape them. jOOQ does not automatically escape patterns in <code>like()</code> and <code>notLike()</code> methods. Instead, you can explicitly define an escape character as such:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[TITLE     LIKE '%The !%-Sign Book%' ESCAPE '!'
    -TITLE NOT LIKE '%The !%-Sign Book%' ESCAPE '!']]></sql><java><![CDATA[BOOK.TITLE.like("%The !%-Sign Book%", '!')
    -BOOK.TITLE.notLike("%The !%-Sign Book%", '!')]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										In the above predicate expressions, the exclamation mark character is passed as the escape character to escape wildcard characters <code>"!_"</code> and <code>"!%"</code>, as well as to escape the escape character itself: <code>"!!"</code>
    -									</p>
    -									<p>
    -										Please refer to your database manual for more details about escaping patterns with the <code>LIKE</code> predicate.
    -									</p>
    -									
    -									<h3>jOOQ's convenience methods using the LIKE predicate</h3>
    -									<p>
    -										In addition to the above, jOOQ provides a few convenience methods for common operations performed on strings using the <code>LIKE</code> predicate. Typical operations are "contains predicates", "starts with predicates", "ends with predicates", etc. Here is the full convenience API wrapping <code>LIKE</code> predicates:
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[-- case insensitivity
    -LOWER(TITLE) LIKE LOWER('%abc%')
    -LOWER(TITLE) NOT LIKE LOWER('%abc%')
    -
    --- contains and similar methods
    -TITLE LIKE '%' || 'abc' || '%'
    -TITLE LIKE 'abc' || '%'
    -TITLE LIKE '%' || 'abc']]></sql><java><![CDATA[// case insensitivity
    -BOOK.TITLE.likeIgnoreCase("%abc%")
    -BOOK.TITLE.notLikeIgnoreCase("%abc%")
    -
    -// contains and similar methods
    -BOOK.TITLE.contains("abc")
    -BOOK.TITLE.startsWith("abc")
    -BOOK.TITLE.endsWith("abc")]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										Note, that jOOQ escapes <code>%</code> and <code>_</code> characters in value in some of the above predicate implementations. For simplicity, this has been omitted in this manual.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -						    <section id="in-predicate">
    -							    <title>IN predicate</title>
    -								<content><html>
    -									<p>
    -										In SQL, apart from comparing a value against several values, the <code>IN</code> predicate can be used to create semi-joins or anti-joins. jOOQ knows the following methods on the <reference class="org.jooq.Field" /> interface, to construct such <code>IN</code> predicates:
    -									</p>
    -
    -</html><java><![CDATA[in(Collection<T>)                   // Construct an IN predicate from a collection of bind values
    -in(T...)                            // Construct an IN predicate from bind values
    -in(Field<?>...)                     // Construct an IN predicate from column expressions
    -in(Select<? extends Record1<T>>)    // Construct an IN predicate from a subselect
    -notIn(Collection<T>)                // Construct a NOT IN predicate from a collection of bind values
    -notIn(T...)                         // Construct a NOT IN predicate from bind values
    -notIn(Field<?>...)                  // Construct a NOT IN predicate from column expressions
    -notIn(Select<? extends Record1<T>>) // Construct a NOT IN predicate from a subselect]]></java><html>
    -
    -									<p>
    -										A sample <code>IN</code> predicate might look like this:
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[TITLE     IN ('Animal Farm', '1984')
    -TITLE NOT IN ('Animal Farm', '1984')]]></sql><java><![CDATA[BOOK.TITLE.in("Animal Farm", "1984")
    -BOOK.TITLE.notIn("Animal Farm", "1984")]]></java>
    -</code-pair><html>
    -
    -									
    -									<h3>NOT IN and NULL values</h3>
    -									<p>
    -										Beware that you should probably not have any <code>NULL</code> values in the right hand side of a <code>NOT IN</code> predicate, as the whole expression would evaluate to <code>NULL</code>, which is rarely desired. This can be shown informally using the following reasoning:
    -									</p>
    -									
    -</html><sql>-- The following conditional expressions are formally or informally equivalent
    -A NOT IN (B, C)
    -A != ANY(B, C)
    -A != B AND A != C
    -
    --- Substitute C for NULL, you'll get
    -A NOT IN (B, NULL)   -- Substitute C for NULL
    -A != B AND A != NULL -- From the above rules
    -A != B AND NULL      -- [ANY] != NULL yields NULL
    -NULL                 -- [ANY] AND NULL yields NULL</sql><html>
    -
    -									<p>
    -										A good way to prevent this from happening is to use the <reference id="exists-predicate" title="EXISTS predicate"/> for anti-joins, which is <code>NULL</code>-value insensitive. See the manual's section about <reference id="conditional-expressions" title="conditional expressions"/> to see a boolean truth table.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -						    <section id="in-predicate-degree-n">
    -							    <title>IN predicate (degree > 1)</title>
    -							    <content><html>
    -							    	<p>
    -							    	    The SQL <code>IN</code> predicate also works well for <reference id="row-value-expressions" title="row value expressions"/>. Much like the <reference id="in-predicate" title="IN predicate for degree 1"/>, it is defined in terms of a <reference id="quantified-comparison-predicate" title="quantified comparison predicate"/>. The two expressions are equivalent:
    -							    	</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[R IN [IN predicate value]]]></sql><sql><![CDATA[R = ANY [IN predicate value]]]></sql>
    -</code-pair><html>		
    -
    -									<p>
    -							    		jOOQ supports the <code>IN</code> predicate. Simulation of the <code>IN</code> predicate where row value expressions aren't well supported is currently only available for <code>IN</code> predicates that do not take a subselect as an <code>IN</code> predicate value. An example is given here:
    -							    	</p>
    -							    	
    -</html><java><![CDATA[row(BOOK.ID, BOOK.TITLE).in(row(1, "A"), row(2, "B"));]]></java></content>
    -							</section>
    -							
    -						    <section id="exists-predicate">
    -							    <title>EXISTS predicate</title>
    -								<content><html>
    -									<p>
    -										Slightly less intuitive, yet more powerful than the previously discussed <reference id="in-predicate" title="IN predicate"/> is the <code>EXISTS</code> predicate, that can be used to form semi-joins or anti-joins. With jOOQ, the <code>EXISTS</code> predicate can be formed in various ways:
    -									</p>
    -									<ul>
    -										<li>From the <reference id="dsl" title="DSL"/>, using static methods. This is probably the most used case</li>
    -										<li>From a <reference id="conditional-expressions" title="conditional expression"/> using <reference id="boolean-operators" title="convenience methods attached to boolean operators"/></li>
    -										<li>From a <reference id="select-statement" title="SELECT statement"/> using <reference id="where-clause" title="convenience methods attached to the where clause"/>, and from other clauses</li>
    -									</ul>
    -									
    -									<p>
    -										An example of an <code>EXISTS</code> predicate can be seen here:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[    EXISTS (SELECT 1 FROM BOOK 
    -            WHERE AUTHOR_ID = 3)
    -NOT EXISTS (SELECT 1 FROM BOOK 
    -            WHERE AUTHOR_ID = 3)]]></sql><java><![CDATA[   exists(create.selectOne().from(BOOK)
    -                .where(BOOK.AUTHOR_ID.equal(3)));
    -notExists(create.selectOne().from(BOOK)
    -                .where(BOOK.AUTHOR_ID.equal(3)));]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										Note that in SQL, the projection of a subselect in an <code>EXISTS</code> predicate is irrelevant. To help you write queries like the above, you can use jOOQ's selectZero() or selectOne() <reference id="dsl" title="DSL"/> methods
    -									</p>
    -									
    -									<h3>Performance of IN vs. EXISTS</h3>
    -									<p>
    -										In theory, the two types of predicates can perform equally well. If your database system ships with a sophisticated cost-based optimiser, it will be able to transform one predicate into the other, if you have all necessary constraints set (e.g. referential constraints, not null constraints). However, in reality, performance between the two might differ substantially. An interesting blog post investigating this topic on the MySQL database can be seen here:<br/>
    -										<a href="http://blog.jooq.org/2012/07/27/not-in-vs-not-exists-vs-left-join-is-null-mysql/">http://blog.jooq.org/2012/07/27/not-in-vs-not-exists-vs-left-join-is-null-mysql/</a>
    -									</p>
    -								</html></content>
    -							</section>
    -							
    -							<section id="overlaps-predicate">
    -								<title>OVERLAPS predicate</title>
    -								<content><html>
    -									<p>
    -										When comparing dates, the SQL standard allows for using a special <code>OVERLAPS</code> predicate, which checks whether two date ranges overlap each other. The following can be said:
    -									</p>
    -
    -</html><sql><![CDATA[-- This yields true
    -(DATE '2010-01-01', DATE '2010-01-03') OVERLAPS (DATE '2010-01-02' DATE '2010-01-04')
    -
    --- INTERVAL data types are also supported. This is equivalent to the above
    -(DATE '2010-01-01', CAST('+2 00:00:00' AS INTERVAL DAY TO SECOND)) OVERLAPS 
    -(DATE '2010-01-02', CAST('+2 00:00:00' AS INTERVAL DAY TO SECOND))]]></sql><html>
    -
    -									<h3>The OVERLAPS predicate in jOOQ</h3>
    -									<p>
    -									    jOOQ supports the <code>OVERLAPS</code> predicate on <reference id="row-value-expressions" title="row value expressions of degree 2"/>. The following methods are contained in <reference class="org.jooq.Row2"/>:
    -									</p>
    -
    -</html><java><![CDATA[Condition overlaps(T1 t1, T2 t2);
    -Condition overlaps(Field<T1> t1, Field<T2> t2);
    -Condition overlaps(Row2<T1, T2> row);]]></java><html>
    -
    -									<p>
    -										This allows for expressing the above predicates as such:
    -									</p>																		
    -
    -</html><java><![CDATA[// The date range tuples version
    -row(Date.valueOf('2010-01-01'), Date.valueOf('2010-01-03')).overlaps(Date.valueOf('2010-01-02'), Date.valueOf('2010-01-04'))
    -
    -// The INTERVAL tuples version
    -row(Date.valueOf('2010-01-01'), new DayToSecond(2)).overlaps(Date.valueOf('2010-01-02'), new DayToSecond(2))]]></java><html>
    -
    -									<h3>jOOQ's extensions to the standard</h3>
    -									<p>
    -										Unlike the standard (or any database implementing the standard), jOOQ also supports the <code>OVERLAPS</code> predicate for comparing arbitrary <reference id="row-value-expressions" title="row vlaue expressions of degree 2"/>. For instance, <code>(1, 3) OVERLAPS (2, 4)</code> will yield true in jOOQ. This is simulated as such
    -									</p>
    -									
    -</html><sql><![CDATA[-- This predicate
    -(A, B) OVERLAPS (C, D)
    -
    --- can be simulated as such
    -(C <= B) AND (A <= D)]]></sql></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -					<section id="plain-sql">
    -						<title>Plain SQL</title>
    -						<content><html>
    -							<p>
    -								A DSL is a nice thing to have, it feels "fluent" and "natural", especially if it models a well-known language, such as SQL. But a DSL is always expressed in a host language (Java in this case), which was not made for exactly the same purposes as its hosted DSL. If it were, then jOOQ would be implemented on a compiler-level, similar to LINQ in .NET. But it's not, and so, the DSL is limited by language constraints of its host language. We have seen many functionalities where the DSL becomes a bit verbose. This can be especially true for:
    -							</p>
    -							<ul>
    -								<li><reference id="aliased-columns" title="aliasing"/></li>
    -								<li><reference id="nested-selects" title="nested selects"/></li>
    -								<li><reference id="arithmetic-expressions" title="arithmetic expressions"/></li>
    -								<li><reference id="cast-expressions" title="casting"/></li>
    -							</ul>
    -							
    -							<p>
    -								You'll probably find other examples. If verbosity scares you off, don't worry. The verbose use-cases for jOOQ are rather rare, and when they come up, you do have an option. Just write SQL the way you're used to!
    -							</p>
    -							<p>
    -								jOOQ allows you to embed SQL as a String into any supported <reference id="sql-statements" title="statement"/> in these contexts:
    -							</p>
    -							<ul>
    -								<li>Plain SQL as a <reference id="conditional-expressions" title="conditional expression"/></li>
    -								<li>Plain SQL as a <reference id="column-expressions" title="column expression"/></li>
    -								<li>Plain SQL as a <reference id="column-expressions" title="function"/></li>
    -								<li>Plain SQL as a <reference id="table-expressions" title="table expression"/></li>
    -								<li>Plain SQL as a <reference id="query-vs-resultquery" title="query"/></li>
    -							</ul>
    -
    -							<h3>The DSL plain SQL API</h3>
    -							<p>
    -								Plain SQL API methods are usually overloaded in three ways. Let's look at the <code>condition</code> query part constructor:
    -							</p>
    -</html><java><![CDATA[// Construct a condition without bind values
    -// Example: condition("a = b")
    -Condition condition(String sql);
    -
    -// Construct a condition with bind values
    -// Example: condition("a = ?", 1);
    -Condition condition(String sql, Object... bindings);
    -
    -// Construct a condition taking other jOOQ object arguments
    -// Example: condition("a = {0}", val(1));
    -Condition condition(String sql, QueryPart... parts);]]></java><html>
    -							
    -							<p>
    -								Please refer to the <reference class="org.jooq.impl.DSL"/> Javadoc for more details. The following is a more complete listing of plain SQL construction methods from the DSL:
    -							</p>
    -
    -</html><java><![CDATA[// A condition
    -Condition condition(String sql);
    -Condition condition(String sql, Object... bindings);
    -Condition condition(String sql, QueryPart... parts);
    -
    -// A field with an unknown data type
    -Field<Object> field(String sql);
    -Field<Object> field(String sql, Object... bindings);
    -Field<Object> field(String sql, QueryPart... parts);
    -
    -// A field with a known data type
    -<T> Field<T> field(String sql, Class<T> type);
    -<T> Field<T> field(String sql, Class<T> type, Object... bindings);
    -<T> Field<T> field(String sql, Class<T> type, QueryPart... parts);
    -<T> Field<T> field(String sql, DataType<T> type);
    -<T> Field<T> field(String sql, DataType<T> type, Object... bindings);
    -<T> Field<T> field(String sql, DataType<T> type, QueryPart... parts);
    -
    -// A field with a known name (properly escaped)
    -Field<Object> fieldByName(String... fieldName);
    -<T> Field<T>  fieldByName(Class<T> type, String... fieldName);
    -<T> Field<T>  fieldByName(DataType<T> type, String... fieldName)
    -
    -// A function
    -<T> Field<T> function(String name, Class<T> type, Field<?>... arguments);
    -<T> Field<T> function(String name, DataType<T> type, Field<?>... arguments);
    -
    -// A table
    -Table<?> table(String sql);
    -Table<?> table(String sql, Object... bindings);
    -Table<?> table(String sql, QueryPart... parts);
    -
    -// A table with a known name (properly escaped)
    -Table<Record> tableByName(String... fieldName);
    -
    -// A query without results (update, insert, etc)
    -Query query(String sql);
    -Query query(String sql, Object... bindings);
    -Query query(String sql, QueryPart... parts);
    -
    -// A query with results
    -ResultQuery<Record> resultQuery(String sql);
    -ResultQuery<Record> resultQuery(String sql, Object... bindings);
    -ResultQuery<Record> resultQuery(String sql, QueryPart... parts);
    -
    -// A query with results. This is the same as resultQuery(...).fetch();
    -Result<Record> fetch(String sql);
    -Result<Record> fetch(String sql, Object... bindings);
    -Result<Record> fetch(String sql, QueryPart... parts);]]></java><html>
    -
    -							<p>
    -								Apart from the general factory methods, plain SQL is also available in various other contexts. For instance, when adding a <code>.where("a = b")</code> clause to a query. Hence, there exist several convenience methods where plain SQL can be inserted usefully. This is an example displaying all various use-cases in one single query:
    -							</p>
    -							
    -</html><java><![CDATA[// You can use your table aliases in plain SQL fields
    -// As long as that will produce syntactically correct SQL
    -Field<?> LAST_NAME    = create.field("a.LAST_NAME");
    -
    -// You can alias your plain SQL fields
    -Field<?> COUNT1       = create.field("count(*) x");
    -
    -// If you know a reasonable Java type for your field, you
    -// can also provide jOOQ with that type
    -Field<Integer> COUNT2 = create.field("count(*) y", Integer.class);
    -
    -       // Use plain SQL as select fields
    -create.select(LAST_NAME, COUNT1, COUNT2)
    -
    -       // Use plain SQL as aliased tables (be aware of syntax!)
    -      .from("author a")
    -      .join("book b")
    -
    -       // Use plain SQL for conditions both in JOIN and WHERE clauses
    -      .on("a.id = b.author_id")
    -
    -       // Bind a variable in plain SQL
    -      .where("b.title != ?", "Brida")
    -
    -       // Use plain SQL again as fields in GROUP BY and ORDER BY clauses
    -      .groupBy(LAST_NAME)
    -      .orderBy(LAST_NAME);]]></java><html>
    -
    -							<h3>Important things to note about plain SQL!</h3>
    -							<p>
    -								There are some important things to keep in mind when using plain SQL:
    -							</p>
    -							<ul>
    -								<li>jOOQ doesn't know what you're doing. You're on your own again!</li>
    -								<li>You have to provide something that will be syntactically correct. If it's not, then jOOQ won't know. Only your JDBC driver or your RDBMS will detect the syntax error.</li>
    -								<li>You have to provide consistency when you use variable binding. The number of ? must match the number of variables</li>
    -								<li>Your SQL is inserted into jOOQ queries without further checks. Hence, jOOQ can't prevent SQL injection. </li>
    -							</ul>
    -						</html></content>
    -					</section>
    -
    -					<section id="bind-values">
    -					    <title>Bind values and parameters</title>
    -						<content><html>
    -							<p>
    -								Bind values are used in SQL / JDBC for various reasons. Among the most obvious ones are:
    -							</p>
    -							<ul>
    -								<li>
    -									Protection against SQL injection. Instead of inlining values possibly originating from user input, you bind those values to your prepared statement and let the JDBC driver / database take care of handling security aspects.
    -								</li>
    -								<li>
    -									Increased speed. Advanced databases such as Oracle can keep execution plans of similar queries in a dedicated cache to prevent hard-parsing your query again and again. In many cases, the actual value of a bind variable does not influence the execution plan, hence it can be reused. Preparing a statement will thus be faster
    -								</li>
    -								<li>
    -									On a JDBC level, you can also reuse the SQL string and prepared statement object instead of constructing it again, as you can bind new values to the prepared statement. jOOQ currently does not cache prepared statements, internally.
    -								</li>
    -							</ul>
    -							
    -							<p>
    -								The following sections explain how you can introduce bind values in jOOQ, and how you can control the way they are rendered and bound to SQL.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -						    <section id="indexed-parameters">
    -							    <title>Indexed parameters</title>
    -								<content><html>
    -									<p>
    -										JDBC only knows indexed bind values. A typical example for using bind values with JDBC is this:
    -									</p>
    -									
    -</html><java><![CDATA[PreparedStatement stmt = connection.prepareStatement("SELECT * FROM BOOK WHERE ID = ? AND TITLE = ?");
    -
    -// bind values to the above statement for appropriate indexes 
    -stmt.setInt(1, 5);
    -stmt.setString(2, "Animal Farm");
    -stmm.executeQuery();]]></java><html>
    -
    -									<p>
    -										With dynamic SQL, keeping track of the number of question marks and their corresponding index may turn out to be hard. jOOQ abstracts this and lets you provide the bind value right where it is needed. A trivial example is this:
    -									</p>
    -									
    -</html><java><![CDATA[create.select().from(BOOK).where(BOOK.ID.equal(5)).and(BOOK.TITLE.equal("Animal Farm"));
    -
    -// This notation is in fact a short form for the equivalent:
    -create.select().from(BOOK).where(BOOK.ID.equal(val(5))).and(BOOK.TITLE.equal(val("Animal Farm")));]]></java><html>
    -
    -									<p>
    -										Note the using of <reference class="org.jooq.impl.DSL" anchor="#val(java.lang.Object)" title="DSL.val()"/> to explicitly create an indexed bind value. You don't have to worry about that index. When the query is <reference id="sql-rendering" title="rendered"/>, each bind value will render a question mark. When the query <reference id="variable-binding" title="binds its variables"/>, each bind value will generate the appropriate bind value index. 
    -									</p>
    -									
    -									<h3>Extract bind values from a query</h3>
    -									<p>
    -										Should you decide to run the above query outside of jOOQ, using your own <reference class="java.sql.PreparedStatement"/>, you can do so as follows:
    -									</p>
    -									
    -</html><java><![CDATA[Select<?> select = create.select().from(BOOK).where(BOOK.ID.equal(5)).and(BOOK.TITLE.equal("Animal Farm"));
    -
    -// Render the SQL statement:
    -String sql = select.getSQL();
    -assertEquals("SELECT * FROM BOOK WHERE ID = ? AND TITLE = ?", sql);
    -
    -// Get the bind values:
    -List<Object> values = select.getBindValues();
    -assertEquals(2, values.size());
    -assertEquals(5, values.get(0));
    -assertEquals("Animal Farm", values.get(1));]]></java><html>
    -
    -									<p>
    -										You can also extract specific bind values by index from a query, if you wish to modify their underlying value after creating a query. This can be achieved as such:
    -									</p>
    -
    -</html><java><![CDATA[Select<?> select = create.select().from(BOOK).where(BOOK.ID.equal(5)).and(BOOK.TITLE.equal("Animal Farm"));
    -Param<?> param = select.getParam("2");
    -
    -// You could now modify the Query's underlying bind value:
    -if ("Animal Farm".equals(param.getValue())) {
    -    param.setConverted("1984");
    -}]]></java><html>
    -
    -									<p>
    -										For more details about jOOQ's internals, see the manual's section about <reference id="queryparts" title="QueryParts"/>.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -						    <section id="named-parameters">
    -							    <title>Named parameters</title>
    -								<content><html>
    -									<p>
    -										Some SQL access abstractions that are built on top of JDBC, or some that bypass JDBC may support named parameters. jOOQ allows you to give names to your parameters as well, although those names are not rendered to SQL strings by default. Here is an example of how to create named parameters using the <reference class="org.jooq.Param"/> type:
    -									</p>
    -
    -</html><java><![CDATA[// Create a query with a named parameter. You can then use that name for accessing the parameter again
    -Query query1 = create.select().from(AUTHOR).where(LAST_NAME.equal(param("lastName", "Poe")));
    -Param<?> param1 = query.getParam("lastName");
    -
    -// Or, keep a reference to the typed parameter in order not to lose the <T> type information:
    -Param<String> param2 = param("lastName", "Poe");
    -Query query2 = create.select().from(AUTHOR).where(LAST_NAME.equal(param2));
    -
    -// You can now change the bind value directly on the Param reference:
    -param2.setValue("Orwell");]]></java><html>
    -
    -									<p>
    -										The <reference class="org.jooq.Query"/> interface also allows for setting new bind values directly, without accessing the Param type:
    -									</p>
    -
    -</html><java><![CDATA[Query query1 = create.select().from(AUTHOR).where(LAST_NAME.equal("Poe"));
    -query1.bind(1, "Orwell");
    -
    -// Or, with named parameters
    -Query query2 = create.select().from(AUTHOR).where(LAST_NAME.equal(param("lastName", "Poe")));
    -query2.bind("lastName", "Orwell");]]></java><html>
    -
    -									<p>
    -										In order to actually render named parameter names in generated SQL, use the <reference class="org.jooq.DSLContext" anchor="#renderNamedParams(org.jooq.QueryPart)" title="DSLContext.renderNamedParams()"/> method:
    -									</p>
    -
    -</html><code-pair>
    -<java><![CDATA[create.renderNamedParams(
    -    create.select()
    -          .from(AUTHOR)
    -          .where(LAST_NAME.equal(
    -                 param("lastName", "Poe"))));]]></java><sql><![CDATA[-- The named bind variable can be rendered
    -
    -SELECT *
    -FROM AUTHOR
    -WHERE LAST_NAME = :lastName]]></sql>
    -</code-pair><html>
    -								</html></content>
    -							</section>
    -
    -						    <section id="inlined-parameters">
    -							    <title>Inlined parameters</title>
    -								<content><html>
    -									<p>
    -										Sometimes, you may wish to avoid rendering bind variables while still using custom values in SQL. jOOQ refers to that as "inlined" bind values. When bind values are inlined, they render the actual value in SQL rather than a JDBC question mark. Bind value inlining can be achieved in two ways:
    -									</p>
    -									<ul>
    -										<li>
    -											By using the <reference id="custom-settings" title="Settings"/> and setting the <reference class="org.jooq.conf.StatementType"/> to STATIC_STATEMENT. This will inline all bind values for SQL statements rendered from such a Configuration.
    -										</li>
    -										<li>
    -											By using <reference class="org.jooq.impl.DSL" anchor="#inline(java.lang.Object)" title="DSL.inline()"/> methods.
    -										</li>
    -									</ul>
    -									<p>
    -										In both cases, your inlined bind values will be properly escaped to avoid SQL syntax errors and SQL injection. Some examples:
    -									</p>
    -
    -</html><java><![CDATA[
    -// Use dedicated calls to inline() in order to specify
    -// single bind values to be rendered as inline values
    -// --------------------------------------------------
    -create.select()
    -      .from(AUTHOR)
    -      .where(LAST_NAME.equal(inline("Poe")));
    -
    -// Or render the whole query with inlined values
    -// --------------------------------------------------
    -Settings settings = new Settings()
    -    .withStatementType(StatementType.STATIC_STATEMENT);
    -
    -// Add the settings to the Configuration
    -DSLContext create = DSL.using(connection, SQLDialect.ORACLE, settings);
    -
    -// Run queries that omit rendering schema names
    -create.select()
    -      .from(AUTHOR)
    -      .where(LAST_NAME.equal("Poe"));]]></java></content>
    -							</section>
    -
    -						    <section id="sql-injection-and-plain-sql-queryparts">
    -							    <title>SQL injection and plain SQL QueryParts</title>
    -								<content><html>
    -									<p>
    -										Special care needs to be taken when using <reference id="plain-sql" title="plain SQL QueryParts"/>. While jOOQ's API allows you to specify bind values for use with plain SQL, you're not forced to do that. For instance, both of the following queries will lead to the same, valid result:
    -									</p>
    -									
    -</html><java><![CDATA[// This query will use bind values, internally.
    -create.fetch("SELECT * FROM BOOK WHERE ID = ? AND TITLE = ?", 5 "Animal Farm");
    -
    -// This query will not use bind values, internally.
    -create.fetch("SELECT * FROM BOOK WHERE ID = 5 AND TITLE = 'Animal Farm'");]]></java><html>
    -
    -									<p>
    -										All methods in the jOOQ API that allow for plain (unescaped, untreated) SQL contain a warning message in their relevant Javadoc, to remind you of the risk of SQL injection in what is otherwise a SQL-injection-safe API.
    -									</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -					<section id="queryparts">
    -					    <title>QueryParts</title>
    -						<content><html>
    -							<p>
    -								A <reference class="org.jooq.Query" /> and all its contained objects is a <reference class="org.jooq.QueryPart" />. QueryParts essentially provide this functionality:
    -							</p>
    -							<ul>
    -								<li>they can <reference id="sql-rendering" title="render SQL"/> using the <reference class="org.jooq.QueryPartInternal" anchor="#toSQL(org.jooq.RenderContext)" title="toSQL(RenderContext)"/> method</li>
    -								<li>they can <reference id="variable-binding" title="bind variables"/> using the <reference class="org.jooq.QueryPartInternal" anchor="#bind(org.jooq.BindContext)" title="bind(BindContext)"/> method</li>
    -							</ul>
    -
    -							<p>
    -								Both of these methods are contained in jOOQ's internal API's <reference class="org.jooq.QueryPartInternal"/>, which is internally implemented by every QueryPart.
    -							</p>
    -
    -							<p>
    -								The following sections explain some more details about <reference id="sql-rendering" title="SQL rendering"/> and <reference id="variable-binding" title="variable binding"/>, as well as other implementation details about QueryParts in general.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -						    <section id="sql-rendering">
    -							    <title>SQL rendering</title>
    -								<content><html>
    -									<p>
    -										Every <reference class="org.jooq.QueryPart"/> must implement the <reference class="org.jooq.QueryPartInternal" anchor="#toSQL(org.jooq.RenderContext)" title="toSQL(RenderContext)"/> method to render its SQL string to a <reference class="org.jooq.RenderContext"/>. This RenderContext has two purposes:
    -									</p>
    -									<ul>
    -										<li>It provides some information about the "state" of SQL rendering.</li>
    -										<li>It provides a common API for constructing SQL strings on the context's internal <reference class="java.lang.StringBuilder"/></li>
    -									</ul>
    -									<p>
    -										An overview of the <reference class="org.jooq.RenderContext"/> API is given here:
    -									</p>
    -
    -</html><java><![CDATA[// These methods are useful for generating unique aliases within a RenderContext (and thus within a Query)
    -String peekAlias();
    -String nextAlias();
    -
    -// These methods return rendered SQL
    -String render();
    -String render(QueryPart part);
    -
    -// These methods allow for fluent appending of SQL to the RenderContext's internal StringBuilder
    -RenderContext keyword(String keyword);
    -RenderContext literal(String literal);
    -RenderContext sql(String sql);
    -RenderContext sql(char sql);
    -RenderContext sql(int sql);
    -RenderContext sql(QueryPart part);
    -
    -// These methods allow for controlling formatting of SQL, if the relevant Setting is active
    -RenderContext formatNewLine();
    -RenderContext formatSeparator();
    -RenderContext formatIndentStart();
    -RenderContext formatIndentStart(int indent);
    -RenderContext formatIndentLockStart();
    -RenderContext formatIndentEnd();
    -RenderContext formatIndentEnd(int indent);
    -RenderContext formatIndentLockEnd();
    -
    -// These methods control the RenderContext's internal state
    -boolean       inline();
    -RenderContext inline(boolean inline);
    -boolean       qualify();
    -RenderContext qualify(boolean qualify);
    -boolean       namedParams();
    -RenderContext namedParams(boolean renderNamedParams);
    -CastMode      castMode();
    -RenderContext castMode(CastMode mode);
    -Boolean       cast();
    -RenderContext castModeSome(SQLDialect... dialects);]]></java><html>
    -
    -									<p>
    -										The following additional methods are inherited from a common <reference class="org.jooq.Context"/>, which is shared among <reference class="org.jooq.RenderContext"/> and <reference class="org.jooq.BindContext"/>:
    -									</p>
    -
    -</html><java><![CDATA[// These methods indicate whether fields or tables are being declared (MY_TABLE AS MY_ALIAS) or referenced (MY_ALIAS)
    -boolean declareFields();
    -Context declareFields(boolean declareFields);
    -boolean declareTables();
    -Context declareTables(boolean declareTables);
    -
    -// These methods indicate whether a top-level query is being rendered, or a subquery
    -boolean subquery();
    -Context subquery(boolean subquery);
    -
    -// These methods provide the bind value indices within the scope of the whole Context (and thus of the whole Query)
    -int nextIndex();
    -int peekIndex();]]></java><html>
    -
    -									<h3>An example of rendering SQL</h3>
    -								   	<p>
    -								   		A simple example can be provided by checking out jOOQ's internal representation of a (simplified) <reference id="comparison-predicate" title="CompareCondition"/>. It is used for any <reference class="org.jooq.Condition"/> comparing two fields as for example the <code>AUTHOR.ID = BOOK.AUTHOR_ID</code> condition here:
    -							   		</p>
    -							   		
    -</html><sql>-- [...]
    -FROM AUTHOR
    -JOIN BOOK ON AUTHOR.ID = BOOK.AUTHOR_ID
    --- [...]</sql><html>
    -
    -									<p>
    -										This is how jOOQ renders such a condition (simplified example):
    -									</p>
    -
    -</html><java><![CDATA[@Override
    -public final void toSQL(RenderContext context) {
    -    // The CompareCondition delegates rendering of the Fields to the Fields
    -    // themselves and connects them using the Condition's comparator operator:
    -    context.sql(field1)
    -           .sql(" ")
    -           .sql(comparator.toSQL())
    -           .sql(" ")
    -           .sql(field2);
    -}]]></java><html>
    -
    -									<p>
    -										See the manual's sections about <reference id="custom-queryparts" title="custom QueryParts"/> and <reference id="plain-sql-queryparts" title="plain SQL QueryParts"/> to learn about how to write your own query parts in order to extend jOOQ.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="pretty-printing">
    -								<title>Pretty printing SQL</title>
    -								<content><html>
    -									<p>
    -										As mentioned in the previous chapter about <reference id="sql-rendering" title="SQL rendering"/>, there are some elements in the <reference class="org.jooq.RenderContext"/> that are used for formatting / pretty-printing rendered SQL. In order to obtain pretty-printed SQL, just use the following <reference id="custom-settings" title="custom settings"/>: 
    -									</p>
    -	
    -	
    -</html><java><![CDATA[// Create a DSLContext that will render "formatted" SQL
    -DSLContext pretty = DSL.using(dialect, new Settings().withRenderFormatted(true));]]></java><html>
    -
    -									<p>
    -										And then, use the above DSLContext to render pretty-printed SQL:
    -									</p>
    -									
    -</html><code-pair>
    -<java><![CDATA[String sql = pretty.select(
    -                       AUTHOR.LAST_NAME, count().as("c"))
    -                   .from(BOOK)
    -                   .join(AUTHOR)
    -                   .on(BOOK.AUTHOR_ID.equal(AUTHOR.ID))
    -                   .where(BOOK.TITLE.notEqual("1984"))
    -                   .groupBy(AUTHOR.LAST_NAME)
    -                   .having(count().equal(2))
    -                   .getSQL();]]></java><sql><![CDATA[select 
    -  "TEST"."AUTHOR"."LAST_NAME", 
    -  count(*) "c"
    -from "TEST"."BOOK"
    -  join "TEST"."AUTHOR"
    -  on "TEST"."BOOK"."AUTHOR_ID" = "TEST"."AUTHOR"."ID"
    -where "TEST"."BOOK"."TITLE" <> '1984'
    -group by "TEST"."AUTHOR"."LAST_NAME"
    -having count(*) = 2]]></sql>
    -</code-pair><html>
    -
    -									<p>
    -										The section about <reference id="execute-listeners" title="ExecuteListeners"/> shows an example of how such pretty printing can be used to log readable SQL to the stdout.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -						    <section id="variable-binding">
    -							    <title>Variable binding</title>
    -								<content><html>
    -									<p>
    -										Every <reference class="org.jooq.QueryPart"/> must implement the <reference class="org.jooq.QueryPartInternal" anchor="#bind(org.jooq.BindContext)" title="bind(BindContext)"/> method. This BindContext has two purposes:
    -									</p>
    -									<ul>
    -										<li>It provides some information about the "state" of the variable binding in process.</li>
    -										<li>It provides a common API for binding values to the context's internal <reference class="java.sql.PreparedStatement"/></li>
    -									</ul>
    -									<p>
    -										An overview of the <reference class="org.jooq.RenderContext"/> API is given here:
    -									</p>
    -
    -</html><java><![CDATA[// This method provides access to the PreparedStatement to which bind values are bound
    -PreparedStatement statement();
    -
    -// These methods provide convenience to delegate variable binding
    -BindContext bind(QueryPart part) throws DataAccessException;
    -BindContext bind(Collection<? extends QueryPart> parts) throws DataAccessException;
    -BindContext bind(QueryPart[] parts) throws DataAccessException;
    -
    -// These methods perform the actual variable binding
    -BindContext bindValue(Object value, Class<?> type) throws DataAccessException;
    -BindContext bindValues(Object... values) throws DataAccessException;]]></java><html>
    -
    -									<p>
    -										Some additional methods are inherited from a common <reference class="org.jooq.Context"/>, which is shared among <reference class="org.jooq.RenderContext"/> and <reference class="org.jooq.BindContext"/>. Details are documented in the previous chapter about <reference id="sql-rendering" title="SQL rendering"/>
    -									</p>
    -
    -									<h3>An example of binding values to SQL</h3>
    -								   	<p>
    -								   		A simple example can be provided by checking out jOOQ's internal representation of a (simplified) <reference id="comparison-predicate" title="CompareCondition"/>. It is used for any <reference class="org.jooq.Condition"/> comparing two fields as for example the <code>AUTHOR.ID = BOOK.AUTHOR_ID</code> condition here:
    -							   		</p>
    -							   		
    -</html><sql>-- [...]
    -WHERE AUTHOR.ID = ?
    --- [...]</sql><html>
    -
    -									<p>
    -										This is how jOOQ binds values on such a condition:
    -									</p>
    -</html><java><![CDATA[@Override
    -public final void bind(BindContext context) throws DataAccessException {
    -    // The CompareCondition itself does not bind any variables.
    -    // But the two fields involved in the condition might do so...
    -    context.bind(field1).bind(field2);
    -}]]></java><html>
    -
    -									<p>
    -										See the manual's sections about <reference id="custom-queryparts" title="custom QueryParts"/> and <reference id="plain-sql-queryparts" title="plain SQL QueryParts"/> to learn about how to write your own query parts in order to extend jOOQ.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -						    <section id="custom-queryparts">
    -							    <title>Extend jOOQ with custom types</title>
    -								<content><html>
    -									<p>
    -										If a SQL clause is too complex to express with jOOQ, you can extend either one of the following types for use directly in a jOOQ query:
    -									</p>
    -									
    -</html><java><![CDATA[public abstract class CustomField<T> extends AbstractField<T> {}
    -public abstract class CustomCondition extends AbstractCondition {}
    -public abstract class CustomTable<R extends TableRecord<R>> extends TableImpl<R> {}
    -public abstract class CustomRecord<R extends TableRecord<R>> extends TableRecordImpl<R> {}]]></java><html>
    -
    -									<p>
    -										These classes are declared public and covered by jOOQ's integration tests. When you extend these classes, you will have to provide your own implementations for the <reference id="queryparts" title="QueryParts'"/> <reference id="sql-rendering" title="toSQL()"/> and <reference id="variable-binding" title="bind()"/> methods, as discussed before:
    -									</p>
    -									
    -</html><java><![CDATA[// This method must produce valid SQL. If your QueryPart contains other QueryParts, you may delegate SQL generation to them
    -// in the correct order, passing the render context.
    -//
    -// If context.inline() is true, you must inline all bind variables
    -// If context.inline() is false, you must generate ? for your bind variables
    -public void toSQL(RenderContext context);
    -
    -// This method must bind all bind variables to a PreparedStatement. If your QueryPart contains other QueryParts, $
    -// you may delegate variable binding to them in the correct order, passing the bind context.
    -//
    -// Every QueryPart must ensure, that it starts binding its variables at context.nextIndex().
    -public void bind(BindContext context) throws DataAccessException;]]></java><html>
    -
    -									<p>
    -										The above contract may be a bit tricky to understand at first. The best thing is to check out jOOQ source code and have a look at a couple of QueryParts, to see how it's done. Here's an example <reference class="org.jooq.impl.CustomField"/> showing how to create a field multiplying another field by 2
    -									</p>
    -									
    -</html><java><![CDATA[// Create an anonymous CustomField, initialised with BOOK.ID arguments
    -final Field<Integer> IDx2 = new CustomField<Integer>(BOOK.ID.getName(), BOOK.ID.getDataType()) {
    -    @Override
    -    public void toSQL(RenderContext context) {
    -    
    -        // In inline mode, render the multiplication directly
    -        if (context.inline()) {
    -            context.sql(BOOK.ID).sql(" * 2");
    -        }
    -        
    -        // In non-inline mode, render a bind value
    -        else {
    -            context.sql(BOOK.ID).sql(" * ?");
    -        }
    -    }
    -
    -    @Override
    -    public void bind(BindContext context) {
    -        try {
    -        
    -            // Manually bind the value 2
    -            context.statement().setInt(context.nextIndex(), 2);
    -            
    -            // Alternatively, you could also write:
    -            // context.bind(DSL.val(2));
    -        }
    -        catch (SQLException e) {
    -            throw translate(getSQL(), e);
    -        }
    -    }
    -};
    -
    -// Use the above field in a SQL statement:
    -create.select(IDx2).from(BOOK);]]></java></content>
    -							</section>
    -							
    -						    <section id="plain-sql-queryparts">
    -							    <title>Plain SQL QueryParts</title>
    -								<content><html>
    -									<p>
    -										If you don't need the integration of rather complex QueryParts into jOOQ, then you might be safer using simple <reference id="plain-sql" title="Plain SQL"/> functionality, where you can provide jOOQ with a simple String representation of your embedded SQL. Plain SQL methods in jOOQ's API come in two flavours. 
    -									</p>
    -									<ul>
    -										<li><strong>method(String, Object...)</strong>: This is a method that accepts a SQL string and a list of bind values that are to be bound to the variables contained in the SQL string</li>
    -										<li><strong>method(String, QueryPart...)</strong>: This is a method that accepts a SQL string and a list of QueryParts that are "injected" at the position of their respective placeholders in the SQL string</li>
    -									</ul>
    -									<p>
    -										The above distinction is best explained using an example:
    -									</p>
    -									
    -</html><java><![CDATA[// Plain SQL using bind values. The value 5 is bound to the first variable, "Animal Farm" to the second variable:
    -create.selectFrom(BOOK).where("BOOK.ID = ? AND TITLE = ?", 5, "Animal Farm");
    -
    -// Plain SQL using placeholders (counting from zero). 
    -// The QueryPart "id" is substituted for the placeholder {0}, the QueryPart "title" for {1}
    -Field<Integer> id   = val(5);
    -Field<String> title = val("Animal Farm");
    -create.selectFrom(BOOK).where("BOOK.ID = {0} AND TITLE = {1}", id, title);]]></java><html>
    -
    -									<p>
    -										The above technique allows for creating rather complex SQL clauses that are currently not supported by jOOQ, without extending any of the <reference id="custom-queryparts" title="custom QueryParts"/> as indicated in the previous chapter.
    -									</p>									
    -								</html></content>
    -							</section>
    -
    -						    <section id="serializability">
    -							    <title>Serializability</title>
    -								<content><html>
    -									<p>
    -										The only transient, non-serializable element in any jOOQ object is the <reference id="dsl-context" title="Configuration's"/> underlying <reference class="java.sql.Connection"/>. When you want to execute queries after de-serialisation, or when you want to store/refresh/delete <reference id="crud-with-updatablerecords" title="Updatable Records"/>, you may have to "re-attach" them to a Configuration
    -									</p>
    -
    -</html><java><![CDATA[// Deserialise a SELECT statement
    -ObjectInputStream in = new ObjectInputStream(...);
    -Select<?> select = (Select<?>) in.readObject();
    -
    -// This will throw a DetachedException:
    -select.execute();
    -
    -// In order to execute the above select, attach it first
    -DSLContext create = DSL.using(connection, SQLDialect.ORACLE);
    -create.attach(select);]]></java><html>
    -
    -									<h3>Automatically attaching QueryParts</h3>
    -									<p>
    -										Another way of attaching QueryParts automatically, or rather providing them with a new <reference class="java.sql.Connection"/> at will, is to hook into the <reference id="execute-listeners" title="Execute Listener support"/>. More details about this can be found in the manual's chapter about <reference id="execute-listeners" title="ExecuteListeners"/>
    -									</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -					
    -					<section id="scala-sql-building">
    -						<title>SQL building in Scala</title>
    -						<content><html>
    -							<p>
    -								jOOQ-Scala is a maven module used for leveraging some advanced Scala features for those users that wish to use jOOQ with Scala.
    -							</p>
    -							
    -							<h3>Using Scala's implicit defs to allow for operator overloading</h3>
    -							<p>
    -								The most obvious Scala feature to use in jOOQ are implicit defs for implicit conversions in order to enhance the <reference class="org.jooq.Field"/> type with SQL-esque operators. 
    -							</p>
    -							<p>
    -								The following depicts a trait which wraps all fields:
    -							</p>
    -							
    -</html><scala><![CDATA[/**
    - * A Scala-esque representation of {@link org.jooq.Field}, adding overloaded
    - * operators for common jOOQ operations to arbitrary fields
    - */
    -trait SAnyField[T] extends Field[T] {
    -
    -    // String operations
    -    // -----------------
    -
    -    def ||(value : String)            : Field[String]
    -    def ||(value : Field[_])          : Field[String]
    -
    -    // Comparison predicates
    -    // ---------------------
    -
    -    def ===(value : T)                : Condition
    -    def ===(value : Field[T])         : Condition
    -
    -    def !==(value : T)                : Condition
    -    def !==(value : Field[T])         : Condition
    -
    -    def <>(value : T)                 : Condition
    -    def <>(value : Field[T])          : Condition
    -
    -    def >(value : T)                  : Condition
    -    def >(value : Field[T])           : Condition
    -
    -    def >=(value : T)                 : Condition
    -    def >=(value : Field[T])          : Condition
    -
    -    def <(value : T)                  : Condition
    -    def <(value : Field[T])           : Condition
    -
    -    def <=(value : T)                 : Condition
    -    def <=(value : Field[T])          : Condition
    -
    -    def <=>(value : T)                : Condition
    -    def <=>(value : Field[T])         : Condition
    -}]]></scala><html>
    -
    -							<p>
    -								The following depicts a trait which wraps numeric fields:
    -							</p>
    -							
    -</html><scala><![CDATA[/**
    - * A Scala-esque representation of {@link org.jooq.Field}, adding overloaded
    - * operators for common jOOQ operations to numeric fields
    - */
    -trait SNumberField[T <: Number] extends SAnyField[T] {
    -
    -    // Arithmetic operations
    -    // ---------------------
    -
    -    def unary_-                       : Field[T]
    -
    -    def +(value : Number)             : Field[T]
    -    def +(value : Field[_ <: Number]) : Field[T]
    -
    -    def -(value : Number)             : Field[T]
    -    def -(value : Field[_ <: Number]) : Field[T]
    -
    -    def *(value : Number)             : Field[T]
    -    def *(value : Field[_ <: Number]) : Field[T]
    -
    -    def /(value : Number)             : Field[T]
    -    def /(value : Field[_ <: Number]) : Field[T]
    -
    -    def %(value : Number)             : Field[T]
    -    def %(value : Field[_ <: Number]) : Field[T]
    -
    -    // Bitwise operations
    -    // ------------------
    -
    -    def unary_~                       : Field[T]
    -
    -    def &(value : T)                  : Field[T]
    -    def &(value : Field[T])           : Field[T]
    -
    -    def |(value : T)                  : Field[T]
    -    def |(value : Field[T])           : Field[T]
    -
    -    def ^(value : T)                  : Field[T]
    -    def ^(value : Field[T])           : Field[T]
    -
    -    def <<(value : T)                 : Field[T]
    -    def <<(value : Field[T])          : Field[T]
    -
    -    def >>(value : T)                 : Field[T]
    -    def >>(value : Field[T])          : Field[T]
    -}]]></scala><html>
    -
    -							<p>
    -								An example query using such overloaded operators would then look like this:
    -							</p>
    -							
    -</html><scala><![CDATA[select (
    -  T_BOOK.ID * T_BOOK.AUTHOR_ID,
    -  T_BOOK.ID + T_BOOK.AUTHOR_ID * 3 + 4,
    -  T_BOOK.TITLE || " abc" || " xy")
    -from T_BOOK
    -leftOuterJoin (
    -  select (x.ID, x.YEAR_OF_BIRTH)
    -  from x
    -  limit 1
    -  asTable x.getName()
    -)
    -on T_BOOK.AUTHOR_ID === x.ID
    -where (T_BOOK.ID <> 2)
    -or (T_BOOK.TITLE in ("O Alquimista", "Brida"))
    -fetch]]></scala><html>
    -
    -							<h3>Scala 2.10 Macros</h3>
    -							<p>
    -								This feature is still being experimented with. With Scala Macros, it might be possible to inline a true SQL dialect into the Scala syntax, backed by the jOOQ API. Stay tuned!
    -							</p>
    -						</html></content>
    -					</section>
    -				</sections>
    -			</section>
    -
    -			<section id="sql-execution">
    -				<title>SQL execution</title>
    -				<content><html>
    -					<p>
    -						In a previous section of the manual, we've seen how jOOQ can be used to <reference id="sql-building" title="build SQL"/> that can be executed with any API including JDBC or ... jOOQ. This section of the manual deals with various means of actually executing SQL with jOOQ.
    -					</p>
    -					
    -					<h3>SQL execution with JDBC</h3>
    -					<p>
    -						JDBC calls executable objects "<reference class="java.sql.Statement"/>". It distinguishes between three types of statements:
    -					</p>
    -					<ul>
    -						<li><reference class="java.sql.Statement"/>, or "static statement": This statement type is used for any arbitrary type of SQL statement. It is particularly useful with <reference id="inlined-parameters" title="inlined parameters"/></li>
    -						<li><reference class="java.sql.PreparedStatement"/>: This statement type is used for any arbitrary type of SQL statement. It is particularly useful with <reference id="indexed-parameters" title="indexed parameters"/> (note that JDBC does not support <reference id="named-parameters" title="named parameters"/>)</li>
    -						<li><reference class="java.sql.CallableStatement"/>: This statement type is used for SQL statements that are "called" rather than "executed". In particular, this includes calls to <reference id="stored-procedures" title="stored procedures"/>. Callable statements can register OUT parameters</li>
    -					</ul>
    -					<p>
    -						Today, the JDBC API may look weird to users being used to object-oriented design. While statements hide a lot of SQL dialect-specific implementation details quite well, they assume a lot of knowledge about the internal state of a statement. For instance, you can use the <reference class="java.sql.PreparedStatement" anchor="#addBatch()" title="PreparedStatement.addBatch()"/> method, to add a the prepared statement being created to an "internal list" of batch statements. Instead of returning a new type, this method forces user to reflect on the prepared statement's internal state or "mode".
    -					</p>
    -					
    -					<h3>jOOQ is wrapping JDBC</h3>
    -					<p>						
    -						These things are abstracted away by jOOQ, which exposes such concepts in a more object-oriented way. For more details about jOOQ's batch query execution, see the manual's section about <reference id="batch-execution" title="batch execution"/>.
    -					</p> 
    -					<p>
    -						The following sections of this manual will show how jOOQ is wrapping JDBC for SQL execution
    -					</p>
    -				</html></content>
    -
    -				<sections>
    -					<section id="comparison-with-jdbc">
    -						<title>Comparison between jOOQ and JDBC</title>
    -						<content><html>
    -							<h3>Similarities with JDBC</h3>
    -							<p>
    -								Even if there are <reference id="query-vs-resultquery" title="two general types of Query"/>, there are a lot of similarities between JDBC and jOOQ. Just to name a few:
    -							</p>
    -							<ul>
    -								<li>Both APIs return the number of affected records in non-result queries. JDBC: <reference class="java.sql.Statement" anchor="#executeUpdate(java.lang.String)" title="Statement.executeUpdate()"/>, jOOQ: <reference class="org.jooq.Query" anchor="#execute()" title="Query.execute()"/></li>
    -								<li>Both APIs return a scrollable result set type from result queries. JDBC: <reference class="java.sql.ResultSet"/>, jOOQ: <reference class="org.jooq.Result"/></li>
    -							</ul>
    -							
    -							<h3>Differences to JDBC</h3>
    -							<p>
    -								Some of the most important differences between JDBC and jOOQ are listed here:
    -							</p>
    -							<ul>
    -								<li><reference id="query-vs-resultquery" title="Query vs. ResultQuery"/>: JDBC does not formally distinguish between queries that can return results, and queries that cannot. The same API is used for both. This greatly reduces the possibility for <reference id="fetching" title="fetching convenience methods"/></li>
    -								<li><reference id="exception-handling" title="Exception handling"/>: While SQL uses the checked <reference class="java.sql.SQLException"/>, jOOQ wraps all exceptions in an unchecked <reference class="org.jooq.exception.DataAccessException"/></li>
    -								<li><reference class="org.jooq.Result"/>: Unlike its JDBC counter-part, this type implements <reference class="java.util.List"/> and is fully loaded into Java memory, freeing resources as early as possible. Just like statements, this means that users don't have to deal with a "weird" internal result set state.</li>
    -								<li><reference class="org.jooq.Cursor"/>: If you want more fine-grained control over how many records are fetched into memory at once, you can still do that using jOOQ's <reference id="lazy-fetching" title="lazy fetching"/> feature</li>
    -								<li><reference id="statement-type" title="Statement type"/>: jOOQ does not formally distinguish between static statements and prepared statements. By default, all statements are prepared statements in jOOQ, internally. Executing a statement as a static statement can be done simply using a <reference id="custom-settings" title="custom settings flag"/></li>
    -								<li><reference id="reusing-statements" title="Closing Statements"/>: JDBC keeps open resources even if they are already consumed. With JDBC, there is a lot of verbosity around safely closing resources. In jOOQ, resources are closed after consumption, by default. If you want to keep them open after consumption, you have to explicitly say so.</li>
    -							</ul>
    -						</html></content>
    -					</section>
    -				    
    -				    <section id="query-vs-resultquery">
    -						<title>Query vs. ResultQuery</title>
    -						<content><html>
    -							<p>
    -								Unlike JDBC, jOOQ has a lot of knowledge about a SQL query's structure and internals (see the manual's section about <reference id="sql-building" title="SQL building"/>). Hence, jOOQ distinguishes between these two fundamental types of queries. While every <reference class="org.jooq.Query"/> can be executed, only <reference class="org.jooq.ResultQuery"/> can return results (see the manual's section about <reference id="fetching" title="fetching"/> to learn more about fetching results). With plain SQL, the distinction can be made clear most easily:
    -							</p>
    -							
    -</html><java><![CDATA[// Create a Query object and execute it:
    -Query query = create.query("DELETE FROM BOOK");
    -query.execute();
    -
    -// Create a ResultQuery object and execute it, fetching results:
    -ResultQuery<Record> resultQuery = create.resultQuery("SELECT * FROM BOOK");
    -Result<Record> resultQuery.fetch();]]></java></content>
    -					</section>
    -
    -				    <section id="fetching">
    -						<title>Fetching</title>
    -						<content><html>
    -							<p>
    -								Fetching is something that has been completely neglegted by JDBC and also by various other database abstraction libraries. Fetching is much more than just looping or listing records or mapped objects. There are so many ways you may want to fetch data from a database, it should be considered a first-class feature of any database abstraction API. Just to name a few, here are some of jOOQ's fetching modes:
    -							</p>
    -							<ul>
    -								<li><reference id="record-vs-tablerecord" title="Untyped vs. typed fetching"/>: Sometimes you care about the returned type of your records, sometimes (with arbitrary projections) you don't.</li>
    -								<li><reference id="arrays-maps-and-lists" title="Fetching arrays, maps, or lists"/>: Instead of letting you transform your result sets into any more suitable data type, a library should do that work for you.</li>
    -								<li><reference id="recordhandler" title="Fetching through handler callbacks"/>: This is an entirely different fetching paradigm. With Java 8's lambda expressions, this will become even more powerful.</li>
    -								<li><reference id="recordmapper" title="Fetching through mapper callbacks"/>: This is an entirely different fetching paradigm. With Java 8's lambda expressions, this will become even more powerful.</li>
    -								<li><reference id="pojos" title="Fetching custom POJOs"/>: This is what made Hibernate and JPA so strong. Automatic mapping of tables to custom POJOs.</li>
    -								<li><reference id="lazy-fetching" title="Lazy vs. eager fetching"/>: It should be easy to distinguish these two fetch modes.</li>
    -								<li><reference id="many-fetching" title="Fetching many results"/>: Some databases allow for returning many result sets from a single query. JDBC can handle this but it's very verbose. A list of results should be returned instead.</li>
    -								<li><reference id="later-fetching" title="Fetching data asynchronously"/>: Some queries take too long to execute to wait for their results. You should be able to spawn query execution in a separate process.</li>
    -							</ul>
    -							
    -							<h3>Convenience and how ResultQuery, Result, and Record share API</h3>
    -							<p>
    -								The term "fetch" is always reused in jOOQ when you can fetch data from the database. An <reference class="org.jooq.ResultQuery"/> provides many overloaded means of fetching data:
    -							</p>
    -							
    -							<h3>Various modes of fetching</h3>
    -							<p>
    -								These modes of fetching are also documented in subsequent sections of the manual
    -							</p>
    -							
    -</html><java><![CDATA[// The "standard" fetch
    -Result<R> fetch();    
    -
    -// The "standard" fetch when you know your query returns only one record
    -R fetchOne();
    -
    -// The "standard" fetch when you only want to fetch the first record
    -R fetchAny();
    -
    -// Create a "lazy" Cursor, that keeps an open underlying JDBC ResultSet
    -Cursor<R> fetchLazy();
    -Cursor<R> fetchLazy(int fetchSize);
    -
    -// Create a java.util.concurrent.Future, to handle asynchronous execution of the ResultQuery
    -FutureResult<R> fetchLater();
    -FutureResult<R> fetchLater(ExecutorService executor);
    -
    -// Fetch several results at once
    -List<Result<Record>> fetchMany();
    -
    -// Fetch records into a custom callback
    -<H extends RecordHandler<R>> H fetchInto(H handler);
    -
    -// Map records using a custom callback
    -<E> List<E> fetch(RecordMapper<? super R, E> mapper);
    -
    -// Execute a ResultQuery with jOOQ, but return a JDBC ResultSet, not a jOOQ object
    -ResultSet fetchResultSet();]]></java><html>
    -							
    -							<h3>Fetch convenience</h3>
    -							<p>
    -								These means of fetching are also available from <reference class="org.jooq.Result"/> and <reference class="org.jooq.Record"/> APIs
    -							</p>
    -
    -</html><java><![CDATA[// These methods are convenience for fetching only a single field, 
    -// possibly converting results to another type
    -<T>    List<T> fetch(Field<T> field);
    -<T>    List<T> fetch(Field<?> field, Class<? extends T> type);
    -<T, U> List<U> fetch(Field<T> field, Converter<? super T, U> converter);
    -       List<?> fetch(int fieldIndex);
    -<T>    List<T> fetch(int fieldIndex, Class<? extends T> type);
    -<U>    List<U> fetch(int fieldIndex, Converter<?, U> converter);
    -       List<?> fetch(String fieldName);
    -<T>    List<T> fetch(String fieldName, Class<? extends T> type);
    -<U>    List<U> fetch(String fieldName, Converter<?, U> converter);
    -
    -// These methods are convenience for fetching only a single field, possibly converting results to another type
    -// Instead of returning lists, these return arrays
    -<T>    T[]      fetchArray(Field<T> field);
    -<T>    T[]      fetchArray(Field<?> field, Class<? extends T> type);
    -<T, U> U[]      fetchArray(Field<T> field, Converter<? super T, U> converter);
    -       Object[] fetchArray(int fieldIndex);
    -<T>    T[]      fetchArray(int fieldIndex, Class<? extends T> type);
    -<U>    U[]      fetchArray(int fieldIndex, Converter<?, U> converter);
    -       Object[] fetchArray(String fieldName);
    -<T>    T[]      fetchArray(String fieldName, Class<? extends T> type);
    -<U>    U[]      fetchArray(String fieldName, Converter<?, U> converter);
    -
    -// These methods are convenience for fetching only a single field from a single record, 
    -// possibly converting results to another type
    -<T>    T      fetchOne(Field<T> field);
    -<T>    T      fetchOne(Field<?> field, Class<? extends T> type);
    -<T, U> U      fetchOne(Field<T> field, Converter<? super T, U> converter);
    -       Object fetchOne(int fieldIndex);
    -<T>    T      fetchOne(int fieldIndex, Class<? extends T> type);
    -<U>    U      fetchOne(int fieldIndex, Converter<?, U> converter);
    -       Object fetchOne(String fieldName);
    -<T>    T      fetchOne(String fieldName, Class<? extends T> type);
    -<U>    U      fetchOne(String fieldName, Converter<?, U> converter);]]></java><html>
    -
    -							<h3>Fetch transformations</h3>
    -							<p>
    -								These means of fetching are also available from <reference class="org.jooq.Result"/> and <reference class="org.jooq.Record"/> APIs
    -							</p>
    -							
    -</html><java><![CDATA[// Transform your Records into arrays, Results into matrices
    -       Object[][] fetchArrays();
    -       Object[]   fetchOneArray();
    -       
    -// Reduce your Result object into maps
    -<K>    Map<K, R>      fetchMap(Field<K> key);
    -<K, V> Map<K, V>      fetchMap(Field<K> key, Field<V> value);
    -<K, E> Map<K, E>      fetchMap(Field<K> key, Class<E> value);
    -       Map<Record, R> fetchMap(Field<?>[] key);
    -<E>    Map<Record, E> fetchMap(Field<?>[] key, Class<E> value);       
    -
    -// Transform your Result object into maps
    -       List<Map<String, Object>> fetchMaps();
    -       Map<String, Object>       fetchOneMap();
    -
    -// Transform your Result object into groups
    -<K>    Map<K, Result<R>>      fetchGroups(Field<K> key);
    -<K, V> Map<K, List<V>>        fetchGroups(Field<K> key, Field<V> value);
    -<K, E> Map<K, List<E>>        fetchGroups(Field<K> key, Class<E> value);
    -       Map<Record, Result<R>> fetchGroups(Field<?>[] key);
    -<E>    Map<Record, List<E>>   fetchGroups(Field<?>[] key, Class<E> value);
    -
    -// Transform your Records into custom POJOs
    -<E>    List<E> fetchInto(Class<? extends E> type);
    -
    -// Transform your records into another table type
    -<Z extends Record> Result<Z> fetchInto(Table<Z> table);]]></java><html>
    -
    -							<p>
    -								Note, that apart from the <reference class="org.jooq.ResultQuery" anchor="#fetchLazy()" title="fetchLazy()"/> methods, all fetch() methods will immediately close underlying JDBC result sets.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="record-vs-tablerecord">
    -								<title>Record vs. TableRecord</title>
    -								<content><html>
    -									<p>
    -										jOOQ understands that SQL is much more expressive than Java, when it comes to the declarative typing of <reference id="table-expressions" title="table expressions"/>. As a declarative language, SQL allows for creating ad-hoc row value expressions (records with indexed columns, or tuples) and records (records with named columns). In Java, this is not possible to the same extent. Yet, still, sometimes you wish to use strongly typed records, when you know that you're selecting only from a single table
    -									</p>
    -									
    -									<h3>Fetching strongly or weakly typed records</h3>
    -									<p>
    -										When fetching data only from a single table, the <reference id="table-expressions" title="table expression's"/> type is known to jOOQ if you use jOOQ's <reference id="code-generation" title="code generator"/> to generate <reference id="codegen-records" title="TableRecords"/> for your database tables. In order to fetch such strongly typed records, you will have to use the <reference id="select-statement" title="simple select API"/>:
    -									</p>
    -
    -</html><java><![CDATA[// Use the selectFrom() method:
    -BookRecord book = create.selectFrom(BOOK).where(BOOK.ID.equal(1)).fetchOne();
    -
    -// Typesafe field access is now possible:
    -System.out.println("Title       : " + book.getTitle());
    -System.out.println("Published in: " + book.getPublishedIn());]]></java><html>
    -									
    -									<p>
    -										When you use the <reference class="org.jooq.DSLContext" anchor="#selectFrom(org.jooq.Table)" title="DSLContext.selectFrom()"/> method, jOOQ will return the record type supplied with the argument table. Beware though, that you will no longer be able to use any clause that modifies the type of your <reference id="table-expressions" title="table expression"/>. This includes: 
    -									</p>
    -									<ul>
    -                   						<li><reference id="select-clause" title="The SELECT clause"/></li>
    -                   						<li><reference id="join-clause" title="The JOIN clause"/></li>
    -                   					</ul>		
    -								</html></content>
    -							</section>
    -
    -							<section id="record-n">
    -								<title>Record1 to Record{max-row-degree}</title>
    -								<content><html>
    -									<p>
    -										jOOQ's <reference id="row-value-expressions" title="row value expression (or tuple)"/> support has been explained earlier in this manual. It is useful for constructing row value expressions where they can be used in SQL. The same typesafety is also applied to records for degrees up to {max-row-degree}. To express this fact, <reference class="org.jooq.Record"/> is extended by <reference class="org.jooq.Record1"/> to <reference class="org.jooq.Record{max-row-degree}"/>. Apart from the fact that these extensions of the R type can be used throughout the <reference id="dsl-and-non-dsl" title="jOOQ DSL"/>, they also provide a useful API. Here is <reference class="org.jooq.Record2"/>, for instance: 
    -									</p>
    -
    -</html><java><![CDATA[public interface Record2<T1, T2> extends Record {
    -
    -    // Access fields and values as row value expressions
    -    Row2<T1, T2> fieldsRow();
    -    Row2<T1, T2> valuesRow();
    -
    -    // Access fields by index
    -    Field<T1> field1();
    -    Field<T2> field2();
    -
    -    // Access values by index
    -    T1 value1();
    -    T2 value2();
    -}]]></java><html>
    -
    -									<h3>Higher-degree records</h3>
    -									<p>
    -										jOOQ chose to explicitly support degrees up to {max-row-degree} to match Scala's typesafe tuple, function and product support. Unlike Scala, however, jOOQ also supports higher degrees without the additional typesafety. 
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="arrays-maps-and-lists">
    -								<title>Arrays, Maps and Lists</title>
    -								<content><html>
    -									<p>
    -										By default, jOOQ returns an <reference class="org.jooq.Result"/> object, which is essentially a <reference class="java.util.List"/> of <reference class="org.jooq.Record"/>. Often, you will find yourself wanting to transform this result object into a type that corresponds more to your specific needs. Or you just want to list all values of one specific column. Here are some examples to illustrate those use cases:
    -									</p>
    -									
    -</html><java><![CDATA[// Fetching only book titles (the two calls are equivalent):
    -List<String> titles1 = create.select().from(BOOK).fetch().getValues(BOOK.TITLE);
    -List<String> titles2 = create.select().from(BOOK).fetch(BOOK.TITLE);
    -String[]     titles3 = create.select().from(BOOK).fetchArray(BOOK.TITLE);
    -
    -// Fetching only book IDs, converted to Long
    -List<Long> ids1 = create.select().from(BOOK).fetch().getValues(BOOK.ID, Long.class);
    -List<Long> ids2 = create.select().from(BOOK).fetch(BOOK.ID, Long.class);
    -Long[]     ids3 = create.select().from(BOOK).fetchArray(BOOK.ID, Long.class);
    -
    -// Fetching book IDs and mapping each ID to their records or titles
    -Map<Integer, BookRecord> map1 = create.selectFrom(BOOK).fetch().intoMap(BOOK.ID);
    -Map<Integer, BookRecord> map2 = create.selectFrom(BOOK).fetchMap(BOOK.ID);
    -Map<Integer, String>     map3 = create.selectFrom(BOOK).fetch().intoMap(BOOK.ID, BOOK.TITLE);
    -Map<Integer, String>     map4 = create.selectFrom(BOOK).fetchMap(BOOK.ID, BOOK.TITLE);
    -
    -// Group by AUTHOR_ID and list all books written by any author:       
    -Map<Integer, Result<BookRecord>> group1 = create.selectFrom(BOOK).fetch().intoGroups(BOOK.AUTHOR_ID);
    -Map<Integer, Result<BookRecord>> group2 = create.selectFrom(BOOK).fetchGroups(BOOK.AUTHOR_ID);
    -Map<Integer, List<String>>       group3 = create.selectFrom(BOOK).fetch().intoGroups(BOOK.AUTHOR_ID, BOOK.TITLE);
    -Map<Integer, List<String>>       group4 = create.selectFrom(BOOK).fetchGroups(BOOK.AUTHOR_ID, BOOK.TITLE);]]></java><html>									
    -
    -									<p>
    -										Note that most of these convenience methods are available both through <reference class="org.jooq.ResultQuery"/> and <reference class="org.jooq.Result"/>, some are even available through <reference class="org.jooq.Record"/> as well.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="recordhandler">
    -								<title>RecordHandler</title>
    -								<content><html>
    -									<p>
    -										In a more functional operating mode, you might want to write callbacks that receive records from your select statement results in order to do some processing. This is a common data access pattern in Spring's JdbcTemplate, and it is also available in jOOQ. With jOOQ, you can implement your own <reference class="org.jooq.RecordHandler"/> classes and plug them into jOOQ's <reference class="org.jooq.ResultQuery"/>:
    -									</p>
    -									
    -</html><java><![CDATA[// Write callbacks to receive records from select statements
    -create.selectFrom(BOOK)
    -      .orderBy(BOOK.ID)
    -      .fetch()
    -      .into(new RecordHandler<BookRecord>() {
    -          @Override
    -          public void next(BookRecord book) {
    -              Util.doThingsWithBook(book);
    -          }
    -      });
    -      
    -// Or more concisely
    -create.selectFrom(BOOK)
    -      .orderBy(BOOK.ID)
    -      .fetchInto(new RecordHandler<BookRecord>() {...});
    -      
    -// Or even more concisely with Java 8's lambda expressions:
    -create.selectFrom(BOOK)
    -      .orderBy(BOOK.ID)
    -      .fetchInto(book -> { Util.doThingsWithBook(book); }; );
    -]]></java><html>
    -
    -									<p>
    -										See also the manual's section about the <reference id="recordmapper" title="RecordMapper"/>, which provides similar features
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="recordmapper">
    -								<title>RecordMapper</title>
    -								<content><html>
    -									<p>
    -										In a more functional operating mode, you might want to write callbacks that map records from your select statement results in order to do some processing. This is a common data access pattern in Spring's JdbcTemplate, and it is also available in jOOQ. With jOOQ, you can implement your own <reference class="org.jooq.RecordMapper"/> classes and plug them into jOOQ's <reference class="org.jooq.ResultQuery"/>:
    -									</p>
    -									
    -</html><java><![CDATA[// Write callbacks to receive records from select statements
    -List<Integer> ids =
    -create.selectFrom(BOOK)
    -      .orderBy(BOOK.ID)
    -      .fetch()
    -      .map(new RecordMapper<BookRecord, Integer>() {
    -          @Override
    -          public Integer map(BookRecord book) {
    -              return book.getId();
    -          }
    -      });
    -      
    -// Or more concisely
    -create.selectFrom(BOOK)
    -      .orderBy(BOOK.ID)
    -      .fetch(new RecordMapper<BookRecord, Integer>() {...});
    -      
    -// Or even more concisely with Java 8's lambda expressions:
    -create.selectFrom(BOOK)
    -      .orderBy(BOOK.ID)
    -      .fetch(book -> book.getId());
    -]]></java><html>
    -
    -									<p>
    -										See also the manual's section about the <reference id="recordhandler" title="RecordHandler"/>, which provides similar features
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="pojos">
    -								<title>POJOs</title>
    -								<content><html>
    -									<p>
    -										Fetching data in records is fine as long as your application is not really layered, or as long as you're still writing code in the DAO layer. But if you have a more advanced application architecture, you may not want to allow for jOOQ artefacts to leak into other layers. You may choose to write POJOs (Plain Old Java Objects) as your primary DTOs (Data Transfer Objects), without any dependencies on jOOQ's <reference class="org.jooq.Record"/> types, which may even potentially hold a reference to a <reference id="dsl-context" title="Configuration"/>, and thus a JDBC <reference class="java.sql.Connection"/>. Like Hibernate/JPA, jOOQ allows you to operate with POJOs. Unlike Hibernate/JPA, jOOQ does not "attach" those POJOs or create proxies with any magic in them.
    -									</p>
    -									<p>
    -										If you're using jOOQ's <reference id="code-generation" title="code generator"/>, you can configure it to <reference id="codegen-pojos" title="generate POJOs"/> for you, but you're not required to use those generated POJOs. You can use your own.
    -									</p>
    -									
    -									<h3>Using JPA-annotated POJOs</h3>									
    -									<p>
    -										jOOQ tries to find JPA annotations on your POJO types. If it finds any, they are used as the primary source for mapping meta-information. Only the <reference class="javax.persistence.Column"/> annotation is used and understood by jOOQ. An example:
    -									</p>
    -
    -</html><java><![CDATA[// A JPA-annotated POJO class
    -public class MyBook {
    -  @Column(name = "ID")
    -  public int myId;
    -  
    -  @Column(name = "TITLE")
    -  public String myTitle;
    -}
    -
    -// The various "into()" methods allow for fetching records into your custom POJOs:
    -MyBook myBook        = create.select().from(BOOK).fetchAny().into(MyBook.class); 
    -List<MyBook> myBooks = create.select().from(BOOK).fetch().into(MyBook.class);
    -List<MyBook> myBooks = create.select().from(BOOK).fetchInto(MyBook.class);]]></java><html>									
    -									
    -									<p>
    -										Just as with any other JPA implementation, you can put the <reference class="javax.persistence.Column"/> annotation on any class member, including attributes, setters and getters. Please refer to the <reference class="org.jooq.Record" anchor="#into(java.lang.Class)" title="Record.into()"/> Javadoc for more details.
    -									</p>
    -									
    -									<h3>Using simple POJOs</h3>
    -									<p>
    -										If jOOQ does not find any JPA-annotations, columns are mapped to the "best-matching" constructor, attribute or setter. An example illustrates this:
    -									</p>
    -									
    -</html><java><![CDATA[// A "mutable" POJO class
    -public class MyBook1 {
    -  public int id;
    -  public String title;
    -}
    -
    -// The various "into()" methods allow for fetching records into your custom POJOs:
    -MyBook1 myBook        = create.select().from(BOOK).fetchAny().into(MyBook1.class); 
    -List<MyBook1> myBooks = create.select().from(BOOK).fetch().into(MyBook1.class);
    -List<MyBook1> myBooks = create.select().from(BOOK).fetchInto(MyBook1.class);]]></java><html>	
    -
    -									<p>
    -										Please refer to the <reference class="org.jooq.Record" anchor="#into(java.lang.Class)" title="Record.into()"/> Javadoc for more details.
    -									</p>
    -									
    -									<h3>Using "immutable" POJOs</h3>
    -									<p>
    -										If jOOQ does not find any default constructor, columns are mapped to the "best-matching" constructor. This allows for using "immutable" POJOs with jOOQ. An example illustrates this:
    -									</p>
    -									
    -</html><java><![CDATA[// An "immutable" POJO class
    -public class MyBook2 {
    -  public final int id;
    -  public final String title;
    -  
    -  public MyBook2(int id, String title) {
    -    this.id = id;
    -    this.title = title;
    -  }
    -}
    -
    -// With "immutable" POJO classes, there must be an exact match between projected fields and available constructors:
    -MyBook2 myBook        = create.select(BOOK.ID, BOOK.TITLE).from(BOOK).fetchAny().into(MyBook2.class); 
    -List<MyBook2> myBooks = create.select(BOOK.ID, BOOK.TITLE).from(BOOK).fetch().into(MyBook2.class);
    -List<MyBook2> myBooks = create.select(BOOK.ID, BOOK.TITLE).from(BOOK).fetchInto(MyBook2.class);
    -
    -// An "immutable" POJO class with a java.beans.ConstructorProperties annotation
    -public class MyBook3 {
    -  public final String title;
    -  public final int id;
    -  
    -  @ConstructorProperties({ "title", "id"})
    -  public MyBook2(String title, int id) {
    -    this.title = title;
    -    this.id = id;
    -  }
    -}
    -
    -// With annotated "immutable" POJO classes, there doesn't need to be an exact match between fields and constructor arguments.
    -// In the below cases, only BOOK.ID is really set onto the POJO, BOOK.TITLE remains null and BOOK.AUTHOR_ID is ignored
    -MyBook3 myBook        = create.select(BOOK.ID, BOOK.AUTHOR_ID).from(BOOK).fetchAny().into(MyBook3.class); 
    -List<MyBook3> myBooks = create.select(BOOK.ID, BOOK.AUTHOR_ID).from(BOOK).fetch().into(MyBook3.class);
    -List<MyBook3> myBooks = create.select(BOOK.ID, BOOK.AUTHOR_ID).from(BOOK).fetchInto(MyBook3.class);
    -]]></java><html>	
    -									
    -									<p>
    -										Please refer to the <reference class="org.jooq.Record" anchor="#into(java.lang.Class)" title="Record.into()"/> Javadoc for more details.
    -									</p>
    -
    -									<h3>Using proxyable types</h3>
    -									<p>
    -										jOOQ also allows for fetching data into abstract classes or interfaces, or in other words, "proxyable" types. This means that jOOQ will return a <reference class="java.util.HashMap"/> wrapped in a <reference class="java.lang.reflect.Proxy"/> implementing your custom type. An example of this is given here:
    -									</p>
    -									
    -</html><java><![CDATA[// A "proxyable" type
    -public interface MyBook3 {
    -  int getId(); 
    -  void setId(int id);
    -  
    -  String getTitle();
    -  void setTitle(String title);
    -}
    -
    -// The various "into()" methods allow for fetching records into your custom POJOs:
    -MyBook3 myBook        = create.select(BOOK.ID, BOOK.TITLE).from(BOOK).fetchAny().into(MyBook3.class); 
    -List<MyBook3> myBooks = create.select(BOOK.ID, BOOK.TITLE).from(BOOK).fetch().into(MyBook3.class);
    -List<MyBook3> myBooks = create.select(BOOK.ID, BOOK.TITLE).from(BOOK).fetchInto(MyBook3.class);]]></java><html>									
    -
    -									<p>
    -										Please refer to the <reference class="org.jooq.Record" anchor="#into(java.lang.Class)" title="Record.into()"/> Javadoc for more details.
    -									</p>
    -
    -									<h3>Loading POJOs back into Records to store them</h3>
    -									<p>
    -										The above examples show how to fetch data into your own custom POJOs / DTOs. When you have modified the data contained in POJOs, you probably want to store those modifications back to the database. An example of this is given here:
    -									</p>
    -
    -</html><java><![CDATA[// A "mutable" POJO class
    -public class MyBook {
    -  public int id;
    -  public String title;
    -}
    -
    -// Create a new POJO instance
    -MyBook myBook = new MyBook();
    -myBook.id = 10;
    -myBook.title = "Animal Farm";
    -
    -// Load a jOOQ-generated BookRecord from your POJO
    -BookRecord book = create.newRecord(BOOK, myBook); 
    -
    -// Insert it (implicitly)
    -book.store();
    -
    -// Insert it (explicitly)
    -create.executeInsert(book);
    -
    -// or update it (ID = 10)
    -create.executeUpdate(book);]]></java><html>
    -							
    -									<p>
    -										Note: Because of your manual setting of ID = 10, jOOQ's store() method will asume that you want to insert a new record. See the manual's section about <reference id="crud-with-updatablerecords" title="CRUD with UpdatableRecords"/> for more details on this.
    -									</p>
    -											
    -									<h3>Interaction with DAOs</h3>
    -									<p>
    -										If you're using jOOQ's <reference id="code-generation" title="code generator"/>, you can configure it to <reference id="codegen-daos" title="generate DAOs"/> for you. Those DAOs operate on <reference id="codegen-pojos" title="generated POJOs"/>. An example of using such a DAO is given here:
    -									</p>
    -
    -</html><java><![CDATA[// Initialise a Configuration
    -Configuration configuration = new DefaultConfiguration().set(connection).set(SQLDialect.ORACLE);
    -
    -// Initialise the DAO with the Configuration
    -BookDao bookDao = new BookDao(configuration);
    -
    -// Start using the DAO
    -Book book = bookDao.findById(5);
    -
    -// Modify and update the POJO
    -book.setTitle("1984");
    -book.setPublishedIn(1948);
    -bookDao.update(book);
    -
    -// Delete it again
    -bookDao.delete(book);]]></java><html>
    -									
    -									<h3>More complex data structures</h3>
    -									<p>
    -										jOOQ currently doesn't support more complex data structures, the way Hibernate/JPA attempt to map relational data onto POJOs. While future developments in this direction are not excluded, jOOQ claims that generic mapping strategies lead to an enormous additional complexity that only serves very few use cases. You are likely to find a solution using any of jOOQ's various <reference id="fetching" title="fetching modes"/>, with only little boiler-plate code on the client side.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="lazy-fetching">
    -								<title>Lazy fetching</title>
    -								<content><html>
    -									<p>
    -										Unlike JDBC's <reference class="java.sql.ResultSet"/>, jOOQ's <reference class="org.jooq.Result"/> does not represent an open database cursor with various fetch modes and scroll modes, that needs to be closed after usage. jOOQ's results are simple in-memory Java <reference class="java.util.List"/> objects, containing all of the result values. If your result sets are large, or if you have a lot of network latency, you may wish to fetch records one-by-one, or in small chunks. jOOQ supports a <reference class="org.jooq.Cursor"/> type for that purpose. In order to obtain such a reference, use the <reference class="org.jooq.ResultQuery" anchor="#fetchLazy()" title="ResultQuery.fetchLazy()"/> method. An example is given here:
    -									</p>
    -									
    -</html><java><![CDATA[// Obtain a Cursor reference:
    -Cursor<BookRecord> cursor = null;
    -
    -try {
    -    cursor = create.selectFrom(BOOK).fetchLazy();
    -
    -    // Cursor has similar methods as Iterator<R>
    -    while (cursor.hasNext()) {
    -        BookRecord book = cursor.fetchOne();
    -        
    -        Util.doThingsWithBook(book);
    -    }
    -}
    -
    -// Close the cursor and the cursor's underlying JDBC ResultSet
    -finally {
    -    if (cursor != null) {
    -        cursor.close();
    -    }
    -}]]></java><html>
    -
    -									<p>
    -										As a <reference class="org.jooq.Cursor"/> holds an internal reference to an open <reference class="java.sql.ResultSet"/>, it may need to be closed at the end of iteration. If a cursor is completely scrolled through, it will conveniently close the underlying ResultSet. However, you should not rely on that.
    -									</p>
    -									
    -									<h3>Cursors ship with all the other fetch features</h3>
    -									<p>
    -										Like <reference class="org.jooq.ResultQuery"/> or <reference class="org.jooq.Result"/>, <reference class="org.jooq.Cursor"/> gives access to all of the other fetch features that we've seen so far, i.e.
    -									</p>
    -									<ul>
    -										<li><reference id="record-vs-tablerecord" title="Strongly or weakly typed records"/>: Cursors are also typed with the &lt;R&gt; type, allowing to fetch custom, generated <reference class="org.jooq.TableRecord"/> or plain <reference class="org.jooq.Record"/> types.</li>
    -										<li><reference id="recordhandler" title="RecordHandler callbacks"/>: You can use your own <reference class="org.jooq.RecordHandler"/> callbacks to receive lazily fetched records.</li>
    -										<li><reference id="recordmapper" title="RecordMapper callbacks"/>: You can use your own <reference class="org.jooq.RecordMapper"/> callbacks to map lazily fetched records.</li>
    -										<li><reference id="pojos" title="POJOs"/>: You can fetch data into your own custom POJO types.</li>
    -									</ul>
    -								</html></content>
    -							</section>
    -
    -							<section id="many-fetching">
    -								<title>Many fetching</title>
    -								<content><html>
    -									<p>
    -										Many databases support returning several result sets, or cursors, from single queries. An example for this is Sybase ASE's sp_help command:
    -									</p>
    -</html><text><![CDATA[> sp_help 'author'
    -
    -+--------+-----+-----------+-------------+-------------------+
    -|Name    |Owner|Object_type|Object_status|Create_date        |
    -+--------+-----+-----------+-------------+-------------------+
    -|  author|dbo  |user table | -- none --  |Sep 22 2011 11:20PM|
    -+--------+-----+-----------+-------------+-------------------+
    -
    -+-------------+-------+------+----+-----+-----+
    -|Column_name  |Type   |Length|Prec|Scale|...  |
    -+-------------+-------+------+----+-----+-----+
    -|id           |int    |     4|NULL| NULL|    0|
    -|first_name   |varchar|    50|NULL| NULL|    1|
    -|last_name    |varchar|    50|NULL| NULL|    0|
    -|date_of_birth|date   |     4|NULL| NULL|    1|
    -|year_of_birth|int    |     4|NULL| NULL|    1|
    -+-------------+-------+------+----+-----+-----+]]></text><html>
    -
    -
    -									<p>
    -										The correct (and verbose) way to do this with JDBC is as follows:
    -									</p>
    -									
    -</html><java><![CDATA[ResultSet rs = statement.executeQuery();
    -
    -// Repeat until there are no more result sets
    -for (;;) {
    -
    -  // Empty the current result set
    -  while (rs.next()) {
    -    // [ .. do something with it .. ]
    -  }
    -
    -  // Get the next result set, if available
    -  if (statement.getMoreResults()) {
    -    rs = statement.getResultSet();
    -  }
    -  else {
    -    break;
    -  }
    -}
    -
    -// Be sure that all result sets are closed
    -statement.getMoreResults(Statement.CLOSE_ALL_RESULTS);
    -statement.close();]]></java><html>
    -
    -									<p>
    -										As previously discussed in the chapter about <reference id="comparison-with-jdbc" title="differences between jOOQ and JDBC"/>, jOOQ does not rely on an internal state of any JDBC object, which is "externalised" by Javadoc. Instead, it has a straight-forward API allowing you to do the above in a one-liner: 
    -									</p>
    -									
    -</html><java><![CDATA[// Get some information about the author table, its columns, keys, indexes, etc
    -List<Result<Record>> results = create.fetchMany("sp_help 'author'");]]></java><html>
    -
    -									<p>
    -										Using generics, the resulting structure is immediately clear.
    -									</p>									
    -								</html></content>
    -							</section>
    -
    -							<section id="later-fetching">
    -								<title>Later fetching</title>
    -								<content><html>
    -									<p>
    -										Some queries take very long to execute, yet they are not crucial for the continuation of the main program. For instance, you could be generating a complicated report in a Swing application, and while this report is being calculated in your database, you want to display a background progress bar, allowing the user to pursue some other work. This can be achived simply with jOOQ, by creating a <reference class="org.jooq.FutureResult"/>, a type that extends <reference class="java.util.concurrent.Future"/>. An example is given here:
    -									</p>
    -									
    -</html><java><![CDATA[// Spawn off this query in a separate process:
    -FutureResult<BookRecord> future = create.selectFrom(BOOK).where(... complex predicates ...).fetchLater();
    -
    -// This example actively waits for the result to be done
    -while (!future.isDone()) {
    -    progressBar.increment(1);
    -    Thread.sleep(50);
    -}
    -
    -// The result should be ready, now
    -Result<BookRecord> result = future.get();]]></java><html>
    -
    -									<p>
    -										Note, that instead of letting jOOQ spawn a new thread, you can also provide jOOQ with your own <reference class="java.util.concurrent.ExecutorService"/>:
    -									</p>
    -									
    -</html><java><![CDATA[// Spawn off this query in a separate process:
    -ExecutorService service = // [...]
    -FutureResult<BookRecord> future = create.selectFrom(BOOK).where(... complex predicates ...).fetchLater(service);]]></java></content>
    -							</section>
    -
    -							<section id="resultset-fetching">
    -								<title>ResultSet fetching</title>
    -								<content><html>
    -									<p>
    -										When interacting with legacy applications, you may prefer to have jOOQ return a <reference class="java.sql.ResultSet"/>, rather than jOOQ's own <reference class="org.jooq.Result"/> types. This can be done simply, in two ways:
    -									</p>
    -									
    -</html><java><![CDATA[// jOOQ's Cursor type exposes the underlying ResultSet:
    -ResultSet rs1 = create.selectFrom(BOOK).fetchLazy().resultSet();
    -
    -// But you can also directly access that ResultSet from ResultQuery:
    -ResultSet rs2 = create.selectFrom(BOOK).fetchResultSet();
    -
    -// Don't forget to close these, though!
    -rs1.close();
    -rs2.close();]]></java><html>
    -
    -									<h3>Transform jOOQ's Result into a JDBC ResultSet</h3>
    -									<p>
    -										Instead of operating on a JDBC ResultSet holding an open resource from your database, you can also let jOOQ's <reference class="org.jooq.Result"/> wrap itself in a <reference class="java.sql.ResultSet"/>. The advantage of this is that the so-created ResultSet has no open connection to the database. It is a completely in-memory ResultSet:								
    -									</p>
    -
    -</html><java><![CDATA[// Transform a jOOQ Result into a ResultSet
    -Result<BookRecord> result = create.selectFrom(BOOK).fetch();
    -ResultSet rs = result.intoResultSet();]]></java><html>
    -
    -									<h3>The inverse: Fetch data from a legacy ResultSet using jOOQ</h3>
    -									<p>
    -										The inverse of the above is possible too. Maybe, a legacy part of your application produces JDBC <reference class="java.sql.ResultSet"/>, and you want to turn them into a <reference class="org.jooq.Result"/>: 
    -									</p>
    -
    -</html><java><![CDATA[// Transform a JDBC ResultSet into a jOOQ Result
    -ResultSet rs = connection.createStatement().executeQuery("SELECT * FROM BOOK");
    -
    -// As a Result:
    -Result<Record> result = create.fetch(rs);
    -
    -// As a Cursor
    -Cursor<Record> cursor = create.fetchLazy(rs);]]></java><html>
    -
    -                                    <p>
    -                                        You can also tighten the interaction with jOOQ's data type system and <reference id="data-type-conversion" title="data type conversion"/> features, by passing the record type to the above fetch methods:
    -                                    </p>
    -                                    
    -</html><java><![CDATA[// Pass an array of types:
    -Result<Record> result = create.fetch    (rs, Integer.class, String.class);
    -Cursor<Record> result = create.fetchLazy(rs, Integer.class, String.class);
    -
    -// Pass an array of data types:
    -Result<Record> result = create.fetch    (rs, SQLDataType.INTEGER, SQLDataType.VARCHAR);
    -Cursor<Record> result = create.fetchLazy(rs, SQLDataType.INTEGER, SQLDataType.VARCHAR);
    -
    -// Pass an array of fields:
    -Result<Record> result = create.fetch    (rs, BOOK.ID, BOOK.TITLE);
    -Cursor<Record> result = create.fetchLazy(rs, BOOK.ID, BOOK.TITLE);]]></java><html>
    -
    -                                    <p>
    -                                        If supplied, the additional information is used to override the information obtained from the <reference class="java.sql.ResultSet" title="ResultSet"/>'s <reference class="java.sql.ResultSetMetaData"/> information.
    -                                    </p>                                    
    -								</html></content>
    -							</section>
    -
    -							<section id="data-type-conversion">
    -								<title>Data type conversion</title>
    -								<content><html>
    -									<p>
    -										Apart from a few extra features (<reference id="codegen-udts" title="user-defined types"/>), jOOQ only supports basic types as supported by the JDBC API. In your application, you may choose to transform these data types into your own ones, without writing too much boiler-plate code. This can be done using jOOQ's <reference class="org.jooq.Converter"/> types. A converter essentially allows for two-way conversion between two Java data types &lt;T&gt; and &lt;U&gt;. By convention, the &lt;T&gt; type corresponds to the type in your database whereas the &gt;U&gt; type corresponds to your own user type. The Converter API is given here:
    -									</p>
    -									
    -</html><java><![CDATA[public interface Converter<T, U> extends Serializable {
    -
    -    /**
    -     * Convert a database object to a user object
    -     */
    -    U from(T databaseObject);
    -
    -    /**
    -     * Convert a user object to a database object
    -     */
    -    T to(U userObject);
    -
    -    /**
    -     * The database type
    -     */
    -    Class<T> fromType();
    -
    -    /**
    -     * The user type
    -     */
    -    Class<U> toType();
    -}]]></java><html>
    -
    -									<p>
    -										Such a converter can be used in many parts of the jOOQ API. Some examples have been illustrated in the manual's section about <reference id="fetching" title="fetching"/>.
    -									</p>
    -									
    -									<h3>A Converter for GregorianCalendar</h3>
    -									<p>
    -										Here is a some more elaborate example involving a Converter for <reference class="java.util.GregorianCalendar"/>: 
    -									</p>
    -									
    -</html><java><![CDATA[// You may prefer Java Calendars over JDBC Timestamps
    -public class CalendarConverter implements Converter<Timestamp, GregorianCalendar> {
    -
    -    @Override
    -    public GregorianCalendar from(Timestamp databaseObject) {
    -        GregorianCalendar calendar = (GregorianCalendar) Calendar.getInstance();
    -        calendar.setTimeInMillis(databaseObject.getTime());
    -        return calendar;
    -    }
    -
    -    @Override
    -    public Timestamp to(GregorianCalendar userObject) {
    -        return new Timestamp(userObject.getTime().getTime());
    -    }
    -
    -    @Override
    -    public Class<Timestamp> fromType() {
    -        return Timestamp.class;
    -    }
    -
    -    @Override
    -    public Class<GregorianCalendar> toType() {
    -        return GregorianCalendar.class;
    -    }
    -}
    -
    -// Now you can fetch calendar values from jOOQ's API:
    -List<GregorianCalendar> dates1 = create.selectFrom(BOOK).fetch().getValues(BOOK.PUBLISHING_DATE, new CalendarConverter());
    -List<GregorianCalendar> dates2 = create.selectFrom(BOOK).fetch(BOOK.PUBLISHING_DATE, new CalendarConverter());
    -]]></java><html>									
    -									
    -									<h3>Enum Converters</h3>
    -									<p>
    -										jOOQ ships with a built-in default <reference class="org.jooq.impl.EnumConverter"/>, that you can use to map VARCHAR values to enum literals or NUMBER values to enum ordinals (both modes are supported). Let's say, you want to map a YES / NO / MAYBE column to a custom Enum:
    -									</p>
    -									
    -</html><java><![CDATA[// Define your Enum
    -public enum YNM {
    -    YES, NO, MAYBE
    -}
    -
    -// Define your converter
    -public class YNMConverter extends EnumConverter<String, YNM> {
    -    public YNMConverter() {
    -        super(String.class, YNM.class);
    -    }
    -}
    -
    -// And you're all set for converting records to your custom Enum:
    -for (BookRecord book : create.selectFrom(BOOK).fetch()) {
    -    switch (book.getValue(BOOK.I_LIKE, new YNMConverter())) {
    -        case YES:    System.out.println("I like this book             : " + book.getTitle()); break;
    -        case NO:     System.out.println("I didn't like this book      : " + book.getTitle()); break;
    -        case MAYBE:  System.out.println("I'm not sure about this book : " + book.getTitle()); break;
    -    }
    -}]]></java><html>
    -									
    -									<h3>Using Converters in generated source code</h3>
    -									<p>
    -										jOOQ also allows for generated source code to reference your own custom converters, in order to permanently replace a <reference id="table-columns" title="table column's"/> &lt;T&gt; type by your own, custom &lt;U&gt; type. See the manual's section about <reference id="custom-data-types" title="custom data types"/> for details.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="interning">
    -								<title>Interning data</title>
    -								<content><html>
    -									<p>
    -										SQL result tables are not optimal in terms of used memory as they are not designed to represent hierarchical data as produced by <code>JOIN</code> operations. Specifically, <code>FOREIGN KEY</code> values may repeat themselves unnecessarily:
    -									</p>
    -
    -</html><text>+----+-----------+--------------+
    -| ID | AUTHOR_ID | TITLE        |
    -+----+-----------+--------------+
    -|  1 |         1 | 1984         |
    -|  2 |         1 | Animal Farm  |
    -|  3 |         2 | O Alquimista |
    -|  4 |         2 | Brida        |
    -+----+-----------+--------------+</text><html>
    -
    -									<p>
    -										Now, if you have millions of records with only few distinct values for <code>AUTHOR_ID</code>, you may not want to hold references to distinct (but equal) <reference class="java.lang.Integer"/> objects. This is specifically true for IDs of type <reference class="java.util.UUID"/> or string representations thereof. jOOQ allows you to "intern" those values:
    -									</p>
    -
    -</html><java><![CDATA[// Interning data after fetching
    -Result<?> r1 = create.select(BOOK.ID, BOOK.AUTHOR_ID, BOOK.TITLE)
    -                     .from(BOOK)
    -                     .join(AUTHOR).on(BOOK.AUTHOR_ID.eq(AUTHOR.ID))
    -                     .fetch()
    -                     .intern(BOOK.AUTHOR_ID);
    -
    -// Interning data while fetching
    -Result<?> r1 = create.select(BOOK.ID, BOOK.AUTHOR_ID, BOOK.TITLE)
    -                     .from(BOOK)
    -                     .join(AUTHOR).on(BOOK.AUTHOR_ID.eq(AUTHOR.ID))
    -                     .intern(BOOK.AUTHOR_ID)
    -                     .fetch();]]></java><html>
    -                     
    -                     				<p>
    -                     					You can specify as many fields as you want for interning. The above has the following effect:
    -                     				</p>
    -                     				
    -                     				<ul>
    -                     					<li>If the interned Field is of type <reference class="java.lang.String"/>, then <reference class="java.lang.String" anchor="#intern()" title="String.intern()"/> is called upon each string</li>
    -                     					<li>If the interned Field is of any other type, then the call is ignored</li>
    -                     				</ul>
    -                     				
    -                     				<p>
    -                     					Future versions of jOOQ will implement interning of data for non-String data types by collecting values in <reference class="java.util.Set"/>, removing duplicate instances.
    -                     				</p>
    -                     				
    -                     				<p>
    -                     					Note, that jOOQ will not use interned data for identity comparisons: <code>string1 == string2</code>. Interning is used only to reduce the memory footprint of <reference class="org.jooq.Result"/> objects.
    -                     				</p>
    -								</html></content>
    -							</section>							
    -						</sections>
    -					</section>
    -					
    -					<section id="statement-type">
    -						<title>Static statements vs. Prepared Statements</title>
    -						<content><html>
    -							<p>
    -								With JDBC, you have full control over your SQL statements. You can decide yourself, if you want to execute a static <reference class="java.sql.Statement"/> without bind values, or a <reference class="java.sql.PreparedStatement"/> with (or without) bind values. But you have to decide early, which way to go. And you'll have to prevent SQL injection and syntax errors manually, when inlining your bind variables.
    -							</p>
    -							<p>
    -								With jOOQ, this is easier. As a matter of fact, it is plain simple. With jOOQ, you can just set a flag in your <reference id="dsl-context" title="Configuration's"/> <reference id="custom-settings" title="Settings"/>, and all queries produced by that configuration will be executed as static statements, with all bind values inlined. An example is given here:
    -							</p>
    -							
    -</html><code-pair>
    -<sql><![CDATA[
    -
    -
    -
    -
    -
    -
    --- These statements are rendered by the two factories:
    -SELECT ? FROM DUAL WHERE ? = ?
    -SELECT 1 FROM DUAL WHERE 1 = 1]]></sql><java><![CDATA[// This DSLContext executes PreparedStatements
    -DSLContext prepare = DSL.using(connection, SQLDialect.ORACLE);
    -
    -// This DSLContext executes static Statements
    -DSLContext inlined = DSL.using(connection, SQLDialect.ORACLE, 
    -  new Settings().withStatementType(StatementType.STATIC_STATEMENT));
    -  
    -prepare.select(val(1)).where(val(1).equal(1)).fetch();
    -inlined.select(val(1)).where(val(1).equal(1)).fetch();]]></java>
    -</code-pair><html>
    -
    -							<h3>Reasons for choosing one or the other</h3>
    -							<p>
    -								Not all databases are equal. Some databases show improved performance if you use <reference class="java.sql.PreparedStatement"/>, as the database will then be able to re-use execution plans for identical SQL statements, regardless of actual bind values. This heavily improves the time it takes for soft-parsing a SQL statement. In other situations, assuming that bind values are irrelevant for SQL execution plans may be a bad idea, as you might run into "bind value peeking" issues. You may be better off spending the extra cost for a new hard-parse of your SQL statement and instead having the database fine-tune the new plan to the concrete bind values.
    -							</p>
    -							<p>
    -								Whichever aproach is more optimal for you cannot be decided by jOOQ. In most cases, prepared statements are probably better. But you always have the option of forcing jOOQ to render inlined bind values.
    -							</p>
    -							
    -							<h3>Inlining bind values on a per-bind-value basis</h3>
    -							<p>
    -								Note that you don't have to inline all your bind values at once. If you know that a bind value is not really a variable and should be inlined explicitly, you can do so by using <reference class="org.jooq.impl.DSL" anchor="#inline(Object)" title="DSL.inline()"/>, as documented in the manual's section about <reference id="inlined-parameters" title="inlined parameters"/>
    -							</p>
    -						</html></content>
    -					</section>
    -
    -					<section id="reusing-statements">
    -						<title>Reusing a Query's PreparedStatement</title>
    -						<content><html>
    -							<p>
    -								As previously discussed in the chapter about <reference id="comparison-with-jdbc" title="differences between jOOQ and JDBC"/>, reusing PreparedStatements is handled a bit differently in jOOQ from how it is handled in JDBC
    -							</p>
    -							
    -							<h3>Keeping open PreparedStatements with JDBC</h3>
    -							<p>
    -								With JDBC, you can easily reuse a <reference class="java.sql.PreparedStatement"/> by not closing it between subsequent executions. An example is given here:
    -							</p>
    -							
    -</html><java><![CDATA[PreparedStatement stmt = null;
    -ResultSet rs1 = null;
    -ResultSet rs2 = null;
    -
    -try {
    -    // Execute the statement and fetch a first ResultSet
    -    stmt = connection.prepareStatement("SELECT 1 FROM DUAL");
    -    rs1  = stmt.executeQuery();
    -
    -    // Without closing the statement, execute it again to fetch another ResultSet
    -    rs2  = stmt.executeQuery();
    -}
    -finally {
    -    try { rs1.close();  } catch (Exception ignore) {}
    -    try { rs2.close();  } catch (Exception ignore) {}
    -    try { stmt.close(); } catch (Exception ignore) {}
    -}]]></java><html>
    -
    -							<p>
    -								The above technique can be quite useful when you want to reuse expensive database resources. This can be the case when your statement is executed very frequently and your database would take non-negligible time to soft-parse the prepared statement and generate a new statement / cursor resource.
    -							</p>
    -							
    -							<h3>Keeping open PreparedStatements with jOOQ</h3>
    -							<p>
    -								This is also modeled in jOOQ. However, the difference to JDBC is that closing a statement is the default action, whereas keeping it open has to be configured explicitly. This is better than JDBC, because the default action should be the one that is used most often. Keeping open statements is rarely done in average applications. Here's an example of how to keep open PreparedStatements with jOOQ:
    -							</p>
    -							
    -</html><java><![CDATA[// Create a query which is configured to keep its underlying PreparedStatement open
    -ResultQuery<Record> query = create.selectOne().keepStatement(true);
    -
    -// Execute the query twice, against the same underlying PreparedStatement:
    -try {
    -    Result<Record> result1 = query.fetch(); // This will lazily create a new PreparedStatement
    -    Result<Record> result2 = query.fetch(); // This will reuse the previous PreparedStatement
    -}
    -
    -// ... but now, you must not forget to close the query
    -finally {
    -    query.close();
    -}]]></java><html>
    -
    -							<p>
    -								The above example shows how a query can be executed twice against the same underlying PreparedStatement. Unlike in other execution scenarios, you must not forget to close this query now
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="batch-execution">
    -						<title>Using JDBC batch operations</title>
    -						<content><html>
    -							<p>
    -								With JDBC, you can easily execute several statements at once using the addBatch() method. Essentially, there are two modes in JDBC
    -							</p>
    -
    -							<ul>
    -								<li>Execute several queries without bind values</li>
    -								<li>Execute one query several times with bind values</li>
    -							</ul>
    -
    -							<p>
    -								In code, this looks like the following snippet:
    -							</p>
    -</html><java><![CDATA[// 1. several queries
    -// ------------------
    -Statement stmt = connection.createStatement();
    -stmt.addBatch("INSERT INTO author(id, first_name, last_name) VALUES (1, 'Erich', 'Gamma')");
    -stmt.addBatch("INSERT INTO author(id, first_name, last_name) VALUES (2, 'Richard', 'Helm')");
    -stmt.addBatch("INSERT INTO author(id, first_name, last_name) VALUES (3, 'Ralph', 'Johnson')");
    -stmt.addBatch("INSERT INTO author(id, first_name, last_name) VALUES (4, 'John', 'Vlissides')");
    -int[] result = stmt.executeBatch();
    -
    -// 2. a single query
    -// -----------------
    -PreparedStatement stmt = connection.prepareStatement("INSERT INTO author(id, first_name, last_name) VALUES (?, ?, ?)");
    -stmt.setInt(1, 1);
    -stmt.setString(2, "Erich");
    -stmt.setString(3, "Gamma");
    -stmt.addBatch();
    -
    -stmt.setInt(1, 2);
    -stmt.setString(2, "Richard");
    -stmt.setString(3, "Helm");
    -stmt.addBatch();
    -
    -stmt.setInt(1, 3);
    -stmt.setString(2, "Ralph");
    -stmt.setString(3, "Johnson");
    -stmt.addBatch();
    -
    -stmt.setInt(1, 4);
    -stmt.setString(2, "John");
    -stmt.setString(3, "Vlissides");
    -stmt.addBatch();
    -
    -int[] result = stmt.executeBatch();]]></java><html>
    -
    -
    -							<h3>This will also be supported by jOOQ</h3>
    -							<p>
    -								jOOQ supports executing queries in batch mode as follows:
    -							</p>
    -							
    -</html><java><![CDATA[// 1. several queries
    -// ------------------
    -create.batch(
    -	create.insertInto(AUTHOR, ID, FIRST_NAME, LAST_NAME).values(1, "Erich", "Gamma"),
    -	create.insertInto(AUTHOR, ID, FIRST_NAME, LAST_NAME).values(2, "Richard", "Helm"),
    -	create.insertInto(AUTHOR, ID, FIRST_NAME, LAST_NAME).values(3, "Ralph", "Johnson"),
    -	create.insertInto(AUTHOR, ID, FIRST_NAME, LAST_NAME).values(4, "John", "Vlissides"))
    -.execute();
    -
    -// 2. a single query
    -// -----------------
    -create.batch(create.insertInto(AUTHOR, ID, FIRST_NAME, LAST_NAME).values((Integer) null, null, null))
    -      .bind(1, "Erich", "Gamma")
    -      .bind(2, "Richard", "Helm")
    -      .bind(3, "Ralph", "Johnson")
    -      .bind(4, "John", "Vlissides")
    -      .execute();]]></java><html>
    -      
    -                            <p>
    -                                When creating a batch execution with a single query and multiple bind values, you will still have to provide jOOQ with dummy bind values for the original query. In the above example, these are set to <code>null</code>. For subsequent calls to <code>bind()</code>, there will be no type safety provided by jOOQ.
    -                            </p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="sequence-execution">
    -						<title>Sequence execution</title>
    -						<content><html>
    -							<p>
    -								Most databases support sequences of some sort, to provide you with unique values to be used for primary keys and other enumerations. If you're using jOOQ's <reference id="code-generation" title="code generator"/>, it will generate a sequence object per sequence for you. There are two ways of using such a sequence object:
    -							</p>
    -
    -							<h3>Standalone calls to sequences</h3>
    -							<p>
    -								Instead of actually phrasing a select statement, you can also use the <reference id="dsl-context" title="DSLContext's"/> convenience methods:
    -							</p>							
    -							
    -</html><java><![CDATA[// Fetch the next value from a sequence
    -BigInteger nextID = create.nextval(S_AUTHOR_ID);
    -
    -// Fetch the current value from a sequence
    -BigInteger currID = create.currval(S_AUTHOR_ID);]]></java><html>
    -							
    -							<h3>Inlining sequence references in SQL</h3>
    -							<p>
    -								You can inline sequence references in jOOQ SQL statements. The following are examples of how to do that:
    -							</p>
    -							
    -</html><java><![CDATA[// Reference the sequence in a SELECT statement:
    -BigInteger nextID = create.select(s).fetchOne(S_AUTHOR_ID.nextval());
    -
    -// Reference the sequence in an INSERT statement:
    -create.insertInto(AUTHOR, AUTHOR.ID, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -      .values(S_AUTHOR_ID.nextval(), val("William"), val("Shakespeare"));
    -]]></java><html>
    -
    -							<p>
    -								For more info about inlining sequence references in SQL statements, please refer to the manual's section about <reference id="sequences-and-serials" title="sequences and serials"/>.
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="stored-procedures">
    -						<title>Stored procedures and functions</title>
    -						<content><html>
    -							<p>
    -								Many RDBMS support the concept of "routines", usually calling them procedures and/or functions. These concepts have been around in programming languages for a while, also outside of databases. Famous languages distinguishing procedures from functions are:
    -							</p>
    -							<ul>
    -								<li>Ada</li>
    -								<li>BASIC</li>
    -								<li>Pascal</li>
    -								<li>etc...</li>
    -							</ul>
    -							<p>
    -								The general distinction between (stored) procedures and (stored) functions can be summarised like this:
    -							</p>
    -							
    -							<h3>Procedures</h3>
    -							<ul>
    -								<li>Are called using JDBC CallableStatement</li>
    -								<li>Have no return value</li>
    -								<li>Usually support OUT parameters</li>
    -							</ul>
    -							
    -							<h3>Functions</h3>
    -							<ul>
    -								<li>Can be used in SQL statements</li>
    -								<li>Have a return value</li>
    -								<li>Usually don't support OUT parameters</li>
    -							</ul>
    -							
    -							<h3>Exceptions to these rules</h3>
    -							<ul>
    -								<li>DB2, H2, and HSQLDB don't allow for JDBC escape syntax when calling functions. Functions must be used in a SELECT statement</li>
    -								<li>H2 only knows functions (without OUT parameters)</li>
    -								<li>Oracle functions may have OUT parameters</li>
    -								<li>Oracle knows functions that must not be used in SQL statements for transactional reasons</li>
    -								<li>Postgres only knows functions (with all features combined). OUT parameters can also be interpreted as return values, which is quite elegant/surprising, depending on your taste</li>
    -								<li>The Sybase jconn3 JDBC driver doesn't handle null values correctly when using the JDBC escape syntax on functions</li>
    -							</ul>
    -							<p>
    -								In general, it can be said that the field of routines (procedures / functions) is far from being standardised in modern RDBMS even if the SQL:2008 standard specifies things quite well. Every database has its ways and JDBC only provides little abstraction over the great variety of procedures / functions implementations, especially when advanced data types such as cursors / UDT's / arrays are involved.
    -							</p>
    -							<p>
    -								To simplify things a little bit, jOOQ handles both procedures and functions the same way, using a more general <reference class="org.jooq.Routine"/> type.
    -							</p>
    -							
    -							<h3>Using jOOQ for standalone calls to stored procedures and functions</h3>
    -							<p>
    -								If you're using jOOQ's <reference id="code-generation" title="code generator"/>, it will generate <reference class="org.jooq.Routine"/> objects for you. Let's consider the following example:
    -							</p>
    -							
    -</html><sql><![CDATA[-- Check whether there is an author in AUTHOR by that name and get his ID
    -CREATE OR REPLACE PROCEDURE author_exists (author_name VARCHAR2, result OUT NUMBER, id OUT NUMBER);]]></sql><html>
    -
    -							<p>
    -								The generated artefacts can then be used as follows:
    -							</p>
    -							
    -</html><java><![CDATA[// Make an explicit call to the generated procedure object:
    -AuthorExists procedure = new AuthorExists();
    -
    -// All IN and IN OUT parameters generate setters
    -procedure.setAuthorName("Paulo");
    -procedure.execute(configuration);
    -
    -// All OUT and IN OUT parameters generate getters
    -assertEquals(new BigDecimal("1"), procedure.getResult());
    -assertEquals(new BigDecimal("2"), procedure.getId();]]></java><html>							
    -							
    -							<p>
    -								But you can also call the procedure using a generated convenience method in a global Routines class:
    -							</p>
    -
    -</html><java><![CDATA[// The generated Routines class contains static methods for every procedure.
    -// Results are also returned in a generated object, holding getters for every OUT or IN OUT parameter.
    -AuthorExists result = Routines.authorExists("Paulo");
    -
    -// All OUT and IN OUT parameters generate getters
    -assertEquals(new BigDecimal("1"), procedure.getResult());
    -assertEquals(new BigDecimal("2"), procedure.getId();]]></java><html>			
    -
    -							<p>
    -								For more details about <reference id="code-generation" title="code generation"/> for procedures, see the manual's section about <reference id="codegen-procedures" title="procedures and code generation"/>.
    -							</p>				
    -							
    -							<h3>Inlining stored function references in SQL</h3>
    -							<p>
    -								Unlike procedures, functions can be inlined in SQL statements to generate <reference id="column-expressions" title="column expressions"/> or <reference id="table-expressions" title="table expressions"/>, if you're using <reference id="array-and-cursor-unnesting" title="unnesting operators"/>. Assume you have a function like this:
    -							</p>
    -
    -</html><sql><![CDATA[-- Check whether there is an author in AUTHOR by that name and get his ID
    -CREATE OR REPLACE FUNCTION author_exists (author_name VARCHAR2) RETURN NUMBER;]]></sql><html>
    -							
    -							<p>
    -								The generated artefacts can then be used as follows:
    -							</p>
    -							
    -</html><code-pair>
    -<sql><![CDATA[-- This is the rendered SQL
    -
    -SELECT AUTHOR_EXISTS('Paulo') FROM DUAL]]></sql><java><![CDATA[// Use the static-imported method from Routines:
    -boolean exists = 
    -create.select(authorExists("Paulo")).fetchOne(0, boolean.class);]]></java>							
    -</code-pair><html>
    -							
    -							<p>
    -								For more info about inlining stored function references in SQL statements, please refer to the manual's section about <reference id="user-defined-functions" title="user-defined functions"/>.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="oracle-packages">
    -								<title>Oracle Packages</title>
    -								<content><html>
    -									<p>
    -										Oracle uses the concept of a PACKAGE to group several procedures/functions into a sort of namespace. The <a href="http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt" title="SQL 92 standard">SQL 92 standard</a> talks about "modules", to represent this concept, even if this is rarely implemented as such. This is reflected in jOOQ by the use of Java sub-packages in the <reference id="code-generation" title="source code generation"/> destination package. Every Oracle package will be reflected by
    -									</p>
    -									<ul>
    -										<li>A Java package holding classes for formal Java representations of the procedure/function in that package</li>
    -										<li>A Java class holding convenience methods to facilitate calling those procedures/functions</li>
    -									</ul>
    -									<p>
    -										Apart from this, the generated source code looks exactly like the one for standalone procedures/functions.
    -									</p>
    -									<p>
    -										For more details about <reference id="code-generation" title="code generation"/> for procedures and packages see the manual's section about <reference id="codegen-procedures" title="procedures and code generation"/>.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="oracle-member-procedures">
    -								<title>Oracle member procedures</title>
    -								<content><html>
    -									<p>
    -										Oracle UDTs can have object-oriented structures including member functions and procedures. With Oracle, you can do things like this:
    -									</p>
    -									
    -</html><sql><![CDATA[CREATE OR REPLACE TYPE u_author_type AS OBJECT (
    -  id NUMBER(7),
    -  first_name VARCHAR2(50),
    -  last_name VARCHAR2(50),
    -
    -  MEMBER PROCEDURE LOAD,
    -  MEMBER FUNCTION counBOOKs RETURN NUMBER
    -)
    -
    --- The type body is omitted for the example]]></sql><html>
    -
    -									<p>
    -										These member functions and procedures can simply be mapped to Java methods:
    -									</p>
    -
    -</html><java><![CDATA[// Create an empty, attached UDT record from the DSLContext
    -UAuthorType author = create.newRecord(U_AUTHOR_TYPE);
    -
    -// Set the author ID and load the record using the LOAD procedure
    -author.setId(1);
    -author.load();
    -
    -// The record is now updated with the LOAD implementation's content
    -assertNotNull(author.getFirstName());
    -assertNotNull(author.getLastName());]]></java><html>
    -
    -									<p>
    -										For more details about <reference id="code-generation" title="code generation"/> for UDTs see the manual's section about <reference id="codegen-udts" title="user-defined types and code generation"/>.
    -									</p>								
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -				    <section id="exporting">
    -						<title>Exporting to XML, CSV, JSON, HTML, Text</title>
    -						<content><html>
    -							<p>
    -								If you are using jOOQ for scripting purposes or in a slim, unlayered application server, you might be interested in using jOOQ's exporting functionality (see also the <reference id="importing" title="importing functionality"/>). You can export any Result&lt;Record&gt; into the formats discussed in the subsequent chapters of the manual
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="exporting-xml">
    -								<title>Exporting XML</title>
    -								<content><java>// Fetch books and format them as XML
    -String xml = create.selectFrom(BOOK).fetch().formatXML();</java><html>
    -
    -									<p>
    -										The above query will result in an XML document looking like the following one:
    -									</p>
    -
    -</html><xml><![CDATA[<result xmlns="http://www.jooq.org/xsd/jooq-export-{export-xsd-version}.xsd">
    -  <fields>
    -    <field name="ID" type="INTEGER"/>
    -    <field name="AUTHOR_ID" type="INTEGER"/>
    -    <field name="TITLE" type="VARCHAR"/>
    -  </fields>
    -  <records>
    -    <record>
    -      <value field="ID">1</value>
    -      <value field="AUTHOR_ID">1</value>
    -      <value field="TITLE">1984</value>
    -    </record>
    -    <record>
    -      <value field="ID">2</value>
    -      <value field="AUTHOR_ID">1</value>
    -      <value field="TITLE">Animal Farm</value>
    -    </record>
    -  </records>
    -</result>]]></xml><html>
    -
    -									<p>
    -										The same result as an <reference class="org.w3c.dom.Document"/> can be obtained using the Result.intoXML() method:
    -									</p>
    -
    -
    -</html><java>// Fetch books and format them as XML
    -Document xml = create.selectFrom(BOOK).fetch().intoXML();</java><html>
    -
    -									<p>
    -										See the XSD schema definition here, for a formal definition of the XML export format:<br/>
    -										<a href="http://www.jooq.org/xsd/jooq-export-{export-xsd-version}.xsd">http://www.jooq.org/xsd/jooq-export-{export-xsd-version}.xsd</a>
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="exporting-csv">
    -								<title>Exporting CSV</title>
    -								<content><java>// Fetch books and format them as CSV
    -String csv = create.selectFrom(BOOK).fetch().formatCSV();</java><html>
    -
    -									<p>
    -										The above query will result in a CSV document looking like the following one:
    -									</p>
    -
    -</html><text>ID,AUTHOR_ID,TITLE
    -1,1,1984
    -2,1,Animal Farm</text><html>
    -
    -									<p>
    -										In addition to the standard behaviour, you can also specify a separator character, as well as a special string to represent NULL values (which cannot be represented in standard CSV):
    -									</p>
    -
    -</html><java>// Use ";" as the separator character
    -String csv = create.selectFrom(BOOK).fetch().formatCSV(';');
    -
    -// Specify "{null}" as a representation for NULL values
    -String csv = create.selectFrom(BOOK).fetch().formatCSV(';', "{null}");</java></content>
    -							</section>
    -
    -							<section id="exporting-json">
    -								<title>Exporting JSON</title>
    -								<content><java>// Fetch books and format them as JSON
    -String json = create.selectFrom(BOOK).fetch().formatJSON();</java><html>
    -
    -									<p>
    -										The above query will result in a JSON document looking like the following one:
    -									</p>
    -
    -</html><text>{"fields":[{"name":"field-1","type":"type-1"},
    -           {"name":"field-2","type":"type-2"},
    -           ...,
    -           {"name":"field-n","type":"type-n"}],
    - "records":[[value-1-1,value-1-2,...,value-1-n],
    -            [value-2-1,value-2-2,...,value-2-n]]}</text><html>
    -             
    -             						<p>
    -             							Note: This format has changed in jOOQ 2.6.0
    -             						</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="exporting-html">
    -								<title>Exporting HTML</title>
    -								<content><java>// Fetch books and format them as HTML
    -String html = create.selectFrom(BOOK).fetch().formatHTML();</java><html>
    -
    -									<p>
    -										The above query will result in an HTML document looking like the following one
    -									</p>
    -
    -</html><xml><![CDATA[<table>
    -  <thead>
    -    <tr>
    -      <th>ID</th>
    -      <th>AUTHOR_ID</th>
    -      <th>TITLE</th>
    -    </tr>
    -  </thead>
    -  <tbody>
    -    <tr>
    -      <td>1</td>
    -      <td>1</td>
    -      <td>1984</td>
    -    </tr>
    -    <tr>
    -      <td>2</td>
    -      <td>1</td>
    -      <td>Animal Farm</td>
    -    </tr>
    -  </tbody>
    -</table>]]></xml></content>
    -							</section>
    -
    -							<section id="exporting-text">
    -								<title>Exporting Text</title>
    -								<content><java>// Fetch books and format them as text
    -String text = create.selectFrom(BOOK).fetch().format();</java><html>
    -
    -									<p>
    -										The above query will result in a text document looking like the following one
    -									</p>
    -
    -</html><text>+---+---------+-----------+
    -| ID|AUTHOR_ID|TITLE      |
    -+---+---------+-----------+
    -|  1|        1|1984       |
    -|  2|        1|Animal Farm|
    -+---+---------+-----------+</text><html>
    -
    -									<p>
    -										A simple text representation can also be obtained by calling toString() on a Result object. See also the manual's section about <reference id="logging" title="DEBUG logging"/>
    -									</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -				    <section id="importing">
    -						<title>Importing data</title>
    -						<content><html>
    -							<p>
    -								If you are using jOOQ for scripting purposes or in a slim, unlayered application server, you might be interested in using jOOQ's importing functionality (see also exporting functionality). You can import data directly into a table from the formats described in the subsequent sections of this manual.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="importing-csv">
    -								<title>Importing CSV</title>
    -								<content><html>
    -
    -									<p>
    -										The below CSV data represents two author records that may have been exported previously, by jOOQ's <reference id="exporting" title="exporting functionality"/>, and then modified in Microsoft Excel or any other spreadsheet tool:
    -									</p>
    -
    -</html><text>ID;AUTHOR_ID;TITLE
    -1;1;1984
    -2;1;Animal Farm</text><html>
    -
    -									<p>
    -										With jOOQ, you can load this data using various parameters from the	loader API. A simple load may look like this:
    -									</p>
    -
    -</html><java>DSLContext create = DSL.using(connection, dialect);
    -
    -// Load data into the AUTHOR table from an input stream
    -// holding the CSV data.
    -create.loadInto(AUTHOR)
    -      .loadCSV(inputstream)
    -      .fields(ID, AUTHOR_ID, TITLE)
    -      .execute();</java><html>
    -
    -      								<p>
    -      									Here are various other examples:
    -   									</p>
    -
    -</html><java>// Ignore the AUTHOR_ID column from the CSV file when inserting
    -create.loadInto(AUTHOR)
    -      .loadCSV(inputstream)
    -      .fields(ID, null, TITLE)
    -      .execute();
    -
    -// Specify behaviour for duplicate records.
    -create.loadInto(AUTHOR)
    -
    -      // choose any of these methods
    -      .onDuplicateKeyUpdate()
    -      .onDuplicateKeyIgnore()
    -      .onDuplicateKeyError() // the default
    -
    -      .loadCSV(inputstream)
    -      .fields(ID, null, TITLE)
    -      .execute();
    -
    -// Specify behaviour when errors occur.
    -create.loadInto(AUTHOR)
    -
    -      // choose any of these methods
    -      .onErrorIgnore()
    -      .onErrorAbort() // the default
    -
    -      .loadCSV(inputstream)
    -      .fields(ID, null, TITLE)
    -      .execute();
    -
    -// Specify transactional behaviour where this is possible
    -// (e.g. not in container-managed transactions)
    -create.loadInto(AUTHOR)
    -
    -      // choose any of these methods
    -      .commitEach()
    -      .commitAfter(10)
    -      .commitAll()
    -      .commitNone() // the default
    -
    -      .loadCSV(inputstream)
    -      .fields(ID, null, TITLE)
    -      .execute();</java><html>
    -
    -									<p>
    -										Any of the above configuration methods can be combined to achieve the type of load you need. Please refer to the API's Javadoc to learn about more details. Errors that occur during the load are reported by the execute method's result:
    -									</p>
    -
    -</html><java><![CDATA[Loader<Author> loader = /* .. */ .execute();
    -
    -// The number of processed rows
    -int processed = loader.processed();
    -
    -// The number of stored rows (INSERT or UPDATE)
    -int stored = loader.stored();
    -
    -// The number of ignored rows (due to errors, or duplicate rule)
    -int ignored = loader.ignored();
    -
    -// The errors that may have occurred during loading
    -List<LoaderError> errors = loader.errors();
    -LoaderError error = errors.get(0);
    -
    -// The exception that caused the error
    -DataAccessException exception = error.exception();
    -
    -// The row that caused the error
    -int rowIndex = error.rowIndex();
    -String[] row = error.row();
    -
    -// The query that caused the error
    -Query query = error.query();]]></java></content>
    -							</section>
    -
    -							<section id="importing-xml">
    -								<title>Importing XML</title>
    -								<content><html>
    -									<p>This is not yet supported</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -				    <section id="crud-with-updatablerecords">
    -						<title>CRUD with UpdatableRecords</title>
    -						<content><html>
    -							<p>
    -								Your database application probably consists of 50% - 80% CRUD, whereas only the remaining 20% - 50% of querying is actual querying. Most often, you will operate on records of tables without using any advanced relational concepts. This is called CRUD for
    -							</p>
    -							<ul>
    -								<li>Create (<reference id="insert-statement" title="INSERT"/>)</li>
    -								<li>Read (<reference id="select-statement" title="SELECT"/>)</li>
    -								<li>Update (<reference id="update-statement" title="UPDATE"/>)</li>
    -								<li>Delete (<reference id="delete-statement" title="DELETE"/>)</li>
    -							</ul>
    -							<p>								
    -								CRUD always uses the same patterns, regardless of the nature of underlying tables. This again, leads to a lot of boilerplate code, if you have to issue your statements yourself. Like Hibernate / JPA and other ORMs, jOOQ facilitates CRUD using a specific API involving <reference class="org.jooq.UpdatableRecord"/> types.
    -							</p>
    -							
    -							<h3>Primary keys and updatability</h3>
    -							<p>
    -								In normalised databases, every table has a primary key by which a tuple/record within that table can be uniquely identified. In simple cases, this is a (possibly auto-generated) number called ID. But in many cases, primary keys include several non-numeric columns. An important feature of such keys is the fact that in most databases, they are enforced using an index that allows for very fast random access to the table. A typical way to access / modify / delete a book is this:
    -							</p>
    -							
    -</html><sql><![CDATA[-- Inserting uses a previously generated key value or generates it afresh
    -INSERT INTO BOOK (ID, TITLE) VALUES (5, 'Animal Farm');
    -
    --- Other operations can use a previously generated key value
    -SELECT * FROM BOOK WHERE ID = 5;
    -UPDATE BOOK SET TITLE = '1984' WHERE ID = 5;
    -DELETE FROM BOOK WHERE ID = 5;]]></sql><html>
    -							
    -							<p>
    -								Normalised databases assume that a primary key is unique "forever", i.e. that a key, once inserted into a table, will never be changed or re-inserted after deletion. In order to use jOOQ's <reference id="simple-crud" title="CRUD"/> operations correctly, you should design your database accordingly.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="simple-crud">
    -								<title>Simple CRUD</title>
    -								<content><html>
    -									<p>
    -										If you're using jOOQ's <reference id="code-generation" title="code generator"/>, it will generate <reference class="org.jooq.UpdatableRecord"/> implementations for every table that has a primary key. When <reference id="fetching" title="fetching"/> such a record form the database, these records are "attached" to the <reference id="dsl-context" title="Configuration" /> that created them. This means that they hold an internal reference to the same database connection that was used to fetch them. This connection is used internally by any of the following methods of the UpdatableRecord:
    -									</p>
    -									
    -</html><java><![CDATA[// Refresh a record from the database.
    -void refresh() throws DataAccessException;
    -
    -// Store (insert or update) a record to the database.
    -int store() throws DataAccessException;
    -
    -// Delete a record from the database
    -int delete() throws DataAccessException;]]></java><html>
    -									
    -									<p>
    -										See the manual's section about <reference id="serializability" title="serializability"/> for some more insight on "attached" objects. 
    -									</p>
    -									
    -									<h3>Storing</h3>
    -									<p>
    -										Storing a record will perform an <reference id="insert-statement" title="INSERT statement"/> or an <reference id="update-statement" title="UPDATE statement"/>. In general, new records are always inserted, whereas records loaded from the database are always updated. This is best visualised in code:
    -									</p>
    -
    -</html><java><![CDATA[// Create a new record
    -BookRecord book1 = create.newRecord(BOOK);
    -
    -// Insert the record: INSERT INTO BOOK (TITLE) VALUES ('1984');
    -book1.setTitle("1984");
    -book1.store();
    -
    -// Update the record: UPDATE BOOK SET PUBLISHED_IN = 1984 WHERE ID = [id]
    -book1.setPublishedIn(1948);
    -book1.store();
    -
    -// Get the (possibly) auto-generated ID from the record
    -Integer id = book1.getId();
    -
    -// Get another instance of the same book
    -BookRecord book2 = create.fetchOne(BOOK, BOOK.ID.equal(id));
    -
    -// Update the record: UPDATE BOOK SET TITLE = 'Animal Farm' WHERE ID = [id]
    -book2.setTitle("Animal Farm");
    -book2.store();]]></java><html>
    -									
    -									<p>
    -										Some remarks about storing:
    -									</p>
    -									<ul>
    -										<li>jOOQ sets only modified values in <reference id="insert-statement" title="INSERT statements"/> or <reference id="update-statement" title="UPDATE statements"/>. This allows for default values to be applied to inserted records, as specified in CREATE TABLE DDL statements.</li>
    -										<li>When store() performs an <reference id="insert-statement" title="INSERT statement"/>, jOOQ attempts to load any generated keys from the database back into the record. For more details, see the manual's section about <reference id="identity-values" title="IDENTITY values"/>.</li>
    -										<li>When loading records from <reference id="pojos" title="POJOs"/>, jOOQ will assume the record is a new record. It will hence attempt to INSERT it.</li>
    -										<li>When you activate <reference id="optimistic-locking" title="optimistic locking"/>, storing a record may fail, if the underlying database record has been changed in the mean time.</li>
    -									</ul>
    -																		
    -									<h3>Deleting</h3>
    -									<p>
    -										Deleting a record will remove it from the database. Here's how you delete records:
    -									</p>
    -									
    -</html><java><![CDATA[// Get a previously inserted book
    -BookRecord book = create.fetchOne(BOOK, BOOK.ID.equal(5));
    -
    -// Delete the book
    -book.delete();]]></java><html>
    -									
    -									<h3>Refreshing</h3>
    -									<p>
    -										Refreshing a record from the database means that jOOQ will issue a <reference id="select-statement" title="SELECT statement"/> to refresh all record values that are not the primary key. This is particularly useful when you use jOOQ's <reference id="optimistic-locking" title="optimistic locking"/> feature, in case a modified record is "stale" and cannot be stored to the database, because the underlying database record has changed in the mean time.
    -									</p>
    -									<p>
    -										In order to perform a refresh, use the following Java code:
    -									</p>									
    -
    -</html><java><![CDATA[// Fetch an updatable record from the database
    -BookRecord book = create.fetchOne(BOOK, BOOK.ID.equal(5));
    -
    -// Refresh the record
    -book.refresh();]]></java><html>
    -
    -									<h3>CRUD and SELECT statements</h3>
    -									<p>
    -										CRUD operations can be combined with regular querying, if you select records from single database tables, as explained in the manual's section about <reference id="select-statement" title="SELECT statements"/>. For this, you will need to use the <code>selectFrom()</code> method from the <reference id="dsl-context" title="DSLContext"/>:
    -									</p>
    -									
    -</html><java><![CDATA[// Loop over records returned from a SELECT statement
    -for (BookRecord book : create.fetch(BOOK, BOOK.PUBLISHED_IN.equal(1948))) {
    -
    -  // Perform actions on BookRecords depending on some conditions
    -  if ("Orwell".equals(book.fetchParent(FK_BOOK_AUTHOR).getLastName())) {
    -    book.delete();
    -  }
    -}]]></java></content>
    -							</section>
    -
    -							<section id="internal-flags">
    -								<title>Records' internal flags</title>
    -								<content><html>
    -									<p>
    -										All of jOOQ's <reference id="record-vs-tablerecord" title="Record types and subtypes"/> maintain an internal state for every column value. This state is composed of three elements:
    -									</p>
    -									<ul>
    -										<li>The value itself</li>
    -										<li>The "original" value, i.e. the value as it was originally fetched from the database or <code>null</code>, if the record was never in the database</li>
    -										<li>The "changed" flag, indicating if the value was ever changed through the <code>Record</code> API.</li>
    -									</ul>
    -									
    -									<p>
    -										The purpose of the above information is for jOOQ's <reference id="simple-crud" title="CRUD operations"/> to know, which values need to be stored to the database, and which values have been left untouched.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="identity-values">
    -								<title>IDENTITY values</title>
    -								<content><html>
    -									<p>
    -										Many databases support the concept of IDENTITY values, or <reference id="sequence-execution" title="SEQUENCE-generated"/> key values. This is reflected by JDBC's <reference class="java.sql.Statement" anchor="#getGeneratedKeys()" title="getGeneratedKeys()"/> method. jOOQ abstracts using this method as many databases and JDBC drivers behave differently with respect to generated keys. Let's assume the following SQL Server BOOK table:
    -									</p>
    -									
    -</html><sql><![CDATA[CREATE TABLE book (
    -  ID INTEGER IDENTITY(1,1) NOT NULL,
    -  
    -  -- [...]
    -  
    -  CONSTRAINT pk_book PRIMARY KEY (id)
    -)]]></sql><html>
    -
    -									<p>
    -										If you're using jOOQ's <reference id="code-generation" title="code generator"/>, the above table will generate a <reference class="org.jooq.UpdatableRecord"/> with an IDENTITY column. This information is used by jOOQ internally, to update IDs after calling <reference id="crud-with-updatablerecords" title="store()"/>: 
    -									</p>
    -									
    -</html><java><![CDATA[BookRecord book = create.newRecord(BOOK);
    -book.setTitle("1984");
    -book.store();
    -
    -// The generated ID value is fetched after the above INSERT statement
    -System.out.println(book.getId());]]></java><html>
    -
    -									<h3>Database compatibility</h3>
    -									<p>
    -										<strong>DB2, Derby, HSQLDB, Ingres</strong>
    -									</p>
    -									<p>
    -										These SQL dialects implement the standard very neatly.
    -									</p>
    -</html><sql><![CDATA[id INTEGER GENERATED BY DEFAULT AS IDENTITY
    -id INTEGER GENERATED BY DEFAULT AS IDENTITY (START WITH 1)]]></sql><html>
    -
    -									<p>
    -										<strong>H2, MySQL, Postgres, SQL Server, Sybase ASE, Sybase SQL Anywhere</strong>
    -									</p>
    -									<p>
    -										These SQL dialects implement identites, but the DDL syntax doesn’t follow the standard
    -									</p>
    -</html><sql><![CDATA[-- H2 mimicks MySQL's and SQL Server's syntax
    -ID INTEGER IDENTITY(1,1)
    -ID INTEGER AUTO_INCREMENT
    --- MySQL and SQLite
    -ID INTEGER NOT NULL AUTO_INCREMENT
    -
    --- Postgres serials implicitly create a sequence
    --- Postgres also allows for selecting from custom sequences
    --- That way, sequences can be shared among tables
    -id SERIAL NOT NULL
    -
    --- SQL Server
    -ID INTEGER IDENTITY(1,1) NOT NULL
    --- Sybase ASE
    -id INTEGER IDENTITY NOT NULL
    --- Sybase SQL Anywhere
    -id INTEGER NOT NULL IDENTITY]]></sql><html>
    -
    -									<p>
    -										<strong>Oracle</strong>
    -									</p>
    -									<p>
    -										Oracle does not know any identity columns at all. Instead, you will have to use a trigger and update the ID column yourself, using a custom sequence. Something along these lines:
    -									</p>
    -</html><sql><![CDATA[CREATE OR REPLACE TRIGGER my_trigger
    -BEFORE INSERT
    -ON my_table
    -REFERENCING NEW AS new
    -FOR EACH ROW
    -BEGIN
    -  SELECT my_sequence.nextval
    -  INTO :new.id
    -  FROM dual;
    -END my_trigger;]]></sql><html>
    -
    -									<p>
    -										Note, that this approach can be employed in most databases supporting sequences and triggers! It is a lot more flexible than standard identities
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="navigation-methods">
    -								<title>Navigation methods</title>
    -								<content><html>
    -									<p>
    -										<reference class="org.jooq.TableRecord"/> and <reference class="org.jooq.UpdatableRecord"/> contain foreign key navigation methods. These navigation methods allow for "navigating" inbound or outbound foreign key references by executing an appropriate query. An example is given here: 
    -									</p>
    -				
    -</html><code-pair>
    -<sql><![CDATA[CREATE TABLE book (
    -  AUTHOR_ID NUMBER(7) NOT NULL,
    -  
    -  -- [...]
    -  
    -  FOREIGN KEY (AUTHOR_ID) REFERENCES author(ID)
    -)]]></sql><java><![CDATA[BookRecord book = create.fetch(BOOK, BOOK.ID.equal(5));
    -
    -// Find the author of a book
    -AuthorRecord author = book.fetchParent(FK_BOOK_AUTHOR);
    -
    -// Find other books by that author
    -List<BookRecord> books = author.fetchChildren(FK_BOOK_AUTHOR);]]></java>
    -</code-pair><html>					
    -
    -									<p>
    -										Note that, unlike in Hibernate, jOOQ's navigation methods will always lazy-fetch relevant records, without caching any results. In other words, every time you run such a fetch method, a new query will be issued.
    -									</p>
    -									<p>
    -										These fetch methods only work on "attached" records. See the manual's section about <reference id="serializability" title="serializability"/> for some more insight on "attached" objects.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="non-updatable-records">
    -								<title>Non-updatable records</title>
    -								<content><html>
    -									<p>
    -										Tables without a <code>PRIMARY KEY</code> are considered non-updatable by jOOQ, as jOOQ has no way of uniquely identifying such a record within the database. If you're using jOOQ's <reference id="code-generation" title="code generator"/>, such tables will generate <reference class="org.jooq.TableRecord"/> classes, instead of <reference class="org.jooq.UpdatableRecord"/> classes. When you fetch <reference id="record-vs-tablerecord" title="typed records"/> from such a table, the returned records will not allow for calling any of the <reference id="crud-with-updatablerecords" title="store(), refresh(), delete()"/> methods. 
    -									</p>
    -									
    -									<p>
    -										Note, that some databases use internal rowid or object-id values to identify such records. jOOQ does not support these vendor-specific record meta-data.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="optimistic-locking">
    -								<title>Optimistic locking</title>
    -								<content><html>
    -									<p>
    -										jOOQ allows you to perform <reference id="crud-with-updatablerecords" title="CRUD"/> operations using optimistic locking. You can immediately take advantage of this feature by activating the relevant <reference id="custom-settings" title="executeWithOptimisticLocking Setting"/>. Without any further knowledge of the underlying data semantics, this will have the following impact on store() and delete() methods:
    -									</p>
    -									<ul>
    -										<li>INSERT statements are not affected by this Setting flag</li>
    -										<li>Prior to UPDATE or DELETE statements, jOOQ will run a <reference id="for-update-clause" title="SELECT .. FOR UPDATE"/> statement, pessimistically locking the record for the subsequent UPDATE / DELETE</li>
    -										<li>The data fetched with the previous SELECT will be compared against the data in the record being stored or deleted</li>
    -										<li>An <reference class="org.jooq.exception.DataChangedException"/> is thrown if the record had been modified in the mean time</li>
    -										<li>The record is successfully stored / deleted, if the record had not been modified in the mean time.</li>
    -									</ul>
    -									<p>
    -										The above changes to jOOQ's behaviour are transparent to the API, the only thing you need to do for it to be activated is to set the Settings flag. Here is an example illustrating optimistic locking:
    -									</p>
    -
    -</html><java><![CDATA[// Properly configure the DSLContext
    -DSLContext optimistic = DSLContext.using(connection, SQLDialect.ORACLE, 
    -  new Settings().withExecuteWithOptimisticLocking(true));
    -  
    -// Fetch a book two times
    -BookRecord book1 = optimistic.fetch(BOOK, BOOK.ID.equal(5));
    -BookRecord book2 = optimistic.fetch(BOOK, BOOK.ID.equal(5));
    -
    -// Change the title and store this book. The underlying database record has not been modified, it can be safely updated.
    -book1.setTitle("Animal Farm");
    -book1.store();
    -
    -// Book2 still references the original TITLE value, but the database holds a new value from book1.store(). 
    -// This store() will thus fail:
    -book2.setTitle("1984");
    -book2.store();]]></java><html>								
    -	
    -									<h3>Optimised optimistic locking using TIMESTAMP fields</h3>
    -									<p>
    -										If you're using jOOQ's <reference id="code-generation" title="code generator"/>, you can take indicate TIMESTAMP or UPDATE COUNTER fields for every generated table in the <reference id="codegen-advanced" title="code generation configuration"/>. Let's say we have this table:
    -									</p>
    -
    -</html><sql><![CDATA[CREATE TABLE book (
    -  
    -  -- This column indicates when each book record was modified for the last time
    -  MODIFIED TIMESTAMP NOT NULL,
    -  -- [...]
    -)]]></sql><html>									
    -
    -									<p>
    -										The MODIFIED column will contain a timestamp indicating the last modification timestamp for any book in the BOOK table. If you're using jOOQ and it's <reference id="crud-with-updatablerecords" title="store() methods on UpdatableRecords"/>, jOOQ will then generate this TIMESTAMP value for you, automatically. However, instead of running an additional <reference id="for-update-clause" title="SELECT .. FOR UPDATE"/> statement prior to an UPDATE or DELETE statement, jOOQ adds a WHERE-clause to the UPDATE or DELETE statement, checking for TIMESTAMP's integrity. This can be best illustrated with an example:   
    -									</p>
    -									
    -</html><java><![CDATA[// Properly configure the DSLContext
    -DSLContext optimistic = DSL.using(connection, SQLDialect.ORACLE, 
    -  new Settings().withExecuteWithOptimisticLocking(true));
    -  
    -// Fetch a book two times
    -BookRecord book1 = optimistic.fetch(BOOK, BOOK.ID.equal(5));
    -BookRecord book2 = optimistic.fetch(BOOK, BOOK.ID.equal(5));
    -
    -// Change the title and store this book. The MODIFIED value has not been changed since the book was fetched. 
    -// It can be safely updated
    -book1.setTitle("Animal Farm");
    -book1.store();
    -
    -// Book2 still references the original MODIFIED value, but the database holds a new value from book1.store(). 
    -// This store() will thus fail:
    -book2.setTitle("1984");
    -book2.store();]]></java><html>
    -
    -									<p>
    -										As before, without the added TIMESTAMP column, optimistic locking is transparent to the API.
    -									</p>
    -									
    -									<h3>Optimised optimistic locking using VERSION fields</h3>
    -									<p>
    -										Instead of using TIMESTAMPs, you may also use numeric VERSION fields, containing version numbers that are incremented by jOOQ upon store() calls.
    -									</p>
    -
    -									<p>
    -										Note, for explicit pessimistic locking, please consider the manual's section about the <reference id="for-update-clause" title="FOR UPDATE clause"/>. For more details about how to configure TIMESTAMP or VERSION fields, consider the manual's section about <reference id="codegen-advanced" title="advanced code generator configuration"/>.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="batch-execution-for-crud">
    -								<title>Batch execution</title>
    -								<content><html>
    -									<p>
    -										When inserting, updating, deleting a lot of records, you may wish to profit from JDBC batch operations, which can be performed by jOOQ. These are available through jOOQ's <reference id="dsl-context" title="DSLContext"/> as shown in the following example:
    -									</p>
    -									
    -</html><java><![CDATA[// Fetch a bunch of books
    -List<BookRecord> books = create.fetch(BOOK);
    -
    -// Modify the above books, and add some new ones:
    -modify(books);
    -addMore(books);
    -
    -// Batch-update and/or insert all of the above books
    -create.batchStore(books);]]></java><html>					
    -
    -									<p>
    -										Internally, jOOQ will render all the required SQL statements and execute them as a regular <reference id="batch-execution" title="JDBC batch execution"/>. 
    -									</p>				
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -				    <section id="daos">
    -						<title>DAOs</title>
    -						<content><html>
    -							<p>
    -								If you're using jOOQ's <reference id="code-generation" title="code generator"/>, you can configure it to generate <reference id="pojos" title="POJOs" /> and DAOs for you. jOOQ then generates one DAO per <reference id="crud-with-updatablerecords" title="UpdatableRecord"/>, i.e. per table with a single-column primary key. Generated DAOs implement a common jOOQ type called <reference class="org.jooq.DAO"/>. This type contains the following methods:
    -							</p>
    -							
    -</html><java><![CDATA[// <R> corresponds to the DAO's related table
    -// <P> corresponds to the DAO's related generated POJO type
    -// <T> corresponds to the DAO's related table's primary key type. 
    -// Note that multi-column primary keys are not yet supported by DAOs
    -public interface DAO<R extends TableRecord<R>, P, T> {
    -
    -    // These methods allow for inserting POJOs
    -    void insert(P object) throws DataAccessException;
    -    void insert(P... objects) throws DataAccessException;
    -    void insert(Collection<P> objects) throws DataAccessException;
    -    
    -    // These methods allow for updating POJOs based on their primary key
    -    void update(P object) throws DataAccessException;
    -    void update(P... objects) throws DataAccessException;
    -    void update(Collection<P> objects) throws DataAccessException;
    -    
    -    // These methods allow for deleting POJOs based on their primary key
    -    void delete(P... objects) throws DataAccessException;
    -    void delete(Collection<P> objects) throws DataAccessException;
    -    void deleteById(T... ids) throws DataAccessException;
    -    void deleteById(Collection<T> ids) throws DataAccessException;
    -    
    -    // These methods allow for checking record existence
    -    boolean exists(P object) throws DataAccessException;
    -    boolean existsById(T id) throws DataAccessException;
    -    long count() throws DataAccessException;
    -    
    -    // These methods allow for retrieving POJOs by primary key or by some other field
    -    List<P> findAll() throws DataAccessException;
    -    P findById(T id) throws DataAccessException;
    -    <Z> List<P> fetch(Field<Z> field, Z... values) throws DataAccessException;
    -    <Z> P fetchOne(Field<Z> field, Z value) throws DataAccessException;
    -
    -    // These methods provide DAO meta-information
    -    Table<R> getTable();
    -    Class<P> getType();
    -}]]></java><html>
    -
    -							<p>
    -								Besides these base methods, generated DAO classes implement various useful fetch methods. An incomplete example is given here, for the BOOK table:
    -							</p>
    -
    -</html><java><![CDATA[// An example generated BookDao class
    -public class BookDao extends DAOImpl<BookRecord, Book, Integer> {
    -
    -    // Columns with primary / unique keys produce fetchOne() methods    
    -    public Book fetchOneById(Integer value) { ... }
    -
    -    // Other columns produce fetch() methods, returning several records
    -    public List<Book> fetchByAuthorId(Integer... values) { ... }
    -    public List<Book> fetchByTitle(String... values) { ... }
    -}]]></java><html>
    -							<p>
    -								Note that you can further subtype those pre-generated DAO classes, to add more useful DAO methods to them. Using such a DAO is simple:
    -							</p>
    -							
    -</html><java><![CDATA[// Initialise an Configuration
    -Configuration configuration = new DefaultConfiguration().set(connection).set(SQLDialect.ORACLE);
    -
    -// Initialise the DAO with the Configuration
    -BookDao bookDao = new BookDao(configuration);
    -
    -// Start using the DAO
    -Book book = bookDao.findById(5);
    -
    -// Modify and update the POJO
    -book.setTitle("1984");
    -book.setPublishedIn(1948);
    -bookDao.update(book);
    -
    -// Delete it again
    -bookDao.delete(book);]]></java></content>
    -					</section>
    -
    -				    <section id="exception-handling">
    -						<title>Exception handling</title>
    -						<content><html>
    -							<h3>Checked vs. unchecked exceptions</h3>
    -							<p>
    -								This is an eternal and religious debate. Pros and cons have been discussed time and again, and it still is a matter of taste, today. In this case, jOOQ clearly takes a side. jOOQ's exception strategy is simple:
    -							</p>
    -							<ul>
    -								<li>All "system exceptions" are unchecked. If in the middle of a transaction involving business logic, there is no way that you can recover sensibly from a lost database connection, or a constraint violation that indicates a bug in your understanding of your database model.</li>
    -								<li>All "business exceptions" are checked. Business exceptions are true exceptions that you should handle (e.g. not enough funds to complete a transaction).</li>
    -							</ul>
    -							<p>
    -								With jOOQ, it's simple. All of jOOQ's exceptions are "system exceptions", hence they are all unchecked.
    -							</p>
    -							
    -							<h3>jOOQ's DataAccessException</h3>
    -							<p>
    -								jOOQ uses its own <reference class="org.jooq.exception.DataAccessException"/> to wrap any underlying <reference class="java.sql.SQLException"/> that might have occurred. Note that all methods in jOOQ that may cause such a DataAccessException document this both in the Javadoc as well as in their method signature.
    -							</p>
    -							<p>
    -								DataAccessException is subtyped several times as follows:
    -							</p>
    -							<ul>
    -								<li><strong>DataAccessException</strong>: General exception usually originating from a <reference class="java.sql.SQLException"/></li>
    -								<li><strong>DataChangedException</strong>: An exception indicating that the database's underlying record has been changed in the mean time (see <reference id="optimistic-locking" title="optimistic locking"/>)</li>
    -								<li><strong>DataTypeException</strong>: Something went wrong during type conversion</li>
    -								<li><strong>DetachedException</strong>: A SQL statement was executed on a "detached" <reference id="crud-with-updatablerecords" title="UpdatableRecord"/> or a "detached" <reference id="sql-statements" title="SQL statement"/>.</li>
    -								<li><strong>InvalidResultException</strong>: An operation was performed expecting only one result, but several results were returned.</li>
    -								<li><strong>MappingException</strong>: Something went wrong when loading a record from a <reference id="pojos" title="POJO"/> or when mapping a record into a POJO</li>
    -							</ul>
    -							
    -							<h3>Override jOOQ's exception handling</h3>
    -							<p>
    -								The following section about <reference id="execute-listeners" title="execute listeners"/> documents means of overriding jOOQ's exception handling, if you wish to deal separately with some types of constraint violations, or if you raise business errors from your database, etc.
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="execute-listeners">
    -						<title>ExecuteListeners</title>
    -						<content><html>
    -							<p>
    -								The <reference id="dsl-context" title="Executor class"/> lets you specify a list of <reference class="org.jooq.ExecuteListener"/> instances. The ExecuteListener is essentially an event listener for Query, Routine, or ResultSet render, prepare, bind, execute, fetch steps. It is a base type for loggers, debuggers, profilers, data collectors, triggers, etc. Advanced ExecuteListeners can also provide custom implementations of Connection, PreparedStatement and ResultSet to jOOQ in apropriate methods.
    -							</p>
    -							<p>
    -								For convenience and better backwards-compatibility, consider extending <reference class="org.jooq.impl.DefaultExecuteListener"/> instead of implementing this interface.
    -							</p>
    -							<p>
    -								Here is a sample implementation of an ExecuteListener, that is simply counting the number of queries per type that are being executed using jOOQ:
    -							</p>
    -
    -</html><java><![CDATA[package com.example;
    -
    -// Extending DefaultExecuteListener, which provides empty implementations for all methods...
    -public class StatisticsListener extends DefaultExecuteListener {
    -    public static Map<ExecuteType, Integer> STATISTICS = new HashMap<ExecuteType, Integer>();
    -
    -    // Count "start" events for every type of query executed by jOOQ
    -    @Override
    -    public void start(ExecuteContext ctx) {
    -        synchronized (STATISTICS) {
    -            Integer count = STATISTICS.get(ctx.type());
    -    
    -            if (count == null) {
    -                count = 0;
    -            }
    -    
    -            STATISTICS.put(ctx.type(), count + 1);
    -        }
    -    }
    -}]]></java><html>
    -
    -							<p>
    -								Now, configure jOOQ's runtime to load your listener
    -							</p>
    -
    -</html><java><![CDATA[// Create a configuration with an appropriate listener provider:
    -Configuration configuration = new DefaultConfiguration().set(connection).set(dialect);
    -configuration.set(new DefaultExecuteListenerProvider(new StatisticsListener()));
    -
    -// Create a DSLContext from the above configuration
    -DSLContext create = DSL.using(configuration);]]></java><html>
    -
    -							<p>
    -								And log results any time with a snippet like this:
    -							</p>
    -
    -</html><java><![CDATA[log.info("STATISTICS");
    -log.info("----------");
    -
    -for (ExecuteType type : ExecuteType.values()) {
    -    log.info(type.name(), StatisticsListener.STATISTICS.get(type) + " executions");
    -}]]></java><html>
    -                            <p>
    -                            	This may result in the following log output:
    -                            </p>
    -
    -</html><config>15:16:52,982  INFO - TEST STATISTICS
    -15:16:52,982  INFO - ---------------
    -15:16:52,983  INFO - READ                     : 919 executions
    -15:16:52,983  INFO - WRITE                    : 117 executions
    -15:16:52,983  INFO - DDL                      : 2 executions
    -15:16:52,983  INFO - BATCH                    : 4 executions
    -15:16:52,983  INFO - ROUTINE                  : 21 executions
    -15:16:52,983  INFO - OTHER                    : 30 executions</config><html>
    -
    -							<p>
    -								Please read the <reference class="org.jooq.ExecuteListener" title="ExecuteListener Javadoc"/> for more details
    -							</p>
    -							
    -							<h3>Writing a custom ExecuteListener for logging</h3>
    -							<p>
    -								The following depicts an example of a custom ExecuteListener, which pretty-prints all queries being executed by jOOQ to stdout:
    -							</p>
    -
    -</html><java><![CDATA[import org.jooq.DSLContext;
    -import org.jooq.ExecuteContext;
    -import org.jooq.conf.Settings;
    -import org.jooq.impl.DefaultExecuteListener;
    -import org.jooq.tools.StringUtils;
    -
    -public class PrettyPrinter extends DefaultExecuteListener {
    -
    -    /**
    -     * Hook into the query execution lifecycle before executing queries
    -     */
    -    @Override
    -    public void executeStart(ExecuteContext ctx) {
    -
    -        // Create a new DSLContext for logging rendering purposes
    -        // This DSLContext doesn't need a connection, only the SQLDialect...
    -        DSLContext create = DSL.using(ctx.dialect(), 
    -        
    -        // ... and the flag for pretty-printing
    -        	new Settings().withRenderFormatted(true));
    -
    -        // If we're executing a query
    -        if (ctx.query() != null) {
    -            System.out.println(create.renderInlined(ctx.query()));
    -        }
    -        
    -        // If we're executing a routine
    -        else if (ctx.routine() != null) {
    -            System.out.println(create.renderInlined(ctx.routine()));
    -        }
    -        
    -        // If we're executing anything else (e.g. plain SQL)
    -        else if (!StringUtils.isBlank(ctx.sql())) {
    -            System.out.println(ctx.sql());
    -        }
    -    }
    -}]]></java><html>
    -							<p>
    -								See also the manual's sections about <reference id="logging" title="logging"/> and the <reference id="jooq-console" title="jOOQ Console"/> for more sample implementations of actual ExecuteListeners.
    -							</p>
    -						</html></content>
    -					</section>
    -
    -					<section id="meta-data">
    -						<title>Database meta data</title>
    -						<content><html>
    -							<p>
    -								Since jOOQ 3.0, a simple wrapping API has been added to wrap JDBC's rather awkward <reference class="java.sql.DatabaseMetaData"/>. This API is still experimental, as the calls to the underlying JDBC type are not always available for all SQL dialects.
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="logging">
    -						<title>Logging</title>
    -						<content><html>
    -							<p>
    -								jOOQ logs all SQL queries and fetched result sets to its internal DEBUG logger, which is implemented as an <reference id="execute-listeners" title="execute listener"/>. By default, execute logging is activated in the <reference id="custom-settings" title="jOOQ Settings"/>. In order to see any DEBUG log output, put either log4j or slf4j on jOOQ's classpath along with their respective configuration. A sample log4j configuration can be seen here:
    -							</p>
    -							
    -</html><xml><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
    -<log4j:configuration>
    -    <appender name="stdout" class="org.apache.log4j.ConsoleAppender">
    -        <layout class="org.apache.log4j.PatternLayout">
    -            <param name="ConversionPattern" value="%m%n" />
    -        </layout>
    -    </appender>
    -
    -    <root>
    -        <priority value="debug" />
    -        <appender-ref ref="stdout" />
    -    </root>
    -</log4j:configuration>]]></xml><html>
    -
    -							<p>
    -								With the above configuration, let's fetch some data with jOOQ
    -							</p>
    -							
    -</html><java><![CDATA[// Using H2, this time
    -create.select(BOOK.ID, BOOK.TITLE).from(BOOK).orderBy(BOOK.ID).limit(1, 2).fetch();]]></java><html>
    -
    -							<p>
    -								The above query may result in the following log output:
    -							</p>
    -
    -</html><text><![CDATA[Executing query          : select "BOOK"."ID", "BOOK"."TITLE" from "BOOK" order by "BOOK"."ID" asc, limit ? offset ?
    --> with bind values      : select "BOOK"."ID", "BOOK"."TITLE" from "BOOK" order by "BOOK"."ID" asc, limit 2 offset 1
    -Query executed           : Total: 1.439ms
    -Fetched result           : +----+------------+
    -                         : |  ID|TITLE       |
    -                         : +----+------------+
    -                         : |   2|Animal Farm |
    -                         : |   3|O Alquimista|
    -                         : +----+------------+
    -Finishing                : Total: 4.814ms, +3.375ms
    -]]></text><html>
    -
    -							<p>
    -								Essentially, jOOQ will log
    -							</p>
    -							<ul>
    -								<li>The SQL statement as rendered to the prepared statement</li>
    -								<li>The SQL statement with inlined bind values (for improved debugging)</li>
    -								<li>The query execution time</li>
    -								<li>The first 5 records of the result. This is formatted using <reference id="exporting-text" title="jOOQ's text export"/></li>
    -								<li>The total execution + fetching time</li>
    -							</ul>
    -
    -							<p>
    -								If you wish to use your own logger (e.g. avoiding printing out sensitive data), you can deactivate jOOQ's logger using <reference id="custom-settings" title="your custom settings"/> and implement your own <reference id="execute-listeners" title="execute listener logger"/>.
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="performance-considerations">
    -						<title>Performance considerations</title>
    -						<content><html>
    -							<p>
    -								Many users may have switched from higher-level abstractions such as Hibernate to jOOQ, because of Hibernate's difficult-to-manage performance, when it comes to large database schemas and complex second-level caching strategies. However, jOOQ itself is not a lightweight database abstraction framework, and it comes with its own overhead. Please be sure to consider the following points:
    -							</p>
    -							<ul>
    -								<li>It takes some time to construct jOOQ queries. If you can reuse the same queries, you might cache them. Beware of thread-safety issues, though, as jOOQ's <reference id="dsl-context" title="Configuration"/> is not necessarily threadsafe, and queries are "attached" to their creating DSLContext</li>
    -								<li>It takes some time to render SQL strings. Internally, jOOQ reuses the same <reference class="java.lang.StringBuilder"/> for the complete query, but some rendering elements may take their time. You could, of course, cache SQL generated by jOOQ and prepare your own <reference class="java.sql.PreparedStatement"/> objects</li>
    -								<li>It takes some time to bind values to prepared statements. jOOQ does not keep any open prepared statements, internally. Use a sophisticated connection pool, that will cache prepared statements and inject them into jOOQ through the standard JDBC API</li>
    -								<li>It takes some time to fetch results. By default, jOOQ will always fetch the complete <reference class="java.sql.ResultSet"/> into memory. Use <reference id="lazy-fetching" title="lazy fetching"/> to prevent that, and scroll over an open underlying database cursor</li>
    -							</ul>
    -							
    -							<h3>Optimise wisely</h3>
    -							<p>
    -								Don't be put off by the above paragraphs. You should optimise wisely, i.e. only in places where you really need very high throughput to your database. jOOQ's overhead compared to plain JDBC is typically less than 1ms per query.
    -							</p>
    -						</html></content>
    -					</section>
    -				</sections>
    -			</section>
    -
    -			<section id="code-generation">
    -				<title>Code generation</title>
    -				<content><html>
    -					<p>
    -						While optional, source code generation is one of jOOQ's main assets if you wish to increase developer productivity. jOOQ's code generator takes your database schema and reverse-engineers it into a set of Java classes modelling <reference id="table-expressions" title="tables"/>, <reference id="record-vs-tablerecord" title="records"/>, <reference id="sequence-execution" title="sequences"/>, <reference id="pojos" title="POJOs"/>, <reference id="daos" title="DAOs"/>, <reference id="stored-procedures" title="stored procedures"/>, user-defined types and many more.
    -					</p>
    -					<p>
    -						The essential ideas behind source code generation are these:
    -					</p>
    -					<ul>
    -						<li><strong>Increased IDE support</strong>: Type your Java code directly against your database schema, with all type information available</li>
    -						<li><strong>Type-safety</strong>: When your database schema changes, your generated code will change as well. Removing columns will lead to compilation errors, which you can detect early.</li>
    -					</ul>
    -					<p>
    -						The following chapters will show how to configure the code generator and how to generate various artefacts.
    -					</p>
    -				</html></content>
    -
    -				<sections>
    -				    <section id="codegen-configuration">
    -						<title>Configuration and setup of the generator</title>
    -						<content><html>
    -							<p>
    -								There are three binaries available with jOOQ, to be downloaded from <a href="https://sourceforge.net/projects/jooq/">SourceForge</a> or from Maven central:
    -							</p>
    -							<ul>
    -								<li>
    -									<strong>jooq-{jooq-version}.jar</strong>
    -									<br />
    -									The main library that you will include in your application to run jOOQ
    -								</li>
    -								<li>
    -									<strong>jooq-meta-{jooq-version}.jar</strong>
    -									<br />
    -									The utility that you will include in your build to navigate your database schema for code generation. This can be used as a schema crawler as well.
    -								</li>
    -								<li>
    -									<strong>jooq-codegen-{jooq-version}.jar</strong>
    -									<br />
    -									The utility that you will include in your build to generate your database schema
    -								</li>
    -							</ul>
    -
    -							<h3>Configure jOOQ's code generator</h3>
    -							<p>
    -								You need to tell jOOQ some things about your database connection. Here's an example of how to do it for an Oracle database
    -							</p>
    -							
    -</html><xml><![CDATA[<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    -<configuration>
    -  <!-- Configure the database connection here -->
    -  <jdbc>
    -    <driver>oracle.jdbc.OracleDriver</driver>
    -    <url>jdbc:oracle:thin:@[your jdbc connection parameters]</url>
    -    <user>[your database user]</user>
    -    <password>[your database password]</password>
    -    
    -    <!-- You can also pass user/password and other JDBC properties in the optional properties tag: -->
    -    <properties>
    -      <property><key>user</key><value>[db-user]</value></property>
    -      <property><key>password</key><value>[db-password]</value></property>
    -    </properties>
    -  </jdbc>
    -
    -  <generator>
    -    <database>
    -      <!-- The database dialect from jooq-meta. Available dialects are
    -           named org.util.[database].[database]Database. Known values are:
    -
    -           org.jooq.util.ase.ASEDatabase (to be used with Sybase ASE)
    -           org.jooq.util.cubrid.CUBRIDDatabase
    -           org.jooq.util.db2.DB2Database
    -           org.jooq.util.derby.DerbyDatabase
    -           org.jooq.util.h2.H2Database
    -           org.jooq.util.hsqldb.HSQLDBDatabase
    -           org.jooq.util.ingres.IngresDatabase
    -           org.jooq.util.mysql.MySQLDatabase
    -           org.jooq.util.oracle.OracleDatabase
    -           org.jooq.util.postgres.PostgresDatabase
    -           org.jooq.util.sqlite.SQLiteDatabase
    -           org.jooq.util.sqlserver.SQLServerDatabase
    -           org.jooq.util.sybase.SybaseDatabase (to be used with Sybase SQL Anywhere)
    -
    -           You can also provide your own org.jooq.util.Database implementation
    -           here, if your database is currently not supported or if you wish to
    -           read the database schema from a file, such as a Hibernate .hbm.xml file -->
    -      <name>org.jooq.util.oracle.OracleDatabase</name>
    -
    -      <!-- All elements that are generated from your schema (A Java regular expression. 
    -           Use the pipe to separate several expressions) Watch out for
    -           case-sensitivity. Depending on your database, this might be
    -           important! You can create case-insensitive regular expressions
    -           using this syntax: (?i:expr) -->
    -      <includes>.*</includes>
    -
    -      <!-- All elements that are excluded from your schema (A Java regular expression. 
    -           Use the pipe to separate several expressions). Excludes match before
    -           includes -->
    -      <excludes></excludes>
    -
    -      <!-- The schema that is used locally as a source for meta information.
    -           This could be your development schema or the production schema, etc
    -           This cannot be combined with the schemata element.
    -
    -           If left empty, jOOQ will generate all available schemata. See the
    -           manual's next section to learn how to generate several schemata -->
    -      <inputSchema>[your database schema / owner / name]</inputSchema>
    -    </database>
    -
    -    <generate>
    -      <!-- Generation flags: See advanced configuration properties -->
    -    </generate>
    -
    -    <target>
    -      <!-- The destination package of your generated classes (within the
    -           destination directory) -->
    -      <packageName>[org.jooq.your.packagename]</packageName>
    -
    -      <!-- The destination directory of your generated classes -->
    -      <directory>[/path/to/your/dir]</directory>
    -    </target>
    -  </generator>
    -</configuration>]]></xml><html>
    -
    -							<p>
    -								There are also lots of advanced configuration parameters, which will be treated in the <reference id="codegen-advanced" title="manual's section about advanced code generation features"/> Note, you can find the official XSD file for a formal specification at:<br/>
    -							    <a href="http://www.jooq.org/xsd/jooq-codegen-{codegen-xsd-version}.xsd" title="The jOOQ-codegen configuration XSD">http://www.jooq.org/xsd/jooq-codegen-{codegen-xsd-version}.xsd</a>
    -						    </p>
    -
    -							<h3>Run jOOQ code generation</h3>
    -							<p>
    -								Code generation works by calling this class with the above property file as argument.
    -							</p>
    -							
    -</html><config>org.jooq.util.GenerationTool /jooq-config.xml</config><html>
    -
    -							<p>
    -								Be sure that these elements are located on the classpath:
    -							</p>
    -							
    -							<ul>
    -								<li>The XML configuration file</li>
    -								<li>jooq-{jooq-version}.jar, jooq-meta-{jooq-version}.jar, jooq-codegen-{jooq-version}.jar</li>
    -								<li>The JDBC driver you configured</li>
    -							</ul>
    -
    -							<h3>A command-line example (For Windows, unix/linux/etc will be similar)</h3>
    -							<ul>
    -								<li>Put the property file, jooq*.jar and the JDBC driver into a directory, e.g. C:\temp\jooq</li>
    -							    <li>Go to C:\temp\jooq</li>
    -							    <li>Run java -cp jooq-{jooq-version}.jar;jooq-meta-{jooq-version}.jar;jooq-codegen-{jooq-version}.jar;[JDBC-driver].jar;. org.jooq.util.GenerationTool /[XML file] </li>
    -							</ul>
    -							<p>
    -								Note that the property file must be passed as a classpath resource
    -							</p>
    -
    -							<h3>Run code generation from Eclipse</h3>
    -							<p>
    -								Of course, you can also run code generation from your IDE. In Eclipse, set up a project like this. Note that:
    -							</p>
    -                            <ul>
    -                                <li>this example uses jOOQ's log4j support by adding log4j.xml and log4j.jar to the project classpath.</li>
    -                                <li>the actual jooq-{jooq-version}.jar, jooq-meta-{jooq-version}.jar, jooq-codegen-{jooq-version}.jar artefacts may contain version numbers in the file names.</li>
    -                            </ul>
    -                            
    -							<div class="screenshot">
    -							<img class="screenshot" src="&lt;?=$root?&gt;/img/eclipse-example-01.png" alt="Eclipse configuration"/>
    -							</div>
    -
    -							<p>
    -								Once the project is set up correctly with all required artefacts on the classpath, you can configure an Eclipse Run Configuration for org.jooq.util.GenerationTool.
    -							</p>
    -							<div class="screenshot">
    -							<img class="screenshot" src="&lt;?=$root?&gt;/img/eclipse-example-02.png" alt="Eclipse configuration"/>
    -							</div>
    -
    -							<p>
    -								With the XML file as an argument
    -							</p>
    -							<div class="screenshot">
    -							<img class="screenshot" src="&lt;?=$root?&gt;/img/eclipse-example-03.png" alt="Eclipse configuration"/>
    -							</div>
    -
    -							<p>
    -								And the classpath set up correctly
    -							</p>
    -							<div class="screenshot">
    -							<img class="screenshot" src="&lt;?=$root?&gt;/img/eclipse-example-04.png" alt="Eclipse configuration"/>
    -							</div>
    -
    -							<p>
    -								Finally, run the code generation and see your generated artefacts
    -							</p>
    -							<div class="screenshot">
    -							<img class="screenshot" src="&lt;?=$root?&gt;/img/eclipse-example-05.png" alt="Eclipse configuration"/>
    -							</div>
    -
    -							<h3>Run generation with ant</h3>
    -							<p>
    -								When running code generation with ant's &lt;java/&gt; task, you may have to set fork="true":
    -							</p>
    -
    -</html><xml><![CDATA[<!-- Run the code generation task -->
    -<target name="generate-test-classes">
    -  <java fork="true" classname="org.jooq.util.GenerationTool">
    -    [...]
    -  </java><html>
    -</target>
    -]]></xml><html>
    -
    -							<h3>Integrate generation with Maven</h3>
    -							<p>
    -								Using the official jOOQ-codegen-maven plugin, you can integrate source code generation in your Maven build process:
    -							</p>
    -
    -</html><xml><![CDATA[<plugin>
    -
    -  <!-- Specify the maven code generator plugin -->
    -  <groupId>org.jooq</groupId>
    -  <artifactId>jooq-codegen-maven</artifactId>
    -  <version>{jooq-version}</version>
    -
    -  <!-- The plugin should hook into the generate goal -->
    -  <executions>
    -    <execution>
    -      <goals>
    -        <goal>generate</goal>
    -      </goals>
    -    </execution>
    -  </executions>
    -
    -  <!-- Manage the plugin's dependency. In this example, we'll use a PostgreSQL database -->
    -  <dependencies>
    -    <dependency>
    -      <groupId>postgresql</groupId>
    -      <artifactId>postgresql</artifactId>
    -      <version>8.4-702.jdbc4</version>
    -    </dependency>
    -  </dependencies>
    -
    -  <!-- Specify the plugin configuration.
    -       The configuration format is the same as for the standalone code generator -->
    -  <configuration>
    -
    -    <!-- JDBC connection parameters -->
    -    <jdbc>
    -      <driver>org.postgresql.Driver</driver>
    -      <url>jdbc:postgresql:postgres</url>
    -      <user>postgres</user>
    -      <password>test</password>
    -    </jdbc>
    -
    -    <!-- Generator parameters -->
    -    <generator>
    -      <name>org.jooq.util.DefaultGenerator</name>
    -      <database>
    -        <name>org.jooq.util.postgres.PostgresDatabase</name>
    -        <includes>.*</includes>
    -        <excludes></excludes>
    -        <inputSchema>public</inputSchema>
    -      </database>
    -      <target>
    -        <packageName>org.jooq.util.maven.example</packageName>
    -        <directory>target/generated-sources/jooq</directory>
    -      </target>
    -    </generator>
    -  </configuration>
    -</plugin>
    -]]></xml><html>
    -
    -							<p>
    -								See the full example of a pom.xml including the jOOQ-codegen artefact here:<br/>
    -								<a href="https://github.com/jOOQ/jOOQ/blob/master/jOOQ-codegen-maven-example/pom.xml"
    -								  title="jOOQ-codegen-maven example pom.xml file">https://github.com/jOOQ/jOOQ/blob/master/jOOQ-codegen-maven-example/pom.xml</a>
    -							  </p>
    -
    -							<h3>Use jOOQ generated classes in your application</h3>
    -							<p>
    -								Be sure, both jooq-{jooq-version}.jar and your generated package (see configuration) are located on your classpath. Once this is done, you can execute SQL statements with your generated classes.
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="codegen-advanced">
    -						<title>Advanced generator configuration</title>
    -						<content><html>
    -							<p>
    -								In the <reference id="codegen-configuration" title="previous section"/> we have seen how jOOQ's source code generator is configured and run within a few steps. In this chapter we'll cover some advanced settings
    -							</p>
    -
    -</html><xml><![CDATA[<!-- These properties can be added directly to the generator element: -->
    -<generator>
    -  <!-- The default code generator. You can override this one, to generate your own code style
    -       Defaults to org.jooq.util.DefaultGenerator -->
    -  <name>org.jooq.util.DefaultGenerator</name>
    -
    -  <!-- The naming strategy used for class and field names.
    -       You may override this with your custom naming strategy. Some examples follow
    -       Defaults to org.jooq.util.DefaultGeneratorStrategy -->
    -  <strategy>
    -    <name>org.jooq.util.DefaultGeneratorStrategy</name>
    -  </strategy>
    -</generator>]]></xml><html>
    -
    -							<p>
    -								The following example shows how you can override the DefaultGeneratorStrategy to render table and column names the way they are defined in the database, rather than switching them to camel case:
    -							</p>
    -
    -</html><java><![CDATA[/**
    - * It is recommended that you extend the DefaultGeneratorStrategy. Most of the
    - * GeneratorStrategy API is already declared final. You only need to override any
    - * of the following methods, for whatever generation behaviour you'd like to achieve
    - *
    - * Beware that most methods also receive a "Mode" object, to tell you whether a
    - * TableDefinition is being rendered as a Table, Record, POJO, etc. Depending on
    - * that information, you can add a suffix only for TableRecords, not for Tables
    - */
    -public class AsInDatabaseStrategy extends DefaultGeneratorStrategy {
    -
    -    /**
    -     * Override this to specifiy what identifiers in Java should look like.
    -     * This will just take the identifier as defined in the database.
    -     */
    -    @Override
    -    public String getJavaIdentifier(Definition definition) {
    -        return definition.getOutputName();
    -    }
    -
    -    /**
    -     * Override these to specify what a setter in Java should look like. Setters
    -     * are used in TableRecords, UDTRecords, and POJOs. This example will name
    -     * setters "set[NAME_IN_DATABASE]"
    -     */
    -    @Override
    -    public String getJavaSetterName(Definition definition, Mode mode) {
    -        return "set" + definition.getOutputName();
    -    }
    -
    -    /**
    -     * Just like setters...
    -     */
    -    @Override
    -    public String getJavaGetterName(Definition definition, Mode mode) {
    -        return "get" + definition.getOutputName();
    -    }
    -
    -    /**
    -     * Override this method to define what a Java method generated from a database
    -     * Definition should look like. This is used mostly for convenience methods
    -     * when calling stored procedures and functions. This example shows how to
    -     * set a prefix to a CamelCase version of your procedure
    -     */
    -    @Override
    -    public String getJavaMethodName(Definition definition, Mode mode) {
    -        return "call" + org.jooq.tools.StringUtils.toCamelCase(definition.getOutputName());
    -    }
    -
    -    /**
    -     * Override this method to define how your Java classes and Java files should
    -     * be named. This example applies no custom setting and uses CamelCase versions
    -     * instead
    -     */
    -    @Override
    -    public String getJavaClassName(Definition definition, Mode mode) {
    -        return super.getJavaClassName(definition, mode);
    -    }
    -
    -    /**
    -     * Override this method to re-define the package names of your generated
    -     * artefacts.
    -     */
    -    @Override
    -    public String getJavaPackageName(Definition definition, Mode mode) {
    -        return super.getJavaPackageName(definition, mode);
    -    }
    -
    -    /**
    -     * Override this method to define how Java members should be named. This is
    -     * used for POJOs and method arguments
    -     */
    -    @Override
    -    public String getJavaMemberName(Definition definition, Mode mode) {
    -        return definition.getOutputName();
    -    }
    -
    -    /**
    -     * Override this method to define the base class for those artefacts that
    -     * allow for custom base classes
    -     */
    -    @Override
    -    public String getJavaClassExtends(Definition definition, Mode mode) {
    -        return Object.class.getName();
    -    }
    -
    -    /**
    -     * Override this method to define the interfaces to be implemented by those
    -     * artefacts that allow for custom interface implementation
    -     */
    -    @Override
    -    public List<String> getJavaClassImplements(Definition definition, Mode mode) {
    -        return Arrays.asList(Serializable.class.getName(), Cloneable.class.getName());
    -    }
    -
    -    /**
    -     * Override this method to define the suffix to apply to routines when
    -     * they are overloaded.
    -     *
    -     * Use this to resolve compile-time conflicts in generated source code, in
    -     * case you make heavy use of procedure overloading
    -     */
    -    @Override
    -    public String getOverloadSuffix(Definition definition, Mode mode, String overloadIndex) {
    -        return "_OverloadIndex_" + overloadIndex;
    -    }
    -}]]></java><html>
    -
    -                            <p>
    -                                More examples can be found here:
    -                            </p>
    -                            <ul>
    -                                <li><a href="https://github.com/jOOQ/jOOQ/blob/master/jOOQ-codegen/src/main/java/org/jooq/util/example/JPrefixGeneratorStrategy.java">org.jooq.util.example.JPrefixGeneratorStrategy</a></li>
    -                                <li><a href="https://github.com/jOOQ/jOOQ/blob/master/jOOQ-codegen/src/main/java/org/jooq/util/example/JVMArgsGeneratorStrategy.java">org.jooq.util.example.JVMArgsGeneratorStrategy</a></li>
    -                            </ul>
    -
    -                            <h3>jooq-meta configuration</h3>
    -							<p>
    -								Within the &lt;generator/&gt; element, there are other configuration elements:
    -							</p>
    -
    -</html><xml><![CDATA[<!-- These properties can be added to the database element: -->
    -<database>
    -
    -  <!-- All table and view columns that are used as "version" fields for
    -       optimistic locking (A Java regular expression. Use the pipe to separate several expressions).
    -       See UpdatableRecord.store() and UpdatableRecord.delete() for details -->
    -  <recordVersionFields>REC_VERSION</recordVersionFields/>
    -
    -  <!-- All table and view columns that are used as "timestamp" fields for
    -       optimistic locking (A Java regular expression. Use the pipe to separate several expressions).
    -       See UpdatableRecord.store() and UpdatableRecord.delete() for details -->
    -  <recordTimestampFields>REC_TIMESTAMP</recordTimestampFields/>
    -      
    -  <!-- Generate java.sql.Timestamp fields for DATE columns. This is
    -       particularly useful for Oracle databases.
    -       Defaults to false -->
    -  <dateAsTimestamp>false</dateAsTimestamp>
    -
    -  <!-- Generate jOOU data types for your unsigned data types, which are
    -       not natively supported in Java.
    -       Defaults to true -->
    -  <unsignedTypes>true</unsignedTypes>
    -
    -  <!-- The schema that is used in generated source code. This will be the
    -       production schema. Use this to override your local development
    -       schema name for source code generation. If not specified, this
    -       will be the same as the input-schema. -->
    -  <outputSchema>[your database schema / owner / name]</outputSchema>
    -
    -  <!-- A configuration element to configure several input and/or output
    -       schemata for jooq-meta, in case you're using jooq-meta in a multi-
    -       schema environment.
    -       This cannot be combined with the above inputSchema / outputSchema -->
    -  <schemata>
    -    <schema>
    -      <inputSchema>...</inputSchema>
    -      <outputSchema>...</outputSchema>
    -    </schema>
    -    [ <schema>...</schema> ... ]
    -  </schemata>
    -
    -  <!-- A configuration element to configure custom data types -->
    -  <customTypes>...</customTypes>
    -
    -  <!-- A configuration element to configure type overrides for generated
    -       artefacts (e.g. in combination with customTypes) -->
    -  <forcedTypes>...</forcedTypes>
    -</database>]]></xml><html>
    -
    -							<p>
    -								Check out the some of the manual's "advanced" sections to find out more about the advanced configuration parameters.
    -							</p>
    -							<ul>
    -								<li><reference id="schema-mapping" title="Schema mapping"/></li>
    -								<li><reference id="custom-data-types" title="Custom types"/></li>
    -							</ul>
    -
    -							<h3>jooq-codegen configuration</h3>
    -                            <p>
    -                            	Also, you can add some optional advanced configuration parameters for the generator:
    -                           	</p>
    -
    -</html><xml><![CDATA[<!-- These properties can be added to the generate element: -->
    -<generate>
    -  <!-- Primary key / foreign key relations should be generated and used.
    -       This is a prerequisite for various advanced features.
    -       Defaults to true -->
    -  <relations>true</relations>
    -
    -  <!-- Generate deprecated code for backwards compatibility
    -       Defaults to true -->
    -  <deprecated>true</deprecated>
    -
    -  <!-- Generate instance fields in your tables, as opposed to static
    -       fields. This simplifies aliasing.
    -       Defaults to true -->
    -  <instanceFields>true</instanceFields>
    -
    -  <!-- Generate the javax.annotation.Generated annotation to indicate
    -       jOOQ version used for source code.
    -       Defaults to true -->
    -  <generatedAnnotation>true</generatedAnnotation>
    -
    -  <!-- Generate jOOQ Record classes for type-safe querying. You can
    -       turn this off, if you don't need "active records" for CRUD
    -       Defaults to true -->
    -  <records>true</records>
    -
    -  <!-- Generate POJOs in addition to Record classes for usage of the
    -       ResultQuery.fetchInto(Class) API
    -       Defaults to false -->
    -  <pojos>false</pojos>
    -
    -  <!-- Generate immutable POJOs for usage of the ResultQuery.fetchInto(Class) API
    -       This overrides any value set in <pojos/>
    -       Defaults to false -->
    -  <immutablePojos>false</immutablePojos>
    -
    -  <!-- Generate interfaces that will be implemented by records and/or pojos.
    -       You can also use these interfaces in Record.into(Class<?>) and similar
    -       methods, to let jOOQ return proxy objects for them.
    -       Defaults to false -->
    -  <interfaces>false</interfaces>
    -
    -  <!-- Generate DAOs in addition to POJO classes
    -       Defaults to false -->
    -  <daos>false</daos>
    -
    -  <!-- Annotate POJOs and Records with JPA annotations for increased
    -       compatibility and better integration with JPA/Hibernate, etc
    -       Defaults to false -->
    -  <jpaAnnotations>false</jpaAnnotations>
    -
    -  <!-- Annotate POJOs and Records with JSR-303 validation annotations
    -       Defaults to false -->
    -  <validationAnnotations>false</validationAnnotations>
    -  
    -  <!-- Allow to turn off the generation of global object references, which include
    -  
    -       - Tables.java
    -       - Sequences.java
    -       - UDTs.java
    -  
    -       Turning off the generation of the above files may be necessary for very
    -       large schemas, which exceed the amount of allowed constants in a class's
    -       constant pool (64k) or, whose static initialiser would exceed 64k of
    -       byte code
    -       
    -       Defaults to true -->
    -  <globalObjectReferences>true</globalObjectReferences>
    -</generate>]]></xml><html>
    -
    -							<h3>Property interdependencies</h3>
    -							<p>
    -								Some of the above properties depend on other properties to work correctly. For instance, when generating immutable pojos, pojos must be generated. jOOQ will enforce such properties even if you tell it otherwise. Here is a list of property interdependencies:
    -							</p>
    -							
    -							<ul>
    -								<li>When <code>daos = true</code>, then jOOQ will set <code>relations = true</code></li>
    -								<li>When <code>daos = true</code>, then jOOQ will set <code>records = true</code></li>
    -								<li>When <code>daos = true</code>, then jOOQ will set <code>pojos = true</code></li>
    -								<li>When <code>immutablePojos = true</code>, then jOOQ will set <code>pojos = true</code></li>
    -							</ul>
    -						</html></content>
    -					</section>
    -
    -				    <section id="codegen-globals">
    -						<title>Generated global artefacts</title>
    -						<content><html>
    -							<p>
    -								For increased convenience at the use-site, jOOQ generates "global" artefacts at the code generation root location, referencing tables, routines, sequences, etc. In detail, these global artefacts include the following:
    -							</p>
    -							<ul>
    -								<li><strong>Keys.java</strong>: This file contains all of the required primary key, unique key, foreign key and identity references in the form of static members of type <reference class="org.jooq.Key"/>.</li>
    -								<li><strong>Routines.java</strong>: This file contains all standalone routines (not in packages) in the form of static factory methods for <reference class="org.jooq.Routine"/> types.</li>
    -								<li><strong>Sequences.java</strong>: This file contains all sequence objects in the form of static members of type <reference class="org.jooq.Sequence"/>.</li>
    -								<li><strong>Tables.java</strong>: This file contains all table objects in the form of static member references to the actual singleton <reference class="org.jooq.Table"/> object</li>
    -								<li><strong>UDTs.java</strong>: This file contains all UDT objects in the form of static member references to the actual singleton <reference class="org.jooq.UDT"/> object</li>
    -							</ul>
    -							
    -							<h3>Referencing global artefacts</h3>
    -							<p>
    -								When referencing global artefacts from your client application, you would typically static import them as such:
    -							</p>
    -							
    -</html><java><![CDATA[// Static imports for all global artefacts
    -import static com.example.generated.Routines.*;
    -import static com.example.generated.Sequences.*;
    -import static com.example.generated.Tables.*;
    -
    -// You could then reference your artefacts as follows:
    -create.insertInto(MY_TABLE)
    -      .values(MY_SEQUENCE.nextval(), myFunction())
    -      
    -// as a more concise form of this:
    -create.insertInto(com.example.generated.Tables.MY_TABLE)
    -      .values(com.example.generated.Sequences.MY_SEQUENCE.nextval(), com.example.generated.Routines.myFunction())]]></java></content>
    -					</section>
    -
    -				    <section id="codegen-tables">
    -						<title>Generated tables</title>
    -						<content><html>
    -							<p>
    -								Every table in your database will generate a <reference class="org.jooq.Table"/> implementation that looks like this:
    -							</p>
    -							
    -</html><java><![CDATA[public class Book extends TableImpl<BookRecord> {
    -
    -    // The singleton instance
    -    public static final Book BOOK = new Book();
    -
    -    // Generated columns
    -    public final TableField<BookRecord, Integer> ID        = createField("ID",        SQLDataType.INTEGER, this);
    -    public final TableField<BookRecord, Integer> AUTHOR_ID = createField("AUTHOR_ID", SQLDataType.INTEGER, this);
    -    public final TableField<BookRecord, String>  ITLE      = createField("TITLE",     SQLDataType.VARCHAR, this);
    -
    -    // Covariant aliasing method, returning a table of the same type as BOOK
    -    @Override
    -    public Book as(java.lang.String alias) {
    -        return new Book(alias);
    -    }
    -    
    -    // [...]
    -}]]></java><html>
    -
    -							<h3>Flags influencing generated tables</h3>
    -							<p>
    -								These flags from the <reference id="codegen-advanced" title="code generation configuration"/> influence generated tables:
    -							</p>
    -							<ul>
    -								<li><strong>recordVersionFields</strong>: Relevant methods from super classes are overridden to return the VERSION field</li>
    -								<li><strong>recordTimestampFields</strong>: Relevant methods from super classes are overridden to return the TIMESTAMP field</li>
    -								<li><strong>dateAsTimestamp</strong>: This influences all relevant columns</li>
    -								<li><strong>unsignedTypes</strong>: This influences all relevant columns</li>
    -								<li><strong>relations</strong>: Relevant methods from super classes are overridden to provide primary key, unique key, foreign key and identity information</li>
    -								<li><strong>instanceFields</strong>: This flag controls the "static" keyword on table columns, as well as aliasing convenience</li>
    -								<li><strong>records</strong>: The generated record type is referenced from tables allowing for type-safe single-table record fetching</li>
    -							</ul>
    -							
    -							<h3>Flags controlling table generation</h3>
    -							<p>
    -								Table generation cannot be deactivated
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="codegen-records">
    -						<title>Generated records</title>
    -						<content><html>
    -							<p>
    -								Every table in your database will generate a <reference class="org.jooq.Table"/> implementation that looks like this:
    -							</p>
    -							
    -</html><java><![CDATA[// JPA annotations can be generated, optionally
    -@Entity
    -@Table(name = "BOOK", schema = "TEST")
    -public class BookRecord extends UpdatableRecordImpl<BookRecord> 
    -
    -// An interface common to records and pojos can be generated, optionally
    -implements IBook {
    -
    -    // Every column generates a setter and a getter
    -    @Override
    -    public void setId(Integer value) {
    -        setValue(BOOK.ID, value);
    -    }
    -    
    -    @Id
    -    @Column(name = "ID", unique = true, nullable = false, precision = 7)
    -    @Override
    -    public Integer getId() {
    -        return getValue(BOOK.ID);
    -    }
    -    
    -    // More setters and getters
    -    public void setAuthorId(Integer value) {...}
    -    public Integer getAuthorId() {...}
    -    
    -    // Convenience methods for foreign key methods
    -    public void setAuthorId(AuthorRecord value) {
    -        if (value == null) {
    -            setValue(BOOK.AUTHOR_ID, null);
    -        }
    -        else {
    -            setValue(BOOK.AUTHOR_ID, value.getValue(AUTHOR.ID));
    -        }
    -    }
    -    
    -    // Navigation methods
    -    public AuthorRecord fetchAuthor() {
    -        return create().selectFrom(AUTHOR).where(AUTHOR.ID.equal(getValue(BOOK.AUTHOR_ID))).fetchOne();
    -    }
    -    
    -    // [...]
    -}]]></java><html>							
    -							
    -							<h3>Flags influencing generated records</h3>
    -							<p>
    -								These flags from the <reference id="codegen-advanced" title="code generation configuration"/> influence generated records:
    -							</p>
    -							<ul>
    -								<li><strong>dateAsTimestamp</strong>: This influences all relevant getters and setters</li>
    -								<li><strong>unsignedTypes</strong>: This influences all relevant getters and setters</li>
    -								<li><strong>relations</strong>: This is needed as a prerequisite for navigation methods</li>
    -								<li><strong>navigationMethods</strong>: This controls whether navigation methods will be generated or not</li>
    -								<li><strong>daos</strong>: Records are a pre-requisite for DAOs. If DAOs are generated, records are generated as well</li>
    -								<li><strong>interfaces</strong>: If interfaces are generated, records will implement them</li>
    -								<li><strong>jpaAnnotations</strong>: JPA annotations are used on generated records</li>
    -							</ul>
    -														
    -							<h3>Flags controlling record generation</h3>
    -							<p>
    -								Record generation can be deactivated using the <strong>records</strong> flag
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="codegen-pojos">
    -						<title>Generated POJOs</title>
    -						<content><html>
    -							<p>
    -								Every table in your database will generate a POJO implementation that looks like this:
    -							</p>
    -							
    -</html><java><![CDATA[// JPA annotations can be generated, optionally
    -@javax.persistence.Entity
    -@javax.persistence.Table(name = "BOOK", schema = "TEST")
    -public class Book implements java.io.Serializable
    -
    -// An interface common to records and pojos can be generated, optionally
    -, IBook {
    -
    -    // JSR-303 annotations can be generated, optionally
    -    @NotNull
    -    private Integer id;
    -
    -    @NotNull
    -    private Integer authorId;
    -
    -    @NotNull
    -    @Size(max = 400)
    -    private String title;
    -
    -    // Every column generates a getter and a setter
    -    @Id
    -    @Column(name = "ID", unique = true, nullable = false, precision = 7)
    -    @Override
    -    public Integer getId() {
    -        return this.id;
    -    }
    -
    -    @Override
    -    public void setId(Integer id) {
    -        this.id = id;
    -    }
    -    
    -    // [...]
    -}]]></java><html>							
    -							
    -							<h3>Flags influencing generated POJOs</h3>
    -							<p>
    -								These flags from the <reference id="codegen-advanced" title="code generation configuration"/> influence generated POJOs:
    -							</p>
    -							<ul>
    -								<li><strong>dateAsTimestamp</strong>: This influences all relevant getters and setters</li>
    -								<li><strong>unsignedTypes</strong>: This influences all relevant getters and setters</li>
    -								<li><strong>interfaces</strong>: If interfaces are generated, POJOs will implement them</li>
    -								<li><strong>immutablePojos</strong>: Immutable POJOs have final members and no setters. All members must be passed to the constructor</li>
    -								<li><strong>daos</strong>: POJOs are a pre-requisite for DAOs. If DAOs are generated, POJOs are generated as well</li>
    -								<li><strong>jpaAnnotations</strong>: JPA annotations are used on generated records</li>
    -								<li><strong>validationAnnotations</strong>: JSR-303 validation annotations are used on generated records</li>
    -							</ul>
    -														
    -							<h3>Flags controlling POJO generation</h3>
    -							<p>
    -								POJO generation can be activated using the <strong>pojos</strong> flag
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="codegen-interfaces">
    -						<title>Generated Interfaces</title>
    -						<content><html>
    -							<p>
    -								Every table in your database will generate an interface that looks like this:
    -							</p>
    -							
    -</html><java><![CDATA[public interface IBook extends java.io.Serializable {
    -
    -    // Every column generates a getter and a setter
    -    public void setId(Integer value);
    -    public Integer getId();
    -    
    -    // [...]
    -}]]></java><html>    						
    -							
    -							<h3>Flags influencing generated interfaces</h3>
    -							<p>
    -								These flags from the <reference id="codegen-advanced" title="code generation configuration"/> influence generated interfaces:
    -							</p>
    -							<ul>
    -								<li><strong>dateAsTimestamp</strong>: This influences all relevant getters and setters</li>
    -								<li><strong>unsignedTypes</strong>: This influences all relevant getters and setters</li>
    -							</ul>
    -														
    -							<h3>Flags controlling POJO generation</h3>
    -							<p>
    -								POJO generation can be activated using the <strong>interfaces</strong> flag
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="codegen-daos">
    -						<title>Generated DAOs</title>
    -						<content><html>
    -							<h3>Generated DAOs</h3>
    -							<p>
    -								Every table in your database will generate a <reference class="org.jooq.DAO"/> implementation that looks like this:
    -							</p>
    -							
    -</html><java><![CDATA[public class BookDao extends DAOImpl<BookRecord, Book, Integer> {
    -
    -    // Generated constructors
    -    public BookDao() {
    -        super(BOOK, Book.class);
    -    }
    -
    -    public BookDao(Configuration configuration) {
    -        super(BOOK, Book.class, configuration);
    -    }
    -
    -    // Every column generates at least one fetch method
    -    public List<Book> fetchById(Integer... values) {
    -        return fetch(BOOK.ID, values);
    -    }
    -
    -    public Book fetchOneById(Integer value) {
    -        return fetchOne(BOOK.ID, value);
    -    }
    -
    -    public List<Book> fetchByAuthorId(Integer... values) {
    -        return fetch(BOOK.AUTHOR_ID, values);
    -    }
    -    
    -    // [...]
    -}]]></java><html>							
    -							
    -							<h3>Flags controlling DAO generation</h3>
    -							<p>
    -								DAO generation can be activated using the <strong>daos</strong> flag
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="codegen-sequences">
    -						<title>Generated sequences</title>
    -						<content><html>
    -							<p>
    -								Every sequence in your database will generate a <reference class="org.jooq.Sequence"/> implementation that looks like this:
    -							</p>
    -							
    -</html><java><![CDATA[public final class Sequences {
    -
    -    // Every sequence generates a member
    -    public static final Sequence<Integer> S_AUTHOR_ID = new SequenceImpl<Integer>("S_AUTHOR_ID", TEST, SQLDataType.INTEGER);
    -}]]></java><html>		
    -							
    -							<h3>Flags controlling sequence generation</h3>
    -							<p>
    -								Sequence generation cannot be deactivated
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="codegen-procedures">
    -						<title>Generated procedures</title>
    -						<content><html>
    -							<p>
    -								Every procedure or function (routine) in your database will generate a <reference class="org.jooq.Routine"/> implementation that looks like this:
    -							</p>
    -
    -</html><java><![CDATA[public class AuthorExists extends AbstractRoutine<java.lang.Void> {
    -
    -    // All IN, IN OUT, OUT parameters and function return values generate a static member
    -    public static final Parameter<String>     AUTHOR_NAME = createParameter("AUTHOR_NAME", SQLDataType.VARCHAR);
    -    public static final Parameter<BigDecimal> RESULT      = createParameter("RESULT",      SQLDataType.NUMERIC);
    -
    -    // A constructor for a new "empty" procedure call
    -    public AuthorExists() {
    -        super("AUTHOR_EXISTS", TEST);
    -
    -        addInParameter(AUTHOR_NAME);
    -        addOutParameter(RESULT);
    -    }
    -
    -    // Every IN and IN OUT parameter generates a setter
    -    public void setAuthorName(String value) {
    -        setValue(AUTHOR_NAME, value);
    -    }
    -
    -    // Every IN OUT, OUT and RETURN_VALUE generates a getter
    -    public BigDecimal getResult() {
    -        return getValue(RESULT);
    -    }
    -    
    -    // [...]
    -}]]></java><html>
    -
    -							<h3>Package and member procedures or functions</h3>
    -							<p>
    -								Procedures or functions contained in packages or UDTs are generated in a sub-package that corresponds to the package or UDT name.
    -							</p>
    -
    -							<h3>Flags controlling routine generation</h3>
    -							<p>
    -								Routine generation cannot be deactivated
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="codegen-udts">
    -						<title>Generated UDTs</title>
    -						<content><html>
    -							<p>
    -								Every UDT in your database will generate a <reference class="org.jooq.UDT"/> implementation that looks like this:
    -							</p>
    -						
    -</html><java><![CDATA[public class AddressType extends UDTImpl<AddressTypeRecord> {
    -
    -    // The singleton UDT instance
    -    public static final UAddressType U_ADDRESS_TYPE = new UAddressType();
    -
    -    // Every UDT attribute generates a static member
    -    public static final UDTField<AddressTypeRecord, String> ZIP     = 
    -      createField("ZIP",     SQLDataType.VARCHAR, U_ADDRESS_TYPE);
    -    public static final UDTField<AddressTypeRecord, String> CITY    = 
    -      createField("CITY",    SQLDataType.VARCHAR, U_ADDRESS_TYPE);
    -    public static final UDTField<AddressTypeRecord, String> COUNTRY = 
    -      createField("COUNTRY", SQLDataType.VARCHAR, U_ADDRESS_TYPE);
    -    
    -    // [...]
    -}]]></java><html>						
    -										
    -							<p>
    -								Besides the <reference class="org.jooq.UDT"/> implementation, a <reference class="org.jooq.UDTRecord"/> implementation is also generated
    -							</p>		
    -
    -</html><java><![CDATA[public class AddressTypeRecord extends UDTRecordImpl<AddressTypeRecord> {
    -
    -    // Every attribute generates a getter and a setter
    -
    -    public void setZip(String value) {...}
    -    public String getZip() {...}
    -    public void setCity(String value) {...}
    -    public String getCity() {...}
    -    public void setCountry(String value) {...}
    -    public String getCountry() {...}
    -    
    -    // [...]
    -}]]></java><html>						
    -
    -							<h3>Flags controlling UDT generation</h3>
    -							<p>
    -								UDT generation cannot be deactivated
    -							</p>
    -						</html></content>
    -					</section>
    -
    -
    -				    <section id="custom-data-types">
    -						<title>Custom data types and type conversion</title>
    -						<content><html>
    -							<p>
    -								When using a custom type in jOOQ, you need to let jOOQ know about its associated <reference class="org.jooq.Converter"/>. Ad-hoc usages of such converters has been discussed in the chapter about <reference id="data-type-conversion" title="data type conversion"/>. A more common use-case, however, is to let jOOQ know about custom types at code generation time. Use the following configuration elements to specify, that you'd like to use GregorianCalendar for all database fields that start with DATE_OF_
    -      						</p>
    -
    -</html><xml><![CDATA[<database>
    -  <!-- First, register your custom types here -->
    -  <customTypes>
    -    <customType>
    -      <!-- Specify the fully-qualified class name of your custom type -->
    -      <name>java.util.GregorianCalendar</name>
    -
    -      <!-- Associate that custom type with your converter. Note, a
    -           custom type can only have one converter in jOOQ -->
    -      <converter>com.example.CalendarConverter</converter>
    -    </customType>
    -  </customTypes>
    -
    -  <!-- Then, associate custom types with database columns -->
    -  <forcedTypes>
    -    <forcedType>
    -      <!-- Specify again he fully-qualified class name of your custom type -->
    -      <name>java.util.GregorianCalendar</name>
    -
    -      <!-- Add a Java regular expression matching columns. Use the pipe to separate several expressions -->
    -      <expressions>.*\.DATE_OF_.*</expressions>
    -    </forcedType>
    -  </forcedTypes>
    -</database>]]></xml><html>
    -
    -                            <p>
    -                            	The above configuration will lead to AUTHOR.DATE_OF_BIRTH being generated like this:
    -                            </p>
    -
    -</html><java><![CDATA[public class TAuthor extends TableImpl<TAuthorRecord> {
    -
    -    // [...]
    -    public final TableField<TAuthorRecord, GregorianCalendar> DATE_OF_BIRTH =    // [...]
    -    // [...]
    -
    -}]]></java><html>
    -
    -                            <p>
    -                            	This means that the bound type of &lt;T&gt; will be GregorianCalendar, wherever you reference DATE_OF_BIRTH. jOOQ will use your custom converter when binding variables and when fetching data from <reference class="java.util.ResultSet"/>:
    -                            </p>
    -
    -</html><java><![CDATA[// Get all date of births of authors born after 1980
    -List<GregorianCalendar> result =
    -create.selectFrom(AUTHOR)
    -      .where(AUTHOR.DATE_OF_BIRTH.greaterThan(new GregorianCalendar(1980, 0, 1)))
    -      .fetch(AUTHOR.DATE_OF_BIRTH);]]></java></content>
    -					</section>
    -
    -				    <section id="schema-mapping">
    -						<title>Mapping generated schemata and tables</title>
    -						<content><html>
    -							<p>
    -								We've seen previously in the chapter about <reference id="runtime-schema-mapping" title="runtime schema mapping"/>, that schemata and tables can be mapped at runtime to other names. But you can also hard-wire schema mapping in generated artefacts at code generation time, e.g. when you have 5 developers with their own dedicated developer databases, and a common integration database. In the code generation configuration, you would then write.
    -							</p>
    -
    -</html><xml><![CDATA[<schemata>
    -  <schema>
    -    <!-- Use this as the developer's schema: -->
    -    <inputSchema>LUKAS_DEV_SCHEMA</inputSchema>
    -
    -    <!-- Use this as the integration / production database: -->
    -    <outputSchema>PROD</outputSchema>
    -  </schema>
    -</schemata>]]></xml></content>
    -					</section>
    -					
    -					<section id="codegen-large-schemas">
    -						<title>Code generation for large schemas</title>
    -						<content><html>
    -							<p>
    -								Databases can become very large in real-world applications. This is not a problem for jOOQ's code generator, but it can be for the Java compiler. jOOQ generates some classes for <reference id="codegen-globals" title="global access"/>. These classes can hit two sorts of limits of the compiler / JVM:
    -							</p>
    -							
    -							<ul>
    -								<li>Methods (including static / instance initialisers) are allowed to contain only 64kb of bytecode.</li>
    -								<li>Classes are allowed to contain at most 64k of constant literals</li>
    -							</ul>
    -							
    -							<p>
    -								While there exist workarounds for the above two limitations (delegating initialisations to nested classes, inheriting constant literals from implemented interfaces), the preferred approach is either one of these:
    -							</p>
    -							
    -							<ul>
    -								<li>Distribute your database objects in several schemas. That is probably a good idea anyway for such large databases</li>
    -								<li><reference id="codegen-configuration" title="Configure jOOQ's code generator"/> to exclude excess database objects</li>
    -								<li><reference id="codegen-configuration" title="Configure jOOQ's code generator"/> to avoid generating <reference id="codegen-globals" title="global objects"/> using <code>&lt;globalObjectReferences/&gt;</code></li>
    -								<li>Remove uncompilable classes after code generation</li>
    -							</ul>
    -						</html></content>
    -					</section>
    -				</sections>
    -			</section>
    -
    -			<section id="tools">
    -				<title>Tools</title>
    -				<content><html>
    -					<p>
    -						These chapters hold some information about tools to be used with jOOQ
    -					</p>
    -				</html></content>
    -
    -				<sections>
    -					<section id="jdbc-mocking">
    -						<title>JDBC mocking for unit testing</title>
    -						<content><html>
    -							<p>
    -								When writing unit tests for your data access layer, you have probably used some generic mocking tool offered by popular providers like <a href="http://code.google.com/p/mockito/">Mockito</a>, <a href="http://jmock.org/">jmock</a>, <a href="http://mockrunner.sourceforge.net/">mockrunner</a>, or even <a href="http://www.dbunit.org/">DBUnit</a>. With jOOQ, you can take advantage of the built-in JDBC mock API that allows you to simulate a database on the JDBC level for precisely those SQL/JDBC use cases supported by jOOQ.
    -							</p>
    -							
    -							<h3>Mocking the JDBC API</h3>
    -							<p>
    -								JDBC is a very complex API. It takes a lot of time to write a useful and correct mock implementation, implementing at least these interfaces:
    -							</p>
    -							<ul>
    -								<li><reference class="java.sql.Connection"/></li>
    -								<li><reference class="java.sql.Statement"/></li>
    -								<li><reference class="java.sql.PreparedStatement"/></li>
    -								<li><reference class="java.sql.CallableStatement"/></li>
    -								<li><reference class="java.sql.ResultSet"/></li>
    -								<li><reference class="java.sql.ResultSetMetaData"/></li>
    -							</ul>
    -							
    -							<p>
    -								Optionally, you may even want to implement interfaces, such as <reference class="java.sql.Array"/>, <reference class="java.sql.Blob"/>, <reference class="java.sql.Clob"/>, and many others. In addition to the above, you might need to find a way to simultaneously support incompatible JDBC minor versions, such as 4.0, 4.1
    -							</p>
    -							
    -							<h3>Using jOOQ's own mock API</h3>
    -							<p>
    -								This work is greatly simplified, when using jOOQ's own mock API. The <code>org.jooq.tools.jdbc</code> package contains all the essential implementations for both JDBC 4.0 and 4.1, which are needed to mock JDBC for jOOQ. In order to write mock tests, provide the jOOQ <reference id="dsl-context" title="Configuration"/> with a <reference class="org.jooq.tools.jdbc.MockConnection" title="MockConnection"/>, and implement the <reference class="org.jooq.tools.jdbc.MockDataProvider" title="MockDataProvider"/>:
    -							</p>
    -							
    -</html><java><![CDATA[// Initialise your data provider (implementation further down):
    -MockDataProvider provider = new MyProvider();
    -MockConnection connection = new MockConnection(provider);
    -
    -// Pass the mock connection to a jOOQ DSLContext:
    -DSLContext create = DSL.using(connection, SQLDialect.ORACLE);
    -
    -// Execute queries transparently, with the above DSLContext:
    -Result<BookRecord> result = create.selectFrom(BOOK).where(BOOK.ID.equal(5)).fetch();]]></java><html>
    -
    -                            <p>
    -                                As you can see, the configuration setup is simple. Now, the <code>MockDataProvider</code> acts as your single point of contact with JDBC / jOOQ. It unifies any of these execution modes, transparently:
    -                            </p>
    -                            
    -                            <ul>
    -                                <li>Statements without results</li>
    -                                <li>Statements without results but with generated keys</li>
    -                                <li>Statements with results</li>
    -                                <li>Statements with several results</li>
    -                                <li>Batch statements with single queries and multiple bind value sets</li>
    -                                <li>Batch statements with multiple queries and no bind values</li>
    -                            </ul>
    -                            
    -                            <p>
    -                                The above are the execution modes supported by jOOQ. Whether you're using any of jOOQ's various fetching modes (e.g. <reference id="pojos" title="pojo fetching"/>, <reference id="lazy-fetching" title="lazy fetching"/>, <reference id="many-fetching" title="many fetching"/>, <reference id="later-fetching" title="later fetching"/>) is irrelevant, as those modes are all built on top of the standard JDBC API.
    -                            </p>
    -                            
    -                            <h3>Implementing MockDataProvider</h3>
    -                            <p>
    -                                 Now, here's how to implement <code>MockDataProvider</code>:
    -                            </p>
    -                            
    -</html><java><![CDATA[public class MyProvider implements MockDataProvider {
    -
    -    @Override
    -    public MockResult[] execute(MockExecuteContext ctx) throws SQLException {
    -
    -        // You might need a DSLContext to create org.jooq.Result and org.jooq.Record objects
    -        DSLContext create = DSL.using(SQLDialect.ORACLE);
    -        MockResult[] mock = new MockResult[1];
    -        
    -        // The execute context contains SQL string(s), bind values, and other meta-data
    -        String sql = ctx.sql();
    -        
    -        // Exceptions are propagated through the JDBC and jOOQ APIs
    -        if (sql.toUpperCase().startsWith("DROP")) {
    -            throw new SQLException("Statement not supported: " + sql);
    -        }
    -        
    -        // You decide, whether any given statement returns results, and how many
    -        else if (sql.toUpperCase().startsWith("SELECT")) {
    -            
    -            // Always return one author record
    -            Result<AuthorRecord> result = create.newResult(AUTHOR);
    -            result.add(create.newRecord(AUTHOR));
    -            result.get(0).setValue(AUTHOR.ID, 1);
    -            result.get(0).setValue(AUTHOR.LAST_NAME, "Orwell");
    -            mock[0] = new MockResult(1, result);
    -        }
    -        
    -        // You can detect batch statements easily
    -        else if (ctx.batch()) {
    -            // [...]
    -        }
    -        
    -        return mock;
    -    }
    -}]]></java><html>
    -
    -							<p>
    -								Essentially, the <reference class="org.jooq.tools.jdbc.MockExecuteContext" title="MockExecuteContext"/> contains all the necessary information for you to decide, what kind of data you should return. The <reference class="org.jooq.tools.jdbc.MockResult" title="MockResult"/> wraps up two pieces of information:
    -							</p>
    -							<ul>
    -							    <li> <reference class="java.sql.Statement" anchor="#getUpdateCount" title="Statement.getUpdateCount()"/>: The number of affected rows</li>
    -							    <li> <reference class="java.sql.Statement" anchor="#getResultSet()" title="Statement.getResultSet()"/>: The result set</li>
    -							</ul>
    -							
    -							<p>
    -								You should return as many <code>MockResult</code> objects as there were query executions (in <reference id="batch-execution" title="batch mode"/>) or results (in <reference id="many-fetching" title="fetch-many mode"/>). Instead of an awkward JDBC <code>ResultSet</code>, however, you can construct a "friendlier" <reference class="org.jooq.Result"/> with your own record types. The jOOQ mock API will use meta data provided with this <code>Result</code> in order to create the necessary JDBC <reference class="java.sql.ResultSetMetaData"/> 
    -							</p>
    -														
    -							<p>
    -								See the <reference class="org.jooq.tools.jdbc.MockDataProvider" title="MockDataProvider Javadoc"/> for a list of rules that you should follow.
    -							</p>
    -						</html></content>
    -					</section>
    -					
    -					<section id="jooq-console">
    -						<title>jOOQ Console</title>
    -						<content><html>
    -							<p>
    -							    The <reference id="execute-listeners" title="ExecuteListener API"/> was driven by a feature request by Christopher Deckers, who has had the courtesy to contribute the jOOQ Console, a sample application interfacing with jOOQ's ExecuteListeners. The jOOQ Console logs all queries executed by jOOQ and displays them nicely in a Swing application. With the jOOQ Console's logger, you can:
    -						    </p>
    -						    <ul>
    -						    	<li>Activate the console's DebugListener anytime (in-process or if the remote server is active).</li>
    -						    	<li>View simple and batch queries and their parameters.</li>
    -						    	<li>Reformat queries along with syntax highlighting for better readability.</li>
    -						    	<li>View stack trace of originator of the call.</li>
    -						    	<li>Dump the stack to stdout when in an IDE, to directly navigate to relevant classes.</li>
    -						    	<li>Track execution time, binding time, parsing time, rows read, fields read.</li>
    -						    	<li>Show/hide queries depending on their type (SELECT, UPDATE, etc.).</li>
    -						    	<li>Sort any column (timing columns, queries, types, etc.)</li>
    -						    	<li>Easy copy paste of rows/columns to Spreadsheet editors.</li>
    -						    </ul>
    -
    -						    <p>
    -						    	A short overview of such a debugging session can be seen here:
    -						    </p>
    -   							<div class="screenshot">
    -								<img class="screenshot" src="&lt;?=$root?&gt;/img/jooq-console-01.png" alt="jOOQ Console example"/>
    -							</div>
    -						    <p>
    -							    Please note that the jOOQ Console is still experimental. Any feedback is very welcome on <br/>
    -							    <a href="http://groups.google.com/group/jooq-user" title="the jooq-user group">the jooq-user group</a>
    -							</p>
    -
    -							<h3>jOOQ Console operation modes</h3>
    -							<p>
    -								The jOOQ Console can be run in two different modes:
    -							</p>
    -							<ul>
    -								<li>In-process mode: running in the same process as the queries you're analysing</li>
    -								<li>"headless" mode: running remotely</li>
    -							</ul>
    -
    -							<p>
    -								Both modes will require that you set the <reference class="org.jooq.debug.impl.DebugListener"/> in the Configuration:
    -							</p>
    -
    -</html><java><![CDATA[// Create a configuration with an appropriate listener provider:
    -Configuration configuration = new DefaultConfiguration.set(connection).set(dialect);
    -configuration.set(new DefaultExecuteListenerProvider(new org.jooq.debug.impl.DebugListener()));
    -
    -// Create a DSLContext from the above configuration
    -DSLContext create = DSL.using(configuration);]]></java><html>
    -
    -							<h3>In-process mode</h3>
    -							<p>
    -								The in-process mode is useful for Swing applications or other, locally run Java programs accessing the database via jOOQ. In order to launch the jOOQ Console "in-process", specify the previously documented settings and launch the Console as follows:
    -							</p>
    -
    -</html><java><![CDATA[// Define a DatabaseDescriptor for the "in-process" mode
    -// It is needed for the "Editor" tab
    -DatabaseDescriptor descriptor = new DatabaseDescriptor() {
    -
    -    // Return your generated schema. This is used by the console
    -    // to introspect your schema data
    -    @Override
    -    public Schema getSchema() {
    -        return com.example.MySchema.MY_SCHEMA;
    -    }
    -
    -    // Return the SQL dialect that you're using
    -    @Override
    -    public SQLDialect getSQLDialect() {
    -        return SQLDialect.ORACLE;
    -    }
    -
    -    // Return a connection
    -    @Override
    -    public Connection createConnection() {
    -        try {
    -            return DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "test", "test");
    -        }
    -        catch (Exception ignore) {}
    -    }
    -};
    -
    -// Now pass this database descriptor to the Console and make it visible
    -try {
    -
    -    // Use this for a nicer look-and-feel
    -    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    -
    -    // Create a new Console
    -    Console console = new Console(descriptor, true);
    -    console.setLoggingActive(true);
    -    console.setVisible(true);
    -}
    -catch (Exception ignore) {}
    -]]></java><html>
    -
    -							<p>
    -								Only in the in-process mode, you can execute ad-hoc queries directly from the console, if you provide it with proper DatabaseDescriptor. These queries are executed from the Editor pane which features:
    -							</p>
    -							<ul>
    -								<li>SQL editing within the console.</li>
    -								<li>Incremental search on tables.</li>
    -								<li>Simple code completion with tables/columns/SQL keywords.</li>
    -								<li>Syntax highlighting and formatting capabilities.</li>
    -								<li>Results shown in one or several tabs.</li>
    -								<li>Easy analysis of Logger output by copy/pasting/running queries in the Editor.</li>
    -							</ul>
    -   							<div class="screenshot">
    -								<img class="screenshot" src="&lt;?=$root?&gt;/img/jooq-console-02.png" alt="jOOQ Console example"/>
    -							</div>
    -
    -                            <h3>"Headless" mode</h3>
    -							<p>
    -								In J2EE or other server/client environments, you may not be able to run the console in the same process as your application. You can then run the jOOQ Console in "headless" mode. In addition to the previously documented settings, you'll have to start a debugger server in your application process, that the console can connect to:
    -							</p>
    -
    -</html><java>// Create a new RemoteDebuggerServer in your application that listens to
    -// incoming connections on a given port
    -SERVER = new RemoteDebuggerServer(DEBUGGER_PORT);</java><html>
    -
    -							<p>
    -								Now start your application along with the debugger server and launch the console with this command:
    -							</p>
    -
    -</html><config>java -jar jooq-console-{jooq-version}.jar [host] [port]</config><html>
    -
    -							<p>
    -								Depending on your distribution, you may have to manually add rsyntaxtextarea-2.0.2.jar and jOOQ artefacts on your classpath.
    -							</p>
    -						</html></content>
    -					</section>
    -				</sections>
    -			</section>
    -
    -			<section id="reference">
    -				<title>Reference</title>
    -				<content><html>
    -					<p>
    -						These chapters hold some general jOOQ reference information
    -					</p>
    -				</html></content>
    -
    -				<sections>
    -					<section id="supported-rdbms">
    -						<title>Supported RDBMS</title>
    -						<content><html>
    -							<h3>A list of supported databases</h3>
    -							<p>
    -						   		Every RDMBS out there has its own little specialties. jOOQ considers those specialties as much as possible, while trying to standardise the behaviour in jOOQ. In order to increase the quality of jOOQ, some 70 unit tests are run for syntax and variable binding verification, as well as some 180 integration tests with an overall of around 1200 queries for any of these databases:
    -					   		</p>
    -							<ul>
    -							    <li>CUBRID 8.4.1 and 9.0.0</li>
    -							    <li>DB2 9.7</li>
    -							    <li>Derby 10.8</li>
    -							    <li>Firebird 2.5.1</li>
    -							    <li>H2 1.3.161</li>
    -							    <li>HSQLDB 2.2.5</li>
    -							    <li>Ingres 10.1.0</li>
    -							    <li>MySQL 5.1.41 and 5.5.8</li>
    -							    <li>Oracle XE 10.2.0.1.0 and 11g</li>
    -							    <li>PostgreSQL 9.0</li>
    -							    <li>SQLite with inofficial JDBC driver v056</li>
    -							    <li>SQL Server 2008 R8 and 2012</li>
    -							    <li>Sybase Adaptive Server Enterprise 15.5</li>
    -							    <li>Sybase SQL Anywhere 12</li>
    -							</ul>
    -							<p>
    -								These platforms have been observed to work as well, but are not integration-tested
    -							</p>
    -							<ul>
    -								<li>Google Cloud SQL (MySQL)</li>
    -							</ul>
    -								
    -							<h3>Databases planned for support</h3>
    -							<p>
    -								Any of the following databases might be available in the future
    -							</p>
    -						    <ul>
    -							    <li>Informix</li>
    -							    <li>Interbase</li>
    -							    <li>MS Access</li>
    -							    <li>MS Excel</li>
    -							    <li>SQL Azure</li>
    -							    <li>Sybase SQL Anywhere OnDemand</li>
    -							    <li>Teradata</li>
    -						    </ul>
    -						    
    -							<h3>Databases being watched</h3>
    -							<p>
    -								Any of the following databases are being observed for a potential integration
    -							</p>
    -							<ul>
    -								<li>Mondrian</li>
    -								<li>Netezza</li>
    -								<li>SQLFire</li>
    -								<li>Vectorwise</li>
    -								<li>Vertica</li>
    -								<li>VoltDB</li>
    -							</ul>
    -
    -							<h3>Feature matrix</h3>
    -							<p>
    -								This section will soon contain a feature matrix, documenting what feature is available for which database.
    -							</p>
    -						</html></content>
    -					</section>
    -
    -					<section id="reference-data-types">
    -						<title>Data types</title>
    -						<content><html>
    -							<p>
    -								There is always a small mismatch between SQL data types and Java data types. This is for two reasons:
    -							</p>
    -							<ul>
    -								<li>SQL data types are insufficiently covered by the JDBC API.</li>
    -								<li>Java data types are often less expressive than SQL data types</li>
    -							</ul>
    -							<p>
    -								This chapter should document the most important notes about SQL, JDBC and jOOQ data types.
    -							</p>
    -						</html></content>
    -						
    -						<sections>
    -							<section id="data-types-lobs">
    -								<title>BLOBs and CLOBs</title>
    -								<content><html>
    -									<p>
    -										jOOQ currently doesn't explicitly support JDBC BLOB and CLOB data types. If you use any of these data types in your database, jOOQ will map them to byte[] and String instead. In simple cases (small data), this simplification is sufficient. In more sophisticated cases, you may have to bypass jOOQ, in order to deal with these data types and their respective resources. True support for LOBs is on the roadmap, though.
    -									</p>
    -								</html></content>
    -							</section>
    -							
    -							<section id="data-types-unsigned">
    -								<title>Unsigned integer types</title>
    -								<content><html>
    -									<p>
    -										Some databases explicitly support unsigned integer data types. In most normal JDBC-based applications, they would just be mapped to their signed counterparts letting bit-wise shifting and tweaking to the user. jOOQ ships with a set of unsigned <reference class="java.lang.Number"/> implementations modelling the following types:
    -									</p>
    -									<ul>
    -										<li><reference class="org.jooq.types.UByte"/>: Unsigned byte, an 8-bit unsigned integer</li>
    -										<li><reference class="org.jooq.types.UShort"/>: Unsigned short, a 16-bit unsigned integer</li>
    -										<li><reference class="org.jooq.types.UInteger"/>: Unsigned int, a 32-bit unsigned integer</li>
    -										<li><reference class="org.jooq.types.ULong"/>: Unsigned long, a 64-bit unsigned integer</li>
    -									</ul>
    -									<p>
    -										Each of these wrapper types extends <reference class="java.lang.Number"/>, wrapping a higher-level integer type, internally:
    -									</p>
    -									<ul>
    -										<li>UByte wraps <reference class="java.lang.Short"/></li>
    -										<li>UShort wraps <reference class="java.lang.Integer"/></li>
    -										<li>UInteger wraps <reference class="java.lang.Long"/></li>
    -										<li>ULong wraps <reference class="java.math.BigInteger"/></li>
    -									</ul>
    -								</html></content>
    -							</section>
    -							
    -							<section id="data-types-intervals">
    -								<title>INTERVAL data types</title>
    -								<content><html>
    -									<p>
    -										jOOQ fills a gap opened by JDBC, which neglects an important SQL data type as defined by the SQL standards: INTERVAL types. SQL knows two different types of intervals:
    -									</p>
    -									<ul>
    -										<li><strong>YEAR TO MONTH</strong>: This interval type models a number of months and years</li>
    -										<li><strong>DAY TO SECOND</strong>: This interval type models a number of days, hours, minutes, seconds and milliseconds</li>
    -									</ul>
    -									
    -									<p>
    -										Both interval types ship with a variant of subtypes, such as DAY TO HOUR, HOUR TO SECOND, etc. jOOQ models these types as Java objects extending <reference class="java.lang.Number"/>: <reference class="org.jooq.types.YearToMonth"/> (where Number.intValue() corresponds to the absolute number of months) and <reference class="org.jooq.types.DayToSecond"/> (where Number.intValue() corresponds to the absolute number of milliseconds)
    -									</p>
    -									
    -									<h3>Interval arithmetic</h3>
    -									<p>
    -										In addition to the <reference id="arithmetic-expressions" title="arithmetic expressions"/> documented previously, interval arithmetic is also supported by jOOQ. Essentially, the following operations are supported:
    -									</p>
    -									<ul>
    -										<li>DATETIME - DATETIME => INTERVAL</li>
    -										<li>DATETIME + or - INTERVAL => DATETIME</li>
    -										<li>INTERVAL + DATETIME => DATETIME</li>
    -										<li>INTERVAL + - INTERVAL => INTERVAL</li>
    -										<li>INTERVAL * or / NUMERIC => INTERVAL</li>
    -										<li>NUMERIC * INTERVAL => INTERVAL</li>
    -									</ul>
    -								</html></content>
    -							</section>
    -							
    -							<section id="data-types-xml">
    -								<title>XML data types</title>
    -								<content><html>
    -									<p>
    -										XML data types are currently not supported
    -									</p>
    -								</html></content>
    -							</section>
    -							
    -							<section id="data-types-geospacial">
    -								<title>Geospacial data types</title>
    -								<content><html>
    -									<h3>Geospacial data types</h3>
    -									<p>
    -										Geospacial data types are currently not supported
    -									</p>
    -								</html></content>
    -							</section>
    -							
    -							<section id="data-types-cursors">
    -								<title>CURSOR data types</title>
    -								<content><html>
    -									<p>
    -										Some databases support cursors returned from stored procedures. They are mapped to the following jOOQ data type:
    -									</p>
    -
    -</html><java><![CDATA[Field<Result<Record>> cursor;]]></java><html>
    -									
    -									<p>
    -										In fact, such a cursor will be fetched immediately by jOOQ and wrapped in an <reference class="org.jooq.Result"/> object.
    -									</p>
    -								</html></content>
    -							</section>
    -							
    -							<section id="data-types-arrays">
    -								<title>ARRAY and TABLE data types</title>
    -								<content><html>
    -									<p>
    -										The SQL standard specifies ARRAY data types, that can be mapped to Java arrays as such:
    -									</p>
    -									
    -</html><java><![CDATA[Field<Integer[]> intArray;]]></java><html>
    -										
    -									<p>
    -										The above array type is supported by these SQL dialects:
    -									</p>
    -									<ul>
    -										<li>H2</li>
    -										<li>HSQLDB</li>
    -										<li>Postgres</li>
    -									</ul>
    -									
    -									<h3>Oracle typed arrays</h3>
    -									<p>
    -										Oracle has strongly-typed arrays and table types (as opposed to the previously seen anonymously typed arrays). These arrays are wrapped by <reference class="org.jooq.ArrayRecord"/> types.
    -									</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -					<section id="reference-bnf-notation">
    -						<title>jOOQ's BNF pseudo-notation</title>
    -						<content><html>
    -							<p>
    -								This chapter will soon contain an overview over jOOQ's API using a pseudo BNF notation.
    -							</p>
    -						</html></content>
    -					</section>
    -					
    -					<section id="quality-assurance">
    -						<title>Quality Assurance</title>
    -						<content><html>
    -							<p>
    -								jOOQ is running some of your most mission-critical logic: the interface layer between your Java / Scala application and the database. You have probably chosen jOOQ for any of the following reasons:
    -							</p>
    -							<ul>
    -								<li>To evade JDBC's verbosity and error-proneness due to string concatenation and index-based variable binding</li>
    -								<li>To add lots of type-safety to your inline SQL</li>
    -								<li>To increase productivity when writing inline SQL using your favourite IDE's autocompletion capabilities</li>
    -							</ul>
    -							
    -							<p>
    -								With jOOQ being in the core of your application, you want to be sure that you can trust jOOQ. That is why jOOQ is heavily unit and integration tested with a strong focus on integration tests:
    -							</p>
    -							
    -							<h3>Unit tests</h3>
    -							<p>
    -								Unit tests are performed against dummy JDBC interfaces using <a href="http://jmock.org/" title="jmock">http://jmock.org/</a>. These tests verify that various <reference class="org.jooq.QueryPart"/> implementations render correct SQL and bind variables correctly.
    -							</p>
    -							
    -							<h3>Integration tests</h3>
    -							<p>
    -								This is the most important part of the jOOQ test suites. Some 1500 queries are currently run against a standard integration test database. Both the test database and the queries are translated into every one of the 14 supported SQL dialects to ensure that regressions are unlikely to be introduced into the code base.
    -							</p>
    -							<p>
    -								For libraries like jOOQ, integration tests are much more expressive than unit tests, as there are so many subtle differences in SQL dialects. Simple mocks just don't give as much feedback as an actual database instance.
    -							</p>
    -							<p>
    -								jOOQ integration tests run the weirdest and most unrealistic queries. As a side-effect of these extensive integration test suites, many corner-case bugs for JDBC drivers and/or open source databases have been discovered, feature requests submitted through jOOQ and reported mainly to CUBRID, Derby, H2, HSQLDB.
    -							</p>
    -							
    -							<h3>Code generation tests</h3>
    -							<p>
    -								For every one of the 14 supported integration test databases, source code is generated and the tiniest differences in generated source code can be discovered. In case of compilation errors in generated source code, new test tables/views/columns are added to avoid regressions in this field.
    -							</p>
    -							
    -							<h3>API Usability tests and proofs of concept</h3>
    -							<p>
    -								jOOQ is used in jOOQ-meta as a proof of concept. This includes complex queries such as the following Postgres query
    -							</p>
    -							
    -</html><java><![CDATA[Routines r1 = ROUTINES.as("r1");
    -Routines r2 = ROUTINES.as("r2");
    -
    -for (Record record : create().select(
    -        r1.ROUTINE_SCHEMA,
    -        r1.ROUTINE_NAME,
    -        r1.SPECIFIC_NAME,
    -
    -        // Ignore the data type when there is at least one out parameter
    -        decode()
    -            .when(exists(
    -                selectOne()
    -                .from(PARAMETERS)
    -                .where(PARAMETERS.SPECIFIC_SCHEMA.equal(r1.SPECIFIC_SCHEMA))
    -                .and(PARAMETERS.SPECIFIC_NAME.equal(r1.SPECIFIC_NAME))
    -                .and(upper(PARAMETERS.PARAMETER_MODE).notEqual("IN"))),
    -                    val("void"))
    -            .otherwise(r1.DATA_TYPE).as("data_type"),
    -        r1.CHARACTER_MAXIMUM_LENGTH,
    -        r1.NUMERIC_PRECISION,
    -        r1.NUMERIC_SCALE,
    -        r1.TYPE_UDT_NAME,
    -
    -        // Calculate overload index if applicable
    -        decode().when(
    -        exists(
    -            selectOne()
    -            .from(r2)
    -            .where(r2.ROUTINE_SCHEMA.in(getInputSchemata()))
    -            .and(r2.ROUTINE_SCHEMA.equal(r1.ROUTINE_SCHEMA))
    -            .and(r2.ROUTINE_NAME.equal(r1.ROUTINE_NAME))
    -            .and(r2.SPECIFIC_NAME.notEqual(r1.SPECIFIC_NAME))),
    -            select(count())
    -            .from(r2)
    -            .where(r2.ROUTINE_SCHEMA.in(getInputSchemata()))
    -            .and(r2.ROUTINE_SCHEMA.equal(r1.ROUTINE_SCHEMA))
    -            .and(r2.ROUTINE_NAME.equal(r1.ROUTINE_NAME))
    -            .and(r2.SPECIFIC_NAME.lessOrEqual(r1.SPECIFIC_NAME)).asField())
    -        .as("overload"))
    -    .from(r1)
    -    .where(r1.ROUTINE_SCHEMA.in(getInputSchemata()))
    -    .orderBy(
    -        r1.ROUTINE_SCHEMA.asc(),
    -        r1.ROUTINE_NAME.asc())
    -    .fetch()) {
    -
    -    result.add(new PostgresRoutineDefinition(this, record));
    -}]]></java><html>
    -							<p>
    -								These rather complex queries show that the jOOQ API is fit for advanced SQL use-cases, compared to the rather simple, often unrealistic queries in the integration test suite. 
    -							</p>
    -							
    -							<h3>Clean API and implementation. Code is kept DRY</h3>
    -							<p>
    -								As a general rule of thumb throughout the jOOQ code, everything is kept <a href="http://en.wikipedia.org/wiki/DRY">DRY</a>. Some examples:
    -							</p>
    -							<ul>
    -								<li>There is only one place in the entire code base, which consumes values from a JDBC ResultSet</li>
    -								<li>There is only one place in the entire code base, which transforms jOOQ Records into custom POJOs</li>
    -							</ul>
    -							<p>
    -								Keeping things DRY leads to longer stack traces, but in turn, also increases the relevance of highly reusable code-blocks. Chances that some parts of the jOOQ code base slips by integration test coverage decrease significantly.
    -							</p>
    -						</html></content>
    -					</section>
    -					
    -					<section id="migrating-to-3.0">
    -						<title>Migrating to jOOQ 3.0</title>
    -						<content><html>
    -							<p>
    -								This section is for all users of jOOQ 2.x who wish to upgrade to the next major release. In the next sub-sections, the most important changes are explained. Some code hints are also added to help you fix compilation errors.
    -							</p>
    -							
    -							<h3>Type-safe row value expressions</h3>
    -							<p>
    -								Support for <reference id="row-value-expressions" title="row value expressions"/> has been added in jOOQ 2.6. In jOOQ 3.0, many API parts were thoroughly (but often incompatibly) changed, in order to provide you with even more type-safety. 
    -							</p>
    -							
    -							<p>
    -								Here are some affected API parts:
    -							</p>
    -							<ul>
    -								<li>[N] in Row[N] has been raised from 8 to 22. This means that existing row value expressions with degree >= 9 are now type-safe</li>
    -								<li>Subqueries returned from <code>DSL.select(...)</code> now implement <code>Select&lt;Record[N]>, not Select&lt;Record></code></li>
    -								<li><code>IN</code> predicates and comparison predicates taking subselects changed incompatibly</li>
    -								<li><code>INSERT</code> and <code>MERGE</code> statements now take typesafe <code>VALUES()</code> clauses</li>
    -							</ul>
    -							
    -							<p>
    -								Some hints related to row value expressions:
    -							</p>
    -							
    -</html><java><![CDATA[// SELECT statements are now more typesafe:
    -Record2<String, Integer> record         = create.select(BOOK.TITLE, BOOK.ID).from(BOOK).where(ID.eq(1)).fetchOne();
    -Result<Record2<String, Integer>> result = create.select(BOOK.TITLE, BOOK.ID).from(BOOK).fetch();
    -
    -// But Record2 extends Record. You don't have to use the additional typesafety:
    -Record record    = create.select(BOOK.TITLE, BOOK.ID).from(BOOK).where(ID.eq(1)).fetchOne();
    -Result<?> result = create.select(BOOK.TITLE, BOOK.ID).from(BOOK).fetch();]]></java><html>
    -							
    -							<h3>SelectQuery and SelectXXXStep are now generic</h3>
    -							<p>
    -								In order to support type-safe row value expressions and type-safe Record[N] types, SelectQuery is now generic: SelectQuery&lt;R>
    -							</p>
    -							
    -							<h3>SimpleSelectQuery and SimpleSelectXXXStep API were removed</h3>
    -							<p>
    -							    The duplication of the SELECT API is no longer useful, now that SelectQuery and SelectXXXStep are generic.
    -							</p>
    -							
    -							<h3>Factory was split into DSL (query building) and DSLContext (query execution)</h3>
    -							<p>
    -								The pre-existing Factory class has been split into two parts:
    -							</p>
    -							
    -							<ol>
    -								<li><strong>The DSL</strong>: This class contains only static factory methods. All QueryParts constructed from this class are "unattached", i.e. queries that are constructed through DSL cannot be executed immediately. This is useful for subqueries.<br/>The DSL class corresponds to the static part of the jOOQ 2.x Factory type</li>
    -								<li><strong>The DSLContext</strong>: This type holds a reference to a Configuration and can construct executable ("attached") QueryParts.<br/>The DSLContext type corresponds to the non-static part of the jOOQ 2.x Factory / FactoryOperations type.</li>
    -							</ol>
    -							
    -							<p>
    -								The FactoryOperations interface has been renamed to DSLContext. An example:
    -							</p>
    -							
    -</html><java><![CDATA[// jOOQ 2.6, check if there are any books
    -Factory create = new Factory(connection, dialect);
    -create.selectOne()
    -      .whereExists(
    -        create.selectFrom(BOOK) // Reuse the factory to create subselects
    -      ).fetch();                // Execute the "attached" query
    -
    -// jOOQ 3.0
    -DSLContext create = DSL.using(connection, dialect);
    -create.selectOne()
    -      .whereExists(
    -        selectFrom(BOOK)        // Create a static subselect from the DSL
    -      ).fetch();                // Execute the "attached" query]]></java><html>							
    -							
    -							<h3>Quantified comparison predicates</h3>
    -							<p>
    -								Field.equalAny(...) and similar methods have been removed in favour of Field.equal(any(...)). This greatly simplified the Field API. An example:
    -							</p>
    -							
    -</html><java><![CDATA[// jOOQ 2.6
    -Condition condition = BOOK.ID.equalAny(create.select(BOOK.ID).from(BOOK));
    -
    -// jOOQ 3.0 adds some typesafety to comparison predicates involving quantified selects
    -QuantifiedSelect<Record1<Integer>> subselect = any(select(BOOK.ID).from(BOOK));
    -Condition condition = BOOK.ID.equal(subselect);]]></java><html>							
    -							
    -							<h3>FieldProvider</h3>
    -							<p>
    -								The FieldProvider marker interface was removed. Its methods still exist on FieldProvider subtypes. Note, they have changed names from <code>getField()</code> to <code>field()</code> and from <code>getIndex()</code> to <code>indexOf()</code>
    -							</p>
    -							
    -							<h3>GroupField</h3>
    -							<p>
    -								GroupField has been introduced as a DSL marker interface to denote fields that can be passed to <code>GROUP BY</code> clauses. This includes all org.jooq.Field types. However, fields obtained from <code>ROLLUP()</code>, <code>CUBE()</code>, and <code>GROUPING SETS()</code> functions no longer implement Field. Instead, they only implement GroupField. An example:
    -							</p>
    -							
    -</html><java><![CDATA[// jOOQ 2.6
    -Field<?>   field1a = Factory.rollup(...); // OK
    -Field<?>   field2a = Factory.one();       // OK
    -
    -// jOOQ 3.0
    -GroupField field1b = DSL.rollup(...); // OK
    -Field<?>   field1c = DSL.rollup(...); // Compilation error
    -GroupField field2b = DSL.one();       // OK
    -Field<?>   field2c = DSL.one();       // OK]]></java><html>
    -							
    -							<h3>NULL predicate</h3>
    -							<p>
    -							   Beware! Previously, Field.equal(null) was translated internally to an IS NULL predicate. This is no longer the case. Binding Java "null" to a comparison predicate will result in a regular comparison predicate (which never returns true). This was changed for several reasons:
    -							</p>
    -							
    -							<ul>
    -								<li>To most users, this was a surprising "feature".</li>
    -								<li>Other predicates didn't behave in such a way, e.g. the IN predicate, the BETWEEN predicate, or the LIKE predicate.</li>
    -								<li>Variable binding behaved unpredictably, as IS NULL predicates don't bind any variables.</li>
    -								<li>The generated SQL depended on the possible combinations of bind values, which creates unnecessary hard-parses every time a new unique SQL statement is rendered.</li>
    -							</ul>
    -							
    -							<p>
    -								Here is an example how to check if a field has a given value, without applying SQL's ternary NULL logic:
    -							</p>
    -
    -</html><java><![CDATA[String possiblyNull = null; // Or else...
    -
    -// jOOQ 2.6
    -Condition condition1 = BOOK.TITLE.equal(possiblyNull);
    -
    -// jOOQ 3.0
    -Condition condition2 = BOOK.TITLE.equal(possiblyNull).or(BOOK.TITLE.isNull().and(val(possiblyNull).isNull()));
    -Condition condition3 = BOOK.TITLE.isNotDistinctFrom(possiblyNull);]]></java><html>
    -							
    -							<h3>Configuration</h3>
    -							<p>
    -								<code>DSLContext</code>, <code>ExecuteContext</code>, <code>RenderContext</code>, <code>BindContext</code> no longer extend <code>Configuration</code> for "convenience". From jOOQ 3.0 onwards, composition is chosen over inheritance as these objects are not really configurations. Most importantly
    -							</p>
    -							<ul>
    -								<li><code>DSLContext</code> is only a DSL entry point for constructing "attached" QueryParts</li>
    -								<li><code>ExecuteContext</code> has a well-defined lifecycle, tied to that of a single query execution</li>
    -								<li><code>RenderContext</code> has a well-defined lifecycle, tied to that of a single rendering operation</li>
    -								<li><code>BindContext</code> has a well-defined lifecycle, tied to that of a single variable binding operation</li>
    -							</ul>
    -							<p>
    -								In order to resolve confusion that used to arise because of different lifecycle durations, these types are now no longer formally connected through inheritance.
    -							</p>
    -							
    -							<h3>ConnectionProvider</h3>
    -							<p>
    -							    In order to allow for simpler connection / data source management, jOOQ externalised connection handling in a new ConnectionProvider type. The previous two connection modes are maintained backwards-compatibly (JDBC standalone connection mode, pooled DataSource mode). Other connection modes can be injected using:
    -							</p>
    -
    -</html><java><![CDATA[public interface ConnectionProvider {
    -
    -    // Provide jOOQ with a connection
    -    Connection acquire() throws DataAccessException;
    -  
    -    // Get a connection back from jOOQ
    -    void release(Connection connection) throws DataAccessException;
    -}]]></java><html>
    -							
    -							<p>
    -							    These are some side-effects of the above change
    -							</p>
    -							
    -							<ul>
    -								<li>Connection-related JDBC wrapper utility methods (commit, rollback, etc) have been moved to the new DefaultConnectionProvider. They're no longer available from the DSLContext. This had been confusing to some users who called upon these methods while operating in pool DataSource mode.</li>
    -							</ul>
    -							
    -							<h3>ExecuteListeners</h3>
    -							<p>
    -								ExecuteListeners can no longer be configured via Settings. Instead they have to be injected into the Configuration. This resolves many class loader issues that were encountered before. It also helps listener implementations control their lifecycles themselves.
    -							</p>
    -							
    -							<h3>Data type API</h3>
    -							<p>
    -								The data type API has been changed drastically in order to enable some new DataType-related features. These changes include:
    -							</p>
    -
    -							<ul>
    -								<li>[SQLDialect]DataType and SQLDataType no longer implement DataType. They're mere constant containers</li>
    -								<li>Various minor API changes have been done.</li>
    -							</ul>
    -														
    -							<h3>Object renames</h3>
    -							<p>
    -								These objects have been moved / renamed:
    -							</p>
    -							
    -							<ul>
    -								<li>jOOU: a library used to represent unsigned integer types was moved from <code>org.jooq.util.unsigned</code> to <code>org.jooq.util.types</code> (which already contained INTERVAL data types)</li>
    -							</ul>
    -							
    -							<h3>Feature removals</h3>
    -							<p>
    -								Here are some minor features that have been removed in jOOQ 3.0
    -							</p>
    -
    -							<ul>
    -								<li>The ant task for code generation was removed, as it was not up to date at all. Code generation through ant can be performed easily by calling jOOQ's GenerationTool through a &lt;java> target.</li>
    -								<li>The navigation methods and "foreign key setters" are no longer generated in Record classes, as they are useful only to few users and the generated code is very collision-prone.</li>
    -								<li>The code generation configuration no longer accepts comma-separated regular expressions. Use the regex pipe | instead.</li>
    -								<li>The code generation configuration can no longer be loaded from .properties files. Only XML configurations are supported.</li>
    -								<li>The master data type feature is no longer supported. This feature was unlikely to behave exactly as users expected. It is better if users write their own code generators to generate master enum data types from their database tables. jOOQ's enum mapping and converter features sufficiently cover interacting with such user-defined types.</li>
    -								<li>The DSL subtypes are no longer instanciable. As DSL now only contains static methods, subclassing is no longer useful. There are still dialect-specific DSL types providing static methods for dialect-specific functions. But the code-generator no longer generates a schema-specific DSL</li>
    -								<li>The concept of a "main key" is no longer supported. The code generator produces UpdatableRecords only if the underlying table has a PRIMARY KEY. The reason for this removal is the fact that "main keys" are not reliable enough. They were chosen arbitrarily among UNIQUE KEYs.</li>
    -								<li>The UpdatableTable type has been removed. While adding significant complexity to the type hierarchy, this type adds not much value over a simple <code>Table.getPrimaryKey() != null</code> check.</li>
    -							    <li>The <code>USE</code> statement support has been removed from jOOQ. Its behaviour was ill-defined, while it didn't work the same way (or didn't work at all) in some databases.</li>
    -                            </ul>
    -						</html></content>
    -					</section>
    -
    -					<!-- 
    -					<section id="reference-glossary">
    -					  Analytical function -> window function
    -					  Arity -> Degree
    -					  AST
    -					  Batch
    -					  BNF
    -					  Catalog
    -					  Clause
    -					  Code generation
    -					  Column -> Field
    -					  Column expression
    -					  Common table expression
    -					  Condition -> Predicate
    -					  Configuration
    -					  Connection
    -					  Console
    -					  CRUD -> OLTP
    -					  DAO
    -					  Database
    -					  DataSource
    -					  Degree
    -					  Dialect
    -					  Domain Specific language (internal / external)
    -                      DSL
    -                      DSLContext
    -					  Execute
    -					  Execute listener
    -					  Execution lifecycle
    -					  Export
    -					  Expression
    -					  Fetch
    -					  Field
    -					  Function
    -					  Generic R-type
    -					  Generic T-type
    -					  JDBC
    -					  JPQL
    -					  Hibernate
    -					  Hierarchical query
    -					  HQL
    -					  Identifier
    -					  Import
    -					  Keyword
    -					  LINQ
    -					  Literal
    -					  Locking (optimistic / pessimistic)
    -					  Name -> Identifier
    -					  OLAP
    -					  OLTP
    -					  Pivot
    -					  POJO
    -					  Predicate
    -					  PreparedStatement
    -					  Procedure
    -					  Projection
    -					  Query
    -					  Schema
    -					  Settings
    -					  SLICK
    -					  SQL
    -					  SQL building
    -					  SQL execution
    -					  SQL standard
    -					  Statement
    -					  Table
    -					  Table expression
    -					  Record
    -					  Row
    -					  Row value expression
    -					  Result
    -					  ResultQuery
    -					  UDT
    -					  View
    -					  Window function
    -					
    -					</section>
    -					  -->
    -
    -					<section id="reference-credits">
    -						<title>Credits</title>
    -						<content><html>
    -							<p>
    -								jOOQ lives in a very challenging ecosystem. The Java to SQL interface is still one of the most important system interfaces. Yet there are still a lot of open questions, best practices and no "true" standard has been established. This situation gave way to a lot of tools, APIs, utilities which essentially tackle the same problem domain as jOOQ. jOOQ has gotten great inspiration from pre-existing tools and this section should give them some credit. Here is a list of inspirational tools in alphabetical order:
    -							</p>
    -							<ul>
    -								<li><a href="http://avaje.org">Avajé EBean</a>: Play! Framework's preferred ORM has a feature called asynchronous query execution. This idea made it into jOOQ as <reference class="org.jooq.ResultQuery" anchor="#fetchLater()"/></li>
    -								<li><a href="http://www.hibernate.org">Hibernate</a>: The de-facto standard (JPA) with its useful table-to-POJO mapping features have influenced jOOQ's <reference class="org.jooq.ResultQuery" anchor="#fetchInto(java.lang.Class)"/> facilities</li>
    -								<li><a href="http://www.h2database.com/html/jaqu.html">JaQu</a>: H2's own fluent API for querying databases</li>
    -								<li><a href="http://www.oracle.com/technetwork/java/javaee/tech/persistence-jsp-140049.html">JPA</a>: The de-facto standard in the javax.persistence packages, supplied by Oracle. Its annotations are useful to jOOQ as well.</li>
    -								<li><a href="http://onewebsql.com">OneWebSQL</a>: A commercial SQL abstraction API with support for DAO source code generation, which was integrated also in jOOQ</li>
    -								<li><a href="http://www.querydsl.com">QueryDSL</a>: A "LINQ-port" to Java. It has a similar fluent API, a similar code-generation facility, yet quite a different purpose. While jOOQ is all about SQL, QueryDSL (like LINQ) is mostly about querying.</li>
    -								<li><a href="http://slick.typesafe.com">SLICK</a>: A "LINQ-like" database abstraction layer for Scala. Unlike LINQ, its API doesn't really remind of SQL. Instead, it makes SQL look like Scala.</li>
    -								<li><a href="http://www.springsource.org/features/data-access">Spring Data</a>: Spring's JdbcTemplate knows RowMappers, which are reflected by jOOQ's <reference id="recordhandler"/> or <reference id="recordmapper"/></li>
    -							</ul>
    -						</html></content>
    -					</section>
    -				</sections>
    -			</section>
    -		</sections>
    -	</section>
    -</manual>
    diff --git a/jOOQ-website/src/main/resources/manual-3.1.xml b/jOOQ-website/src/main/resources/manual-3.1.xml
    deleted file mode 100644
    index db12d84491..0000000000
    --- a/jOOQ-website/src/main/resources/manual-3.1.xml
    +++ /dev/null
    @@ -1,11008 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?>
    -<!-- 
    -  - Copyright (c) 2009-2013, Lukas Eder, lukas.eder@gmail.com
    -  - All rights reserved.
    -  -
    -  - This software is licensed to you under the Apache License, Version 2.0
    -  - (the "License"); You may obtain a copy of the License at
    -  -
    -  -   http://www.apache.org/licenses/LICENSE-2.0
    -  -
    -  - Redistribution and use in source and binary forms, with or without
    -  - modification, are permitted provided that the following conditions are met:
    -  -
    -  - . Redistributions of source code must retain the above copyright notice, this
    -  -   list of conditions and the following disclaimer.
    -  -
    -  - . Redistributions in binary form must reproduce the above copyright notice,
    -  -   this list of conditions and the following disclaimer in the documentation
    -  -   and/or other materials provided with the distribution.
    -  -
    -  - . Neither the name "jOOQ" nor the names of its contributors may be
    -  -   used to endorse or promote products derived from this software without
    -  -   specific prior written permission.
    -  -
    -  - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    -  - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    -  - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    -  - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
    -  - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
    -  - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
    -  - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
    -  - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
    -  - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
    -  - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
    -  - POSSIBILITY OF SUCH DAMAGE.
    -  -->
    -<manual>
    -	<section id="manual">
    -		<title>The jOOQ User Manual. Multiple Pages</title>
    -		<content><html>
    -			<h2 id="Overview"><a href="#Overview" name="Overview">#</a> Overview</h2>
    -			<p>This manual is divided into six main sections:</p>
    -
    -			<ul>
    -				<li>
    -					<reference id="getting-started"/>
    -					<p>
    -						This section will get you started with jOOQ quickly. It contains
    -						simple explanations about what jOOQ is, what jOOQ isn't and how
    -						to set it up for the first time
    -					</p>
    -				</li>
    -				<li>
    -					<reference id="sql-building"/>
    -					<p>
    -						This section explains all about the jOOQ syntax used for building
    -						queries. It explains the central factories, the supported SQL
    -						statements and various other syntax elements
    -					</p>
    -				</li>
    -				<li>
    -					<reference id="code-generation"/>
    -					<p>
    -						This section explains how to configure and use the built-in source code
    -						generator
    -					</p>
    -				</li>
    -				<li>
    -					<reference id="sql-execution"/>
    -					<p>
    -						This section will get you through the specifics of what can be done
    -						with jOOQ at runtime, in order to execute queries, perform CRUD
    -						operations, import and export data, and hook into the jOOQ execution
    -						lifecycle for debugging
    -					</p>
    -				</li>
    -				<li>
    -					<reference id="tools"/>
    -					<p>
    -						This section is dedicated to tools that ship with jOOQ, such as the
    -						jOOQ console
    -					</p>
    -				</li>
    -				<li>
    -					<reference id="reference"/>
    -					<p>
    -						This section is a reference for elements in this manual
    -					</p>
    -				</li>
    -			</ul>
    -		</html></content>
    -
    -		<sections>
    -			<section id="preface">
    -				<title>Preface</title>
    -				<content><html>
    -					<h3>jOOQ's reason for being - compared to JPA</h3>
    -					<p>
    -						Java and SQL have come a long way. SQL is an "ancient", yet established and well-understood technology. Java is a legacy too, although its platform JVM allows for many new and contemporary languages built on top of it. Yet, after all these years, libraries dealing with the interface between SQL and Java have come and gone, leaving JPA to be a standard that is accepted only with doubts, short of any surviving options.
    -					</p>
    -					<p>
    -						So far, there had been only few database abstraction frameworks or libraries, that truly respected SQL as a first class citizen among languages. Most frameworks, including the industry standards JPA, EJB, Hibernate, JDO, Criteria Query, and many others try to hide SQL itself, minimising its scope to things called JPQL, HQL, JDOQL and various other inferior query languages
    -					</p>
    -					<p>
    -						jOOQ has come to fill this gap.
    -					</p>
    -
    -					<h3>jOOQ's reason for being - compared to LINQ</h3>
    -					<p>
    -						Other platforms incorporate ideas such as LINQ (with LINQ-to-SQL), or Scala's SLICK, or also Java's QueryDSL to better integrate querying as a concept into their respective language. By querying, they understand querying of arbitrary targets, such as SQL, XML, Collections and other heterogeneous data stores. jOOQ claims that this is going the wrong way too.
    -					</p>
    -					<p>
    - 						In more advanced querying use-cases (more than simple CRUD and the occasional JOIN), people will want to profit from the expressivity of SQL. Due to the relational nature of SQL, this is quite different from what object-oriented and partially functional languages such as C#, Scala, or Java can offer.
    - 					</p>
    - 					<p>
    - 						It is very hard to formally express and validate joins and the ad-hoc table expression types they create. It gets even harder when you want support for more advanced table expressions, such as pivot tables, unnested cursors, or just arbitrary projections from derived tables. With a very strong object-oriented typing model, these features will probably stay out of scope.
    - 					</p>
    - 					<p>
    - 						In essence, the decision of creating an API that looks like SQL or one that looks like C#, Scala, Java is a definite decision in favour of one or the other platform. While it will be easier to evolve SLICK in similar ways as LINQ (or QueryDSL in the Java world), SQL feature scope that clearly communicates its underlying intent will be very hard to add, later on (e.g. how would you model Oracle's partitioned outer join syntax? How would you model ANSI/ISO SQL:1999 grouping sets? How can you support scalar subquery caching? etc...).					
    -					</p>
    -					<p>
    -						jOOQ has come to fill this gap.
    -					</p>
    -					
    -					<h3>jOOQ's reason for being - compared to SQL / JDBC</h3>
    -					<p>
    -						So why not just use SQL?
    -					</p> 
    -					<p>
    -						SQL can be written as plain text and passed through the JDBC API. Over the years, people have become wary of this approach for many reasons:
    -					</p>
    -					<ul>
    -						<li>No typesafety</li>
    -						<li>No syntax safety</li>
    -						<li>No bind value index safety</li>
    -						<li>Verbose SQL String concatenation</li>
    -						<li>Boring bind value indexing techniques</li>
    -						<li>Verbose resource and exception handling in JDBC</li>
    -						<li>A very "stateful", not very object-oriented JDBC API, which is hard to use</li>
    -					</ul>
    -					<p>
    -						For these many reasons, other frameworks have tried to abstract JDBC away in the past in one way or another. Unfortunately, many have completely abstracted SQL away as well
    -					</p>
    -					<p>
    -						jOOQ has come to fill this gap.
    -					</p>					
    -					
    -					<h3>jOOQ is different</h3>
    -					<p>
    -						SQL was never meant to be abstracted. To be confined in the narrow boundaries of heavy mappers, hiding the beauty and simplicity of relational data. SQL was never meant to be object-oriented. SQL was never meant to be anything other than... SQL!
    -					</p>					
    -				</html></content>
    -			</section>
    -			
    -			<section id="copyright">
    -				<title>Copyright, License, and Trademarks</title>
    -				<content><html>
    -                    <p>
    -                        This section lists the various licenses that apply to different versions of jOOQ. Prior to version 3.2, jOOQ was shipped for free under the terms of the <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache Software License 2.0</a>. With jOOQ 3.2, jOOQ became dual-licensed: <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache Software License 2.0</a> (for use with Open Source databases) and <a href="http://www.jooq.org/licensing">commercial</a> (for use with commercial databases). Please contact <a href="mailto:sales@datageekery.com">sales@datageekery.com</a>, should you have any questions regarding licensing.
    -                    </p>
    -                    <h3>License for jOOQ 1.x, 2.x, 3.0, 3.1</h3>
    -                    
    -</html><text>Copyright (c) 2009-2013, Lukas Eder, lukas.eder@gmail.com
    -All rights reserved.
    -
    -This software is licensed to you under the Apache License, Version 2.0
    -(the "License"); You may obtain a copy of the License at
    -
    -  http://www.apache.org/licenses/LICENSE-2.0
    -
    -Redistribution and use in source and binary forms, with or without
    -modification, are permitted provided that the following conditions are met:
    -
    -. Redistributions of source code must retain the above copyright notice, this
    -  list of conditions and the following disclaimer.
    -
    -. Redistributions in binary form must reproduce the above copyright notice,
    -  this list of conditions and the following disclaimer in the documentation
    -  and/or other materials provided with the distribution.
    -
    -. Neither the name "jOOQ" nor the names of its contributors may be
    -  used to endorse or promote products derived from this software without
    -  specific prior written permission.
    -
    -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
    -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
    -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
    -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
    -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
    -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
    -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
    -POSSIBILITY OF SUCH DAMAGE.</text><html>
    -
    -                    <h3>License for jOOQ 3.2 and later</h3>
    -                    
    -</html><text>Copyright (c) 2009-2013, Data Geekery GmbH (http://www.datageekery.com)
    -All rights reserved.
    -
    -This work is dual-licensed
    -- under the Apache Software License 2.0 (the "ASL")
    -- under the jOOQ License and Maintenance Agreement (the "jOOQ License")
    -=============================================================================
    -You may choose which license applies to you:
    -
    -- If you're using this work with Open Source databases, you may choose
    -  either ASL or jOOQ License.
    -- If you're using this work with at least one commercial database, you must
    -  choose jOOQ License
    -
    -For more information, please visit http://www.jooq.org/licenses
    -
    -Apache Software License 2.0:
    ------------------------------------------------------------------------------
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    - http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -
    -jOOQ License and Maintenance Agreement:
    ------------------------------------------------------------------------------
    -Data Geekery grants the Customer the non-exclusive, timely limited and
    -non-transferable license to install and use the Software under the terms of
    -the jOOQ License and Maintenance Agreement.
    -
    -This library is distributed with a LIMITED WARRANTY. See the jOOQ License
    -and Maintenance Agreement for more details: http://www.jooq.org/licensing</text><html>
    -
    -                    <h3>Trademarks owned by Data Geekeryâ„¢ GmbH</h3>
    -                    <ul>
    -                        <li>jOOQâ„¢ is a trademark by Data Geekeryâ„¢ GmbH</li>
    -                        <li>jOOXâ„¢ is a trademark by Data Geekeryâ„¢ GmbH</li>
    -                        <li>jOORâ„¢ is a trademark by Data Geekeryâ„¢ GmbH</li>
    -                        <li>jOOUâ„¢ is a trademark by Data Geekeryâ„¢ GmbH</li>
    -                    </ul>
    -                    
    -                    <h3>Trademarks owned by database vendors with no affiliation to Data Geekeryâ„¢ GmbH</h3>
    -                    <ul>
    -                        <li>Access® is a registered trademark of Microsoft® Inc.</li>
    -                        <li>Adaptive Server® Enterprise is a registered trademark of Sybase®, Inc.</li>
    -                        <li>CUBRID™ is a trademark of NHN® Corp.</li>
    -                        <li>DB2® is a registered trademark of IBM® Corp.</li>
    -                        <li>Derby is a trademark of the Apacheâ„¢ Software Foundation</li>
    -                        <li>H2 is a trademark of the H2 Group</li>
    -                        <li>HSQLDB is a trademark of The hsql Development Group</li>
    -                        <li>Ingres is a trademark of Actianâ„¢ Corp.</li>
    -                        <li>MariaDB is a trademark of Monty Program Ab</li>
    -                        <li>MySQL® is a registered trademark of Oracle® Corp.</li>
    -                        <li>Firebird® is a registered trademark of Firebird Foundation Inc.</li>
    -                        <li>Oracle® database is a registered trademark of Oracle® Corp.</li>
    -                        <li>PostgreSQL® is a registered trademark of The PostgreSQL Global Development Group</li>
    -                        <li>Postgres Plus® is a registered trademark of EnterpriseDB® software</li>
    -                        <li>SQL Anywhere® is a registered trademark of Sybase®, Inc.</li>
    -                        <li>SQL Server® is a registered trademark of Microsoft® Inc.</li>
    -                        <li>SQLite is a trademark of Hipp, Wyrick &amp; Company, Inc.</li>
    -                    </ul>
    -                    
    -                    <h3>Other trademarks by vendors with no affiliation to Data Geekeryâ„¢ GmbH</h3>
    -                    <ul>
    -                        <li>Java® is a registered trademark by Oracle® Corp. and/or its affiliates</li>
    -                        <li>Scala is a trademark of EPFL</li>
    -                    </ul>
    -                    
    -                    <h3>Other trademark remarks</h3>
    -                    <p>
    -                        Other names may be trademarks of their respective owners.
    -                    </p>
    -                    
    -                    <p>
    -                        Throughout the manual, the above trademarks are referenced without a formal ® (R) or ™ (TM) symbol. It is believed that referencing third-party trademarks in this manual or on the jOOQ website constitutes "fair use". Please <a href="mailto:contact@datageekery.com">contact us</a> if you think that your trademark(s) are not properly attributed.
    -                    </p>
    -				</html></content>
    -			</section>
    -			
    -			<section id="getting-started">
    -				<title>Getting started with jOOQ</title>
    -				<content><html>
    -					<p>
    -						These chapters contain a quick overview of how to get started with this manual and with jOOQ. While the subsequent chapters contain a lot of reference information, this chapter here just wraps up the essentials.
    -					</p>
    -				</html></content>
    -
    -				<sections>
    -					<section id="the-manual">
    -					    <title>How to read this manual</title>
    -						<content><html>
    -							<p>
    -								This section helps you correctly interpret this manual in the context of jOOQ.
    -							</p>
    -							
    -							<h3>Code blocks</h3>
    -							<p>
    -								The following are code blocks:
    -							</p>
    -							
    -</html><sql><![CDATA[-- A SQL code block
    -SELECT 1 FROM DUAL]]></sql><java><![CDATA[// A Java code block
    -for (int i = 0; i < 10; i++);]]></java><xml><![CDATA[<!-- An XML code block -->
    -<hello what="world"></hello>]]></xml><config><![CDATA[# A config file code block
    -org.jooq.property=value]]></config><html>		
    -
    -							<p>
    -								These are useful to provide examples in code. Often, with jOOQ, it is even more useful to compare SQL code with its corresponding Java/jOOQ code. When this is done, the blocks are aligned side-by-side, with SQL usually being on the left, and Java usually being on the right:
    -							</p>					
    -							
    -</html><code-pair>
    -<sql><![CDATA[-- In SQL:
    -SELECT 1 FROM DUAL]]></sql><java><![CDATA[// Using jOOQ:
    -create.selectOne()]]></java>
    -</code-pair><html>
    -
    -							<h3>Code block contents</h3>
    -							<p>
    -								The contents of code blocks follow conventions, too. If nothing else is mentioned next to any given code block, then the following can be assumed:
    -							</p>
    -							
    -							
    -</html><sql><![CDATA[-- SQL assumptions
    -------------------
    -
    --- If nothing else is specified, assume that the Oracle syntax is used 
    -SELECT 1 FROM DUAL]]></sql><java><![CDATA[// Java assumptions
    -// ----------------
    - 
    -// Whenever you see "standalone functions", assume they were static imported from org.jooq.impl.DSL 
    -exists(); max(); min(); val(); inline(); // correspond to DSL.exists(); DSL.max(); DSL.min(); etc...
    -
    -// Whenever you see BOOK/Book, AUTHOR/Author and similar entities, assume they were (static) imported from the generated schema
    -BOOK.TITLE, AUTHOR.LAST_NAME // correspond to com.example.generated.Tables.BOOK.TITLE, com.example.generated.Tables.BOOK.TITLE
    -
    -// Whenever you see "create" being used in Java code, assume that this is an instance of org.jooq.DSLContext.
    -// The reason why it is called "create" is the fact, that a jOOQ QueryPart is being created from the DSL object:
    -DSLContext create = DSL.using(connection, SQLDialect.ORACLE);]]></java><html>
    -
    -                            <p>
    -                                Your naming may differ, of course. For instance, you could name the "create" instance "db", instead.
    -                            </p>
    -
    -							<h3>Degree (arity)</h3>
    -							<p>
    -							    jOOQ records (and many other API elements) have a degree N between 1 and {max-row-degree}. The variable degree of an API element is denoted as [N], e.g. Row[N] or Record[N]. The term "degree" is preferred over arity, as "degree" is the term used in the SQL standard, whereas "arity" is used more often in mathematics and relational theory.
    -							</p>
    -
    -							<h3>Settings</h3>
    -							<p>
    -								jOOQ allows to override runtime behaviour using <reference class="org.jooq.conf.Settings"/>. If nothing is specified, the default runtime settings are assumed.
    -							</p>
    -							
    -							<h3>Sample database</h3>
    -							<p>
    -								jOOQ query examples run against the sample database. See the manual's section about <reference id="sample-database" title="the sample database used in this manual"/> to learn more about the sample database.
    -							</p>
    -						</html></content>
    -					</section>
    -
    -					<section id="sample-database">
    -					    <title>The sample database used in this manual</title>
    -						<content><html>
    -							<p>
    -							For the examples in this manual, the same database will always be referred to. It essentially consists of these entities created using the Oracle dialect
    -							</p>
    -</html><sql>CREATE TABLE language (
    -  id              NUMBER(7)     NOT NULL PRIMARY KEY,
    -  cd              CHAR(2)       NOT NULL,
    -  description     VARCHAR2(50)
    -)
    -
    -CREATE TABLE author (
    -  id              NUMBER(7)     NOT NULL PRIMARY KEY,
    -  first_name      VARCHAR2(50),
    -  last_name       VARCHAR2(50)  NOT NULL,
    -  date_of_birth   DATE,
    -  year_of_birth   NUMBER(7),
    -  distinguished   NUMBER(1)
    -)
    -
    -CREATE TABLE book (
    -  id              NUMBER(7)     NOT NULL PRIMARY KEY,
    -  author_id       NUMBER(7)     NOT NULL,
    -  title           VARCHAR2(400) NOT NULL,
    -  published_in    NUMBER(7)     NOT NULL,
    -  language_id     NUMBER(7)     NOT NULL,
    -  
    -  CONSTRAINT fk_book_author     FOREIGN KEY (author_id)   REFERENCES author(id),
    -  CONSTRAINT fk_book_language   FOREIGN KEY (language_id) REFERENCES language(id)
    -)
    -
    -CREATE TABLE book_store (
    -  name            VARCHAR2(400) NOT NULL UNIQUE
    -)
    -
    -CREATE TABLE book_to_book_store (
    -  name            VARCHAR2(400) NOT NULL,
    -  book_id         INTEGER       NOT NULL,
    -  stock           INTEGER,
    -  
    -  PRIMARY KEY(name, book_id),
    -  CONSTRAINT fk_b2bs_book_store FOREIGN KEY (name)        REFERENCES book_store (name) ON DELETE CASCADE,
    -  CONSTRAINT fk_b2bs_book       FOREIGN KEY (book_id)     REFERENCES book (id)         ON DELETE CASCADE
    -)</sql><html>
    -							<p>
    -								More entities, types (e.g. UDT's, ARRAY types, ENUM types, etc), stored procedures and packages are introduced for specific examples
    -							</p>
    -						</html></content>
    -					</section>
    -
    -					<section id="use-cases">
    -						<title>Different use cases for jOOQ</title>
    -						<content><html>
    -							<p>
    -								jOOQ has originally been created as a library for complete abstraction of JDBC and all database interaction. Various best practices that are frequently encountered in pre-existing software products are applied to this library. This includes:
    -							</p>
    -							<ul>
    -								<li>Typesafe database object referencing through generated schema, table, column, record, procedure, type, dao, pojo artefacts (see the chapter about <reference id="code-generation" title="code generation"/>)</li>
    -								<li>Typesafe SQL construction through a complete API modelling SQL as a domain specific language in Java (see the chapter about <reference id="dsl-and-non-dsl" title="the DSL API"/>)</li>
    -								<li>Convenient query execution through an improved API for result fetching (see the chapters about <reference id="fetching" title="the various types of data fetching"/>)</li>
    -								<li>SQL dialect abstraction and SQL clause simulation to improve cross-database compatibility and to enable missing features in simpler databases (see the chapter about <reference id="sql-dialects" title="SQL dialects"/>)</li>
    -								<li>SQL logging and debugging using jOOQ as an integral part of your development process (see the chapters about <reference id="logging" title="logging"/> and about the <reference id="jooq-console" title="jOOQ Console"/>)</li>
    -							</ul>
    -							<p>
    -								Effectively, jOOQ was originally designed to replace any other database abstraction framework short of the ones handling connection pooling and transaction management (see also the <reference id="reference-credits" title="credits for other database abstraction libraries"/>)
    -							</p>
    -							
    -							<h3>Use jOOQ the way you prefer</h3>
    -							<p>
    -								... but open source is community-driven. And the community has shown various ways of using jOOQ that diverge from its original intent. Some use cases encountered are:
    -							</p>
    -							<ul>
    -								<li>Using Hibernate for 70% of the queries (i.e. <reference id="crud-with-updatablerecords" title="CRUD"/>) and jOOQ for the remaining 30% where SQL is really needed</li>
    -								<li>Using jOOQ for SQL building and JDBC for SQL execution</li> 
    -								<li>Using jOOQ for SQL building and Spring Data for SQL execution</li>
    -								<li>Using jOOQ without the <reference id="code-generation" title="source code generator"/> to build the basis of a framework for dynamic SQL execution.</li> 
    -							</ul>
    -							
    -							<p>
    -								The following sections explain about various use cases for using jOOQ in your application.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="jooq-as-a-standalone-sql-builder">
    -								<title>jOOQ as a SQL builder</title>
    -								<content><html>
    -									<p>
    -										This is the most simple of all use cases, allowing for construction of valid SQL for any database. In this use case, you will not use <reference id="jooq-as-a-sql-builder-with-code-generation" title="jOOQ's code generator"/> and probably not even <reference id="jooq-as-a-sql-executor" title="jOOQ's query execution facilities"/>. Instead, you'll use jOOQ to wrap strings, literals and other user-defined objects into an object-oriented, type-safe AST modelling your SQL statements. An example is given here: 
    -									</p>
    -									
    -</html><java><![CDATA[// Fetch a SQL string from a jOOQ Query in order to manually execute it with another tool.
    -String sql = create.select(fieldByName("BOOK","TITLE"), fieldByName("AUTHOR","FIRST_NAME"), fieldByName("AUTHOR","LAST_NAME"))
    -                   .from(tableByName("BOOK"))
    -                   .join(tableByName("AUTHOR"))
    -                   .on(fieldByName("BOOK", "AUTHOR_ID").equal("AUTHOR", "ID"))
    -                   .where(fieldByName("BOOK", "PUBLISHED_IN").equal(1948))
    -                   .getSQL();]]></java><html>
    -                   
    -                   					<p>
    -                   						The SQL string that you can generate as such can then be executed using JDBC directly, using Spring's JdbcTemplate, using Apache DbUtils and many other tools.
    -                   					</p>
    -                   					<p>
    -                   						If you wish to use jOOQ only as a SQL builder, the following sections of the manual will be of interest to you:
    -                  					</p>
    -                  					<ul>
    -                  						<li><reference id="sql-building" title="SQL building"/>: This section contains a lot of information about creating SQL statements using the jOOQ API</li>
    -                  						<li><reference id="plain-sql" title="Plain SQL"/>: This section contains information useful in particular to those that want to supply <reference id="table-expressions" title="table expressions"/>, <reference id="column-expressions" title="column expressions"/>, etc. as plain SQL to jOOQ, rather than through generated artefacts</li>
    -                  					</ul>
    -								</html></content>
    -							</section>
    -
    -							<section id="jooq-as-a-sql-builder-with-code-generation">
    -								<title>jOOQ as a SQL builder with code generation</title>
    -								<content><html>
    -									<p>
    -										In addition to using jOOQ as a <reference id="jooq-as-a-standalone-sql-builder" title="standalone SQL builder"/>, you can also use jOOQ's code generation features in order to compile your SQL statements using a Java compiler against an actual database schema. This adds a lot of power and expressiveness to just simply constructing SQL using custom strings and literals, as you can be sure that all database artefacts actually exist in the database, and that their type is correct. An example is given here: 
    -									</p>
    -
    -</html><java><![CDATA[// Fetch a SQL string from a jOOQ Query in order to manually execute it with another tool.
    -String sql = create.select(BOOK.TITLE, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -                   .from(BOOK)
    -                   .join(AUTHOR)
    -                   .on(BOOK.AUTHOR_ID.equal(AUTHOR.ID))
    -                   .where(BOOK.PUBLISHED_IN.equal(1948))
    -                   .getSQL();]]></java><html>
    -                   
    -                   					<p>
    -                   						The SQL string that you can generate as such can then be executed using JDBC directly, using Spring's JdbcTemplate, using Apache DbUtils and many other tools.
    -                   					</p>
    -                   					<p>
    -                   						If you wish to use jOOQ only as a SQL builder with code generation, the following sections of the manual will be of interest to you:
    -                  					</p>
    -                  					<ul>
    -                  						<li><reference id="sql-building" title="SQL building"/>: This section contains a lot of information about creating SQL statements using the jOOQ API</li>
    -                  						<li><reference id="code-generation" title="Code generation"/>: This section contains the necessary information to run jOOQ's code generator against your developer database</li>
    -                  					</ul>
    -								</html></content>
    -							</section>
    -
    -							<section id="jooq-as-a-sql-executor">
    -								<title>jOOQ as a SQL executor</title>
    -								<content><html>
    -									<p>
    -										Instead of any tool mentioned in the previous chapters, you can also use jOOQ directly to execute your jOOQ-generated SQL statements. This will add a lot of convenience on top of the previously discussed API for typesafe SQL construction, when you can re-use the information from generated classes to fetch records and custom data types. An example is given here:
    -									</p>
    -									
    -</html><java><![CDATA[// Typesafely execute the SQL statement directly with jOOQ
    -Result<Record3<String, String, String>> result = 
    -create.select(BOOK.TITLE, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -      .from(BOOK)
    -      .join(AUTHOR)
    -      .on(BOOK.AUTHOR_ID.equal(AUTHOR.ID))
    -      .where(BOOK.PUBLISHED_IN.equal(1948))
    -      .fetch();]]></java><html>
    -
    -									<p>
    -										jOOQ doesn't stop here, though! You can execute any SQL with jOOQ. In other words, you can use any other SQL building tool and run the SQL statements with jOOQ. An example is given here:
    -									</p>
    -
    -</html><java><![CDATA[// Use your favourite tool to construct SQL strings:
    -String sql = "SELECT title, first_name, last_name FROM book JOIN author ON book.author_id = author.id " +
    -             "WHERE book.published_in = 1984";
    -
    -// Fetch results using jOOQ
    -Result<Record> result = create.fetch(sql);
    -
    -// Or execute that SQL with JDBC, fetching the ResultSet with jOOQ:
    -ResultSet rs = connection.createStatement().executeQuery(sql);
    -Result<Record> result = create.fetch(rs);]]></java><html>
    -
    -									<p>
    -                   						If you wish to use jOOQ as a SQL executor with (or without) code generation, the following sections of the manual will be of interest to you:
    -                  					</p>
    -                  					<ul>
    -                  						<li><reference id="sql-building" title="SQL building"/>: This section contains a lot of information about creating SQL statements using the jOOQ API</li>
    -                  						<li><reference id="code-generation" title="Code generation"/>: This section contains the necessary information to run jOOQ's code generator against your developer database</li>
    -                  						<li><reference id="sql-execution" title="SQL execution"/>: This section contains a lot of information about executing SQL statements using the jOOQ API</li>
    -                  						<li><reference id="fetching"/>: This section contains some useful information about the various ways of fetching data with jOOQ</li>
    -                  					</ul>
    -								</html></content>
    -							</section>
    -
    -							<section id="jooq-for-crud">
    -								<title>jOOQ for CRUD</title>
    -								<content><html>
    -									<p>
    -										This is probably the most complete use-case for jOOQ: Use all of jOOQ's features. Apart from jOOQ's fluent API for query construction, jOOQ can also help you execute everyday CRUD operations. An example is given here:
    -									</p>
    -
    -</html><java><![CDATA[// Fetch all authors
    -for (AuthorRecord author : create.fetch(AUTHOR)) {
    -
    -    // Skip previously distinguished authors  
    -    if ((int) author.getDistinguished() == 1)
    -        continue;
    -  
    -    // Check if the author has written more than 5 books
    -    if (author.fetchChildren(FK_BOOK_AUTHOR).size() > 5) {
    -    
    -        // Mark the author as a "distinguished" author
    -        author.setDistinguished(1);
    -        author.store();
    -    }
    -}]]></java><html>
    -
    -									<p>
    -                   						If you wish to use all of jOOQ's features, the following sections of the manual will be of interest to you (including all sub-sections):
    -                  					</p>
    -                  					<ul>
    -                  						<li><reference id="sql-building" title="SQL building"/>: This section contains a lot of information about creating SQL statements using the jOOQ API</li>
    -                  						<li><reference id="code-generation" title="Code generation"/>: This section contains the necessary information to run jOOQ's code generator against your developer database</li>
    -                  						<li><reference id="sql-execution" title="SQL execution"/>: This section contains a lot of information about executing SQL statements using the jOOQ API</li>
    -                  					</ul>
    -								</html></content>
    -							</section>
    -							
    -							<section id="jooq-for-pros">
    -								<title>jOOQ for PROs</title>
    -								<content><html>
    -									<p>
    -										jOOQ isn't just a library that helps you <reference id="sql-building" title="build"/> and <reference id="sql-execution" title="execute"/> SQL against your <reference id="code-generation" title="generated, compilable schema"/>. jOOQ ships with a lot of tools. Here are some of the most important tools shipped with jOOQ:
    -									</p>
    -									<ul>
    -										<li><reference id="jooq-console" title="jOOQ Console"/>: This small application hooks into jOOQ's execute listener support to allow for tracing, debugging and introspecting any SQL statement executed through the jOOQ API. This includes setting breakpoints, introspecting bind values, running probe SQL statements, ad-hoc patching of SQL, measuring execution times, exporting stack traces. Use this tool to better know your SQL!</li>
    -										<li><reference id="execute-listeners" title="jOOQ's Execute Listeners"/>: jOOQ allows you to hook your custom execute listeners into jOOQ's SQL statement execution lifecycle in order to centrally coordinate any arbitrary operation performed on SQL being executed. Use this for logging, identity generation, SQL tracing, performance measurements, etc.</li>
    -										<li><reference id="logging" title="Logging"/>: jOOQ has a standard DEBUG logger built-in, for logging and tracing all your executed SQL statements and fetched result sets</li>
    -										<li><reference id="stored-procedures" title="Stored Procedures"/>: jOOQ supports stored procedures and functions of your favourite database. All routines and user-defined types are generated and can be included in jOOQ's SQL building API as function references.</li>
    -										<li><reference id="batch-execution" title="Batch execution"/>: Batch execution is important when executing a big load of SQL statements. jOOQ simplifies these operations compared to JDBC</li>
    -										<li><reference id="exporting" title="Exporting"/> and <reference id="importing" title="Importing"/>: jOOQ ships with an API to easily export/import data in various formats</li>
    -									</ul>
    -									<p>
    -										If you're a power user of your favourite, feature-rich database, jOOQ will help you access all of your database's vendor-specific features, such as OLAP features, stored procedures, user-defined types, vendor-specific SQL, functions, etc. Examples are given throughout this manual.
    -									</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -					<section id="tutorials">
    -						<title>Tutorials</title>
    -						<content><html>
    -							<p>
    -								Don't have time to read the full manual? Here are a couple of tutorials that will get you into the most essential parts of jOOQ as quick as possible.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="jooq-in-7-steps">
    -								<title>jOOQ in 7 easy steps</title>
    -								<content><html>
    -									<p>
    -										This manual section is intended for new users, to help them get a running application with jOOQ, quickly.
    -									</p>
    -								</html></content>
    -								
    -								<sections>
    -									<section id="jooq-in-7-steps-step1">
    -										<title>Step 1: Preparation</title>
    -										<content><html>
    -											<p>
    -												If you haven't already downloaded it, download jOOQ:<br/>
    -												<a href="https://sourceforge.net/projects/jooq/files/Release/" title="jOOQ download">https://sourceforge.net/projects/jooq/files/Release/</a>
    -											</p>
    -											
    -											<p>
    -												Alternatively, you can create a Maven dependency to download jOOQ artefacts:
    -											</p>
    -</html><xml><![CDATA[<dependency>
    -  <groupId>org.jooq</groupId>
    -  <artifactId>jooq</artifactId>
    -  <version>{jooq-version}</version>
    -</dependency>
    -<dependency>
    -  <groupId>org.jooq</groupId>
    -  <artifactId>jooq-meta</artifactId>
    -  <version>{jooq-version}</version>
    -</dependency>
    -<dependency>
    -  <groupId>org.jooq</groupId>
    -  <artifactId>jooq-codegen</artifactId>
    -  <version>{jooq-version}</version>
    -</dependency>]]></xml><html>
    -
    -											<p>
    -												Please refer to the manual's section about <reference id="codegen-configuration" title="Code generation configuration"/> to learn how to use jOOQ's code generator with Maven.
    -											</p>
    -
    -											<p>
    -												For this example, we'll be using MySQL. If you haven't already downloaded MySQL Connector/J, download it here:<br/>
    -												<a href="http://dev.mysql.com/downloads/connector/j/" target="_blank" title="MySQL JDBC driver">http://dev.mysql.com/downloads/connector/j/</a>
    -											</p>
    -
    -											<p>
    -												If you don't have a MySQL instance up and running yet, get <a href="http://www.apachefriends.org/en/xampp.html" title="XAMPP">XAMPP</a> now! XAMPP is a simple installation bundle for Apache, MySQL, PHP and Perl
    -											</p>
    -										</html></content>
    -									</section>
    -									
    -									<section id="jooq-in-7-steps-step2">
    -										<title>Step 2: Your database</title>
    -										<content><html>
    -											<p>
    -												We're going to create a database called "guestbook" and a corresponding "posts" table. Connect to MySQL via your command line client and type the following:
    -											</p>
    -											
    -</html><sql>CREATE DATABASE guestbook;
    -
    -CREATE TABLE `posts` (
    -  `id` bigint(20) NOT NULL,
    -  `body` varchar(255) DEFAULT NULL,
    -  `timestamp` datetime DEFAULT NULL,
    -  `title` varchar(255) DEFAULT NULL,
    -  PRIMARY KEY (`id`)
    -);
    -</sql></content>
    -									</section>
    -									
    -									<section id="jooq-in-7-steps-step3">
    -										<title>Step 3: Code generation</title>
    -										<content><html>
    -											<p>
    -												In this step, we're going to use jOOQ's command line tools to generate classes that map to the Posts table we just created. More detailed information about how to set up the jOOQ code generator can be found here:<br/>
    -												<reference id="code-generation" title="jOOQ manual pages about setting up the code generator"/>
    -											</p>
    -
    -											<p>
    -												The easiest way to generate a schema is to copy the jOOQ jar files (there should be 3) and the MySQL Connector jar file to a temporary directory. Then, create a guestbook.xml that looks like this:
    -											</p>
    -											
    -</html><xml><![CDATA[<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    -<configuration xmlns="http://www.jooq.org/xsd/jooq-codegen-{codegen-xsd-version}.xsd">
    -  <!-- Configure the database connection here -->
    -  <jdbc>
    -    <driver>com.mysql.jdbc.Driver</driver>
    -    <url>jdbc:mysql://localhost:3306/guestbook</url>
    -    <user>root</user>
    -    <password></password>
    -  </jdbc>
    -
    -  <generator>
    -    <!-- The default code generator. You can override this one, to generate your own code style
    -         Defaults to org.jooq.util.DefaultGenerator -->
    -    <name>org.jooq.util.DefaultGenerator</name>
    -
    -    <database>
    -      <!-- The database type. The format here is:
    -           org.util.[database].[database]Database -->
    -      <name>org.jooq.util.mysql.MySQLDatabase</name>
    -
    -      <!-- The database schema (or in the absence of schema support, in your RDBMS this
    -           can be the owner, user, database name) to be generated -->
    -      <inputSchema>guestbook</inputSchema>
    -
    -      <!-- All elements that are generated from your schema 
    -           (A Java regular expression. Use the pipe to separate several expressions)
    -           Watch out for case-sensitivity. Depending on your database, this might be important! -->
    -      <includes>.*</includes>
    -
    -      <!-- All elements that are excluded from your schema 
    -           (A Java regular expression. Use the pipe to separate several expressions).
    -           Excludes match before includes -->
    -      <excludes></excludes>
    -    </database>
    -
    -    <target>
    -      <!-- The destination package of your generated classes (within the destination directory) -->
    -      <packageName>test.generated</packageName>
    -
    -      <!-- The destination directory of your generated classes -->
    -      <directory>C:/workspace/MySQLTest/src</directory>
    -    </target>
    -  </generator>
    -</configuration>]]></xml><html>
    -											<p>
    -												Replace the username with whatever user has the appropriate privileges to query the database meta data. You'll also want to look at the other values and replace as necessary. Here are the two interesting properties:
    -											</p>
    -											<p>
    -												<code>generator.target.package</code> - set this to the parent package you want to create for the generated classes. The setting of <code>test.generated</code> will cause the <code>test.generated.Posts</code> and <code>test.generated.PostsRecord</code> to be created
    -											</p>
    -											<p>
    -												<code>generator.target.directory</code> - the directory to output to.
    -											</p>
    -											
    -											<p>
    -												Once you have the JAR files and guestbook.xml in your temp directory, type this (use colons instead of semi-colons on UNIX/Linux systems):
    -											</p>
    -
    -</html><text>java -classpath jooq-{jooq-version}.jar;jooq-meta-{jooq-version}.jar;jooq-codegen-{jooq-version}.jar;mysql-connector-java-5.1.18-bin.jar;. 
    -  org.jooq.util.GenerationTool /guestbook.xml
    -</text><html>
    -
    -											<p>
    -												Note the prefix slash before guestbook.xml. Even though it's in our working directory, we need to prepend a slash, as the configuration file is loaded from the classpath. Replace the filenames with your filenames. In this example, jOOQ {jooq-version} is being used. If everything has worked, you should see this in your console output:
    -											</p>
    -
    -</html><text>Nov 1, 2011 7:25:06 PM org.jooq.impl.JooqLogger info
    -INFO: Initialising properties  : /guestbook.xml
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Database parameters
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: ----------------------------------------------------------
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO:   dialect                : MYSQL
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO:   schema                 : guestbook
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO:   target dir             : C:/workspace/MySQLTest/src
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO:   target package         : test.generated
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: ----------------------------------------------------------
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Emptying                 : C:/workspace/MySQLTest/src/test/generated
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Generating classes in    : C:/workspace/MySQLTest/src/test/generated
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Generating schema        : Guestbook.java
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Schema generated         : Total: 122.18ms
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Sequences fetched        : 0 (0 included, 0 excluded)
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Tables fetched           : 5 (5 included, 0 excluded)
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Generating tables        : C:/workspace/MySQLTest/src/test/generated/tables
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: ARRAYs fetched           : 0 (0 included, 0 excluded)
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Enums fetched            : 0 (0 included, 0 excluded)
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: UDTs fetched             : 0 (0 included, 0 excluded)
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Generating table         : Posts.java
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Tables generated         : Total: 680.464ms, +558.284ms
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Generating Keys          : C:/workspace/MySQLTest/src/test/generated/tables
    -Nov 1, 2011 7:25:08 PM org.jooq.impl.JooqLogger info
    -INFO: Keys generated           : Total: 718.621ms, +38.157ms
    -Nov 1, 2011 7:25:08 PM org.jooq.impl.JooqLogger info
    -INFO: Generating records       : C:/workspace/MySQLTest/src/test/generated/tables/records
    -Nov 1, 2011 7:25:08 PM org.jooq.impl.JooqLogger info
    -INFO: Generating record        : PostsRecord.java
    -Nov 1, 2011 7:25:08 PM org.jooq.impl.JooqLogger info
    -INFO: Table records generated  : Total: 782.545ms, +63.924ms
    -Nov 1, 2011 7:25:08 PM org.jooq.impl.JooqLogger info
    -INFO: Routines fetched         : 0 (0 included, 0 excluded)
    -Nov 1, 2011 7:25:08 PM org.jooq.impl.JooqLogger info
    -INFO: Packages fetched         : 0 (0 included, 0 excluded)
    -Nov 1, 2011 7:25:08 PM org.jooq.impl.JooqLogger info
    -INFO: GENERATION FINISHED!     : Total: 791.688ms, +9.143ms
    -</text></content>
    -									</section>
    -									
    -									<section id="jooq-in-7-steps-step4">
    -										<title>Step 4: Connect to your database</title>
    -										<content><html>
    -											<p>
    -												Let's just write a vanilla main class in the project containing the generated classes:
    -											</p>
    -											
    -</html><java><![CDATA[// For convenience, always static import your generated tables and jOOQ functions to decrease verbosity:
    -import static test.generated.Tables.*;
    -import static org.jooq.impl.DSL.*;
    -
    -public class Main {
    -    public static void main(String[] args) {
    -        Connection conn = null;
    -
    -        String userName = "root";
    -        String password = "";
    -        String url = "jdbc:mysql://localhost:3306/guestbook";
    -
    -        try {
    -            Class.forName("com.mysql.jdbc.Driver").newInstance();
    -            conn = DriverManager.getConnection(url, userName, password);
    -        } catch (Exception e) {
    -            // For the sake of this tutorial, let's keep exception handling simple
    -            e.printStackTrace();
    -        } finally {
    -            if (conn != null) {
    -                try {
    -                    conn.close();
    -                } catch (SQLException ignore) {
    -                }
    -            }
    -        }
    -    }
    -}]]></java><html>
    -
    -											<p>
    -												This is pretty standard code for establishing a MySQL connection.
    -											</p>
    -										</html></content>
    -									</section>
    -									
    -									<section id="jooq-in-7-steps-step5">
    -										<title>Step 5: Querying</title>
    -										<content><html>
    -											<p>
    -												Let's add a simple query:
    -											</p>
    -											
    -</html><java><![CDATA[DSLContext create = DSL.using(conn, SQLDialect.MYSQL);
    -Result<Record> result = create.select().from(POSTS).fetch();]]></java><html>
    -
    -											<p>
    -												First get an instance of <code>DSLContext</code> so we can write a simple <code>SELECT</code> query. We pass an instance of the MySQL connection to <code>DSL</code>. Note that the DSLContext doesn't close the connection. We'll have to do that ourselves.
    -											</p>
    -											<p>
    -												We then use jOOQ's DSL to return an instance of Result. We'll be using this result in the next step.
    -											</p>
    -										</html></content>
    -									</section>
    -									
    -									<section id="jooq-in-7-steps-step6">
    -										<title>Step 6: Iterating</title>
    -										<content><html>
    -											<p>
    -												After the line where we retrieve the results, let's iterate over the results and print out the data:
    -											</p>
    -
    -</html><java><![CDATA[for (Record r : result) {
    -    Long id = r.getValue(POSTS.ID);
    -    String title = r.getValue(POSTS.TITLE);
    -    String description = r.getValue(POSTS.BODY);
    -
    -    System.out.println("ID: " + id + " title: " + title + " desciption: " + description);
    -}]]></java><html>
    -
    -											<p>
    -												The full program should now look like this:
    -											</p>
    -											
    -</html><java><![CDATA[package test;
    -
    -// For convenience, always static import your generated tables and
    -// jOOQ functions to decrease verbosity:
    -import static test.generated.Tables.*;
    -import static org.jooq.impl.DSL.*;
    -
    -import java.sql.*;
    -
    -import org.jooq.*;
    -import org.jooq.impl.*;
    -
    -public class Main {
    -
    -    /**
    -     * @param args
    -     */
    -    public static void main(String[] args) {
    -        Connection conn = null;
    -
    -        String userName = "root";
    -        String password = "";
    -        String url = "jdbc:mysql://localhost:3306/guestbook";
    -
    -        try {
    -            Class.forName("com.mysql.jdbc.Driver").newInstance();
    -            conn = DriverManager.getConnection(url, userName, password);
    -
    -            DSLContext create = DSL.using(conn, SQLDialect.MYSQL);
    -            Result<Record> result = create.select().from(POSTS).fetch();
    -
    -            for (Record r : result) {
    -                Long id = r.getValue(POSTS.ID);
    -                String title = r.getValue(POSTS.TITLE);
    -                String description = r.getValue(POSTS.BODY);
    -
    -                System.out.println("ID: " + id + " title: " + title + " desciption: " + description);
    -            }
    -        } catch (Exception e) {
    -            // For the sake of this tutorial, let's keep exception handling simple
    -            e.printStackTrace();
    -        } finally {
    -            if (conn != null) {
    -                try {
    -                    conn.close();
    -                } catch (SQLException ignore) {
    -                }
    -            }
    -        }
    -    }
    -}]]></java></content>
    -									</section>
    -									
    -									<section id="jooq-in-7-steps-step7">
    -										<title>Step 7: Explore!</title>
    -										<content><html>
    -											<p>
    -												jOOQ has grown to be a comprehensive SQL library. For more information, please consider the documentation:<br/>
    -												<a href="http://www.jooq.org/learn.php" title="jOOQ Manual">http://www.jooq.org/learn.php</a>
    -											</p>
    -											<p>
    -												... explore the Javadoc:<br/>
    -												<a href="http://www.jooq.org/javadoc/latest/" title="jOOQ Javadoc">http://www.jooq.org/javadoc/latest/</a>
    -											</p>
    -											<p>
    -												... or join the news group:<br/>
    -												<a href="https://groups.google.com/forum/#!forum/jooq-user" title="jOOQ news group">https://groups.google.com/forum/#!forum/jooq-user</a>
    -											</p>
    -											<p>
    -											    This tutorial is the courtesy of Ikai Lan. See the original source here:<br/>
    -											    <a href="http://ikaisays.com/2011/11/01/getting-started-with-jooq-a-tutorial/" target="_blank" title="Ikai Lan's jOOQ tutorial">http://ikaisays.com/2011/11/01/getting-started-with-jooq-a-tutorial/</a>
    -											</p>
    -										</html></content>
    -									</section>
    -								</sections>
    -							</section>
    -
    -							<section id="jooq-in-modern-ides">
    -								<title>Using jOOQ in modern IDEs</title>
    -								<content><html>
    -									<p>Feel free to contribute a tutorial!</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="jooq-with-spring">
    -								<title>Using jOOQ with Spring and DBCP</title>
    -								<content><html>
    -									<p>
    -                                        jOOQ and Spring are easy to integrate. In this example, we shall integrate:
    -                                    </p>
    -                                    <ul>
    -                                        <li><a href="http://commons.apache.org/proper/commons-dbcp">Apache Commons DBCP</a> as the connection pooling library.</li>
    -                                        <li><a href="http://www.springsource.org/spring-data">Spring JDBC</a> as the transaction management library.</li>
    -                                        <li><a href="http://www.jooq.org">jOOQ</a> as the <reference id="sql-building" title="SQL building"/> and <reference id="sql-execution" title="execution"/> library.</li>
    -                                    </ul>
    -                                    
    -                                    <p>
    -                                        The following steps show how to integrate the libraries.
    -                                    </p>
    -                                    
    -                                    <h3>Add the required Maven dependencies</h3>
    -                                    <p>
    -                                        For this example, we'll create the following Maven dependencies
    -                                    </p>
    -
    -</html><xml><![CDATA[<!-- Use this or the latest Spring RELEASE version -->
    -<properties>
    -    <org.springframework.version>3.2.3.RELEASE</org.springframework.version>
    -</properties>
    -
    -<dependencies>
    -    <dependency>
    -        <groupId>org.jooq</groupId>
    -        <artifactId>jooq</artifactId>
    -        <version>{jooq-version}</version>
    -    </dependency>
    -    <dependency>
    -        <groupId>com.h2database</groupId>
    -        <artifactId>h2</artifactId>
    -        <version>1.3.168</version>
    -    </dependency>
    -    <dependency>
    -        <groupId>commons-dbcp</groupId>
    -        <artifactId>commons-dbcp</artifactId>
    -        <version>1.4</version>
    -    </dependency>
    -    <dependency>
    -        <groupId>org.springframework</groupId>
    -        <artifactId>spring-core</artifactId>
    -        <version>${org.springframework.version}</version>
    -    </dependency>
    -    <dependency>
    -        <groupId>org.springframework</groupId>
    -        <artifactId>spring-beans</artifactId>
    -        <version>${org.springframework.version}</version>
    -    </dependency>
    -    <dependency>
    -        <groupId>org.springframework</groupId>
    -        <artifactId>spring-context</artifactId>
    -        <version>${org.springframework.version}</version>
    -    </dependency>
    -    <dependency>
    -        <groupId>org.springframework</groupId>
    -        <artifactId>spring-jdbc</artifactId>
    -        <version>${org.springframework.version}</version>
    -    </dependency>
    -</dependencies>
    -]]></xml><html>          
    -
    -                                    <h3>Create a minimal Spring configuration file</h3>
    -                                    <p>
    -                                        The above dependencies are configured together using a Spring Beans configuration:
    -                                    </p>
    -                                    
    -</html><xml><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
    -<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
    -
    -<beans>
    -    <!-- Using Apache DBCP as a connection pooling library.
    -         Replace this with your preferred DataSource implementation -->
    -    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
    -        init-method="createDataSource" destroy-method="close">
    -        <property name="driverClassName" value="org.h2.Driver" />
    -        <property name="url" value="jdbc:h2:~/maven-test" />
    -        <property name="username" value="sa" />
    -        <property name="password" value="" />
    -    </bean>
    -
    -    <!-- Using Spring JDBC for transaction management -->
    -    <bean id="transactionManager"
    -        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    -        <property name="dataSource" ref="dataSource" />
    -    </bean>
    -
    -    <bean id="transactionAwareDataSource"
    -        class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy">
    -        <constructor-arg ref="dataSource" />
    -    </bean>
    -
    -    <!-- Bridging Spring JDBC data sources to jOOQ's ConnectionProvider -->
    -    <bean class="org.jooq.impl.DataSourceConnectionProvider" name="connectionProvider">
    -        <constructor-arg ref="transactionAwareDataSource" />
    -    </bean>
    -
    -    <bean id="dsl" class="org.jooq.impl.DefaultDSLContext">
    -        <constructor-arg ref="config" />
    -    </bean>
    -
    -    <!-- Invoking an internal, package-private constructor for the example
    -         Implement your own Configuration for more reliable behaviour -->
    -    <bean class="org.jooq.impl.DefaultConfiguration" name="config">
    -        <constructor-arg index="0" ref="connectionProvider" />
    -        <constructor-arg index="1"><null /></constructor-arg>
    -        <constructor-arg index="2"><value type="org.jooq.SQLDialect">H2</value></constructor-arg>
    -        <constructor-arg index="3"><null /></constructor-arg>
    -        <constructor-arg index="4"><null /></constructor-arg>
    -    </bean>
    -</beans>]]></xml><html>
    -
    -                                    <h3>Run a query in the JDBC Connection's transaction:</h3>
    -                                    <p>
    -                                        The following simple program shows how you can now easily obtain a <reference id="dsl-context" title="DSLContext" /> instance, from which queries can be executed:
    -                                    </p>
    -                                    
    -</html><java><![CDATA[package org.jooq.test.spring;
    -
    -import org.jooq.DSLContext;
    -
    -import org.springframework.context.ApplicationContext;
    -import org.springframework.context.support.ClassPathXmlApplicationContext;
    -
    -public class Test {
    -    public static void main(String[] args) {
    -
    -        // Configure the Spring application context, loading the bean configuration
    -        ApplicationContext context =
    -        new ClassPathXmlApplicationContext(new String[] {
    -            "jooq-spring-config-minimal.xml"
    -        });
    -
    -        // Fetch a DSLContext reference
    -        DSLContext dsl = context.getBean("dsl", DSLContext.class);
    -
    -        // Execute a jOOQ query in its JDBC Connection's transaction
    -        // ---------------------------------------------------------
    -        System.out.println(dsl.selectOne().fetch());
    -    }
    -}]]></java><html>
    -
    -                                    <p>
    -                                        The above example shows how Spring's TransactionAwareDataSourceProxy discovers that a jOOQ query is not executed in a transactional context.
    -                                    </p>
    -                                    
    -                                    <h3>Run a query in an "explicit transaction":</h3>
    -                                    <p>
    -                                        The following simple program shows how Spring's TransactionAwareDataSourceProxy will discover that several jOOQ queries are executed in the context of an explicitly created transaction 
    -                                    </p>
    -                                    
    -</html><java><![CDATA[package org.jooq.test.spring;
    -
    -import org.jooq.DSLContext;
    -
    -import org.springframework.context.ApplicationContext;
    -import org.springframework.context.support.ClassPathXmlApplicationContext;
    -
    -public class Test {
    -    public static void main(String[] args) {
    -
    -        // Configure the Spring application context, loading the bean configuration
    -        ApplicationContext context =
    -        new ClassPathXmlApplicationContext(new String[] {
    -            "jooq-spring-config-minimal.xml"
    -        });
    -
    -        // Fetch a DSLContext reference
    -        DSLContext dsl = context.getBean("dsl", DSLContext.class);
    -
    -        // Execute some jOOQ queries in an explicit transaction
    -        // ----------------------------------------------------
    -        PlatformTransactionManager transactionManager =
    -            context.getBean("transactionManager", PlatformTransactionManager.class);
    -
    -        TransactionStatus tx = transactionManager.getTransaction(new DefaultTransactionDefinition());
    -        dsl.selectOne().fetch();
    -        dsl.selectOne().fetch();
    -        dsl.selectOne().fetch();
    -        transactionManager.commit(tx);
    -    }
    -}]]></java><html>                                  
    -
    -                                    <p>
    -                                        Of course, in an actual productive setup, you are more likely to use Spring's AOP features to declare transactions and transactional behaviour on service methods, instead of explicitly starting and committing / rollbacking transactions. There are many other transaction models that you can choose to use with jOOQ.
    -                                    </p>  
    -								</html></content>
    -							</section>
    -
    -							<section id="a-simple-web-application">
    -								<title>A simple web application with jOOQ</title>
    -								<content><html>
    -									<p>Feel free to contribute a tutorial!</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -					
    -					<section id="jooq-and-scala">
    -						<title>jOOQ and Scala</title>
    -						<content><html>
    -							<p>
    -								As any other library, jOOQ can be easily used in Scala, taking advantage of the many Scala language features such as for example:
    -							</p>
    -							<ul>
    -								<li>Optional "." to dereference methods from expressions</li>
    -								<li>Optional "(" and ")" to delimit method argument lists</li>
    -								<li>Optioanl ";" at the end of a Scala statement</li>
    -								<li>Type inference using "var" and "val" keywords</li>
    -							</ul>
    -						
    -							<p>
    -								But jOOQ also leverages other useful Scala features, such as
    -							</p>
    -							<ul>
    -								<li>implicit defs for operator overloading</li>
    -								<li>Scala Macros (soon to come)</li>
    -							</ul>
    -							
    -							<p>
    -								A short example jOOQ application in Scala might look like this:
    -							</p>
    -							
    -</html><scala><![CDATA[
    -import collection.JavaConversions._                                  // Import implicit defs for iteration over org.jooq.Result
    -                                                                     //
    -import java.sql.DriverManager                                        //
    -                                                                     //
    -import org.jooq._                                                    //
    -import org.jooq.impl._                                               //
    -import org.jooq.impl.DSL._                                           //
    -import org.jooq.scala.example.h2.Tables._                            //
    -import org.jooq.scala.Conversions._                                  // Import implicit defs for overloaded jOOQ/SQL operators
    -                                                                     //
    -object Test {                                                        //
    -  def main(args: Array[String]): Unit = {                            //
    -    val c = DriverManager.getConnection("jdbc:h2:~/test", "sa", ""); // Standard JDBC connection
    -    val e = DSL.using(c, SQLDialect.H2);                             //
    -    val x = T_AUTHOR as "x"                                          // SQL-esque table aliasing
    -                                                                     //
    -    for (r <- e                                                      // Iteration over Result. "r" is an org.jooq.Record3
    -        select (                                                     //
    -          T_BOOK.ID * T_BOOK.AUTHOR_ID,                              // Using the overloaded "*" operator
    -          T_BOOK.ID + T_BOOK.AUTHOR_ID * 3 + 4,                      // Using the overloaded "+" operator
    -          T_BOOK.TITLE || " abc" || " xy"                            // Using the overloaded "||" operator
    -        )                                                            //
    -        from T_BOOK                                                  // No need to use parentheses or "." here
    -        leftOuterJoin (                                              //
    -          select (x.ID, x.YEAR_OF_BIRTH)                             // Dereference fields from aliased table
    -          from x                                                     //
    -          limit 1                                                    //
    -          asTable x.getName()                                        //
    -        )                                                            //
    -        on T_BOOK.AUTHOR_ID === x.ID                                 // Using the overloaded "===" operator
    -        where (T_BOOK.ID <> 2)                                       // Using the olerloaded "<>" operator
    -        or (T_BOOK.TITLE in ("O Alquimista", "Brida"))               // Neat IN predicate expression
    -        fetch                                                        //
    -    ) {                                                              //
    -      println(r)                                                     //
    -    }                                                                //
    -  }                                                                  //
    -}]]></scala><html>
    -
    -							<p>
    -								For more details about jOOQ's Scala integration, please refer to the manual's section about <reference id="scala-sql-building" title="SQL building with Scala"/>.
    -							</p>
    -						</html></content>
    -					</section>
    -					
    -					<section id="dependencies">
    -						<title>Dependencies</title>
    -						<content><html>
    -							<p>
    -								Dependencies are a big hassle in modern software. Many libraries depend on other, non-JDK library parts that come in different, incompatible versions, potentially causing trouble in your runtime environment. jOOQ has no external dependencies on any third-party libraries.
    -							</p>
    -							<p>
    -								However, the above rule has some exceptions:
    -							</p>
    -							<ul>
    -								<li><reference id="logging" title="logging APIs"/> are referenced as "optional dependencies". jOOQ tries to find <a href="http://www.slf4j.org/">slf4j</a> or <a href="http://logging.apache.org/log4j">log4j</a> on the classpath. If it fails, it will use the <reference class="java.util.logging.Logger"/></li>
    -								<li>Oracle ojdbc types used for array creation are loaded using reflection. The same applies to Postgres PG* types.</li>
    -								<li>Small libraries with compatible licenses are incorporated into jOOQ. These include <a href="https://github.com/jOOQ/jOOR">jOOR</a>, <a href="https://github.com/jOOQ/jOOU">jOOU</a>, parts of <a href="http://opencsv.sourceforge.net/">OpenCSV</a>, <a href="http://code.google.com/p/json-simple/">json simple</a>, parts of <a href="http://commons.apache.org/lang/">commons-lang</a></li>
    -								<li><a href="http://docs.oracle.com/javaee/6/api/javax/persistence/package-summary.html">javax.persistence</a> and <a href="http://docs.oracle.com/javaee/6/api/javax/validation/package-summary.html">javax.validation</a> will be needed if you activate the relevant <reference id="code-generation" title="code generation flags"/></li>
    -							</ul>
    -						</html></content>
    -					</section>
    -					
    -					<section id="build-your-own">
    -						<title>Build your own</title>
    -						<content><html>
    -							<p>
    -								In order to build jOOQ yourself, please download the sources from <a href="https://github.com/jOOQ/jOOQ">https://github.com/jOOQ/jOOQ</a> and use Maven to build jOOQ, preferably in Eclipse. jOOQ requires Java 6+ to compile and run.
    -							</p>
    -							<p>
    -								Some useful hints to build jOOQ yourself:
    -							</p>
    -							<ul>
    -								<li>Get the latest version of <a href="http://git-scm.com">Git</a> or <a href="http://www.eclipse.org/egit">EGit</a></li>
    -								<li>Get the latest version of <a href="http://maven.apache.org">Maven</a> or <a href="http://eclipse.org/m2e">M2E</a></li>
    -								<li>Check out the jOOQ sources from <a href="https://github.com/jOOQ/jOOQ">https://github.com/jOOQ/jOOQ</a></li>
    -								<li>Optionally, import Maven artefacts into an Eclipse workspace using the following command (see the <a href="http://maven.apache.org/plugins/maven-eclipse-plugin/">maven-eclipse-plugin</a> documentation for details):
    -									<ul>
    -										<li><code>mvn eclipse:eclipse</code></li>
    -									</ul>
    -								</li>
    -								<li>Build the <code>jooq-parent</code> artefact by using any of these commands:
    -									<ul>
    -										<li><code>mvn clean package</code><br/>create .jar files in <code>${project.build.directory}</code></li>
    -										<li><code>mvn clean install</code><br/>install the .jar files in your local repository (e.g. <code>~/.m2</code>)</li>
    -										<li><code>mvn clean {goal} -Dmaven.test.skip=true</code><br/>don't run unit tests when building artefacts</li>
    -									</ul>
    -								</li>
    -							</ul>
    -						</html></content>
    -					</section>
    -					
    -					<section id="semantic-versioning">
    -						<title>jOOQ and backwards-compatibility</title>
    -						<content><html>
    -							<p>
    -								jOOQ follows the rules of semantic versioning according to <a href="http://semver.org">http://semver.org</a> quite strictly. Those rules impose a versioning scheme [X].[Y].[Z] that can be summarised as follows:
    -							</p>
    -							<ul>
    -								<li>If a patch release includes bugfixes, performance improvements and API-irrelevant new features, [Z] is incremented by one.</li>
    -								<li>If a minor release includes backwards-compatible, API-relevant new features, [Y] is incremented by one and [Z] is reset to zero.</li>
    -								<li>If a major release includes backwards-incompatible, API-relevant new features, [X] is incremented by one and [Y], [Z] are reset to zero.</li>
    -							</ul>
    -							
    -							<h3>jOOQ's understanding of backwards-compatibility</h3>
    -							<p>
    -								Backwards-compatibility is important to jOOQ. You've chosen jOOQ as a strategic SQL engine and you don't want your SQL to break. That is why there is at most one major release per year, which changes only those parts of jOOQ's API and functionality, which were agreed upon on the user group. During the year, only minor releases are shipped, adding new features in a backwards-compatible way
    -							</p>
    -							<p>
    -								However, there are some elements of API evolution that would be considered backwards-incompatible in other APIs, but not in jOOQ. As discussed later on in the section about <reference id="dsl-and-non-dsl" title="jOOQ's DSL API"/>, much of jOOQ's API is indeed an internal domain-specific language implemented mostly using Java interfaces. Adding language elements to these interfaces means any of these actions:  
    -							</p>
    -							<ul>
    -								<li>Adding methods to the interface</li>
    -								<li>Overloading methods for convenience</li>
    -								<li>Changing the type hierarchy of interfaces</li>
    -							</ul>
    -							
    -							<p>
    -								It becomes obvious that it would be impossible to add new language elements (e.g. new <reference id="column-expressions" title="SQL functions"/>, new <reference id="select-statement" title="SELECT clauses"/>) to the API without breaking any client code that actually implements those interfaces. Hence, the following rule should be observed: 
    -							</p>
    -							
    -							<p>jOOQ's DSL interfaces should not be implemented by client code! Extend only those extension points that are explicitly documented as "extendable" (e.g. <reference id="custom-queryparts" title="custom QueryParts"/>)</p>
    -						</html></content>
    -					</section>
    -				</sections>
    -			</section>
    -
    -			<section id="sql-building">
    -				<title>SQL building</title>
    -				<content><html>
    -					<p>
    -					    SQL is a declarative language that is hard to integrate into procedural, object-oriented, functional or any other type of programming languages. jOOQ's philosophy is to give SQL the credit it deserves and integrate SQL itself as an <a href="http://en.wikipedia.org/wiki/Domain_Specific_Language">"internal domain specific language"</a> directly into Java.
    -					</p>
    -					<p>
    -						With this philosophy in mind, SQL building is the main feature of jOOQ. All other features (such as <reference id="sql-execution" title="SQL execution"/> and <reference id="code-generation" title="code generation"/>) are mere convenience built on top of jOOQ's SQL building capabilities.
    -					</p>
    -					<p>
    -						This section explains all about the various syntax elements involved with jOOQ's SQL building capabilities. For a complete overview of all syntax elements, please refer to the manual's sections about <reference id="dsl-mapping-rules" title="SQL to DSL mapping rules"/> as well as <reference id="reference-bnf-notation" title="jOOQ's BNF notation"/>
    -					</p>
    -				</html></content>
    -
    -				<sections>
    -                    <redirect id="factory" redirect-to="dsl">
    -                        <redirect id="factory-subclasses" redirect-to="dsl-subclasses"/>
    -                    </redirect>
    -                    
    -					<section id="dsl">
    -					    <title>The DSL type</title>
    -					    <content><html>
    -							<p>
    -								jOOQ exposes a lot of interfaces and hides most implementation facts from client code. The reasons for this are:
    -							</p>
    -							<ul>
    -								<li>Interface-driven design. This allows for modelling queries in a fluent API most efficiently</li>
    -								<li>Reduction of complexity for client code.</li>
    -								<li>API guarantee. You only depend on the exposed interfaces, not concrete (potentially dialect-specific) implementations.</li>
    -							</ul>
    -							<p>
    -								The <reference class="org.jooq.impl.DSL"/> class is the main class from where you will create all jOOQ objects.	It serves as a static factory for <reference id="table-expressions" title="table expressions"/>, <reference id="column-expressions" title="column expressions"/> (or "fields"), <reference id="conditional-expressions" title="conditional expressions"/> and many other <reference id="queryparts" title="QueryParts"/>.
    -							</p>
    -
    -							<h3>The static DSL API</h3>
    -							<p>
    -								With jOOQ 2.0, static factory methods have been introduced in order to make client code look more like SQL. Ideally, when working with jOOQ, you will simply static import all methods from the DSL class:
    -							</p>
    -
    -</html><java>import static org.jooq.impl.DSL.*;</java><html>
    -
    -							<p>
    -							    Note, that when working with Eclipse, you could also add the DSL to your favourites. This will allow to access functions even more fluently:
    -							</p>
    -</html><java>concat(trim(FIRST_NAME), trim(LAST_NAME));
    -
    -// ... which is in fact the same as:
    -DSL.concat(DSL.trim(FIRST_NAME), DSL.trim(LAST_NAME));</java></content>
    -					    
    -					    <sections>
    -							<section id="dsl-subclasses">
    -								<title>DSL subclasses</title>
    -								<content><html>
    -									<p>
    -										There are a couple of subclasses for the general DSL. Each SQL dialect has its own dialect-specific DSL. For instance, if you're only using the MySQL dialect, you can choose to reference the MySQLDSL instead of the standard DSL:
    -									</p>
    -									<p>
    -										The advantage of referencing a dialect-specific DSL lies in the fact that you have access to more proprietary RDMBS functionality. This may include:
    -									</p>
    -									<ul>
    -		    							<li>MySQL's encryption functions</li>
    -		    							<li>PL/SQL constructs, pgplsql, or any other dialect's ROUTINE-language (maybe in the future)</li>
    -									</ul>
    -								</html></content>
    -							</section>
    -					    </sections>
    -					</section>
    -                    
    -                    <redirect id="executor" redirect-to="dsl-context">
    -                        <redirect id="sql-dialects" redirect-to="sql-dialects"/>
    -                        <redirect id="connection-vs-datasource" redirect-to="connection-vs-datasource"/>
    -                        <redirect id="custom-data" redirect-to="custom-data"/>
    -                        <redirect id="custom-execute-listeners" redirect-to="custom-execute-listeners"/>
    -                        <redirect id="custom-settings" redirect-to="custom-settings"/>
    -                        <redirect id="runtime-schema-mapping" redirect-to="runtime-schema-mapping"/>
    -                    </redirect>
    -					
    -					<section id="dsl-context">
    -						<title>The DSLContext class</title>
    -						<content><html>
    -							<p>
    -							    DSLContext references a <reference class="org.jooq.Configuration"/>, an object that configures jOOQ's behaviour when executing queries (see <reference id="sql-execution"/> for more details). Unlike the static DSL, the DSLContext allow for creating <reference id="sql-statements" title="SQL statements"/> that are already "configured" and ready for execution.
    -							</p>
    -							
    -                            <h3>Fluent creation of a DSLContext object</h3>
    -                            <p>
    -                                The DSLContext object can be created fluently from the <reference id="dsl" title="DSL type"/>:
    -                            </p>
    -
    -</html><java><![CDATA[// Create it from a pre-existing configuration
    -DSLContext create = DSL.using(configuration);
    -
    -// Create it from ad-hoc arguments
    -DSLContext create = DSL.using(connection, dialect);]]></java><html>
    -
    -                            <p>
    -                                If you do not have a reference to a pre-existing Configuration object (e.g. created from <reference class="org.jooq.impl.DefaultConfiguration"/>), the various overloaded <code>DSL.using()</code> methods will create one for you.
    -                            </p>
    -                            
    -							<h3>Contents of a Configuration object</h3>
    -							<p>
    -							    A Configuration can be supplied with these objects:
    -							</p>
    -							<ul>
    -								<li><reference class="org.jooq.SQLDialect"/> : The dialect of your database. This may be any of the currently supported database types (see <reference id="sql-dialects"/> for more details)</li>
    -    							<li><reference class="org.jooq.conf.Settings"/> : An optional runtime configuration (see <reference id="custom-settings"/> for more details)</li>
    -								<li><reference class="org.jooq.ExecuteListenerProvider"/> : An optional reference to a provider class that can provide execute listeners to jOOQ (see <reference id="execute-listeners"/> for more details)</li>
    -                                <li><reference class="org.jooq.RecordMapperProvider"/> : An optional reference to a provider class that can provide record mappers to jOOQ (see <reference id="pojos-with-recordmapper-provider"/> for more details)</li>
    -                                <li>
    -									Any of these:
    -									<ul>
    -										<li><reference class="java.sql.Connection"/> : An optional JDBC Connection that will be re-used for the whole lifecycle of your Configuration (see <reference id="connection-vs-datasource"/> for more details). For simplicity, this is the use-case referenced from this manual, most of the time.</li>
    -		    							<li><reference class="java.sql.DataSource"/> : An optional JDBC DataSource that will be re-used for the whole lifecycle of your Configuration. If you prefer using DataSources over Connections, jOOQ will internally fetch new Connections from your DataSource, conveniently closing them again after query execution. This is particularly useful in J2EE or Spring contexts (see <reference id="connection-vs-datasource"/> for more details)</li>
    -		    							<li><reference class="org.jooq.ConnectionProvider"/> : A custom abstraction that is used by jOOQ to "acquire" and "release" connections. jOOQ will internally "acquire" new Connections from your ConnectionProvider, conveniently "releasing" them again after query execution. (see <reference id="connection-vs-datasource"/> for more details)</li>
    -									</ul>
    -								</li>
    -							</ul>
    -							
    -							<p>
    -								Wrapping a Configuration object, a DSLContext can construct <reference id="sql-statements" title="statements"/>, for later <reference id="sql-execution" title="execution"/>. An example is given here:
    -							</p>
    -</html><java><![CDATA[// The DSLContext is "configured" with a Connection and a SQLDialect
    -DSLContext create = DSL.using(connection, dialect);
    -
    -// This select statement contains an internal reference to the DSLContext's Configuration:
    -Select<?> select = create.selectOne();
    -
    -// Using the internally referenced Configuration, the select statement can now be executed:
    -Result<?> result = select.fetch();]]></java><html>
    -
    -                            <p>
    -                                Note that you do not need to keep a reference to a DSLContext. You may as well inline your local variable, and fluently execute a SQL statement as such:
    -                            </p>
    -
    -</html><java><![CDATA[// Execute a statement from a single execution chain:
    -Result<?> result =
    -DSL.using(connection, dialect)
    -   .select()
    -   .from(BOOK)
    -   .where(BOOK.TITLE.like("Animal%"))
    -   .fetch();]]></java></content>
    -
    -						<sections>
    -							<section id="sql-dialects">
    -								<title>SQL Dialect</title>
    -								<content><html>
    -									<p>
    -										While jOOQ tries to represent the SQL standard as much as possible, many features are vendor-specific to a given database and to its "SQL dialect". jOOQ models this using the <reference class="org.jooq.SQLDialect"/> enum type.
    -									</p>
    -									<p>
    -										The SQL dialect is one of the main attributes of a <reference id="dsl-context" title="Configuration"/>. Queries created from DSLContexts will assume dialect-specific behaviour when <reference id="sql-rendering" title="rendering SQL"/> and <reference id="variable-binding" title="binding bind values"/>.
    -									</p>
    -									<p>
    -										Some parts of the jOOQ API are officially supported only by a given subset of the supported SQL dialects. For instance, the <reference id="connect-by-clause" title="Oracle CONNECT BY clause"/>, which is supported by the Oracle and CUBRID databases, is annotated with a <reference class="org.jooq.Support"/> annotation, as such:
    -									</p>
    -</html><java><![CDATA[/**
    - * Add an Oracle-specific <code>CONNECT BY</code> clause to the query
    - */
    -@Support({ SQLDialect.CUBRID, SQLDialect.ORACLE })
    -SelectConnectByConditionStep<R> connectBy(Condition condition);]]></java><html>
    -
    -									<p>
    -									    jOOQ API methods which are not annotated with the <reference class="org.jooq.Support"/> annotation, or which are annotated with the Support annotation, but without any SQL dialects can be safely used in all SQL dialects. An example for this is the <reference id="select-statement" title="SELECT statement"/> factory method:
    -									</p>
    -</html><java><![CDATA[/**
    - * Create a new DSL select statement.
    - */
    -@Support
    -SelectSelectStep<R> select(Field<?>... fields);]]></java><html>
    -
    -									<h3>jOOQ's SQL clause simulation capabilities</h3>
    -									<p>
    -										The aforementioned Support annotation does not only designate, which databases natively support a feature. It also indicates that a feature is simulated by jOOQ for some databases lacking this feature. An example of this is the <reference id="distinct-predicate" title="DISTINCT predicate"/>, a predicate syntax defined by SQL:1999 and implemented only by H2, HSQLDB, and Postgres:
    -									</p>
    -
    -</html><sql><![CDATA[A IS DISTINCT FROM B]]></sql><html>
    -
    -									<p>
    -										Nevertheless, the <code>IS DISTINCT FROM</code> predicate is supported by jOOQ in all dialects, as its semantics can be expressed with an equivalent <reference id="case-expressions" title="CASE expression"/>. For more details, see the manual's section about the <reference id="distinct-predicate" title="DISTINCT predicate"/>.
    -									</p>
    -									
    -									<h3>jOOQ and the Oracle SQL dialect</h3>
    -									<p>
    -										Oracle SQL is much more expressive than many other SQL dialects. It features many unique keywords, clauses and functions that are out of scope for the SQL standard. Some examples for this are
    -									</p>
    -									<ul>
    -										<li>The <reference id="connect-by-clause" title="CONNECT BY clause"/>, for hierarchical queries</li>
    -										<li>The <reference id="pivot-tables" title="PIVOT"/> keyword for creating PIVOT tables</li>
    -										<li><reference id="oracle-packages" title="Packages"/>, <reference id="oracle-member-procedures" title="object-oriented user-defined types, member procedures"/> as described in the section about <reference id="stored-procedures" title="stored procedures and functions"/></li>
    -										<li>Advanced analytical functions as described in the section about <reference id="window-functions" title="window functions"/></li>
    -									</ul>
    -
    -									<p>
    -										jOOQ has a historic affinity to Oracle's SQL extensions. If something is supported in Oracle SQL, it has a high probability of making it into the jOOQ API
    -									</p>
    -								</html></content>
    -							</section>
    -
    -                            <section id="sql-dialect-family">
    -                                <title>SQL Dialect Family</title>
    -                                <content><html>
    -                                    <p>
    -                                        In jOOQ 3.1, the notion of a <code>SQLDialect.family()</code> was introduced, in order to group several similar <reference id="sql-dialects" title="SQL dialects"/> into a common family. An example for this is SQL Server, which is supported by jOOQ in various versions:
    -                                    </p>
    -                                    
    -                                    <ul>
    -                                        <li> <reference class="org.jooq.SQLDialect" title="SQL Server" anchor="#SQLSERVER"/>: The "version-less" SQL Server version. This always maps to the latest supported version of SQL Server</li>
    -                                        <li> <reference class="org.jooq.SQLDialect" title="SQL Server 2012" anchor="#SQLSERVER2012"/>: The SQL Server version 2012</li>
    -                                        <li> <reference class="org.jooq.SQLDialect" title="SQL Server 2008" anchor="#SQLSERVER2008"/>: The SQL Server version 2008</li>
    -                                    </ul>
    -                                    
    -                                    <p>
    -                                        In the above list, <code>SQLSERVER</code> is both a dialect and a family of three dialects. This distinction is used internally by jOOQ to distinguish whether to use the <reference id="limit-clause" title="OFFSET .. FETCH"/> clause (SQL Server 2012), or whether to simulate it using <code>ROW_NUMBER() OVER()</code> (SQL Server 2008).
    -                                    </p>
    -                                </html></content>
    -                            </section>
    -
    -							<section id="connection-vs-datasource">
    -								<title>Connection vs. DataSource</title>
    -								<content><html>
    -									<h3>Interact with JDBC Connections</h3>
    -									<p>
    -										While you can use jOOQ for <reference id="sql-building" title="SQL building"/> only, you can also run queries against a JDBC <reference class="java.sql.Connection"/>. Internally, jOOQ creates <reference class="java.sql.Statement"/> or <reference class="java.sql.PreparedStatement"/> objects from such a Connection, in order to execute statements. The normal operation mode is to provide a <reference id="dsl-context" title="Configuration"/> with a JDBC Connection, whose lifecycle you will control yourself. This means that jOOQ will not actively close connections, rollback or commit transactions.
    -									</p>
    -									<p>
    -										Note, in this case, jOOQ will internally use a <reference class="org.jooq.impl.DefaultConnectionProvider"/>, which you can reference directly if you prefer that. The DefaultConnectionProvider exposes various transaction-control methods, such as commit(), rollback(), etc.
    -									</p>
    -									
    -									<h3>Interact with JDBC DataSources</h3>
    -									<p>
    -										If you're in a J2EE or Spring context, however, you may wish to use a <reference class="javax.sql.DataSource"/> instead. Connections obtained from such a DataSource will be closed after query execution by jOOQ. The semantics of such a close operation should be the returning of the connection into a connection pool, not the actual closing of the underlying physical connection. Typically, this makes sense in an environment using distributed JTA transactions. An example of using DataSources with jOOQ can be seen in the tutorial section about <reference id="jooq-with-spring" title="using jOOQ with Spring"/>.
    -									</p>
    -									<p>
    -										Note, in this case, jOOQ iwll internally use a <reference class="org.jooq.impl.DataSourceConnectionProvider"/>, which you can reference directly if you prefer that.
    -									</p>
    -									
    -									<h3>Inject custom behaviour</h3>
    -									<p>
    -										If your specific environment works differently from any of the above approaches, you can inject your own custom implementation of a ConnectionProvider into jOOQ. This is the API contract you have to fulfil:
    -									</p>
    -									
    -</html><java><![CDATA[public interface ConnectionProvider {
    -
    -    // Provide jOOQ with a connection
    -    Connection acquire() throws DataAccessException;
    -  
    -    // Get a connection back from jOOQ
    -    void release(Connection connection) throws DataAccessException;
    -}]]></java><html>
    -
    -									<p>
    -									    Note that <code>acquire()</code> should always return the same Connection until this connection is returned via <code>release()</code> 
    -									</p>
    -								</html></content>
    -							</section>
    -							
    -							<section id="custom-data">
    -								<title>Custom data</title>
    -								<content><html>
    -									<p>
    -										In advanced use cases of integrating your application with jOOQ, you may want to put custom data into your <reference id="dsl-context" title="Configuration"/>, which you can then access from your...
    -									</p>
    -									
    -									<ul>
    -										<li><reference id="custom-execute-listeners" title="Custom ExecuteListeners"/></li>
    -										<li><reference id="custom-queryparts" title="Custom QueryParts"/></li>
    -									</ul>
    -									
    -									<p>
    -										Here is an example of how to use the custom data API. Let's assume that you have written an <reference id="execute-listeners" title="ExecuteListener"/>, that prevents <code>INSERT</code> statements, when a given flag is set to <code>true</code>: 
    -									</p>
    -
    -</html><java><![CDATA[// Implement an ExecuteListener
    -public class NoInsertListener extends DefaultExecuteListener {
    -
    -    @Override
    -    public void start(ExecuteContext ctx) {
    -    
    -        // This listener is active only, when your custom flag is set to true
    -        if (Boolean.TRUE.equals(ctx.configuration().data("com.example.my-namespace.no-inserts"))) {
    -        
    -            // If active, fail this execution, if an INSERT statement is being executed
    -            if (ctx.query() instanceof Insert) {
    -                throw new DataAccessException("No INSERT statements allowed");
    -            }
    -        }
    -    }
    -}]]></java><html>
    -									<p>
    -										See the manual's section about <reference id="execute-listeners" title="ExecuteListeners"/> to learn more about how to implement an <code>ExecuteListener</code>.
    -									</p>
    -									
    -									<p>
    -										Now, the above listener can be added to your <reference id="dsl-context" title="Configuration"/>, but you will also need to pass the flag to the <code>Configuration</code>, in order for the listener to work:
    -									</p>
    -									
    -</html><java><![CDATA[// Create your Configuration
    -Configuration configuration = new DefaultConfiguration().set(connection).set(dialect);
    -
    -// Set a new execute listener provider onto the configuration:
    -configuration.set(new DefaultExecuteListenerProvider(new NoInsertListener()));
    -
    -// Use any String literal to identify your custom data
    -configuration.data("com.example.my-namespace.no-inserts", true);
    -
    -// Try to execute an INSERT statement
    -try {
    -    DSL.using(configuration)
    -       .insertInto(AUTHOR, AUTHOR.ID, AUTHOR.LAST_NAME)
    -       .values(1, "Orwell")
    -       .execute();
    -          
    -    // You shouldn't get here
    -    Assert.fail();
    -}
    -
    -// Your NoInsertListener should be throwing this exception here:
    -catch (DataAccessException expected) {
    -    Assert.assertEquals("No INSERT statements allowed", expected.getMessage());
    -}]]></java><html>
    -
    -									<p>
    -										Using the <code>data()</code> methods, you can store and retrieve custom data in your <code>Configurations</code>.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="custom-execute-listeners">
    -								<title>Custom ExecuteListeners</title>
    -								<content><html>
    -									<p>
    -										<code>ExecuteListeners</code> are a useful tool to...
    -									</p>
    -									
    -									<ul>
    -										<li>implement custom logging</li>
    -										<li>apply triggers written in Java</li>
    -										<li>collect query execution statistics</li>
    -										<li>integrate with the <reference id="jooq-console" title="jOOQ Console"/></li>
    -									</ul>
    -									
    -									<p>
    -										ExecuteListeners are hooked into your <reference id="dsl-context" title="Configuration"/> by returning them from an <reference class="org.jooq.ExecuteListenerProvider"/>:
    -									</p>
    -
    -</html><java><![CDATA[// Create your Configuration
    -Configuration configuration = new DefaultConfiguration().set(connection).set(dialect);
    -
    -// Hook your listener providers into the configuration:
    -configuration.set(
    -    new DefaultExecuteListenerProvider(new MyFirstListener()),
    -    new DefaultExecuteListenerProvider(new PerformanceLoggingListener()),
    -    new DefaultExecuteListenerProvider(new NoInsertListener())
    -);]]></java><html>
    -									
    -									<p>
    -										See the manual's section about <reference id="execute-listeners" title="ExecuteListeners"/> to see examples of such listener implementations.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="custom-settings">
    -								<title>Custom Settings</title>
    -								<content><html>
    -									<p>
    -										The jOOQ Configuration allows for some optional configuration elements to be used by advanced users. The <reference class="org.jooq.conf.Settings" /> class is a JAXB-annotated type, that can be provided to a Configuration in several ways:
    -									</p>
    -									<ul>
    -										<li>In the DSLContext constructor (<code>DSL.using()</code>). This will override default settings below</li>
    -										<li>in the <reference class="org.jooq.impl.DefaultConfiguration"/> constructor. This will override default settings below</li>
    -                                        <li>From a location specified by a JVM parameter: -Dorg.jooq.settings</li>
    -										<li>From the classpath at /jooq-settings.xml</li>
    -										<li>From the settings defaults, as specified in <a href="http://www.jooq.org/xsd/jooq-runtime-{runtime-xsd-version}.xsd" title="The jOOQ Runtime configuration XSD">http://www.jooq.org/xsd/jooq-runtime-{runtime-xsd-version}.xsd</a></li>
    -									</ul>
    -									<h3>Example</h3>
    -									<p>
    -										For example, if you want to indicate to jOOQ, that it should inline all bind variables, and execute static <reference class="java.sql.Statement"/> instead of binding its variables to <reference class="java.sql.PreparedStatement"/>, you can do so by creating the following DSLContext:
    -									</p>
    -</html><java><![CDATA[Settings settings = new Settings();
    -settings.setStatementType(StatementType.STATIC_STATEMENT);
    -DSLContext create = DSL.using(connection, dialect, settings);]]></java><html>
    -									<p>
    -										Subsequent sections of the manual contain some more in-depth explanations about these settings:
    -									</p>
    -									<ul>
    -										<li>
    -		     								<reference id="schema-mapping" title="Runtime schema and table mapping"/>
    -		   								</li>
    -		     							<li>
    -		     								<reference id="optimistic-locking" title="Execute CRUD with optimistic locking enabled"/>
    -		     							</li>
    -		     							<li>
    -		     								<reference id="logging" title="Enabling DEBUG logging of all executed SQL"/>
    -		     							</li>
    -		   							</ul>
    -		   							<p>
    -										Please refer to the jOOQ runtime configuration XSD for more details:<br/>
    -										<a href="http://www.jooq.org/xsd/jooq-runtime-{runtime-xsd-version}.xsd" title="The jOOQ Runtime configuration XSD">http://www.jooq.org/xsd/jooq-runtime-{runtime-xsd-version}.xsd</a>
    -									</p>
    -								</html></content>
    -							</section>
    -							
    -							<section id="runtime-schema-mapping">
    -								<title>Runtime schema and table mapping</title>
    -								<content><html>
    -									<h3>Mapping your DEV schema to a productive environment</h3>
    -									<p>
    -										You may wish to design your database in a way that you have several instances of your schema. This is useful when you want to cleanly separate data belonging to several customers / organisation units / branches / users and put each of those entities' data in a separate database or schema.
    -									</p>
    -									
    -									<p>
    -										In our AUTHOR example this would mean that you provide a book reference database to several companies, such as My Book World and Books R Us. In that case, you'll probably have a schema setup like this:
    -									</p>
    -									<ul>
    -										<li>DEV: Your development schema. This will be the schema that you base code generation upon, with jOOQ </li>
    -										<li>MY_BOOK_WORLD: The schema instance for My Book World </li>
    -										<li>BOOKS_R_US: The schema instance for Books R Us </li>
    -									</ul>
    -
    -									<h3>Mapping DEV to MY_BOOK_WORLD with jOOQ</h3>
    -									<p>
    -										When a user from My Book World logs in, you want them to access the MY_BOOK_WORLD schema using classes generated from DEV. This can be achieved with the <reference class="org.jooq.conf.RenderMapping"/> class, that you can equip your Configuration's <reference id="custom-settings" title="settings"/> with. Take the following example:
    -									</p>
    -
    -</html><java>Settings settings = new Settings()
    -    .withRenderMapping(new RenderMapping()
    -    .withSchemata(
    -        new MappedSchema().withInput("DEV")
    -                          .withOutput("MY_BOOK_WORLD")));
    -
    -// Add the settings to the DSLContext
    -DSLContext create = DSL.using(connection, SQLDialect.ORACLE, settings);
    -
    -// Run queries with the "mapped" Configuration
    -create.selectFrom(AUTHOR).fetch();</java><html>
    -
    -									<p>
    -										The query executed with a Configuration equipped with the above mapping will in fact produce this SQL statement:
    -									</p>
    -									
    -</html><sql>SELECT * FROM MY_BOOK_WORLD.AUTHOR</sql><html>
    -									<p>
    -										Even if AUTHOR was generated from DEV.
    -									</p>
    -
    -									<h3>Mapping several schemata</h3>
    -									<p>
    -										Your development database may not be restricted to hold only one DEV schema. You may also have a LOG schema and a MASTER schema. Let's say the MASTER schema is shared among all customers, but each customer has their own LOG schema instance. Then you can enhance your RenderMapping like this (e.g. using an XML configuration file):
    -									</p>
    -
    -</html><xml><![CDATA[<settings xmlns="http://www.jooq.org/xsd/jooq-runtime-{runtime-xsd-version}.xsd">
    -  <renderMapping>
    -    <schemata>
    -      <schema>
    -        <input>DEV</input>
    -        <output>MY_BOOK_WORLD</output>
    -      </schema>
    -      <schema>
    -        <input>LOG</input>
    -        <output>MY_BOOK_WORLD_LOG</output>
    -      </schema>
    -    </schemata>
    -  </renderMapping>
    -</settings>]]></xml><html>
    -
    -                            		<p>
    -                            			Note, you can load the above XML file like this:
    -                           			</p>
    -
    -</html><java>Settings settings = JAXB.unmarshal(new File("jooq-runtime.xml"), Settings.class);</java><html>
    -
    -									<p>
    -										This will map generated classes from DEV to MY_BOOK_WORLD, from LOG to MY_BOOK_WORLD_LOG, but leave the MASTER schema alone. Whenever you want to change your mapping configuration, you will have to create a new Configuration.
    -									</p>
    -
    -
    -									<h3>Using a default schema</h3>
    -                            		<p>
    -                            			If you wish not to render any schema name at all, use the following Settings property for this:
    -                           			</p>
    -
    -
    -</html><java>Settings settings = new Settings()
    -    .withRenderSchema(false);
    -
    -// Add the settings to the Configuration
    -DSLContext create = DSL.using(connection, SQLDialect.ORACLE, settings);
    -
    -// Run queries that omit rendering schema names
    -create.selectFrom(AUTHOR).fetch();</java><html>
    -
    -									<h3>Mapping of tables</h3>
    -									<p>
    -										Not only schemata can be mapped, but also tables. If you are not the owner of the database your application connects to, you might need to install your schema with some sort of prefix to every table. In our examples, this might mean that you will have to map DEV.AUTHOR to something MY_BOOK_WORLD.MY_APP__AUTHOR, where MY_APP__ is a prefix applied to all of your tables. This can be achieved by creating the following mapping: 
    -									</p>
    -
    -</html><java>Settings settings = new Settings()
    -    .withRenderMapping(new RenderMapping()
    -    .withSchemata(
    -        new MappedSchema().withInput("DEV")
    -                          .withOutput("MY_BOOK_WORLD")
    -                          .withTables(
    -         new MappedTable().withInput("AUTHOR")
    -                          .withOutput("MY_APP__AUTHOR"))));
    -
    -// Add the settings to the Configuration
    -DSLContext create = DSL.using(connection, SQLDialect.ORACLE, settings);
    -
    -// Run queries with the "mapped" configuration
    -create.selectFrom(AUTHOR).fetch();</java><html>
    -
    -									<p>
    -										The query executed with a Configuration equipped with the above mapping will in fact produce this SQL statement:
    -									</p>
    -									
    -</html><sql>SELECT * FROM MY_BOOK_WORLD.MY_APP__AUTHOR</sql><html>
    -
    -		                            <p>
    -		                           		Table mapping and schema mapping can be applied independently, by specifying several MappedSchema entries in the above configuration. jOOQ will process them in order of appearance and map at first match. Note that you can always omit a MappedSchema's output value, in case of which, only the table mapping is applied. If you omit a MappedSchema's input value, the table mapping is applied to all schemata!
    -		                            </p>
    -
    -									<h3>Hard-wiring mappings at code-generation time</h3>
    -									<p>
    -										Note that the manual's section about <reference id="schema-mapping" title="code generation schema mapping"/> explains how you can hard-wire your schema mappings at code generation time
    -									</p>									
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -					<section id="sql-statements">
    -						<title>SQL Statements</title>
    -						<content><html>
    -							<p>
    -								jOOQ currently supports 6 types of SQL statements. All of these statements are constructed from a DSLContext instance with an optional <reference id="connection-vs-datasource" title="JDBC Connection or DataSource"/>. If supplied with a Connection or DataSource, they can be executed. Depending on the <reference id="query-vs-resultquery" title="query type"/>, executed queries can return results.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="dsl-and-non-dsl">
    -								<title>jOOQ's DSL and model API</title>
    -								<content><html>
    -									<p>
    -										jOOQ ships with its own DSL (or	<a href="http://en.wikipedia.org/wiki/Domain-specific_language" title="Domain Specific Language">Domain Specific Language</a>) that	simulates SQL in Java. This means, that you can	write SQL statements almost as if Java natively supported it, just like .NET's C# does with <a href="http://msdn.microsoft.com/en-us/library/bb425822.aspx">LINQ to SQL.</a>
    -									</p>
    -									<p>
    -										Here is an example to illustrate what that means:
    -									</p>
    -									
    -</html><code-pair><sql><![CDATA[-- Select all books by authors born after 1920,
    --- named "Paulo" from a catalogue:
    -SELECT *
    -  FROM author a
    -  JOIN book b ON a.id = b.author_id
    - WHERE a.year_of_birth > 1920
    -   AND a.first_name = 'Paulo'
    - ORDER BY b.title]]></sql><java><![CDATA[Result<Record> result =
    -create.select()
    -      .from(AUTHOR.as("a"))
    -      .join(BOOK.as("b")).on(a.ID.equal(b.AUTHOR_ID))
    -      .where(a.YEAR_OF_BIRTH.greaterThan(1920)
    -      .and(a.FIRST_NAME.equal("Paulo")))
    -      .orderBy(b.TITLE)
    -      .fetch();]]></java></code-pair><html>
    -
    -									<p>
    -										We'll see how the aliasing works later in the section about <reference id="aliased-tables" title="aliased tables"/>
    -									</p>
    -
    -									<h3>jOOQ as an internal domain specific language in Java (a.k.a. the DSL API)</h3>
    -									<p>
    -										Many other frameworks have similar APIs with similar feature sets. Yet, what makes jOOQ special is its informal <reference id="reference-bnf-notation" title="BNF notation"/> modelling a unified SQL dialect suitable for many vendor-specific dialects, and implementing that BNF notation as a hierarchy of interfaces in Java. This concept is extremely powerful, when <reference id="jooq-in-modern-ides" title="using jOOQ in modern IDEs" /> with syntax completion. Not only can you code much faster, your SQL code will be compile-checked to a certain extent. An example of a DSL query equivalent to the previous one is given here:
    -									</p>
    -									
    -</html><java><![CDATA[DSLContext create = DSL.using(connection, dialect);
    -Result<?> result = create.select()
    -                         .from(AUTHOR)
    -                         .join(BOOK).on(BOOK.AUTHOR_ID.equal(AUTHOR.ID))
    -                         .fetch();]]></java><html>
    -
    -                         			<p>
    -                         				Unlike other, simpler frameworks that use <a href="http://en.wikipedia.org/wiki/Fluent_interface">"fluent APIs"</a> or <a href="http://en.wikipedia.org/wiki/Method_chaining">"method chaining"</a>, jOOQ's BNF-based interface hierarchy will not allow bad query syntax. The following will not compile, for instance:
    -                         			</p>
    -</html><java><![CDATA[DSLContext create = DSL.using(connection, dialect);
    -Result<?> result = create.select()
    -                         .join(BOOK).on(BOOK.AUTHOR_ID.equal(AUTHOR.ID))
    -                      //  ^^^^ "join" is not possible here
    -                         .from(AUTHOR)
    -                         .fetch();
    -
    -Result<?> result = create.select()
    -                         .from(AUTHOR)
    -                         .join(BOOK)
    -                         .fetch();
    -                      //  ^^^^^ "on" is missing here
    -
    -Result<?> result = create.select(rowNumber())
    -                      //         ^^^^^^^^^ "over()" is missing here
    -                         .from(AUTHOR)
    -                         .fetch();
    -
    -Result<?> result = create.select()
    -                         .from(AUTHOR)
    -                         .where(AUTHOR.ID.in(select(BOOK.TITLE).from(BOOK)))
    -                      //                     ^^^^^^^^^^^^^^^^^^
    -                      // AUTHOR.ID is of type Field<Integer> but subselect returns Record1<String>
    -                         .fetch();
    -
    -Result<?> result = create.select()
    -                         .from(AUTHOR)
    -                         .where(AUTHOR.ID.in(select(BOOK.AUTHOR_ID, BOOK.ID).from(BOOK)))
    -                      //                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    -                      // AUTHOR.ID is of degree 1 but subselect returns Record2<Integer, Integer>
    -                         .fetch();]]></java><html>
    -
    -									<h3>History of SQL building and incremental query building (a.k.a. the model API)</h3>
    -									<p>
    -										Historically, jOOQ started out as an object-oriented SQL builder library like any other. This meant that all queries and their syntactic components were modeled as so-called <reference id="queryparts" title="QueryParts"/>, which delegate <reference id="sql-rendering" title="SQL rendering"/> and <reference id="variable-binding" title="variable binding"/> to child components. This part of the API will be referred to as the model API (or non-DSL API), which is still maintained and used internally by jOOQ for incremental query building. An example of incremental query building is given here:
    -									</p>
    -									
    -</html><java><![CDATA[DSLContext create = DSL.using(connection, dialect);
    -SelectQuery<Record> query = create.selectQuery();
    -query.addFrom(AUTHOR);
    -
    -// Join books only under certain circumstances
    -if (join) {
    -    query.addJoin(BOOK, BOOK.AUTHOR_ID.equal(AUTHOR.ID));
    -}
    -
    -Result<?> result = query.fetch();]]></java><html>
    -
    -									<p>
    -										This query is equivalent to the one shown before using the DSL syntax. In fact, internally, the DSL API constructs precisely this SelectQuery object. Note, that you can always access the SelectQuery object to switch between DSL and model APIs:
    -									</p>
    -
    -</html><java><![CDATA[DSLContext create = DSL.using(connection, dialect);
    -SelectFinalStep<?> select = create.select().from(AUTHOR);
    -
    -// Add the JOIN clause on the internal QueryObject representation
    -SelectQuery<?> query = select.getQuery();
    -query.addJoin(BOOK, BOOK.AUTHOR_ID.equal(AUTHOR.ID));]]></java><html>
    -
    -									<h3>Mutability</h3>
    -									<p>
    -										Note, that for historic reasons, the DSL API mixes mutable and immutable behaviour with respect to the internal representation of the <reference id="queryparts" title="QueryPart"/> being constructed. While creating <reference id="conditional-expressions" title="conditional expressions"/>, <reference id="column-expressions" title="column expressions"/> (such as functions) assumes immutable behaviour, creating <reference id="sql-statements" title="SQL statements"/> does not. In other words, the following can be said:
    -									</p>
    -									
    -</html><java><![CDATA[// Conditional expressions (immutable)
    -// -----------------------------------
    -Condition a = BOOK.TITLE.equal("1984");
    -Condition b = BOOK.TITLE.equal("Animal Farm");
    -
    -// The following can be said
    -a       != a.or(b); // or() does not modify a
    -a.or(b) != a.or(b); // or() always creates new objects
    -
    -// Statements (mutable)
    -// --------------------
    -SelectFromStep<?> s1 = select();
    -SelectJoinStep<?> s2 = s1.from(BOOK);
    -SelectJoinStep<?> s3 = s1.from(AUTHOR);
    -
    -// The following can be said
    -s1 == s2; // The internal object is always the same
    -s2 == s3; // The internal object is always the same]]></java><html>
    -
    -									<p>
    -										On the other hand, beware that you can always extract and modify <reference id="bind-values" title="bind values"/> from any <code>QueryPart</code>.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="select-statement">
    -								<title>The SELECT statement</title>
    -								<content><html>
    -									<p>
    -										When you don't just perform <reference id="crud-with-updatablerecords" title="CRUD"/> (i.e. SELECT * FROM your_table WHERE ID = ?), you're usually generating new record types using custom projections. With jOOQ, this is as intuitive, as if using SQL directly. A more or less complete example of the "standard" SQL syntax, plus some extensions, is provided by a query like this:
    -									</p>
    -
    -									<h3>SELECT from a complex table expression</h3>
    -</html><code-pair>
    -<sql><![CDATA[-- get all authors' first and last names, and the number
    --- of books they've written in German, if they have written
    --- more than five books in German in the last three years
    --- (from 2011), and sort those authors by last names
    --- limiting results to the second and third row, locking
    --- the rows for a subsequent update... whew!
    -
    -  SELECT AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME, COUNT(*)
    -    FROM AUTHOR
    -    JOIN BOOK ON AUTHOR.ID = BOOK.AUTHOR_ID
    -   WHERE BOOK.LANGUAGE = 'DE'
    -     AND BOOK.PUBLISHED > '2008-01-01'
    -GROUP BY AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME
    -  HAVING COUNT(*) > 5
    -ORDER BY AUTHOR.LAST_NAME ASC NULLS FIRST
    -   LIMIT 2
    -  OFFSET 1
    -     FOR UPDATE]]></sql><java><![CDATA[// And with jOOQ...
    -
    -
    -
    -
    -DSLContext create = DSL.using(connection, dialect);
    -
    -create.select(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME, count())
    -      .from(AUTHOR)
    -      .join(BOOK).on(BOOK.AUTHOR_ID.equal(AUTHOR.ID))
    -      .where(BOOK.LANGUAGE.equal("DE"))
    -      .and(BOOK.PUBLISHED.greaterThan("2008-01-01"))
    -      .groupBy(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -      .having(count().greaterThan(5))
    -      .orderBy(AUTHOR.LAST_NAME.asc().nullsFirst())
    -      .limit(1)
    -      .offset(2)
    -      .forUpdate();]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										Details about the various clauses of this query will be provided in subsequent sections.
    -									</p>
    -
    -									<h3>SELECT from single physical tables</h3>
    -									<p>
    -										A very similar, but limited API is available, if you want to select from single physical tables in order to retrieve <reference id="crud-with-updatablerecords" title="TableRecords or even UpdatableRecords"/>. The decision, which type of select to create is already made at the very first step, when you create the <code>SELECT</code> statement with the DSL or DSLContext types:
    -									</p>
    -
    -</html><java><![CDATA[public <R extends Record> SelectWhereStep<R> selectFrom(Table<R> table);]]></java><html>
    -									<p>
    -										As you can see, there is no way to further restrict/project the selected fields. This just selects all known TableFields in the supplied Table, and it also binds &lt;R extends Record&gt; to your Table's associated Record. An example of such a Query would then be:
    -									</p>
    -</html><java><![CDATA[BookRecord book = create.selectFrom(BOOK)
    -                        .where(BOOK.LANGUAGE.equal("DE"))
    -                        .orderBy(BOOK.TITLE)
    -                        .fetchAny();]]></java><html>
    -
    -                   					<p>
    -                   						The "reduced" SELECT API is limited in the way that it skips DSL access to any of these clauses:
    -                   					</p>
    -                   					<ul>
    -                   						<li><reference id="select-clause"/></li>
    -                   						<li><reference id="join-clause"/></li>
    -                   					</ul>
    -                   					<p>
    -                   						In most parts of this manual, it is assumed that you do not use the "reduced" SELECT API. For more information about the simple SELECT API, see the manual's section about <reference id="record-vs-tablerecord" title="fetching strongly or weakly typed records"/>.
    -                   					</p>
    -								</html></content>
    -
    -								<sections>
    -									<section id="select-clause">
    -										<title>The SELECT clause</title>
    -										<content><html>
    -											<p>
    -												The SELECT clause lets you project your own record types, referencing table fields, functions, arithmetic expressions, etc. The DSL type provides several methods for expressing a SELECT clause:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[-- The SELECT clause
    -SELECT BOOK.ID, BOOK.TITLE
    -SELECT BOOK.ID, TRIM(BOOK.TITLE)
    -]]></sql><java><![CDATA[// Provide a varargs Fields list to the SELECT clause:
    -Select<?> s1 = create.select(BOOK.ID, BOOK.TITLE);
    -Select<?> s2 = create.select(BOOK.ID, trim(BOOK.TITLE));]]></java>
    -</code-pair><html>
    -
    -											<p>
    -												Some commonly used projections can be easily created using convenience methods:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[-- Simple SELECTs
    -SELECT COUNT(*)
    -SELECT 0 -- Not a bind variable
    -SELECT 1 -- Not a bind variable
    -]]></sql><java><![CDATA[// Select commonly used values
    -Select<?> select1 = create.selectCount();
    -Select<?> select2 = create.selectZero();
    -Select<?> select2 = create.selectOne();]]></java>
    -</code-pair><html>
    -
    -											<p>
    -												See more details about functions and expressions in the manual's section about <reference id="column-expressions"/>
    -											</p>
    -
    -											<h3>The SELECT DISTINCT clause</h3>
    -											<p>
    -												The DISTINCT keyword can be included in the method name, constructing a SELECT clause
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT DISTINCT BOOK.TITLE]]></sql><java><![CDATA[Select<?> select1 = create.selectDistinct(BOOK.TITLE);]]></java>
    -</code-pair><html>
    -
    -                                            <h3>SELECT *</h3>
    -                                            <p>
    -                                            	jOOQ does not explicitly support the asterisk operator in projections. However, you can omit the projection as in these examples:
    -                                            </p>
    -                                            
    -</html><java><![CDATA[// Explicitly selects all columns available from BOOK
    -create.select().from(BOOK);
    -
    -// Explicitly selects all columns available from BOOK and AUTHOR
    -create.select().from(BOOK, AUTHOR);
    -create.select().from(BOOK).crossJoin(AUTHOR);
    -
    -// Renders a SELECT * statement, as columns are unknown to jOOQ
    -create.select().from(tableByName("BOOK"));]]></java><html>                                            
    -
    -											<h3>Typesafe projections with degree up to {max-row-degree}</h3>
    -											<p>
    -												Since jOOQ 3.0, <reference id="record-n" title="records"/> and <reference id="row-value-expressions" title="row value expressions"/> up to degree {max-row-degree} are now generically typesafe. This is reflected by an overloaded <code>SELECT</code> (and <code>SELECT DISTINCT</code>) API in both DSL and DSLContext. An extract from the DSL type:
    -											</p>
    -											
    -</html><java><![CDATA[// Non-typesafe select methods:
    -public static SelectSelectStep<Record> select(Collection<? extends Field<?>> fields);
    -public static SelectSelectStep<Record> select(Field<?>... fields);
    -
    -// Typesafe select methods:
    -public static <T1>         SelectSelectStep<Record1<T1>>         select(Field<T1> field1);
    -public static <T1, T2>     SelectSelectStep<Record2<T1, T2>>     select(Field<T1> field1, Field<T2> field2);
    -public static <T1, T2, T3> SelectSelectStep<Record3<T1, T2, T3>> select(Field<T1> field1, Field<T2> field2, Field<T3> field3);
    -// [...]]]></java><html>
    -		
    -											<p>
    -												Since the generic R type is bound to some <reference id="record-n" title="Record[N]"/>, the associated T type information can be used in various other contexts, e.g. the <reference id="in-predicate" title="IN predicate"/>. Such a <code>SELECT</code> statement can be assigned typesafely:
    -											</p>
    -
    -</html><java><![CDATA[Select<Record2<Integer, String>> s1 = create.select(BOOK.ID, BOOK.TITLE);
    -Select<Record2<Integer, String>> s2 = create.select(BOOK.ID, trim(BOOK.TITLE));]]></java><html>
    -																				
    -											<p>
    -												For more information about typesafe record types with degree up to {max-row-degree}, see the manual's section about <reference id="record-n" title="Record1 to Record{max-row-degree}"/>.
    -											</p>
    -										</html></content>
    -									</section>
    -
    -									<section id="from-clause">
    -										<title>The FROM clause</title>
    -										<content><html>
    -											<p>
    -												The SQL FROM clause allows for specifying any number of <reference id="table-expressions" title="table expressions"/> to select data from. The following are examples of how to form normal FROM clauses:
    -											</p>
    -
    -</html><code-pair>
    -	<sql><![CDATA[SELECT 1 FROM BOOK
    -SELECT 1 FROM BOOK, AUTHOR
    -SELECT 1 FROM BOOK "b", AUTHOR "a"]]></sql><java><![CDATA[create.selectOne().from(BOOK);
    -create.selectOne().from(BOOK, AUTHOR);
    -create.selectOne().from(BOOK.as("b"), AUTHOR.as("a"));]]></java>
    -</code-pair><html>
    -
    -											<p>
    -												Read more about aliasing in the manual's section about <reference id="aliased-tables" title="aliased tables"/>.
    -											</p>
    -											
    -											<h3>More advanced table expressions</h3>
    -											<p>
    -												Apart from simple tables, you can pass any arbitrary <reference id="table-expressions" title="table expression"/> to the jOOQ FROM clause. This may include <reference id="array-and-cursor-unnesting" title="unnested cursors"/> in Oracle:
    -											</p>
    -
    -</html><code-pair>
    -	<sql><![CDATA[SELECT *
    -FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(null, null, 'ALLSTATS'));]]></sql><java><![CDATA[create.select()
    -      .from(table(DbmsXplan.displayCursor(null, null, "ALLSTATS"));]]></java>
    -</code-pair><html>
    -
    -											<p>
    -												Note, in order to access the DbmsXplan package, you can use the <reference id="code-generation" title="code generator"/> to generate Oracle's SYS schema.
    -											</p>
    -
    -
    -											<h3>Selecting FROM DUAL with jOOQ</h3>
    -											<p>
    -												In many SQL dialects, FROM is a mandatory clause, in some it isn't. jOOQ allows you to omit the FROM clause, returning just one record. An example:
    -											</p>
    -
    -</html><code-pair>
    -	<sql><![CDATA[SELECT 1 FROM DUAL
    -SELECT 1]]></sql><java><![CDATA[DSL.using(SQLDialect.ORACLE).selectOne().getSQL();
    -DSL.using(SQLDialect.POSTGRES).selectOne().getSQL();]]></java>
    -</code-pair><html>
    -
    -											<p>
    -												Read more about dual or dummy tables in the manual's section about <reference id="dual" title="the DUAL table"/>. The following are examples of how to form normal FROM clauses:
    -											</p>
    -										</html></content>
    -									</section>
    -
    -									<section id="join-clause">
    -										<title>The JOIN clause</title>
    -										<content><html>
    -											<p>
    -												jOOQ supports many different types of standard SQL JOIN operations:
    -											</p>
    -											<ul>
    -												<li>[ INNER ] JOIN</li>
    -												<li>LEFT [ OUTER ] JOIN</li>
    -												<li>RIGHT [ OUTER ] JOIN</li>
    -												<li>FULL OUTER JOIN</li>
    -												<li>CROSS JOIN</li>
    -												<li>NATURAL JOIN</li>
    -												<li>NATURAL LEFT [ OUTER ] JOIN</li>
    -												<li>NATURAL RIGHT [ OUTER ] JOIN</li>
    -											</ul>
    -
    -											<p>
    -												All of these JOIN methods can be called on <reference class="org.jooq.Table"/> types, or directly after the FROM clause for convenience. The following example joins AUTHOR and BOOK
    -											</p>
    -
    -</html><java><![CDATA[DSLContext create = DSL.using(connection, dialect);
    -
    -// Call "join" directly on the AUTHOR table
    -Result<?> result = create.select()
    -                         .from(AUTHOR.join(BOOK)
    -                                     .on(BOOK.AUTHOR_ID.equal(AUTHOR.ID)))
    -                         .fetch();
    -
    -// Call "join" on the type returned by "from"
    -Result<?> result = create.select()
    -                         .from(AUTHOR)
    -                         .join(BOOK)
    -                         .on(BOOK.AUTHOR_ID.equal(AUTHOR.ID))
    -                         .fetch();]]></java><html>
    -
    -											<p>
    -												The two syntaxes will produce the same SQL statement. However, calling "join" on <reference class="org.jooq.Table"/> objects allows for more powerful, nested JOIN expressions (if you can handle the parentheses):
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT *
    -FROM AUTHOR
    -LEFT OUTER JOIN (
    -  BOOK JOIN BOOK_TO_BOOK_STORE
    -       ON BOOK_TO_BOOK_STORE.BOOK_ID = BOOK.ID
    -)
    -ON BOOK.AUTHOR_ID = AUTHOR.ID]]></sql><java><![CDATA[// Nest joins and provide JOIN conditions only at the end
    -create.select()
    -      .from(AUTHOR
    -      .leftOuterJoin(BOOK
    -        .join(BOOK_TO_BOOK_STORE)
    -        .on(BOOK_TO_BOOK_STORE.BOOK_ID.equal(BOOK.ID)))
    -      .on(BOOK.AUTHOR_ID.equal(AUTHOR.ID)));]]></java></code-pair><html>
    -
    -      										<ul>
    -      											<li>See the section about <reference id="conditional-expressions" title="conditional expressions"/> to learn more about the many ways to create <reference class="org.jooq.Condition"/> objects in jOOQ.</li>
    -      											<li>See the section about <reference id="table-expressions" title="table expressions"/> to learn about the various ways of referencing <reference class="org.jooq.Table"/> objects in jOOQ</li>
    -      										</ul>
    -
    -											<h3>JOIN ON KEY, convenience provided by jOOQ</h3>
    -											<p>
    -												Surprisingly, the SQL standard does not allow to formally JOIN on well-known foreign key relationship information. Naturally, when you join BOOK to AUTHOR, you will want to do that based on the BOOK.AUTHOR_ID foreign key to AUTHOR.ID primary key relation. Not being able to do this in SQL leads to a lot of repetitive code, re-writing the same JOIN predicate again and again - especially, when your foreign keys contain more than one column. With jOOQ, when you use <reference id="code-generation" title="code generation"/>, you can use foreign key constraint information in JOIN expressions as such:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT *
    -FROM AUTHOR
    -JOIN BOOK ON BOOK.AUTHOR_ID = AUTHOR.ID]]></sql><java><![CDATA[create.select()
    -      .from(AUTHOR)
    -      .join(BOOK).onKey();]]></java></code-pair><html>
    -
    -      										<p>
    -      											In case of ambiguity, you can also supply field references for your foreign keys, or the generated foreign key reference to the onKey() method.
    -      										</p>
    -      										<p>
    -      											Note that formal support for the Sybase <code>JOIN ON KEY</code> syntax is on the roadmap.
    -      										</p>
    -
    -											<h3>The JOIN USING syntax</h3>
    -											<p>
    -												Most often, you will provide jOOQ with JOIN conditions in the JOIN .. ON clause. SQL supports a different means of specifying how two tables are to be joined. This is the JOIN .. USING clause. Instead of a condition, you supply a set of fields whose names are common to both tables to the left and right of a JOIN operation. This can be useful when your database schema has a high degree of <a href="http://en.wikipedia.org/wiki/Database_normalization">relational normalisation</a>. An example:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[-- Assuming that both tables contain AUTHOR_ID columns
    -SELECT *
    -FROM AUTHOR
    -JOIN BOOK USING (AUTHOR_ID)]]></sql><java><![CDATA[// join(...).using(...)
    -create.select()
    -      .from(AUTHOR)
    -      .join(BOOK).using(AUTHOR.AUTHOR_ID);]]></java></code-pair><html>
    -
    -											<p>
    -												In schemas with high degrees of normalisation, you may also choose to use NATURAL JOIN, which takes no JOIN arguments as it joins using all fields that are common to the table expressions to the left and to the right of the JOIN operator. An example:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[-- Assuming that both tables contain AUTHOR_ID columns
    -SELECT *
    -FROM AUTHOR
    -NATURAL JOIN BOOK]]></sql><java><![CDATA[// naturalJoin(...)
    -create.select()
    -      .from(AUTHOR)
    -      .naturalJoin(BOOK);]]></java></code-pair><html>
    -
    -											<h3>Oracle's partitioned OUTER JOIN</h3>
    -											<p>
    -												Oracle SQL ships with a special syntax available for OUTER JOIN clauses. According to the <a href="http://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_10002.htm#i2196190">Oracle documentation about partitioned outer joins</a> this can be used to fill gaps for simplified analytical calculations. jOOQ only supports putting the PARTITION BY clause to the right of the OUTER JOIN clause. The following example will create at least one record per AUTHOR and per existing value in BOOK.PUBLISHED_IN, regardless if an AUTHOR has actually published a book in that year.
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT *
    -FROM AUTHOR
    -LEFT OUTER JOIN BOOK
    -PARTITION BY (PUBLISHED_IN)
    -ON BOOK.AUTHOR_ID = AUTHOR.ID]]></sql><java><![CDATA[create.select()
    -      .from(AUTHOR)
    -      .leftOuterJoin(BOOK)
    -      .partitionBy(BOOK.PUBLISHED_IN)
    -      .on(BOOK.AUTHOR_ID.equal(AUTHOR.ID));]]></java></code-pair><html>
    -
    -										</html></content>
    -									</section>
    -
    -									<section id="where-clause">
    -										<title>The WHERE clause</title>
    -										<content><html>
    -											<p>
    -												The WHERE clause can be used for JOIN or filter predicates, in order to restrict the data returned by the <reference id="table-expressions" title="table expressions"/> supplied to the previously specified <reference id="from-clause" title="from clause"/> and <reference id="join-clause" title="join clause"/>. Here is an example:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT *
    -FROM BOOK
    -WHERE AUTHOR_ID = 1
    -AND TITLE = '1984']]></sql><java><![CDATA[create.select()
    -      .from(BOOK)
    -      .where(BOOK.AUTHOR_ID.equal(1))
    -      .and(BOOK.TITLE.equal("1984"));]]></java></code-pair><html>
    -
    -											<p>
    -												The above syntax is convenience provided by jOOQ, allowing you to connect the <reference class="org.jooq.Condition"/> supplied in the WHERE clause with another condition using an AND operator. You can of course also create a more complex condition and supply that to the WHERE clause directly (observe the different placing of parentheses). The results will be the same:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT *
    -FROM BOOK
    -WHERE AUTHOR_ID = 1
    -AND TITLE = '1984']]></sql><java><![CDATA[create.select()
    -      .from(BOOK)
    -      .where(BOOK.AUTHOR_ID.equal(1).and(
    -             BOOK.TITLE.equal("1984")));]]></java></code-pair><html>
    -
    -											<p>
    -												You will find more information about creating <reference id="conditional-expressions" title="conditional expressions"/> later in the manual.
    -											</p>
    -										</html></content>
    -									</section>
    -
    -									<section id="connect-by-clause">
    -										<title>The CONNECT BY clause</title>
    -										<content><html>
    -											<p>
    -												The Oracle database knows a very succinct syntax for creating hierarchical queries: the CONNECT BY clause, which is fully supported by jOOQ, including all related functions and pseudo-columns. A more or less formal definition of this clause is given here:
    -											</p>
    -</html><sql>--   SELECT ..
    ---     FROM ..
    ---    WHERE ..
    - CONNECT BY [ NOCYCLE ] condition [ AND condition, ... ] [ START WITH condition ]
    --- GROUP BY ..
    --- ORDER [ SIBLINGS ] BY ..</sql><html>
    -
    -											<p>
    -												An example for an iterative query, iterating through values between 1 and 5 is this:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT LEVEL
    -FROM DUAL
    -CONNECT BY LEVEL <= 5]]></sql><java><![CDATA[// Get a table with elements 1, 2, 3, 4, 5
    -create.select(level())
    -      .connectBy(level().lessOrEqual(5));]]></java></code-pair><html>
    -
    -											<p>
    -												Here's a more complex example where you can recursively fetch directories in your database, and concatenate them to a path:
    -											</p>
    -</html><code-pair>
    -<sql><![CDATA[SELECT 
    -  SUBSTR(SYS_CONNECT_BY_PATH(DIRECTORY.NAME, '/'), 2)
    -FROM DIRECTORY
    -CONNECT BY 
    -  PRIOR DIRECTORY.ID = DIRECTORY.PARENT_ID
    -START WITH DIRECTORY.PARENT_ID IS NULL
    -ORDER BY 1]]></sql><java><![CDATA[.select(
    -   sysConnectByPath(DIRECTORY.NAME, "/").substring(2))
    -.from(DIRECTORY)
    -.connectBy(
    -   prior(DIRECTORY.ID).equal(DIRECTORY.PARENT_ID))
    -.startWith(DIRECTORY.PARENT_ID.isNull())
    -.orderBy(1);]]></java>
    -</code-pair><html>
    -
    -    										<p>
    -    											The output might then look like this
    -   											</p>
    -
    -</html><text>+------------------------------------------------+
    -|substring                                       |
    -+------------------------------------------------+
    -|C:                                              |
    -|C:/eclipse                                      |
    -|C:/eclipse/configuration                        |
    -|C:/eclipse/dropins                              |
    -|C:/eclipse/eclipse.exe                          |
    -+------------------------------------------------+
    -|...21 record(s) truncated...
    -</text><html>
    -
    -											<p>
    -												Some of the supported functions and pseudo-columns are these (available from the <reference id="dsl" title="DSL"/>):
    -											</p>
    -
    -											<ul>
    -												<li>LEVEL</li>
    -												<li>CONNECT_BY_IS_CYCLE</li>
    -												<li>CONNECT_BY_IS_LEAF</li>
    -												<li>CONNECT_BY_ROOT</li>
    -												<li>SYS_CONNECT_BY_PATH</li>
    -												<li>PRIOR</li>
    -											</ul>
    -
    -											<p>
    -												Note that this syntax is also supported in the CUBRID database and might be simulated in other dialects supporting common table expressions in the future.
    -											</p>
    -											
    -											<h3>ORDER SIBLINGS</h3>
    -											<p>
    -												The Oracle database allows for specifying a SIBLINGS keyword in the <reference id="order-by-clause" title="ORDER BY clause"/>. Instead of ordering the overall result, this will only order siblings among each other, keeping the hierarchy intact. An example is given here:
    -											</p>
    -											
    -</html><code-pair>
    -<sql><![CDATA[SELECT DIRECTORY.NAME
    -FROM DIRECTORY
    -CONNECT BY 
    -  PRIOR DIRECTORY.ID = DIRECTORY.PARENT_ID
    -START WITH DIRECTORY.PARENT_ID IS NULL
    -ORDER SIBLINGS BY 1]]></sql><java><![CDATA[.select(DIRECTORY.NAME)
    -.from(DIRECTORY)
    -.connectBy(
    -   prior(DIRECTORY.ID).equal(DIRECTORY.PARENT_ID))
    -.startWith(DIRECTORY.PARENT_ID.isNull())
    -.orderSiblingsBy(1);]]></java>
    -</code-pair><html>
    -											
    -										</html></content>
    -									</section>
    -
    -									<section id="group-by-clause">
    -										<title>The GROUP BY clause</title>
    -										<content><html>
    -											<p>
    -												GROUP BY can be used to create unique groups of data, to form aggregations, to remove duplicates and for other reasons. It will transform your previously defined <reference id="table-expressions" title="set of table expressions"/>, and return only one record per unique group as specified in this clause. For instance, you can group books by BOOK.AUTHOR_ID:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT AUTHOR_ID, COUNT(*)
    -FROM BOOK
    -GROUP BY AUTHOR_ID]]></sql><java><![CDATA[create.select(BOOK.AUTHOR_ID, count())
    -      .from(BOOK)
    -      .groupBy(BOOK.AUTHOR_ID);]]></java></code-pair><html>
    -
    -											<p>
    -												The above example counts all books per author.
    -											</p>
    -											<p>
    -												Note, as defined in the SQL standard, when grouping, you may no longer project any columns that are not a formal part of the GROUP BY clause, or <reference id="aggregate-functions" title="aggregate functions"/>.
    -											</p>
    -											
    -											<h3>MySQL's deviation from the SQL standard</h3>
    -											<p>
    -												MySQL has a peculiar way of not adhering to this standard behaviour. This is documented in the <a href="http://dev.mysql.com/doc/refman/5.6/en/group-by-hidden-columns.html">MySQL manual</a>. In short, with MySQL, you can also project any other field that is not part of the GROUP BY clause. The projected values will just be arbitrary values from within the group. You cannot rely on any ordering. For example:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT AUTHOR_ID, TITLE
    -FROM BOOK
    -GROUP BY AUTHOR_ID]]></sql><java><![CDATA[create.select(BOOK.AUTHOR_ID, BOOK.TITLE)
    -      .from(BOOK)
    -      .groupBy(AUTHOR_ID);]]></java></code-pair><html>
    -
    -											<p>
    -												This will return an arbitrary title per author. jOOQ supports this syntax, as jOOQ is not doing any checks internally, about the consistence of tables/fields/functions that you provide it.
    -											</p>
    -
    -											<h3>Empty GROUP BY clauses</h3>
    -											<p>
    -												jOOQ supports empty <code>GROUP BY ()</code> clause as well. This will result in <reference id="select-statement" title="SELECT statements"/> that return only one record.
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT COUNT(*)
    -FROM BOOK
    -GROUP BY ()]]></sql><java><![CDATA[create.selectCount()
    -      .from(BOOK)
    -      .groupBy();]]></java></code-pair><html>
    -
    -											
    -											<h3>ROLLUP(), CUBE() and GROUPING SETS()</h3>
    -											<p>
    -												Some databases support the SQL standard grouping functions and some extensions thereof. See the manual's section about <reference id="grouping-functions" title="grouping functions"/> for more details.
    -											</p>
    -										</html></content>
    -									</section>
    -
    -									<section id="having-clause">
    -										<title>The HAVING clause</title>
    -										<content><html>
    -											<p>
    -												The HAVING clause is commonly used to further restrict data resulting from a previously issued <reference id="group-by-clause" title="GROUP BY clause"/>. An example, selecting only those authors that have written at least two books:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT AUTHOR_ID, COUNT(*)
    -FROM BOOK
    -GROUP BY AUTHOR_ID
    -HAVING COUNT(*) >= 2]]></sql><java><![CDATA[create.select(BOOK.AUTHOR_ID, count(*))
    -      .from(BOOK)
    -      .groupBy(AUTHOR_ID)
    -      .having(count().greaterOrEqual(2));]]></java></code-pair><html>
    -
    -											<p>
    -												According to the SQL standard, you may omit the GROUP BY clause and still issue a HAVING clause. This will implicitly GROUP BY (). jOOQ also supports this syntax. The following example selects one record, only if there are at least 4 books in the books table:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT COUNT(*)
    -FROM BOOK
    -HAVING COUNT(*) >= 4]]></sql><java><![CDATA[create.select(count(*))
    -      .from(BOOK)
    -      .having(count().greaterOrEqual(4));]]></java></code-pair><html>
    -
    -										</html></content>
    -									</section>
    -
    -									<section id="order-by-clause">
    -										<title>The ORDER BY clause</title>
    -										<content><html>
    -											<p>
    -												Databases are allowed to return data in any arbitrary order, unless you explicitly declare that order in the ORDER BY clause. In jOOQ, this is straight-forward:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT AUTHOR_ID, TITLE
    -FROM BOOK
    -ORDER BY AUTHOR_ID ASC, TITLE DESC]]></sql><java><![CDATA[create.select(BOOK.AUTHOR_ID, BOOK.TITLE)
    -      .from(BOOK)
    -      .orderBy(BOOK.AUTHOR_ID.asc(), BOOK.TITLE.desc());]]></java></code-pair><html>
    -
    -											<p>
    -												Any jOOQ <reference id="column-expressions" title="column expression (or field)"/> can be transformed into an <reference class="org.jooq.SortField"/> by calling the asc() and desc() methods.
    -											</p>
    -
    -											<h3>Ordering by field index</h3>
    -											<p>
    -												The SQL standard allows for specifying integer literals (<reference id="inlined-parameters" title="literals"/>, not <reference id="bind-values" title="bind values"/>!) to reference column indexes from the projection (<reference id="select-clause" title="SELECT clause"/>). This may be useful if you do not want to repeat a lengthy expression, by which you want to order - although most databases also allow for referencing <reference id="aliased-columns" title="aliased column references"/> in the ORDER BY clause. An example of this is given here:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT AUTHOR_ID, TITLE
    -FROM BOOK
    -ORDER BY 1 ASC, 2 DESC]]></sql><java><![CDATA[create.select(BOOK.AUTHOR_ID, BOOK.TITLE)
    -      .from(BOOK)
    -      .orderBy(one().asc(), inline(2).desc());]]></java></code-pair><html>
    -
    -											<p>
    -												Note, how <code>one()</code> is used as a convenience short-cut for <code>inline(1)</code>
    -											</p>
    -
    -											<h3>Ordering and NULLS</h3>
    -											<p>
    -												A few databases support the SQL standard "null ordering" clause in sort specification lists, to define whether <code>NULL</code> values should come first or last in an ordered result.
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT 
    -  BOOK.AUTHOR_ID, 
    -  BOOK.CO_AUTHOR_ID, 
    -  BOOK.TITLE
    -FROM BOOK
    -ORDER BY AUTHOR_ID ASC,
    -         CO_AUTHOR_ID ASC NULLS LAST]]></sql><java><![CDATA[create.select(
    -         BOOK.AUTHOR_ID, 
    -         BOOK.CO_AUTHOR_ID, 
    -         BOOK.TITLE)
    -      .from(BOOK)
    -      .orderBy(BOOK.AUTHOR_ID.asc(),
    -               BOOK.CO_AUTHOR_ID.asc().nullsLast());]]></java></code-pair><html>
    -
    -											<p>
    -												If your database doesn't support this syntax, jOOQ simulates it using a <reference id="case-expressions" title="CASE expression"/> as follows
    -											</p>
    -</html><code-pair>
    -<sql><![CDATA[SELECT 
    -  BOOK.AUTHOR_ID, BOOK.CO_AUTHOR_ID, BOOK.TITLE
    -FROM BOOK
    -ORDER BY AUTHOR_ID ASC,
    -         CASE WHEN CO_AUTHOR_ID IS NULL 
    -              THEN 1 ELSE 0 END ASC,
    -         CO_AUTHOR_ID ASC]]></sql><java><![CDATA[create.select(
    -         BOOK.AUTHOR_ID, 
    -         BOOK.CO_AUTHOR_ID,
    -         BOOK.TITLE)
    -      .from(BOOK)
    -      .orderBy(BOOK.AUTHOR_ID.asc(),
    -               BOOK.CO_AUTHOR_ID.asc().nullsLast());]]></java></code-pair><html>
    -
    -											<h3>Ordering using CASE expressions</h3>
    -											<p>
    -												Using <reference id="case-expressions" title="CASE expressions"/> in SQL ORDER BY clauses is a common pattern, if you want to introduce some sort indirection / sort mapping into your queries. As with SQL, you can add any type of <reference id="column-expressions" title="column expression"/> into your ORDER BY clause. For instance, if you have two favourite books that you always want to appear on top, you could write:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT *
    -FROM BOOK
    -ORDER BY CASE TITLE
    -         WHEN '1984' THEN 0
    -         WHEN 'Animal Farm' THEN 1
    -         ELSE 2 END ASC]]></sql><java><![CDATA[create.select()
    -      .from(BOOK)
    -      .orderBy(decode().value(BOOK.TITLE)
    -                       .when("1984", 0)
    -                       .when("Animal Farm", 1)
    -                       .otherwise(2).asc());]]></java></code-pair><html>
    -
    -											<p>
    -												But writing these things can become quite verbose. jOOQ supports a convenient syntax for specifying sort mappings. The same query can be written in jOOQ as such:
    -											</p>
    -
    -</html><java><![CDATA[create.select()
    -      .from(BOOK)
    -      .orderBy(BOOK.TITLE.sortAsc("1984", "Animal Farm"));]]></java><html>
    -
    -											<p>
    -												More complex sort indirections can be provided using a Map:
    -											</p>
    -
    -</html><java><![CDATA[create.select()
    -      .from(BOOK)
    -      .orderBy(BOOK.TITLE.sort(new HashMap<String, Integer>() {{
    -          put("1984", 1);
    -          put("Animal Farm", 13);
    -          put("The jOOQ book", 10);
    -      }}));]]></java><html>
    -
    -      										<p>
    -      											Of course, you can combine this feature with the previously discussed NULLS FIRST / NULLS LAST feature. So, if in fact these two books are the ones you like least, you can put all NULLS FIRST (all the other books):
    -      										</p>
    -
    -</html><java><![CDATA[create.select()
    -      .from(BOOK)
    -      .orderBy(BOOK.TITLE.sortAsc("1984", "Animal Farm").nullsFirst());]]></java><html>
    -
    -											<h3>jOOQ's understanding of SELECT .. ORDER BY</h3>
    -											<p>
    -												The SQL standard defines that a "query expression" can be ordered, and that query expressions can contain <reference id="union-clause" title="UNION, INTERSECT and EXCEPT clauses"/>, whose subqueries cannot be ordered. While this is defined as such in the SQL standard, many databases allowing for the non-standard <reference id="limit-clause" title="LIMIT clause"/> in one way or another, do not adhere to this part of the SQL standard. Hence, jOOQ allows for ordering all SELECT statements, regardless whether they are constructed as a part of a UNION or not. Corner-cases are handled internally by jOOQ, by introducing synthetic subselects to adhere to the correct syntax, where this is needed.
    -											</p>
    -											
    -											
    -											<h3>Oracle's ORDER SIBLINGS BY clause</h3>
    -											<p>
    -												jOOQ also supports Oracle's SIBLINGS keyword to be used with ORDER BY clauses for <reference id="connect-by-clause" title="hierarchical queries using CONNECT BY"/>
    -											</p>
    -										</html></content>
    -									</section>
    -
    -									<section id="limit-clause">
    -										<title>The LIMIT .. OFFSET clause</title>
    -										<content><html>
    -											<p>
    -												While being extremely useful for every application that does paging, or just to limit result sets to reasonable sizes, this clause is not yet part of any SQL standard (up until SQL:2008). Hence, there exist a variety of possible implementations in various SQL dialects, concerning this limit clause. jOOQ chose to implement the LIMIT .. OFFSET clause as understood and supported by MySQL, H2, HSQLDB, Postgres, and SQLite. Here is an example of how to apply limits with jOOQ:
    -											</p>
    -
    -</html><java><![CDATA[create.select().from(BOOK).limit(1).offset(2);]]></java><html>
    -
    -											<p>
    -												This will limit the result to 1 books starting with the 2nd book (starting at offset 0!). limit() is supported in all dialects, offset() in all but Sybase ASE, which has no reasonable means to simulate it. This is how jOOQ simulates the above query in various SQL dialects:
    -											</p>
    -
    -</html><sql><![CDATA[-- MySQL, H2, HSQLDB, Postgres, and SQLite
    -SELECT * FROM BOOK LIMIT 1 OFFSET 2
    -
    --- CUBRID supports a MySQL variant of the LIMIT .. OFFSET clause
    -SELECT * FROM BOOK LIMIT 2, 1
    -
    --- Derby, SQL Server 2012
    -SELECT * FROM BOOK OFFSET 2 ROWS FETCH NEXT 1 ROWS ONLY
    -
    --- Ingres
    -SELECT * FROM BOOK OFFSET 2 FETCH FIRST 1 ROWS ONLY
    -
    --- Firebird
    -SELECT * FROM BOOK ROWS 2 TO 3
    -
    --- Sybase SQL Anywhere
    -SELECT TOP 1 ROWS START AT 3 * FROM BOOK
    -
    --- DB2 (without OFFSET)
    -SELECT * FROM BOOK FETCH FIRST 1 ROWS ONLY
    -
    --- Sybase ASE, SQL Server 2008 (without OFFSET)
    -SELECT TOP 1 * FROM BOOK
    -
    --- DB2 (with OFFSET), SQL Server 2008 (with OFFSET), Oracle (actual query may vary)
    -SELECT * FROM (
    -  SELECT LIMIT_98843777.*, ROW_NUMBER() OVER (ORDER BY ID ASC) AS ROWNUM_98843777
    -  FROM (
    -    SELECT TOP 100 PERCENT *
    -    FROM BOOK
    -    ORDER BY ID ASC
    -  ) AS LIMIT_98843777
    -) AS OUTER_LIMIT_98843777
    -WHERE ROWNUM_98843777 > 1
    -AND ROWNUM_98843777 <= 3
    -]]></sql><html>
    -
    -											<p>
    -												As you can see, jOOQ will take care of the incredibly painful ROW_NUMBER() OVER() (or ROWNUM for Oracle) filtering in subselects for you, you'll just have to write limit(1).offset(2) in any dialect.
    -											</p>
    -
    -											<h3>SQL Server's ORDER BY, TOP and subqueries</h3>
    -											<p>
    -												As can be seen in the above example, writing correct SQL can be quite tricky, depending on the SQL dialect. For instance, with SQL Server, you cannot have an ORDER BY clause in a subquery, unless you also have a TOP clause. This is illustrated by the fact that jOOQ renders a TOP 100 PERCENT clause for you. The same applies to the fact that ROW_NUMBER() OVER() needs an ORDER BY windowing clause, even if you don't provide one to the jOOQ query. By default, jOOQ adds ordering by the first column of your projection.
    -											</p>
    -										</html></content>
    -									</section>
    -
    -									<section id="for-update-clause">
    -										<title>The FOR UPDATE clause</title>
    -										<content><html>
    -											<p>
    -												For inter-process synchronisation and other reasons, you may choose to use the SELECT .. FOR UPDATE clause to indicate to the database, that a set of cells or records should be locked by a given transaction for subsequent updates. With jOOQ, this can be achieved as such:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT *
    -FROM BOOK
    -WHERE ID = 3
    -FOR UPDATE]]></sql><java><![CDATA[create.select()
    -      .from(BOOK)
    -      .where(BOOK.ID.equal(3))
    -      .forUpdate();]]></java></code-pair><html>
    -
    -											<p>
    -												The above example will produce a record-lock, locking the whole record for updates. Some databases also support cell-locks using FOR UPDATE OF ..
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT *
    -FROM BOOK
    -WHERE ID = 3
    -FOR UPDATE OF TITLE]]></sql><java><![CDATA[create.select()
    -      .from(BOOK)
    -      .where(BOOK.ID.equal(3))
    -      .forUpdate().of(BOOK.TITLE);]]></java></code-pair><html>
    -
    -											<p>
    -												Oracle goes a bit further and also allows to specify the actual locking behaviour. It features these additional clauses, which are all supported by jOOQ:
    -											</p>
    -											<ul>
    -												<li><code>FOR UPDATE NOWAIT</code>: This is the default behaviour. If the lock cannot be acquired, the query fails immediately</li>
    -												<li><code>FOR UPDATE WAIT n</code>: Try to wait for [n] seconds for the lock acquisition. The query will fail only afterwards</li>
    -												<li><code>FOR UPDATE SKIP LOCKED</code>: This peculiar syntax will skip all locked records. This is particularly useful when implementing queue tables with multiple consumers</li>
    -											</ul>
    -											<p>
    -												With jOOQ, you can use those Oracle extensions as such:
    -											</p>
    -
    -</html><java><![CDATA[create.select().from(BOOK).where(BOOK.ID.equal(3)).forUpdate().nowait();
    -create.select().from(BOOK).where(BOOK.ID.equal(3)).forUpdate().wait(5);
    -create.select().from(BOOK).where(BOOK.ID.equal(3)).forUpdate().skipLocked();]]></java><html>
    -
    -											<h3>FOR UPDATE in CUBRID and SQL Server</h3>
    -											<p>
    -												The SQL standard specifies a <code>FOR UPDATE</code> clause to be applicable for cursors. Most databases interpret this as being applicable for all <code>SELECT</code> statements. An exception to this rule are the CUBRID and SQL Server databases, that do not allow for any <code>FOR UPDATE</code> clause in a regular SQL <code>SELECT</code> statement. jOOQ simulates the <code>FOR UPDATE</code> behaviour, by locking record by record with JDBC. JDBC allows for specifying the flags <code>TYPE_SCROLL_SENSITIVE</code>, <code>CONCUR_UPDATABLE</code> for any statement, and then using ResultSet.updateXXX() methods to produce a cell-lock / row-lock. Here's a simplified example in JDBC:
    -											</p>
    -</html><java><![CDATA[PreparedStatement stmt = connection.prepareStatement(
    -  "SELECT * FROM author WHERE id IN (3, 4, 5)",
    -  ResultSet.TYPE_SCROLL_SENSITIVE,
    -  ResultSet.CONCUR_UPDATABLE);
    -ResultSet rs = stmt.executeQuery();
    -
    -while (rs.next()) {
    -  // UPDATE the primary key for row-locks, or any other columns for cell-locks
    -  rs.updateObject(1, rs.getObject(1));
    -  rs.updateRow();
    -
    -  // Do more stuff with this record
    -}]]></java><html>
    -
    -											<p>
    -												The main drawback of this approach is the fact that the database has to maintain a scrollable cursor, whose records are locked one by one. This can cause a major risk of deadlocks or race conditions if the JDBC driver can recover from the unsuccessful locking, if two Java threads execute the following statements:
    -											</p>
    -
    -</html><sql><![CDATA[-- thread 1
    -SELECT * FROM author ORDER BY id ASC;
    -
    --- thread 2
    -SELECT * FROM author ORDER BY id DESC;]]></sql><html>
    -
    -											<p>
    -												So use this technique with care, possibly only ever locking single rows!
    -											</p>
    -
    -											<h3>Pessimistic (shared) locking with the <code>FOR SHARE</code> clause</h3>
    -											<p>
    -												Some databases (MySQL, Postgres) also allow to issue a non-exclusive lock explicitly using a <code>FOR SHARE</code> clause. This is also supported by jOOQ
    -											</p>
    -
    -											<h3>Optimistic locking in jOOQ</h3>
    -											<p>
    -												Note, that jOOQ also supports optimistic locking, if you're doing simple CRUD. This is documented in the section's manual about <reference id="optimistic-locking" title="optimistic locking"/>.
    -											</p>
    -										</html></content>
    -									</section>
    -
    -									<section id="union-clause">
    -										<title>UNION, INTERSECTION and EXCEPT</title>
    -										<content><html>
    -											<p>
    -												SQL allows to perform set operations as understood in standard set theory on result sets. These operations include unions, intersections, subtractions. For two subselects to be combinable by such a set operator, each subselect must return a <reference id="table-expressions" title="table expression"/> of the same degree and type.
    -											</p>
    -											
    -											<h3>UNION and UNION ALL</h3>
    -											<p>
    -												These operators combine two results into one. While <code>UNION</code> removes all duplicate records resulting from this combination, <code>UNION ALL</code> leaves subselect results as they are. Typically, you should prefer <code>UNION ALL</code> over <code>UNION</code>, if you don't really need to remove duplicates. The following example shows how to use such a <code>UNION</code> operation in jOOQ.
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT * FROM BOOK WHERE ID = 3
    -UNION ALL
    -SELECT * FROM BOOK WHERE ID = 5]]></sql><java><![CDATA[create.selectFrom(BOOK).where(BOOK.ID.equal(3))
    -      .unionAll(
    -create.selectFrom(BOOK).where(BOOK.ID.equal(5)));]]></java></code-pair><html>
    -											
    -											<h3>INTERSECT [ ALL ] and EXCEPT [ ALL ]</h3>
    -											<p>
    -												<code>INTERSECT</code> is the operation that produces only those values that are returned by both subselects. <code>EXCEPT</code> is the operation that returns only those values that are returned exclusively in the first subselect. Both operators will remove duplicates from their results. The SQL standard allows to specify the <code>ALL</code> keyword for both of these operators as well, but this is hardly supported in any database. jOOQ does not support <code>INTERSECT ALL</code>, <code>EXEPT ALL</code> operations either. 
    -											</p>
    -											
    -											<h3>jOOQ's set operators and how they're different from standard SQL</h3>
    -											<p>
    -												As previously mentioned in the manual's section about the <reference id="order-by-clause" title="ORDER BY clause"/>, jOOQ has slightly changed the semantics of these set operators. While in SQL, a subselect may not contain any <reference id="order-by-clause" title="ORDER BY clause"/> or <reference id="limit-clause" title="LIMIT clause"/> (unless you wrap the subselect into a <reference id="nested-selects" title="nested SELECT"/>), jOOQ allows you to do so. In order to select both the youngest and the oldest author from the database, you can issue the following statement with jOOQ (rendered to the MySQL dialect):
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[  (SELECT * FROM AUTHOR 
    -   ORDER BY DATE_OF_BIRTH ASC LIMIT 1)
    -UNION
    -  (SELECT * FROM AUTHOR 
    -   ORDER BY DATE_OF_BIRTH DESC LIMIT 1)]]></sql><java><![CDATA[create.selectFrom(AUTHOR)
    -      .orderBy(AUTHOR.DATE_OF_BIRTH.asc()).limit(1)
    -      .union(
    -create.selectFrom(AUTHOR)
    -      .orderBy(AUTHOR.DATE_OF_BIRTH.desc()).limit(1));]]></java></code-pair><html>
    -		
    -											<h3>Projection typesafety for degrees between 1 and {max-row-degree}</h3>
    -											<p>
    -												Two subselects that are combined by a set operator are required to be of the same degree and, in most databases, also of the same type. jOOQ 3.0's introduction of <reference id="record-n" title="Typesafe Record[N] types"/> helps compile-checking these constraints:
    -											</p>
    -											
    -</html><java><![CDATA[// Some sample SELECT statements
    -Select<Record2<Integer, String>>  s1 = select(BOOK.ID, BOOK.TITLE).from(BOOK);
    -Select<Record1<Integer>>          s2 = selectOne();
    -Select<Record2<Integer, Integer>> s3 = select(one(), zero());
    -Select<Record2<Integer, String>>  s4 = select(one(), inline("abc"));
    -
    -// Let's try to combine them:
    -s1.union(s2); // Doesn't compile because of a degree mismatch. Expected: Record2<...>, got: Record1<...>
    -s1.union(s3); // Doesn't compile because of a type mismatch. Expected: <Integer, String>, got: <Integer, Integer>
    -s1.union(s4); // OK. The two Record[N] types match]]></java></content>
    -									</section>
    -
    -									<section id="oracle-hints">
    -										<title>Oracle-style hints</title>
    -										<content><html>
    -											<p>
    -												If you are closely coupling your application to an Oracle (or CUBRID) database,	you might need to be able to pass hints of the form <code>/*+HINT*/</code> with your SQL statements to the Oracle database. For example:
    -											</p>
    -
    -</html><sql>SELECT /*+ALL_ROWS*/ FIRST_NAME, LAST_NAME
    -  FROM AUTHOR</sql><html>
    -
    -				  							<p>
    -				  								This can be done in jOOQ using the <code>.hint()</code> clause in your SELECT statement:
    -			  								</p>
    -
    -</html><java>create.select(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -      .hint("/*+ALL_ROWS*/")
    -      .from(AUTHOR);</java><html>
    -
    -											<p>
    -												Note that you can pass any string in the <code>.hint()</code> clause. If you use that clause, the passed string will always be put in between the <code>SELECT [DISTINCT]</code> keywords and the actual projection list. This can be useful in other databases too, such as MySQL, for instance:
    -											</p>
    -											
    -</html><code-pair>
    -<sql><![CDATA[SELECT SQL_CALC_FOUND_ROWS field1, field2
    -FROM table1
    -]]></sql><java><![CDATA[create.select(field1, field2)
    -       .hint("SQL_CALC_FOUND_ROWS")
    -       .from(table1)]]></java>
    -</code-pair><html>
    -										</html></content>
    -									</section>
    -									
    -									<section id="select-lexical-vs-logical-order">
    -										<title>Lexical and logical SELECT clause order</title>
    -										<content><html>
    -											<p>
    -												SQL has a lexical and a logical order of <code>SELECT</code> clauses. The lexical order of <code>SELECT</code> clauses is inspired by the English language. As SQL statements are commands for the database, it is natural to express a statement in an imperative tense, such as "SELECT this and that!".
    -											</p>
    -											
    -											<h3>Logical SELECT clause order</h3>
    -											<p>
    -												The logical order of <code>SELECT</code> clauses, however, does not correspond to the syntax. In fact, the logical order is this:
    -											</p>
    -											
    -											<ul>
    -												<li><reference id="from-clause" title="The FROM clause"/>: First, all data sources are defined and joined</li>
    -												<li><reference id="where-clause" title="The WHERE clause"/>: Then, data is filtered as early as possible</li>
    -												<li><reference id="connect-by-clause" title="The CONNECT BY clause"/>: Then, data is traversed iteratively or recursively, to produce new tuples</li>
    -												<li><reference id="group-by-clause" title="The GROUP BY clause"/>: Then, data is reduced to groups, possibly producing new tuples if <reference id="grouping-functions" title="grouping functions like ROLLUP(), CUBE(), GROUPING SETS()"/> are used</li>
    -												<li><reference id="having-clause" title="The HAVING clause"/>: Then, data is filtered again</li>
    -												<li><reference id="select-clause" title="The SELECT clause"/>: Only now, the projection is evaluated. In case of a <code>SELECT DISTINCT</code> statement, data is further reduced to remove duplicates</li>
    -												<li><reference id="union-clause" title="The UNION clause"/>: Optionally, the above is repeated for several <code>UNION</code>-connected subqueries. Unless this is a <code>UNION ALL</code> clause, data is further reduced to remove duplicates</li>
    -												<li><reference id="order-by-clause" title="The ORDER BY clause"/>: Now, all remaining tuples are ordered</li>
    -												<li><reference id="limit-clause" title="The LIMIT clause"/>: Then, a paging view is created for the ordered tuples</li>
    -												<li><reference id="for-update-clause" title="The FOR UPDATE clause"/>: Finally, pessimistic locking is applied</li>
    -											</ul>
    -											
    -											<p>
    -												The <a href="http://msdn.microsoft.com/en-us/library/ms189499.aspx">SQL Server documentation</a> also explains this, with slightly different clauses:
    -											</p>
    -											
    -											<ul>
    -												<li><code>FROM</code></li>
    -												<li><code>ON</code></li>
    -												<li><code>JOIN</code></li>
    -												<li><code>WHERE</code></li>
    -												<li><code>GROUP BY</code></li>
    -												<li><code>WITH CUBE</code> or <code>WITH ROLLUP</code></li>
    -												<li><code>HAVING</code></li>
    -												<li><code>SELECT</code></li>
    -												<li><code>DISTINCT</code></li>
    -												<li><code>ORDER BY</code></li>
    -												<li><code>TOP</code></li>
    -											</ul>
    -											
    -											<p>
    -												As can be seen, databases have to logically reorder a SQL statement in order to determine the best execution plan. 
    -											</p>
    -											
    -											<h3>Alternative syntaxes: LINQ, SLICK</h3>
    -											<p>
    -											    Some "higher-level" abstractions, such as C#'s LINQ or Scala's SLICK try to inverse the lexical order of <code>SELECT</code> clauses to what appears to be closer to the logical order. The obvious advantage of moving the <code>SELECT</code> clause to the end is the fact that the projection type, which is the record type returned by the <code>SELECT</code> statement can be re-used more easily in the target environment of the internal domain specific language.
    -											</p>
    -											
    -											<p>
    -												A LINQ example:
    -											</p>
    -</html><java><![CDATA[// LINQ-to-SQL looks somewhat similar to SQL
    -// AS clause    // FROM clause
    -From p          In db.Products
    -
    -// WHERE clause
    -Where p.UnitsInStock <= p.ReorderLevel AndAlso Not p.Discontinued
    -
    -// SELECT clause
    -Select p]]></java><html>											
    -											
    -											<p> 
    -											    A SLICK example:
    -											</p>
    -											
    -</html><scala><![CDATA[// "for" is the "entry-point" to the DSL
    -val q = for {
    -
    -    // FROM clause   WHERE clause
    -    c <- Coffees     if c.supID === 101
    -
    -// SELECT clause and projection to a tuple
    -} yield (c.name, c.price)]]></scala><html>
    -
    -											<p>
    -												While this looks like a good idea at first, it only complicates translation to more advanced SQL statements while impairing readability for those users that are used to writing SQL. jOOQ is designed to look just like SQL. This is specifically true for SLICK, which not only changed the <code>SELECT</code> clause order, but also heavily "integrated" SQL clauses with the Scala language.
    -											</p>
    -											<p>
    -												For these reasons, the jOOQ DSL API is modelled in SQL's lexical order.
    -											</p>
    -										</html></content>
    -									</section>
    -								</sections>
    -							</section>
    -
    -							<section id="insert-statement">
    -								<title>The INSERT statement</title>
    -								<content><html>
    -									<p>
    -										The <code>INSERT</code> statement is used to insert new records into a database table. Records can either be supplied using a <code>VALUES()</code> constructor, or a <code>SELECT</code> statement. jOOQ supports both types of <code>INSERT</code> statements. An example of an <code>INSERT</code> statement using a <code>VALUES()</code> constructor is given here:
    -									</p>
    -
    -
    -</html><code-pair>
    -<sql>INSERT INTO AUTHOR 
    -       (ID, FIRST_NAME, LAST_NAME)
    -VALUES (100, 'Hermann', 'Hesse');</sql><java>create.insertInto(AUTHOR,
    -        AUTHOR.ID, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -      .values(100, "Hermann", "Hesse");</java></code-pair><html>
    -
    -									<p>
    -										Note that for explicit degrees up to {max-row-degree}, the <code>VALUES()</code> constructor provides additional typesafety. The following example illustrates this:
    -									</p>
    -
    -</html><java><![CDATA[InsertValuesStep3<AuthorRecord, Integer, String, String> step = 
    -  create.insertInto(AUTHOR, AUTHOR.ID, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME);
    -    step.values("A", "B", "C");
    -         // ^^^ Doesn't compile, the expected type is Integer]]></java><html>
    -									<h3>INSERT multiple rows with the VALUES() constructor</h3>
    -									<p>
    -										The SQL standard specifies that multiple rows can be supplied to the VALUES() constructor in an INSERT statement. Here's an example of a multi-record INSERT
    -									</p>
    -</html><code-pair>
    -<sql>INSERT INTO AUTHOR
    -       (ID, FIRST_NAME, LAST_NAME)
    -VALUES (100, 'Hermann', 'Hesse'),
    -       (101, 'Alfred', 'Döblin');</sql><java>create.insertInto(AUTHOR,
    -        AUTHOR.ID, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -      .values(100, "Hermann", "Hesse")
    -      .values(101, "Alfred", "Döblin");</java></code-pair><html>
    -
    -									<p>
    -										jOOQ tries to stay close to actual SQL. In detail, however, Java's expressiveness is limited. That's why the values() clause is repeated for every record in multi-record inserts. 
    -									</p>
    -									<p> 
    -										Some RDBMS do not support inserting several records in a single statement. In those cases, jOOQ simulates multi-record INSERTs using the following SQL:
    -									</p>
    -
    -</html><code-pair>
    -<sql>INSERT INTO AUTHOR
    -    (ID, FIRST_NAME, LAST_NAME)
    -SELECT 100, 'Hermann', 'Hesse' FROM DUAL UNION ALL
    -SELECT 101, 'Alfred', 'Döblin' FROM DUAL;</sql><java>create.insertInto(AUTHOR,
    -        AUTHOR.ID, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -      .values(100, "Hermann", "Hesse")
    -      .values(101, "Alfred", "Döblin");
    -</java></code-pair><html>
    -
    -									<h3>INSERT using jOOQ's alternative syntax</h3>
    -									<p>
    -										MySQL (and some other RDBMS) allow for using a non-SQL-standard, UPDATE-like syntax for INSERT statements. This is also supported in jOOQ, should you prefer that syntax. The above INSERT statement can also be expressed as follows:
    -									</p>
    -
    -</html><java>create.insertInto(AUTHOR)
    -      .set(AUTHOR.ID, 100)
    -      .set(AUTHOR.FIRST_NAME, "Hermann")
    -      .set(AUTHOR.LAST_NAME, "Hesse")
    -      .newRecord()
    -      .set(AUTHOR.ID, 101)
    -      .set(AUTHOR.FIRST_NAME, "Alfred")
    -      .set(AUTHOR.LAST_NAME, "Döblin");</java><html>
    -      
    -									<p>
    -										As you can see, this syntax is a bit more verbose, but also more readable, as every field can be matched with its value. Internally, the two syntaxes are strictly equivalent.
    -									</p>
    -
    -									<h3>MySQL's INSERT .. ON DUPLICATE KEY UPDATE</h3>
    -									<p>
    -										The MySQL database supports a very convenient way to INSERT or UPDATE a record. This is a non-standard extension to the SQL syntax, which is supported by jOOQ and simulated in other RDBMS, where this is possible (i.e. if they support the SQL standard <reference id="merge-statement" title="MERGE statement"/>). Here is an example how to use the ON DUPLICATE KEY UPDATE clause:
    -									</p>
    -									
    -</html><java>// Add a new author called "Koontz" with ID 3.
    -// If that ID is already present, update the author's name
    -create.insertInto(AUTHOR, AUTHOR.ID, AUTHOR.LAST_NAME)
    -      .values(3, "Koontz")
    -      .onDuplicateKeyUpdate()
    -      .set(AUTHOR.LAST_NAME, "Koontz");</java><html>
    -
    -									<h3>The synthetic ON DUPLICATE KEY IGNORE clause</h3>
    -							
    -									<p>
    -										The MySQL database also supports an INSERT IGNORE INTO clause. This is supported by jOOQ using the more convenient SQL syntax variant of ON DUPLICATE KEY IGNORE, which can be equally simulated in other databases using a <reference id="merge-statement" title="MERGE statement"/>:
    -									</p>
    -									
    -</html><java>// Add a new author called "Koontz" with ID 3.
    -// If that ID is already present, ignore the INSERT statement
    -create.insertInto(AUTHOR, AUTHOR.ID, AUTHOR.LAST_NAME)
    -      .values(3, "Koontz")
    -      .onDuplicateKeyIgnore();</java><html>
    -
    -      								<h3>Postgres's INSERT .. RETURNING</h3>
    -									<p>
    -										The Postgres database has native support for an INSERT .. RETURNING clause. This is a very powerful concept that is simulated for all other dialects using JDBC's <reference class="java.sql.Statement" anchor="#getGeneratedKeys()" title="getGeneratedKeys()"/> method. Take this example:
    -									</p>
    -
    -</html><java><![CDATA[// Add another author, with a generated ID
    -Record<?> record =
    -create.insertInto(AUTHOR, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -      .values("Charlotte", "Roche")
    -      .returning(AUTHOR.ID)
    -      .fetchOne();
    -
    -System.out.println(record.getValue(AUTHOR.ID));
    -
    -// For some RDBMS, this also works when inserting several values
    -// The following should return a 2x2 table
    -Result<?> result =
    -create.insertInto(AUTHOR, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -      .values("Johann Wolfgang", "von Goethe")
    -      .values("Friedrich", "Schiller")
    -      // You can request any field. Also trigger-generated values
    -      .returning(AUTHOR.ID, AUTHOR.CREATION_DATE)
    -      .fetch();]]></java><html>
    -
    -		      						<p>
    -		      							Some databases have poor support for returning generated keys after INSERTs. In those cases, jOOQ might need to issue another <reference id="select-statement" title="SELECT statement"/> in order to fetch an @@identity value. Be aware, that this can lead to race-conditions in those databases that cannot properly return generated ID values. For more information, please consider the jOOQ Javadoc for the returning() clause.
    -		      						</p>
    -
    -									<h3>The INSERT SELECT statement</h3>
    -							
    -									<p>
    -										In some occasions, you may prefer the INSERT SELECT syntax, for instance, when you copy records from one table to another:
    -									</p>
    -									
    -</html><java>create.insertInto(AUTHOR_ARCHIVE)
    -      .select(create.selectFrom(AUTHOR).where(AUTHOR.DECEASED.isTrue()));</java></content>
    -							</section>
    -
    -							<section id="update-statement">
    -								<title>The UPDATE statement</title>
    -								<content><html>
    -									<p>
    -										The UPDATE statement is used to modify one or several pre-existing records in a database table. UPDATE statements are only possible on single tables. Support for multi-table updates will be implemented in the near future. An example update query is given here:
    -									</p>
    -
    -</html><code-pair>
    -<sql>UPDATE AUTHOR
    -   SET FIRST_NAME = 'Hermann',
    -       LAST_NAME = 'Hesse'
    - WHERE ID = 3;</sql><java>create.update(AUTHOR)
    -      .set(AUTHOR.FIRST_NAME, "Hermann")
    -      .set(AUTHOR.LAST_NAME, "Hesse")
    -      .where(AUTHOR.ID.equal(3));</java>
    -</code-pair><html>
    -
    -									<p>
    -										Most databases allow for using scalar subselects in UPDATE statements in one way or another. jOOQ models this through a <code>set(Field&lt;T>, Select&lt;? extends Record1&lt;T>>) method in the UPDATE DSL API:</code>
    -									</p>
    -
    -</html><code-pair>
    -<sql>UPDATE AUTHOR
    -   SET FIRST_NAME = (
    -         SELECT FIRST_NAME
    -         FROM PERSON
    -         WHERE PERSON.ID = AUTHOR.ID
    -       ),
    - WHERE ID = 3;</sql><java>create.update(AUTHOR)
    -      .set(AUTHOR.FIRST_NAME, 
    -         select(PERSON.FIRST_NAME)
    -        .from(PERSON)
    -        .where(PERSON.ID.equal(AUTHOR.ID))
    -      )
    -      .where(AUTHOR.ID.equal(3));</java>
    -</code-pair><html>
    -
    -
    -									<h3>Using row value expressions in an UPDATE statement</h3>
    -									<p>
    -										jOOQ supports formal <reference id="row-value-expressions" title="row value expressions"/> in various contexts, among which the UPDATE statement. Only one row value expression can be updated at a time. Here's an example:
    -									</p>
    -									
    -</html><code-pair>
    -<sql>UPDATE AUTHOR
    -   SET (FIRST_NAME, LAST_NAME) = 
    -       ('Hermann',  'Hesse')
    - WHERE ID = 3;</sql><java>create.update(AUTHOR)
    -      .set(row(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME),
    -           row("Herman",          "Hesse"))
    -      .where(AUTHOR.ID.equal(3));</java>
    -</code-pair><html>
    -
    -									<p>
    -										This can be particularly useful when using subselects:
    -									</p>
    -
    -</html><code-pair>
    -<sql>UPDATE AUTHOR
    -   SET (FIRST_NAME, LAST_NAME) = (
    -         SELECT PERSON.FIRST_NAME, PERSON.LAST_NAME
    -         FROM PERSON
    -         WHERE PERSON.ID = AUTHOR.ID
    -       )
    - WHERE ID = 3;</sql><java>create.update(AUTHOR)
    -      .set(row(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME),
    -           select(PERSON.FIRST_NAME, PERSON.LAST_NAME)
    -          .from(PERSON)
    -          .where(PERSON.ID.equal(AUTHOR.ID))
    -      )
    -      .where(AUTHOR.ID.equal(3));</java>
    -</code-pair><html>
    -
    -									<p>
    -										The above row value expressions usages are completely typesafe.
    -									</p>
    -									
    -									<h3>UPDATE .. RETURNING</h3>
    -									<p>
    -										The Firebird and Postgres databases support a <code>RETURNING</code> clause on their <code>UPDATE</code> statements, similar as the <code>RETURNING</code> clause in <reference id="insert-statement" title="INSERT statements"/>. This is useful to fetch trigger-generated values in one go. An example is given here:
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[-- Fetch a trigger-generated value
    -UPDATE BOOK
    -SET TITLE = 'Animal Farm'
    -WHERE ID = 5
    -RETURNING UPDATE_COUNT]]></sql><java><![CDATA[int count = create.update(BOOK)
    -                  .set(BOOK.TITLE, "Animal Farm")
    -                  .where(BOOK.ID.equal(5))
    -                  .returning(BOOK.UPDATE_COUNT)
    -                  .fetchOne().getValue(BOOK.UPDATE_COUNT);]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										The <code>UPDATE .. RETURNING</code> clause is currently not simulated for other databases. Future versions might execute an additional <reference id="select-statement" title="SELECT statement"/> to fetch results.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="delete-statement">
    -								<title>The DELETE statement</title>
    -								<content><html>
    -									<p>
    -										The DELETE statement physically removes records from a database table. DELETE statements are only possible on single tables. Support for multi-table deletes will be implemented in the near future. An example delete query is given here:
    -									</p>
    -
    -</html><code-pair>
    -<sql>DELETE AUTHOR
    - WHERE ID = 100;</sql><java>create.delete(AUTHOR)
    -      .where(AUTHOR.ID.equal(100));</java>
    -</code-pair><html>
    -
    -								</html></content>
    -							</section>
    -
    -							<section id="merge-statement">
    -								<title>The MERGE statement</title>
    -								<content><html>
    -									<p>
    -										The MERGE statement is one of the most advanced standardised SQL constructs, which is supported by DB2, HSQLDB, Oracle, SQL Server and Sybase (MySQL has the similar INSERT .. ON DUPLICATE KEY UPDATE construct)
    -									</p>
    -									<p>
    -										The point of the standard MERGE statement is to take a TARGET table, and merge (INSERT, UPDATE) data from a SOURCE table into it. DB2, Oracle, SQL Server and Sybase also allow for DELETING some data and for adding many additional clauses. With jOOQ {jooq-version}, only Oracle's MERGE extensions are supported. Here is an example:
    -									</p>
    -
    -</html><code-pair>
    -<sql>-- Check if there is already an author called 'Hitchcock'
    --- If there is, rename him to John. If there isn't add him.
    -MERGE INTO AUTHOR
    -USING (SELECT 1 FROM DUAL)
    -ON (LAST_NAME = 'Hitchcock')
    -WHEN MATCHED THEN UPDATE SET FIRST_NAME = 'John'
    -WHEN NOT MATCHED THEN INSERT (LAST_NAME) VALUES ('Hitchcock')</sql><java>create.mergeInto(AUTHOR)
    -      .using(create().selectOne())
    -      .on(AUTHOR.LAST_NAME.equal("Hitchcock"))
    -      .whenMatchedThenUpdate()
    -      .set(AUTHOR.FIRST_NAME, "John")
    -      .whenNotMatchedThenInsert(AUTHOR.LAST_NAME)
    -      .values("Hitchcock");
    -
    -</java></code-pair><html>
    -
    -		                            <h3>MERGE Statement (H2-specific syntax)</h3>
    -									<p>
    -									    The H2 database ships with a somewhat less powerful but a little more intuitive syntax for its own version of the MERGE statement. An example more or less equivalent to the previous one can be seen here:
    -									</p>
    -									
    -</html><code-pair>
    -<sql>-- Check if there is already an author called 'Hitchcock'
    --- If there is, rename him to John. If there isn't add him.
    -
    -MERGE INTO AUTHOR (FIRST_NAME, LAST_NAME)
    -KEY (LAST_NAME)
    -VALUES ('John', 'Hitchcock')</sql><java>create.mergeInto(AUTHOR,
    -                 AUTHOR.FIRST_NAME,
    -                 AUTHOR.LAST_NAME)
    -      .key(AUTHOR.LAST_NAME)
    -      .values("John", "Hitchcock")
    -      .execute();
    -</java></code-pair><html>
    -
    -		                            <p>
    -		                                This syntax can be fully simulated by jOOQ for all other databases that support the SQL standard. For more information about the H2 MERGE syntax, see the documentation here:<br/>
    -		                                <a href="http://www.h2database.com/html/grammar.html#merge">http://www.h2database.com/html/grammar.html#merge</a>
    -		                            </p>
    -								
    -									<h3>Typesafety of VALUES() for degrees up to {max-row-degree}</h3>
    -									<p>
    -										Much like the <reference id="insert-statement" title="INSERT statement"/>, the <code>MERGE</code> statement's <code>VALUES()</code> clause provides typesafety for degrees up to {max-row-degree}, in both the standard syntax variant as well as the H2 variant.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="truncate-statement">
    -								<title>The TRUNCATE statement</title>
    -								<content><html>
    -									<p>
    -										The TRUNCATE statement is the only DDL statement supported by jOOQ so far. It is popular in many databases when you want to bypass constraints for table truncation. Databases may behave differently, when a truncated table is referenced by other tables. For instance, they may fail if records from a truncated table are referenced, even with ON DELETE CASCADE clauses in place. Please, consider your database manual to learn more about its TRUNCATE implementation.
    -									</p>
    -									<p>
    -										The TRUNCATE syntax is trivial:
    -									</p>
    -
    -</html><code-pair>
    -	<sql>TRUNCATE TABLE AUTHOR;</sql><java>create.truncate(AUTHOR).execute();</java>
    -</code-pair><html>
    -									
    -									<p>
    -										TRUNCATE is not supported by Ingres and SQLite. jOOQ will execute a DELETE FROM AUTHOR statement instead.
    -									</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -					<section id="table-expressions">
    -						<title>Table expressions</title>
    -						<content><html>
    -							<p>
    -								The following sections explain the various types of table expressions supported by jOOQ
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="generated-tables">
    -								<title>Generated Tables</title>
    -								<content><html>
    -									<p>
    -										Most of the times, when thinking about a <reference id="table-expressions" title="table expression"/> you're probably thinking about an actual physical table in your database schema. If you're using jOOQ's <reference id="code-generation" title="code generator"/>, you will have all tables from your database schema available to you as type safe Java objects. You can then use these tables in SQL <reference id="from-clause" title="FROM clauses"/>, <reference id="join-clause" title="JOIN clauses"/> or in other <reference id="sql-statements" title="SQL statements"/>, just like any other table expression. An example is given here:
    -									</p>
    -							
    -</html><code-pair>
    -<sql><![CDATA[SELECT *
    -FROM AUTHOR -- Table expression AUTHOR
    -JOIN BOOK   -- Table expression BOOK
    -ON (AUTHOR.ID = BOOK.AUTHOR_ID)]]></sql><java><![CDATA[create.select()
    -      .from(AUTHOR) // Table expression AUTHOR
    -      .join(BOOK)   // Table expression BOOK
    -      .on(AUTHOR.ID.equal(BOOK.AUTHOR_ID));]]></java></code-pair><html>
    -							
    -									<p>
    -										The above example shows how AUTHOR and BOOK tables are joined in a <reference id="select-statement" title="SELECT statement"/>. It also shows how you can access physical <reference id="table-columns" title="table columns"/> by dereferencing the relevant Java attributes of their tables.
    -									</p>
    -									<p>
    -										See the manual's section about <reference id="codegen-tables" title="generated tables"/> for more information about what is really generated by the <reference id="code-generation" title="code generator"/>
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="aliased-tables">
    -								<title>Aliased Tables</title>
    -								<content><html>
    -									<p>
    -										The strength of jOOQ's <reference id="code-generation" title="code generator"/> becomes more obvious when you perform table aliasing and dereference fields from generated aliased tables. This can best be shown by example:
    -									</p>
    -
    -</html><code-pair><sql><![CDATA[-- Select all books by authors born after 1920,
    --- named "Paulo" from a catalogue:
    -
    -
    -
    -SELECT *
    -  FROM author a
    -  JOIN book b ON a.id = b.author_id
    - WHERE a.year_of_birth > 1920
    -   AND a.first_name = 'Paulo'
    - ORDER BY b.title]]></sql><java><![CDATA[// Declare your aliases before using them in SQL:
    -Author a = AUTHOR.as("a");
    -Book b = BOOK.as("b");
    -
    -// Use aliased tables in your statement
    -create.select()
    -      .from(a)
    -      .join(b).on(a.ID.equal(b.AUTHOR_ID))
    -      .where(a.YEAR_OF_BIRTH.greaterThan(1920)
    -      .and(a.FIRST_NAME.equal("Paulo")))
    -      .orderBy(b.TITLE);]]></java></code-pair><html>
    -								
    -									<p>
    -										As you can see in the above example, calling <code>as()</code> on generated tables returns an object of the same type as the table. This means that the resulting object can be used to dereference fields from the aliased table. This is quite powerful in terms of having your Java compiler check the syntax of your SQL statements. If you remove a column from a table, dereferencing that column from that table alias will cause compilation errors.
    -									</p>
    -									
    -									<h3>Dereferencing columns from other table expressions</h3>
    -									<p>
    -										Only few table expressions provide the SQL syntax typesafety as shown above, where generated tables are used. Most tables, however, expose their fields through <code>field()</code> methods:
    -									</p>
    -
    -</html><java><![CDATA[// "Type-unsafe" aliased table:
    -Table<?> a = AUTHOR.as("a");
    -
    -// Get fields from a:
    -Field<?> id = a.field("ID");
    -Field<?> firstName = a.field("FIRST_NAME");]]></java><html>
    -									
    -									<h3>Derived column lists</h3>
    -									<p>
    -										The SQL standard specifies how a table can be renamed / aliased in one go along with its columns. It references the term "derived column list" for the following syntax (as supported by Postgres, for instance):
    -									</p>
    -									
    -</html><sql><![CDATA[SELECT t.a, t.b
    -FROM (
    -  SELECT 1, 2
    -) t(a, b)]]></sql><html>
    -
    -									<p>
    -										This feature is useful in various use-cases where column names are not known in advance (but the table's degree is!). An example for this are <reference id="array-and-cursor-unnesting" title="unnested tables"/>, or the <reference id="values" title="VALUES() table constructor"/>:
    -									</p>
    -
    -</html><sql><![CDATA[-- Unnested tables
    -SELECT t.a, t.b
    -FROM unnest(my_table_function()) t(a, b)
    -
    --- VALUES() constructor
    -SELECT t.a, t.b
    -FROM VALUES(1, 2),(3, 4) t(a, b)]]></sql><html>
    -
    -									<p>
    -										Only few databases really support such a syntax, but fortunately, jOOQ can simulate it easily using <code>UNION ALL</code> and an empty dummy record specifying the new column names. The two statements are equivalent:
    -									</p>
    -
    -</html><sql><![CDATA[-- Using derived column lists
    -SELECT t.a, t.b
    -FROM (
    -  SELECT 1, 2
    -) t(a, b)
    -
    --- Using UNION ALL and a dummy record
    -SELECT t.a, t.b
    -FROM (
    -  SELECT null a, null b FROM DUAL WHERE 1 = 0
    -  UNION ALL
    -  SELECT 1, 2 FROM DUAL
    -) t]]></sql><html>
    -									<p>
    -										In jOOQ, you would simply specify a varargs list of column aliases as such:
    -									</p>
    -									
    -</html><java><![CDATA[// Unnested tables
    -create.select().from(unnest(myTableFunction()).as("t", "a", "b"));
    -
    -// VALUES() constructor
    -create.select().from(values(
    -  row(1, 2),
    -  row(3, 4)
    -).as("t", "a", "b"));]]></java></content>
    -							</section>
    -
    -							<section id="joined-tables">
    -								<title>Joined tables</title>
    -								<content><html>
    -									<p>
    -										The <reference id="join-clause" title="JOIN operators"/> that can be used in <reference id="select-statement" title="SQL SELECT statements"/> are the most powerful and best supported means of creating new <reference id="table-expressions" title="table expressions"/> in SQL. Informally, the following can be said:
    -									</p>
    -									
    -</html><text>A(colA1, ..., colAn) "join" B(colB1, ..., colBm) "produces" C(colA1, ..., colAn, colB1, ..., colBm)</text><html>
    -
    -									<p>
    -										SQL and relational algebra distinguish between at least the following JOIN types (upper-case: SQL, lower-case: relational algebra):
    -									</p>
    -									<ul>
    -										<li><strong>CROSS JOIN or cartesian product</strong>: The basic JOIN in SQL, producing a relational cross product, combining every record of table A with every record of table B. Note that cartesian products can also be produced by listing comma-separated <reference id="table-expressions" title="table expressions"/> in the <reference id="from-clause" title="FROM clause"/> of a <reference id="select-statement" title="SELECT statement"/></li>
    -										<li><strong>NATURAL JOIN</strong>: The basic JOIN in relational algebra, yet a rarely used JOIN in databases with everyday degree of normalisation. This JOIN type unconditionally equi-joins two tables by all columns with the same name (requiring foreign keys and primary keys to share the same name). Note that the JOIN columns will only figure once in the resulting <reference id="table-expressions" title="table expression"/>.</li>
    -										<li><strong>INNER JOIN or equi-join</strong>: This JOIN operation performs a cartesian product (CROSS JOIN) with a <reference id="conditional-expressions" title="filtering predicate"/> being applied to the resulting <reference id="table-expressions" title="table expression"/>. Most often, a <reference id="comparison-predicate" title="equal comparison predicate"/> comparing foreign keys and primary keys will be applied as a filter, but any other predicate will work, too.</li>
    -										<li><strong>OUTER JOIN</strong>: This JOIN operation performs a cartesian product (CROSS JOIN) with a <reference id="conditional-expressions" title="filtering predicate"/> being applied to the resulting <reference id="table-expressions" title="table expression"/>. Most often, a <reference id="comparison-predicate" title="equal comparison predicate"/> comparing foreign keys and primary keys will be applied as a filter, but any other predicate will work, too. Unlike the INNER JOIN, an OUTER JOIN will add "empty records" to the left (table A) or right (table B) or both tables, in case the conditional expression fails to produce a .</li>										
    -										<li><strong>semi-join</strong>: In SQL, this JOIN operation can only be expressed implicitly using <reference id="in-predicate" title="IN predicates"/> or <reference id="exists-predicate" title="EXISTS predicates"/>. The <reference id="table-expressions" title="table expression"/> resulting from a semi-join will only contain the left-hand side table A</li>										
    -										<li><strong>anti-join</strong>: In SQL, this JOIN operation can only be expressed implicitly using <reference id="in-predicate" title="NOT IN predicates"/> or <reference id="exists-predicate" title="NOT EXISTS predicates"/>. The <reference id="table-expressions" title="table expression"/> resulting from a semi-join will only contain the left-hand side table A</li>
    -										<li><strong>division</strong>: This JOIN operation is hard to express at all, in SQL. See the manual's chapter about <reference id="relational-division" title="relational division"/> for details on how jOOQ simulates this operation.</li>
    -									</ul>									
    -									<p>
    -										jOOQ supports all of these JOIN types (except semi-join and anti-join) directly on any <reference id="table-expressions" title="table expression"/>:
    -									</p>
    -									
    -</html><java><![CDATA[// jOOQ's relational division convenience syntax 
    -DivideByOnStep divideBy(Table<?> table)
    -
    -// Various overloaded INNER JOINs
    -TableOnStep join(TableLike<?>)
    -TableOnStep join(String)
    -TableOnStep join(String, Object...)
    -TableOnStep join(String, QueryPart...)
    -
    -// Various overloaded OUTER JOINs (supporting Oracle's partitioned OUTER JOIN)
    -// Overloading is similar to that of INNER JOIN
    -TablePartitionByStep leftOuterJoin(TableLike<?>)
    -TablePartitionByStep rightOuterJoin(TableLike<?>)
    -
    -// Various overloaded FULL OUTER JOINs
    -TableOnStep fullOuterJoin(TableLike<?>)
    -
    -// Various overloaded CROSS JOINs
    -Table<Record> crossJoin(TableLike<?>)
    -
    -// Various overloaded NATURAL JOINs
    -Table<Record> naturalJoin(TableLike<?>)
    -Table<Record> naturalLeftOuterJoin(TableLike<?>)
    -Table<Record> naturalRightOuterJoin(TableLike<?>)]]></java><html>							
    -
    -									<p>
    -										Note that most of jOOQ's JOIN operations give way to a similar DSL API hierarchy as previously seen in the manual's section about the <reference id="join-clause" title="JOIN clause"/>
    -									</p>		
    -								</html></content>
    -							</section>
    -
    -							<section id="values">
    -								<title>The VALUES() table constructor</title>
    -								<content><html>
    -									<p>
    -										Some databases allow for expressing in-memory temporary tables using a <code>VALUES()</code> constructor. This constructor usually works the same way as the <code>VALUES()</code> clause known from the <reference id="insert-statement" title="INSERT statement"/> or from the <reference id="merge-statement" title="MERGE statement"/>. With jOOQ, you can also use the <code>VALUES()</code> table constructor, to create tables that can be used in a <reference id="select-statement" title="SELECT statement's"/> <reference id="from-clause" title="FROM clause"/>:
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[SELECT a, b
    -FROM VALUES(1, 'a'), 
    -           (2, 'b') t(a, b)]]></sql><java><![CDATA[create.select()
    -      .from(values(row(1, "a"),
    -                   row(2, "b")).as("t", "a", "b"));]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										Note, that it is usually quite useful to provide column aliases ("derived column lists") along with the table alias for the <code>VALUES()</code> constructor.
    -									</p>
    -									
    -									<p>
    -										The above statement is simulated by jOOQ for those databases that do not support the <code>VALUES()</code> constructor, natively (actual simulations may vary):
    -									</p>
    -									
    -</html><sql><![CDATA[-- If derived column expressions are supported:
    -SELECT a, b
    -FROM (
    -  SELECT 1, 'a' FROM DUAL UNION ALL
    -  SELECT 2, 'b' FROM DUAL
    -) t(a, b)
    -
    --- If derived column expressions are not supported:
    -SELECT a, b
    -FROM (
    -
    -  -- An empty dummy record is added to provide column names for the simulated derived column expression
    -  SELECT NULL a, NULL b FROM DUAL WHERE 1 = 0 UNION ALL
    -  
    -  -- Then, the actual VALUES() constructor is simulated
    -  SELECT 1,      'a'    FROM DUAL             UNION ALL
    -  SELECT 2,      'b'    FROM DUAL
    -) t
    -]]></sql></content>
    -							</section>
    -
    -							<section id="nested-selects">
    -								<title>Nested SELECTs</title>
    -								<content><html>
    -									<p>
    -										A <reference id="select-statement" title="SELECT statement"/> can appear almost anywhere a <reference id="table-expressions" title="table expression"/> can. Such a "nested SELECT" is often called a "derived table". Apart from many convenience methods accepting <reference class="org.jooq.Select"/> objects directly, a SELECT statement can always be transformed into a <reference class="org.jooq.Table"/> object using the asTable() method.
    -									</p>
    -									
    -									<h3>Example: Scalar subquery</h3>
    -									
    -</html><code-pair>
    -<sql>SELECT *
    -  FROM BOOK
    - WHERE BOOK.AUTHOR_ID = (
    - 		SELECT ID
    -          FROM AUTHOR
    -         WHERE LAST_NAME = 'Orwell')</sql><java>create.select()
    -      .from(BOOK)
    -      .where(BOOK.AUTHOR_ID.equal(create
    -             .select(AUTHOR.ID)
    -             .from(AUTHOR)
    -             .where(AUTHOR.LAST_NAME.equal("Orwell"))));</java>
    -</code-pair><html>
    -
    -									<h3>Example: Derived table</h3>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT nested.* FROM (
    -      SELECT AUTHOR_ID, count(*) books
    -        FROM BOOK
    -    GROUP BY AUTHOR_ID
    -) nested
    -ORDER BY nested.books DESC
    -
    -
    -
    -]]></sql><java><![CDATA[Table<Record> nested =
    -    create.select(BOOK.AUTHOR_ID, count().as("books"))
    -          .from(BOOK)
    -          .groupBy(BOOK.AUTHOR_ID).asTable("nested");
    -
    -create.select(nested.getFields())
    -      .from(nested)
    -      .orderBy(nested.getField("books"));]]></java>
    -</code-pair><html>
    -
    -									<h3>Example: Correlated subquery</h3>
    -</html><code-pair>
    -<sql><![CDATA[  SELECT LAST_NAME, (
    -      SELECT COUNT(*)
    -       FROM BOOK
    -      WHERE BOOK.AUTHOR_ID = AUTHOR.ID) books
    -    FROM AUTHOR
    -ORDER BY books DESC
    -
    -
    -
    -]]></sql><java><![CDATA[// The type of books cannot be inferred from the Select<?>
    -Field<Object> books =
    -    create.selectCount()
    -          .from(BOOK)
    -          .where(BOOK.AUTHOR_ID.equal(AUTHOR.ID))
    -          .asField("books");
    -create.select(AUTHOR.ID, books)
    -      .from(AUTHOR)
    -      .orderBy(books, AUTHOR.ID));]]></java>
    -</code-pair><html>									
    -								</html></content>
    -							</section>
    -
    -							<section id="pivot-tables">
    -								<title>The Oracle 11g PIVOT clause</title>
    -								<content><html>
    -									<p>
    -										If you are closely coupling your application to an Oracle database, you can take advantage of some Oracle-specific features, such as the PIVOT clause, used for statistical analyses. The formal syntax definition is as follows:
    -									</p>
    -									
    -</html><sql>-- SELECT ..
    -     FROM table PIVOT (aggregateFunction [, aggregateFunction] FOR column IN (expression [, expression]))
    ---  WHERE ..</sql><html>
    -		
    -									<p>
    -										The PIVOT clause is available from the <reference class="org.jooq.Table"/> type, as pivoting is done directly on a table. Currently, only Oracle's PIVOT clause is supported. Support for SQL Server's slightly different PIVOT clause will be added later. Also, jOOQ may simulate PIVOT for other dialects in the future.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="relational-division">
    -								<title>jOOQ's relational division syntax</title>
    -								<content><html>
    -									<p>
    -									    There is one operation in relational algebra that is not given a lot of attention, because it is rarely used in real-world applications. It is the relational division, the opposite operation of the cross product (or, relational multiplication). The following is an approximate definition of a relational division:
    -									</p>
    -
    -</html><config>Assume the following cross join / cartesian product
    -C = A × B
    -
    -Then it can be said that
    -A = C ÷ B
    -B = C ÷ A</config><html>
    -
    -									<p>
    -									   With jOOQ, you can simplify using relational divisions by using the following syntax:
    -									</p>
    -
    -</html><java>C.divideBy(B).on(C.ID.equal(B.C_ID)).returning(C.TEXT)</java><html>
    -
    -									<p>
    -										The above roughly translates to
    -									</p>
    -
    -</html><sql>SELECT DISTINCT C.TEXT FROM C "c1"
    -WHERE NOT EXISTS (
    -  SELECT 1 FROM B
    -  WHERE NOT EXISTS (
    -    SELECT 1 FROM C "c2"
    -    WHERE "c2".TEXT = "c1".TEXT
    -    AND "c2".ID = B.C_ID
    -  )
    -)</sql><html>
    -
    -									<p>
    -										Or in plain text: Find those TEXT values in C whose ID's correspond to all ID's in B. Note that from the above SQL statement, it is immediately clear that proper indexing is of the essence. Be sure to have indexes on all columns referenced from the on(...) and returning(...) clauses.
    -									</p>
    -
    -									<p>
    -										For more information about relational division and some nice, real-life examples, see
    -									</p>
    -
    -									<ul>
    -										<li><a href="http://en.wikipedia.org/wiki/Relational_algebra#Division" title="Wikipedia article on relational division">http://en.wikipedia.org/wiki/Relational_algebra#Division</a></li>
    -										<li><a href="http://www.simple-talk.com/sql/t-sql-programming/divided-we-stand-the-sql-of-relational-division/" title="A nice summary of what relational division is and how it is best implemented in SQL">http://www.simple-talk.com/sql/t-sql-programming/divided-we-stand-the-sql-of-relational-division/</a></li>
    -									</ul>
    -								</html></content>
    -
    -							</section>
    -
    -							<section id="array-and-cursor-unnesting">
    -								<title>Array and cursor unnesting</title>
    -								<content><html>
    -									<p>
    -										The SQL standard specifies how SQL databases should implement ARRAY and TABLE types, as well as CURSOR types. Put simply, a CURSOR is a pointer to any materialised <reference id="table-expressions" title="table expression"/>. Depending on the cursor's features, this table expression can be scrolled through in both directions, records can be locked, updated, removed, inserted, etc. Often, CURSOR types contain s, whereas ARRAY and TABLE types contain simple scalar values, although that is not a requirement
    -									</p>
    -									
    -									<p>
    -										ARRAY types in SQL are similar to Java's array types. They contain a "component type" or "element type" and a "dimension". This sort of ARRAY type is implemented in H2, HSQLDB and Postgres and supported by jOOQ as such. Oracle uses strongly-typed arrays, which means that an ARRAY type (VARRAY or TABLE type) has a name and possibly a maximum capacity associated with it.
    -									</p>
    -
    -									<h3>Unnesting array and cursor types</h3>									
    -									<p>
    -										The real power of these types become more obvious when you fetch them from <reference id="stored-procedures" title="stored procedures"/> to unnest them as <reference id="table-expressions" title="table expressions"/> and use them in your <reference id="from-clause" title="FROM clause"/>. An example is given here, where Oracle's DBMS_XPLAN package is used to fetch a cursor containing data about the most recent execution plan:
    -									</p>									
    -
    -</html><code-pair>
    -	<sql><![CDATA[SELECT *
    -FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(null, null, 'ALLSTATS'));]]></sql><java><![CDATA[create.select()
    -      .from(table(DbmsXplan.displayCursor(null, null, "ALLSTATS"));]]></java>
    -</code-pair><html>
    -									<p>
    -										Note, in order to access the DbmsXplan package, you can use the <reference id="code-generation" title="code generator"/> to generate Oracle's SYS schema.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="dual">
    -								<title>The DUAL table</title>
    -								<content><html>
    -									<p>
    -										The SQL standard specifies that the <reference id="from-clause" title="FROM clause"/> is optional in a <reference id="select-statement" title="SELECT statement"/>. However, according to the standard, you may then no longer use some other clauses, such as the <reference id="where-clause" title="WHERE clause"/>. In the real world, there exist three types of databases:
    -									</p>
    -									<ul>
    -										<li>The ones that always require a <code>FROM</code> clause</li>
    -										<li>The ones that never require a <code>FROM</code> clause (and still allow a <code>WHERE</code> clause)</li>
    -										<li>The ones that correctly implement the SQL standard</li>
    -									</ul>
    -									<p>
    -										With jOOQ, you don't have to worry about the above distinction of SQL dialects. jOOQ never requires a <code>FROM</code> clause, but renders the necessary <code>"DUAL"</code> table, if needed. The following program shows how jOOQ renders <code>"DUAL"</code> tables
    -									</p>
    -
    -</html><code-pair>
    -	<sql><![CDATA[SELECT 1
    -SELECT 1 FROM "db_root"
    -SELECT 1 FROM "SYSIBM"."DUAL"
    -SELECT 1 FROM "SYSIBM"."SYSDUMMY1"
    -SELECT 1 FROM "RDB$DATABASE"
    -SELECT 1 FROM dual
    -SELECT 1 FROM "INFORMATION_SCHEMA"."SYSTEM_USERS"
    -SELECT 1 FROM (select 1 as dual) as dual
    -SELECT 1 FROM dual
    -SELECT 1 FROM dual
    -SELECT 1
    -SELECT 1
    -SELECT 1
    -SELECT 1 FROM [SYS].[DUMMY]
    -]]></sql><java><![CDATA[DSL.using(SQLDialect.ASE      ).selectOne().getSQL();
    -DSL.using(SQLDialect.CUBRID   ).selectOne().getSQL();
    -DSL.using(SQLDialect.DB2      ).selectOne().getSQL();
    -DSL.using(SQLDialect.DERBY    ).selectOne().getSQL();
    -DSL.using(SQLDialect.FIREBIRD ).selectOne().getSQL();
    -DSL.using(SQLDialect.H2       ).selectOne().getSQL();
    -DSL.using(SQLDialect.HSQLDB   ).selectOne().getSQL();
    -DSL.using(SQLDialect.INGRES   ).selectOne().getSQL();
    -DSL.using(SQLDialect.MYSQL    ).selectOne().getSQL();
    -DSL.using(SQLDialect.ORACLE   ).selectOne().getSQL();
    -DSL.using(SQLDialect.POSTGRES ).selectOne().getSQL();
    -DSL.using(SQLDialect.SQLITE   ).selectOne().getSQL();
    -DSL.using(SQLDialect.SQLSERVER).selectOne().getSQL();
    -DSL.using(SQLDialect.SYBASE   ).selectOne().getSQL();]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										Note, that some databases (H2, MySQL) can normally do without <code>"DUAL"</code>. However, there exist some corner-cases with complex nested <code>SELECT</code> statements, where this will cause syntax errors (or parser bugs). To stay on the safe side, jOOQ will always render "dual" in those dialects.
    -									</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -					<section id="column-expressions">
    -						<title>Column expressions</title>
    -						<content><html>
    -						    <p>
    -						    	Column expressions can be used in various SQL clauses in order to refer to one or several columns. This chapter explains how to form various types of column expressions with jOOQ. A particular type of column expression is given in the section about <reference id="row-value-expressions" title="tuples or row value expressions"/>, where an expression may have a degree of more than one.
    -						    </p>
    -						
    -						    <h3>Using column expressions in jOOQ</h3>
    -							<p>
    -								jOOQ allows you to freely create arbitrary column expressions using a fluent expression construction API. Many expressions can be formed as functions from <reference id="dsl" title="DSL methods"/>, other expressions can be formed based on a pre-existing column expression. For example:
    -							</p>
    -							
    -</html><java><![CDATA[// A regular table column expression
    -Field<String> field1 = BOOK.TITLE;
    -
    -// A function created from the DSL using "prefix" notation
    -Field<String> field2 = trim(BOOK.TITLE);
    -
    -// The same function created from a pre-existing Field using "postfix" notation
    -Field<String> field3 = BOOK.TITLE.trim();
    -
    -// More complex function with advanced DSL syntax
    -Field<String> field4 = listAgg(BOOK.TITLE)
    -                          .withinGroupOrderBy(BOOK.ID.asc())
    -                          .over().partitionBy(AUTHOR.ID);]]></java><html>
    -
    -							<p>
    -								In general, it is up to you whether you want to use the "prefix" notation or the "postfix" notation to create new column expressions based on existing ones. The "SQL way" would be to use the "prefix notation", with functions created from the <reference id="dsl" title="DSL"/>. The "Java way" or "object-oriented way" would be to use the "postfix" notation with functions created from <reference class="org.jooq.Field"/> objects. Both ways ultimately create the same query part, though.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="table-columns">
    -								<title>Table columns</title>
    -								<content><html>
    -									<p>
    -										Table columns are the most simple implementations of a <reference id="column-expressions" title="column expression"/>. They are mainly produced by jOOQ's <reference id="code-generation" title="code generator"/> and can be dereferenced from the generated tables. This manual is full of examples involving table columns. Another example is given in this query:
    -									</p>
    -
    -</html><code-pair>
    -	<sql><![CDATA[SELECT BOOK.ID, BOOK.TITLE
    -FROM BOOK
    -WHERE BOOK.TITLE LIKE '%SQL%'
    -ORDER BY BOOK.TITLE]]></sql><java><![CDATA[create.select(BOOK.ID, BOOK.TITLE)
    -	  .from(BOOK)
    -	  .where(BOOK.TITLE.like("%SQL%"))
    -	  .orderBy(BOOK.TITLE);]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										Table columns implement a more specific interface called <reference class="org.jooq.TableField"/>, which is parameterised with its associated <code>&lt;R extends Record&gt;</code> record type.
    -									</p>
    -									<p>
    -										See the manual's section about <reference id="codegen-tables" title="generated tables"/> for more information about what is really generated by the <reference id="code-generation" title="code generator"/>
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="aliased-columns">
    -								<title>Aliased columns</title>
    -								<content><html>
    -									<p>
    -										Just like <reference id="aliased-tables" title="tables"/>, columns can be renamed using aliases. Here is an example:
    -									</p>
    -									
    -</html><sql>  SELECT FIRST_NAME || ' ' || LAST_NAME author, COUNT(*) books
    -    FROM AUTHOR
    -    JOIN BOOK ON AUTHOR.ID = AUTHOR_ID
    -GROUP BY FIRST_NAME, LAST_NAME;</sql><html>
    -
    -									<p>
    -										Here is how it's done with jOOQ:
    -									</p>
    -									
    -</html><java>Record record = create.select(
    -         concat(AUTHOR.FIRST_NAME, val(" "), AUTHOR.LAST_NAME).as("author"),
    -         count().as("books"))
    -      .from(AUTHOR)
    -      .join(BOOK).on(AUTHOR.ID.equal(BOOK.AUTHOR_ID))
    -      .groupBy(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME).fetchAny();</java><html>
    -      
    -      								<p>
    -      									When you alias Fields like above, you can access those Fields' values using the alias name:
    -  									</p>
    -  									
    -</html><java>System.out.println("Author : " + record.getValue("author"));
    -System.out.println("Books  : " + record.getValue("books"));</java></content>
    -							</section>
    -
    -							<section id="cast-expressions">
    -								<title>Cast expressions</title>
    -								<content><html>
    -									<p>
    -										jOOQ's source code generator tries to find the most accurate type mapping between your vendor-specific data types and a matching Java type. For instance, most <code>VARCHAR</code>, <code>CHAR</code>, <code>CLOB</code> types will map to String. Most <code>BINARY</code>, <code>BYTEA</code>, <code>BLOB</code> types will map to <code>byte[]</code>. <code>NUMERIC</code> types will default to <reference class="java.math.BigDecimal"/>, but can also be any of <reference class="java.math.BigInteger"/>, <reference class="java.lang.Long"/>, <reference class="java.lang.Integer"/>, <reference class="java.lang.Short"/>, <reference class="java.lang.Byte"/>, <reference class="java.lang.Double"/>, <reference class="java.lang.Float"/>.
    -									</p>
    -									<p>
    -										Sometimes, this automatic mapping might not be what you needed, or jOOQ cannot know the type of a field. In those cases you would write SQL type <code>CAST</code> like this:
    -									</p>
    -									
    -</html><sql>-- Let's say, your Postgres column LAST_NAME was VARCHAR(30)
    --- Then you could do this:
    -SELECT CAST(AUTHOR.LAST_NAME AS TEXT) FROM DUAL</sql><html>
    -
    -									<p>
    -										in jOOQ, you can write something like that:
    -									</p>
    -									
    -</html><java>create.select(TAuthor.LAST_NAME.cast(PostgresDataType.TEXT));</java><html>
    -
    -									<p>
    -										The same thing can be achieved by casting a Field directly to String.class, as <code>TEXT</code> is the default data type in Postgres to map to Java's String
    -									</p>
    -									
    -</html><java>create.select(TAuthor.LAST_NAME.cast(String.class));</java><html>
    -		
    -									<p>
    -										The complete <code>CAST</code> API in <reference class="org.jooq.Field"/> consists of these three methods:
    -									</p>
    -									
    -</html><java><![CDATA[public interface Field<T> {
    -
    -    // Cast this field to the type of another field
    -    <Z> Field<Z> cast(Field<Z> field);
    -    
    -    // Cast this field to a given DataType
    -    <Z> Field<Z> cast(DataType<Z> type);
    -    
    -    // Cast this field to the default DataType for a given Class
    -    <Z> Field<Z> cast(Class<? extends Z> type);
    -}
    -
    -// And additional convenience methods in the DSL:
    -public class DSL {
    -    <T> Field<T> cast(Object object, Field<T> field);
    -    <T> Field<T> cast(Object object, DataType<T> type);
    -    <T> Field<T> cast(Object object, Class<? extends T> type);
    -    <T> Field<T> castNull(Field<T> field);
    -    <T> Field<T> castNull(DataType<T> type);
    -    <T> Field<T> castNull(Class<? extends T> type);
    -}]]></java></content>
    -							</section>
    -
    -                            <section id="datatype-coercions">
    -                                <title>Datatype coercions</title>
    -                                <content><html>
    -                                    <p>
    -                                        A slightly different use case than <reference id="cast-expressions" title="CAST expressions"/> are data type coercions, which are not rendered through to generated SQL. Sometimes, you may want to pretend that a numeric value is really treated as a string value, for instance when binding a numeric <reference id="variable-binding" title="bind value"/>:
    -                                    </p>
    -                                    
    -</html><java><![CDATA[Field<String>  field1 = val(1).coerce(String.class);
    -Field<Integer> field2 = val("1").coerce(Integer.class);]]></java><html>
    -
    -                                    <p>
    -                                        In the above example, <code>field1</code> will be treated by jOOQ as a <code>Field&lt;String></code>, binding the numeric literal <code>1</code> as a <code>VARCHAR</code> value. The same applies to <code>field2</code>, whose string literal <code>"1"</code> will be bound as an <code>INTEGER</code> value.
    -                                    </p>
    -                                    
    -                                    <p>
    -                                        This technique is better than performing unsafe or rawtype casting in Java, if you cannot access the "right" field type from any given expression.
    -                                    </p>
    -                                </html></content>
    -                            </section>
    -
    -							<section id="arithmetic-expressions">
    -								<title>Arithmetic expressions</title>
    -								<content><html>
    -									<h3>Numeric arithmetic expressions</h3>
    -									<p>
    -										Your database can do the math for you. Arithmetic operations are implemented just like <reference id="numeric-functions" title="numeric functions"/>, with similar limitations as far as type restrictions are concerned. You can use any of these operators:
    -									</p>
    -
    -</html><config>  +  -  *  /  %</config><html>
    -
    -									<p>
    -										In order to express a SQL query like this one:
    -									</p>
    -									
    -</html><sql>SELECT ((1 + 2) * (5 - 3) / 2) % 10 FROM DUAL</sql><html>
    -							
    -									<p>
    -										You can write something like this in jOOQ:
    -									</p>
    -									
    -</html><java>create.select(val(1).add(2).mul(val(5).sub(3)).div(2).mod(10);</java><html>
    -
    -									<h3>Datetime arithmetic expressions</h3>
    -									<p>
    -										jOOQ also supports the Oracle-style syntax for adding days to a Field&lt;? extends java.util.Date&gt; 
    -									</p>
    -
    -</html><code-pair>
    -	<sql>SELECT SYSDATE + 3 FROM DUAL;</sql><java>create.select(currentTimestamp().add(3));</java>
    -</code-pair><html>
    -
    -									<p>
    -										For more advanced datetime arithmetic, use the DSL's timestampDiff() and dateDiff() functions, as well as jOOQ's built-in SQL standard <code>INTERVAL</code> data type support:
    -									</p>
    -									<ul>
    -										<li><code>INTERVAL YEAR TO MONTH</code>: <reference class="org.jooq.types.YearToMonth"/></li>
    -										<li><code>INTERVAL DAY TO SECOND</code>: <reference class="org.jooq.types.DayToSecond"/></li>
    -									</ul>
    -								</html></content>
    -							</section>
    -							
    -							<section id="string-concatenation">
    -								<title>String concatenation</title>
    -								<content><html>
    -									<p>
    -										The SQL standard defines the concatenation operator to be an infix operator, similar to the ones we've seen in the chapter about <reference id="arithmetic-expressions" title="arithmetic expressions"/>. This operator looks like this: <code>||</code>. Some other dialects do not support this operator, but expect a <code>concat()</code> function, instead. jOOQ renders the right operator / function, depending on your <reference id="sql-dialects" title="SQL dialect"/>:
    -									</p>
    -									
    -</html><code-pair>
    -<sql>SELECT 'A' || 'B' || 'C' FROM DUAL
    --- Or in MySQL:
    -SELECT concat('A', 'B', 'C') FROM DUAL</sql><java>&#160;
    -// For all RDBMS, including MySQL:
    -create.select(concat("A", "B", "C"));
    -</java>
    -</code-pair><html>								
    -								</html></content>
    -							</section>
    -
    -							<section id="general-functions">
    -								<title>General functions</title>
    -								<content><html>
    -									<p>
    -										There are a variety of general functions supported by jOOQ As discussed in the chapter about <reference id="sql-dialects" title="SQL dialects"/> functions are mostly simulated in your database, in case they are not natively supported.
    -									</p>
    -									<p>
    -										This is a list of general functions supported by jOOQ's <reference id="dsl" title="DSL"/>:
    -									</p>
    -									<ul>
    -										<li><strong><code>COALESCE</code></strong>: Get the first non-null value in a list of arguments.</li>
    -										<li><strong><code>NULLIF</code></strong>: Return <code>NULL</code> if both arguments are equal, or the first argument, otherwise.</li>
    -										<li><strong><code>NVL</code></strong>: Get the first non-null value among two arguments.</li>
    -										<li><strong><code>NVL2</code></strong>: Get the second argument if the first is null, or the third argument, otherwise.</li>
    -									</ul>
    -																
    -									<p>
    -										Please refer to the <reference class="org.jooq.impl.DSL" title="DSL Javadoc"/> for more details.
    -									</p>
    -								</html></content>
    -							</section>
    -							
    -							<section id="numeric-functions">
    -								<title>Numeric functions</title>
    -								<content><html>
    -									<p>
    -										Math can be done efficiently in the database before returning results to your Java application. In addition to the <reference id="arithmetic-expressions" title="arithmetic expressions" /> discussed previously, jOOQ also supports a variety of numeric functions. As discussed in the chapter about <reference id="sql-dialects" title="SQL dialects"/> numeric functions (as any function type) are mostly simulated in your database, in case they are not natively supported.
    -									</p>
    -									<p>
    -										This is a list of numeric functions supported by jOOQ's <reference id="dsl" title="DSL"/>:
    -									</p>
    -									
    -									<ul>
    -										<li><strong><code>ABS</code></strong>: Get the absolute value of a value.</li>
    -										<li><strong><code>ACOS</code></strong>: Get the arc cosine of a value.</li>
    -										<li><strong><code>ASIN</code></strong>: Get the arc sine of a value.</li>
    -										<li><strong><code>ATAN</code></strong>: Get the arc tangent of a value.</li>
    -										<li><strong><code>ATAN2</code></strong>: Get the atan2 function of two values.</li>
    -										<li><strong><code>CEIL</code></strong>: Get the smalles integer value larger than a given numeric value.</li>
    -										<li><strong><code>COS</code></strong>: Get the cosine of a value.</li>
    -										<li><strong><code>COSH</code></strong>: Get the hyperbolic cosine of a value.</li>
    -										<li><strong><code>COT</code></strong>: Get the cotangent of a value.</li>
    -										<li><strong><code>COTH</code></strong>: Get the hyperbolic cotangent of a value.</li>
    -										<li><strong><code>DEG</code></strong>: Transform radians into degrees.</li>
    -										<li><strong><code>EXP</code></strong>: Calculate e^value.</li>
    -										<li><strong><code>FLOOR</code></strong>: Get the largest integer value smaller than a given numeric value.</li>
    -										<li><strong><code>GREATEST</code></strong>: Finds the greatest among all argument values (can also be used with non-numeric values).</li>
    -										<li><strong><code>LEAST</code></strong>: Finds the least among all argument values (can also be used with non-numeric values).</li>
    -										<li><strong><code>LN</code></strong>: Get the natural logarithm of a value.</li>
    -										<li><strong><code>LOG</code></strong>: Get the logarithm of a value given a base.</li>
    -										<li><strong><code>POWER</code></strong>: Calculate value^exponent.</li>
    -										<li><strong><code>RAD</code></strong>: Transform degrees into radians.</li>
    -										<li><strong><code>RAND</code></strong>: Get a random number.</li>
    -										<li><strong><code>ROUND</code></strong>: Rounds a value to the nearest integer.</li>
    -										<li><strong><code>SIGN</code></strong>: Get the sign of a value (-1, 0, 1).</li>
    -										<li><strong><code>SIN</code></strong>: Get the sine of a value.</li>
    -										<li><strong><code>SINH</code></strong>: Get the hyperbolic sine of a value.</li>
    -										<li><strong><code>SQRT</code></strong>: Calculate the square root of a value.</li>
    -										<li><strong><code>TAN</code></strong>: Get the tangent of a value.</li>
    -										<li><strong><code>TANH</code></strong>: Get the hyperbolic tangent of a value.</li>
    -										<li><strong><code>TRUNC</code></strong>: Truncate the decimals off a given value.</li>
    -									</ul>
    -									
    -									<p>
    -										Please refer to the <reference class="org.jooq.impl.DSL" title="DSL Javadoc"/> for more details.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="bitwise-functions">
    -								<title>Bitwise functions</title>
    -								<content><html>
    -									<p>
    -										Interestingly, bitwise functions and bitwise arithmetic is not very popular among SQL databases. Most databases only support a few bitwise operations, while others ship with the full set of operators. jOOQ's API includes most bitwise operations as listed below. In order to avoid ambiguities with <reference id="conditional-expressions" title="conditional operators"/>, all bitwise functions are prefixed with "bit"
    -									</p>
    -									<ul>
    -										<li><strong><code>BIT_COUNT</code></strong>: Count the number of bits set to 1 in a number</li>
    -										<li><strong><code>BIT_AND</code></strong>: Set only those bits that are set in two numbers</li>
    -										<li><strong><code>BIT_OR</code></strong>: Set all bits that are set in at least one number</li>
    -										<li><strong><code>BIT_NAND</code></strong>: Set only those bits that are set in two numbers, and inverse the result</li>
    -										<li><strong><code>BIT_NOR</code></strong>: Set all bits that are set in at least one number, and inverse the result</li>
    -										<li><strong><code>BIT_NOT</code></strong>: Inverse the bits in a number</li>
    -										<li><strong><code>BIT_XOR</code></strong>: Set all bits that are set in at exactly one number</li>
    -										<li><strong><code>BIT_XNOR</code></strong>: Set all bits that are set in at exactly one number, and inverse the result</li>
    -										<li><strong><code>SHL</code></strong>: Shift bits to the left</li>
    -										<li><strong><code>SHR</code></strong>: Shift bits to the right</li>
    -									</ul>
    -									
    -									<h3>Some background about bitwise operation simulation</h3>
    -									<p>
    -										As stated before, not all databases support all of these bitwise operations. jOOQ simulates them wherever this is possible. More details can be seen in this blog post: <br/>
    -										<a href="http://blog.jooq.org/2011/10/30/the-comprehensive-sql-bitwise-operations-compatibility-list/">http://blog.jooq.org/2011/10/30/the-comprehensive-sql-bitwise-operations-compatibility-list/</a>
    -									</p>
    -									
    -								</html></content>
    -							</section>
    -
    -							<section id="string-functions">
    -								<title>String functions</title>
    -								<content><html>
    -									<p>
    -										String formatting can be done efficiently in the database before returning results to your Java application. As discussed in the chapter about <reference id="sql-dialects" title="SQL dialects"/> string functions (as any function type) are mostly simulated in your database, in case they are not natively supported.
    -									</p>
    -									<p>
    -										This is a list of numeric functions supported by jOOQ's <reference id="dsl" title="DSL"/>:
    -									</p>
    -									
    -									<ul>
    -										<li><strong><code>ASCII</code></strong>: Get the <code>ASCII</code> code of a character.</li>
    -										<li><strong><code>BIT_LENGTH</code></strong>: Get the length of a string in bits.</li>
    -										<li><strong><code>CHAR_LENGTH</code></strong>: Get the length of a string in characters.</li>
    -										<li><strong><code>CONCAT</code></strong>: Concatenate several strings.</li>
    -										<li><strong><code>ESCAPE</code></strong>: Escape a string for use with the <reference id="like-predicate" title="LIKE predicate"/>.</li>
    -										<li><strong><code>LENGTH</code></strong>: Get the length of a string.</li>
    -										<li><strong><code>LOWER</code></strong>: Get a string in lower case letters.</li>
    -										<li><strong><code>LPAD</code></strong>: Pad a string on the left side.</li>
    -										<li><strong><code>LTRIM</code></strong>: Trim a string on the left side.</li>
    -										<li><strong><code>OCTET_LENGTH</code></strong>: Get the length of a string in octets.</li>
    -										<li><strong><code>POSITION</code></strong>: Find a string within another string.</li>
    -										<li><strong><code>REPEAT</code></strong>: Repeat a string a given number of times.</li>
    -										<li><strong><code>REPLACE</code></strong>: Replace a string within another string.</li>
    -										<li><strong><code>RPAD</code></strong>: Pad a string on the right side.</li>
    -										<li><strong><code>RTRIM</code></strong>: Trim a string on the right side.</li>
    -										<li><strong><code>SUBSTRING</code></strong>: Get a substring of a string.</li>
    -										<li><strong><code>TRIM</code></strong>: Trim a string on both sides.</li>
    -										<li><strong><code>UPPER</code></strong>: Get a string in upper case letters.</li>
    -									</ul>
    -									
    -									<p>
    -										Please refer to the <reference class="org.jooq.impl.DSL" title="DSL Javadoc"/> for more details.
    -									</p>
    -									
    -									<h3>Regular expressions, <code>REGEXP</code>, <code>REGEXP_LIKE</code>, etc.</h3>
    -									<p>
    -										Various databases have some means of searching through columns using regular expressions if the <reference id="like-predicate" title="LIKE predicate"/> does not provide sufficient pattern matching power. While there are many different functions and operators in the various databases, jOOQ settled for the SQL:2008 standard <code>REGEX_LIKE</code> operator. Being an operator (and not a function), you should use the corresponding method on <reference class="org.jooq.Field"/>:
    -									</p>
    -									
    -</html><java><![CDATA[create.selectFrom(BOOK).where(TITLE.likeRegex("^.*SQL.*$"));]]></java><html>
    -
    -									<p>
    -										Note that the SQL standard specifies that patterns should follow the XQuery standards. In the real world, the POSIX regular expression standard is the most used one, some use Java regular expressions, and only a few ones use Perl regular expressions. jOOQ does not make any assumptions about regular expression syntax. For cross-database compatibility, please read the relevant database manuals carefully, to learn about the appropriate syntax. Please refer to the <reference class="org.jooq.impl.DSL" title="DSL Javadoc"/> for more details.
    -									</p>
    -								</html></content>
    -								<!-- don't forget regex here! -->
    -							</section>
    -
    -							<section id="date-and-time-functions">
    -								<title>Date and time functions</title>
    -								<content><html>
    -									<p>
    -										This is a list of date and time functions supported by jOOQ's <reference id="dsl" title="DSL"/>:
    -									</p>
    -									
    -									<ul>
    -										<li><strong><code>CURRENT_DATE</code></strong>: Get current date as a <code>DATE</code> object.</li>
    -										<li><strong><code>CURRENT_TIME</code></strong>: Get current time as a <code>TIME</code> object.</li>
    -										<li><strong><code>CURRENT_TIMESTAMP</code></strong>: Get current date as a <code>TIMESTAMP</code> object.</li>
    -										<li><strong><code>DATE_ADD</code></strong>: Add a number of days or an interval to a date.</li>
    -										<li><strong><code>DATE_DIFF</code></strong>: Get the difference in days between two dates.</li>
    -										<li><strong><code>TIMESTAMP_ADD</code></strong>: Add a number of days or an interval to a timestamp.</li>
    -										<li><strong><code>TIMESTAMP_DIFF</code></strong>: Get the difference as an <code>INTERVAL DAY TO SECOND</code> between two dates.</li>
    -									</ul>
    -									
    -									<h3>Intervals in jOOQ</h3>
    -									<p>
    -										jOOQ fills a gap opened by JDBC, which neglects an important SQL data type as defined by the SQL standards: <code>INTERVAL</code> types. See the manual's section about <reference id="data-types-intervals" title="INTERVAL data types"/> for more details.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="system-functions">
    -								<title>System functions</title>
    -								<content><html>
    -									<p>
    -										This is a list of system functions supported by jOOQ's <reference id="dsl" title="DSL"/>:
    -									</p>
    -									<ul>
    -										<li><strong><code>CURRENT_USER</code></strong>: Get current user.</li>
    -									</ul>
    -								</html></content>
    -							</section>
    -
    -							<section id="aggregate-functions">
    -								<title>Aggregate functions</title>
    -								<content><html>
    -									<p>
    -										Aggregate functions work just like functions, even if they have a slightly different semantics. Here are some example aggregate functions from the <reference id="dsl" title="DSL"/>:
    -									</p>
    -
    -</html><java><![CDATA[// Every-day, SQL standard aggregate functions
    -AggregateFunction<Integer>    count();
    -AggregateFunction<Integer>    count(Field<?> field);
    -AggregateFunction<T>          max  (Field<T> field);
    -AggregateFunction<T>          min  (Field<T> field);
    -AggregateFunction<BigDecimal> sum  (Field<? extends Number> field);
    -AggregateFunction<BigDecimal> avg  (Field<? extends Number> field);
    -
    -// DISTINCT keyword in aggregate functions
    -AggregateFunction<Integer>    countDistinct(Field<?> field);
    -AggregateFunction<T>          maxDistinct  (Field<T> field);
    -AggregateFunction<T>          minDistinct  (Field<T> field);
    -AggregateFunction<BigDecimal> sumDistinct  (Field<? extends Number> field);
    -AggregateFunction<BigDecimal> avgDistinct  (Field<? extends Number> field);
    -
    -// String aggregate functions
    -AggregateFunction<String> groupConcat        (Field<?> field);
    -AggregateFunction<String> groupConcatDistinct(Field<?> field);
    -OrderedAggregateFunction<String> listAgg(Field<?> field);
    -OrderedAggregateFunction<String> listAgg(Field<?> field, String separator);
    -
    -// Statistical functions
    -AggregateFunction<BigDecimal> median    (Field<? extends Number> field);
    -AggregateFunction<BigDecimal> stddevPop (Field<? extends Number> field);
    -AggregateFunction<BigDecimal> stddevSamp(Field<? extends Number> field);
    -AggregateFunction<BigDecimal> varPop    (Field<? extends Number> field);
    -AggregateFunction<BigDecimal> varSamp   (Field<? extends Number> field);
    -
    -// Linear regression functions
    -AggregateFunction<BigDecimal> regrAvgX     (Field<? extends Number> y, Field<? extends Number> x);
    -AggregateFunction<BigDecimal> regrAvgY     (Field<? extends Number> y, Field<? extends Number> x);
    -AggregateFunction<BigDecimal> regrCount    (Field<? extends Number> y, Field<? extends Number> x);
    -AggregateFunction<BigDecimal> regrIntercept(Field<? extends Number> y, Field<? extends Number> x);
    -AggregateFunction<BigDecimal> regrR2       (Field<? extends Number> y, Field<? extends Number> x);
    -AggregateFunction<BigDecimal> regrSlope    (Field<? extends Number> y, Field<? extends Number> x);
    -AggregateFunction<BigDecimal> regrSXX      (Field<? extends Number> y, Field<? extends Number> x);
    -AggregateFunction<BigDecimal> regrSXY      (Field<? extends Number> y, Field<? extends Number> x);
    -AggregateFunction<BigDecimal> regrSYY      (Field<? extends Number> y, Field<? extends Number> x);]]></java><html>
    -
    -									<p>
    -										Here's an example, counting the number of books any author has written:
    -									</p>
    -
    -</html><code-pair>
    -<sql>SELECT AUTHOR_ID, COUNT(*)
    -FROM BOOK
    -GROUP BY AUTHOR_ID</sql><java>create.select(BOOK.AUTHOR_ID, count())
    -      .from(BOOK)
    -      .groupBy(BOOK.AUTHOR_ID);</java>
    -</code-pair><html>
    -
    -									<p>
    -										Aggregate functions have strong limitations about when they may be used and when not. For instance, you can use aggregate functions in scalar queries. Typically, this means you only select aggregate functions, no <reference id="table-columns" title="regular columns"/> or other <reference id="column-expressions" title="column expressions"/>. Another use case is to use them along with a <reference id="group-by-clause" title="GROUP BY clause"/> as seen in the previous example. Note, that jOOQ does not check whether your using of aggregate functions is correct according to the SQL standards, or according to your database's behaviour.
    -									</p>
    -
    -		                            <h3>Ordered aggregate functions</h3>
    -		                            <p>
    -		                            	Oracle and some other databases support "ordered aggregate functions". This means you can provide an <code>ORDER BY</code> clause to an aggregate function, which will be taken into consideration when aggregating. The best example for this is Oracle's <code>LISTAGG()</code> (also known as <code>GROUP_CONCAT</code> in other <reference id="sql-dialects" title="SQL dialects"/>). The following query groups by authors and concatenates their books' titles
    -		                           	</p>
    -</html><code-pair>
    -<sql>SELECT   LISTAGG(TITLE, ', ')
    -         WITHIN GROUP (ORDER BY TITLE)
    -FROM     BOOK
    -GROUP BY AUTHOR_ID</sql><java>create.select(listAgg(BOOK.TITLE, ", ")
    -      .withinGroupOrderBy(BOOK.TITLE))
    -      .from(BOOK)
    -      .groupBy(BOOK.AUTHOR_ID)</java>
    -</code-pair><html>
    -
    -									<p>
    -										The above query might yield:
    -									</p>
    -
    -</html><text>+---------------------+
    -| LISTAGG             |
    -+---------------------+
    -| 1984, Animal Farm   |
    -| O Alquimista, Brida |
    -+---------------------+</text><html>
    -
    -									<h3>FIRST and LAST: Oracle's "ranked" aggregate functions</h3>
    -									<p>
    -										Oracle allows for restricting aggregate functions using the <code>KEEP()</code> clause, which is supported by jOOQ. In Oracle, some aggregate functions (<code>MIN</code>, <code>MAX</code>, <code>SUM</code>, <code>AVG</code>, <code>COUNT</code>, <code>VARIANCE</code>, or <code>STDDEV</code>) can be restricted by this clause, hence <reference class="org.jooq.AggregateFunction"/> also allows for specifying it. Here are a couple of examples using this clause:
    -									</p>
    -
    -</html><code-pair>
    -<sql>SUM(BOOK.AMOUNT_SOLD)
    -  KEEP(DENSE_RANK FIRST ORDER BY BOOK.AUTHOR_ID)</sql><java>sum(BOOK.AMOUNT_SOLD)
    -  .keepDenseRankFirstOrderBy(BOOK.AUTHOR_ID)</java>
    -</code-pair><html>
    -
    -									<h3>User-defined aggregate functions</h3>
    -									<p>
    -										jOOQ also supports using your own user-defined aggregate functions. See the manual's section about <reference id="user-defined-aggregate-functions" title="user-defined aggregate functions"/> for more details.
    -									</p>
    -
    -									<h3>Window functions / analytical functions</h3>
    -									<p>
    -										In those databases that support <reference id="window-functions" title="window functions"/>, jOOQ's <reference class="org.jooq.AggregateFunction"/> can be transformed into a window function / analytical function by calling <code>over()</code> on it. See the manual's section about <reference id="window-functions" title="window functions"/> for more details.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="window-functions">
    -								<title>Window functions</title>
    -								<content><html>
    -									<p>
    -										Most major RDBMS support the concept of window functions. jOOQ knows of implementations in DB2, Oracle, Postgres, SQL Server, and Sybase SQL Anywhere, and supports most of their specific syntaxes. Note, that H2 and HSQLDB have implemented <code>ROW_NUMBER()</code> functions, without true windowing support.
    -									</p>
    -									<p>
    -										As previously discussed, any <reference class="org.jooq.AggregateFunction"/> can be transformed into a window function using the <code>over()</code> method. See the chapter about <reference id="aggregate-functions" title="aggregate functions"/> for details. In addition to those, there are also some more window functions supported by jOOQ, as declared in the <reference id="dsl" title="DSL"/>:
    -									</p>
    -
    -</html><java><![CDATA[// Ranking functions
    -    WindowOverStep<Integer>    rowNumber();
    -    WindowOverStep<Integer>    rank();
    -    WindowOverStep<Integer>    denseRank();
    -    WindowOverStep<BigDecimal> percentRank();
    -    
    -// Windowing functions
    -<T> WindowIgnoreNullsStep<T>   firstValue(Field<T> field);
    -<T> WindowIgnoreNullsStep<T>   lastValue(Field<T> field)
    -<T> WindowIgnoreNullsStep<T>   lead(Field<T> field);
    -<T> WindowIgnoreNullsStep<T>   lead(Field<T> field, int offset);
    -<T> WindowIgnoreNullsStep<T>   lead(Field<T> field, int offset, T defaultValue);
    -<T> WindowIgnoreNullsStep<T>   lead(Field<T> field, int offset, Field<T> defaultValue);
    -<T> WindowIgnoreNullsStep<T>   lag(Field<T> field);
    -<T> WindowIgnoreNullsStep<T>   lag(Field<T> field, int offset);
    -<T> WindowIgnoreNullsStep<T>   lag(Field<T> field, int offset, T defaultValue);
    -<T> WindowIgnoreNullsStep<T>   lag(Field<T> field, int offset, Field<T> defaultValue);
    -
    -// Statistical functions
    -    WindowOverStep<BigDecimal> cumeDist();
    -    WindowOverStep<Integer>    ntile(int number);]]></java><html>	
    -    								
    -    								<p>
    -    									SQL distinguishes between various window function types (e.g. "ranking functions"). Depending on the function, SQL expects mandatory <code>PARTITION BY</code> or <code>ORDER BY</code> clauses within the <code>OVER()</code> clause. jOOQ does not enforce those rules for two reasons:
    -    								</p>
    -    								<ul>
    -    									<li>Your JDBC driver or database already checks SQL syntax semantics</li>
    -    									<li>Not all databases behave correctly according to the SQL standard</li>
    -    								</ul>
    -    								<p>
    -    									If possible, however, jOOQ tries to render missing clauses for you, if a given <reference id="sql-dialects" title="SQL dialect"/> is more restrictive.
    -    								</p>
    -    								<h3>Some examples</h3>
    -									<p>
    -										 Here are some simple examples of window functions with jOOQ:
    -									</p>
    -									
    -</html><code-pair>
    -<sql>-- Sample uses of ROW_NUMBER()
    -ROW_NUMBER() OVER()
    -ROW_NUMBER() OVER(PARTITION BY 1)
    -ROW_NUMBER() OVER(ORDER BY BOOK.ID)
    -ROW_NUMBER() OVER(PARTITION BY BOOK.AUTHOR_ID ORDER BY BOOK.ID)
    -                  
    --- Sample uses of FIRST_VALUE
    -FIRST_VALUE(BOOK.ID) OVER()
    -FIRST_VALUE(BOOK.ID IGNORE NULLS) OVER()
    -FIRST_VALUE(BOOK.ID RESPECT NULLS) OVER()
    -</sql><java>// Sample uses of rowNumber()
    -rowNumber().over()
    -rowNumber().over().partitionByOne()
    -rowNumber().over().partitionBy(BOOK.AUTHOR_ID)
    -rowNumber().over().partitionBy(BOOK.AUTHOR_ID).orderBy(BOOK.ID)
    -                  
    -// Sample uses of firstValue()
    -firstValue(BOOK.ID).over()
    -firstValue(BOOK.ID).ignoreNulls().over()
    -firstValue(BOOK.ID).respectNulls().over()
    -</java>
    -</code-pair><html>
    -    								
    -									<h3>An advanced window function example</h3>
    -									<p>
    -										Window functions can be used for things like calculating a "running total". The following example fetches transactions and the running total for every transaction going back to the beginning of the transaction table (ordered by booked_at). Window functions are accessible from the previously seen <reference class="org.jooq.AggregateFunction"/> type using the <code>over()</code> method:
    -									</p>
    -
    -</html><code-pair>
    -<sql>SELECT booked_at, amount,
    -   SUM(amount) OVER (PARTITION BY 1
    -                     ORDER BY booked_at
    -                     ROWS BETWEEN UNBOUNDED PRECEDING
    -                     AND CURRENT ROW) AS total
    -  FROM transactions</sql><java>create.select(t.BOOKED_AT, t.AMOUNT,
    -         sum(t.AMOUNT).over().partitionByOne()
    -                      .orderBy(t.BOOKED_AT)
    -                      .rowsBetweenUnboundedPreceding()
    -                      .andCurrentRow().as("total")
    -      .from(TRANSACTIONS.as("t"));</java>
    -</code-pair><html>
    -
    -
    -									<h3>Window functions created from ordered aggregate functions</h3>
    -									<p>
    -										In the previous chapter about <reference id="aggregate-functions" title="aggregate functions"/>, we have seen the concept of "ordered aggregate functions", such as Oracle's <code>LISTAGG()</code>. These functions have a window function / analytical function variant, as well. For example:
    -									</p>
    -									
    -</html><code-pair>
    -<sql>SELECT   LISTAGG(TITLE, ', ')
    -         WITHIN GROUP (ORDER BY TITLE)
    -         OVER (PARTITION BY BOOK.AUTHOR_ID)
    -FROM     BOOK</sql><java>create.select(listAgg(BOOK.TITLE, ", ")
    -      .withinGroupOrderBy(BOOK.TITLE)
    -      .over().partitionBy(BOOK.AUTHOR_ID))
    -      .from(BOOK)</java>
    -</code-pair><html>
    -
    -									<h3>Window functions created from Oracle's <code>FIRST</code> and <code>LAST</code> aggregate functions</h3>
    -									<p>
    -										In the previous chapter about <reference id="aggregate-functions" title="aggregate functions"/>, we have seen the concept of "<code>FIRST</code> and <code>LAST</code> aggregate functions". These functions have a window function / analytical function variant, as well. For example:
    -									</p>
    -
    -</html><code-pair>
    -<sql>SUM(BOOK.AMOUNT_SOLD)
    -  KEEP(DENSE_RANK FIRST ORDER BY BOOK.AUTHOR_ID)
    -  OVER(PARTITION BY 1)</sql><java>sum(BOOK.AMOUNT_SOLD)
    -  .keepDenseRankFirstOrderBy(BOOK.AUTHOR_ID)
    -  .over().partitionByOne()</java>
    -</code-pair><html>
    -
    -
    -									<h3>Window functions created from user-defined aggregate functions</h3>
    -									<p>
    -										User-defined aggregate functions also implement <reference class="org.jooq.AggregateFunction"/>, hence they can also be transformed into window functions using <code>over()</code>. This is supported by Oracle in particular. See the manual's section about <reference id="user-defined-aggregate-functions" title="user-defined aggregate functions"/> for more details.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="grouping-functions">
    -								<title>Grouping functions</title>
    -								<content><html>
    -									<h3>ROLLUP() explained in SQL</h3>
    -									<p>
    -										The SQL standard defines special functions that can be used in the <reference id="group-by-clause" title="GROUP BY clause"/>: the grouping functions. These functions can be used to generate several groupings in a single clause. This can best be explained in SQL. Let's take <code>ROLLUP()</code> for instance:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[-- ROLLUP() with one argument 
    -SELECT AUTHOR_ID, COUNT(*)
    -FROM BOOK
    -GROUP BY ROLLUP(AUTHOR_ID)
    -
    -
    --- ROLLUP() with two arguments
    -SELECT AUTHOR_ID, PUBLISHED_IN, COUNT(*)
    -FROM BOOK
    -GROUP BY ROLLUP(AUTHOR_ID, PUBLISHED_IN)
    -
    -
    -
    -
    -
    -
    -
    -]]></sql><sql><![CDATA[-- The same query using UNION ALL:
    -  SELECT AUTHOR_ID, COUNT(*) FROM BOOK GROUP BY (AUTHOR_ID)
    -UNION ALL
    -  SELECT NULL, COUNT(*) FROM BOOK GROUP BY ()
    -ORDER BY 1 NULLS LAST
    -
    --- The same query using UNION ALL:
    -  SELECT AUTHOR_ID, PUBLISHED_IN, COUNT(*) 
    -  FROM BOOK GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -UNION ALL
    -  SELECT AUTHOR_ID, NULL, COUNT(*) 
    -  FROM BOOK GROUP BY (AUTHOR_ID)
    -UNION ALL
    -  SELECT NULL, NULL, COUNT(*) 
    -  FROM BOOK GROUP BY ()
    -ORDER BY 1 NULLS LAST, 2 NULLS LAST
    -]]></sql>
    -</code-pair><html>
    -
    -									<p>
    -										In English, the <code>ROLLUP()</code> grouping function provides <code>N+1</code> groupings, when <code>N</code> is the number of arguments to the <code>ROLLUP()</code> function. Each grouping has an additional group field from the <code>ROLLUP()</code> argument field list. The results of the second query might look something like this:
    -									</p>
    -									
    -</html><text><![CDATA[+-----------+--------------+----------+
    -| AUTHOR_ID | PUBLISHED_IN | COUNT(*) |
    -+-----------+--------------+----------+
    -|         1 |         1945 |        1 | <- GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -|         1 |         1948 |        1 | <- GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -|         1 |         NULL |        2 | <- GROUP BY (AUTHOR_ID)
    -|         2 |         1988 |        1 | <- GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -|         2 |         1990 |        1 | <- GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -|         2 |         NULL |        2 | <- GROUP BY (AUTHOR_ID)
    -|      NULL |         NULL |        4 | <- GROUP BY ()
    -+-----------+--------------+----------+]]></text><html>
    -
    -									<h3>CUBE() explained in SQL</h3>
    -									<p>
    -										<code>CUBE()</code> is different from <code>ROLLUP()</code> in the way that it doesn't just create <code>N+1</code> groupings, it creates all <code>2^N</code> possible combinations between all group fields in the <code>CUBE()</code> function argument list. Let's re-consider our second query from before:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[-- CUBE() with two arguments
    -SELECT AUTHOR_ID, PUBLISHED_IN, COUNT(*)
    -FROM BOOK
    -GROUP BY CUBE(AUTHOR_ID, PUBLISHED_IN)
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -]]></sql><sql><![CDATA[-- The same query using UNION ALL:
    -  SELECT AUTHOR_ID, PUBLISHED_IN, COUNT(*) 
    -  FROM BOOK GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -UNION ALL
    -  SELECT AUTHOR_ID, NULL, COUNT(*) 
    -  FROM BOOK GROUP BY (AUTHOR_ID)
    -UNION ALL
    -  SELECT NULL, PUBLISHED_IN, COUNT(*) 
    -  FROM BOOK GROUP BY (PUBLISHED_IN)
    -UNION ALL
    -  SELECT NULL, NULL, COUNT(*) 
    -  FROM BOOK GROUP BY ()
    -ORDER BY 1 NULLS FIRST, 2 NULLS FIRST
    -]]></sql>
    -</code-pair><html>
    -
    -									<p>
    -										The results would then hold:
    -									</p>
    -
    -</html><text><![CDATA[+-----------+--------------+----------+
    -| AUTHOR_ID | PUBLISHED_IN | COUNT(*) |
    -+-----------+--------------+----------+
    -|      NULL |         NULL |        2 | <- GROUP BY ()
    -|      NULL |         1945 |        1 | <- GROUP BY (PUBLISHED_IN)
    -|      NULL |         1948 |        1 | <- GROUP BY (PUBLISHED_IN)
    -|      NULL |         1988 |        1 | <- GROUP BY (PUBLISHED_IN)
    -|      NULL |         1990 |        1 | <- GROUP BY (PUBLISHED_IN)
    -|         1 |         NULL |        2 | <- GROUP BY (AUTHOR_ID)
    -|         1 |         1945 |        1 | <- GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -|         1 |         1948 |        1 | <- GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -|         2 |         NULL |        2 | <- GROUP BY (AUTHOR_ID)
    -|         2 |         1988 |        1 | <- GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -|         2 |         1990 |        1 | <- GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -+-----------+--------------+----------+]]></text><html>
    -
    -									<h3>GROUPING SETS()</h3>
    -									<p>
    -										<code>GROUPING SETS()</code> are the generalised way to create multiple groupings. From our previous examples 
    -									</p>
    -									<ul>
    -										<li><code>ROLLUP(AUTHOR_ID, PUBLISHED_IN)</code> corresponds to <code>GROUPING SETS((AUTHOR_ID, PUBLISHED_IN), (AUTHOR_ID), ())</code></li>
    -										<li><code>CUBE(AUTHOR_ID, PUBLISHED_IN)</code> corresponds to <code>GROUPING SETS((AUTHOR_ID, PUBLISHED_IN), (AUTHOR_ID), (PUBLISHED_IN), ())</code></li>
    -									</ul>
    -									<p>
    -										This is nicely explained in the SQL Server manual pages about <code>GROUPING SETS()</code> and other grouping functions:<br/>
    -										<a href="http://msdn.microsoft.com/en-us/library/bb510427(v=sql.105)">http://msdn.microsoft.com/en-us/library/bb510427(v=sql.105)</a>
    -									</p>
    -									
    -									<h3>jOOQ's support for ROLLUP(), CUBE(), GROUPING SETS()</h3>
    -									<p>
    -										jOOQ fully supports all of these functions, as well as the utility functions <code>GROUPING()</code> and <code>GROUPING_ID()</code>, used for identifying the grouping set ID of a record. The <reference id="dsl" title="DSL API"/> thus includes:
    -									</p>
    -									
    -</html><java><![CDATA[// The various grouping function constructors
    -GroupField rollup(Field<?>... fields);
    -GroupField cube(Field<?>... fields);
    -GroupField groupingSets(Field<?>... fields);
    -GroupField groupingSets(Field<?>[]... fields);
    -GroupField groupingSets(Collection<? extends Field<?>>... fields);
    -
    -// The utility functions generating IDs per GROUPING SET
    -Field<Integer> grouping(Field<?>);
    -Field<Integer> groupingId(Field<?>...);]]></java><html>
    -
    -									<h3>MySQL's and CUBRID's WITH ROLLUP syntax</h3>
    -									<p>
    -										MySQL and CUBRID don't know any grouping functions, but they support a <code>WITH ROLLUP</code> clause, that is equivalent to simple <code>ROLLUP()</code> grouping functions. jOOQ simulates <code>ROLLUP()</code> in MySQL and CUBRID, by rendering this <code>WITH ROLLUP</code> clause. The following two statements mean the same:
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[-- Statement 1: SQL standard
    -GROUP BY ROLLUP(A, B, C)
    -
    --- Statement 2: SQL standard
    -GROUP BY A, ROLLUP(B, C)]]></sql><sql><![CDATA[-- Statement 1: MySQL
    -GROUP BY A, B, C WITH ROLLUP
    -
    --- Statement 2: MySQL
    --- This is not supported in MySQL]]></sql>
    -</code-pair><html>
    -								</html></content>
    -							</section>
    -
    -							<section id="user-defined-functions">
    -								<title>User-defined functions</title>
    -								<content><html>
    -									<p>
    -										Some databases support user-defined functions, which can be embedded in any SQL statement, if you're using jOOQ's <reference id="code-generation" title="code generator"/>. Let's say you have the following simple function in Oracle SQL:
    -									</p>
    -									
    -</html><sql><![CDATA[CREATE OR REPLACE FUNCTION echo (INPUT NUMBER)
    -RETURN NUMBER
    -IS
    -BEGIN
    -    RETURN INPUT;
    -END echo;
    -]]></sql><html>
    -
    -                                    <p>
    -                                    	The above function will be made available from a generated <reference id="codegen-procedures" title="Routines"/> class. You can use it like any other <reference id="column-expressions" title="column expression"/>:
    -                                    </p>
    -                                    
    -</html><code-pair>
    -<sql><![CDATA[SELECT echo(1) FROM DUAL WHERE echo(2) = 2]]></sql><java><![CDATA[create.select(echo(1)).where(echo(2).equal(2));]]></java>
    -</code-pair><html>
    -                                
    -                                	<p>
    -                                		Note that user-defined functions returning <reference id="data-types-cursors" title="CURSOR"/> or <reference id="data-types-arrays" title="ARRAY"/> data types can also be used wherever <reference id="table-expressions" title="table expressions"/> can be used, if they are <reference id="array-and-cursor-unnesting" title="unnested"/>
    -                                	</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="user-defined-aggregate-functions">
    -								<title>User-defined aggregate functions</title>
    -								<content><html>
    -									<p>
    -										Some databases support user-defined aggregate functions, which can then be used along with <reference id="group-by-clause" title="GROUP BY clauses"/> or as <reference id="window-functions" title="window functions"/>. An example for such a database is Oracle. With Oracle, you can define the following <code>OBJECT</code> type (the example was taken from the <a href="http://docs.oracle.com/cd/B28359_01/appdev.111/b28425/ext_agg_ref.htm">Oracle 11g documentation</a>): 
    -									</p>
    -									
    -</html><sql><![CDATA[CREATE TYPE U_SECOND_MAX AS OBJECT
    -(
    -  MAX NUMBER, -- highest value seen so far
    -  SECMAX NUMBER, -- second highest value seen so far
    -  STATIC FUNCTION ODCIAggregateInitialize(sctx IN OUT U_SECOND_MAX) RETURN NUMBER,
    -  MEMBER FUNCTION ODCIAggregateIterate(self IN OUT U_SECOND_MAX, value IN NUMBER) RETURN NUMBER,
    -  MEMBER FUNCTION ODCIAggregateTerminate(self IN U_SECOND_MAX, returnValue OUT NUMBER, flags IN NUMBER) RETURN NUMBER,
    -  MEMBER FUNCTION ODCIAggregateMerge(self IN OUT U_SECOND_MAX, ctx2 IN U_SECOND_MAX) RETURN NUMBER
    -);
    -
    -CREATE OR REPLACE TYPE BODY U_SECOND_MAX IS
    -STATIC FUNCTION ODCIAggregateInitialize(sctx IN OUT U_SECOND_MAX)
    -RETURN NUMBER IS
    -BEGIN
    -  SCTX := U_SECOND_MAX(0, 0);
    -  RETURN ODCIConst.Success;
    -END;
    -
    -MEMBER FUNCTION ODCIAggregateIterate(self IN OUT U_SECOND_MAX, value IN NUMBER) RETURN NUMBER IS
    -BEGIN
    -  IF VALUE > SELF.MAX THEN
    -    SELF.SECMAX := SELF.MAX;
    -    SELF.MAX := VALUE;
    -  ELSIF VALUE > SELF.SECMAX THEN
    -    SELF.SECMAX := VALUE;
    -  END IF;
    -  RETURN ODCIConst.Success;
    -END;
    -
    -MEMBER FUNCTION ODCIAggregateTerminate(self IN U_SECOND_MAX, returnValue OUT NUMBER, flags IN NUMBER) RETURN NUMBER IS
    -BEGIN
    -  RETURNVALUE := SELF.SECMAX;
    -  RETURN ODCIConst.Success;
    -END;
    -
    -MEMBER FUNCTION ODCIAggregateMerge(self IN OUT U_SECOND_MAX, ctx2 IN U_SECOND_MAX) RETURN NUMBER IS
    -BEGIN
    -  IF CTX2.MAX > SELF.MAX THEN
    -    IF CTX2.SECMAX > SELF.SECMAX THEN
    -      SELF.SECMAX := CTX2.SECMAX;
    -    ELSE
    -      SELF.SECMAX := SELF.MAX;
    -    END IF;
    -    SELF.MAX := CTX2.MAX;
    -  ELSIF CTX2.MAX > SELF.SECMAX THEN
    -    SELF.SECMAX := CTX2.MAX;
    -  END IF;
    -  RETURN ODCIConst.Success;
    -END;
    -END;]]></sql><html>
    -
    -									<p>
    -										The above <code>OBJECT</code> type is then available to function declarations as such:
    -									</p>
    -
    -</html><sql><![CDATA[
    -CREATE FUNCTION SECOND_MAX (input NUMBER) RETURN NUMBER
    -PARALLEL_ENABLE AGGREGATE USING U_SECOND_MAX;]]></sql><html>
    -
    -									<h3>Using the generated aggregate function</h3>
    -									<p>
    -										jOOQ's <reference id="code-generation" title="code generator"/> will detect such aggregate functions and generate them differently from regular <reference id="user-defined-functions" title="user-defined functions"/>. They implement the <reference class="org.jooq.AggregateFunction"/> type, as mentioned in the manual's section about <reference id="aggregate-functions" title="aggregate functions"/>. Here's how you can use the <code>SECOND_MAX()</code> aggregate function with jOOQ:
    -									</p>
    -				
    -</html><code-pair>					
    -<sql><![CDATA[-- Get the second-latest publishing date by author
    -SELECT SECOND_MAX(PUBLISHED_IN) 
    -FROM BOOK
    -GROUP BY AUTHOR_ID]]></sql><java><![CDATA[// Routines.secondMax() can be static-imported
    -create.select(secondMax(BOOK.PUBLISHED_IN))
    -      .from(BOOK)
    -      .groupBy(BOOK.AUTHOR_ID)]]></java>
    -</code-pair><html>
    -								</html></content>
    -							</section>
    -
    -							<section id="case-expressions">
    -								<title>The CASE expression</title>
    -								<content><html>
    -									<p>
    -										The <code>CASE</code> expression is part of the standard SQL syntax. While some RDBMS also offer an <code>IF</code> expression, or a <code>DECODE</code> function, you can always rely on the two types of <code>CASE</code> syntax:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[CASE WHEN AUTHOR.FIRST_NAME = 'Paulo'  THEN 'brazilian'
    -     WHEN AUTHOR.FIRST_NAME = 'George' THEN 'english'
    -                                       ELSE 'unknown'
    -END
    -
    --- OR:
    -
    -CASE AUTHOR.FIRST_NAME WHEN 'Paulo'  THEN 'brazilian'
    -                       WHEN 'George' THEN 'english'
    -                                     ELSE 'unknown'
    -END]]></sql><java><![CDATA[create.decode()
    -      .when(AUTHOR.FIRST_NAME.equal("Paulo"), "brazilian")
    -      .when(AUTHOR.FIRST_NAME.equal("George"), "english")
    -      .otherwise("unknown");
    -
    -// OR:
    -
    -create.decode().value(AUTHOR.FIRST_NAME)
    -               .when("Paulo", "brazilian")
    -               .when("George", "english")
    -               .otherwise("unknown");]]></java>
    -</code-pair><html>
    -
    -								<p>
    -									In jOOQ, both syntaxes are supported (The second one is simulated in Derby, which only knows the first one). Unfortunately, both case and else are reserved words in Java. jOOQ chose to use decode() from the Oracle <code>DECODE</code> function, and otherwise(), which means the same as else.
    -								</p>
    -
    -								<p>
    -									A <code>CASE</code> expression can be used anywhere where you can place a <reference id="column-expressions" title="column expression (or Field)"/>. For instance, you can <code>SELECT</code> the above expression, if you're selecting from <code>AUTHOR</code>:
    -							 	</p>
    -
    -</html><sql>SELECT AUTHOR.FIRST_NAME, [... CASE EXPR ...] AS nationality
    -  FROM AUTHOR</sql><html>
    -
    -								<h3>The Oracle DECODE() function</h3>
    -								<p>
    -									Oracle knows a more succinct, but maybe less readable <code>DECODE()</code> function with a variable number of arguments. This function roughly does the same as the second case expression syntax. jOOQ supports the <code>DECODE()</code> function and simulates it using <code>CASE</code> expressions in all dialects other than Oracle:
    -								</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[-- Oracle:
    -DECODE(FIRST_NAME, 'Paulo', 'brazilian',
    -                   'George', 'english',
    -                   'unknown');
    -
    --- Other SQL dialects
    -CASE AUTHOR.FIRST_NAME WHEN 'Paulo'  THEN 'brazilian'
    -                       WHEN 'George' THEN 'english'
    -                                     ELSE 'unknown'
    -END]]></sql><java><![CDATA[
    -
    -
    -
    -
    -// Use the Oracle-style DECODE() function with jOOQ.
    -// Note, that you will not be able to rely on type-safety
    -create.decode(AUTHOR.FIRST_NAME,
    -    "Paulo", "brazilian",
    -    "George", "english",
    -    "unknown");]]></java>
    -</code-pair><html>
    -
    -		  							<h3>CASE clauses in an ORDER BY clause</h3>
    -									<p>
    -										Sort indirection is often implemented with a <code>CASE</code> clause of a <code>SELECT</code>'s <code>ORDER BY</code> clause. See the manual's section about the <reference id="order-by-clause" title="ORDER BY clause"/> for more details.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="sequences-and-serials">
    -								<title>Sequences and serials</title>
    -								<content><html>
    -									<p>
    -										Sequences implement the <reference class="org.jooq.Sequence"/> interface, providing essentially this functionality:
    -									</p>
    -
    -</html><java><![CDATA[// Get a field for the CURRVAL sequence property
    -Field<T> currval();
    -
    -// Get a field for the NEXTVAL sequence property
    -Field<T> nextval();]]></java><html>
    -
    -									<p>
    -										So if you have a sequence like this in Oracle:
    -									</p>
    -
    -</html><sql>CREATE SEQUENCE s_author_id</sql><html>
    -
    -									<p>
    -										You can then use your <reference id="codegen-sequences" title="generated sequence"/> object directly in a SQL statement as such:
    -									</p>
    -
    -</html><java><![CDATA[// Reference the sequence in a SELECT statement:
    -BigInteger nextID = create.select(s).fetchOne(S_AUTHOR_ID.nextval());
    -
    -// Reference the sequence in an INSERT statement:
    -create.insertInto(AUTHOR, AUTHOR.ID, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -      .values(S_AUTHOR_ID.nextval(), val("William"), val("Shakespeare"));
    -]]></java><html>
    -
    -									<ul>
    -										<li>For more information about generated sequences, refer to the manual's section about <reference id="codegen-sequences" title="generated sequences"/></li>
    -										<li>For more information about executing standalone calls to sequences, refer to the manual's section about <reference id="sequence-execution" title="sequence execution"/></li>
    -									</ul>
    -								</html></content>
    -							</section>
    -							
    -							<section id="row-value-expressions">
    -								<title>Tuples or row value expressions</title>
    -								<content><html>
    -									<p>
    -										According to the SQL standard, row value expressions can have a degree of more than one. This is commonly used in the <reference id="insert-statement" title="INSERT statement"/>, where the <code>VALUES</code> row value constructor allows for providing a row value expression as a source for <code>INSERT</code> data. Row value expressions can appear in various other places, though. They are supported by jOOQ as records / rows. jOOQ's <reference id="dsl" title="DSL"/> allows for the construction of type-safe records up to the degree of {max-row-degree}. Higher-degree Rows are supported as well, but without any type-safety. Row types are modelled as follows:
    -									</p>
    -									
    -</html><java><![CDATA[// The DSL provides overloaded row value expression constructor methods:
    -public static <T1>             Row1<T1>             row(T1 t1)                      { ... }
    -public static <T1, T2>         Row2<T1, T2>         row(T1 t1, T2 t2)               { ... }
    -public static <T1, T2, T3>     Row3<T1, T2, T3>     row(T1 t1, T2 t2, T3 t3)        { ... }
    -public static <T1, T2, T3, T4> Row4<T1, T2, T3, T4> row(T1 t1, T2 t2, T3 t3, T4 t4) { ... }
    -
    -// [ ... idem for Row5, Row6, Row7, ..., Row{max-row-degree} ]
    -
    -// Degrees of more than {max-row-degree} are supported without type-safety
    -public static RowN row(Object... values) { ... }]]></java><html>
    -
    -									<h3>Using row value expressions in predicates</h3>
    -                                	<p>
    -                                		Row value expressions are incompatible with most other <reference id="queryparts" title="QueryParts"/>, but they can be used as a basis for constructing various <reference id="conditional-expressions" title="conditional expressions"/>, such as:
    -                                	</p>
    -                                	<ul>
    -                                		<li><reference id="comparison-predicate-degree-n" title="comparison predicates"/></li>
    -                                		<li><reference id="null-predicate-degree-n" title="NULL predicates"/></li>
    -                                		<li><reference id="between-predicate-degree-n" title="BETWEEN predicates"/></li>
    -                                		<li><reference id="in-predicate-degree-n" title="IN predicates"/></li>
    -                                		<li><reference id="overlaps-predicate" title="OVERLAPS predicate"/> (for degree 2 row value expressions only)</li>
    -                                	</ul>
    -                                	<p>
    -                                		See the relevant sections for more details about how to use row value expressions in predicates.
    -                                	</p>
    -                                	
    -                                	<h3>Using row value expressions in UPDATE statements</h3>
    -                                	<p>
    -                                		The <reference id="update-statement" title="UPDATE statement"/> also supports a variant where row value expressions are updated, rather than single columns. See the relevant section for more details
    -                                	</p>
    -                                	
    -									<h3>Higher-degree row value expressions</h3>
    -									<p>
    -										jOOQ chose to explicitly support degrees up to {max-row-degree} to match Scala's typesafe tuple, function and product support. Unlike Scala, however, jOOQ also supports higher degrees without the additional typesafety. 
    -									</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -					<section id="conditional-expressions">
    -					    <title>Conditional expressions</title>
    -						<content><html>
    -							<p>
    -								Conditions or conditional expressions are widely used in SQL and in the jOOQ API. They can be used in
    -							</p>
    -							<ul>
    -								<li>The <reference id="case-expressions" title="CASE expression"/></li>
    -								<li>The <reference id="join-clause" title="JOIN clause"/> (or <code>JOIN .. ON</code> clause, to be precise) of a <reference id="select-statement" title="SELECT statement"/>, <reference id="update-statement" title="UPDATE statement"/>, <reference id="delete-statement" title="DELETE statement"/></li>
    -								<li>The <reference id="where-clause" title="WHERE clause"/> of a <reference id="select-statement" title="SELECT statement"/>, <reference id="update-statement" title="UPDATE statement"/>, <reference id="delete-statement" title="DELETE statement"/></li>
    -								<li>The <reference id="connect-by-clause" title="CONNECT BY clause"/> of a <reference id="select-statement" title="SELECT statement"/></li>
    -								<li>The <reference id="having-clause" title="HAVING clause"/> of a <reference id="select-statement" title="SELECT statement"/></li>
    -								<li>The <reference id="merge-statement" title="MERGE statement"/>'s ON clause</li>
    -							</ul>
    -							
    -							<h3>Boolean types in SQL</h3>
    -							<p>
    -								Before SQL:1999, boolean types did not really exist in SQL. They were modelled by 0 and 1 numeric/char values. With SQL:1999, true booleans were introduced and are now supported by most databases. In short, these are possible boolean values:
    -							</p>
    -							<ul>
    -								<li><code>1</code> or <code>TRUE</code></li>
    -								<li><code>0</code> or <code>FALSE</code></li>
    -								<li><code>NULL</code> or <code>UNKNOWN</code></li>
    -							</ul>
    -							<p>
    -								It is important to know that SQL differs from many other languages in the way it interprets the <code>NULL</code> boolean value. Most importantly, the following facts are to be remembered:
    -							</p>
    -							<ul>
    -								<li><code>[ANY] = NULL</code> yields <code>NULL</code> (not <code>FALSE</code>)</li>
    -								<li><code>[ANY] != NULL</code> yields <code>NULL</code> (not <code>TRUE</code>)</li>
    -								<li><code>NULL = NULL</code> yields <code>NULL</code> (not <code>TRUE</code>)</li>
    -								<li><code>NULL != NULL</code> yields <code>NULL</code> (not <code>FALSE</code>)</li>
    -							</ul>
    -							<p>
    -								For simplified <code>NULL</code> handling, please refer to the section about the <reference id="distinct-predicate" title="DISTINCT predicate"/>.
    -							</p>
    -							<p>
    -								Note that jOOQ does not model these values as actual <reference id="column-expressions" title="column expression"/> compatible.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -						    <section id="condition-building">
    -							    <title>Condition building</title>
    -								<content><html>
    -									<p>
    -										With jOOQ, most <reference id="conditional-expressions" title="conditional expressions"/> are built from <reference id="column-expressions" title="column expressions"/>, calling various methods on them. For instance, to build a <reference id="comparison-predicate" title="comparison predicate"/>, you can write the following expression:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[TITLE  = 'Animal Farm'
    -TITLE != 'Animal Farm']]></sql><java><![CDATA[BOOK.TITLE.equal("Animal Farm")
    -BOOK.TITLE.notEqual("Animal Farm")]]></java>
    -</code-pair><html>
    -
    -									<h3>Create conditions from the DSL</h3>
    -									<p>
    -										There are a few types of conditions, that can be created statically from the <reference id="dsl" title="DSL"/>. These are:
    -									</p>
    -									<ul>
    -										<li><reference id="plain-sql" title="plain SQL conditions"/>, that allow you to phrase your own SQL string <reference id="conditional-expressions" title="conditional expression"/></li>
    -										<li>The <reference id="exists-predicate" title="EXISTS predicate"/>, a standalone predicate that creates a conditional expression</li>
    -										<li>Constant <code>TRUE</code> and <code>FALSE</code> conditional expressions</li>
    -									</ul>
    -
    -									<h3>Connect conditions using boolean operators</h3>
    -									<p>
    -										Conditions can also be connected using <reference id="boolean-operators" title="boolean operators"/> as will be discussed in a subsequent chapter.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -						    <section id="boolean-operators">
    -							    <title>AND, OR, NOT boolean operators</title>
    -								<content><html>
    -									<p>
    -										In SQL, as in most other languages, <reference id="conditional-expressions" title="conditional expressions"/> can be connected using the <code>AND</code> and <code>OR</code> binary operators, as well as the <code>NOT</code> unary operator, to form new conditional expressions. In jOOQ, this is modelled as such: 
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[-- A simple conditional expression
    -TITLE = 'Animal Farm' OR TITLE = '1984'
    -
    --- A more complex conditional expression
    -        (TITLE = 'Animal Farm' OR TITLE = '1984') 
    -AND NOT (AUTHOR.LAST_NAME = 'Orwell')]]></sql><java><![CDATA[// A simple boolean connection
    -BOOK.TITLE.equal("Animal Farm").or(BOOK.TITLE.equal("1984"))
    -
    -// A more complex conditional expression
    -BOOK.TITLE.equal("Animal Farm").or(BOOK.TITLE.equal("1984"))
    -    .andNot(AUTHOR.LAST_NAME.equal("Orwell"))]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										The above example shows that the number of parentheses in Java can quickly explode. Proper indentation may become crucial in making such code readable. In order to understand how jOOQ composes combined conditional expressions, let's assign component expressions first:
    -									</p>
    -
    -</html><java><![CDATA[Condition a = BOOK.TITLE.equal("Animal Farm");
    -Condition b = BOOK.TITLE.equal("1984");
    -Condition c = AUTHOR.LAST_NAME.equal("Orwell");
    -
    -Condition combined1 = a.or(b);             // These OR-connected conditions form a new condition, wrapped in parentheses
    -Condition combined2 = combined1.andNot(c); // The left-hand side of the AND NOT () operator is already wrapped in parentheses]]></java><html>
    -
    -									<h3>The Condition API</h3>
    -									<p>
    -										Here are all boolean operators on the <reference class="org.jooq.Condition"/> interface:
    -									</p>
    -									
    -</html><java><![CDATA[and(Condition)            // Combine conditions with AND
    -and(String)               // Combine conditions with AND. Convenience for adding plain SQL to the right-hand side
    -and(String, Object...)    // Combine conditions with AND. Convenience for adding plain SQL to the right-hand side
    -and(String, QueryPart...) // Combine conditions with AND. Convenience for adding plain SQL to the right-hand side
    -andExists(Select<?>)      // Combine conditions with AND. Convenience for adding an exists predicate to the rhs
    -andNot(Condition)         // Combine conditions with AND. Convenience for adding an inverted condition to the rhs
    -andNotExists(Select<?>)   // Combine conditions with AND. Convenience for adding an inverted exists predicate to the rhs
    -
    -or(Condition)             // Combine conditions with OR
    -or(String)                // Combine conditions with OR. Convenience for adding plain SQL to the right-hand side
    -or(String, Object...)     // Combine conditions with OR. Convenience for adding plain SQL to the right-hand side
    -or(String, QueryPart...)  // Combine conditions with OR. Convenience for adding plain SQL to the right-hand side
    -orExists(Select<?>)       // Combine conditions with OR. Convenience for adding an exists predicate to the rhs
    -orNot(Condition)          // Combine conditions with OR. Convenience for adding an inverted condition to the rhs
    -orNotExists(Select<?>)    // Combine conditions with OR. Convenience for adding an inverted exists predicate to the rhs
    -
    -not()                     // Invert a condition (synonym for DSL.not(Condition)]]></java></content>
    -							</section>
    -
    -						    <section id="comparison-predicate">
    -							    <title>Comparison predicate</title>
    -								<content><html>
    -									<p>
    -										In SQL, comparison predicates are formed using common comparison operators:
    -									</p>
    -									<ul>
    -										<li><strong>=</strong> to test for equality</li>
    -										<li><strong>&lt;&gt;</strong> or <strong>!=</strong> to test for non-equality</li>
    -										<li><strong>&gt;</strong> to test for being strictly greater</li>
    -										<li><strong>&gt;=</strong> to test for being greater or equal</li>
    -										<li><strong>&lt;</strong> to test for being strictly less</li>
    -										<li><strong>&lt;=</strong> to test for being less or equal</li>
    -									</ul>
    -									
    -									<p>
    -										Unfortunately, Java does not support operator overloading, hence these operators are also implemented as methods in jOOQ, like any other SQL syntax elements. The relevant parts of the <reference class="org.jooq.Field"/> interface are these:
    -									</p>
    -									
    -</html><java><![CDATA[eq or equal(T);                                     // =  (some bind value)
    -eq or equal(Field<T>);                              // =  (some column expression)
    -eq or equal(Select<? extends Record1<T>>);          // =  (some scalar SELECT statement)
    -ne or notEqual(T);                                  // <> (some bind value)
    -ne or notEqual(Field<T>);                           // <> (some column expression)
    -ne or notEqual(Select<? extends Record1<T>>);       // <> (some scalar SELECT statement)
    -lt or lessThan(T);                                  // <  (some bind value)
    -lt or lessThan(Field<T>);                           // <  (some column expression)
    -lt or lessThan(Select<? extends Record1<T>>);       // <  (some scalar SELECT statement)
    -le or lessOrEqual(T);                               // <= (some bind value)
    -le or lessOrEqual(Field<T>);                        // <= (some column expression)
    -le or lessOrEqual(Select<? extends Record1<T>>);    // <= (some scalar SELECT statement)
    -gt or greaterThan(T);                               // >  (some bind value)
    -gt or greaterThan(Field<T>);                        // >  (some column expression)
    -gt or greaterThan(Select<? extends Record1<T>>);    // >  (some scalar SELECT statement)
    -ge or greaterOrEqual(T);                            // >= (some bind value)
    -ge or greaterOrEqual(Field<T>);                     // >= (some column expression)
    -ge or greaterOrEqual(Select<? extends Record1<T>>); // >= (some scalar SELECT statement)]]></java><html>
    -
    -									<p>
    -										Note that every operator is represented by two methods. A verbose one (such as <code>equal()</code>) and a two-character one (such as <code>eq()</code>). Both methods are the same. You may choose either one, depending on your taste. The manual will always use the more verbose one.
    -									</p>
    -									
    -									<h3>jOOQ's convenience methods using comparison operators</h3>
    -									<p>
    -										In addition to the above, jOOQ provides a few convenience methods for common operations performed on strings using comparison predicates:
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[-- case insensitivity
    -LOWER(TITLE)  = LOWER('animal farm')
    -LOWER(TITLE) <> LOWER('animal farm')]]></sql><java><![CDATA[// case insensitivity
    -BOOK.TITLE.equalIgnoreCase("animal farm")
    -BOOK.TITLE.notEqualIgnoreCase("animal farm")]]></java>
    -</code-pair><html>
    -								</html></content>
    -							</section>
    -
    -							<section id="comparison-predicate-degree-n">
    -							    <title>Comparison predicate (degree > 1)</title>
    -							    <content><html>
    -							    	<p>
    -							    		All variants of the <reference id="comparison-predicate" title="comparison predicate"/> that we've seen in the previous chapter also work for <reference id="row-value-expressions" title="row value expressions"/>. If your database does not support row value expression comparison predicates, jOOQ simulates them the way they are defined in the SQL standard:
    -							    	</p>
    -	
    -</html><code-pair>
    -<sql><![CDATA[-- Row value expressions (equal)
    -(A, B)    =  (X, Y)
    -(A, B, C) =  (X, Y, Z)
    --- greater than
    -(A, B)    >  (X, Y)
    -
    -(A, B, C) >  (X, Y, Z)
    -
    -
    --- greater or equal  
    -(A, B)    >= (X, Y)
    -
    -
    -(A, B, C) >= (X, Y, Z)
    -
    -
    -
    --- Inverse comparisons
    -
    -(A, B)    <> (X, Y)
    -(A, B)    <  (X, Y)
    -(A, B)    <= (X, Y)]]></sql><sql><![CDATA[-- Equivalent factored-out predicates (equal)
    -(A = X) AND (B = Y)
    -(A = X) AND (B = Y) AND (C = Z)
    --- greater than
    -(A > X) 
    -  OR ((A = X) AND (B > Y)) 
    -(A > X) 
    -  OR ((A = X) AND (B > Y)) 
    -  OR ((A = X) AND (B = Y) AND (C > Z))
    --- greater or equal  
    -(A > X) 
    -  OR ((A = X) AND (B > Y))
    -  OR ((A = X) AND (B = Y))
    -(A > X) 
    -  OR ((A = X) AND (B > Y)) 
    -  OR ((A = X) AND (B = Y) AND (C > Z))
    -  OR ((A = X) AND (B = Y) AND (C = Z))
    --- For simplicity, these predicates are shown in terms
    --- of their negated counter parts
    -NOT((A, B) =  (X, Y))
    -NOT((A, B) >= (X, Y))
    -NOT((A, B) >  (X, Y))]]></sql>	
    -</code-pair><html>						    	
    -
    -									<p>
    -										jOOQ supports all of the above row value expression comparison predicates, both with <reference id="column-expressions" title="column expression lists"/> and <reference id="select-statement" title="scalar subselects"/> at the right-hand side:
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[-- With regular column expressions
    -(BOOK.AUTHOR_ID, BOOK.TITLE) = (1, 'Animal Farm')
    -
    --- With scalar subselects
    -(BOOK.AUTHOR_ID, BOOK.TITLE) = (
    -  SELECT PERSON.ID, 'Animal Farm'
    -  FROM PERSON
    -  WHERE PERSON.ID = 1
    -)]]></sql><java><![CDATA[// Column expressions
    -row(BOOK.AUTHOR_ID, BOOK.TITLE).equal(1, "Animal Farm");
    -
    -// Subselects
    -row(BOOK.AUTHOR_ID, BOOK.TITLE).equal(
    -  select(PERSON.ID, val("Animal Farm"))
    -  .from(PERSON)
    -  .where(PERSON.ID.equal(1))
    -);]]></java>
    -</code-pair><html>									
    -							    </html></content>
    -						    </section>
    -						    
    -						    <section id="quantified-comparison-predicate">
    -							    <title>Quantified comparison predicate</title>
    -								<content><html>
    -									<p>
    -										If the right-hand side of a <reference id="comparison-predicate" title="comparison predicate"/> turns out to be a non-scalar table subquery, you can wrap that subquery in a quantifier, such as <code>ALL</code>, <code>ANY</code>, or <code>SOME</code>. Note that the SQL standard defines <code>ANY</code> and <code>SOME</code> to be equivalent. jOOQ settled for the more intuitive <code>ANY</code> and doesn't support <code>SOME</code>. Here are some examples, supported by jOOQ:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[TITLE = ANY('Animal Farm', '1982')
    -PUBLISHED_IN > ALL(1920, 1940)]]></sql><java><![CDATA[BOOK.TITLE.equal(any("Animal Farm", "1982"));
    -BOOK.PUBLISHED_IN.greaterThan(all(1920, 1940));]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										For the example, the right-hand side of the quantified comparison predicates were filled with argument lists. But it is easy to imagine that the source of values results from a <reference id="nested-selects" title="subselect"/>.
    -									</p>
    -
    -									<h3>ANY and the IN predicate</h3>
    -									<p>
    -										It is interesting to note that the SQL standard defines the <reference id="in-predicate" title="IN predicate"/> in terms of the <code>ANY</code>-quantified predicate. The following two expressions are equivalent:
    -									</p>
    -									
    -</html><code-pair>
    -<text><![CDATA[[ROW VALUE EXPRESSION] IN [IN PREDICATE VALUE]]]></text><text><![CDATA[[ROW VALUE EXPRESSION] = ANY [IN PREDICATE VALUE]]]></text>
    -</code-pair><html>
    -
    -									<p>
    -										Typically, the <reference id="in-predicate" title="IN predicate"/> is more readable than the quantified comparison predicate.
    -									</p>
    -								</html></content>
    -							</section>
    -							
    -						    <section id="null-predicate">
    -							    <title>NULL predicate</title>
    -								<content><html>
    -									<p>
    -										In SQL, you cannot compare <code>NULL</code> with any value using <reference id="comparison-predicate" title="comparison predicates"/>, as the result would yield <code>NULL</code> again, which is neither <code>TRUE</code> nor <code>FALSE</code> (see also the manual's section about <reference id="conditional-expressions" title="conditional expressions"/>). In order to test a <reference id="column-expressions" title="column expression"/> for <code>NULL</code>, use the <code>NULL</code> predicate as such:
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[TITLE IS NULL
    -TITLE IS NOT NULL]]></sql><java><![CDATA[BOOK.TITLE.isNull()
    -BOOK.TITLE.isNotNull()]]></java>
    -</code-pair><html>
    -
    -								</html></content>
    -							</section>
    -
    -						    <section id="null-predicate-degree-n">
    -							    <title>NULL predicate (degree > 1)</title>
    -							    <content><html>
    -							    	<p>
    -							    		The SQL <code>NULL</code> predicate also works well for <reference id="row-value-expressions" title="row value expressions"/>, although it has some subtle, counter-intuitive features when it comes to inversing predicates with the <code>NOT()</code> operator! Here are some examples:
    -							    	</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[-- Row value expressions
    -(A, B) IS     NULL
    -(A, B) IS NOT NULL
    -
    --- Inverse of the above
    -NOT((A, B) IS     NULL)
    -NOT((A, B) IS NOT NULL)]]></sql><sql><![CDATA[-- Equivalent factored-out predicates
    -(A IS     NULL) AND (B IS     NULL)
    -(A IS NOT NULL) AND (B IS NOT NULL)
    -
    --- Inverse
    -(A IS NOT NULL) OR  (B IS NOT NULL)
    -(A IS     NULL) OR  (B IS     NULL)]]></sql>	
    -</code-pair><html>						    	
    -
    -									<p>
    -										The SQL standard contains a nice truth table for the above rules:
    -									</p>
    -									
    -</html><text>+-----------------------+-----------+---------------+---------------+-------------------+
    -| Expression            | R IS NULL | R IS NOT NULL | NOT R IS NULL | NOT R IS NOT NULL |
    -+-----------------------+-----------+---------------+---------------+-------------------+
    -| degree 1: null        | true      | false         | false         |  true             |
    -| degree 1: not null    | false     | true          | true          |  false            |
    -| degree > 1: all null  | true      | false         | false         |  true             |
    -| degree > 1: some null | false     | false         | true          |  true             |
    -| degree > 1: none null | false     | true          | true          |  false            |
    -+-----------------------+-----------+---------------+---------------+-------------------+</text><html>		
    -
    -									<p>
    -										In jOOQ, you would simply use the <code>isNull()</code> and <code>isNotNull()</code> methods on row value expressions. Again, as with the <reference id="comparison-predicate-degree-n" title="row value expression comparison predicate"/>, the row value expression <code>NULL</code> predicate is simulated by jOOQ, if your database does not natively support it:
    -									</p>
    -									
    -</html><java><![CDATA[row(BOOK.ID, BOOK.TITLE).isNull();
    -row(BOOK.ID, BOOK.TITLE).isNotNull();]]></java></content>
    -						    </section>
    -						    
    -						    <section id="distinct-predicate">
    -							    <title>DISTINCT predicate</title>
    -								<content><html>
    -									<p>
    -										Some databases support the <code>DISTINCT</code> predicate, which serves as a convenient, <code>NULL</code>-safe <reference id="comparison-predicate" title="comparison predicate"/>. With the <code>DISTINCT</code> predicate, the following truth table can be assumed:
    -									</p>
    -									<ul>
    -										<li><code>[ANY] IS DISTINCT FROM NULL</code> yields <code>TRUE</code></li>
    -										<li><code>[ANY] IS NOT DISTINCT FROM NULL</code> yields <code>FALSE</code></li>
    -										<li><code>NULL IS DISTINCT FROM NULL</code> yields <code>FALSE</code></li>
    -										<li><code>NULL IS NOT DISTINCT FROM NULL</code> yields <code>TRUE</code></li>
    -									</ul>
    -									<p>
    -										For instance, you can compare two fields for distinctness, ignoring the fact that any of the two could be <code>NULL</code>, which would lead to funny results. This is supported by jOOQ as such:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[TITLE IS DISTINCT FROM SUB_TITLE
    -TITLE IS NOT DISTINCT FROM SUB_TITLE]]></sql><java><![CDATA[BOOK.TITLE.isDistinctFrom(BOOK.SUB_TITLE)
    -BOOK.TITLE.isNotDistinctFrom(BOOK.SUB_TITLE)]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										If your database does not natively support the <code>DISTINCT</code> predicate, jOOQ simulates it with an equivalent <reference id="case-expressions" title="CASE expression"/>, modelling the above truth table:
    -									</p>
    -	
    -</html><code-pair>								
    -<sql><![CDATA[-- [A] IS DISTINCT FROM [B] 
    -CASE WHEN [A] IS     NULL AND [B] IS     NULL THEN FALSE
    -     WHEN [A] IS     NULL AND [B] IS NOT NULL THEN TRUE
    -     WHEN [A] IS NOT NULL AND [B] IS     NULL THEN TRUE
    -     WHEN [A] =               [B]             THEN FALSE
    -     ELSE                                          TRUE
    -END
    -]]></sql><sql><![CDATA[-- [A] IS NOT DISTINCT FROM [B] 
    -CASE WHEN [A] IS     NULL AND [B] IS     NULL THEN TRUE
    -     WHEN [A] IS     NULL AND [B] IS NOT NULL THEN FALSE
    -     WHEN [A] IS NOT NULL AND [B] IS     NULL THEN FALSE
    -     WHEN [A] =               [B]             THEN TRUE
    -     ELSE                                          FALSE
    -END
    -]]></sql>
    -</code-pair><html>							
    -								</html></content>
    -							</section>
    -
    -						    <section id="between-predicate">
    -							    <title>BETWEEN predicate</title>
    -								<content><html>
    -									<p>
    -										The <code>BETWEEN</code> predicate can be seen as syntactic sugar for a pair of <reference id="comparison-predicate" title="comparison predicates"/>. According to the SQL standard, the following two predicates are equivalent:
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[[A] BETWEEN [B] AND [C]]]></sql><sql><![CDATA[[A] >= [B] AND [A] <= [C]]]></sql>
    -</code-pair><html>
    -
    -									<p>
    -										Note the inclusiveness of range boundaries in the definition of the <code>BETWEEN</code> predicate. Intuitively, this is supported in jOOQ as such:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[PUBLISHED_IN     BETWEEN 1920 AND 1940
    -PUBLISHED_IN NOT BETWEEN 1920 AND 1940]]></sql><java><![CDATA[BOOK.PUBLISHED_IN.between(1920).and(1940)
    -BOOK.PUBLISHED_IN.notBetween(1920).and(1940)]]></java>
    -</code-pair><html>
    -
    -									<h3>BETWEEN SYMMETRIC</h3>
    -									<p>
    -										The SQL standard defines the <code>SYMMETRIC</code> keyword to be used along with <code>BETWEEN</code> to indicate that you do not care which bound of the range is larger than the other. A database system should simply swap range bounds, in case the first bound is greater than the second one. jOOQ supports this keyword as well, simulating it if necessary.
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[PUBLISHED_IN     BETWEEN SYMMETRIC 1940 AND 1920
    -PUBLISHED_IN NOT BETWEEN SYMMETRIC 1940 AND 1920]]></sql><java><![CDATA[BOOK.PUBLISHED_IN.betweenSymmetric(1940).and(1920)
    -BOOK.PUBLISHED_IN.notBetweenSymmetric(1940).and(1920)]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										The simulation is done trivially:
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[[A] BETWEEN SYMMETRIC [B] AND [C]]]></sql><sql><![CDATA[([A] BETWEEN [B] AND [C]) OR ([A] BETWEEN [C] AND [B])]]></sql>
    -</code-pair><html>
    -
    -								</html></content>
    -							</section>
    -
    -						    <section id="between-predicate-degree-n">
    -							    <title>BETWEEN predicate (degree > 1)</title>
    -							    <content><html>
    -							    	<p>
    -							    	    The SQL <code>BETWEEN</code> predicate also works well for <reference id="row-value-expressions" title="row value expressions"/>. Much like the <reference id="between-predicate" title="BETWEEN predicate for degree 1"/>, it is defined in terms of a pair of regular <reference id="comparison-predicate" title="comparison predicates"/>:
    -							    	</p>
    -							    	
    -</html><code-pair>
    -<sql><![CDATA[[A] BETWEEN           [B] AND [C]
    -[A] BETWEEN SYMMETRIC [B] AND [C]]]></sql><sql><![CDATA[ [A] >= [B] AND [A] <= [C]
    -([A] >= [B] AND [A] <= [C]) OR ([A] >= [C] AND [A] <= [B])]]></sql>
    -</code-pair><html>
    -							    	
    -							    	<p>
    -							    		The above can be factored out according to the rules listed in the manual's section about <reference id="comparison-predicate-degree-n" title="row value expression comparison predicates"/>.
    -							    	</p>
    -							    	
    -							    	<p>
    -							    		jOOQ supports the <code>BETWEEN [SYMMETRIC]</code> predicate and simulates it in all SQL dialects where necessary. An example is given here:
    -							    	</p>
    -							    	
    -</html><java><![CDATA[row(BOOK.ID, BOOK.TITLE).between(1, "A").and(10, "Z");]]></java></content>
    -							</section>
    -							
    -						    <section id="like-predicate">
    -							    <title>LIKE predicate</title>
    -								<content><html>
    -									<p>
    -										<code>LIKE</code> predicates are popular for simple wildcard-enabled pattern matching. Supported wildcards in all SQL databases are:
    -									</p>
    -									<ul>
    -										<li><strong>_</strong>: (single-character wildcard)</li>
    -										<li><strong>%</strong>: (multi-character wildcard)</li>
    -									</ul>
    -									<p>
    -										With jOOQ, the <code>LIKE</code> predicate can be created from any <reference id="column-expressions" title="column expression"/> as such:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[TITLE     LIKE '%abc%'
    -TITLE NOT LIKE '%abc%']]></sql><java><![CDATA[BOOK.TITLE.like("%abc%")
    -BOOK.TITLE.notLike("%abc%")]]></java>
    -</code-pair><html>
    -									
    -									<h3>Escaping operands with the LIKE predicate</h3>
    -									<p>
    -										Often, your pattern may contain any of the wildcard characters <code>"_"</code> and <code>"%"</code>, in case of which you may want to escape them. jOOQ does not automatically escape patterns in <code>like()</code> and <code>notLike()</code> methods. Instead, you can explicitly define an escape character as such:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[TITLE     LIKE '%The !%-Sign Book%' ESCAPE '!'
    -TITLE NOT LIKE '%The !%-Sign Book%' ESCAPE '!']]></sql><java><![CDATA[BOOK.TITLE.like("%The !%-Sign Book%", '!')
    -BOOK.TITLE.notLike("%The !%-Sign Book%", '!')]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										In the above predicate expressions, the exclamation mark character is passed as the escape character to escape wildcard characters <code>"!_"</code> and <code>"!%"</code>, as well as to escape the escape character itself: <code>"!!"</code>
    -									</p>
    -									<p>
    -										Please refer to your database manual for more details about escaping patterns with the <code>LIKE</code> predicate.
    -									</p>
    -									
    -									<h3>jOOQ's convenience methods using the LIKE predicate</h3>
    -									<p>
    -										In addition to the above, jOOQ provides a few convenience methods for common operations performed on strings using the <code>LIKE</code> predicate. Typical operations are "contains predicates", "starts with predicates", "ends with predicates", etc. Here is the full convenience API wrapping <code>LIKE</code> predicates:
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[-- case insensitivity
    -LOWER(TITLE) LIKE LOWER('%abc%')
    -LOWER(TITLE) NOT LIKE LOWER('%abc%')
    -
    --- contains and similar methods
    -TITLE LIKE '%' || 'abc' || '%'
    -TITLE LIKE 'abc' || '%'
    -TITLE LIKE '%' || 'abc']]></sql><java><![CDATA[// case insensitivity
    -BOOK.TITLE.likeIgnoreCase("%abc%")
    -BOOK.TITLE.notLikeIgnoreCase("%abc%")
    -
    -// contains and similar methods
    -BOOK.TITLE.contains("abc")
    -BOOK.TITLE.startsWith("abc")
    -BOOK.TITLE.endsWith("abc")]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										Note, that jOOQ escapes <code>%</code> and <code>_</code> characters in value in some of the above predicate implementations. For simplicity, this has been omitted in this manual.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -						    <section id="in-predicate">
    -							    <title>IN predicate</title>
    -								<content><html>
    -									<p>
    -										In SQL, apart from comparing a value against several values, the <code>IN</code> predicate can be used to create semi-joins or anti-joins. jOOQ knows the following methods on the <reference class="org.jooq.Field" /> interface, to construct such <code>IN</code> predicates:
    -									</p>
    -
    -</html><java><![CDATA[in(Collection<T>)                   // Construct an IN predicate from a collection of bind values
    -in(T...)                            // Construct an IN predicate from bind values
    -in(Field<?>...)                     // Construct an IN predicate from column expressions
    -in(Select<? extends Record1<T>>)    // Construct an IN predicate from a subselect
    -notIn(Collection<T>)                // Construct a NOT IN predicate from a collection of bind values
    -notIn(T...)                         // Construct a NOT IN predicate from bind values
    -notIn(Field<?>...)                  // Construct a NOT IN predicate from column expressions
    -notIn(Select<? extends Record1<T>>) // Construct a NOT IN predicate from a subselect]]></java><html>
    -
    -									<p>
    -										A sample <code>IN</code> predicate might look like this:
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[TITLE     IN ('Animal Farm', '1984')
    -TITLE NOT IN ('Animal Farm', '1984')]]></sql><java><![CDATA[BOOK.TITLE.in("Animal Farm", "1984")
    -BOOK.TITLE.notIn("Animal Farm", "1984")]]></java>
    -</code-pair><html>
    -
    -									
    -									<h3>NOT IN and NULL values</h3>
    -									<p>
    -										Beware that you should probably not have any <code>NULL</code> values in the right hand side of a <code>NOT IN</code> predicate, as the whole expression would evaluate to <code>NULL</code>, which is rarely desired. This can be shown informally using the following reasoning:
    -									</p>
    -									
    -</html><sql>-- The following conditional expressions are formally or informally equivalent
    -A NOT IN (B, C)
    -A != ANY(B, C)
    -A != B AND A != C
    -
    --- Substitute C for NULL, you'll get
    -A NOT IN (B, NULL)   -- Substitute C for NULL
    -A != B AND A != NULL -- From the above rules
    -A != B AND NULL      -- [ANY] != NULL yields NULL
    -NULL                 -- [ANY] AND NULL yields NULL</sql><html>
    -
    -									<p>
    -										A good way to prevent this from happening is to use the <reference id="exists-predicate" title="EXISTS predicate"/> for anti-joins, which is <code>NULL</code>-value insensitive. See the manual's section about <reference id="conditional-expressions" title="conditional expressions"/> to see a boolean truth table.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -						    <section id="in-predicate-degree-n">
    -							    <title>IN predicate (degree > 1)</title>
    -							    <content><html>
    -							    	<p>
    -							    	    The SQL <code>IN</code> predicate also works well for <reference id="row-value-expressions" title="row value expressions"/>. Much like the <reference id="in-predicate" title="IN predicate for degree 1"/>, it is defined in terms of a <reference id="quantified-comparison-predicate" title="quantified comparison predicate"/>. The two expressions are equivalent:
    -							    	</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[R IN [IN predicate value]]]></sql><sql><![CDATA[R = ANY [IN predicate value]]]></sql>
    -</code-pair><html>		
    -
    -									<p>
    -							    		jOOQ supports the <code>IN</code> predicate. Simulation of the <code>IN</code> predicate where row value expressions aren't well supported is currently only available for <code>IN</code> predicates that do not take a subselect as an <code>IN</code> predicate value. An example is given here:
    -							    	</p>
    -							    	
    -</html><java><![CDATA[row(BOOK.ID, BOOK.TITLE).in(row(1, "A"), row(2, "B"));]]></java></content>
    -							</section>
    -							
    -						    <section id="exists-predicate">
    -							    <title>EXISTS predicate</title>
    -								<content><html>
    -									<p>
    -										Slightly less intuitive, yet more powerful than the previously discussed <reference id="in-predicate" title="IN predicate"/> is the <code>EXISTS</code> predicate, that can be used to form semi-joins or anti-joins. With jOOQ, the <code>EXISTS</code> predicate can be formed in various ways:
    -									</p>
    -									<ul>
    -										<li>From the <reference id="dsl" title="DSL"/>, using static methods. This is probably the most used case</li>
    -										<li>From a <reference id="conditional-expressions" title="conditional expression"/> using <reference id="boolean-operators" title="convenience methods attached to boolean operators"/></li>
    -										<li>From a <reference id="select-statement" title="SELECT statement"/> using <reference id="where-clause" title="convenience methods attached to the where clause"/>, and from other clauses</li>
    -									</ul>
    -									
    -									<p>
    -										An example of an <code>EXISTS</code> predicate can be seen here:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[    EXISTS (SELECT 1 FROM BOOK 
    -            WHERE AUTHOR_ID = 3)
    -NOT EXISTS (SELECT 1 FROM BOOK 
    -            WHERE AUTHOR_ID = 3)]]></sql><java><![CDATA[   exists(create.selectOne().from(BOOK)
    -                .where(BOOK.AUTHOR_ID.equal(3)));
    -notExists(create.selectOne().from(BOOK)
    -                .where(BOOK.AUTHOR_ID.equal(3)));]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										Note that in SQL, the projection of a subselect in an <code>EXISTS</code> predicate is irrelevant. To help you write queries like the above, you can use jOOQ's selectZero() or selectOne() <reference id="dsl" title="DSL"/> methods
    -									</p>
    -									
    -									<h3>Performance of IN vs. EXISTS</h3>
    -									<p>
    -										In theory, the two types of predicates can perform equally well. If your database system ships with a sophisticated cost-based optimiser, it will be able to transform one predicate into the other, if you have all necessary constraints set (e.g. referential constraints, not null constraints). However, in reality, performance between the two might differ substantially. An interesting blog post investigating this topic on the MySQL database can be seen here:<br/>
    -										<a href="http://blog.jooq.org/2012/07/27/not-in-vs-not-exists-vs-left-join-is-null-mysql/">http://blog.jooq.org/2012/07/27/not-in-vs-not-exists-vs-left-join-is-null-mysql/</a>
    -									</p>
    -								</html></content>
    -							</section>
    -							
    -							<section id="overlaps-predicate">
    -								<title>OVERLAPS predicate</title>
    -								<content><html>
    -									<p>
    -										When comparing dates, the SQL standard allows for using a special <code>OVERLAPS</code> predicate, which checks whether two date ranges overlap each other. The following can be said:
    -									</p>
    -
    -</html><sql><![CDATA[-- This yields true
    -(DATE '2010-01-01', DATE '2010-01-03') OVERLAPS (DATE '2010-01-02' DATE '2010-01-04')
    -
    --- INTERVAL data types are also supported. This is equivalent to the above
    -(DATE '2010-01-01', CAST('+2 00:00:00' AS INTERVAL DAY TO SECOND)) OVERLAPS 
    -(DATE '2010-01-02', CAST('+2 00:00:00' AS INTERVAL DAY TO SECOND))]]></sql><html>
    -
    -									<h3>The OVERLAPS predicate in jOOQ</h3>
    -									<p>
    -									    jOOQ supports the <code>OVERLAPS</code> predicate on <reference id="row-value-expressions" title="row value expressions of degree 2"/>. The following methods are contained in <reference class="org.jooq.Row2"/>:
    -									</p>
    -
    -</html><java><![CDATA[Condition overlaps(T1 t1, T2 t2);
    -Condition overlaps(Field<T1> t1, Field<T2> t2);
    -Condition overlaps(Row2<T1, T2> row);]]></java><html>
    -
    -									<p>
    -										This allows for expressing the above predicates as such:
    -									</p>																		
    -
    -</html><java><![CDATA[// The date range tuples version
    -row(Date.valueOf('2010-01-01'), Date.valueOf('2010-01-03')).overlaps(Date.valueOf('2010-01-02'), Date.valueOf('2010-01-04'))
    -
    -// The INTERVAL tuples version
    -row(Date.valueOf('2010-01-01'), new DayToSecond(2)).overlaps(Date.valueOf('2010-01-02'), new DayToSecond(2))]]></java><html>
    -
    -									<h3>jOOQ's extensions to the standard</h3>
    -									<p>
    -										Unlike the standard (or any database implementing the standard), jOOQ also supports the <code>OVERLAPS</code> predicate for comparing arbitrary <reference id="row-value-expressions" title="row vlaue expressions of degree 2"/>. For instance, <code>(1, 3) OVERLAPS (2, 4)</code> will yield true in jOOQ. This is simulated as such
    -									</p>
    -									
    -</html><sql><![CDATA[-- This predicate
    -(A, B) OVERLAPS (C, D)
    -
    --- can be simulated as such
    -(C <= B) AND (A <= D)]]></sql></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -					<section id="plain-sql">
    -						<title>Plain SQL</title>
    -						<content><html>
    -							<p>
    -								A DSL is a nice thing to have, it feels "fluent" and "natural", especially if it models a well-known language, such as SQL. But a DSL is always expressed in a host language (Java in this case), which was not made for exactly the same purposes as its hosted DSL. If it were, then jOOQ would be implemented on a compiler-level, similar to LINQ in .NET. But it's not, and so, the DSL is limited by language constraints of its host language. We have seen many functionalities where the DSL becomes a bit verbose. This can be especially true for:
    -							</p>
    -							<ul>
    -								<li><reference id="aliased-columns" title="aliasing"/></li>
    -								<li><reference id="nested-selects" title="nested selects"/></li>
    -								<li><reference id="arithmetic-expressions" title="arithmetic expressions"/></li>
    -								<li><reference id="cast-expressions" title="casting"/></li>
    -							</ul>
    -							
    -							<p>
    -								You'll probably find other examples. If verbosity scares you off, don't worry. The verbose use-cases for jOOQ are rather rare, and when they come up, you do have an option. Just write SQL the way you're used to!
    -							</p>
    -							<p>
    -								jOOQ allows you to embed SQL as a String into any supported <reference id="sql-statements" title="statement"/> in these contexts:
    -							</p>
    -							<ul>
    -								<li>Plain SQL as a <reference id="conditional-expressions" title="conditional expression"/></li>
    -								<li>Plain SQL as a <reference id="column-expressions" title="column expression"/></li>
    -								<li>Plain SQL as a <reference id="column-expressions" title="function"/></li>
    -								<li>Plain SQL as a <reference id="table-expressions" title="table expression"/></li>
    -								<li>Plain SQL as a <reference id="query-vs-resultquery" title="query"/></li>
    -							</ul>
    -
    -							<h3>The DSL plain SQL API</h3>
    -							<p>
    -								Plain SQL API methods are usually overloaded in three ways. Let's look at the <code>condition</code> query part constructor:
    -							</p>
    -</html><java><![CDATA[// Construct a condition without bind values
    -// Example: condition("a = b")
    -Condition condition(String sql);
    -
    -// Construct a condition with bind values
    -// Example: condition("a = ?", 1);
    -Condition condition(String sql, Object... bindings);
    -
    -// Construct a condition taking other jOOQ object arguments
    -// Example: condition("a = {0}", val(1));
    -Condition condition(String sql, QueryPart... parts);]]></java><html>
    -							
    -							<p>
    -								Please refer to the <reference class="org.jooq.impl.DSL"/> Javadoc for more details. The following is a more complete listing of plain SQL construction methods from the DSL:
    -							</p>
    -
    -</html><java><![CDATA[// A condition
    -Condition condition(String sql);
    -Condition condition(String sql, Object... bindings);
    -Condition condition(String sql, QueryPart... parts);
    -
    -// A field with an unknown data type
    -Field<Object> field(String sql);
    -Field<Object> field(String sql, Object... bindings);
    -Field<Object> field(String sql, QueryPart... parts);
    -
    -// A field with a known data type
    -<T> Field<T> field(String sql, Class<T> type);
    -<T> Field<T> field(String sql, Class<T> type, Object... bindings);
    -<T> Field<T> field(String sql, Class<T> type, QueryPart... parts);
    -<T> Field<T> field(String sql, DataType<T> type);
    -<T> Field<T> field(String sql, DataType<T> type, Object... bindings);
    -<T> Field<T> field(String sql, DataType<T> type, QueryPart... parts);
    -
    -// A field with a known name (properly escaped)
    -Field<Object> fieldByName(String... fieldName);
    -<T> Field<T>  fieldByName(Class<T> type, String... fieldName);
    -<T> Field<T>  fieldByName(DataType<T> type, String... fieldName)
    -
    -// A function
    -<T> Field<T> function(String name, Class<T> type, Field<?>... arguments);
    -<T> Field<T> function(String name, DataType<T> type, Field<?>... arguments);
    -
    -// A table
    -Table<?> table(String sql);
    -Table<?> table(String sql, Object... bindings);
    -Table<?> table(String sql, QueryPart... parts);
    -
    -// A table with a known name (properly escaped)
    -Table<Record> tableByName(String... fieldName);
    -
    -// A query without results (update, insert, etc)
    -Query query(String sql);
    -Query query(String sql, Object... bindings);
    -Query query(String sql, QueryPart... parts);
    -
    -// A query with results
    -ResultQuery<Record> resultQuery(String sql);
    -ResultQuery<Record> resultQuery(String sql, Object... bindings);
    -ResultQuery<Record> resultQuery(String sql, QueryPart... parts);
    -
    -// A query with results. This is the same as resultQuery(...).fetch();
    -Result<Record> fetch(String sql);
    -Result<Record> fetch(String sql, Object... bindings);
    -Result<Record> fetch(String sql, QueryPart... parts);]]></java><html>
    -
    -							<p>
    -								Apart from the general factory methods, plain SQL is also available in various other contexts. For instance, when adding a <code>.where("a = b")</code> clause to a query. Hence, there exist several convenience methods where plain SQL can be inserted usefully. This is an example displaying all various use-cases in one single query:
    -							</p>
    -							
    -</html><java><![CDATA[// You can use your table aliases in plain SQL fields
    -// As long as that will produce syntactically correct SQL
    -Field<?> LAST_NAME    = create.field("a.LAST_NAME");
    -
    -// You can alias your plain SQL fields
    -Field<?> COUNT1       = create.field("count(*) x");
    -
    -// If you know a reasonable Java type for your field, you
    -// can also provide jOOQ with that type
    -Field<Integer> COUNT2 = create.field("count(*) y", Integer.class);
    -
    -       // Use plain SQL as select fields
    -create.select(LAST_NAME, COUNT1, COUNT2)
    -
    -       // Use plain SQL as aliased tables (be aware of syntax!)
    -      .from("author a")
    -      .join("book b")
    -
    -       // Use plain SQL for conditions both in JOIN and WHERE clauses
    -      .on("a.id = b.author_id")
    -
    -       // Bind a variable in plain SQL
    -      .where("b.title != ?", "Brida")
    -
    -       // Use plain SQL again as fields in GROUP BY and ORDER BY clauses
    -      .groupBy(LAST_NAME)
    -      .orderBy(LAST_NAME);]]></java><html>
    -
    -							<h3>Important things to note about plain SQL!</h3>
    -							<p>
    -								There are some important things to keep in mind when using plain SQL:
    -							</p>
    -							<ul>
    -								<li>jOOQ doesn't know what you're doing. You're on your own again!</li>
    -								<li>You have to provide something that will be syntactically correct. If it's not, then jOOQ won't know. Only your JDBC driver or your RDBMS will detect the syntax error.</li>
    -								<li>You have to provide consistency when you use variable binding. The number of ? must match the number of variables</li>
    -								<li>Your SQL is inserted into jOOQ queries without further checks. Hence, jOOQ can't prevent SQL injection. </li>
    -							</ul>
    -						</html></content>
    -					</section>
    -
    -					<section id="bind-values">
    -					    <title>Bind values and parameters</title>
    -						<content><html>
    -							<p>
    -								Bind values are used in SQL / JDBC for various reasons. Among the most obvious ones are:
    -							</p>
    -							<ul>
    -								<li>
    -									Protection against SQL injection. Instead of inlining values possibly originating from user input, you bind those values to your prepared statement and let the JDBC driver / database take care of handling security aspects.
    -								</li>
    -								<li>
    -									Increased speed. Advanced databases such as Oracle can keep execution plans of similar queries in a dedicated cache to prevent hard-parsing your query again and again. In many cases, the actual value of a bind variable does not influence the execution plan, hence it can be reused. Preparing a statement will thus be faster
    -								</li>
    -								<li>
    -									On a JDBC level, you can also reuse the SQL string and prepared statement object instead of constructing it again, as you can bind new values to the prepared statement. jOOQ currently does not cache prepared statements, internally.
    -								</li>
    -							</ul>
    -							
    -							<p>
    -								The following sections explain how you can introduce bind values in jOOQ, and how you can control the way they are rendered and bound to SQL.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -						    <section id="indexed-parameters">
    -							    <title>Indexed parameters</title>
    -								<content><html>
    -									<p>
    -										JDBC only knows indexed bind values. A typical example for using bind values with JDBC is this:
    -									</p>
    -									
    -</html><java><![CDATA[PreparedStatement stmt = connection.prepareStatement("SELECT * FROM BOOK WHERE ID = ? AND TITLE = ?");
    -
    -// bind values to the above statement for appropriate indexes 
    -stmt.setInt(1, 5);
    -stmt.setString(2, "Animal Farm");
    -stmm.executeQuery();]]></java><html>
    -
    -									<p>
    -										With dynamic SQL, keeping track of the number of question marks and their corresponding index may turn out to be hard. jOOQ abstracts this and lets you provide the bind value right where it is needed. A trivial example is this:
    -									</p>
    -									
    -</html><java><![CDATA[create.select().from(BOOK).where(BOOK.ID.equal(5)).and(BOOK.TITLE.equal("Animal Farm"));
    -
    -// This notation is in fact a short form for the equivalent:
    -create.select().from(BOOK).where(BOOK.ID.equal(val(5))).and(BOOK.TITLE.equal(val("Animal Farm")));]]></java><html>
    -
    -									<p>
    -										Note the using of <reference class="org.jooq.impl.DSL" anchor="#val(java.lang.Object)" title="DSL.val()"/> to explicitly create an indexed bind value. You don't have to worry about that index. When the query is <reference id="sql-rendering" title="rendered"/>, each bind value will render a question mark. When the query <reference id="variable-binding" title="binds its variables"/>, each bind value will generate the appropriate bind value index. 
    -									</p>
    -									
    -									<h3>Extract bind values from a query</h3>
    -									<p>
    -										Should you decide to run the above query outside of jOOQ, using your own <reference class="java.sql.PreparedStatement"/>, you can do so as follows:
    -									</p>
    -									
    -</html><java><![CDATA[Select<?> select = create.select().from(BOOK).where(BOOK.ID.equal(5)).and(BOOK.TITLE.equal("Animal Farm"));
    -
    -// Render the SQL statement:
    -String sql = select.getSQL();
    -assertEquals("SELECT * FROM BOOK WHERE ID = ? AND TITLE = ?", sql);
    -
    -// Get the bind values:
    -List<Object> values = select.getBindValues();
    -assertEquals(2, values.size());
    -assertEquals(5, values.get(0));
    -assertEquals("Animal Farm", values.get(1));]]></java><html>
    -
    -									<p>
    -										You can also extract specific bind values by index from a query, if you wish to modify their underlying value after creating a query. This can be achieved as such:
    -									</p>
    -
    -</html><java><![CDATA[Select<?> select = create.select().from(BOOK).where(BOOK.ID.equal(5)).and(BOOK.TITLE.equal("Animal Farm"));
    -Param<?> param = select.getParam("2");
    -
    -// You could now modify the Query's underlying bind value:
    -if ("Animal Farm".equals(param.getValue())) {
    -    param.setConverted("1984");
    -}]]></java><html>
    -
    -									<p>
    -										For more details about jOOQ's internals, see the manual's section about <reference id="queryparts" title="QueryParts"/>.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -						    <section id="named-parameters">
    -							    <title>Named parameters</title>
    -								<content><html>
    -									<p>
    -										Some SQL access abstractions that are built on top of JDBC, or some that bypass JDBC may support named parameters. jOOQ allows you to give names to your parameters as well, although those names are not rendered to SQL strings by default. Here is an example of how to create named parameters using the <reference class="org.jooq.Param"/> type:
    -									</p>
    -
    -</html><java><![CDATA[// Create a query with a named parameter. You can then use that name for accessing the parameter again
    -Query query1 = create.select().from(AUTHOR).where(LAST_NAME.equal(param("lastName", "Poe")));
    -Param<?> param1 = query.getParam("lastName");
    -
    -// Or, keep a reference to the typed parameter in order not to lose the <T> type information:
    -Param<String> param2 = param("lastName", "Poe");
    -Query query2 = create.select().from(AUTHOR).where(LAST_NAME.equal(param2));
    -
    -// You can now change the bind value directly on the Param reference:
    -param2.setValue("Orwell");]]></java><html>
    -
    -									<p>
    -										The <reference class="org.jooq.Query"/> interface also allows for setting new bind values directly, without accessing the Param type:
    -									</p>
    -
    -</html><java><![CDATA[Query query1 = create.select().from(AUTHOR).where(LAST_NAME.equal("Poe"));
    -query1.bind(1, "Orwell");
    -
    -// Or, with named parameters
    -Query query2 = create.select().from(AUTHOR).where(LAST_NAME.equal(param("lastName", "Poe")));
    -query2.bind("lastName", "Orwell");]]></java><html>
    -
    -									<p>
    -										In order to actually render named parameter names in generated SQL, use the <reference class="org.jooq.DSLContext" anchor="#renderNamedParams(org.jooq.QueryPart)" title="DSLContext.renderNamedParams()"/> method:
    -									</p>
    -
    -</html><code-pair>
    -<java><![CDATA[create.renderNamedParams(
    -    create.select()
    -          .from(AUTHOR)
    -          .where(LAST_NAME.equal(
    -                 param("lastName", "Poe"))));]]></java><sql><![CDATA[-- The named bind variable can be rendered
    -
    -SELECT *
    -FROM AUTHOR
    -WHERE LAST_NAME = :lastName]]></sql>
    -</code-pair><html>
    -								</html></content>
    -							</section>
    -
    -						    <section id="inlined-parameters">
    -							    <title>Inlined parameters</title>
    -								<content><html>
    -									<p>
    -										Sometimes, you may wish to avoid rendering bind variables while still using custom values in SQL. jOOQ refers to that as "inlined" bind values. When bind values are inlined, they render the actual value in SQL rather than a JDBC question mark. Bind value inlining can be achieved in two ways:
    -									</p>
    -									<ul>
    -										<li>
    -											By using the <reference id="custom-settings" title="Settings"/> and setting the <reference class="org.jooq.conf.StatementType"/> to STATIC_STATEMENT. This will inline all bind values for SQL statements rendered from such a Configuration.
    -										</li>
    -										<li>
    -											By using <reference class="org.jooq.impl.DSL" anchor="#inline(java.lang.Object)" title="DSL.inline()"/> methods.
    -										</li>
    -									</ul>
    -									<p>
    -										In both cases, your inlined bind values will be properly escaped to avoid SQL syntax errors and SQL injection. Some examples:
    -									</p>
    -
    -</html><java><![CDATA[
    -// Use dedicated calls to inline() in order to specify
    -// single bind values to be rendered as inline values
    -// --------------------------------------------------
    -create.select()
    -      .from(AUTHOR)
    -      .where(LAST_NAME.equal(inline("Poe")));
    -
    -// Or render the whole query with inlined values
    -// --------------------------------------------------
    -Settings settings = new Settings()
    -    .withStatementType(StatementType.STATIC_STATEMENT);
    -
    -// Add the settings to the Configuration
    -DSLContext create = DSL.using(connection, SQLDialect.ORACLE, settings);
    -
    -// Run queries that omit rendering schema names
    -create.select()
    -      .from(AUTHOR)
    -      .where(LAST_NAME.equal("Poe"));]]></java></content>
    -							</section>
    -
    -						    <section id="sql-injection-and-plain-sql-queryparts">
    -							    <title>SQL injection and plain SQL QueryParts</title>
    -								<content><html>
    -									<p>
    -										Special care needs to be taken when using <reference id="plain-sql" title="plain SQL QueryParts"/>. While jOOQ's API allows you to specify bind values for use with plain SQL, you're not forced to do that. For instance, both of the following queries will lead to the same, valid result:
    -									</p>
    -									
    -</html><java><![CDATA[// This query will use bind values, internally.
    -create.fetch("SELECT * FROM BOOK WHERE ID = ? AND TITLE = ?", 5 "Animal Farm");
    -
    -// This query will not use bind values, internally.
    -create.fetch("SELECT * FROM BOOK WHERE ID = 5 AND TITLE = 'Animal Farm'");]]></java><html>
    -
    -									<p>
    -										All methods in the jOOQ API that allow for plain (unescaped, untreated) SQL contain a warning message in their relevant Javadoc, to remind you of the risk of SQL injection in what is otherwise a SQL-injection-safe API.
    -									</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -					<section id="queryparts">
    -					    <title>QueryParts</title>
    -						<content><html>
    -							<p>
    -								A <reference class="org.jooq.Query" /> and all its contained objects is a <reference class="org.jooq.QueryPart" />. QueryParts essentially provide this functionality:
    -							</p>
    -							<ul>
    -								<li>they can <reference id="sql-rendering" title="render SQL"/> using the <reference class="org.jooq.QueryPartInternal" anchor="#toSQL(org.jooq.RenderContext)" title="toSQL(RenderContext)"/> method</li>
    -								<li>they can <reference id="variable-binding" title="bind variables"/> using the <reference class="org.jooq.QueryPartInternal" anchor="#bind(org.jooq.BindContext)" title="bind(BindContext)"/> method</li>
    -							</ul>
    -
    -							<p>
    -								Both of these methods are contained in jOOQ's internal API's <reference class="org.jooq.QueryPartInternal"/>, which is internally implemented by every QueryPart.
    -							</p>
    -
    -							<p>
    -								The following sections explain some more details about <reference id="sql-rendering" title="SQL rendering"/> and <reference id="variable-binding" title="variable binding"/>, as well as other implementation details about QueryParts in general.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -						    <section id="sql-rendering">
    -							    <title>SQL rendering</title>
    -								<content><html>
    -									<p>
    -										Every <reference class="org.jooq.QueryPart"/> must implement the <reference class="org.jooq.QueryPartInternal" anchor="#toSQL(org.jooq.RenderContext)" title="toSQL(RenderContext)"/> method to render its SQL string to a <reference class="org.jooq.RenderContext"/>. This RenderContext has two purposes:
    -									</p>
    -									<ul>
    -										<li>It provides some information about the "state" of SQL rendering.</li>
    -										<li>It provides a common API for constructing SQL strings on the context's internal <reference class="java.lang.StringBuilder"/></li>
    -									</ul>
    -									<p>
    -										An overview of the <reference class="org.jooq.RenderContext"/> API is given here:
    -									</p>
    -
    -</html><java><![CDATA[// These methods are useful for generating unique aliases within a RenderContext (and thus within a Query)
    -String peekAlias();
    -String nextAlias();
    -
    -// These methods return rendered SQL
    -String render();
    -String render(QueryPart part);
    -
    -// These methods allow for fluent appending of SQL to the RenderContext's internal StringBuilder
    -RenderContext keyword(String keyword);
    -RenderContext literal(String literal);
    -RenderContext sql(String sql);
    -RenderContext sql(char sql);
    -RenderContext sql(int sql);
    -RenderContext sql(QueryPart part);
    -
    -// These methods allow for controlling formatting of SQL, if the relevant Setting is active
    -RenderContext formatNewLine();
    -RenderContext formatSeparator();
    -RenderContext formatIndentStart();
    -RenderContext formatIndentStart(int indent);
    -RenderContext formatIndentLockStart();
    -RenderContext formatIndentEnd();
    -RenderContext formatIndentEnd(int indent);
    -RenderContext formatIndentLockEnd();
    -
    -// These methods control the RenderContext's internal state
    -boolean       inline();
    -RenderContext inline(boolean inline);
    -boolean       qualify();
    -RenderContext qualify(boolean qualify);
    -boolean       namedParams();
    -RenderContext namedParams(boolean renderNamedParams);
    -CastMode      castMode();
    -RenderContext castMode(CastMode mode);
    -Boolean       cast();
    -RenderContext castModeSome(SQLDialect... dialects);]]></java><html>
    -
    -									<p>
    -										The following additional methods are inherited from a common <reference class="org.jooq.Context"/>, which is shared among <reference class="org.jooq.RenderContext"/> and <reference class="org.jooq.BindContext"/>:
    -									</p>
    -
    -</html><java><![CDATA[// These methods indicate whether fields or tables are being declared (MY_TABLE AS MY_ALIAS) or referenced (MY_ALIAS)
    -boolean declareFields();
    -Context declareFields(boolean declareFields);
    -boolean declareTables();
    -Context declareTables(boolean declareTables);
    -
    -// These methods indicate whether a top-level query is being rendered, or a subquery
    -boolean subquery();
    -Context subquery(boolean subquery);
    -
    -// These methods provide the bind value indices within the scope of the whole Context (and thus of the whole Query)
    -int nextIndex();
    -int peekIndex();]]></java><html>
    -
    -									<h3>An example of rendering SQL</h3>
    -								   	<p>
    -								   		A simple example can be provided by checking out jOOQ's internal representation of a (simplified) <reference id="comparison-predicate" title="CompareCondition"/>. It is used for any <reference class="org.jooq.Condition"/> comparing two fields as for example the <code>AUTHOR.ID = BOOK.AUTHOR_ID</code> condition here:
    -							   		</p>
    -							   		
    -</html><sql>-- [...]
    -FROM AUTHOR
    -JOIN BOOK ON AUTHOR.ID = BOOK.AUTHOR_ID
    --- [...]</sql><html>
    -
    -									<p>
    -										This is how jOOQ renders such a condition (simplified example):
    -									</p>
    -
    -</html><java><![CDATA[@Override
    -public final void toSQL(RenderContext context) {
    -    // The CompareCondition delegates rendering of the Fields to the Fields
    -    // themselves and connects them using the Condition's comparator operator:
    -    context.sql(field1)
    -           .sql(" ")
    -           .sql(comparator.toSQL())
    -           .sql(" ")
    -           .sql(field2);
    -}]]></java><html>
    -
    -									<p>
    -										See the manual's sections about <reference id="custom-queryparts" title="custom QueryParts"/> and <reference id="plain-sql-queryparts" title="plain SQL QueryParts"/> to learn about how to write your own query parts in order to extend jOOQ.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="pretty-printing">
    -								<title>Pretty printing SQL</title>
    -								<content><html>
    -									<p>
    -										As mentioned in the previous chapter about <reference id="sql-rendering" title="SQL rendering"/>, there are some elements in the <reference class="org.jooq.RenderContext"/> that are used for formatting / pretty-printing rendered SQL. In order to obtain pretty-printed SQL, just use the following <reference id="custom-settings" title="custom settings"/>: 
    -									</p>
    -	
    -	
    -</html><java><![CDATA[// Create a DSLContext that will render "formatted" SQL
    -DSLContext pretty = DSL.using(dialect, new Settings().withRenderFormatted(true));]]></java><html>
    -
    -									<p>
    -										And then, use the above DSLContext to render pretty-printed SQL:
    -									</p>
    -									
    -</html><code-pair>
    -<java><![CDATA[String sql = pretty.select(
    -                       AUTHOR.LAST_NAME, count().as("c"))
    -                   .from(BOOK)
    -                   .join(AUTHOR)
    -                   .on(BOOK.AUTHOR_ID.equal(AUTHOR.ID))
    -                   .where(BOOK.TITLE.notEqual("1984"))
    -                   .groupBy(AUTHOR.LAST_NAME)
    -                   .having(count().equal(2))
    -                   .getSQL();]]></java><sql><![CDATA[select 
    -  "TEST"."AUTHOR"."LAST_NAME", 
    -  count(*) "c"
    -from "TEST"."BOOK"
    -  join "TEST"."AUTHOR"
    -  on "TEST"."BOOK"."AUTHOR_ID" = "TEST"."AUTHOR"."ID"
    -where "TEST"."BOOK"."TITLE" <> '1984'
    -group by "TEST"."AUTHOR"."LAST_NAME"
    -having count(*) = 2]]></sql>
    -</code-pair><html>
    -
    -									<p>
    -										The section about <reference id="execute-listeners" title="ExecuteListeners"/> shows an example of how such pretty printing can be used to log readable SQL to the stdout.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -						    <section id="variable-binding">
    -							    <title>Variable binding</title>
    -								<content><html>
    -									<p>
    -										Every <reference class="org.jooq.QueryPart"/> must implement the <reference class="org.jooq.QueryPartInternal" anchor="#bind(org.jooq.BindContext)" title="bind(BindContext)"/> method. This BindContext has two purposes:
    -									</p>
    -									<ul>
    -										<li>It provides some information about the "state" of the variable binding in process.</li>
    -										<li>It provides a common API for binding values to the context's internal <reference class="java.sql.PreparedStatement"/></li>
    -									</ul>
    -									<p>
    -										An overview of the <reference class="org.jooq.RenderContext"/> API is given here:
    -									</p>
    -
    -</html><java><![CDATA[// This method provides access to the PreparedStatement to which bind values are bound
    -PreparedStatement statement();
    -
    -// These methods provide convenience to delegate variable binding
    -BindContext bind(QueryPart part) throws DataAccessException;
    -BindContext bind(Collection<? extends QueryPart> parts) throws DataAccessException;
    -BindContext bind(QueryPart[] parts) throws DataAccessException;
    -
    -// These methods perform the actual variable binding
    -BindContext bindValue(Object value, Class<?> type) throws DataAccessException;
    -BindContext bindValues(Object... values) throws DataAccessException;]]></java><html>
    -
    -									<p>
    -										Some additional methods are inherited from a common <reference class="org.jooq.Context"/>, which is shared among <reference class="org.jooq.RenderContext"/> and <reference class="org.jooq.BindContext"/>. Details are documented in the previous chapter about <reference id="sql-rendering" title="SQL rendering"/>
    -									</p>
    -
    -									<h3>An example of binding values to SQL</h3>
    -								   	<p>
    -								   		A simple example can be provided by checking out jOOQ's internal representation of a (simplified) <reference id="comparison-predicate" title="CompareCondition"/>. It is used for any <reference class="org.jooq.Condition"/> comparing two fields as for example the <code>AUTHOR.ID = BOOK.AUTHOR_ID</code> condition here:
    -							   		</p>
    -							   		
    -</html><sql>-- [...]
    -WHERE AUTHOR.ID = ?
    --- [...]</sql><html>
    -
    -									<p>
    -										This is how jOOQ binds values on such a condition:
    -									</p>
    -</html><java><![CDATA[@Override
    -public final void bind(BindContext context) throws DataAccessException {
    -    // The CompareCondition itself does not bind any variables.
    -    // But the two fields involved in the condition might do so...
    -    context.bind(field1).bind(field2);
    -}]]></java><html>
    -
    -									<p>
    -										See the manual's sections about <reference id="custom-queryparts" title="custom QueryParts"/> and <reference id="plain-sql-queryparts" title="plain SQL QueryParts"/> to learn about how to write your own query parts in order to extend jOOQ.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -						    <section id="custom-queryparts">
    -							    <title>Extend jOOQ with custom types</title>
    -								<content><html>
    -									<p>
    -										If a SQL clause is too complex to express with jOOQ, you can extend either one of the following types for use directly in a jOOQ query:
    -									</p>
    -									
    -</html><java><![CDATA[public abstract class CustomField<T> extends AbstractField<T> {}
    -public abstract class CustomCondition extends AbstractCondition {}
    -public abstract class CustomTable<R extends TableRecord<R>> extends TableImpl<R> {}
    -public abstract class CustomRecord<R extends TableRecord<R>> extends TableRecordImpl<R> {}]]></java><html>
    -
    -									<p>
    -										These classes are declared public and covered by jOOQ's integration tests. When you extend these classes, you will have to provide your own implementations for the <reference id="queryparts" title="QueryParts'"/> <reference id="sql-rendering" title="toSQL()"/> and <reference id="variable-binding" title="bind()"/> methods, as discussed before:
    -									</p>
    -									
    -</html><java><![CDATA[// This method must produce valid SQL. If your QueryPart contains other QueryParts, you may delegate SQL generation to them
    -// in the correct order, passing the render context.
    -//
    -// If context.inline() is true, you must inline all bind variables
    -// If context.inline() is false, you must generate ? for your bind variables
    -public void toSQL(RenderContext context);
    -
    -// This method must bind all bind variables to a PreparedStatement. If your QueryPart contains other QueryParts, $
    -// you may delegate variable binding to them in the correct order, passing the bind context.
    -//
    -// Every QueryPart must ensure, that it starts binding its variables at context.nextIndex().
    -public void bind(BindContext context) throws DataAccessException;]]></java><html>
    -
    -									<p>
    -										The above contract may be a bit tricky to understand at first. The best thing is to check out jOOQ source code and have a look at a couple of QueryParts, to see how it's done. Here's an example <reference class="org.jooq.impl.CustomField"/> showing how to create a field multiplying another field by 2
    -									</p>
    -									
    -</html><java><![CDATA[// Create an anonymous CustomField, initialised with BOOK.ID arguments
    -final Field<Integer> IDx2 = new CustomField<Integer>(BOOK.ID.getName(), BOOK.ID.getDataType()) {
    -    @Override
    -    public void toSQL(RenderContext context) {
    -    
    -        // In inline mode, render the multiplication directly
    -        if (context.inline()) {
    -            context.sql(BOOK.ID).sql(" * 2");
    -        }
    -        
    -        // In non-inline mode, render a bind value
    -        else {
    -            context.sql(BOOK.ID).sql(" * ?");
    -        }
    -    }
    -
    -    @Override
    -    public void bind(BindContext context) {
    -        try {
    -        
    -            // Manually bind the value 2
    -            context.statement().setInt(context.nextIndex(), 2);
    -            
    -            // Alternatively, you could also write:
    -            // context.bind(DSL.val(2));
    -        }
    -        catch (SQLException e) {
    -            throw translate(getSQL(), e);
    -        }
    -    }
    -};
    -
    -// Use the above field in a SQL statement:
    -create.select(IDx2).from(BOOK);]]></java></content>
    -							</section>
    -							
    -						    <section id="plain-sql-queryparts">
    -							    <title>Plain SQL QueryParts</title>
    -								<content><html>
    -									<p>
    -										If you don't need the integration of rather complex QueryParts into jOOQ, then you might be safer using simple <reference id="plain-sql" title="Plain SQL"/> functionality, where you can provide jOOQ with a simple String representation of your embedded SQL. Plain SQL methods in jOOQ's API come in two flavours. 
    -									</p>
    -									<ul>
    -										<li><strong>method(String, Object...)</strong>: This is a method that accepts a SQL string and a list of bind values that are to be bound to the variables contained in the SQL string</li>
    -										<li><strong>method(String, QueryPart...)</strong>: This is a method that accepts a SQL string and a list of QueryParts that are "injected" at the position of their respective placeholders in the SQL string</li>
    -									</ul>
    -									<p>
    -										The above distinction is best explained using an example:
    -									</p>
    -									
    -</html><java><![CDATA[// Plain SQL using bind values. The value 5 is bound to the first variable, "Animal Farm" to the second variable:
    -create.selectFrom(BOOK).where("BOOK.ID = ? AND TITLE = ?", 5, "Animal Farm");
    -
    -// Plain SQL using placeholders (counting from zero). 
    -// The QueryPart "id" is substituted for the placeholder {0}, the QueryPart "title" for {1}
    -Field<Integer> id   = val(5);
    -Field<String> title = val("Animal Farm");
    -create.selectFrom(BOOK).where("BOOK.ID = {0} AND TITLE = {1}", id, title);]]></java><html>
    -
    -									<p>
    -										The above technique allows for creating rather complex SQL clauses that are currently not supported by jOOQ, without extending any of the <reference id="custom-queryparts" title="custom QueryParts"/> as indicated in the previous chapter.
    -									</p>									
    -								</html></content>
    -							</section>
    -
    -						    <section id="serializability">
    -							    <title>Serializability</title>
    -								<content><html>
    -									<p>
    -										The only transient, non-serializable element in any jOOQ object is the <reference id="dsl-context" title="Configuration's"/> underlying <reference class="java.sql.Connection"/>. When you want to execute queries after de-serialisation, or when you want to store/refresh/delete <reference id="crud-with-updatablerecords" title="Updatable Records"/>, you may have to "re-attach" them to a Configuration
    -									</p>
    -
    -</html><java><![CDATA[// Deserialise a SELECT statement
    -ObjectInputStream in = new ObjectInputStream(...);
    -Select<?> select = (Select<?>) in.readObject();
    -
    -// This will throw a DetachedException:
    -select.execute();
    -
    -// In order to execute the above select, attach it first
    -DSLContext create = DSL.using(connection, SQLDialect.ORACLE);
    -create.attach(select);]]></java><html>
    -
    -									<h3>Automatically attaching QueryParts</h3>
    -									<p>
    -										Another way of attaching QueryParts automatically, or rather providing them with a new <reference class="java.sql.Connection"/> at will, is to hook into the <reference id="execute-listeners" title="Execute Listener support"/>. More details about this can be found in the manual's chapter about <reference id="execute-listeners" title="ExecuteListeners"/>
    -									</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -					
    -					<section id="scala-sql-building">
    -						<title>SQL building in Scala</title>
    -						<content><html>
    -							<p>
    -								jOOQ-Scala is a maven module used for leveraging some advanced Scala features for those users that wish to use jOOQ with Scala.
    -							</p>
    -							
    -							<h3>Using Scala's implicit defs to allow for operator overloading</h3>
    -							<p>
    -								The most obvious Scala feature to use in jOOQ are implicit defs for implicit conversions in order to enhance the <reference class="org.jooq.Field"/> type with SQL-esque operators. 
    -							</p>
    -							<p>
    -								The following depicts a trait which wraps all fields:
    -							</p>
    -							
    -</html><scala><![CDATA[/**
    - * A Scala-esque representation of {@link org.jooq.Field}, adding overloaded
    - * operators for common jOOQ operations to arbitrary fields
    - */
    -trait SAnyField[T] extends Field[T] {
    -
    -    // String operations
    -    // -----------------
    -
    -    def ||(value : String)            : Field[String]
    -    def ||(value : Field[_])          : Field[String]
    -
    -    // Comparison predicates
    -    // ---------------------
    -
    -    def ===(value : T)                : Condition
    -    def ===(value : Field[T])         : Condition
    -
    -    def !==(value : T)                : Condition
    -    def !==(value : Field[T])         : Condition
    -
    -    def <>(value : T)                 : Condition
    -    def <>(value : Field[T])          : Condition
    -
    -    def >(value : T)                  : Condition
    -    def >(value : Field[T])           : Condition
    -
    -    def >=(value : T)                 : Condition
    -    def >=(value : Field[T])          : Condition
    -
    -    def <(value : T)                  : Condition
    -    def <(value : Field[T])           : Condition
    -
    -    def <=(value : T)                 : Condition
    -    def <=(value : Field[T])          : Condition
    -
    -    def <=>(value : T)                : Condition
    -    def <=>(value : Field[T])         : Condition
    -}]]></scala><html>
    -
    -							<p>
    -								The following depicts a trait which wraps numeric fields:
    -							</p>
    -							
    -</html><scala><![CDATA[/**
    - * A Scala-esque representation of {@link org.jooq.Field}, adding overloaded
    - * operators for common jOOQ operations to numeric fields
    - */
    -trait SNumberField[T <: Number] extends SAnyField[T] {
    -
    -    // Arithmetic operations
    -    // ---------------------
    -
    -    def unary_-                       : Field[T]
    -
    -    def +(value : Number)             : Field[T]
    -    def +(value : Field[_ <: Number]) : Field[T]
    -
    -    def -(value : Number)             : Field[T]
    -    def -(value : Field[_ <: Number]) : Field[T]
    -
    -    def *(value : Number)             : Field[T]
    -    def *(value : Field[_ <: Number]) : Field[T]
    -
    -    def /(value : Number)             : Field[T]
    -    def /(value : Field[_ <: Number]) : Field[T]
    -
    -    def %(value : Number)             : Field[T]
    -    def %(value : Field[_ <: Number]) : Field[T]
    -
    -    // Bitwise operations
    -    // ------------------
    -
    -    def unary_~                       : Field[T]
    -
    -    def &(value : T)                  : Field[T]
    -    def &(value : Field[T])           : Field[T]
    -
    -    def |(value : T)                  : Field[T]
    -    def |(value : Field[T])           : Field[T]
    -
    -    def ^(value : T)                  : Field[T]
    -    def ^(value : Field[T])           : Field[T]
    -
    -    def <<(value : T)                 : Field[T]
    -    def <<(value : Field[T])          : Field[T]
    -
    -    def >>(value : T)                 : Field[T]
    -    def >>(value : Field[T])          : Field[T]
    -}]]></scala><html>
    -
    -							<p>
    -								An example query using such overloaded operators would then look like this:
    -							</p>
    -							
    -</html><scala><![CDATA[select (
    -  T_BOOK.ID * T_BOOK.AUTHOR_ID,
    -  T_BOOK.ID + T_BOOK.AUTHOR_ID * 3 + 4,
    -  T_BOOK.TITLE || " abc" || " xy")
    -from T_BOOK
    -leftOuterJoin (
    -  select (x.ID, x.YEAR_OF_BIRTH)
    -  from x
    -  limit 1
    -  asTable x.getName()
    -)
    -on T_BOOK.AUTHOR_ID === x.ID
    -where (T_BOOK.ID <> 2)
    -or (T_BOOK.TITLE in ("O Alquimista", "Brida"))
    -fetch]]></scala><html>
    -
    -							<h3>Scala 2.10 Macros</h3>
    -							<p>
    -								This feature is still being experimented with. With Scala Macros, it might be possible to inline a true SQL dialect into the Scala syntax, backed by the jOOQ API. Stay tuned!
    -							</p>
    -						</html></content>
    -					</section>
    -				</sections>
    -			</section>
    -
    -			<section id="sql-execution">
    -				<title>SQL execution</title>
    -				<content><html>
    -					<p>
    -						In a previous section of the manual, we've seen how jOOQ can be used to <reference id="sql-building" title="build SQL"/> that can be executed with any API including JDBC or ... jOOQ. This section of the manual deals with various means of actually executing SQL with jOOQ.
    -					</p>
    -					
    -					<h3>SQL execution with JDBC</h3>
    -					<p>
    -						JDBC calls executable objects "<reference class="java.sql.Statement"/>". It distinguishes between three types of statements:
    -					</p>
    -					<ul>
    -						<li><reference class="java.sql.Statement"/>, or "static statement": This statement type is used for any arbitrary type of SQL statement. It is particularly useful with <reference id="inlined-parameters" title="inlined parameters"/></li>
    -						<li><reference class="java.sql.PreparedStatement"/>: This statement type is used for any arbitrary type of SQL statement. It is particularly useful with <reference id="indexed-parameters" title="indexed parameters"/> (note that JDBC does not support <reference id="named-parameters" title="named parameters"/>)</li>
    -						<li><reference class="java.sql.CallableStatement"/>: This statement type is used for SQL statements that are "called" rather than "executed". In particular, this includes calls to <reference id="stored-procedures" title="stored procedures"/>. Callable statements can register OUT parameters</li>
    -					</ul>
    -					<p>
    -						Today, the JDBC API may look weird to users being used to object-oriented design. While statements hide a lot of SQL dialect-specific implementation details quite well, they assume a lot of knowledge about the internal state of a statement. For instance, you can use the <reference class="java.sql.PreparedStatement" anchor="#addBatch()" title="PreparedStatement.addBatch()"/> method, to add a the prepared statement being created to an "internal list" of batch statements. Instead of returning a new type, this method forces user to reflect on the prepared statement's internal state or "mode".
    -					</p>
    -					
    -					<h3>jOOQ is wrapping JDBC</h3>
    -					<p>						
    -						These things are abstracted away by jOOQ, which exposes such concepts in a more object-oriented way. For more details about jOOQ's batch query execution, see the manual's section about <reference id="batch-execution" title="batch execution"/>.
    -					</p> 
    -					<p>
    -						The following sections of this manual will show how jOOQ is wrapping JDBC for SQL execution
    -					</p>
    -				</html></content>
    -
    -				<sections>
    -					<section id="comparison-with-jdbc">
    -						<title>Comparison between jOOQ and JDBC</title>
    -						<content><html>
    -							<h3>Similarities with JDBC</h3>
    -							<p>
    -								Even if there are <reference id="query-vs-resultquery" title="two general types of Query"/>, there are a lot of similarities between JDBC and jOOQ. Just to name a few:
    -							</p>
    -							<ul>
    -								<li>Both APIs return the number of affected records in non-result queries. JDBC: <reference class="java.sql.Statement" anchor="#executeUpdate(java.lang.String)" title="Statement.executeUpdate()"/>, jOOQ: <reference class="org.jooq.Query" anchor="#execute()" title="Query.execute()"/></li>
    -								<li>Both APIs return a scrollable result set type from result queries. JDBC: <reference class="java.sql.ResultSet"/>, jOOQ: <reference class="org.jooq.Result"/></li>
    -							</ul>
    -							
    -							<h3>Differences to JDBC</h3>
    -							<p>
    -								Some of the most important differences between JDBC and jOOQ are listed here:
    -							</p>
    -							<ul>
    -								<li><reference id="query-vs-resultquery" title="Query vs. ResultQuery"/>: JDBC does not formally distinguish between queries that can return results, and queries that cannot. The same API is used for both. This greatly reduces the possibility for <reference id="fetching" title="fetching convenience methods"/></li>
    -								<li><reference id="exception-handling" title="Exception handling"/>: While SQL uses the checked <reference class="java.sql.SQLException"/>, jOOQ wraps all exceptions in an unchecked <reference class="org.jooq.exception.DataAccessException"/></li>
    -								<li><reference class="org.jooq.Result"/>: Unlike its JDBC counter-part, this type implements <reference class="java.util.List"/> and is fully loaded into Java memory, freeing resources as early as possible. Just like statements, this means that users don't have to deal with a "weird" internal result set state.</li>
    -								<li><reference class="org.jooq.Cursor"/>: If you want more fine-grained control over how many records are fetched into memory at once, you can still do that using jOOQ's <reference id="lazy-fetching" title="lazy fetching"/> feature</li>
    -								<li><reference id="statement-type" title="Statement type"/>: jOOQ does not formally distinguish between static statements and prepared statements. By default, all statements are prepared statements in jOOQ, internally. Executing a statement as a static statement can be done simply using a <reference id="custom-settings" title="custom settings flag"/></li>
    -								<li><reference id="reusing-statements" title="Closing Statements"/>: JDBC keeps open resources even if they are already consumed. With JDBC, there is a lot of verbosity around safely closing resources. In jOOQ, resources are closed after consumption, by default. If you want to keep them open after consumption, you have to explicitly say so.</li>
    -                                <li><reference id="jdbc-flags" title="JDBC flags"/>: JDBC execution flags and modes are not modified. They can be set fluently on a <reference id="query-vs-resultquery" title="Query"/></li>
    -							</ul>
    -						</html></content>
    -					</section>
    -				    
    -				    <section id="query-vs-resultquery">
    -						<title>Query vs. ResultQuery</title>
    -						<content><html>
    -							<p>
    -								Unlike JDBC, jOOQ has a lot of knowledge about a SQL query's structure and internals (see the manual's section about <reference id="sql-building" title="SQL building"/>). Hence, jOOQ distinguishes between these two fundamental types of queries. While every <reference class="org.jooq.Query"/> can be executed, only <reference class="org.jooq.ResultQuery"/> can return results (see the manual's section about <reference id="fetching" title="fetching"/> to learn more about fetching results). With plain SQL, the distinction can be made clear most easily:
    -							</p>
    -							
    -</html><java><![CDATA[// Create a Query object and execute it:
    -Query query = create.query("DELETE FROM BOOK");
    -query.execute();
    -
    -// Create a ResultQuery object and execute it, fetching results:
    -ResultQuery<Record> resultQuery = create.resultQuery("SELECT * FROM BOOK");
    -Result<Record> resultQuery.fetch();]]></java></content>
    -					</section>
    -
    -				    <section id="fetching">
    -						<title>Fetching</title>
    -						<content><html>
    -							<p>
    -								Fetching is something that has been completely neglegted by JDBC and also by various other database abstraction libraries. Fetching is much more than just looping or listing records or mapped objects. There are so many ways you may want to fetch data from a database, it should be considered a first-class feature of any database abstraction API. Just to name a few, here are some of jOOQ's fetching modes:
    -							</p>
    -							<ul>
    -								<li><reference id="record-vs-tablerecord" title="Untyped vs. typed fetching"/>: Sometimes you care about the returned type of your records, sometimes (with arbitrary projections) you don't.</li>
    -								<li><reference id="arrays-maps-and-lists" title="Fetching arrays, maps, or lists"/>: Instead of letting you transform your result sets into any more suitable data type, a library should do that work for you.</li>
    -								<li><reference id="recordhandler" title="Fetching through handler callbacks"/>: This is an entirely different fetching paradigm. With Java 8's lambda expressions, this will become even more powerful.</li>
    -								<li><reference id="recordmapper" title="Fetching through mapper callbacks"/>: This is an entirely different fetching paradigm. With Java 8's lambda expressions, this will become even more powerful.</li>
    -								<li><reference id="pojos" title="Fetching custom POJOs"/>: This is what made Hibernate and JPA so strong. Automatic mapping of tables to custom POJOs.</li>
    -								<li><reference id="lazy-fetching" title="Lazy vs. eager fetching"/>: It should be easy to distinguish these two fetch modes.</li>
    -								<li><reference id="many-fetching" title="Fetching many results"/>: Some databases allow for returning many result sets from a single query. JDBC can handle this but it's very verbose. A list of results should be returned instead.</li>
    -								<li><reference id="later-fetching" title="Fetching data asynchronously"/>: Some queries take too long to execute to wait for their results. You should be able to spawn query execution in a separate process.</li>
    -							</ul>
    -							
    -							<h3>Convenience and how ResultQuery, Result, and Record share API</h3>
    -							<p>
    -								The term "fetch" is always reused in jOOQ when you can fetch data from the database. An <reference class="org.jooq.ResultQuery"/> provides many overloaded means of fetching data:
    -							</p>
    -							
    -							<h3>Various modes of fetching</h3>
    -							<p>
    -								These modes of fetching are also documented in subsequent sections of the manual
    -							</p>
    -							
    -</html><java><![CDATA[// The "standard" fetch
    -Result<R> fetch();    
    -
    -// The "standard" fetch when you know your query returns only one record
    -R fetchOne();
    -
    -// The "standard" fetch when you only want to fetch the first record
    -R fetchAny();
    -
    -// Create a "lazy" Cursor, that keeps an open underlying JDBC ResultSet
    -Cursor<R> fetchLazy();
    -Cursor<R> fetchLazy(int fetchSize);
    -
    -// Create a java.util.concurrent.Future, to handle asynchronous execution of the ResultQuery
    -FutureResult<R> fetchLater();
    -FutureResult<R> fetchLater(ExecutorService executor);
    -
    -// Fetch several results at once
    -List<Result<Record>> fetchMany();
    -
    -// Fetch records into a custom callback
    -<H extends RecordHandler<R>> H fetchInto(H handler);
    -
    -// Map records using a custom callback
    -<E> List<E> fetch(RecordMapper<? super R, E> mapper);
    -
    -// Execute a ResultQuery with jOOQ, but return a JDBC ResultSet, not a jOOQ object
    -ResultSet fetchResultSet();]]></java><html>
    -							
    -							<h3>Fetch convenience</h3>
    -							<p>
    -								These means of fetching are also available from <reference class="org.jooq.Result"/> and <reference class="org.jooq.Record"/> APIs
    -							</p>
    -
    -</html><java><![CDATA[// These methods are convenience for fetching only a single field, 
    -// possibly converting results to another type
    -<T>    List<T> fetch(Field<T> field);
    -<T>    List<T> fetch(Field<?> field, Class<? extends T> type);
    -<T, U> List<U> fetch(Field<T> field, Converter<? super T, U> converter);
    -       List<?> fetch(int fieldIndex);
    -<T>    List<T> fetch(int fieldIndex, Class<? extends T> type);
    -<U>    List<U> fetch(int fieldIndex, Converter<?, U> converter);
    -       List<?> fetch(String fieldName);
    -<T>    List<T> fetch(String fieldName, Class<? extends T> type);
    -<U>    List<U> fetch(String fieldName, Converter<?, U> converter);
    -
    -// These methods are convenience for fetching only a single field, possibly converting results to another type
    -// Instead of returning lists, these return arrays
    -<T>    T[]      fetchArray(Field<T> field);
    -<T>    T[]      fetchArray(Field<?> field, Class<? extends T> type);
    -<T, U> U[]      fetchArray(Field<T> field, Converter<? super T, U> converter);
    -       Object[] fetchArray(int fieldIndex);
    -<T>    T[]      fetchArray(int fieldIndex, Class<? extends T> type);
    -<U>    U[]      fetchArray(int fieldIndex, Converter<?, U> converter);
    -       Object[] fetchArray(String fieldName);
    -<T>    T[]      fetchArray(String fieldName, Class<? extends T> type);
    -<U>    U[]      fetchArray(String fieldName, Converter<?, U> converter);
    -
    -// These methods are convenience for fetching only a single field from a single record, 
    -// possibly converting results to another type
    -<T>    T      fetchOne(Field<T> field);
    -<T>    T      fetchOne(Field<?> field, Class<? extends T> type);
    -<T, U> U      fetchOne(Field<T> field, Converter<? super T, U> converter);
    -       Object fetchOne(int fieldIndex);
    -<T>    T      fetchOne(int fieldIndex, Class<? extends T> type);
    -<U>    U      fetchOne(int fieldIndex, Converter<?, U> converter);
    -       Object fetchOne(String fieldName);
    -<T>    T      fetchOne(String fieldName, Class<? extends T> type);
    -<U>    U      fetchOne(String fieldName, Converter<?, U> converter);]]></java><html>
    -
    -							<h3>Fetch transformations</h3>
    -							<p>
    -								These means of fetching are also available from <reference class="org.jooq.Result"/> and <reference class="org.jooq.Record"/> APIs
    -							</p>
    -							
    -</html><java><![CDATA[// Transform your Records into arrays, Results into matrices
    -       Object[][] fetchArrays();
    -       Object[]   fetchOneArray();
    -       
    -// Reduce your Result object into maps
    -<K>    Map<K, R>      fetchMap(Field<K> key);
    -<K, V> Map<K, V>      fetchMap(Field<K> key, Field<V> value);
    -<K, E> Map<K, E>      fetchMap(Field<K> key, Class<E> value);
    -       Map<Record, R> fetchMap(Field<?>[] key);
    -<E>    Map<Record, E> fetchMap(Field<?>[] key, Class<E> value);       
    -
    -// Transform your Result object into maps
    -       List<Map<String, Object>> fetchMaps();
    -       Map<String, Object>       fetchOneMap();
    -
    -// Transform your Result object into groups
    -<K>    Map<K, Result<R>>      fetchGroups(Field<K> key);
    -<K, V> Map<K, List<V>>        fetchGroups(Field<K> key, Field<V> value);
    -<K, E> Map<K, List<E>>        fetchGroups(Field<K> key, Class<E> value);
    -       Map<Record, Result<R>> fetchGroups(Field<?>[] key);
    -<E>    Map<Record, List<E>>   fetchGroups(Field<?>[] key, Class<E> value);
    -
    -// Transform your Records into custom POJOs
    -<E>    List<E> fetchInto(Class<? extends E> type);
    -
    -// Transform your records into another table type
    -<Z extends Record> Result<Z> fetchInto(Table<Z> table);]]></java><html>
    -
    -							<p>
    -								Note, that apart from the <reference class="org.jooq.ResultQuery" anchor="#fetchLazy()" title="fetchLazy()"/> methods, all fetch() methods will immediately close underlying JDBC result sets.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="record-vs-tablerecord">
    -								<title>Record vs. TableRecord</title>
    -								<content><html>
    -									<p>
    -										jOOQ understands that SQL is much more expressive than Java, when it comes to the declarative typing of <reference id="table-expressions" title="table expressions"/>. As a declarative language, SQL allows for creating ad-hoc row value expressions (records with indexed columns, or tuples) and records (records with named columns). In Java, this is not possible to the same extent. Yet, still, sometimes you wish to use strongly typed records, when you know that you're selecting only from a single table
    -									</p>
    -									
    -									<h3>Fetching strongly or weakly typed records</h3>
    -									<p>
    -										When fetching data only from a single table, the <reference id="table-expressions" title="table expression's"/> type is known to jOOQ if you use jOOQ's <reference id="code-generation" title="code generator"/> to generate <reference id="codegen-records" title="TableRecords"/> for your database tables. In order to fetch such strongly typed records, you will have to use the <reference id="select-statement" title="simple select API"/>:
    -									</p>
    -
    -</html><java><![CDATA[// Use the selectFrom() method:
    -BookRecord book = create.selectFrom(BOOK).where(BOOK.ID.equal(1)).fetchOne();
    -
    -// Typesafe field access is now possible:
    -System.out.println("Title       : " + book.getTitle());
    -System.out.println("Published in: " + book.getPublishedIn());]]></java><html>
    -									
    -									<p>
    -										When you use the <reference class="org.jooq.DSLContext" anchor="#selectFrom(org.jooq.Table)" title="DSLContext.selectFrom()"/> method, jOOQ will return the record type supplied with the argument table. Beware though, that you will no longer be able to use any clause that modifies the type of your <reference id="table-expressions" title="table expression"/>. This includes: 
    -									</p>
    -									<ul>
    -                   						<li><reference id="select-clause" title="The SELECT clause"/></li>
    -                   						<li><reference id="join-clause" title="The JOIN clause"/></li>
    -                   					</ul>		
    -								</html></content>
    -							</section>
    -
    -							<section id="record-n">
    -								<title>Record1 to Record{max-row-degree}</title>
    -								<content><html>
    -									<p>
    -										jOOQ's <reference id="row-value-expressions" title="row value expression (or tuple)"/> support has been explained earlier in this manual. It is useful for constructing row value expressions where they can be used in SQL. The same typesafety is also applied to records for degrees up to {max-row-degree}. To express this fact, <reference class="org.jooq.Record"/> is extended by <reference class="org.jooq.Record1"/> to <reference class="org.jooq.Record{max-row-degree}"/>. Apart from the fact that these extensions of the R type can be used throughout the <reference id="dsl-and-non-dsl" title="jOOQ DSL"/>, they also provide a useful API. Here is <reference class="org.jooq.Record2"/>, for instance: 
    -									</p>
    -
    -</html><java><![CDATA[public interface Record2<T1, T2> extends Record {
    -
    -    // Access fields and values as row value expressions
    -    Row2<T1, T2> fieldsRow();
    -    Row2<T1, T2> valuesRow();
    -
    -    // Access fields by index
    -    Field<T1> field1();
    -    Field<T2> field2();
    -
    -    // Access values by index
    -    T1 value1();
    -    T2 value2();
    -}]]></java><html>
    -
    -									<h3>Higher-degree records</h3>
    -									<p>
    -										jOOQ chose to explicitly support degrees up to {max-row-degree} to match Scala's typesafe tuple, function and product support. Unlike Scala, however, jOOQ also supports higher degrees without the additional typesafety. 
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="arrays-maps-and-lists">
    -								<title>Arrays, Maps and Lists</title>
    -								<content><html>
    -									<p>
    -										By default, jOOQ returns an <reference class="org.jooq.Result"/> object, which is essentially a <reference class="java.util.List"/> of <reference class="org.jooq.Record"/>. Often, you will find yourself wanting to transform this result object into a type that corresponds more to your specific needs. Or you just want to list all values of one specific column. Here are some examples to illustrate those use cases:
    -									</p>
    -									
    -</html><java><![CDATA[// Fetching only book titles (the two calls are equivalent):
    -List<String> titles1 = create.select().from(BOOK).fetch().getValues(BOOK.TITLE);
    -List<String> titles2 = create.select().from(BOOK).fetch(BOOK.TITLE);
    -String[]     titles3 = create.select().from(BOOK).fetchArray(BOOK.TITLE);
    -
    -// Fetching only book IDs, converted to Long
    -List<Long> ids1 = create.select().from(BOOK).fetch().getValues(BOOK.ID, Long.class);
    -List<Long> ids2 = create.select().from(BOOK).fetch(BOOK.ID, Long.class);
    -Long[]     ids3 = create.select().from(BOOK).fetchArray(BOOK.ID, Long.class);
    -
    -// Fetching book IDs and mapping each ID to their records or titles
    -Map<Integer, BookRecord> map1 = create.selectFrom(BOOK).fetch().intoMap(BOOK.ID);
    -Map<Integer, BookRecord> map2 = create.selectFrom(BOOK).fetchMap(BOOK.ID);
    -Map<Integer, String>     map3 = create.selectFrom(BOOK).fetch().intoMap(BOOK.ID, BOOK.TITLE);
    -Map<Integer, String>     map4 = create.selectFrom(BOOK).fetchMap(BOOK.ID, BOOK.TITLE);
    -
    -// Group by AUTHOR_ID and list all books written by any author:       
    -Map<Integer, Result<BookRecord>> group1 = create.selectFrom(BOOK).fetch().intoGroups(BOOK.AUTHOR_ID);
    -Map<Integer, Result<BookRecord>> group2 = create.selectFrom(BOOK).fetchGroups(BOOK.AUTHOR_ID);
    -Map<Integer, List<String>>       group3 = create.selectFrom(BOOK).fetch().intoGroups(BOOK.AUTHOR_ID, BOOK.TITLE);
    -Map<Integer, List<String>>       group4 = create.selectFrom(BOOK).fetchGroups(BOOK.AUTHOR_ID, BOOK.TITLE);]]></java><html>									
    -
    -									<p>
    -										Note that most of these convenience methods are available both through <reference class="org.jooq.ResultQuery"/> and <reference class="org.jooq.Result"/>, some are even available through <reference class="org.jooq.Record"/> as well.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="recordhandler">
    -								<title>RecordHandler</title>
    -								<content><html>
    -									<p>
    -										In a more functional operating mode, you might want to write callbacks that receive records from your select statement results in order to do some processing. This is a common data access pattern in Spring's JdbcTemplate, and it is also available in jOOQ. With jOOQ, you can implement your own <reference class="org.jooq.RecordHandler"/> classes and plug them into jOOQ's <reference class="org.jooq.ResultQuery"/>:
    -									</p>
    -									
    -</html><java><![CDATA[// Write callbacks to receive records from select statements
    -create.selectFrom(BOOK)
    -      .orderBy(BOOK.ID)
    -      .fetch()
    -      .into(new RecordHandler<BookRecord>() {
    -          @Override
    -          public void next(BookRecord book) {
    -              Util.doThingsWithBook(book);
    -          }
    -      });
    -      
    -// Or more concisely
    -create.selectFrom(BOOK)
    -      .orderBy(BOOK.ID)
    -      .fetchInto(new RecordHandler<BookRecord>() {...});
    -      
    -// Or even more concisely with Java 8's lambda expressions:
    -create.selectFrom(BOOK)
    -      .orderBy(BOOK.ID)
    -      .fetchInto(book -> { Util.doThingsWithBook(book); }; );
    -]]></java><html>
    -
    -									<p>
    -										See also the manual's section about the <reference id="recordmapper" title="RecordMapper"/>, which provides similar features
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="recordmapper">
    -								<title>RecordMapper</title>
    -								<content><html>
    -									<p>
    -										In a more functional operating mode, you might want to write callbacks that map records from your select statement results in order to do some processing. This is a common data access pattern in Spring's JdbcTemplate, and it is also available in jOOQ. With jOOQ, you can implement your own <reference class="org.jooq.RecordMapper"/> classes and plug them into jOOQ's <reference class="org.jooq.ResultQuery"/>:
    -									</p>
    -									
    -</html><java><![CDATA[// Write callbacks to receive records from select statements
    -List<Integer> ids =
    -create.selectFrom(BOOK)
    -      .orderBy(BOOK.ID)
    -      .fetch()
    -      .map(new RecordMapper<BookRecord, Integer>() {
    -          @Override
    -          public Integer map(BookRecord book) {
    -              return book.getId();
    -          }
    -      });
    -      
    -// Or more concisely
    -create.selectFrom(BOOK)
    -      .orderBy(BOOK.ID)
    -      .fetch(new RecordMapper<BookRecord, Integer>() {...});
    -      
    -// Or even more concisely with Java 8's lambda expressions:
    -create.selectFrom(BOOK)
    -      .orderBy(BOOK.ID)
    -      .fetch(book -> book.getId());
    -]]></java><html>
    -
    -                                    <p>
    -                                        Your custom <code>RecordMapper</code> types can be used automatically through jOOQ's <reference id="pojos" title="POJO mapping APIs"/>, by injecting a <reference id="pojos-with-recordmapper-provider" title="RecordMapperProvider"/> into your <reference id="dsl-context" title="Configuration"/>. 
    -                                    </p>
    -
    -									<p>
    -										See also the manual's section about the <reference id="recordhandler" title="RecordHandler"/>, which provides similar features
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="pojos">
    -								<title>POJOs</title>
    -								<content><html>
    -									<p>
    -										Fetching data in records is fine as long as your application is not really layered, or as long as you're still writing code in the DAO layer. But if you have a more advanced application architecture, you may not want to allow for jOOQ artefacts to leak into other layers. You may choose to write POJOs (Plain Old Java Objects) as your primary DTOs (Data Transfer Objects), without any dependencies on jOOQ's <reference class="org.jooq.Record"/> types, which may even potentially hold a reference to a <reference id="dsl-context" title="Configuration"/>, and thus a JDBC <reference class="java.sql.Connection"/>. Like Hibernate/JPA, jOOQ allows you to operate with POJOs. Unlike Hibernate/JPA, jOOQ does not "attach" those POJOs or create proxies with any magic in them.
    -									</p>
    -									<p>
    -										If you're using jOOQ's <reference id="code-generation" title="code generator"/>, you can configure it to <reference id="codegen-pojos" title="generate POJOs"/> for you, but you're not required to use those generated POJOs. You can use your own. See the manual's section about <reference id="pojos-with-recordmapper-provider" title="POJOs with custom RecordMappers"/> to see how to modify jOOQ's standard POJO mapping behaviour.
    -									</p>
    -									
    -									<h3>Using JPA-annotated POJOs</h3>									
    -									<p>
    -										jOOQ tries to find JPA annotations on your POJO types. If it finds any, they are used as the primary source for mapping meta-information. Only the <reference class="javax.persistence.Column"/> annotation is used and understood by jOOQ. An example:
    -									</p>
    -
    -</html><java><![CDATA[// A JPA-annotated POJO class
    -public class MyBook {
    -  @Column(name = "ID")
    -  public int myId;
    -  
    -  @Column(name = "TITLE")
    -  public String myTitle;
    -}
    -
    -// The various "into()" methods allow for fetching records into your custom POJOs:
    -MyBook myBook        = create.select().from(BOOK).fetchAny().into(MyBook.class); 
    -List<MyBook> myBooks = create.select().from(BOOK).fetch().into(MyBook.class);
    -List<MyBook> myBooks = create.select().from(BOOK).fetchInto(MyBook.class);]]></java><html>									
    -									
    -									<p>
    -										Just as with any other JPA implementation, you can put the <reference class="javax.persistence.Column"/> annotation on any class member, including attributes, setters and getters. Please refer to the <reference class="org.jooq.Record" anchor="#into(java.lang.Class)" title="Record.into()"/> Javadoc for more details.
    -									</p>
    -									
    -									<h3>Using simple POJOs</h3>
    -									<p>
    -										If jOOQ does not find any JPA-annotations, columns are mapped to the "best-matching" constructor, attribute or setter. An example illustrates this:
    -									</p>
    -									
    -</html><java><![CDATA[// A "mutable" POJO class
    -public class MyBook1 {
    -  public int id;
    -  public String title;
    -}
    -
    -// The various "into()" methods allow for fetching records into your custom POJOs:
    -MyBook1 myBook        = create.select().from(BOOK).fetchAny().into(MyBook1.class); 
    -List<MyBook1> myBooks = create.select().from(BOOK).fetch().into(MyBook1.class);
    -List<MyBook1> myBooks = create.select().from(BOOK).fetchInto(MyBook1.class);]]></java><html>	
    -
    -									<p>
    -										Please refer to the <reference class="org.jooq.Record" anchor="#into(java.lang.Class)" title="Record.into()"/> Javadoc for more details.
    -									</p>
    -									
    -									<h3>Using "immutable" POJOs</h3>
    -									<p>
    -										If jOOQ does not find any default constructor, columns are mapped to the "best-matching" constructor. This allows for using "immutable" POJOs with jOOQ. An example illustrates this:
    -									</p>
    -									
    -</html><java><![CDATA[// An "immutable" POJO class
    -public class MyBook2 {
    -  public final int id;
    -  public final String title;
    -  
    -  public MyBook2(int id, String title) {
    -    this.id = id;
    -    this.title = title;
    -  }
    -}
    -
    -// With "immutable" POJO classes, there must be an exact match between projected fields and available constructors:
    -MyBook2 myBook        = create.select(BOOK.ID, BOOK.TITLE).from(BOOK).fetchAny().into(MyBook2.class); 
    -List<MyBook2> myBooks = create.select(BOOK.ID, BOOK.TITLE).from(BOOK).fetch().into(MyBook2.class);
    -List<MyBook2> myBooks = create.select(BOOK.ID, BOOK.TITLE).from(BOOK).fetchInto(MyBook2.class);
    -
    -// An "immutable" POJO class with a java.beans.ConstructorProperties annotation
    -public class MyBook3 {
    -  public final String title;
    -  public final int id;
    -  
    -  @ConstructorProperties({ "title", "id"})
    -  public MyBook2(String title, int id) {
    -    this.title = title;
    -    this.id = id;
    -  }
    -}
    -
    -// With annotated "immutable" POJO classes, there doesn't need to be an exact match between fields and constructor arguments.
    -// In the below cases, only BOOK.ID is really set onto the POJO, BOOK.TITLE remains null and BOOK.AUTHOR_ID is ignored
    -MyBook3 myBook        = create.select(BOOK.ID, BOOK.AUTHOR_ID).from(BOOK).fetchAny().into(MyBook3.class); 
    -List<MyBook3> myBooks = create.select(BOOK.ID, BOOK.AUTHOR_ID).from(BOOK).fetch().into(MyBook3.class);
    -List<MyBook3> myBooks = create.select(BOOK.ID, BOOK.AUTHOR_ID).from(BOOK).fetchInto(MyBook3.class);
    -]]></java><html>	
    -									
    -									<p>
    -										Please refer to the <reference class="org.jooq.Record" anchor="#into(java.lang.Class)" title="Record.into()"/> Javadoc for more details.
    -									</p>
    -
    -									<h3>Using proxyable types</h3>
    -									<p>
    -										jOOQ also allows for fetching data into abstract classes or interfaces, or in other words, "proxyable" types. This means that jOOQ will return a <reference class="java.util.HashMap"/> wrapped in a <reference class="java.lang.reflect.Proxy"/> implementing your custom type. An example of this is given here:
    -									</p>
    -									
    -</html><java><![CDATA[// A "proxyable" type
    -public interface MyBook3 {
    -  int getId(); 
    -  void setId(int id);
    -  
    -  String getTitle();
    -  void setTitle(String title);
    -}
    -
    -// The various "into()" methods allow for fetching records into your custom POJOs:
    -MyBook3 myBook        = create.select(BOOK.ID, BOOK.TITLE).from(BOOK).fetchAny().into(MyBook3.class); 
    -List<MyBook3> myBooks = create.select(BOOK.ID, BOOK.TITLE).from(BOOK).fetch().into(MyBook3.class);
    -List<MyBook3> myBooks = create.select(BOOK.ID, BOOK.TITLE).from(BOOK).fetchInto(MyBook3.class);]]></java><html>									
    -
    -									<p>
    -										Please refer to the <reference class="org.jooq.Record" anchor="#into(java.lang.Class)" title="Record.into()"/> Javadoc for more details.
    -									</p>
    -
    -									<h3>Loading POJOs back into Records to store them</h3>
    -									<p>
    -										The above examples show how to fetch data into your own custom POJOs / DTOs. When you have modified the data contained in POJOs, you probably want to store those modifications back to the database. An example of this is given here:
    -									</p>
    -
    -</html><java><![CDATA[// A "mutable" POJO class
    -public class MyBook {
    -  public int id;
    -  public String title;
    -}
    -
    -// Create a new POJO instance
    -MyBook myBook = new MyBook();
    -myBook.id = 10;
    -myBook.title = "Animal Farm";
    -
    -// Load a jOOQ-generated BookRecord from your POJO
    -BookRecord book = create.newRecord(BOOK, myBook); 
    -
    -// Insert it (implicitly)
    -book.store();
    -
    -// Insert it (explicitly)
    -create.executeInsert(book);
    -
    -// or update it (ID = 10)
    -create.executeUpdate(book);]]></java><html>
    -							
    -									<p>
    -										Note: Because of your manual setting of ID = 10, jOOQ's store() method will asume that you want to insert a new record. See the manual's section about <reference id="crud-with-updatablerecords" title="CRUD with UpdatableRecords"/> for more details on this.
    -									</p>
    -											
    -									<h3>Interaction with DAOs</h3>
    -									<p>
    -										If you're using jOOQ's <reference id="code-generation" title="code generator"/>, you can configure it to <reference id="codegen-daos" title="generate DAOs"/> for you. Those DAOs operate on <reference id="codegen-pojos" title="generated POJOs"/>. An example of using such a DAO is given here:
    -									</p>
    -
    -</html><java><![CDATA[// Initialise a Configuration
    -Configuration configuration = new DefaultConfiguration().set(connection).set(SQLDialect.ORACLE);
    -
    -// Initialise the DAO with the Configuration
    -BookDao bookDao = new BookDao(configuration);
    -
    -// Start using the DAO
    -Book book = bookDao.findById(5);
    -
    -// Modify and update the POJO
    -book.setTitle("1984");
    -book.setPublishedIn(1948);
    -bookDao.update(book);
    -
    -// Delete it again
    -bookDao.delete(book);]]></java><html>
    -									
    -									<h3>More complex data structures</h3>
    -									<p>
    -										jOOQ currently doesn't support more complex data structures, the way Hibernate/JPA attempt to map relational data onto POJOs. While future developments in this direction are not excluded, jOOQ claims that generic mapping strategies lead to an enormous additional complexity that only serves very few use cases. You are likely to find a solution using any of jOOQ's various <reference id="fetching" title="fetching modes"/>, with only little boiler-plate code on the client side.
    -									</p>
    -								</html></content>
    -							</section>
    -                            
    -                            <section id="pojos-with-recordmapper-provider">
    -                                <title>POJOs with RecordMappers</title>
    -                                <content><html>
    -                                    <p>
    -                                        In the previous sections we have seen how to create <reference id="recordmapper" title="RecordMapper"/> types to map jOOQ records onto arbitrary objects. We have also seen how jOOQ provides default algorithms to map jOOQ records onto <reference id="pojos" title="POJOs"/>. Your own custom domain model might be much more complex, but you want to avoid looking up the most appropriate <code>RecordMapper</code> every time you need one. For this, you can provide jOOQ's <reference id="dsl-context" title="Configuration"/> with your own implementation of the <reference class="org.jooq.RecordMapperProvider"/> interface. An example is given here:
    -                                    </p>
    -                                    
    -</html><java><![CDATA[DSL.using(new DefaultConfiguration()
    -   .set(connection)
    -   .set(SQLDialect.ORACLE)
    -   .set(
    -       new RecordMapperProvider() {
    -           @Override
    -           public <R extends Record, E> RecordMapper<R, E> provide(RecordType<R> recordType, Class<? extends E> type) {
    -
    -               // UUID mappers will always try to find the ID column
    -               if (type == UUID.class) {
    -                   return new RecordMapper<R, E>() {
    -                       @Override
    -                       public E map(R record) {
    -                           return (E) record.getValue("ID");
    -                       }
    -                   }
    -               }
    -               
    -               // Books might be joined with their authors, create a 1:1 mapping
    -               if (type == Book.class) {
    -                   return new BookMapper();
    -               }
    -
    -               // Fall back to jOOQ's DefaultRecordMapper, which maps records onto
    -               // POJOs using reflection.
    -               return new DefaultRecordMapper(recordType, type);     
    -           }
    -       }
    -   ))
    -   .selectFrom(BOOK)
    -   .orderBy(BOOK.ID)
    -   .fetchInto(UUID.class);]]></java><html>
    -
    -                                    <p>
    -                                        The above is a very simple example showing that you will have complete flexibility in how to override jOOQ's record to POJO mapping mechanisms.
    -                                    </p>
    -                                    
    -                                    <p>
    -                                        If you're looking into a generic, third-party mapping utility, have a look at <a href="http://modelmapper.org">ModelMapper</a>, or <a href="http://orika-mapper.github.io/orika-docs">Orika Mapper</a>, which can both be easily integrated with jOOQ.
    -                                    </p>
    -                                </html></content>
    -                            </section>
    -
    -							<section id="lazy-fetching">
    -								<title>Lazy fetching</title>
    -								<content><html>
    -									<p>
    -										Unlike JDBC's <reference class="java.sql.ResultSet"/>, jOOQ's <reference class="org.jooq.Result"/> does not represent an open database cursor with various fetch modes and scroll modes, that needs to be closed after usage. jOOQ's results are simple in-memory Java <reference class="java.util.List"/> objects, containing all of the result values. If your result sets are large, or if you have a lot of network latency, you may wish to fetch records one-by-one, or in small chunks. jOOQ supports a <reference class="org.jooq.Cursor"/> type for that purpose. In order to obtain such a reference, use the <reference class="org.jooq.ResultQuery" anchor="#fetchLazy()" title="ResultQuery.fetchLazy()"/> method. An example is given here:
    -									</p>
    -									
    -</html><java><![CDATA[// Obtain a Cursor reference:
    -Cursor<BookRecord> cursor = null;
    -
    -try {
    -    cursor = create.selectFrom(BOOK).fetchLazy();
    -
    -    // Cursor has similar methods as Iterator<R>
    -    while (cursor.hasNext()) {
    -        BookRecord book = cursor.fetchOne();
    -        
    -        Util.doThingsWithBook(book);
    -    }
    -}
    -
    -// Close the cursor and the cursor's underlying JDBC ResultSet
    -finally {
    -    if (cursor != null) {
    -        cursor.close();
    -    }
    -}]]></java><html>
    -
    -									<p>
    -										As a <reference class="org.jooq.Cursor"/> holds an internal reference to an open <reference class="java.sql.ResultSet"/>, it may need to be closed at the end of iteration. If a cursor is completely scrolled through, it will conveniently close the underlying ResultSet. However, you should not rely on that.
    -									</p>
    -									
    -									<h3>Cursors ship with all the other fetch features</h3>
    -									<p>
    -										Like <reference class="org.jooq.ResultQuery"/> or <reference class="org.jooq.Result"/>, <reference class="org.jooq.Cursor"/> gives access to all of the other fetch features that we've seen so far, i.e.
    -									</p>
    -									<ul>
    -										<li><reference id="record-vs-tablerecord" title="Strongly or weakly typed records"/>: Cursors are also typed with the &lt;R&gt; type, allowing to fetch custom, generated <reference class="org.jooq.TableRecord"/> or plain <reference class="org.jooq.Record"/> types.</li>
    -										<li><reference id="recordhandler" title="RecordHandler callbacks"/>: You can use your own <reference class="org.jooq.RecordHandler"/> callbacks to receive lazily fetched records.</li>
    -										<li><reference id="recordmapper" title="RecordMapper callbacks"/>: You can use your own <reference class="org.jooq.RecordMapper"/> callbacks to map lazily fetched records.</li>
    -										<li><reference id="pojos" title="POJOs"/>: You can fetch data into your own custom POJO types.</li>
    -									</ul>
    -								</html></content>
    -							</section>
    -
    -							<section id="many-fetching">
    -								<title>Many fetching</title>
    -								<content><html>
    -									<p>
    -										Many databases support returning several result sets, or cursors, from single queries. An example for this is Sybase ASE's sp_help command:
    -									</p>
    -</html><text><![CDATA[> sp_help 'author'
    -
    -+--------+-----+-----------+-------------+-------------------+
    -|Name    |Owner|Object_type|Object_status|Create_date        |
    -+--------+-----+-----------+-------------+-------------------+
    -|  author|dbo  |user table | -- none --  |Sep 22 2011 11:20PM|
    -+--------+-----+-----------+-------------+-------------------+
    -
    -+-------------+-------+------+----+-----+-----+
    -|Column_name  |Type   |Length|Prec|Scale|...  |
    -+-------------+-------+------+----+-----+-----+
    -|id           |int    |     4|NULL| NULL|    0|
    -|first_name   |varchar|    50|NULL| NULL|    1|
    -|last_name    |varchar|    50|NULL| NULL|    0|
    -|date_of_birth|date   |     4|NULL| NULL|    1|
    -|year_of_birth|int    |     4|NULL| NULL|    1|
    -+-------------+-------+------+----+-----+-----+]]></text><html>
    -
    -
    -									<p>
    -										The correct (and verbose) way to do this with JDBC is as follows:
    -									</p>
    -									
    -</html><java><![CDATA[ResultSet rs = statement.executeQuery();
    -
    -// Repeat until there are no more result sets
    -for (;;) {
    -
    -  // Empty the current result set
    -  while (rs.next()) {
    -    // [ .. do something with it .. ]
    -  }
    -
    -  // Get the next result set, if available
    -  if (statement.getMoreResults()) {
    -    rs = statement.getResultSet();
    -  }
    -  else {
    -    break;
    -  }
    -}
    -
    -// Be sure that all result sets are closed
    -statement.getMoreResults(Statement.CLOSE_ALL_RESULTS);
    -statement.close();]]></java><html>
    -
    -									<p>
    -										As previously discussed in the chapter about <reference id="comparison-with-jdbc" title="differences between jOOQ and JDBC"/>, jOOQ does not rely on an internal state of any JDBC object, which is "externalised" by Javadoc. Instead, it has a straight-forward API allowing you to do the above in a one-liner: 
    -									</p>
    -									
    -</html><java><![CDATA[// Get some information about the author table, its columns, keys, indexes, etc
    -List<Result<Record>> results = create.fetchMany("sp_help 'author'");]]></java><html>
    -
    -									<p>
    -										Using generics, the resulting structure is immediately clear.
    -									</p>									
    -								</html></content>
    -							</section>
    -
    -							<section id="later-fetching">
    -								<title>Later fetching</title>
    -								<content><html>
    -									<p>
    -										Some queries take very long to execute, yet they are not crucial for the continuation of the main program. For instance, you could be generating a complicated report in a Swing application, and while this report is being calculated in your database, you want to display a background progress bar, allowing the user to pursue some other work. This can be achived simply with jOOQ, by creating a <reference class="org.jooq.FutureResult"/>, a type that extends <reference class="java.util.concurrent.Future"/>. An example is given here:
    -									</p>
    -									
    -</html><java><![CDATA[// Spawn off this query in a separate process:
    -FutureResult<BookRecord> future = create.selectFrom(BOOK).where(... complex predicates ...).fetchLater();
    -
    -// This example actively waits for the result to be done
    -while (!future.isDone()) {
    -    progressBar.increment(1);
    -    Thread.sleep(50);
    -}
    -
    -// The result should be ready, now
    -Result<BookRecord> result = future.get();]]></java><html>
    -
    -									<p>
    -										Note, that instead of letting jOOQ spawn a new thread, you can also provide jOOQ with your own <reference class="java.util.concurrent.ExecutorService"/>:
    -									</p>
    -									
    -</html><java><![CDATA[// Spawn off this query in a separate process:
    -ExecutorService service = // [...]
    -FutureResult<BookRecord> future = create.selectFrom(BOOK).where(... complex predicates ...).fetchLater(service);]]></java></content>
    -							</section>
    -
    -							<section id="resultset-fetching">
    -								<title>ResultSet fetching</title>
    -								<content><html>
    -									<p>
    -										When interacting with legacy applications, you may prefer to have jOOQ return a <reference class="java.sql.ResultSet"/>, rather than jOOQ's own <reference class="org.jooq.Result"/> types. This can be done simply, in two ways:
    -									</p>
    -									
    -</html><java><![CDATA[// jOOQ's Cursor type exposes the underlying ResultSet:
    -ResultSet rs1 = create.selectFrom(BOOK).fetchLazy().resultSet();
    -
    -// But you can also directly access that ResultSet from ResultQuery:
    -ResultSet rs2 = create.selectFrom(BOOK).fetchResultSet();
    -
    -// Don't forget to close these, though!
    -rs1.close();
    -rs2.close();]]></java><html>
    -
    -									<h3>Transform jOOQ's Result into a JDBC ResultSet</h3>
    -									<p>
    -										Instead of operating on a JDBC ResultSet holding an open resource from your database, you can also let jOOQ's <reference class="org.jooq.Result"/> wrap itself in a <reference class="java.sql.ResultSet"/>. The advantage of this is that the so-created ResultSet has no open connection to the database. It is a completely in-memory ResultSet:								
    -									</p>
    -
    -</html><java><![CDATA[// Transform a jOOQ Result into a ResultSet
    -Result<BookRecord> result = create.selectFrom(BOOK).fetch();
    -ResultSet rs = result.intoResultSet();]]></java><html>
    -
    -									<h3>The inverse: Fetch data from a legacy ResultSet using jOOQ</h3>
    -									<p>
    -										The inverse of the above is possible too. Maybe, a legacy part of your application produces JDBC <reference class="java.sql.ResultSet"/>, and you want to turn them into a <reference class="org.jooq.Result"/>: 
    -									</p>
    -
    -</html><java><![CDATA[// Transform a JDBC ResultSet into a jOOQ Result
    -ResultSet rs = connection.createStatement().executeQuery("SELECT * FROM BOOK");
    -
    -// As a Result:
    -Result<Record> result = create.fetch(rs);
    -
    -// As a Cursor
    -Cursor<Record> cursor = create.fetchLazy(rs);]]></java><html>
    -
    -                                    <p>
    -                                        You can also tighten the interaction with jOOQ's data type system and <reference id="data-type-conversion" title="data type conversion"/> features, by passing the record type to the above fetch methods:
    -                                    </p>
    -                                    
    -</html><java><![CDATA[// Pass an array of types:
    -Result<Record> result = create.fetch    (rs, Integer.class, String.class);
    -Cursor<Record> result = create.fetchLazy(rs, Integer.class, String.class);
    -
    -// Pass an array of data types:
    -Result<Record> result = create.fetch    (rs, SQLDataType.INTEGER, SQLDataType.VARCHAR);
    -Cursor<Record> result = create.fetchLazy(rs, SQLDataType.INTEGER, SQLDataType.VARCHAR);
    -
    -// Pass an array of fields:
    -Result<Record> result = create.fetch    (rs, BOOK.ID, BOOK.TITLE);
    -Cursor<Record> result = create.fetchLazy(rs, BOOK.ID, BOOK.TITLE);]]></java><html>
    -
    -                                    <p>
    -                                        If supplied, the additional information is used to override the information obtained from the <reference class="java.sql.ResultSet" title="ResultSet"/>'s <reference class="java.sql.ResultSetMetaData"/> information.
    -                                    </p>                                    
    -								</html></content>
    -							</section>
    -
    -							<section id="data-type-conversion">
    -								<title>Data type conversion</title>
    -								<content><html>
    -									<p>
    -										Apart from a few extra features (<reference id="codegen-udts" title="user-defined types"/>), jOOQ only supports basic types as supported by the JDBC API. In your application, you may choose to transform these data types into your own ones, without writing too much boiler-plate code. This can be done using jOOQ's <reference class="org.jooq.Converter"/> types. A converter essentially allows for two-way conversion between two Java data types &lt;T&gt; and &lt;U&gt;. By convention, the &lt;T&gt; type corresponds to the type in your database whereas the &gt;U&gt; type corresponds to your own user type. The Converter API is given here:
    -									</p>
    -									
    -</html><java><![CDATA[public interface Converter<T, U> extends Serializable {
    -
    -    /**
    -     * Convert a database object to a user object
    -     */
    -    U from(T databaseObject);
    -
    -    /**
    -     * Convert a user object to a database object
    -     */
    -    T to(U userObject);
    -
    -    /**
    -     * The database type
    -     */
    -    Class<T> fromType();
    -
    -    /**
    -     * The user type
    -     */
    -    Class<U> toType();
    -}]]></java><html>
    -
    -									<p>
    -										Such a converter can be used in many parts of the jOOQ API. Some examples have been illustrated in the manual's section about <reference id="fetching" title="fetching"/>.
    -									</p>
    -									
    -									<h3>A Converter for GregorianCalendar</h3>
    -									<p>
    -										Here is a some more elaborate example involving a Converter for <reference class="java.util.GregorianCalendar"/>: 
    -									</p>
    -									
    -</html><java><![CDATA[// You may prefer Java Calendars over JDBC Timestamps
    -public class CalendarConverter implements Converter<Timestamp, GregorianCalendar> {
    -
    -    @Override
    -    public GregorianCalendar from(Timestamp databaseObject) {
    -        GregorianCalendar calendar = (GregorianCalendar) Calendar.getInstance();
    -        calendar.setTimeInMillis(databaseObject.getTime());
    -        return calendar;
    -    }
    -
    -    @Override
    -    public Timestamp to(GregorianCalendar userObject) {
    -        return new Timestamp(userObject.getTime().getTime());
    -    }
    -
    -    @Override
    -    public Class<Timestamp> fromType() {
    -        return Timestamp.class;
    -    }
    -
    -    @Override
    -    public Class<GregorianCalendar> toType() {
    -        return GregorianCalendar.class;
    -    }
    -}
    -
    -// Now you can fetch calendar values from jOOQ's API:
    -List<GregorianCalendar> dates1 = create.selectFrom(BOOK).fetch().getValues(BOOK.PUBLISHING_DATE, new CalendarConverter());
    -List<GregorianCalendar> dates2 = create.selectFrom(BOOK).fetch(BOOK.PUBLISHING_DATE, new CalendarConverter());
    -]]></java><html>									
    -									
    -									<h3>Enum Converters</h3>
    -									<p>
    -										jOOQ ships with a built-in default <reference class="org.jooq.impl.EnumConverter"/>, that you can use to map VARCHAR values to enum literals or NUMBER values to enum ordinals (both modes are supported). Let's say, you want to map a YES / NO / MAYBE column to a custom Enum:
    -									</p>
    -									
    -</html><java><![CDATA[// Define your Enum
    -public enum YNM {
    -    YES, NO, MAYBE
    -}
    -
    -// Define your converter
    -public class YNMConverter extends EnumConverter<String, YNM> {
    -    public YNMConverter() {
    -        super(String.class, YNM.class);
    -    }
    -}
    -
    -// And you're all set for converting records to your custom Enum:
    -for (BookRecord book : create.selectFrom(BOOK).fetch()) {
    -    switch (book.getValue(BOOK.I_LIKE, new YNMConverter())) {
    -        case YES:    System.out.println("I like this book             : " + book.getTitle()); break;
    -        case NO:     System.out.println("I didn't like this book      : " + book.getTitle()); break;
    -        case MAYBE:  System.out.println("I'm not sure about this book : " + book.getTitle()); break;
    -    }
    -}]]></java><html>
    -									
    -									<h3>Using Converters in generated source code</h3>
    -									<p>
    -										jOOQ also allows for generated source code to reference your own custom converters, in order to permanently replace a <reference id="table-columns" title="table column's"/> &lt;T&gt; type by your own, custom &lt;U&gt; type. See the manual's section about <reference id="custom-data-types" title="custom data types"/> for details.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="interning">
    -								<title>Interning data</title>
    -								<content><html>
    -									<p>
    -										SQL result tables are not optimal in terms of used memory as they are not designed to represent hierarchical data as produced by <code>JOIN</code> operations. Specifically, <code>FOREIGN KEY</code> values may repeat themselves unnecessarily:
    -									</p>
    -
    -</html><text>+----+-----------+--------------+
    -| ID | AUTHOR_ID | TITLE        |
    -+----+-----------+--------------+
    -|  1 |         1 | 1984         |
    -|  2 |         1 | Animal Farm  |
    -|  3 |         2 | O Alquimista |
    -|  4 |         2 | Brida        |
    -+----+-----------+--------------+</text><html>
    -
    -									<p>
    -										Now, if you have millions of records with only few distinct values for <code>AUTHOR_ID</code>, you may not want to hold references to distinct (but equal) <reference class="java.lang.Integer"/> objects. This is specifically true for IDs of type <reference class="java.util.UUID"/> or string representations thereof. jOOQ allows you to "intern" those values:
    -									</p>
    -
    -</html><java><![CDATA[// Interning data after fetching
    -Result<?> r1 = create.select(BOOK.ID, BOOK.AUTHOR_ID, BOOK.TITLE)
    -                     .from(BOOK)
    -                     .join(AUTHOR).on(BOOK.AUTHOR_ID.eq(AUTHOR.ID))
    -                     .fetch()
    -                     .intern(BOOK.AUTHOR_ID);
    -
    -// Interning data while fetching
    -Result<?> r1 = create.select(BOOK.ID, BOOK.AUTHOR_ID, BOOK.TITLE)
    -                     .from(BOOK)
    -                     .join(AUTHOR).on(BOOK.AUTHOR_ID.eq(AUTHOR.ID))
    -                     .intern(BOOK.AUTHOR_ID)
    -                     .fetch();]]></java><html>
    -                     
    -                     				<p>
    -                     					You can specify as many fields as you want for interning. The above has the following effect:
    -                     				</p>
    -                     				
    -                     				<ul>
    -                     					<li>If the interned Field is of type <reference class="java.lang.String"/>, then <reference class="java.lang.String" anchor="#intern()" title="String.intern()"/> is called upon each string</li>
    -                     					<li>If the interned Field is of any other type, then the call is ignored</li>
    -                     				</ul>
    -                     				
    -                     				<p>
    -                     					Future versions of jOOQ will implement interning of data for non-String data types by collecting values in <reference class="java.util.Set"/>, removing duplicate instances.
    -                     				</p>
    -                     				
    -                     				<p>
    -                     					Note, that jOOQ will not use interned data for identity comparisons: <code>string1 == string2</code>. Interning is used only to reduce the memory footprint of <reference class="org.jooq.Result"/> objects.
    -                     				</p>
    -								</html></content>
    -							</section>							
    -						</sections>
    -					</section>
    -					
    -					<section id="statement-type">
    -						<title>Static statements vs. Prepared Statements</title>
    -						<content><html>
    -							<p>
    -								With JDBC, you have full control over your SQL statements. You can decide yourself, if you want to execute a static <reference class="java.sql.Statement"/> without bind values, or a <reference class="java.sql.PreparedStatement"/> with (or without) bind values. But you have to decide early, which way to go. And you'll have to prevent SQL injection and syntax errors manually, when inlining your bind variables.
    -							</p>
    -							<p>
    -								With jOOQ, this is easier. As a matter of fact, it is plain simple. With jOOQ, you can just set a flag in your <reference id="dsl-context" title="Configuration's"/> <reference id="custom-settings" title="Settings"/>, and all queries produced by that configuration will be executed as static statements, with all bind values inlined. An example is given here:
    -							</p>
    -							
    -</html><code-pair>
    -<sql><![CDATA[
    -
    -
    -
    -
    -
    -
    --- These statements are rendered by the two factories:
    -SELECT ? FROM DUAL WHERE ? = ?
    -SELECT 1 FROM DUAL WHERE 1 = 1]]></sql><java><![CDATA[// This DSLContext executes PreparedStatements
    -DSLContext prepare = DSL.using(connection, SQLDialect.ORACLE);
    -
    -// This DSLContext executes static Statements
    -DSLContext inlined = DSL.using(connection, SQLDialect.ORACLE, 
    -  new Settings().withStatementType(StatementType.STATIC_STATEMENT));
    -  
    -prepare.select(val(1)).where(val(1).equal(1)).fetch();
    -inlined.select(val(1)).where(val(1).equal(1)).fetch();]]></java>
    -</code-pair><html>
    -
    -							<h3>Reasons for choosing one or the other</h3>
    -							<p>
    -								Not all databases are equal. Some databases show improved performance if you use <reference class="java.sql.PreparedStatement"/>, as the database will then be able to re-use execution plans for identical SQL statements, regardless of actual bind values. This heavily improves the time it takes for soft-parsing a SQL statement. In other situations, assuming that bind values are irrelevant for SQL execution plans may be a bad idea, as you might run into "bind value peeking" issues. You may be better off spending the extra cost for a new hard-parse of your SQL statement and instead having the database fine-tune the new plan to the concrete bind values.
    -							</p>
    -							<p>
    -								Whichever aproach is more optimal for you cannot be decided by jOOQ. In most cases, prepared statements are probably better. But you always have the option of forcing jOOQ to render inlined bind values.
    -							</p>
    -							
    -							<h3>Inlining bind values on a per-bind-value basis</h3>
    -							<p>
    -								Note that you don't have to inline all your bind values at once. If you know that a bind value is not really a variable and should be inlined explicitly, you can do so by using <reference class="org.jooq.impl.DSL" anchor="#inline(Object)" title="DSL.inline()"/>, as documented in the manual's section about <reference id="inlined-parameters" title="inlined parameters"/>
    -							</p>
    -						</html></content>
    -					</section>
    -
    -					<section id="reusing-statements">
    -						<title>Reusing a Query's PreparedStatement</title>
    -						<content><html>
    -							<p>
    -								As previously discussed in the chapter about <reference id="comparison-with-jdbc" title="differences between jOOQ and JDBC"/>, reusing PreparedStatements is handled a bit differently in jOOQ from how it is handled in JDBC
    -							</p>
    -							
    -							<h3>Keeping open PreparedStatements with JDBC</h3>
    -							<p>
    -								With JDBC, you can easily reuse a <reference class="java.sql.PreparedStatement"/> by not closing it between subsequent executions. An example is given here:
    -							</p>
    -							
    -</html><java><![CDATA[PreparedStatement stmt = null;
    -ResultSet rs1 = null;
    -ResultSet rs2 = null;
    -
    -try {
    -    // Execute the statement and fetch a first ResultSet
    -    stmt = connection.prepareStatement("SELECT 1 FROM DUAL");
    -    rs1  = stmt.executeQuery();
    -
    -    // Without closing the statement, execute it again to fetch another ResultSet
    -    rs2  = stmt.executeQuery();
    -}
    -finally {
    -    try { rs1.close();  } catch (Exception ignore) {}
    -    try { rs2.close();  } catch (Exception ignore) {}
    -    try { stmt.close(); } catch (Exception ignore) {}
    -}]]></java><html>
    -
    -							<p>
    -								The above technique can be quite useful when you want to reuse expensive database resources. This can be the case when your statement is executed very frequently and your database would take non-negligible time to soft-parse the prepared statement and generate a new statement / cursor resource.
    -							</p>
    -							
    -							<h3>Keeping open PreparedStatements with jOOQ</h3>
    -							<p>
    -								This is also modeled in jOOQ. However, the difference to JDBC is that closing a statement is the default action, whereas keeping it open has to be configured explicitly. This is better than JDBC, because the default action should be the one that is used most often. Keeping open statements is rarely done in average applications. Here's an example of how to keep open PreparedStatements with jOOQ:
    -							</p>
    -							
    -</html><java><![CDATA[// Create a query which is configured to keep its underlying PreparedStatement open
    -ResultQuery<Record> query = create.selectOne().keepStatement(true);
    -
    -// Execute the query twice, against the same underlying PreparedStatement:
    -try {
    -    Result<Record> result1 = query.fetch(); // This will lazily create a new PreparedStatement
    -    Result<Record> result2 = query.fetch(); // This will reuse the previous PreparedStatement
    -}
    -
    -// ... but now, you must not forget to close the query
    -finally {
    -    query.close();
    -}]]></java><html>
    -
    -							<p>
    -								The above example shows how a query can be executed twice against the same underlying PreparedStatement. Unlike in other execution scenarios, you must not forget to close this query now
    -							</p>
    -						</html></content>
    -					</section>
    -
    -                    <section id="jdbc-flags">
    -                        <title>JDBC flags</title>
    -                        <content><html>
    -                            <p>
    -                                JDBC knows a couple of execution flags and modes, which can be set through the jOOQ API as well. jOOQ essentially supports these flags and execution modes:
    -                            </p>
    -                            
    -</html><java><![CDATA[public interface Query extends QueryPart, Attachable {
    -
    -    // [...]
    -
    -    // The query execution timeout.
    -    // -----------------------------------------------------------
    -    Query queryTimeout(int timeout);
    -    
    -}]]></java><java><![CDATA[public interface ResultQuery<R extends Record> extends Query {
    -
    -    // [...]
    -
    -    // The query execution timeout.
    -    // -----------------------------------------------------------
    -    @Override
    -    ResultQuery<R> queryTimeout(int timeout);
    -
    -    // Flags allowing to specify the resulting ResultSet modes
    -    // -----------------------------------------------------------
    -    ResultQuery<R> resultSetConcurrency(int resultSetConcurrency);
    -    ResultQuery<R> resultSetType(int resultSetType);
    -    ResultQuery<R> resultSetHoldability(int resultSetHoldability);
    -
    -    // The maximum number of rows to be fetched by JDBC
    -    // -----------------------------------------------------------
    -    ResultQuery<R> maxRows(int rows);
    -    
    -}]]></java><html>
    -
    -                            <h3>Using ResultSet concurrency with ExecuteListeners</h3>
    -                            <p>
    -                                An example of why you might want to manually set a ResultSet's concurrency flag to something non-default is given here:
    -                            </p>
    -                            
    -</html><java><![CDATA[
    -DSL.using(new DefaultConfiguration()
    -   .set(connection)
    -   .set(SQLDialect.ORACLE)
    -   .set(DefaultExecuteListenerProvider.providers(
    -           new DefaultExecuteListener() {
    -        
    -               @Override
    -               public void recordStart(ExecuteContext ctx) {
    -                   try {
    -            
    -                       // Change values in the cursor before reading a record
    -                       ctx.resultSet().updateString(BOOK.TITLE.getName(), "New Title");
    -                       ctx.resultSet().updateRow();
    -                   }
    -                   catch (SQLException e) {
    -                       throw new DataAccessException("Exception", e);
    -                   }
    -               }
    -          }
    -       )
    -   ))
    -   .select(BOOK.ID, BOOK.TITLE)
    -   .from(BOOK)
    -   .orderBy(BOOK.ID)
    -   .resultSetType(ResultSet.TYPE_SCROLL_INSENSITIVE)
    -   .resultSetConcurrency(ResultSet.CONCUR_UPDATABLE)
    -   .fetch(BOOK.TITLE);]]></java><html>
    -   
    -                            <p>
    -                                In the above example, your custom <reference id="execute-listeners" title="ExecuteListener callback"/> is triggered before jOOQ loads a new <code>Record</code> from the JDBC <code>ResultSet</code>. With the concurrency being set to <code>ResultSet.CONCUR_UPDATABLE</code>, you can now modify the database cursor through the standard JDBC <code>ResultSet</code> API.  
    -                            </p>
    -                        </html></content>
    -                    </section>
    -
    -				    <section id="batch-execution">
    -						<title>Using JDBC batch operations</title>
    -						<content><html>
    -							<p>
    -								With JDBC, you can easily execute several statements at once using the addBatch() method. Essentially, there are two modes in JDBC
    -							</p>
    -
    -							<ul>
    -								<li>Execute several queries without bind values</li>
    -								<li>Execute one query several times with bind values</li>
    -							</ul>
    -
    -							<p>
    -								In code, this looks like the following snippet:
    -							</p>
    -</html><java><![CDATA[// 1. several queries
    -// ------------------
    -Statement stmt = connection.createStatement();
    -stmt.addBatch("INSERT INTO author(id, first_name, last_name) VALUES (1, 'Erich', 'Gamma')");
    -stmt.addBatch("INSERT INTO author(id, first_name, last_name) VALUES (2, 'Richard', 'Helm')");
    -stmt.addBatch("INSERT INTO author(id, first_name, last_name) VALUES (3, 'Ralph', 'Johnson')");
    -stmt.addBatch("INSERT INTO author(id, first_name, last_name) VALUES (4, 'John', 'Vlissides')");
    -int[] result = stmt.executeBatch();
    -
    -// 2. a single query
    -// -----------------
    -PreparedStatement stmt = connection.prepareStatement("INSERT INTO author(id, first_name, last_name) VALUES (?, ?, ?)");
    -stmt.setInt(1, 1);
    -stmt.setString(2, "Erich");
    -stmt.setString(3, "Gamma");
    -stmt.addBatch();
    -
    -stmt.setInt(1, 2);
    -stmt.setString(2, "Richard");
    -stmt.setString(3, "Helm");
    -stmt.addBatch();
    -
    -stmt.setInt(1, 3);
    -stmt.setString(2, "Ralph");
    -stmt.setString(3, "Johnson");
    -stmt.addBatch();
    -
    -stmt.setInt(1, 4);
    -stmt.setString(2, "John");
    -stmt.setString(3, "Vlissides");
    -stmt.addBatch();
    -
    -int[] result = stmt.executeBatch();]]></java><html>
    -
    -
    -							<h3>This will also be supported by jOOQ</h3>
    -							<p>
    -								jOOQ supports executing queries in batch mode as follows:
    -							</p>
    -							
    -</html><java><![CDATA[// 1. several queries
    -// ------------------
    -create.batch(
    -	create.insertInto(AUTHOR, ID, FIRST_NAME, LAST_NAME).values(1, "Erich", "Gamma"),
    -	create.insertInto(AUTHOR, ID, FIRST_NAME, LAST_NAME).values(2, "Richard", "Helm"),
    -	create.insertInto(AUTHOR, ID, FIRST_NAME, LAST_NAME).values(3, "Ralph", "Johnson"),
    -	create.insertInto(AUTHOR, ID, FIRST_NAME, LAST_NAME).values(4, "John", "Vlissides"))
    -.execute();
    -
    -// 2. a single query
    -// -----------------
    -create.batch(create.insertInto(AUTHOR, ID, FIRST_NAME, LAST_NAME).values((Integer) null, null, null))
    -      .bind(1, "Erich", "Gamma")
    -      .bind(2, "Richard", "Helm")
    -      .bind(3, "Ralph", "Johnson")
    -      .bind(4, "John", "Vlissides")
    -      .execute();]]></java><html>
    -      
    -                            <p>
    -                                When creating a batch execution with a single query and multiple bind values, you will still have to provide jOOQ with dummy bind values for the original query. In the above example, these are set to <code>null</code>. For subsequent calls to <code>bind()</code>, there will be no type safety provided by jOOQ.
    -                            </p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="sequence-execution">
    -						<title>Sequence execution</title>
    -						<content><html>
    -							<p>
    -								Most databases support sequences of some sort, to provide you with unique values to be used for primary keys and other enumerations. If you're using jOOQ's <reference id="code-generation" title="code generator"/>, it will generate a sequence object per sequence for you. There are two ways of using such a sequence object:
    -							</p>
    -
    -							<h3>Standalone calls to sequences</h3>
    -							<p>
    -								Instead of actually phrasing a select statement, you can also use the <reference id="dsl-context" title="DSLContext's"/> convenience methods:
    -							</p>							
    -							
    -</html><java><![CDATA[// Fetch the next value from a sequence
    -BigInteger nextID = create.nextval(S_AUTHOR_ID);
    -
    -// Fetch the current value from a sequence
    -BigInteger currID = create.currval(S_AUTHOR_ID);]]></java><html>
    -							
    -							<h3>Inlining sequence references in SQL</h3>
    -							<p>
    -								You can inline sequence references in jOOQ SQL statements. The following are examples of how to do that:
    -							</p>
    -							
    -</html><java><![CDATA[// Reference the sequence in a SELECT statement:
    -BigInteger nextID = create.select(s).fetchOne(S_AUTHOR_ID.nextval());
    -
    -// Reference the sequence in an INSERT statement:
    -create.insertInto(AUTHOR, AUTHOR.ID, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -      .values(S_AUTHOR_ID.nextval(), val("William"), val("Shakespeare"));
    -]]></java><html>
    -
    -							<p>
    -								For more info about inlining sequence references in SQL statements, please refer to the manual's section about <reference id="sequences-and-serials" title="sequences and serials"/>.
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="stored-procedures">
    -						<title>Stored procedures and functions</title>
    -						<content><html>
    -							<p>
    -								Many RDBMS support the concept of "routines", usually calling them procedures and/or functions. These concepts have been around in programming languages for a while, also outside of databases. Famous languages distinguishing procedures from functions are:
    -							</p>
    -							<ul>
    -								<li>Ada</li>
    -								<li>BASIC</li>
    -								<li>Pascal</li>
    -								<li>etc...</li>
    -							</ul>
    -							<p>
    -								The general distinction between (stored) procedures and (stored) functions can be summarised like this:
    -							</p>
    -							
    -							<h3>Procedures</h3>
    -							<ul>
    -								<li>Are called using JDBC CallableStatement</li>
    -								<li>Have no return value</li>
    -								<li>Usually support OUT parameters</li>
    -							</ul>
    -							
    -							<h3>Functions</h3>
    -							<ul>
    -								<li>Can be used in SQL statements</li>
    -								<li>Have a return value</li>
    -								<li>Usually don't support OUT parameters</li>
    -							</ul>
    -							
    -							<h3>Exceptions to these rules</h3>
    -							<ul>
    -								<li>DB2, H2, and HSQLDB don't allow for JDBC escape syntax when calling functions. Functions must be used in a SELECT statement</li>
    -								<li>H2 only knows functions (without OUT parameters)</li>
    -								<li>Oracle functions may have OUT parameters</li>
    -								<li>Oracle knows functions that must not be used in SQL statements for transactional reasons</li>
    -								<li>Postgres only knows functions (with all features combined). OUT parameters can also be interpreted as return values, which is quite elegant/surprising, depending on your taste</li>
    -								<li>The Sybase jconn3 JDBC driver doesn't handle null values correctly when using the JDBC escape syntax on functions</li>
    -							</ul>
    -							<p>
    -								In general, it can be said that the field of routines (procedures / functions) is far from being standardised in modern RDBMS even if the SQL:2008 standard specifies things quite well. Every database has its ways and JDBC only provides little abstraction over the great variety of procedures / functions implementations, especially when advanced data types such as cursors / UDT's / arrays are involved.
    -							</p>
    -							<p>
    -								To simplify things a little bit, jOOQ handles both procedures and functions the same way, using a more general <reference class="org.jooq.Routine"/> type.
    -							</p>
    -							
    -							<h3>Using jOOQ for standalone calls to stored procedures and functions</h3>
    -							<p>
    -								If you're using jOOQ's <reference id="code-generation" title="code generator"/>, it will generate <reference class="org.jooq.Routine"/> objects for you. Let's consider the following example:
    -							</p>
    -							
    -</html><sql><![CDATA[-- Check whether there is an author in AUTHOR by that name and get his ID
    -CREATE OR REPLACE PROCEDURE author_exists (author_name VARCHAR2, result OUT NUMBER, id OUT NUMBER);]]></sql><html>
    -
    -							<p>
    -								The generated artefacts can then be used as follows:
    -							</p>
    -							
    -</html><java><![CDATA[// Make an explicit call to the generated procedure object:
    -AuthorExists procedure = new AuthorExists();
    -
    -// All IN and IN OUT parameters generate setters
    -procedure.setAuthorName("Paulo");
    -procedure.execute(configuration);
    -
    -// All OUT and IN OUT parameters generate getters
    -assertEquals(new BigDecimal("1"), procedure.getResult());
    -assertEquals(new BigDecimal("2"), procedure.getId();]]></java><html>							
    -							
    -							<p>
    -								But you can also call the procedure using a generated convenience method in a global Routines class:
    -							</p>
    -
    -</html><java><![CDATA[// The generated Routines class contains static methods for every procedure.
    -// Results are also returned in a generated object, holding getters for every OUT or IN OUT parameter.
    -AuthorExists result = Routines.authorExists("Paulo");
    -
    -// All OUT and IN OUT parameters generate getters
    -assertEquals(new BigDecimal("1"), procedure.getResult());
    -assertEquals(new BigDecimal("2"), procedure.getId();]]></java><html>			
    -
    -							<p>
    -								For more details about <reference id="code-generation" title="code generation"/> for procedures, see the manual's section about <reference id="codegen-procedures" title="procedures and code generation"/>.
    -							</p>				
    -							
    -							<h3>Inlining stored function references in SQL</h3>
    -							<p>
    -								Unlike procedures, functions can be inlined in SQL statements to generate <reference id="column-expressions" title="column expressions"/> or <reference id="table-expressions" title="table expressions"/>, if you're using <reference id="array-and-cursor-unnesting" title="unnesting operators"/>. Assume you have a function like this:
    -							</p>
    -
    -</html><sql><![CDATA[-- Check whether there is an author in AUTHOR by that name and get his ID
    -CREATE OR REPLACE FUNCTION author_exists (author_name VARCHAR2) RETURN NUMBER;]]></sql><html>
    -							
    -							<p>
    -								The generated artefacts can then be used as follows:
    -							</p>
    -							
    -</html><code-pair>
    -<sql><![CDATA[-- This is the rendered SQL
    -
    -SELECT AUTHOR_EXISTS('Paulo') FROM DUAL]]></sql><java><![CDATA[// Use the static-imported method from Routines:
    -boolean exists = 
    -create.select(authorExists("Paulo")).fetchOne(0, boolean.class);]]></java>							
    -</code-pair><html>
    -							
    -							<p>
    -								For more info about inlining stored function references in SQL statements, please refer to the manual's section about <reference id="user-defined-functions" title="user-defined functions"/>.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="oracle-packages">
    -								<title>Oracle Packages</title>
    -								<content><html>
    -									<p>
    -										Oracle uses the concept of a PACKAGE to group several procedures/functions into a sort of namespace. The <a href="http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt" title="SQL 92 standard">SQL 92 standard</a> talks about "modules", to represent this concept, even if this is rarely implemented as such. This is reflected in jOOQ by the use of Java sub-packages in the <reference id="code-generation" title="source code generation"/> destination package. Every Oracle package will be reflected by
    -									</p>
    -									<ul>
    -										<li>A Java package holding classes for formal Java representations of the procedure/function in that package</li>
    -										<li>A Java class holding convenience methods to facilitate calling those procedures/functions</li>
    -									</ul>
    -									<p>
    -										Apart from this, the generated source code looks exactly like the one for standalone procedures/functions.
    -									</p>
    -									<p>
    -										For more details about <reference id="code-generation" title="code generation"/> for procedures and packages see the manual's section about <reference id="codegen-procedures" title="procedures and code generation"/>.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="oracle-member-procedures">
    -								<title>Oracle member procedures</title>
    -								<content><html>
    -									<p>
    -										Oracle UDTs can have object-oriented structures including member functions and procedures. With Oracle, you can do things like this:
    -									</p>
    -									
    -</html><sql><![CDATA[CREATE OR REPLACE TYPE u_author_type AS OBJECT (
    -  id NUMBER(7),
    -  first_name VARCHAR2(50),
    -  last_name VARCHAR2(50),
    -
    -  MEMBER PROCEDURE LOAD,
    -  MEMBER FUNCTION counBOOKs RETURN NUMBER
    -)
    -
    --- The type body is omitted for the example]]></sql><html>
    -
    -									<p>
    -										These member functions and procedures can simply be mapped to Java methods:
    -									</p>
    -
    -</html><java><![CDATA[// Create an empty, attached UDT record from the DSLContext
    -UAuthorType author = create.newRecord(U_AUTHOR_TYPE);
    -
    -// Set the author ID and load the record using the LOAD procedure
    -author.setId(1);
    -author.load();
    -
    -// The record is now updated with the LOAD implementation's content
    -assertNotNull(author.getFirstName());
    -assertNotNull(author.getLastName());]]></java><html>
    -
    -									<p>
    -										For more details about <reference id="code-generation" title="code generation"/> for UDTs see the manual's section about <reference id="codegen-udts" title="user-defined types and code generation"/>.
    -									</p>								
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -				    <section id="exporting">
    -						<title>Exporting to XML, CSV, JSON, HTML, Text</title>
    -						<content><html>
    -							<p>
    -								If you are using jOOQ for scripting purposes or in a slim, unlayered application server, you might be interested in using jOOQ's exporting functionality (see also the <reference id="importing" title="importing functionality"/>). You can export any Result&lt;Record&gt; into the formats discussed in the subsequent chapters of the manual
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="exporting-xml">
    -								<title>Exporting XML</title>
    -								<content><java>// Fetch books and format them as XML
    -String xml = create.selectFrom(BOOK).fetch().formatXML();</java><html>
    -
    -									<p>
    -										The above query will result in an XML document looking like the following one:
    -									</p>
    -
    -</html><xml><![CDATA[<result xmlns="http://www.jooq.org/xsd/jooq-export-{export-xsd-version}.xsd">
    -  <fields>
    -    <field name="ID" type="INTEGER"/>
    -    <field name="AUTHOR_ID" type="INTEGER"/>
    -    <field name="TITLE" type="VARCHAR"/>
    -  </fields>
    -  <records>
    -    <record>
    -      <value field="ID">1</value>
    -      <value field="AUTHOR_ID">1</value>
    -      <value field="TITLE">1984</value>
    -    </record>
    -    <record>
    -      <value field="ID">2</value>
    -      <value field="AUTHOR_ID">1</value>
    -      <value field="TITLE">Animal Farm</value>
    -    </record>
    -  </records>
    -</result>]]></xml><html>
    -
    -									<p>
    -										The same result as an <reference class="org.w3c.dom.Document"/> can be obtained using the Result.intoXML() method:
    -									</p>
    -
    -
    -</html><java>// Fetch books and format them as XML
    -Document xml = create.selectFrom(BOOK).fetch().intoXML();</java><html>
    -
    -									<p>
    -										See the XSD schema definition here, for a formal definition of the XML export format:<br/>
    -										<a href="http://www.jooq.org/xsd/jooq-export-{export-xsd-version}.xsd">http://www.jooq.org/xsd/jooq-export-{export-xsd-version}.xsd</a>
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="exporting-csv">
    -								<title>Exporting CSV</title>
    -								<content><java>// Fetch books and format them as CSV
    -String csv = create.selectFrom(BOOK).fetch().formatCSV();</java><html>
    -
    -									<p>
    -										The above query will result in a CSV document looking like the following one:
    -									</p>
    -
    -</html><text>ID,AUTHOR_ID,TITLE
    -1,1,1984
    -2,1,Animal Farm</text><html>
    -
    -									<p>
    -										In addition to the standard behaviour, you can also specify a separator character, as well as a special string to represent NULL values (which cannot be represented in standard CSV):
    -									</p>
    -
    -</html><java>// Use ";" as the separator character
    -String csv = create.selectFrom(BOOK).fetch().formatCSV(';');
    -
    -// Specify "{null}" as a representation for NULL values
    -String csv = create.selectFrom(BOOK).fetch().formatCSV(';', "{null}");</java></content>
    -							</section>
    -
    -							<section id="exporting-json">
    -								<title>Exporting JSON</title>
    -								<content><java>// Fetch books and format them as JSON
    -String json = create.selectFrom(BOOK).fetch().formatJSON();</java><html>
    -
    -									<p>
    -										The above query will result in a JSON document looking like the following one:
    -									</p>
    -
    -</html><text>{"fields":[{"name":"field-1","type":"type-1"},
    -           {"name":"field-2","type":"type-2"},
    -           ...,
    -           {"name":"field-n","type":"type-n"}],
    - "records":[[value-1-1,value-1-2,...,value-1-n],
    -            [value-2-1,value-2-2,...,value-2-n]]}</text><html>
    -             
    -             						<p>
    -             							Note: This format has changed in jOOQ 2.6.0
    -             						</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="exporting-html">
    -								<title>Exporting HTML</title>
    -								<content><java>// Fetch books and format them as HTML
    -String html = create.selectFrom(BOOK).fetch().formatHTML();</java><html>
    -
    -									<p>
    -										The above query will result in an HTML document looking like the following one
    -									</p>
    -
    -</html><xml><![CDATA[<table>
    -  <thead>
    -    <tr>
    -      <th>ID</th>
    -      <th>AUTHOR_ID</th>
    -      <th>TITLE</th>
    -    </tr>
    -  </thead>
    -  <tbody>
    -    <tr>
    -      <td>1</td>
    -      <td>1</td>
    -      <td>1984</td>
    -    </tr>
    -    <tr>
    -      <td>2</td>
    -      <td>1</td>
    -      <td>Animal Farm</td>
    -    </tr>
    -  </tbody>
    -</table>]]></xml></content>
    -							</section>
    -
    -							<section id="exporting-text">
    -								<title>Exporting Text</title>
    -								<content><java>// Fetch books and format them as text
    -String text = create.selectFrom(BOOK).fetch().format();</java><html>
    -
    -									<p>
    -										The above query will result in a text document looking like the following one
    -									</p>
    -
    -</html><text>+---+---------+-----------+
    -| ID|AUTHOR_ID|TITLE      |
    -+---+---------+-----------+
    -|  1|        1|1984       |
    -|  2|        1|Animal Farm|
    -+---+---------+-----------+</text><html>
    -
    -									<p>
    -										A simple text representation can also be obtained by calling toString() on a Result object. See also the manual's section about <reference id="logging" title="DEBUG logging"/>
    -									</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -				    <section id="importing">
    -						<title>Importing data</title>
    -						<content><html>
    -							<p>
    -								If you are using jOOQ for scripting purposes or in a slim, unlayered application server, you might be interested in using jOOQ's importing functionality (see also exporting functionality). You can import data directly into a table from the formats described in the subsequent sections of this manual.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="importing-csv">
    -								<title>Importing CSV</title>
    -								<content><html>
    -
    -									<p>
    -										The below CSV data represents two author records that may have been exported previously, by jOOQ's <reference id="exporting" title="exporting functionality"/>, and then modified in Microsoft Excel or any other spreadsheet tool:
    -									</p>
    -
    -</html><text>ID;AUTHOR_ID;TITLE
    -1;1;1984
    -2;1;Animal Farm</text><html>
    -
    -									<p>
    -										With jOOQ, you can load this data using various parameters from the	loader API. A simple load may look like this:
    -									</p>
    -
    -</html><java>DSLContext create = DSL.using(connection, dialect);
    -
    -// Load data into the AUTHOR table from an input stream
    -// holding the CSV data.
    -create.loadInto(AUTHOR)
    -      .loadCSV(inputstream)
    -      .fields(ID, AUTHOR_ID, TITLE)
    -      .execute();</java><html>
    -
    -      								<p>
    -      									Here are various other examples:
    -   									</p>
    -
    -</html><java>// Ignore the AUTHOR_ID column from the CSV file when inserting
    -create.loadInto(AUTHOR)
    -      .loadCSV(inputstream)
    -      .fields(ID, null, TITLE)
    -      .execute();
    -
    -// Specify behaviour for duplicate records.
    -create.loadInto(AUTHOR)
    -
    -      // choose any of these methods
    -      .onDuplicateKeyUpdate()
    -      .onDuplicateKeyIgnore()
    -      .onDuplicateKeyError() // the default
    -
    -      .loadCSV(inputstream)
    -      .fields(ID, null, TITLE)
    -      .execute();
    -
    -// Specify behaviour when errors occur.
    -create.loadInto(AUTHOR)
    -
    -      // choose any of these methods
    -      .onErrorIgnore()
    -      .onErrorAbort() // the default
    -
    -      .loadCSV(inputstream)
    -      .fields(ID, null, TITLE)
    -      .execute();
    -
    -// Specify transactional behaviour where this is possible
    -// (e.g. not in container-managed transactions)
    -create.loadInto(AUTHOR)
    -
    -      // choose any of these methods
    -      .commitEach()
    -      .commitAfter(10)
    -      .commitAll()
    -      .commitNone() // the default
    -
    -      .loadCSV(inputstream)
    -      .fields(ID, null, TITLE)
    -      .execute();</java><html>
    -
    -									<p>
    -										Any of the above configuration methods can be combined to achieve the type of load you need. Please refer to the API's Javadoc to learn about more details. Errors that occur during the load are reported by the execute method's result:
    -									</p>
    -
    -</html><java><![CDATA[Loader<Author> loader = /* .. */ .execute();
    -
    -// The number of processed rows
    -int processed = loader.processed();
    -
    -// The number of stored rows (INSERT or UPDATE)
    -int stored = loader.stored();
    -
    -// The number of ignored rows (due to errors, or duplicate rule)
    -int ignored = loader.ignored();
    -
    -// The errors that may have occurred during loading
    -List<LoaderError> errors = loader.errors();
    -LoaderError error = errors.get(0);
    -
    -// The exception that caused the error
    -DataAccessException exception = error.exception();
    -
    -// The row that caused the error
    -int rowIndex = error.rowIndex();
    -String[] row = error.row();
    -
    -// The query that caused the error
    -Query query = error.query();]]></java></content>
    -							</section>
    -
    -							<section id="importing-xml">
    -								<title>Importing XML</title>
    -								<content><html>
    -									<p>This is not yet supported</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -				    <section id="crud-with-updatablerecords">
    -						<title>CRUD with UpdatableRecords</title>
    -						<content><html>
    -							<p>
    -								Your database application probably consists of 50% - 80% CRUD, whereas only the remaining 20% - 50% of querying is actual querying. Most often, you will operate on records of tables without using any advanced relational concepts. This is called CRUD for
    -							</p>
    -							<ul>
    -								<li>Create (<reference id="insert-statement" title="INSERT"/>)</li>
    -								<li>Read (<reference id="select-statement" title="SELECT"/>)</li>
    -								<li>Update (<reference id="update-statement" title="UPDATE"/>)</li>
    -								<li>Delete (<reference id="delete-statement" title="DELETE"/>)</li>
    -							</ul>
    -							<p>								
    -								CRUD always uses the same patterns, regardless of the nature of underlying tables. This again, leads to a lot of boilerplate code, if you have to issue your statements yourself. Like Hibernate / JPA and other ORMs, jOOQ facilitates CRUD using a specific API involving <reference class="org.jooq.UpdatableRecord"/> types.
    -							</p>
    -							
    -							<h3>Primary keys and updatability</h3>
    -							<p>
    -								In normalised databases, every table has a primary key by which a tuple/record within that table can be uniquely identified. In simple cases, this is a (possibly auto-generated) number called ID. But in many cases, primary keys include several non-numeric columns. An important feature of such keys is the fact that in most databases, they are enforced using an index that allows for very fast random access to the table. A typical way to access / modify / delete a book is this:
    -							</p>
    -							
    -</html><sql><![CDATA[-- Inserting uses a previously generated key value or generates it afresh
    -INSERT INTO BOOK (ID, TITLE) VALUES (5, 'Animal Farm');
    -
    --- Other operations can use a previously generated key value
    -SELECT * FROM BOOK WHERE ID = 5;
    -UPDATE BOOK SET TITLE = '1984' WHERE ID = 5;
    -DELETE FROM BOOK WHERE ID = 5;]]></sql><html>
    -							
    -							<p>
    -								Normalised databases assume that a primary key is unique "forever", i.e. that a key, once inserted into a table, will never be changed or re-inserted after deletion. In order to use jOOQ's <reference id="simple-crud" title="CRUD"/> operations correctly, you should design your database accordingly.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="simple-crud">
    -								<title>Simple CRUD</title>
    -								<content><html>
    -									<p>
    -										If you're using jOOQ's <reference id="code-generation" title="code generator"/>, it will generate <reference class="org.jooq.UpdatableRecord"/> implementations for every table that has a primary key. When <reference id="fetching" title="fetching"/> such a record form the database, these records are "attached" to the <reference id="dsl-context" title="Configuration" /> that created them. This means that they hold an internal reference to the same database connection that was used to fetch them. This connection is used internally by any of the following methods of the UpdatableRecord:
    -									</p>
    -									
    -</html><java><![CDATA[// Refresh a record from the database.
    -void refresh() throws DataAccessException;
    -
    -// Store (insert or update) a record to the database.
    -int store() throws DataAccessException;
    -
    -// Delete a record from the database
    -int delete() throws DataAccessException;]]></java><html>
    -									
    -									<p>
    -										See the manual's section about <reference id="serializability" title="serializability"/> for some more insight on "attached" objects. 
    -									</p>
    -									
    -									<h3>Storing</h3>
    -									<p>
    -										Storing a record will perform an <reference id="insert-statement" title="INSERT statement"/> or an <reference id="update-statement" title="UPDATE statement"/>. In general, new records are always inserted, whereas records loaded from the database are always updated. This is best visualised in code:
    -									</p>
    -
    -</html><java><![CDATA[// Create a new record
    -BookRecord book1 = create.newRecord(BOOK);
    -
    -// Insert the record: INSERT INTO BOOK (TITLE) VALUES ('1984');
    -book1.setTitle("1984");
    -book1.store();
    -
    -// Update the record: UPDATE BOOK SET PUBLISHED_IN = 1984 WHERE ID = [id]
    -book1.setPublishedIn(1948);
    -book1.store();
    -
    -// Get the (possibly) auto-generated ID from the record
    -Integer id = book1.getId();
    -
    -// Get another instance of the same book
    -BookRecord book2 = create.fetchOne(BOOK, BOOK.ID.equal(id));
    -
    -// Update the record: UPDATE BOOK SET TITLE = 'Animal Farm' WHERE ID = [id]
    -book2.setTitle("Animal Farm");
    -book2.store();]]></java><html>
    -									
    -									<p>
    -										Some remarks about storing:
    -									</p>
    -									<ul>
    -										<li>jOOQ sets only modified values in <reference id="insert-statement" title="INSERT statements"/> or <reference id="update-statement" title="UPDATE statements"/>. This allows for default values to be applied to inserted records, as specified in CREATE TABLE DDL statements.</li>
    -										<li>When store() performs an <reference id="insert-statement" title="INSERT statement"/>, jOOQ attempts to load any generated keys from the database back into the record. For more details, see the manual's section about <reference id="identity-values" title="IDENTITY values"/>.</li>
    -										<li>When loading records from <reference id="pojos" title="POJOs"/>, jOOQ will assume the record is a new record. It will hence attempt to INSERT it.</li>
    -										<li>When you activate <reference id="optimistic-locking" title="optimistic locking"/>, storing a record may fail, if the underlying database record has been changed in the mean time.</li>
    -									</ul>
    -																		
    -									<h3>Deleting</h3>
    -									<p>
    -										Deleting a record will remove it from the database. Here's how you delete records:
    -									</p>
    -									
    -</html><java><![CDATA[// Get a previously inserted book
    -BookRecord book = create.fetchOne(BOOK, BOOK.ID.equal(5));
    -
    -// Delete the book
    -book.delete();]]></java><html>
    -									
    -									<h3>Refreshing</h3>
    -									<p>
    -										Refreshing a record from the database means that jOOQ will issue a <reference id="select-statement" title="SELECT statement"/> to refresh all record values that are not the primary key. This is particularly useful when you use jOOQ's <reference id="optimistic-locking" title="optimistic locking"/> feature, in case a modified record is "stale" and cannot be stored to the database, because the underlying database record has changed in the mean time.
    -									</p>
    -									<p>
    -										In order to perform a refresh, use the following Java code:
    -									</p>									
    -
    -</html><java><![CDATA[// Fetch an updatable record from the database
    -BookRecord book = create.fetchOne(BOOK, BOOK.ID.equal(5));
    -
    -// Refresh the record
    -book.refresh();]]></java><html>
    -
    -									<h3>CRUD and SELECT statements</h3>
    -									<p>
    -										CRUD operations can be combined with regular querying, if you select records from single database tables, as explained in the manual's section about <reference id="select-statement" title="SELECT statements"/>. For this, you will need to use the <code>selectFrom()</code> method from the <reference id="dsl-context" title="DSLContext"/>:
    -									</p>
    -									
    -</html><java><![CDATA[// Loop over records returned from a SELECT statement
    -for (BookRecord book : create.fetch(BOOK, BOOK.PUBLISHED_IN.equal(1948))) {
    -
    -  // Perform actions on BookRecords depending on some conditions
    -  if ("Orwell".equals(book.fetchParent(FK_BOOK_AUTHOR).getLastName())) {
    -    book.delete();
    -  }
    -}]]></java></content>
    -							</section>
    -
    -							<section id="internal-flags">
    -								<title>Records' internal flags</title>
    -								<content><html>
    -									<p>
    -										All of jOOQ's <reference id="record-vs-tablerecord" title="Record types and subtypes"/> maintain an internal state for every column value. This state is composed of three elements:
    -									</p>
    -									<ul>
    -										<li>The value itself</li>
    -										<li>The "original" value, i.e. the value as it was originally fetched from the database or <code>null</code>, if the record was never in the database</li>
    -										<li>The "changed" flag, indicating if the value was ever changed through the <code>Record</code> API.</li>
    -									</ul>
    -									
    -									<p>
    -										The purpose of the above information is for jOOQ's <reference id="simple-crud" title="CRUD operations"/> to know, which values need to be stored to the database, and which values have been left untouched.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="identity-values">
    -								<title>IDENTITY values</title>
    -								<content><html>
    -									<p>
    -										Many databases support the concept of IDENTITY values, or <reference id="sequence-execution" title="SEQUENCE-generated"/> key values. This is reflected by JDBC's <reference class="java.sql.Statement" anchor="#getGeneratedKeys()" title="getGeneratedKeys()"/> method. jOOQ abstracts using this method as many databases and JDBC drivers behave differently with respect to generated keys. Let's assume the following SQL Server BOOK table:
    -									</p>
    -									
    -</html><sql><![CDATA[CREATE TABLE book (
    -  ID INTEGER IDENTITY(1,1) NOT NULL,
    -  
    -  -- [...]
    -  
    -  CONSTRAINT pk_book PRIMARY KEY (id)
    -)]]></sql><html>
    -
    -									<p>
    -										If you're using jOOQ's <reference id="code-generation" title="code generator"/>, the above table will generate a <reference class="org.jooq.UpdatableRecord"/> with an IDENTITY column. This information is used by jOOQ internally, to update IDs after calling <reference id="crud-with-updatablerecords" title="store()"/>: 
    -									</p>
    -									
    -</html><java><![CDATA[BookRecord book = create.newRecord(BOOK);
    -book.setTitle("1984");
    -book.store();
    -
    -// The generated ID value is fetched after the above INSERT statement
    -System.out.println(book.getId());]]></java><html>
    -
    -									<h3>Database compatibility</h3>
    -									<p>
    -										<strong>DB2, Derby, HSQLDB, Ingres</strong>
    -									</p>
    -									<p>
    -										These SQL dialects implement the standard very neatly.
    -									</p>
    -</html><sql><![CDATA[id INTEGER GENERATED BY DEFAULT AS IDENTITY
    -id INTEGER GENERATED BY DEFAULT AS IDENTITY (START WITH 1)]]></sql><html>
    -
    -									<p>
    -										<strong>H2, MySQL, Postgres, SQL Server, Sybase ASE, Sybase SQL Anywhere</strong>
    -									</p>
    -									<p>
    -										These SQL dialects implement identites, but the DDL syntax doesn’t follow the standard
    -									</p>
    -</html><sql><![CDATA[-- H2 mimicks MySQL's and SQL Server's syntax
    -ID INTEGER IDENTITY(1,1)
    -ID INTEGER AUTO_INCREMENT
    --- MySQL and SQLite
    -ID INTEGER NOT NULL AUTO_INCREMENT
    -
    --- Postgres serials implicitly create a sequence
    --- Postgres also allows for selecting from custom sequences
    --- That way, sequences can be shared among tables
    -id SERIAL NOT NULL
    -
    --- SQL Server
    -ID INTEGER IDENTITY(1,1) NOT NULL
    --- Sybase ASE
    -id INTEGER IDENTITY NOT NULL
    --- Sybase SQL Anywhere
    -id INTEGER NOT NULL IDENTITY]]></sql><html>
    -
    -									<p>
    -										<strong>Oracle</strong>
    -									</p>
    -									<p>
    -										Oracle does not know any identity columns at all. Instead, you will have to use a trigger and update the ID column yourself, using a custom sequence. Something along these lines:
    -									</p>
    -</html><sql><![CDATA[CREATE OR REPLACE TRIGGER my_trigger
    -BEFORE INSERT
    -ON my_table
    -REFERENCING NEW AS new
    -FOR EACH ROW
    -BEGIN
    -  SELECT my_sequence.nextval
    -  INTO :new.id
    -  FROM dual;
    -END my_trigger;]]></sql><html>
    -
    -									<p>
    -										Note, that this approach can be employed in most databases supporting sequences and triggers! It is a lot more flexible than standard identities
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="navigation-methods">
    -								<title>Navigation methods</title>
    -								<content><html>
    -									<p>
    -										<reference class="org.jooq.TableRecord"/> and <reference class="org.jooq.UpdatableRecord"/> contain foreign key navigation methods. These navigation methods allow for "navigating" inbound or outbound foreign key references by executing an appropriate query. An example is given here: 
    -									</p>
    -				
    -</html><code-pair>
    -<sql><![CDATA[CREATE TABLE book (
    -  AUTHOR_ID NUMBER(7) NOT NULL,
    -  
    -  -- [...]
    -  
    -  FOREIGN KEY (AUTHOR_ID) REFERENCES author(ID)
    -)]]></sql><java><![CDATA[BookRecord book = create.fetch(BOOK, BOOK.ID.equal(5));
    -
    -// Find the author of a book
    -AuthorRecord author = book.fetchParent(FK_BOOK_AUTHOR);
    -
    -// Find other books by that author
    -List<BookRecord> books = author.fetchChildren(FK_BOOK_AUTHOR);]]></java>
    -</code-pair><html>					
    -
    -									<p>
    -										Note that, unlike in Hibernate, jOOQ's navigation methods will always lazy-fetch relevant records, without caching any results. In other words, every time you run such a fetch method, a new query will be issued.
    -									</p>
    -									<p>
    -										These fetch methods only work on "attached" records. See the manual's section about <reference id="serializability" title="serializability"/> for some more insight on "attached" objects.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="non-updatable-records">
    -								<title>Non-updatable records</title>
    -								<content><html>
    -									<p>
    -										Tables without a <code>PRIMARY KEY</code> are considered non-updatable by jOOQ, as jOOQ has no way of uniquely identifying such a record within the database. If you're using jOOQ's <reference id="code-generation" title="code generator"/>, such tables will generate <reference class="org.jooq.TableRecord"/> classes, instead of <reference class="org.jooq.UpdatableRecord"/> classes. When you fetch <reference id="record-vs-tablerecord" title="typed records"/> from such a table, the returned records will not allow for calling any of the <reference id="crud-with-updatablerecords" title="store(), refresh(), delete()"/> methods. 
    -									</p>
    -									
    -									<p>
    -										Note, that some databases use internal rowid or object-id values to identify such records. jOOQ does not support these vendor-specific record meta-data.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="optimistic-locking">
    -								<title>Optimistic locking</title>
    -								<content><html>
    -									<p>
    -										jOOQ allows you to perform <reference id="crud-with-updatablerecords" title="CRUD"/> operations using optimistic locking. You can immediately take advantage of this feature by activating the relevant <reference id="custom-settings" title="executeWithOptimisticLocking Setting"/>. Without any further knowledge of the underlying data semantics, this will have the following impact on store() and delete() methods:
    -									</p>
    -									<ul>
    -										<li>INSERT statements are not affected by this Setting flag</li>
    -										<li>Prior to UPDATE or DELETE statements, jOOQ will run a <reference id="for-update-clause" title="SELECT .. FOR UPDATE"/> statement, pessimistically locking the record for the subsequent UPDATE / DELETE</li>
    -										<li>The data fetched with the previous SELECT will be compared against the data in the record being stored or deleted</li>
    -										<li>An <reference class="org.jooq.exception.DataChangedException"/> is thrown if the record had been modified in the mean time</li>
    -										<li>The record is successfully stored / deleted, if the record had not been modified in the mean time.</li>
    -									</ul>
    -									<p>
    -										The above changes to jOOQ's behaviour are transparent to the API, the only thing you need to do for it to be activated is to set the Settings flag. Here is an example illustrating optimistic locking:
    -									</p>
    -
    -</html><java><![CDATA[// Properly configure the DSLContext
    -DSLContext optimistic = DSLContext.using(connection, SQLDialect.ORACLE, 
    -  new Settings().withExecuteWithOptimisticLocking(true));
    -  
    -// Fetch a book two times
    -BookRecord book1 = optimistic.fetch(BOOK, BOOK.ID.equal(5));
    -BookRecord book2 = optimistic.fetch(BOOK, BOOK.ID.equal(5));
    -
    -// Change the title and store this book. The underlying database record has not been modified, it can be safely updated.
    -book1.setTitle("Animal Farm");
    -book1.store();
    -
    -// Book2 still references the original TITLE value, but the database holds a new value from book1.store(). 
    -// This store() will thus fail:
    -book2.setTitle("1984");
    -book2.store();]]></java><html>								
    -	
    -									<h3>Optimised optimistic locking using TIMESTAMP fields</h3>
    -									<p>
    -										If you're using jOOQ's <reference id="code-generation" title="code generator"/>, you can take indicate TIMESTAMP or UPDATE COUNTER fields for every generated table in the <reference id="codegen-advanced" title="code generation configuration"/>. Let's say we have this table:
    -									</p>
    -
    -</html><sql><![CDATA[CREATE TABLE book (
    -  
    -  -- This column indicates when each book record was modified for the last time
    -  MODIFIED TIMESTAMP NOT NULL,
    -  -- [...]
    -)]]></sql><html>									
    -
    -									<p>
    -										The MODIFIED column will contain a timestamp indicating the last modification timestamp for any book in the BOOK table. If you're using jOOQ and it's <reference id="crud-with-updatablerecords" title="store() methods on UpdatableRecords"/>, jOOQ will then generate this TIMESTAMP value for you, automatically. However, instead of running an additional <reference id="for-update-clause" title="SELECT .. FOR UPDATE"/> statement prior to an UPDATE or DELETE statement, jOOQ adds a WHERE-clause to the UPDATE or DELETE statement, checking for TIMESTAMP's integrity. This can be best illustrated with an example:   
    -									</p>
    -									
    -</html><java><![CDATA[// Properly configure the DSLContext
    -DSLContext optimistic = DSL.using(connection, SQLDialect.ORACLE, 
    -  new Settings().withExecuteWithOptimisticLocking(true));
    -  
    -// Fetch a book two times
    -BookRecord book1 = optimistic.fetch(BOOK, BOOK.ID.equal(5));
    -BookRecord book2 = optimistic.fetch(BOOK, BOOK.ID.equal(5));
    -
    -// Change the title and store this book. The MODIFIED value has not been changed since the book was fetched. 
    -// It can be safely updated
    -book1.setTitle("Animal Farm");
    -book1.store();
    -
    -// Book2 still references the original MODIFIED value, but the database holds a new value from book1.store(). 
    -// This store() will thus fail:
    -book2.setTitle("1984");
    -book2.store();]]></java><html>
    -
    -									<p>
    -										As before, without the added TIMESTAMP column, optimistic locking is transparent to the API.
    -									</p>
    -									
    -									<h3>Optimised optimistic locking using VERSION fields</h3>
    -									<p>
    -										Instead of using TIMESTAMPs, you may also use numeric VERSION fields, containing version numbers that are incremented by jOOQ upon store() calls.
    -									</p>
    -
    -									<p>
    -										Note, for explicit pessimistic locking, please consider the manual's section about the <reference id="for-update-clause" title="FOR UPDATE clause"/>. For more details about how to configure TIMESTAMP or VERSION fields, consider the manual's section about <reference id="codegen-advanced" title="advanced code generator configuration"/>.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="batch-execution-for-crud">
    -								<title>Batch execution</title>
    -								<content><html>
    -									<p>
    -										When inserting, updating, deleting a lot of records, you may wish to profit from JDBC batch operations, which can be performed by jOOQ. These are available through jOOQ's <reference id="dsl-context" title="DSLContext"/> as shown in the following example:
    -									</p>
    -									
    -</html><java><![CDATA[// Fetch a bunch of books
    -List<BookRecord> books = create.fetch(BOOK);
    -
    -// Modify the above books, and add some new ones:
    -modify(books);
    -addMore(books);
    -
    -// Batch-update and/or insert all of the above books
    -create.batchStore(books);]]></java><html>					
    -
    -									<p>
    -										Internally, jOOQ will render all the required SQL statements and execute them as a regular <reference id="batch-execution" title="JDBC batch execution"/>. 
    -									</p>				
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -				    <section id="daos">
    -						<title>DAOs</title>
    -						<content><html>
    -							<p>
    -								If you're using jOOQ's <reference id="code-generation" title="code generator"/>, you can configure it to generate <reference id="pojos" title="POJOs" /> and DAOs for you. jOOQ then generates one DAO per <reference id="crud-with-updatablerecords" title="UpdatableRecord"/>, i.e. per table with a single-column primary key. Generated DAOs implement a common jOOQ type called <reference class="org.jooq.DAO"/>. This type contains the following methods:
    -							</p>
    -							
    -</html><java><![CDATA[// <R> corresponds to the DAO's related table
    -// <P> corresponds to the DAO's related generated POJO type
    -// <T> corresponds to the DAO's related table's primary key type. 
    -// Note that multi-column primary keys are not yet supported by DAOs
    -public interface DAO<R extends TableRecord<R>, P, T> {
    -
    -    // These methods allow for inserting POJOs
    -    void insert(P object) throws DataAccessException;
    -    void insert(P... objects) throws DataAccessException;
    -    void insert(Collection<P> objects) throws DataAccessException;
    -    
    -    // These methods allow for updating POJOs based on their primary key
    -    void update(P object) throws DataAccessException;
    -    void update(P... objects) throws DataAccessException;
    -    void update(Collection<P> objects) throws DataAccessException;
    -    
    -    // These methods allow for deleting POJOs based on their primary key
    -    void delete(P... objects) throws DataAccessException;
    -    void delete(Collection<P> objects) throws DataAccessException;
    -    void deleteById(T... ids) throws DataAccessException;
    -    void deleteById(Collection<T> ids) throws DataAccessException;
    -    
    -    // These methods allow for checking record existence
    -    boolean exists(P object) throws DataAccessException;
    -    boolean existsById(T id) throws DataAccessException;
    -    long count() throws DataAccessException;
    -    
    -    // These methods allow for retrieving POJOs by primary key or by some other field
    -    List<P> findAll() throws DataAccessException;
    -    P findById(T id) throws DataAccessException;
    -    <Z> List<P> fetch(Field<Z> field, Z... values) throws DataAccessException;
    -    <Z> P fetchOne(Field<Z> field, Z value) throws DataAccessException;
    -
    -    // These methods provide DAO meta-information
    -    Table<R> getTable();
    -    Class<P> getType();
    -}]]></java><html>
    -
    -							<p>
    -								Besides these base methods, generated DAO classes implement various useful fetch methods. An incomplete example is given here, for the BOOK table:
    -							</p>
    -
    -</html><java><![CDATA[// An example generated BookDao class
    -public class BookDao extends DAOImpl<BookRecord, Book, Integer> {
    -
    -    // Columns with primary / unique keys produce fetchOne() methods    
    -    public Book fetchOneById(Integer value) { ... }
    -
    -    // Other columns produce fetch() methods, returning several records
    -    public List<Book> fetchByAuthorId(Integer... values) { ... }
    -    public List<Book> fetchByTitle(String... values) { ... }
    -}]]></java><html>
    -							<p>
    -								Note that you can further subtype those pre-generated DAO classes, to add more useful DAO methods to them. Using such a DAO is simple:
    -							</p>
    -							
    -</html><java><![CDATA[// Initialise an Configuration
    -Configuration configuration = new DefaultConfiguration().set(connection).set(SQLDialect.ORACLE);
    -
    -// Initialise the DAO with the Configuration
    -BookDao bookDao = new BookDao(configuration);
    -
    -// Start using the DAO
    -Book book = bookDao.findById(5);
    -
    -// Modify and update the POJO
    -book.setTitle("1984");
    -book.setPublishedIn(1948);
    -bookDao.update(book);
    -
    -// Delete it again
    -bookDao.delete(book);]]></java></content>
    -					</section>
    -
    -				    <section id="exception-handling">
    -						<title>Exception handling</title>
    -						<content><html>
    -							<h3>Checked vs. unchecked exceptions</h3>
    -							<p>
    -								This is an eternal and religious debate. Pros and cons have been discussed time and again, and it still is a matter of taste, today. In this case, jOOQ clearly takes a side. jOOQ's exception strategy is simple:
    -							</p>
    -							<ul>
    -								<li>All "system exceptions" are unchecked. If in the middle of a transaction involving business logic, there is no way that you can recover sensibly from a lost database connection, or a constraint violation that indicates a bug in your understanding of your database model.</li>
    -								<li>All "business exceptions" are checked. Business exceptions are true exceptions that you should handle (e.g. not enough funds to complete a transaction).</li>
    -							</ul>
    -							<p>
    -								With jOOQ, it's simple. All of jOOQ's exceptions are "system exceptions", hence they are all unchecked.
    -							</p>
    -							
    -							<h3>jOOQ's DataAccessException</h3>
    -							<p>
    -								jOOQ uses its own <reference class="org.jooq.exception.DataAccessException"/> to wrap any underlying <reference class="java.sql.SQLException"/> that might have occurred. Note that all methods in jOOQ that may cause such a DataAccessException document this both in the Javadoc as well as in their method signature.
    -							</p>
    -							<p>
    -								DataAccessException is subtyped several times as follows:
    -							</p>
    -							<ul>
    -								<li><strong>DataAccessException</strong>: General exception usually originating from a <reference class="java.sql.SQLException"/></li>
    -								<li><strong>DataChangedException</strong>: An exception indicating that the database's underlying record has been changed in the mean time (see <reference id="optimistic-locking" title="optimistic locking"/>)</li>
    -								<li><strong>DataTypeException</strong>: Something went wrong during type conversion</li>
    -								<li><strong>DetachedException</strong>: A SQL statement was executed on a "detached" <reference id="crud-with-updatablerecords" title="UpdatableRecord"/> or a "detached" <reference id="sql-statements" title="SQL statement"/>.</li>
    -								<li><strong>InvalidResultException</strong>: An operation was performed expecting only one result, but several results were returned.</li>
    -								<li><strong>MappingException</strong>: Something went wrong when loading a record from a <reference id="pojos" title="POJO"/> or when mapping a record into a POJO</li>
    -							</ul>
    -							
    -							<h3>Override jOOQ's exception handling</h3>
    -							<p>
    -								The following section about <reference id="execute-listeners" title="execute listeners"/> documents means of overriding jOOQ's exception handling, if you wish to deal separately with some types of constraint violations, or if you raise business errors from your database, etc.
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="execute-listeners">
    -						<title>ExecuteListeners</title>
    -						<content><html>
    -							<p>
    -								The <reference id="dsl-context" title="Executor class"/> lets you specify a list of <reference class="org.jooq.ExecuteListener"/> instances. The ExecuteListener is essentially an event listener for Query, Routine, or ResultSet render, prepare, bind, execute, fetch steps. It is a base type for loggers, debuggers, profilers, data collectors, triggers, etc. Advanced ExecuteListeners can also provide custom implementations of Connection, PreparedStatement and ResultSet to jOOQ in apropriate methods.
    -							</p>
    -							<p>
    -								For convenience and better backwards-compatibility, consider extending <reference class="org.jooq.impl.DefaultExecuteListener"/> instead of implementing this interface.
    -							</p>
    -							<p>
    -								Here is a sample implementation of an ExecuteListener, that is simply counting the number of queries per type that are being executed using jOOQ:
    -							</p>
    -
    -</html><java><![CDATA[package com.example;
    -
    -// Extending DefaultExecuteListener, which provides empty implementations for all methods...
    -public class StatisticsListener extends DefaultExecuteListener {
    -    public static Map<ExecuteType, Integer> STATISTICS = new HashMap<ExecuteType, Integer>();
    -
    -    // Count "start" events for every type of query executed by jOOQ
    -    @Override
    -    public void start(ExecuteContext ctx) {
    -        synchronized (STATISTICS) {
    -            Integer count = STATISTICS.get(ctx.type());
    -    
    -            if (count == null) {
    -                count = 0;
    -            }
    -    
    -            STATISTICS.put(ctx.type(), count + 1);
    -        }
    -    }
    -}]]></java><html>
    -
    -							<p>
    -								Now, configure jOOQ's runtime to load your listener
    -							</p>
    -
    -</html><java><![CDATA[// Create a configuration with an appropriate listener provider:
    -Configuration configuration = new DefaultConfiguration().set(connection).set(dialect);
    -configuration.set(new DefaultExecuteListenerProvider(new StatisticsListener()));
    -
    -// Create a DSLContext from the above configuration
    -DSLContext create = DSL.using(configuration);]]></java><html>
    -
    -							<p>
    -								And log results any time with a snippet like this:
    -							</p>
    -
    -</html><java><![CDATA[log.info("STATISTICS");
    -log.info("----------");
    -
    -for (ExecuteType type : ExecuteType.values()) {
    -    log.info(type.name(), StatisticsListener.STATISTICS.get(type) + " executions");
    -}]]></java><html>
    -                            <p>
    -                            	This may result in the following log output:
    -                            </p>
    -
    -</html><config>15:16:52,982  INFO - TEST STATISTICS
    -15:16:52,982  INFO - ---------------
    -15:16:52,983  INFO - READ                     : 919 executions
    -15:16:52,983  INFO - WRITE                    : 117 executions
    -15:16:52,983  INFO - DDL                      : 2 executions
    -15:16:52,983  INFO - BATCH                    : 4 executions
    -15:16:52,983  INFO - ROUTINE                  : 21 executions
    -15:16:52,983  INFO - OTHER                    : 30 executions</config><html>
    -
    -							<p>
    -								Please read the <reference class="org.jooq.ExecuteListener" title="ExecuteListener Javadoc"/> for more details
    -							</p>
    -							
    -							<h3>Writing a custom ExecuteListener for logging</h3>
    -							<p>
    -								The following depicts an example of a custom ExecuteListener, which pretty-prints all queries being executed by jOOQ to stdout:
    -							</p>
    -
    -</html><java><![CDATA[import org.jooq.DSLContext;
    -import org.jooq.ExecuteContext;
    -import org.jooq.conf.Settings;
    -import org.jooq.impl.DefaultExecuteListener;
    -import org.jooq.tools.StringUtils;
    -
    -public class PrettyPrinter extends DefaultExecuteListener {
    -
    -    /**
    -     * Hook into the query execution lifecycle before executing queries
    -     */
    -    @Override
    -    public void executeStart(ExecuteContext ctx) {
    -
    -        // Create a new DSLContext for logging rendering purposes
    -        // This DSLContext doesn't need a connection, only the SQLDialect...
    -        DSLContext create = DSL.using(ctx.dialect(), 
    -        
    -        // ... and the flag for pretty-printing
    -        	new Settings().withRenderFormatted(true));
    -
    -        // If we're executing a query
    -        if (ctx.query() != null) {
    -            System.out.println(create.renderInlined(ctx.query()));
    -        }
    -        
    -        // If we're executing a routine
    -        else if (ctx.routine() != null) {
    -            System.out.println(create.renderInlined(ctx.routine()));
    -        }
    -        
    -        // If we're executing anything else (e.g. plain SQL)
    -        else if (!StringUtils.isBlank(ctx.sql())) {
    -            System.out.println(ctx.sql());
    -        }
    -    }
    -}]]></java><html>
    -							<p>
    -								See also the manual's sections about <reference id="logging" title="logging"/> and the <reference id="jooq-console" title="jOOQ Console"/> for more sample implementations of actual ExecuteListeners.
    -							</p>
    -						</html></content>
    -					</section>
    -
    -					<section id="meta-data">
    -						<title>Database meta data</title>
    -						<content><html>
    -							<p>
    -								Since jOOQ 3.0, a simple wrapping API has been added to wrap JDBC's rather awkward <reference class="java.sql.DatabaseMetaData"/>. This API is still experimental, as the calls to the underlying JDBC type are not always available for all SQL dialects.
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="logging">
    -						<title>Logging</title>
    -						<content><html>
    -							<p>
    -								jOOQ logs all SQL queries and fetched result sets to its internal DEBUG logger, which is implemented as an <reference id="execute-listeners" title="execute listener"/>. By default, execute logging is activated in the <reference id="custom-settings" title="jOOQ Settings"/>. In order to see any DEBUG log output, put either log4j or slf4j on jOOQ's classpath along with their respective configuration. A sample log4j configuration can be seen here:
    -							</p>
    -							
    -</html><xml><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
    -<log4j:configuration>
    -    <appender name="stdout" class="org.apache.log4j.ConsoleAppender">
    -        <layout class="org.apache.log4j.PatternLayout">
    -            <param name="ConversionPattern" value="%m%n" />
    -        </layout>
    -    </appender>
    -
    -    <root>
    -        <priority value="debug" />
    -        <appender-ref ref="stdout" />
    -    </root>
    -</log4j:configuration>]]></xml><html>
    -
    -							<p>
    -								With the above configuration, let's fetch some data with jOOQ
    -							</p>
    -							
    -</html><java><![CDATA[// Using H2, this time
    -create.select(BOOK.ID, BOOK.TITLE).from(BOOK).orderBy(BOOK.ID).limit(1, 2).fetch();]]></java><html>
    -
    -							<p>
    -								The above query may result in the following log output:
    -							</p>
    -
    -</html><text><![CDATA[Executing query          : select "BOOK"."ID", "BOOK"."TITLE" from "BOOK" order by "BOOK"."ID" asc, limit ? offset ?
    --> with bind values      : select "BOOK"."ID", "BOOK"."TITLE" from "BOOK" order by "BOOK"."ID" asc, limit 2 offset 1
    -Query executed           : Total: 1.439ms
    -Fetched result           : +----+------------+
    -                         : |  ID|TITLE       |
    -                         : +----+------------+
    -                         : |   2|Animal Farm |
    -                         : |   3|O Alquimista|
    -                         : +----+------------+
    -Finishing                : Total: 4.814ms, +3.375ms
    -]]></text><html>
    -
    -							<p>
    -								Essentially, jOOQ will log
    -							</p>
    -							<ul>
    -								<li>The SQL statement as rendered to the prepared statement</li>
    -								<li>The SQL statement with inlined bind values (for improved debugging)</li>
    -								<li>The query execution time</li>
    -								<li>The first 5 records of the result. This is formatted using <reference id="exporting-text" title="jOOQ's text export"/></li>
    -								<li>The total execution + fetching time</li>
    -							</ul>
    -
    -							<p>
    -								If you wish to use your own logger (e.g. avoiding printing out sensitive data), you can deactivate jOOQ's logger using <reference id="custom-settings" title="your custom settings"/> and implement your own <reference id="execute-listeners" title="execute listener logger"/>.
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="performance-considerations">
    -						<title>Performance considerations</title>
    -						<content><html>
    -							<p>
    -								Many users may have switched from higher-level abstractions such as Hibernate to jOOQ, because of Hibernate's difficult-to-manage performance, when it comes to large database schemas and complex second-level caching strategies. However, jOOQ itself is not a lightweight database abstraction framework, and it comes with its own overhead. Please be sure to consider the following points:
    -							</p>
    -							<ul>
    -								<li>It takes some time to construct jOOQ queries. If you can reuse the same queries, you might cache them. Beware of thread-safety issues, though, as jOOQ's <reference id="dsl-context" title="Configuration"/> is not necessarily threadsafe, and queries are "attached" to their creating DSLContext</li>
    -								<li>It takes some time to render SQL strings. Internally, jOOQ reuses the same <reference class="java.lang.StringBuilder"/> for the complete query, but some rendering elements may take their time. You could, of course, cache SQL generated by jOOQ and prepare your own <reference class="java.sql.PreparedStatement"/> objects</li>
    -								<li>It takes some time to bind values to prepared statements. jOOQ does not keep any open prepared statements, internally. Use a sophisticated connection pool, that will cache prepared statements and inject them into jOOQ through the standard JDBC API</li>
    -								<li>It takes some time to fetch results. By default, jOOQ will always fetch the complete <reference class="java.sql.ResultSet"/> into memory. Use <reference id="lazy-fetching" title="lazy fetching"/> to prevent that, and scroll over an open underlying database cursor</li>
    -							</ul>
    -							
    -							<h3>Optimise wisely</h3>
    -							<p>
    -								Don't be put off by the above paragraphs. You should optimise wisely, i.e. only in places where you really need very high throughput to your database. jOOQ's overhead compared to plain JDBC is typically less than 1ms per query.
    -							</p>
    -						</html></content>
    -					</section>
    -				</sections>
    -			</section>
    -
    -			<section id="code-generation">
    -				<title>Code generation</title>
    -				<content><html>
    -					<p>
    -						While optional, source code generation is one of jOOQ's main assets if you wish to increase developer productivity. jOOQ's code generator takes your database schema and reverse-engineers it into a set of Java classes modelling <reference id="table-expressions" title="tables"/>, <reference id="record-vs-tablerecord" title="records"/>, <reference id="sequence-execution" title="sequences"/>, <reference id="pojos" title="POJOs"/>, <reference id="daos" title="DAOs"/>, <reference id="stored-procedures" title="stored procedures"/>, user-defined types and many more.
    -					</p>
    -					<p>
    -						The essential ideas behind source code generation are these:
    -					</p>
    -					<ul>
    -						<li><strong>Increased IDE support</strong>: Type your Java code directly against your database schema, with all type information available</li>
    -						<li><strong>Type-safety</strong>: When your database schema changes, your generated code will change as well. Removing columns will lead to compilation errors, which you can detect early.</li>
    -					</ul>
    -					<p>
    -						The following chapters will show how to configure the code generator and how to generate various artefacts.
    -					</p>
    -				</html></content>
    -
    -				<sections>
    -				    <section id="codegen-configuration">
    -						<title>Configuration and setup of the generator</title>
    -						<content><html>
    -							<p>
    -								There are three binaries available with jOOQ, to be downloaded from <a href="https://sourceforge.net/projects/jooq/">SourceForge</a> or from Maven central:
    -							</p>
    -							<ul>
    -								<li>
    -									<strong>jooq-{jooq-version}.jar</strong>
    -									<br />
    -									The main library that you will include in your application to run jOOQ
    -								</li>
    -								<li>
    -									<strong>jooq-meta-{jooq-version}.jar</strong>
    -									<br />
    -									The utility that you will include in your build to navigate your database schema for code generation. This can be used as a schema crawler as well.
    -								</li>
    -								<li>
    -									<strong>jooq-codegen-{jooq-version}.jar</strong>
    -									<br />
    -									The utility that you will include in your build to generate your database schema
    -								</li>
    -							</ul>
    -
    -							<h3>Configure jOOQ's code generator</h3>
    -							<p>
    -								You need to tell jOOQ some things about your database connection. Here's an example of how to do it for an Oracle database
    -							</p>
    -							
    -</html><xml><![CDATA[<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    -<configuration>
    -  <!-- Configure the database connection here -->
    -  <jdbc>
    -    <driver>oracle.jdbc.OracleDriver</driver>
    -    <url>jdbc:oracle:thin:@[your jdbc connection parameters]</url>
    -    <user>[your database user]</user>
    -    <password>[your database password]</password>
    -    
    -    <!-- You can also pass user/password and other JDBC properties in the optional properties tag: -->
    -    <properties>
    -      <property><key>user</key><value>[db-user]</value></property>
    -      <property><key>password</key><value>[db-password]</value></property>
    -    </properties>
    -  </jdbc>
    -
    -  <generator>
    -    <database>
    -      <!-- The database dialect from jooq-meta. Available dialects are
    -           named org.util.[database].[database]Database. Known values are:
    -
    -           org.jooq.util.ase.ASEDatabase (to be used with Sybase ASE)
    -           org.jooq.util.cubrid.CUBRIDDatabase
    -           org.jooq.util.db2.DB2Database
    -           org.jooq.util.derby.DerbyDatabase
    -           org.jooq.util.h2.H2Database
    -           org.jooq.util.hsqldb.HSQLDBDatabase
    -           org.jooq.util.ingres.IngresDatabase
    -           org.jooq.util.mysql.MySQLDatabase
    -           org.jooq.util.oracle.OracleDatabase
    -           org.jooq.util.postgres.PostgresDatabase
    -           org.jooq.util.sqlite.SQLiteDatabase
    -           org.jooq.util.sqlserver.SQLServerDatabase
    -           org.jooq.util.sybase.SybaseDatabase (to be used with Sybase SQL Anywhere)
    -
    -           You can also provide your own org.jooq.util.Database implementation
    -           here, if your database is currently not supported or if you wish to
    -           read the database schema from a file, such as a Hibernate .hbm.xml file -->
    -      <name>org.jooq.util.oracle.OracleDatabase</name>
    -
    -      <!-- All elements that are generated from your schema (A Java regular expression. 
    -           Use the pipe to separate several expressions) Watch out for
    -           case-sensitivity. Depending on your database, this might be
    -           important! You can create case-insensitive regular expressions
    -           using this syntax: (?i:expr) -->
    -      <includes>.*</includes>
    -
    -      <!-- All elements that are excluded from your schema (A Java regular expression. 
    -           Use the pipe to separate several expressions). Excludes match before
    -           includes -->
    -      <excludes></excludes>
    -
    -      <!-- The schema that is used locally as a source for meta information.
    -           This could be your development schema or the production schema, etc
    -           This cannot be combined with the schemata element.
    -
    -           If left empty, jOOQ will generate all available schemata. See the
    -           manual's next section to learn how to generate several schemata -->
    -      <inputSchema>[your database schema / owner / name]</inputSchema>
    -    </database>
    -
    -    <generate>
    -      <!-- Generation flags: See advanced configuration properties -->
    -    </generate>
    -
    -    <target>
    -      <!-- The destination package of your generated classes (within the
    -           destination directory) -->
    -      <packageName>[org.jooq.your.packagename]</packageName>
    -
    -      <!-- The destination directory of your generated classes -->
    -      <directory>[/path/to/your/dir]</directory>
    -    </target>
    -  </generator>
    -</configuration>]]></xml><html>
    -
    -							<p>
    -								There are also lots of advanced configuration parameters, which will be treated in the <reference id="codegen-advanced" title="manual's section about advanced code generation features"/> Note, you can find the official XSD file for a formal specification at:<br/>
    -							    <a href="http://www.jooq.org/xsd/jooq-codegen-{codegen-xsd-version}.xsd" title="The jOOQ-codegen configuration XSD">http://www.jooq.org/xsd/jooq-codegen-{codegen-xsd-version}.xsd</a>
    -						    </p>
    -
    -							<h3>Run jOOQ code generation</h3>
    -							<p>
    -								Code generation works by calling this class with the above property file as argument.
    -							</p>
    -							
    -</html><config>org.jooq.util.GenerationTool /jooq-config.xml</config><html>
    -
    -							<p>
    -								Be sure that these elements are located on the classpath:
    -							</p>
    -							
    -							<ul>
    -								<li>The XML configuration file</li>
    -								<li>jooq-{jooq-version}.jar, jooq-meta-{jooq-version}.jar, jooq-codegen-{jooq-version}.jar</li>
    -								<li>The JDBC driver you configured</li>
    -							</ul>
    -
    -							<h3>A command-line example (For Windows, unix/linux/etc will be similar)</h3>
    -							<ul>
    -								<li>Put the property file, jooq*.jar and the JDBC driver into a directory, e.g. C:\temp\jooq</li>
    -							    <li>Go to C:\temp\jooq</li>
    -							    <li>Run java -cp jooq-{jooq-version}.jar;jooq-meta-{jooq-version}.jar;jooq-codegen-{jooq-version}.jar;[JDBC-driver].jar;. org.jooq.util.GenerationTool /[XML file] </li>
    -							</ul>
    -							<p>
    -								Note that the property file must be passed as a classpath resource
    -							</p>
    -
    -							<h3>Run code generation from Eclipse</h3>
    -							<p>
    -								Of course, you can also run code generation from your IDE. In Eclipse, set up a project like this. Note that:
    -							</p>
    -                            <ul>
    -                                <li>this example uses jOOQ's log4j support by adding log4j.xml and log4j.jar to the project classpath.</li>
    -                                <li>the actual jooq-{jooq-version}.jar, jooq-meta-{jooq-version}.jar, jooq-codegen-{jooq-version}.jar artefacts may contain version numbers in the file names.</li>
    -                            </ul>
    -                            
    -							<div class="screenshot">
    -							<img class="screenshot" src="&lt;?=$root?&gt;/img/eclipse-example-01.png" alt="Eclipse configuration"/>
    -							</div>
    -
    -							<p>
    -								Once the project is set up correctly with all required artefacts on the classpath, you can configure an Eclipse Run Configuration for org.jooq.util.GenerationTool.
    -							</p>
    -							<div class="screenshot">
    -							<img class="screenshot" src="&lt;?=$root?&gt;/img/eclipse-example-02.png" alt="Eclipse configuration"/>
    -							</div>
    -
    -							<p>
    -								With the XML file as an argument
    -							</p>
    -							<div class="screenshot">
    -							<img class="screenshot" src="&lt;?=$root?&gt;/img/eclipse-example-03.png" alt="Eclipse configuration"/>
    -							</div>
    -
    -							<p>
    -								And the classpath set up correctly
    -							</p>
    -							<div class="screenshot">
    -							<img class="screenshot" src="&lt;?=$root?&gt;/img/eclipse-example-04.png" alt="Eclipse configuration"/>
    -							</div>
    -
    -							<p>
    -								Finally, run the code generation and see your generated artefacts
    -							</p>
    -							<div class="screenshot">
    -							<img class="screenshot" src="&lt;?=$root?&gt;/img/eclipse-example-05.png" alt="Eclipse configuration"/>
    -							</div>
    -
    -							<h3>Run generation with ant</h3>
    -							<p>
    -								When running code generation with ant's &lt;java/&gt; task, you may have to set fork="true":
    -							</p>
    -
    -</html><xml><![CDATA[<!-- Run the code generation task -->
    -<target name="generate-test-classes">
    -  <java fork="true" classname="org.jooq.util.GenerationTool">
    -    [...]
    -  </java><html>
    -</target>
    -]]></xml><html>
    -
    -							<h3>Integrate generation with Maven</h3>
    -							<p>
    -								Using the official jOOQ-codegen-maven plugin, you can integrate source code generation in your Maven build process:
    -							</p>
    -
    -</html><xml><![CDATA[<plugin>
    -
    -  <!-- Specify the maven code generator plugin -->
    -  <groupId>org.jooq</groupId>
    -  <artifactId>jooq-codegen-maven</artifactId>
    -  <version>{jooq-version}</version>
    -
    -  <!-- The plugin should hook into the generate goal -->
    -  <executions>
    -    <execution>
    -      <goals>
    -        <goal>generate</goal>
    -      </goals>
    -    </execution>
    -  </executions>
    -
    -  <!-- Manage the plugin's dependency. In this example, we'll use a PostgreSQL database -->
    -  <dependencies>
    -    <dependency>
    -      <groupId>postgresql</groupId>
    -      <artifactId>postgresql</artifactId>
    -      <version>8.4-702.jdbc4</version>
    -    </dependency>
    -  </dependencies>
    -
    -  <!-- Specify the plugin configuration.
    -       The configuration format is the same as for the standalone code generator -->
    -  <configuration>
    -
    -    <!-- JDBC connection parameters -->
    -    <jdbc>
    -      <driver>org.postgresql.Driver</driver>
    -      <url>jdbc:postgresql:postgres</url>
    -      <user>postgres</user>
    -      <password>test</password>
    -    </jdbc>
    -
    -    <!-- Generator parameters -->
    -    <generator>
    -      <name>org.jooq.util.DefaultGenerator</name>
    -      <database>
    -        <name>org.jooq.util.postgres.PostgresDatabase</name>
    -        <includes>.*</includes>
    -        <excludes></excludes>
    -        <inputSchema>public</inputSchema>
    -      </database>
    -      <target>
    -        <packageName>org.jooq.util.maven.example</packageName>
    -        <directory>target/generated-sources/jooq</directory>
    -      </target>
    -    </generator>
    -  </configuration>
    -</plugin>
    -]]></xml><html>
    -
    -							<p>
    -								See the full example of a pom.xml including the jOOQ-codegen artefact here:<br/>
    -								<a href="https://github.com/jOOQ/jOOQ/blob/master/jOOQ-codegen-maven-example/pom.xml"
    -								  title="jOOQ-codegen-maven example pom.xml file">https://github.com/jOOQ/jOOQ/blob/master/jOOQ-codegen-maven-example/pom.xml</a>
    -							  </p>
    -
    -							<h3>Use jOOQ generated classes in your application</h3>
    -							<p>
    -								Be sure, both jooq-{jooq-version}.jar and your generated package (see configuration) are located on your classpath. Once this is done, you can execute SQL statements with your generated classes.
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="codegen-advanced">
    -						<title>Advanced generator configuration</title>
    -						<content><html>
    -							<p>
    -								In the <reference id="codegen-configuration" title="previous section"/> we have seen how jOOQ's source code generator is configured and run within a few steps. In this chapter we'll cover some advanced settings
    -							</p>
    -
    -</html><xml><![CDATA[<!-- These properties can be added directly to the generator element: -->
    -<generator>
    -  <!-- The default code generator. You can override this one, to generate your own code style
    -       Defaults to org.jooq.util.DefaultGenerator -->
    -  <name>org.jooq.util.DefaultGenerator</name>
    -
    -  <!-- The naming strategy used for class and field names.
    -       You may override this with your custom naming strategy. Some examples follow
    -       Defaults to org.jooq.util.DefaultGeneratorStrategy -->
    -  <strategy>
    -    <name>org.jooq.util.DefaultGeneratorStrategy</name>
    -  </strategy>
    -</generator>]]></xml><html>
    -
    -							<p>
    -								The following example shows how you can override the DefaultGeneratorStrategy to render table and column names the way they are defined in the database, rather than switching them to camel case:
    -							</p>
    -
    -</html><java><![CDATA[/**
    - * It is recommended that you extend the DefaultGeneratorStrategy. Most of the
    - * GeneratorStrategy API is already declared final. You only need to override any
    - * of the following methods, for whatever generation behaviour you'd like to achieve
    - *
    - * Beware that most methods also receive a "Mode" object, to tell you whether a
    - * TableDefinition is being rendered as a Table, Record, POJO, etc. Depending on
    - * that information, you can add a suffix only for TableRecords, not for Tables
    - */
    -public class AsInDatabaseStrategy extends DefaultGeneratorStrategy {
    -
    -    /**
    -     * Override this to specifiy what identifiers in Java should look like.
    -     * This will just take the identifier as defined in the database.
    -     */
    -    @Override
    -    public String getJavaIdentifier(Definition definition) {
    -        return definition.getOutputName();
    -    }
    -
    -    /**
    -     * Override these to specify what a setter in Java should look like. Setters
    -     * are used in TableRecords, UDTRecords, and POJOs. This example will name
    -     * setters "set[NAME_IN_DATABASE]"
    -     */
    -    @Override
    -    public String getJavaSetterName(Definition definition, Mode mode) {
    -        return "set" + definition.getOutputName();
    -    }
    -
    -    /**
    -     * Just like setters...
    -     */
    -    @Override
    -    public String getJavaGetterName(Definition definition, Mode mode) {
    -        return "get" + definition.getOutputName();
    -    }
    -
    -    /**
    -     * Override this method to define what a Java method generated from a database
    -     * Definition should look like. This is used mostly for convenience methods
    -     * when calling stored procedures and functions. This example shows how to
    -     * set a prefix to a CamelCase version of your procedure
    -     */
    -    @Override
    -    public String getJavaMethodName(Definition definition, Mode mode) {
    -        return "call" + org.jooq.tools.StringUtils.toCamelCase(definition.getOutputName());
    -    }
    -
    -    /**
    -     * Override this method to define how your Java classes and Java files should
    -     * be named. This example applies no custom setting and uses CamelCase versions
    -     * instead
    -     */
    -    @Override
    -    public String getJavaClassName(Definition definition, Mode mode) {
    -        return super.getJavaClassName(definition, mode);
    -    }
    -
    -    /**
    -     * Override this method to re-define the package names of your generated
    -     * artefacts.
    -     */
    -    @Override
    -    public String getJavaPackageName(Definition definition, Mode mode) {
    -        return super.getJavaPackageName(definition, mode);
    -    }
    -
    -    /**
    -     * Override this method to define how Java members should be named. This is
    -     * used for POJOs and method arguments
    -     */
    -    @Override
    -    public String getJavaMemberName(Definition definition, Mode mode) {
    -        return definition.getOutputName();
    -    }
    -
    -    /**
    -     * Override this method to define the base class for those artefacts that
    -     * allow for custom base classes
    -     */
    -    @Override
    -    public String getJavaClassExtends(Definition definition, Mode mode) {
    -        return Object.class.getName();
    -    }
    -
    -    /**
    -     * Override this method to define the interfaces to be implemented by those
    -     * artefacts that allow for custom interface implementation
    -     */
    -    @Override
    -    public List<String> getJavaClassImplements(Definition definition, Mode mode) {
    -        return Arrays.asList(Serializable.class.getName(), Cloneable.class.getName());
    -    }
    -
    -    /**
    -     * Override this method to define the suffix to apply to routines when
    -     * they are overloaded.
    -     *
    -     * Use this to resolve compile-time conflicts in generated source code, in
    -     * case you make heavy use of procedure overloading
    -     */
    -    @Override
    -    public String getOverloadSuffix(Definition definition, Mode mode, String overloadIndex) {
    -        return "_OverloadIndex_" + overloadIndex;
    -    }
    -}]]></java><html>
    -
    -                            <p>
    -                                More examples can be found here:
    -                            </p>
    -                            <ul>
    -                                <li><a href="https://github.com/jOOQ/jOOQ/blob/master/jOOQ-codegen/src/main/java/org/jooq/util/example/JPrefixGeneratorStrategy.java">org.jooq.util.example.JPrefixGeneratorStrategy</a></li>
    -                                <li><a href="https://github.com/jOOQ/jOOQ/blob/master/jOOQ-codegen/src/main/java/org/jooq/util/example/JVMArgsGeneratorStrategy.java">org.jooq.util.example.JVMArgsGeneratorStrategy</a></li>
    -                            </ul>
    -
    -                            <h3>jooq-meta configuration</h3>
    -							<p>
    -								Within the &lt;generator/&gt; element, there are other configuration elements:
    -							</p>
    -
    -</html><xml><![CDATA[<!-- These properties can be added to the database element: -->
    -<database>
    -
    -  <!-- All table and view columns that are used as "version" fields for
    -       optimistic locking (A Java regular expression. Use the pipe to separate several expressions).
    -       See UpdatableRecord.store() and UpdatableRecord.delete() for details -->
    -  <recordVersionFields>REC_VERSION</recordVersionFields/>
    -
    -  <!-- All table and view columns that are used as "timestamp" fields for
    -       optimistic locking (A Java regular expression. Use the pipe to separate several expressions).
    -       See UpdatableRecord.store() and UpdatableRecord.delete() for details -->
    -  <recordTimestampFields>REC_TIMESTAMP</recordTimestampFields/>
    -      
    -  <!-- Generate java.sql.Timestamp fields for DATE columns. This is
    -       particularly useful for Oracle databases.
    -       Defaults to false -->
    -  <dateAsTimestamp>false</dateAsTimestamp>
    -
    -  <!-- Generate jOOU data types for your unsigned data types, which are
    -       not natively supported in Java.
    -       Defaults to true -->
    -  <unsignedTypes>true</unsignedTypes>
    -
    -  <!-- The schema that is used in generated source code. This will be the
    -       production schema. Use this to override your local development
    -       schema name for source code generation. If not specified, this
    -       will be the same as the input-schema. -->
    -  <outputSchema>[your database schema / owner / name]</outputSchema>
    -
    -  <!-- A configuration element to configure several input and/or output
    -       schemata for jooq-meta, in case you're using jooq-meta in a multi-
    -       schema environment.
    -       This cannot be combined with the above inputSchema / outputSchema -->
    -  <schemata>
    -    <schema>
    -      <inputSchema>...</inputSchema>
    -      <outputSchema>...</outputSchema>
    -    </schema>
    -    [ <schema>...</schema> ... ]
    -  </schemata>
    -
    -  <!-- A configuration element to configure custom data types -->
    -  <customTypes>...</customTypes>
    -
    -  <!-- A configuration element to configure type overrides for generated
    -       artefacts (e.g. in combination with customTypes) -->
    -  <forcedTypes>...</forcedTypes>
    -</database>]]></xml><html>
    -
    -							<p>
    -								Check out the some of the manual's "advanced" sections to find out more about the advanced configuration parameters.
    -							</p>
    -							<ul>
    -								<li><reference id="schema-mapping" title="Schema mapping"/></li>
    -								<li><reference id="custom-data-types" title="Custom types"/></li>
    -							</ul>
    -
    -							<h3>jooq-codegen configuration</h3>
    -                            <p>
    -                            	Also, you can add some optional advanced configuration parameters for the generator:
    -                           	</p>
    -
    -</html><xml><![CDATA[<!-- These properties can be added to the generate element: -->
    -<generate>
    -  <!-- Primary key / foreign key relations should be generated and used.
    -       This is a prerequisite for various advanced features.
    -       Defaults to true -->
    -  <relations>true</relations>
    -
    -  <!-- Generate deprecated code for backwards compatibility
    -       Defaults to true -->
    -  <deprecated>true</deprecated>
    -
    -  <!-- Generate instance fields in your tables, as opposed to static
    -       fields. This simplifies aliasing.
    -       Defaults to true -->
    -  <instanceFields>true</instanceFields>
    -
    -  <!-- Generate the javax.annotation.Generated annotation to indicate
    -       jOOQ version used for source code.
    -       Defaults to true -->
    -  <generatedAnnotation>true</generatedAnnotation>
    -
    -  <!-- Generate jOOQ Record classes for type-safe querying. You can
    -       turn this off, if you don't need "active records" for CRUD
    -       Defaults to true -->
    -  <records>true</records>
    -
    -  <!-- Generate POJOs in addition to Record classes for usage of the
    -       ResultQuery.fetchInto(Class) API
    -       Defaults to false -->
    -  <pojos>false</pojos>
    -
    -  <!-- Generate immutable POJOs for usage of the ResultQuery.fetchInto(Class) API
    -       This overrides any value set in <pojos/>
    -       Defaults to false -->
    -  <immutablePojos>false</immutablePojos>
    -
    -  <!-- Generate interfaces that will be implemented by records and/or pojos.
    -       You can also use these interfaces in Record.into(Class<?>) and similar
    -       methods, to let jOOQ return proxy objects for them.
    -       Defaults to false -->
    -  <interfaces>false</interfaces>
    -
    -  <!-- Generate DAOs in addition to POJO classes
    -       Defaults to false -->
    -  <daos>false</daos>
    -
    -  <!-- Annotate POJOs and Records with JPA annotations for increased
    -       compatibility and better integration with JPA/Hibernate, etc
    -       Defaults to false -->
    -  <jpaAnnotations>false</jpaAnnotations>
    -
    -  <!-- Annotate POJOs and Records with JSR-303 validation annotations
    -       Defaults to false -->
    -  <validationAnnotations>false</validationAnnotations>
    -  
    -  <!-- Allow to turn off the generation of global object references, which include
    -  
    -       - Tables.java
    -       - Sequences.java
    -       - UDTs.java
    -  
    -       Turning off the generation of the above files may be necessary for very
    -       large schemas, which exceed the amount of allowed constants in a class's
    -       constant pool (64k) or, whose static initialiser would exceed 64k of
    -       byte code
    -       
    -       Defaults to true -->
    -  <globalObjectReferences>true</globalObjectReferences>
    -</generate>]]></xml><html>
    -
    -							<h3>Property interdependencies</h3>
    -							<p>
    -								Some of the above properties depend on other properties to work correctly. For instance, when generating immutable pojos, pojos must be generated. jOOQ will enforce such properties even if you tell it otherwise. Here is a list of property interdependencies:
    -							</p>
    -							
    -							<ul>
    -								<li>When <code>daos = true</code>, then jOOQ will set <code>relations = true</code></li>
    -								<li>When <code>daos = true</code>, then jOOQ will set <code>records = true</code></li>
    -								<li>When <code>daos = true</code>, then jOOQ will set <code>pojos = true</code></li>
    -								<li>When <code>immutablePojos = true</code>, then jOOQ will set <code>pojos = true</code></li>
    -							</ul>
    -						</html></content>
    -					</section>
    -
    -				    <section id="codegen-globals">
    -						<title>Generated global artefacts</title>
    -						<content><html>
    -							<p>
    -								For increased convenience at the use-site, jOOQ generates "global" artefacts at the code generation root location, referencing tables, routines, sequences, etc. In detail, these global artefacts include the following:
    -							</p>
    -							<ul>
    -								<li><strong>Keys.java</strong>: This file contains all of the required primary key, unique key, foreign key and identity references in the form of static members of type <reference class="org.jooq.Key"/>.</li>
    -								<li><strong>Routines.java</strong>: This file contains all standalone routines (not in packages) in the form of static factory methods for <reference class="org.jooq.Routine"/> types.</li>
    -								<li><strong>Sequences.java</strong>: This file contains all sequence objects in the form of static members of type <reference class="org.jooq.Sequence"/>.</li>
    -								<li><strong>Tables.java</strong>: This file contains all table objects in the form of static member references to the actual singleton <reference class="org.jooq.Table"/> object</li>
    -								<li><strong>UDTs.java</strong>: This file contains all UDT objects in the form of static member references to the actual singleton <reference class="org.jooq.UDT"/> object</li>
    -							</ul>
    -							
    -							<h3>Referencing global artefacts</h3>
    -							<p>
    -								When referencing global artefacts from your client application, you would typically static import them as such:
    -							</p>
    -							
    -</html><java><![CDATA[// Static imports for all global artefacts
    -import static com.example.generated.Routines.*;
    -import static com.example.generated.Sequences.*;
    -import static com.example.generated.Tables.*;
    -
    -// You could then reference your artefacts as follows:
    -create.insertInto(MY_TABLE)
    -      .values(MY_SEQUENCE.nextval(), myFunction())
    -      
    -// as a more concise form of this:
    -create.insertInto(com.example.generated.Tables.MY_TABLE)
    -      .values(com.example.generated.Sequences.MY_SEQUENCE.nextval(), com.example.generated.Routines.myFunction())]]></java></content>
    -					</section>
    -
    -				    <section id="codegen-tables">
    -						<title>Generated tables</title>
    -						<content><html>
    -							<p>
    -								Every table in your database will generate a <reference class="org.jooq.Table"/> implementation that looks like this:
    -							</p>
    -							
    -</html><java><![CDATA[public class Book extends TableImpl<BookRecord> {
    -
    -    // The singleton instance
    -    public static final Book BOOK = new Book();
    -
    -    // Generated columns
    -    public final TableField<BookRecord, Integer> ID        = createField("ID",        SQLDataType.INTEGER, this);
    -    public final TableField<BookRecord, Integer> AUTHOR_ID = createField("AUTHOR_ID", SQLDataType.INTEGER, this);
    -    public final TableField<BookRecord, String>  ITLE      = createField("TITLE",     SQLDataType.VARCHAR, this);
    -
    -    // Covariant aliasing method, returning a table of the same type as BOOK
    -    @Override
    -    public Book as(java.lang.String alias) {
    -        return new Book(alias);
    -    }
    -    
    -    // [...]
    -}]]></java><html>
    -
    -							<h3>Flags influencing generated tables</h3>
    -							<p>
    -								These flags from the <reference id="codegen-advanced" title="code generation configuration"/> influence generated tables:
    -							</p>
    -							<ul>
    -								<li><strong>recordVersionFields</strong>: Relevant methods from super classes are overridden to return the VERSION field</li>
    -								<li><strong>recordTimestampFields</strong>: Relevant methods from super classes are overridden to return the TIMESTAMP field</li>
    -								<li><strong>dateAsTimestamp</strong>: This influences all relevant columns</li>
    -								<li><strong>unsignedTypes</strong>: This influences all relevant columns</li>
    -								<li><strong>relations</strong>: Relevant methods from super classes are overridden to provide primary key, unique key, foreign key and identity information</li>
    -								<li><strong>instanceFields</strong>: This flag controls the "static" keyword on table columns, as well as aliasing convenience</li>
    -								<li><strong>records</strong>: The generated record type is referenced from tables allowing for type-safe single-table record fetching</li>
    -							</ul>
    -							
    -							<h3>Flags controlling table generation</h3>
    -							<p>
    -								Table generation cannot be deactivated
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="codegen-records">
    -						<title>Generated records</title>
    -						<content><html>
    -							<p>
    -								Every table in your database will generate a <reference class="org.jooq.Table"/> implementation that looks like this:
    -							</p>
    -							
    -</html><java><![CDATA[// JPA annotations can be generated, optionally
    -@Entity
    -@Table(name = "BOOK", schema = "TEST")
    -public class BookRecord extends UpdatableRecordImpl<BookRecord> 
    -
    -// An interface common to records and pojos can be generated, optionally
    -implements IBook {
    -
    -    // Every column generates a setter and a getter
    -    @Override
    -    public void setId(Integer value) {
    -        setValue(BOOK.ID, value);
    -    }
    -    
    -    @Id
    -    @Column(name = "ID", unique = true, nullable = false, precision = 7)
    -    @Override
    -    public Integer getId() {
    -        return getValue(BOOK.ID);
    -    }
    -    
    -    // More setters and getters
    -    public void setAuthorId(Integer value) {...}
    -    public Integer getAuthorId() {...}
    -    
    -    // Convenience methods for foreign key methods
    -    public void setAuthorId(AuthorRecord value) {
    -        if (value == null) {
    -            setValue(BOOK.AUTHOR_ID, null);
    -        }
    -        else {
    -            setValue(BOOK.AUTHOR_ID, value.getValue(AUTHOR.ID));
    -        }
    -    }
    -    
    -    // Navigation methods
    -    public AuthorRecord fetchAuthor() {
    -        return create().selectFrom(AUTHOR).where(AUTHOR.ID.equal(getValue(BOOK.AUTHOR_ID))).fetchOne();
    -    }
    -    
    -    // [...]
    -}]]></java><html>							
    -							
    -							<h3>Flags influencing generated records</h3>
    -							<p>
    -								These flags from the <reference id="codegen-advanced" title="code generation configuration"/> influence generated records:
    -							</p>
    -							<ul>
    -								<li><strong>dateAsTimestamp</strong>: This influences all relevant getters and setters</li>
    -								<li><strong>unsignedTypes</strong>: This influences all relevant getters and setters</li>
    -								<li><strong>relations</strong>: This is needed as a prerequisite for navigation methods</li>
    -								<li><strong>navigationMethods</strong>: This controls whether navigation methods will be generated or not</li>
    -								<li><strong>daos</strong>: Records are a pre-requisite for DAOs. If DAOs are generated, records are generated as well</li>
    -								<li><strong>interfaces</strong>: If interfaces are generated, records will implement them</li>
    -								<li><strong>jpaAnnotations</strong>: JPA annotations are used on generated records</li>
    -							</ul>
    -														
    -							<h3>Flags controlling record generation</h3>
    -							<p>
    -								Record generation can be deactivated using the <strong>records</strong> flag
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="codegen-pojos">
    -						<title>Generated POJOs</title>
    -						<content><html>
    -							<p>
    -								Every table in your database will generate a POJO implementation that looks like this:
    -							</p>
    -							
    -</html><java><![CDATA[// JPA annotations can be generated, optionally
    -@javax.persistence.Entity
    -@javax.persistence.Table(name = "BOOK", schema = "TEST")
    -public class Book implements java.io.Serializable
    -
    -// An interface common to records and pojos can be generated, optionally
    -, IBook {
    -
    -    // JSR-303 annotations can be generated, optionally
    -    @NotNull
    -    private Integer id;
    -
    -    @NotNull
    -    private Integer authorId;
    -
    -    @NotNull
    -    @Size(max = 400)
    -    private String title;
    -
    -    // Every column generates a getter and a setter
    -    @Id
    -    @Column(name = "ID", unique = true, nullable = false, precision = 7)
    -    @Override
    -    public Integer getId() {
    -        return this.id;
    -    }
    -
    -    @Override
    -    public void setId(Integer id) {
    -        this.id = id;
    -    }
    -    
    -    // [...]
    -}]]></java><html>							
    -							
    -							<h3>Flags influencing generated POJOs</h3>
    -							<p>
    -								These flags from the <reference id="codegen-advanced" title="code generation configuration"/> influence generated POJOs:
    -							</p>
    -							<ul>
    -								<li><strong>dateAsTimestamp</strong>: This influences all relevant getters and setters</li>
    -								<li><strong>unsignedTypes</strong>: This influences all relevant getters and setters</li>
    -								<li><strong>interfaces</strong>: If interfaces are generated, POJOs will implement them</li>
    -								<li><strong>immutablePojos</strong>: Immutable POJOs have final members and no setters. All members must be passed to the constructor</li>
    -								<li><strong>daos</strong>: POJOs are a pre-requisite for DAOs. If DAOs are generated, POJOs are generated as well</li>
    -								<li><strong>jpaAnnotations</strong>: JPA annotations are used on generated records</li>
    -								<li><strong>validationAnnotations</strong>: JSR-303 validation annotations are used on generated records</li>
    -							</ul>
    -														
    -							<h3>Flags controlling POJO generation</h3>
    -							<p>
    -								POJO generation can be activated using the <strong>pojos</strong> flag
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="codegen-interfaces">
    -						<title>Generated Interfaces</title>
    -						<content><html>
    -							<p>
    -								Every table in your database will generate an interface that looks like this:
    -							</p>
    -							
    -</html><java><![CDATA[public interface IBook extends java.io.Serializable {
    -
    -    // Every column generates a getter and a setter
    -    public void setId(Integer value);
    -    public Integer getId();
    -    
    -    // [...]
    -}]]></java><html>    						
    -							
    -							<h3>Flags influencing generated interfaces</h3>
    -							<p>
    -								These flags from the <reference id="codegen-advanced" title="code generation configuration"/> influence generated interfaces:
    -							</p>
    -							<ul>
    -								<li><strong>dateAsTimestamp</strong>: This influences all relevant getters and setters</li>
    -								<li><strong>unsignedTypes</strong>: This influences all relevant getters and setters</li>
    -							</ul>
    -														
    -							<h3>Flags controlling POJO generation</h3>
    -							<p>
    -								POJO generation can be activated using the <strong>interfaces</strong> flag
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="codegen-daos">
    -						<title>Generated DAOs</title>
    -						<content><html>
    -							<h3>Generated DAOs</h3>
    -							<p>
    -								Every table in your database will generate a <reference class="org.jooq.DAO"/> implementation that looks like this:
    -							</p>
    -							
    -</html><java><![CDATA[public class BookDao extends DAOImpl<BookRecord, Book, Integer> {
    -
    -    // Generated constructors
    -    public BookDao() {
    -        super(BOOK, Book.class);
    -    }
    -
    -    public BookDao(Configuration configuration) {
    -        super(BOOK, Book.class, configuration);
    -    }
    -
    -    // Every column generates at least one fetch method
    -    public List<Book> fetchById(Integer... values) {
    -        return fetch(BOOK.ID, values);
    -    }
    -
    -    public Book fetchOneById(Integer value) {
    -        return fetchOne(BOOK.ID, value);
    -    }
    -
    -    public List<Book> fetchByAuthorId(Integer... values) {
    -        return fetch(BOOK.AUTHOR_ID, values);
    -    }
    -    
    -    // [...]
    -}]]></java><html>							
    -							
    -							<h3>Flags controlling DAO generation</h3>
    -							<p>
    -								DAO generation can be activated using the <strong>daos</strong> flag
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="codegen-sequences">
    -						<title>Generated sequences</title>
    -						<content><html>
    -							<p>
    -								Every sequence in your database will generate a <reference class="org.jooq.Sequence"/> implementation that looks like this:
    -							</p>
    -							
    -</html><java><![CDATA[public final class Sequences {
    -
    -    // Every sequence generates a member
    -    public static final Sequence<Integer> S_AUTHOR_ID = new SequenceImpl<Integer>("S_AUTHOR_ID", TEST, SQLDataType.INTEGER);
    -}]]></java><html>		
    -							
    -							<h3>Flags controlling sequence generation</h3>
    -							<p>
    -								Sequence generation cannot be deactivated
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="codegen-procedures">
    -						<title>Generated procedures</title>
    -						<content><html>
    -							<p>
    -								Every procedure or function (routine) in your database will generate a <reference class="org.jooq.Routine"/> implementation that looks like this:
    -							</p>
    -
    -</html><java><![CDATA[public class AuthorExists extends AbstractRoutine<java.lang.Void> {
    -
    -    // All IN, IN OUT, OUT parameters and function return values generate a static member
    -    public static final Parameter<String>     AUTHOR_NAME = createParameter("AUTHOR_NAME", SQLDataType.VARCHAR);
    -    public static final Parameter<BigDecimal> RESULT      = createParameter("RESULT",      SQLDataType.NUMERIC);
    -
    -    // A constructor for a new "empty" procedure call
    -    public AuthorExists() {
    -        super("AUTHOR_EXISTS", TEST);
    -
    -        addInParameter(AUTHOR_NAME);
    -        addOutParameter(RESULT);
    -    }
    -
    -    // Every IN and IN OUT parameter generates a setter
    -    public void setAuthorName(String value) {
    -        setValue(AUTHOR_NAME, value);
    -    }
    -
    -    // Every IN OUT, OUT and RETURN_VALUE generates a getter
    -    public BigDecimal getResult() {
    -        return getValue(RESULT);
    -    }
    -    
    -    // [...]
    -}]]></java><html>
    -
    -							<h3>Package and member procedures or functions</h3>
    -							<p>
    -								Procedures or functions contained in packages or UDTs are generated in a sub-package that corresponds to the package or UDT name.
    -							</p>
    -
    -							<h3>Flags controlling routine generation</h3>
    -							<p>
    -								Routine generation cannot be deactivated
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="codegen-udts">
    -						<title>Generated UDTs</title>
    -						<content><html>
    -							<p>
    -								Every UDT in your database will generate a <reference class="org.jooq.UDT"/> implementation that looks like this:
    -							</p>
    -						
    -</html><java><![CDATA[public class AddressType extends UDTImpl<AddressTypeRecord> {
    -
    -    // The singleton UDT instance
    -    public static final UAddressType U_ADDRESS_TYPE = new UAddressType();
    -
    -    // Every UDT attribute generates a static member
    -    public static final UDTField<AddressTypeRecord, String> ZIP     = 
    -      createField("ZIP",     SQLDataType.VARCHAR, U_ADDRESS_TYPE);
    -    public static final UDTField<AddressTypeRecord, String> CITY    = 
    -      createField("CITY",    SQLDataType.VARCHAR, U_ADDRESS_TYPE);
    -    public static final UDTField<AddressTypeRecord, String> COUNTRY = 
    -      createField("COUNTRY", SQLDataType.VARCHAR, U_ADDRESS_TYPE);
    -    
    -    // [...]
    -}]]></java><html>						
    -										
    -							<p>
    -								Besides the <reference class="org.jooq.UDT"/> implementation, a <reference class="org.jooq.UDTRecord"/> implementation is also generated
    -							</p>		
    -
    -</html><java><![CDATA[public class AddressTypeRecord extends UDTRecordImpl<AddressTypeRecord> {
    -
    -    // Every attribute generates a getter and a setter
    -
    -    public void setZip(String value) {...}
    -    public String getZip() {...}
    -    public void setCity(String value) {...}
    -    public String getCity() {...}
    -    public void setCountry(String value) {...}
    -    public String getCountry() {...}
    -    
    -    // [...]
    -}]]></java><html>						
    -
    -							<h3>Flags controlling UDT generation</h3>
    -							<p>
    -								UDT generation cannot be deactivated
    -							</p>
    -						</html></content>
    -					</section>
    -
    -
    -                    <section id="data-type-rewrites">
    -                        <title>Data type rewrites</title>
    -                        <content><html>
    -                            <p>
    -                                Sometimes, the actual database data type does not match the SQL data type that you would like to use in Java. This is often the case for ill-supported SQL data types, such as <code>BOOLEAN</code> or <code>UUID</code>. jOOQ's code generator allows you to apply simple data type rewriting. The following configuration will rewrite <code>IS_VALID</code> columns in all tables to be of type <code>BOOLEAN</code>.
    -                            </p>
    -
    -
    -</html><xml><![CDATA[<database>
    -
    -  <!-- Associate data type rewrites with database columns -->
    -  <forcedTypes>
    -    <forcedType>
    -      <!-- Specify any data type from org.jooq.impl.SQLDataType -->
    -      <name>BOOLEAN</name>
    -
    -      <!-- Add a Java regular expression matching fully-qualified columns. 
    -           Use the pipe to separate several expressions -->
    -      <expressions>.*\.IS_VALID</expressions>
    -    </forcedType>
    -  </forcedTypes>
    -</database>]]></xml><html>
    -
    -                            <p>
    -                                See the section about <reference id="custom-data-types" title="Custom data types"/> for rewriting columns to your own custom data types.
    -                            </p>
    -                        </html></content>
    -                    </section>
    -
    -
    -				    <section id="custom-data-types">
    -						<title>Custom data types and type conversion</title>
    -						<content><html>
    -							<p>
    -								When using a custom type in jOOQ, you need to let jOOQ know about its associated <reference class="org.jooq.Converter"/>. Ad-hoc usages of such converters has been discussed in the chapter about <reference id="data-type-conversion" title="data type conversion"/>. A more common use-case, however, is to let jOOQ know about custom types at code generation time. Use the following configuration elements to specify, that you'd like to use GregorianCalendar for all database fields that start with DATE_OF_
    -      						</p>
    -
    -</html><xml><![CDATA[<database>
    -  <!-- First, register your custom types here -->
    -  <customTypes>
    -    <customType>
    -      <!-- Specify the fully-qualified class name of your custom type -->
    -      <name>java.util.GregorianCalendar</name>
    -
    -      <!-- Associate that custom type with your converter. Note, a
    -           custom type can only have one converter in jOOQ -->
    -      <converter>com.example.CalendarConverter</converter>
    -    </customType>
    -  </customTypes>
    -
    -  <!-- Then, associate custom types with database columns -->
    -  <forcedTypes>
    -    <forcedType>
    -      <!-- Specify again he fully-qualified class name of your custom type -->
    -      <name>java.util.GregorianCalendar</name>
    -
    -      <!-- Add a Java regular expression matching fully-columns. 
    -           Use the pipe to separate several expressions -->
    -      <expressions>.*\.DATE_OF_.*</expressions>
    -    </forcedType>
    -  </forcedTypes>
    -</database>]]></xml><html>
    -
    -                            <p>
    -                            	The above configuration will lead to AUTHOR.DATE_OF_BIRTH being generated like this:
    -                            </p>
    -
    -</html><java><![CDATA[public class TAuthor extends TableImpl<TAuthorRecord> {
    -
    -    // [...]
    -    public final TableField<TAuthorRecord, GregorianCalendar> DATE_OF_BIRTH =    // [...]
    -    // [...]
    -
    -}]]></java><html>
    -
    -                            <p>
    -                            	This means that the bound type of &lt;T&gt; will be GregorianCalendar, wherever you reference DATE_OF_BIRTH. jOOQ will use your custom converter when binding variables and when fetching data from <reference class="java.util.ResultSet"/>:
    -                            </p>
    -
    -</html><java><![CDATA[// Get all date of births of authors born after 1980
    -List<GregorianCalendar> result =
    -create.selectFrom(AUTHOR)
    -      .where(AUTHOR.DATE_OF_BIRTH.greaterThan(new GregorianCalendar(1980, 0, 1)))
    -      .fetch(AUTHOR.DATE_OF_BIRTH);]]></java></content>
    -					</section>
    -
    -				    <section id="schema-mapping">
    -						<title>Mapping generated schemata and tables</title>
    -						<content><html>
    -							<p>
    -								We've seen previously in the chapter about <reference id="runtime-schema-mapping" title="runtime schema mapping"/>, that schemata and tables can be mapped at runtime to other names. But you can also hard-wire schema mapping in generated artefacts at code generation time, e.g. when you have 5 developers with their own dedicated developer databases, and a common integration database. In the code generation configuration, you would then write.
    -							</p>
    -
    -</html><xml><![CDATA[<schemata>
    -  <schema>
    -    <!-- Use this as the developer's schema: -->
    -    <inputSchema>LUKAS_DEV_SCHEMA</inputSchema>
    -
    -    <!-- Use this as the integration / production database: -->
    -    <outputSchema>PROD</outputSchema>
    -  </schema>
    -</schemata>]]></xml></content>
    -					</section>
    -					
    -					<section id="codegen-large-schemas">
    -						<title>Code generation for large schemas</title>
    -						<content><html>
    -							<p>
    -								Databases can become very large in real-world applications. This is not a problem for jOOQ's code generator, but it can be for the Java compiler. jOOQ generates some classes for <reference id="codegen-globals" title="global access"/>. These classes can hit two sorts of limits of the compiler / JVM:
    -							</p>
    -							
    -							<ul>
    -								<li>Methods (including static / instance initialisers) are allowed to contain only 64kb of bytecode.</li>
    -								<li>Classes are allowed to contain at most 64k of constant literals</li>
    -							</ul>
    -							
    -							<p>
    -								While there exist workarounds for the above two limitations (delegating initialisations to nested classes, inheriting constant literals from implemented interfaces), the preferred approach is either one of these:
    -							</p>
    -							
    -							<ul>
    -								<li>Distribute your database objects in several schemas. That is probably a good idea anyway for such large databases</li>
    -								<li><reference id="codegen-configuration" title="Configure jOOQ's code generator"/> to exclude excess database objects</li>
    -								<li><reference id="codegen-configuration" title="Configure jOOQ's code generator"/> to avoid generating <reference id="codegen-globals" title="global objects"/> using <code>&lt;globalObjectReferences/&gt;</code></li>
    -								<li>Remove uncompilable classes after code generation</li>
    -							</ul>
    -						</html></content>
    -					</section>
    -				</sections>
    -			</section>
    -
    -			<section id="tools">
    -				<title>Tools</title>
    -				<content><html>
    -					<p>
    -						These chapters hold some information about tools to be used with jOOQ
    -					</p>
    -				</html></content>
    -
    -				<sections>
    -					<section id="jdbc-mocking">
    -						<title>JDBC mocking for unit testing</title>
    -						<content><html>
    -							<p>
    -								When writing unit tests for your data access layer, you have probably used some generic mocking tool offered by popular providers like <a href="http://code.google.com/p/mockito/">Mockito</a>, <a href="http://jmock.org/">jmock</a>, <a href="http://mockrunner.sourceforge.net/">mockrunner</a>, or even <a href="http://www.dbunit.org/">DBUnit</a>. With jOOQ, you can take advantage of the built-in JDBC mock API that allows you to simulate a database on the JDBC level for precisely those SQL/JDBC use cases supported by jOOQ.
    -							</p>
    -							
    -							<h3>Mocking the JDBC API</h3>
    -							<p>
    -								JDBC is a very complex API. It takes a lot of time to write a useful and correct mock implementation, implementing at least these interfaces:
    -							</p>
    -							<ul>
    -								<li><reference class="java.sql.Connection"/></li>
    -								<li><reference class="java.sql.Statement"/></li>
    -								<li><reference class="java.sql.PreparedStatement"/></li>
    -								<li><reference class="java.sql.CallableStatement"/></li>
    -								<li><reference class="java.sql.ResultSet"/></li>
    -								<li><reference class="java.sql.ResultSetMetaData"/></li>
    -							</ul>
    -							
    -							<p>
    -								Optionally, you may even want to implement interfaces, such as <reference class="java.sql.Array"/>, <reference class="java.sql.Blob"/>, <reference class="java.sql.Clob"/>, and many others. In addition to the above, you might need to find a way to simultaneously support incompatible JDBC minor versions, such as 4.0, 4.1
    -							</p>
    -							
    -							<h3>Using jOOQ's own mock API</h3>
    -							<p>
    -								This work is greatly simplified, when using jOOQ's own mock API. The <code>org.jooq.tools.jdbc</code> package contains all the essential implementations for both JDBC 4.0 and 4.1, which are needed to mock JDBC for jOOQ. In order to write mock tests, provide the jOOQ <reference id="dsl-context" title="Configuration"/> with a <reference class="org.jooq.tools.jdbc.MockConnection" title="MockConnection"/>, and implement the <reference class="org.jooq.tools.jdbc.MockDataProvider" title="MockDataProvider"/>:
    -							</p>
    -							
    -</html><java><![CDATA[// Initialise your data provider (implementation further down):
    -MockDataProvider provider = new MyProvider();
    -MockConnection connection = new MockConnection(provider);
    -
    -// Pass the mock connection to a jOOQ DSLContext:
    -DSLContext create = DSL.using(connection, SQLDialect.ORACLE);
    -
    -// Execute queries transparently, with the above DSLContext:
    -Result<BookRecord> result = create.selectFrom(BOOK).where(BOOK.ID.equal(5)).fetch();]]></java><html>
    -
    -                            <p>
    -                                As you can see, the configuration setup is simple. Now, the <code>MockDataProvider</code> acts as your single point of contact with JDBC / jOOQ. It unifies any of these execution modes, transparently:
    -                            </p>
    -                            
    -                            <ul>
    -                                <li>Statements without results</li>
    -                                <li>Statements without results but with generated keys</li>
    -                                <li>Statements with results</li>
    -                                <li>Statements with several results</li>
    -                                <li>Batch statements with single queries and multiple bind value sets</li>
    -                                <li>Batch statements with multiple queries and no bind values</li>
    -                            </ul>
    -                            
    -                            <p>
    -                                The above are the execution modes supported by jOOQ. Whether you're using any of jOOQ's various fetching modes (e.g. <reference id="pojos" title="pojo fetching"/>, <reference id="lazy-fetching" title="lazy fetching"/>, <reference id="many-fetching" title="many fetching"/>, <reference id="later-fetching" title="later fetching"/>) is irrelevant, as those modes are all built on top of the standard JDBC API.
    -                            </p>
    -                            
    -                            <h3>Implementing MockDataProvider</h3>
    -                            <p>
    -                                 Now, here's how to implement <code>MockDataProvider</code>:
    -                            </p>
    -                            
    -</html><java><![CDATA[public class MyProvider implements MockDataProvider {
    -
    -    @Override
    -    public MockResult[] execute(MockExecuteContext ctx) throws SQLException {
    -
    -        // You might need a DSLContext to create org.jooq.Result and org.jooq.Record objects
    -        DSLContext create = DSL.using(SQLDialect.ORACLE);
    -        MockResult[] mock = new MockResult[1];
    -        
    -        // The execute context contains SQL string(s), bind values, and other meta-data
    -        String sql = ctx.sql();
    -        
    -        // Exceptions are propagated through the JDBC and jOOQ APIs
    -        if (sql.toUpperCase().startsWith("DROP")) {
    -            throw new SQLException("Statement not supported: " + sql);
    -        }
    -        
    -        // You decide, whether any given statement returns results, and how many
    -        else if (sql.toUpperCase().startsWith("SELECT")) {
    -            
    -            // Always return one author record
    -            Result<AuthorRecord> result = create.newResult(AUTHOR);
    -            result.add(create.newRecord(AUTHOR));
    -            result.get(0).setValue(AUTHOR.ID, 1);
    -            result.get(0).setValue(AUTHOR.LAST_NAME, "Orwell");
    -            mock[0] = new MockResult(1, result);
    -        }
    -        
    -        // You can detect batch statements easily
    -        else if (ctx.batch()) {
    -            // [...]
    -        }
    -        
    -        return mock;
    -    }
    -}]]></java><html>
    -
    -							<p>
    -								Essentially, the <reference class="org.jooq.tools.jdbc.MockExecuteContext" title="MockExecuteContext"/> contains all the necessary information for you to decide, what kind of data you should return. The <reference class="org.jooq.tools.jdbc.MockResult" title="MockResult"/> wraps up two pieces of information:
    -							</p>
    -							<ul>
    -							    <li> <reference class="java.sql.Statement" anchor="#getUpdateCount" title="Statement.getUpdateCount()"/>: The number of affected rows</li>
    -							    <li> <reference class="java.sql.Statement" anchor="#getResultSet()" title="Statement.getResultSet()"/>: The result set</li>
    -							</ul>
    -							
    -							<p>
    -								You should return as many <code>MockResult</code> objects as there were query executions (in <reference id="batch-execution" title="batch mode"/>) or results (in <reference id="many-fetching" title="fetch-many mode"/>). Instead of an awkward JDBC <code>ResultSet</code>, however, you can construct a "friendlier" <reference class="org.jooq.Result"/> with your own record types. The jOOQ mock API will use meta data provided with this <code>Result</code> in order to create the necessary JDBC <reference class="java.sql.ResultSetMetaData"/> 
    -							</p>
    -														
    -							<p>
    -								See the <reference class="org.jooq.tools.jdbc.MockDataProvider" title="MockDataProvider Javadoc"/> for a list of rules that you should follow.
    -							</p>
    -						</html></content>
    -					</section>
    -					
    -					<section id="jooq-console">
    -						<title>jOOQ Console</title>
    -						<content><html>
    -							<p>
    -							    The <reference id="execute-listeners" title="ExecuteListener API"/> was driven by a feature request by Christopher Deckers, who has had the courtesy to contribute the jOOQ Console, a sample application interfacing with jOOQ's ExecuteListeners. The jOOQ Console logs all queries executed by jOOQ and displays them nicely in a Swing application. With the jOOQ Console's logger, you can:
    -						    </p>
    -						    <ul>
    -						    	<li>Activate the console's DebugListener anytime (in-process or if the remote server is active).</li>
    -						    	<li>View simple and batch queries and their parameters.</li>
    -						    	<li>Reformat queries along with syntax highlighting for better readability.</li>
    -						    	<li>View stack trace of originator of the call.</li>
    -						    	<li>Dump the stack to stdout when in an IDE, to directly navigate to relevant classes.</li>
    -						    	<li>Track execution time, binding time, parsing time, rows read, fields read.</li>
    -						    	<li>Show/hide queries depending on their type (SELECT, UPDATE, etc.).</li>
    -						    	<li>Sort any column (timing columns, queries, types, etc.)</li>
    -						    	<li>Easy copy paste of rows/columns to Spreadsheet editors.</li>
    -						    </ul>
    -
    -						    <p>
    -						    	A short overview of such a debugging session can be seen here:
    -						    </p>
    -   							<div class="screenshot">
    -								<img class="screenshot" src="&lt;?=$root?&gt;/img/jooq-console-01.png" alt="jOOQ Console example"/>
    -							</div>
    -						    <p>
    -							    Please note that the jOOQ Console is still experimental. Any feedback is very welcome on <br/>
    -							    <a href="http://groups.google.com/group/jooq-user" title="the jooq-user group">the jooq-user group</a>
    -							</p>
    -
    -							<h3>jOOQ Console operation modes</h3>
    -							<p>
    -								The jOOQ Console can be run in two different modes:
    -							</p>
    -							<ul>
    -								<li>In-process mode: running in the same process as the queries you're analysing</li>
    -								<li>"headless" mode: running remotely</li>
    -							</ul>
    -
    -							<p>
    -								Both modes will require that you set the <reference class="org.jooq.debug.impl.DebugListener"/> in the Configuration:
    -							</p>
    -
    -</html><java><![CDATA[// Create a configuration with an appropriate listener provider:
    -Configuration configuration = new DefaultConfiguration.set(connection).set(dialect);
    -configuration.set(new DefaultExecuteListenerProvider(new org.jooq.debug.impl.DebugListener()));
    -
    -// Create a DSLContext from the above configuration
    -DSLContext create = DSL.using(configuration);]]></java><html>
    -
    -							<h3>In-process mode</h3>
    -							<p>
    -								The in-process mode is useful for Swing applications or other, locally run Java programs accessing the database via jOOQ. In order to launch the jOOQ Console "in-process", specify the previously documented settings and launch the Console as follows:
    -							</p>
    -
    -</html><java><![CDATA[// Define a DatabaseDescriptor for the "in-process" mode
    -// It is needed for the "Editor" tab
    -DatabaseDescriptor descriptor = new DatabaseDescriptor() {
    -
    -    // Return your generated schema. This is used by the console
    -    // to introspect your schema data
    -    @Override
    -    public Schema getSchema() {
    -        return com.example.MySchema.MY_SCHEMA;
    -    }
    -
    -    // Return the SQL dialect that you're using
    -    @Override
    -    public SQLDialect getSQLDialect() {
    -        return SQLDialect.ORACLE;
    -    }
    -
    -    // Return a connection
    -    @Override
    -    public Connection createConnection() {
    -        try {
    -            return DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "test", "test");
    -        }
    -        catch (Exception ignore) {}
    -    }
    -};
    -
    -// Now pass this database descriptor to the Console and make it visible
    -try {
    -
    -    // Use this for a nicer look-and-feel
    -    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    -
    -    // Create a new Console
    -    Console console = new Console(descriptor, true);
    -    console.setLoggingActive(true);
    -    console.setVisible(true);
    -}
    -catch (Exception ignore) {}
    -]]></java><html>
    -
    -							<p>
    -								Only in the in-process mode, you can execute ad-hoc queries directly from the console, if you provide it with proper DatabaseDescriptor. These queries are executed from the Editor pane which features:
    -							</p>
    -							<ul>
    -								<li>SQL editing within the console.</li>
    -								<li>Incremental search on tables.</li>
    -								<li>Simple code completion with tables/columns/SQL keywords.</li>
    -								<li>Syntax highlighting and formatting capabilities.</li>
    -								<li>Results shown in one or several tabs.</li>
    -								<li>Easy analysis of Logger output by copy/pasting/running queries in the Editor.</li>
    -							</ul>
    -   							<div class="screenshot">
    -								<img class="screenshot" src="&lt;?=$root?&gt;/img/jooq-console-02.png" alt="jOOQ Console example"/>
    -							</div>
    -
    -                            <h3>"Headless" mode</h3>
    -							<p>
    -								In J2EE or other server/client environments, you may not be able to run the console in the same process as your application. You can then run the jOOQ Console in "headless" mode. In addition to the previously documented settings, you'll have to start a debugger server in your application process, that the console can connect to:
    -							</p>
    -
    -</html><java>// Create a new RemoteDebuggerServer in your application that listens to
    -// incoming connections on a given port
    -SERVER = new RemoteDebuggerServer(DEBUGGER_PORT);</java><html>
    -
    -							<p>
    -								Now start your application along with the debugger server and launch the console with this command:
    -							</p>
    -
    -</html><config>java -jar jooq-console-{jooq-version}.jar [host] [port]</config><html>
    -
    -							<p>
    -								Depending on your distribution, you may have to manually add rsyntaxtextarea-2.0.2.jar and jOOQ artefacts on your classpath.
    -							</p>
    -						</html></content>
    -					</section>
    -				</sections>
    -			</section>
    -
    -			<section id="reference">
    -				<title>Reference</title>
    -				<content><html>
    -					<p>
    -						These chapters hold some general jOOQ reference information
    -					</p>
    -				</html></content>
    -
    -				<sections>
    -					<section id="supported-rdbms">
    -						<title>Supported RDBMS</title>
    -						<content><html>
    -							<h3>A list of supported databases</h3>
    -							<p>
    -						   		Every RDMBS out there has its own little specialties. jOOQ considers those specialties as much as possible, while trying to standardise the behaviour in jOOQ. In order to increase the quality of jOOQ, some 70 unit tests are run for syntax and variable binding verification, as well as some 180 integration tests with an overall of around 1200 queries for any of these databases:
    -					   		</p>
    -							<ul>
    -							    <li>CUBRID 8.4.1 and 9.0.0</li>
    -							    <li>DB2 9.7</li>
    -							    <li>Derby 10.8</li>
    -							    <li>Firebird 2.5.1</li>
    -							    <li>H2 1.3.161</li>
    -							    <li>HSQLDB 2.2.5</li>
    -							    <li>Ingres 10.1.0</li>
    -							    <li>MySQL 5.1.41 and 5.5.8</li>
    -							    <li>Oracle XE 10.2.0.1.0 and 11g</li>
    -							    <li>PostgreSQL 9.0</li>
    -							    <li>SQLite with inofficial JDBC driver v056</li>
    -							    <li>SQL Server 2008 R8 and 2012</li>
    -							    <li>Sybase Adaptive Server Enterprise 15.5</li>
    -							    <li>Sybase SQL Anywhere 12</li>
    -							</ul>
    -							<p>
    -								These platforms have been observed to work as well, but are not integration-tested
    -							</p>
    -							<ul>
    -								<li>Google Cloud SQL (MySQL)</li>
    -							</ul>
    -								
    -							<h3>Databases planned for support</h3>
    -							<p>
    -								Any of the following databases might be available in the future
    -							</p>
    -						    <ul>
    -							    <li>Informix</li>
    -							    <li>Interbase</li>
    -							    <li>MS Access</li>
    -							    <li>MS Excel</li>
    -							    <li>SQL Azure</li>
    -							    <li>Sybase SQL Anywhere OnDemand</li>
    -							    <li>Teradata</li>
    -						    </ul>
    -						    
    -							<h3>Databases being watched</h3>
    -							<p>
    -								Any of the following databases are being observed for a potential integration
    -							</p>
    -							<ul>
    -								<li>Mondrian</li>
    -								<li>Netezza</li>
    -								<li>SQLFire</li>
    -								<li>Vectorwise</li>
    -								<li>Vertica</li>
    -								<li>VoltDB</li>
    -							</ul>
    -
    -							<h3>Feature matrix</h3>
    -							<p>
    -								This section will soon contain a feature matrix, documenting what feature is available for which database.
    -							</p>
    -						</html></content>
    -					</section>
    -
    -					<section id="reference-data-types">
    -						<title>Data types</title>
    -						<content><html>
    -							<p>
    -								There is always a small mismatch between SQL data types and Java data types. This is for two reasons:
    -							</p>
    -							<ul>
    -								<li>SQL data types are insufficiently covered by the JDBC API.</li>
    -								<li>Java data types are often less expressive than SQL data types</li>
    -							</ul>
    -							<p>
    -								This chapter should document the most important notes about SQL, JDBC and jOOQ data types.
    -							</p>
    -						</html></content>
    -						
    -						<sections>
    -							<section id="data-types-lobs">
    -								<title>BLOBs and CLOBs</title>
    -								<content><html>
    -									<p>
    -										jOOQ currently doesn't explicitly support JDBC BLOB and CLOB data types. If you use any of these data types in your database, jOOQ will map them to byte[] and String instead. In simple cases (small data), this simplification is sufficient. In more sophisticated cases, you may have to bypass jOOQ, in order to deal with these data types and their respective resources. True support for LOBs is on the roadmap, though.
    -									</p>
    -								</html></content>
    -							</section>
    -							
    -							<section id="data-types-unsigned">
    -								<title>Unsigned integer types</title>
    -								<content><html>
    -									<p>
    -										Some databases explicitly support unsigned integer data types. In most normal JDBC-based applications, they would just be mapped to their signed counterparts letting bit-wise shifting and tweaking to the user. jOOQ ships with a set of unsigned <reference class="java.lang.Number"/> implementations modelling the following types:
    -									</p>
    -									<ul>
    -										<li><reference class="org.jooq.types.UByte"/>: Unsigned byte, an 8-bit unsigned integer</li>
    -										<li><reference class="org.jooq.types.UShort"/>: Unsigned short, a 16-bit unsigned integer</li>
    -										<li><reference class="org.jooq.types.UInteger"/>: Unsigned int, a 32-bit unsigned integer</li>
    -										<li><reference class="org.jooq.types.ULong"/>: Unsigned long, a 64-bit unsigned integer</li>
    -									</ul>
    -									<p>
    -										Each of these wrapper types extends <reference class="java.lang.Number"/>, wrapping a higher-level integer type, internally:
    -									</p>
    -									<ul>
    -										<li>UByte wraps <reference class="java.lang.Short"/></li>
    -										<li>UShort wraps <reference class="java.lang.Integer"/></li>
    -										<li>UInteger wraps <reference class="java.lang.Long"/></li>
    -										<li>ULong wraps <reference class="java.math.BigInteger"/></li>
    -									</ul>
    -								</html></content>
    -							</section>
    -							
    -							<section id="data-types-intervals">
    -								<title>INTERVAL data types</title>
    -								<content><html>
    -									<p>
    -										jOOQ fills a gap opened by JDBC, which neglects an important SQL data type as defined by the SQL standards: INTERVAL types. SQL knows two different types of intervals:
    -									</p>
    -									<ul>
    -										<li><strong>YEAR TO MONTH</strong>: This interval type models a number of months and years</li>
    -										<li><strong>DAY TO SECOND</strong>: This interval type models a number of days, hours, minutes, seconds and milliseconds</li>
    -									</ul>
    -									
    -									<p>
    -										Both interval types ship with a variant of subtypes, such as DAY TO HOUR, HOUR TO SECOND, etc. jOOQ models these types as Java objects extending <reference class="java.lang.Number"/>: <reference class="org.jooq.types.YearToMonth"/> (where Number.intValue() corresponds to the absolute number of months) and <reference class="org.jooq.types.DayToSecond"/> (where Number.intValue() corresponds to the absolute number of milliseconds)
    -									</p>
    -									
    -									<h3>Interval arithmetic</h3>
    -									<p>
    -										In addition to the <reference id="arithmetic-expressions" title="arithmetic expressions"/> documented previously, interval arithmetic is also supported by jOOQ. Essentially, the following operations are supported:
    -									</p>
    -									<ul>
    -										<li>DATETIME - DATETIME => INTERVAL</li>
    -										<li>DATETIME + or - INTERVAL => DATETIME</li>
    -										<li>INTERVAL + DATETIME => DATETIME</li>
    -										<li>INTERVAL + - INTERVAL => INTERVAL</li>
    -										<li>INTERVAL * or / NUMERIC => INTERVAL</li>
    -										<li>NUMERIC * INTERVAL => INTERVAL</li>
    -									</ul>
    -								</html></content>
    -							</section>
    -							
    -							<section id="data-types-xml">
    -								<title>XML data types</title>
    -								<content><html>
    -									<p>
    -										XML data types are currently not supported
    -									</p>
    -								</html></content>
    -							</section>
    -							
    -							<section id="data-types-geospacial">
    -								<title>Geospacial data types</title>
    -								<content><html>
    -									<h3>Geospacial data types</h3>
    -									<p>
    -										Geospacial data types are currently not supported
    -									</p>
    -								</html></content>
    -							</section>
    -							
    -							<section id="data-types-cursors">
    -								<title>CURSOR data types</title>
    -								<content><html>
    -									<p>
    -										Some databases support cursors returned from stored procedures. They are mapped to the following jOOQ data type:
    -									</p>
    -
    -</html><java><![CDATA[Field<Result<Record>> cursor;]]></java><html>
    -									
    -									<p>
    -										In fact, such a cursor will be fetched immediately by jOOQ and wrapped in an <reference class="org.jooq.Result"/> object.
    -									</p>
    -								</html></content>
    -							</section>
    -							
    -							<section id="data-types-arrays">
    -								<title>ARRAY and TABLE data types</title>
    -								<content><html>
    -									<p>
    -										The SQL standard specifies ARRAY data types, that can be mapped to Java arrays as such:
    -									</p>
    -									
    -</html><java><![CDATA[Field<Integer[]> intArray;]]></java><html>
    -										
    -									<p>
    -										The above array type is supported by these SQL dialects:
    -									</p>
    -									<ul>
    -										<li>H2</li>
    -										<li>HSQLDB</li>
    -										<li>Postgres</li>
    -									</ul>
    -									
    -									<h3>Oracle typed arrays</h3>
    -									<p>
    -										Oracle has strongly-typed arrays and table types (as opposed to the previously seen anonymously typed arrays). These arrays are wrapped by <reference class="org.jooq.ArrayRecord"/> types.
    -									</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -                    <section id="dsl-mapping-rules">
    -                        <title>SQL to DSL mapping rules</title>
    -                        <content><html>
    -                            <p>
    -                                jOOQ takes SQL as an external domain-specific language and maps it onto Java, creating an internal domain-specific language. Internal DSLs cannot 100% implement their external language counter parts, as they have to adhere to the syntax rules of their host or target language (i.e. Java). This section explains the various problems and workarounds encountered and implemented in jOOQ.
    -                            </p>
    -                            
    -                            <h3>SQL allows for "keywordless" syntax</h3>
    -                            <p>
    -                                SQL syntax does not always need keywords to form expressions. The <code><reference id="update-statement" title="UPDATE .. SET"/></code> clause takes various argument assignments:
    -                            </p>
    -     
    -</html><code-pair>
    -<sql>UPDATE t SET a = 1, b = 2</sql><java>update(t).set(a, 1).set(b, 2)</java>
    -</code-pair><html>
    -
    -                            <p>
    -                                The above example also shows missing operator overloading capabilities, where <code>"="</code> is replaced by <code>","</code> in jOOQ. Another example are <reference id="row-value-expressions" title="row value expressions"/>, which can be formed with parentheses only in SQL:
    -                            </p>
    -
    -</html><code-pair>
    -<sql>(a, b) IN ((1, 2), (3, 4))</sql><java>row(a, b).in(row(1, 2), row(3, 4))</java>
    -</code-pair><html>
    -
    -                            <p>
    -                                In this case, <code>ROW</code> is an actual (optional) SQL keyword, implemented by at least PostgreSQL.
    -                            </p>
    -                            
    -                            <h3>SQL contains "composed" keywords</h3>
    -                            <p>
    -                                As most languages, SQL does not attribute any meaning to whitespace. However, whitespace is important when forming "composed" keywords, i.e. SQL clauses composed of several keywords. jOOQ follows standard Java method naming conventions to map SQL keywords (case-insensitive) to Java methods (case-sensitive, camel-cased). Some examples:
    -                            </p>
    -                            
    -</html><code-pair>
    -<sql>GROUP BY
    -ORDER BY
    -WHEN MATCHED THEN UPDATE</sql><java>groupBy()
    -orderBy()
    -whenMatchedThenUpdate()</java>
    -</code-pair><html>
    -
    -                            <p>
    -                                Future versions of jOOQ may use all-uppercased method names in addition to the camel-cased ones (to prevent collisions with Java keywords):
    -                            </p>
    -                            
    -</html><code-pair>
    -<sql>GROUP BY
    -ORDER BY
    -WHEN MATCHED THEN UPDATE</sql><java>GROUP_BY()
    -ORDER_BY()
    -WHEN_MATCHED_THEN_UPDATE()</java>
    -</code-pair><html>
    -
    -                            <h3>SQL contains "superfluous" keywords</h3>
    -                            <p>
    -                                Some SQL keywords aren't really necessary. They are just part of a keyword-rich language, the way Java developers aren't used to anymore. These keywords date from times when languages such as ADA, BASIC, COBOL, FORTRAN, PASCAL were more verbose:
    -                            </p>
    -                            <ul>
    -                                <li><code>BEGIN .. END</code></li>
    -                                <li><code>REPEAT .. UNTIL</code></li>
    -                                <li><code>IF .. THEN .. ELSE .. END IF</code></li>
    -                            </ul>
    -                            <p>
    -                                jOOQ omits some of those keywords when it is too tedious to write them in Java.
    -                            </p>
    -
    -</html><code-pair>
    -<sql>CASE WHEN .. THEN .. END</sql><java>decode().when(.., ..)</java>
    -</code-pair><html>
    -
    -                            <p>
    -                                The above example omits <code>THEN</code> and <code>END</code> keywords in Java. Future versions of jOOQ may comprise a more complete DSL, including such keywords again though, to provide a more 1:1 match for the SQL language.
    -                            </p>
    -                            
    -                            <h3>SQL contains "superfluous" syntactic elements</h3>
    -                            <p>
    -                                Some SQL constructs are hard to map to Java, but they are also not really necessary. SQL often expects syntactic parentheses where they wouldn't really be needed, or where they feel slightly inconsistent with the rest of the SQL language. 
    -                            </p>
    -
    -</html><code-pair>
    -<sql>LISTAGG(a, b) WITHIN GROUP (ORDER BY c)
    -              OVER (PARTITION BY d)</sql><java>listagg(a, b).withinGroupOrderBy(c)
    -             .over().partitionBy(d)</java>
    -</code-pair><html>
    -
    -                            <p>
    -                                The parentheses used for the <code>WITHIN GROUP (..)</code> and <code>OVER (..)</code> clauses are required in SQL but do not seem to add any immediate value. In some cases, jOOQ omits them, although the above might be optionally re-phrased in the future to form a more SQLesque experience:  
    -                            </p>
    -
    -</html><code-pair>
    -<sql>LISTAGG(a, b) WITHIN GROUP (ORDER BY c)
    -              OVER (PARTITION BY d)</sql><java>listagg(a, b).withinGroup(orderBy(c))
    -             .over(partitionBy(d))</java>
    -</code-pair><html>
    -
    -                            <h3>SQL uses some of Java's reserved words</h3>
    -                            <p>
    -                                Some SQL keywords map onto <a href="http://download.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html">Java Language Keywords</a> if they're mapped using camel-casing. These keywords currently include: 
    -                            </p>
    -                            <ul>
    -                                <li><code>CASE</code></li>
    -                                <li><code>ELSE</code></li>
    -                                <li><code>FOR</code></li>
    -                            </ul>
    -
    -                            <p>
    -                                jOOQ replaces those keywords by "synonyms":
    -                            </p>
    -                            
    -</html><code-pair>
    -<sql>CASE .. ELSE
    -PIVOT .. FOR .. IN ..</sql><java>decode() .. otherwise()
    -pivot(..).on(..).in(..)</java>
    -</code-pair><html>           
    -
    -                            <p>
    -                                There is more future collision potential with:
    -                            </p>
    -                            <ul>
    -                                <li><code>BOOLEAN</code></li>
    -                                <li><code>CHAR</code></li>
    -                                <li><code>DEFAULT</code></li>
    -                                <li><code>DOUBLE</code></li>
    -                                <li><code>ENUM</code></li>
    -                                <li><code>FLOAT</code></li>
    -                                <li><code>IF</code></li>
    -                                <li><code>INT</code></li>
    -                                <li><code>LONG</code></li>
    -                                <li><code>PACKAGE</code></li>
    -                            </ul>
    -
    -                            <h3>SQL operators cannot be overloaded in Java</h3>
    -                            <p>
    -                                Most SQL operators have to be mapped to descriptive method names in Java, as Java does not allow operator overloading:
    -                            </p>
    -                            
    -</html><code-pair>
    -<sql><![CDATA[=
    -<>, !=
    -||
    -SET a = b]]></sql><java>equal(), eq()
    -notEqual(), ne()
    -concat()
    -set(a, b)</java>
    -</code-pair><html>
    -
    -                            <p>
    -                                For those users using <reference id="scala-sql-building" title="jOOQ with Scala or Groovy"/>, operator overloading and implicit conversion can be leveraged to enhance jOOQ:
    -                            </p>
    -
    -</html><code-pair>
    -<sql><![CDATA[=
    -<>, !=
    -||]]></sql><java><![CDATA[===
    -<>, !==
    -||]]></java>
    -</code-pair><html>
    -
    -                            <h3>SQL's reference before declaration capability</h3>
    -                            <p>
    -                                This is less of a syntactic SQL feature than a semantic one. In SQL, objects can be referenced before (i.e. "lexicographically before") they are declared. This is particularly true for <reference id="aliased-tables" title="aliasing"/>
    -                            </p>
    - 
    -</html><code-pair>
    -<sql><![CDATA[SELECT t.a
    -FROM my_table t]]></sql><java><![CDATA[MyTable t = MY_TABLE.as("t");
    -select(t.a).from(t)]]></java>
    -</code-pair><html>
    -
    -                            <p>
    -                                A more sophisticated example are common table expressions (CTE), which are currently not supported by jOOQ:
    -                            </p>
    -                            
    -</html><sql>WITH t(a, b) AS (
    -  SELECT 1, 2 FROM DUAL
    -)
    -SELECT t.a, t.b
    -FROM t</sql><html>
    -
    -                            <p>
    -                                Common table expressions define a "derived column list", just like <reference id="aliased-tables" title="table aliases"/> can do. The formal record type thus created cannot be typesafely verified by the Java compiler, i.e. it is not possible to formally dereference <code>t.a</code> from <code>t</code>.
    -                            </p>
    -                        </html></content>
    -                    </section>
    -                    
    -					<section id="reference-bnf-notation">
    -						<title>jOOQ's BNF pseudo-notation</title>
    -						<content><html>
    -							<p>
    -								This chapter will soon contain an overview over jOOQ's API using a pseudo BNF notation.
    -							</p>
    -						</html></content>
    -					</section>
    -					
    -					<section id="quality-assurance">
    -						<title>Quality Assurance</title>
    -						<content><html>
    -							<p>
    -								jOOQ is running some of your most mission-critical logic: the interface layer between your Java / Scala application and the database. You have probably chosen jOOQ for any of the following reasons:
    -							</p>
    -							<ul>
    -								<li>To evade JDBC's verbosity and error-proneness due to string concatenation and index-based variable binding</li>
    -								<li>To add lots of type-safety to your inline SQL</li>
    -								<li>To increase productivity when writing inline SQL using your favourite IDE's autocompletion capabilities</li>
    -							</ul>
    -							
    -							<p>
    -								With jOOQ being in the core of your application, you want to be sure that you can trust jOOQ. That is why jOOQ is heavily unit and integration tested with a strong focus on integration tests:
    -							</p>
    -							
    -							<h3>Unit tests</h3>
    -							<p>
    -								Unit tests are performed against dummy JDBC interfaces using <a href="http://jmock.org/" title="jmock">http://jmock.org/</a>. These tests verify that various <reference class="org.jooq.QueryPart"/> implementations render correct SQL and bind variables correctly.
    -							</p>
    -							
    -							<h3>Integration tests</h3>
    -							<p>
    -								This is the most important part of the jOOQ test suites. Some 1500 queries are currently run against a standard integration test database. Both the test database and the queries are translated into every one of the 14 supported SQL dialects to ensure that regressions are unlikely to be introduced into the code base.
    -							</p>
    -							<p>
    -								For libraries like jOOQ, integration tests are much more expressive than unit tests, as there are so many subtle differences in SQL dialects. Simple mocks just don't give as much feedback as an actual database instance.
    -							</p>
    -							<p>
    -								jOOQ integration tests run the weirdest and most unrealistic queries. As a side-effect of these extensive integration test suites, many corner-case bugs for JDBC drivers and/or open source databases have been discovered, feature requests submitted through jOOQ and reported mainly to CUBRID, Derby, H2, HSQLDB.
    -							</p>
    -							
    -							<h3>Code generation tests</h3>
    -							<p>
    -								For every one of the 14 supported integration test databases, source code is generated and the tiniest differences in generated source code can be discovered. In case of compilation errors in generated source code, new test tables/views/columns are added to avoid regressions in this field.
    -							</p>
    -							
    -							<h3>API Usability tests and proofs of concept</h3>
    -							<p>
    -								jOOQ is used in jOOQ-meta as a proof of concept. This includes complex queries such as the following Postgres query
    -							</p>
    -							
    -</html><java><![CDATA[Routines r1 = ROUTINES.as("r1");
    -Routines r2 = ROUTINES.as("r2");
    -
    -for (Record record : create().select(
    -        r1.ROUTINE_SCHEMA,
    -        r1.ROUTINE_NAME,
    -        r1.SPECIFIC_NAME,
    -
    -        // Ignore the data type when there is at least one out parameter
    -        decode()
    -            .when(exists(
    -                selectOne()
    -                .from(PARAMETERS)
    -                .where(PARAMETERS.SPECIFIC_SCHEMA.equal(r1.SPECIFIC_SCHEMA))
    -                .and(PARAMETERS.SPECIFIC_NAME.equal(r1.SPECIFIC_NAME))
    -                .and(upper(PARAMETERS.PARAMETER_MODE).notEqual("IN"))),
    -                    val("void"))
    -            .otherwise(r1.DATA_TYPE).as("data_type"),
    -        r1.CHARACTER_MAXIMUM_LENGTH,
    -        r1.NUMERIC_PRECISION,
    -        r1.NUMERIC_SCALE,
    -        r1.TYPE_UDT_NAME,
    -
    -        // Calculate overload index if applicable
    -        decode().when(
    -        exists(
    -            selectOne()
    -            .from(r2)
    -            .where(r2.ROUTINE_SCHEMA.in(getInputSchemata()))
    -            .and(r2.ROUTINE_SCHEMA.equal(r1.ROUTINE_SCHEMA))
    -            .and(r2.ROUTINE_NAME.equal(r1.ROUTINE_NAME))
    -            .and(r2.SPECIFIC_NAME.notEqual(r1.SPECIFIC_NAME))),
    -            select(count())
    -            .from(r2)
    -            .where(r2.ROUTINE_SCHEMA.in(getInputSchemata()))
    -            .and(r2.ROUTINE_SCHEMA.equal(r1.ROUTINE_SCHEMA))
    -            .and(r2.ROUTINE_NAME.equal(r1.ROUTINE_NAME))
    -            .and(r2.SPECIFIC_NAME.lessOrEqual(r1.SPECIFIC_NAME)).asField())
    -        .as("overload"))
    -    .from(r1)
    -    .where(r1.ROUTINE_SCHEMA.in(getInputSchemata()))
    -    .orderBy(
    -        r1.ROUTINE_SCHEMA.asc(),
    -        r1.ROUTINE_NAME.asc())
    -    .fetch()) {
    -
    -    result.add(new PostgresRoutineDefinition(this, record));
    -}]]></java><html>
    -							<p>
    -								These rather complex queries show that the jOOQ API is fit for advanced SQL use-cases, compared to the rather simple, often unrealistic queries in the integration test suite. 
    -							</p>
    -							
    -							<h3>Clean API and implementation. Code is kept DRY</h3>
    -							<p>
    -								As a general rule of thumb throughout the jOOQ code, everything is kept <a href="http://en.wikipedia.org/wiki/DRY">DRY</a>. Some examples:
    -							</p>
    -							<ul>
    -								<li>There is only one place in the entire code base, which consumes values from a JDBC ResultSet</li>
    -								<li>There is only one place in the entire code base, which transforms jOOQ Records into custom POJOs</li>
    -							</ul>
    -							<p>
    -								Keeping things DRY leads to longer stack traces, but in turn, also increases the relevance of highly reusable code-blocks. Chances that some parts of the jOOQ code base slips by integration test coverage decrease significantly.
    -							</p>
    -						</html></content>
    -					</section>
    -					
    -					<section id="migrating-to-3.0">
    -						<title>Migrating to jOOQ 3.0</title>
    -						<content><html>
    -							<p>
    -								This section is for all users of jOOQ 2.x who wish to upgrade to the next major release. In the next sub-sections, the most important changes are explained. Some code hints are also added to help you fix compilation errors.
    -							</p>
    -							
    -							<h3>Type-safe row value expressions</h3>
    -							<p>
    -								Support for <reference id="row-value-expressions" title="row value expressions"/> has been added in jOOQ 2.6. In jOOQ 3.0, many API parts were thoroughly (but often incompatibly) changed, in order to provide you with even more type-safety. 
    -							</p>
    -							
    -							<p>
    -								Here are some affected API parts:
    -							</p>
    -							<ul>
    -								<li>[N] in Row[N] has been raised from 8 to 22. This means that existing row value expressions with degree >= 9 are now type-safe</li>
    -								<li>Subqueries returned from <code>DSL.select(...)</code> now implement <code>Select&lt;Record[N]>, not Select&lt;Record></code></li>
    -								<li><code>IN</code> predicates and comparison predicates taking subselects changed incompatibly</li>
    -								<li><code>INSERT</code> and <code>MERGE</code> statements now take typesafe <code>VALUES()</code> clauses</li>
    -							</ul>
    -							
    -							<p>
    -								Some hints related to row value expressions:
    -							</p>
    -							
    -</html><java><![CDATA[// SELECT statements are now more typesafe:
    -Record2<String, Integer> record         = create.select(BOOK.TITLE, BOOK.ID).from(BOOK).where(ID.eq(1)).fetchOne();
    -Result<Record2<String, Integer>> result = create.select(BOOK.TITLE, BOOK.ID).from(BOOK).fetch();
    -
    -// But Record2 extends Record. You don't have to use the additional typesafety:
    -Record record    = create.select(BOOK.TITLE, BOOK.ID).from(BOOK).where(ID.eq(1)).fetchOne();
    -Result<?> result = create.select(BOOK.TITLE, BOOK.ID).from(BOOK).fetch();]]></java><html>
    -							
    -							<h3>SelectQuery and SelectXXXStep are now generic</h3>
    -							<p>
    -								In order to support type-safe row value expressions and type-safe Record[N] types, SelectQuery is now generic: SelectQuery&lt;R>
    -							</p>
    -							
    -							<h3>SimpleSelectQuery and SimpleSelectXXXStep API were removed</h3>
    -							<p>
    -							    The duplication of the SELECT API is no longer useful, now that SelectQuery and SelectXXXStep are generic.
    -							</p>
    -							
    -							<h3>Factory was split into DSL (query building) and DSLContext (query execution)</h3>
    -							<p>
    -								The pre-existing Factory class has been split into two parts:
    -							</p>
    -							
    -							<ol>
    -								<li><strong>The DSL</strong>: This class contains only static factory methods. All QueryParts constructed from this class are "unattached", i.e. queries that are constructed through DSL cannot be executed immediately. This is useful for subqueries.<br/>The DSL class corresponds to the static part of the jOOQ 2.x Factory type</li>
    -								<li><strong>The DSLContext</strong>: This type holds a reference to a Configuration and can construct executable ("attached") QueryParts.<br/>The DSLContext type corresponds to the non-static part of the jOOQ 2.x Factory / FactoryOperations type.</li>
    -							</ol>
    -							
    -							<p>
    -								The FactoryOperations interface has been renamed to DSLContext. An example:
    -							</p>
    -							
    -</html><java><![CDATA[// jOOQ 2.6, check if there are any books
    -Factory create = new Factory(connection, dialect);
    -create.selectOne()
    -      .whereExists(
    -        create.selectFrom(BOOK) // Reuse the factory to create subselects
    -      ).fetch();                // Execute the "attached" query
    -
    -// jOOQ 3.0
    -DSLContext create = DSL.using(connection, dialect);
    -create.selectOne()
    -      .whereExists(
    -        selectFrom(BOOK)        // Create a static subselect from the DSL
    -      ).fetch();                // Execute the "attached" query]]></java><html>							
    -							
    -							<h3>Quantified comparison predicates</h3>
    -							<p>
    -								Field.equalAny(...) and similar methods have been removed in favour of Field.equal(any(...)). This greatly simplified the Field API. An example:
    -							</p>
    -							
    -</html><java><![CDATA[// jOOQ 2.6
    -Condition condition = BOOK.ID.equalAny(create.select(BOOK.ID).from(BOOK));
    -
    -// jOOQ 3.0 adds some typesafety to comparison predicates involving quantified selects
    -QuantifiedSelect<Record1<Integer>> subselect = any(select(BOOK.ID).from(BOOK));
    -Condition condition = BOOK.ID.equal(subselect);]]></java><html>							
    -							
    -							<h3>FieldProvider</h3>
    -							<p>
    -								The FieldProvider marker interface was removed. Its methods still exist on FieldProvider subtypes. Note, they have changed names from <code>getField()</code> to <code>field()</code> and from <code>getIndex()</code> to <code>indexOf()</code>
    -							</p>
    -							
    -							<h3>GroupField</h3>
    -							<p>
    -								GroupField has been introduced as a DSL marker interface to denote fields that can be passed to <code>GROUP BY</code> clauses. This includes all org.jooq.Field types. However, fields obtained from <code>ROLLUP()</code>, <code>CUBE()</code>, and <code>GROUPING SETS()</code> functions no longer implement Field. Instead, they only implement GroupField. An example:
    -							</p>
    -							
    -</html><java><![CDATA[// jOOQ 2.6
    -Field<?>   field1a = Factory.rollup(...); // OK
    -Field<?>   field2a = Factory.one();       // OK
    -
    -// jOOQ 3.0
    -GroupField field1b = DSL.rollup(...); // OK
    -Field<?>   field1c = DSL.rollup(...); // Compilation error
    -GroupField field2b = DSL.one();       // OK
    -Field<?>   field2c = DSL.one();       // OK]]></java><html>
    -							
    -							<h3>NULL predicate</h3>
    -							<p>
    -							   Beware! Previously, Field.equal(null) was translated internally to an IS NULL predicate. This is no longer the case. Binding Java "null" to a comparison predicate will result in a regular comparison predicate (which never returns true). This was changed for several reasons:
    -							</p>
    -							
    -							<ul>
    -								<li>To most users, this was a surprising "feature".</li>
    -								<li>Other predicates didn't behave in such a way, e.g. the IN predicate, the BETWEEN predicate, or the LIKE predicate.</li>
    -								<li>Variable binding behaved unpredictably, as IS NULL predicates don't bind any variables.</li>
    -								<li>The generated SQL depended on the possible combinations of bind values, which creates unnecessary hard-parses every time a new unique SQL statement is rendered.</li>
    -							</ul>
    -							
    -							<p>
    -								Here is an example how to check if a field has a given value, without applying SQL's ternary NULL logic:
    -							</p>
    -
    -</html><java><![CDATA[String possiblyNull = null; // Or else...
    -
    -// jOOQ 2.6
    -Condition condition1 = BOOK.TITLE.equal(possiblyNull);
    -
    -// jOOQ 3.0
    -Condition condition2 = BOOK.TITLE.equal(possiblyNull).or(BOOK.TITLE.isNull().and(val(possiblyNull).isNull()));
    -Condition condition3 = BOOK.TITLE.isNotDistinctFrom(possiblyNull);]]></java><html>
    -							
    -							<h3>Configuration</h3>
    -							<p>
    -								<code>DSLContext</code>, <code>ExecuteContext</code>, <code>RenderContext</code>, <code>BindContext</code> no longer extend <code>Configuration</code> for "convenience". From jOOQ 3.0 onwards, composition is chosen over inheritance as these objects are not really configurations. Most importantly
    -							</p>
    -							<ul>
    -								<li><code>DSLContext</code> is only a DSL entry point for constructing "attached" QueryParts</li>
    -								<li><code>ExecuteContext</code> has a well-defined lifecycle, tied to that of a single query execution</li>
    -								<li><code>RenderContext</code> has a well-defined lifecycle, tied to that of a single rendering operation</li>
    -								<li><code>BindContext</code> has a well-defined lifecycle, tied to that of a single variable binding operation</li>
    -							</ul>
    -							<p>
    -								In order to resolve confusion that used to arise because of different lifecycle durations, these types are now no longer formally connected through inheritance.
    -							</p>
    -							
    -							<h3>ConnectionProvider</h3>
    -							<p>
    -							    In order to allow for simpler connection / data source management, jOOQ externalised connection handling in a new ConnectionProvider type. The previous two connection modes are maintained backwards-compatibly (JDBC standalone connection mode, pooled DataSource mode). Other connection modes can be injected using:
    -							</p>
    -
    -</html><java><![CDATA[public interface ConnectionProvider {
    -
    -    // Provide jOOQ with a connection
    -    Connection acquire() throws DataAccessException;
    -  
    -    // Get a connection back from jOOQ
    -    void release(Connection connection) throws DataAccessException;
    -}]]></java><html>
    -							
    -							<p>
    -							    These are some side-effects of the above change
    -							</p>
    -							
    -							<ul>
    -								<li>Connection-related JDBC wrapper utility methods (commit, rollback, etc) have been moved to the new DefaultConnectionProvider. They're no longer available from the DSLContext. This had been confusing to some users who called upon these methods while operating in pool DataSource mode.</li>
    -							</ul>
    -							
    -							<h3>ExecuteListeners</h3>
    -							<p>
    -								ExecuteListeners can no longer be configured via Settings. Instead they have to be injected into the Configuration. This resolves many class loader issues that were encountered before. It also helps listener implementations control their lifecycles themselves.
    -							</p>
    -							
    -							<h3>Data type API</h3>
    -							<p>
    -								The data type API has been changed drastically in order to enable some new DataType-related features. These changes include:
    -							</p>
    -
    -							<ul>
    -								<li>[SQLDialect]DataType and SQLDataType no longer implement DataType. They're mere constant containers</li>
    -								<li>Various minor API changes have been done.</li>
    -							</ul>
    -														
    -							<h3>Object renames</h3>
    -							<p>
    -								These objects have been moved / renamed:
    -							</p>
    -							
    -							<ul>
    -								<li>jOOU: a library used to represent unsigned integer types was moved from <code>org.jooq.util.unsigned</code> to <code>org.jooq.util.types</code> (which already contained INTERVAL data types)</li>
    -							</ul>
    -							
    -							<h3>Feature removals</h3>
    -							<p>
    -								Here are some minor features that have been removed in jOOQ 3.0
    -							</p>
    -
    -							<ul>
    -								<li>The ant task for code generation was removed, as it was not up to date at all. Code generation through ant can be performed easily by calling jOOQ's GenerationTool through a &lt;java> target.</li>
    -								<li>The navigation methods and "foreign key setters" are no longer generated in Record classes, as they are useful only to few users and the generated code is very collision-prone.</li>
    -								<li>The code generation configuration no longer accepts comma-separated regular expressions. Use the regex pipe | instead.</li>
    -								<li>The code generation configuration can no longer be loaded from .properties files. Only XML configurations are supported.</li>
    -								<li>The master data type feature is no longer supported. This feature was unlikely to behave exactly as users expected. It is better if users write their own code generators to generate master enum data types from their database tables. jOOQ's enum mapping and converter features sufficiently cover interacting with such user-defined types.</li>
    -								<li>The DSL subtypes are no longer instanciable. As DSL now only contains static methods, subclassing is no longer useful. There are still dialect-specific DSL types providing static methods for dialect-specific functions. But the code-generator no longer generates a schema-specific DSL</li>
    -								<li>The concept of a "main key" is no longer supported. The code generator produces UpdatableRecords only if the underlying table has a PRIMARY KEY. The reason for this removal is the fact that "main keys" are not reliable enough. They were chosen arbitrarily among UNIQUE KEYs.</li>
    -								<li>The UpdatableTable type has been removed. While adding significant complexity to the type hierarchy, this type adds not much value over a simple <code>Table.getPrimaryKey() != null</code> check.</li>
    -							    <li>The <code>USE</code> statement support has been removed from jOOQ. Its behaviour was ill-defined, while it didn't work the same way (or didn't work at all) in some databases.</li>
    -                            </ul>
    -						</html></content>
    -					</section>
    -
    -					<!-- 
    -					<section id="reference-glossary">
    -					  Analytical function -> window function
    -					  Arity -> Degree
    -					  AST
    -					  Batch
    -					  BNF
    -					  Catalog
    -					  Clause
    -					  Code generation
    -					  Column -> Field
    -					  Column expression
    -					  Common table expression
    -					  Condition -> Predicate
    -					  Configuration
    -					  Connection
    -					  Console
    -					  CRUD -> OLTP
    -					  DAO
    -					  Database
    -					  DataSource
    -					  Degree
    -					  Dialect
    -					  Domain Specific language (internal / external)
    -                      DSL
    -                      DSLContext
    -					  Execute
    -					  Execute listener
    -					  Execution lifecycle
    -					  Export
    -					  Expression
    -					  Fetch
    -					  Field
    -					  Function
    -					  Generic R-type
    -					  Generic T-type
    -					  JDBC
    -					  JPQL
    -					  Hibernate
    -					  Hierarchical query
    -					  HQL
    -					  Identifier
    -					  Import
    -					  Keyword
    -					  LINQ
    -					  Literal
    -					  Locking (optimistic / pessimistic)
    -					  Name -> Identifier
    -					  OLAP
    -					  OLTP
    -					  Pivot
    -					  POJO
    -					  Predicate
    -					  PreparedStatement
    -					  Procedure
    -					  Projection
    -					  Query
    -					  Schema
    -					  Settings
    -					  SLICK
    -					  SQL
    -					  SQL building
    -					  SQL execution
    -					  SQL standard
    -					  Statement
    -					  Table
    -					  Table expression
    -					  Record
    -					  Row
    -					  Row value expression
    -					  Result
    -					  ResultQuery
    -					  UDT
    -					  View
    -					  Window function
    -					
    -					</section>
    -					  -->
    -
    -					<section id="reference-credits">
    -						<title>Credits</title>
    -						<content><html>
    -							<p>
    -								jOOQ lives in a very challenging ecosystem. The Java to SQL interface is still one of the most important system interfaces. Yet there are still a lot of open questions, best practices and no "true" standard has been established. This situation gave way to a lot of tools, APIs, utilities which essentially tackle the same problem domain as jOOQ. jOOQ has gotten great inspiration from pre-existing tools and this section should give them some credit. Here is a list of inspirational tools in alphabetical order:
    -							</p>
    -							<ul>
    -								<li><a href="http://avaje.org">Avajé EBean</a>: Play! Framework's preferred ORM has a feature called asynchronous query execution. This idea made it into jOOQ as <reference class="org.jooq.ResultQuery" anchor="#fetchLater()"/></li>
    -								<li><a href="http://www.hibernate.org">Hibernate</a>: The de-facto standard (JPA) with its useful table-to-POJO mapping features have influenced jOOQ's <reference class="org.jooq.ResultQuery" anchor="#fetchInto(java.lang.Class)"/> facilities</li>
    -								<li><a href="http://www.h2database.com/html/jaqu.html">JaQu</a>: H2's own fluent API for querying databases</li>
    -								<li><a href="http://www.oracle.com/technetwork/java/javaee/tech/persistence-jsp-140049.html">JPA</a>: The de-facto standard in the javax.persistence packages, supplied by Oracle. Its annotations are useful to jOOQ as well.</li>
    -								<li><a href="http://onewebsql.com">OneWebSQL</a>: A commercial SQL abstraction API with support for DAO source code generation, which was integrated also in jOOQ</li>
    -								<li><a href="http://www.querydsl.com">QueryDSL</a>: A "LINQ-port" to Java. It has a similar fluent API, a similar code-generation facility, yet quite a different purpose. While jOOQ is all about SQL, QueryDSL (like LINQ) is mostly about querying.</li>
    -								<li><a href="http://slick.typesafe.com">SLICK</a>: A "LINQ-like" database abstraction layer for Scala. Unlike LINQ, its API doesn't really remind of SQL. Instead, it makes SQL look like Scala.</li>
    -								<li><a href="http://www.springsource.org/features/data-access">Spring Data</a>: Spring's JdbcTemplate knows RowMappers, which are reflected by jOOQ's <reference id="recordhandler"/> or <reference id="recordmapper"/></li>
    -							</ul>
    -						</html></content>
    -					</section>
    -				</sections>
    -			</section>
    -		</sections>
    -	</section>
    -</manual>
    diff --git a/jOOQ-website/src/main/resources/manual-3.2.xml b/jOOQ-website/src/main/resources/manual-3.2.xml
    deleted file mode 100644
    index 309df59369..0000000000
    --- a/jOOQ-website/src/main/resources/manual-3.2.xml
    +++ /dev/null
    @@ -1,11113 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?>
    -<!-- 
    -  * Copyright (c) 2009-2013, Data Geekery GmbH (http://www.datageekery.com)
    -  * All rights reserved.
    -  *
    -  * This work is dual-licensed
    -  * - under the Apache Software License 2.0 (the "ASL")
    -  * - under the jOOQ License and Maintenance Agreement (the "jOOQ License")
    -  * ===========================================================================
    -  * You may choose which license applies to you:
    -  *
    -  * - If you're using this work with Open Source databases, you may choose
    -  *   either ASL or jOOQ License.
    -  * - If you're using this work with at least one commercial database, you must
    -  *   choose jOOQ License
    -  *
    -  * For more information, please visit http://www.jooq.org/licenses
    -  *
    -  * Apache Software License 2.0:
    -  * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -  * Licensed under the Apache License, Version 2.0 (the "License");
    -  * you may not use this file except in compliance with the License.
    -  * You may obtain a copy of the License at
    -  *
    -  *  http://www.apache.org/licenses/LICENSE-2.0
    -  *
    -  * Unless required by applicable law or agreed to in writing, software
    -  * distributed under the License is distributed on an "AS IS" BASIS,
    -  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -  * See the License for the specific language governing permissions and
    -  * limitations under the License.
    -  *
    -  * jOOQ License and Maintenance Agreement:
    -  * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -  * Data Geekery grants the Customer the non-exclusive, timely limited and
    -  * non-transferable license to install and use the Software under the terms of
    -  * the jOOQ License and Maintenance Agreement.
    -  *
    -  * This library is distributed with a LIMITED WARRANTY. See the jOOQ License
    -  * and Maintenance Agreement for more details: http://www.jooq.org/licensing
    -  -->
    -<manual>
    -	<section id="manual">
    -		<title>The jOOQ User Manual. Multiple Pages</title>
    -		<content><html>
    -			<h2 id="Overview"><a href="#Overview" name="Overview">Overview</a></h2>
    -			<p>This manual is divided into six main sections:</p>
    -
    -			<ul>
    -				<li>
    -					<reference id="getting-started"/>
    -					<p>
    -						This section will get you started with jOOQ quickly. It contains
    -						simple explanations about what jOOQ is, what jOOQ isn't and how
    -						to set it up for the first time
    -					</p>
    -				</li>
    -				<li>
    -					<reference id="sql-building"/>
    -					<p>
    -						This section explains all about the jOOQ syntax used for building
    -						queries. It explains the central factories, the supported SQL
    -						statements and various other syntax elements
    -					</p>
    -				</li>
    -				<li>
    -					<reference id="code-generation"/>
    -					<p>
    -						This section explains how to configure and use the built-in source code
    -						generator
    -					</p>
    -				</li>
    -				<li>
    -					<reference id="sql-execution"/>
    -					<p>
    -						This section will get you through the specifics of what can be done
    -						with jOOQ at runtime, in order to execute queries, perform CRUD
    -						operations, import and export data, and hook into the jOOQ execution
    -						lifecycle for debugging
    -					</p>
    -				</li>
    -				<li>
    -					<reference id="tools"/>
    -					<p>
    -						This section is dedicated to tools that ship with jOOQ, such as the
    -						jOOQ's JDBC mocking feature
    -					</p>
    -				</li>
    -				<li>
    -					<reference id="reference"/>
    -					<p>
    -						This section is a reference for elements in this manual
    -					</p>
    -				</li>
    -			</ul>
    -		</html></content>
    -
    -		<sections>
    -			<section id="preface">
    -				<title>Preface</title>
    -				<content><html>
    -					<h3>jOOQ's reason for being - compared to JPA</h3>
    -					<p>
    -						Java and SQL have come a long way. SQL is an "ancient", yet established and well-understood technology. Java is a legacy too, although its platform JVM allows for many new and contemporary languages built on top of it. Yet, after all these years, libraries dealing with the interface between SQL and Java have come and gone, leaving JPA to be a standard that is accepted only with doubts, short of any surviving options.
    -					</p>
    -					<p>
    -						So far, there had been only few database abstraction frameworks or libraries, that truly respected SQL as a first class citizen among languages. Most frameworks, including the industry standards JPA, EJB, Hibernate, JDO, Criteria Query, and many others try to hide SQL itself, minimising its scope to things called JPQL, HQL, JDOQL and various other inferior query languages
    -					</p>
    -					<p>
    -						jOOQ has come to fill this gap.
    -					</p>
    -
    -					<h3>jOOQ's reason for being - compared to LINQ</h3>
    -					<p>
    -						Other platforms incorporate ideas such as LINQ (with LINQ-to-SQL), or Scala's SLICK, or also Java's QueryDSL to better integrate querying as a concept into their respective language. By querying, they understand querying of arbitrary targets, such as SQL, XML, Collections and other heterogeneous data stores. jOOQ claims that this is going the wrong way too.
    -					</p>
    -					<p>
    - 						In more advanced querying use-cases (more than simple CRUD and the occasional JOIN), people will want to profit from the expressivity of SQL. Due to the relational nature of SQL, this is quite different from what object-oriented and partially functional languages such as C#, Scala, or Java can offer.
    - 					</p>
    - 					<p>
    - 						It is very hard to formally express and validate joins and the ad-hoc table expression types they create. It gets even harder when you want support for more advanced table expressions, such as pivot tables, unnested cursors, or just arbitrary projections from derived tables. With a very strong object-oriented typing model, these features will probably stay out of scope.
    - 					</p>
    - 					<p>
    - 						In essence, the decision of creating an API that looks like SQL or one that looks like C#, Scala, Java is a definite decision in favour of one or the other platform. While it will be easier to evolve SLICK in similar ways as LINQ (or QueryDSL in the Java world), SQL feature scope that clearly communicates its underlying intent will be very hard to add, later on (e.g. how would you model Oracle's partitioned outer join syntax? How would you model ANSI/ISO SQL:1999 grouping sets? How can you support scalar subquery caching? etc...).					
    -					</p>
    -					<p>
    -						jOOQ has come to fill this gap.
    -					</p>
    -					
    -					<h3>jOOQ's reason for being - compared to SQL / JDBC</h3>
    -					<p>
    -						So why not just use SQL?
    -					</p> 
    -					<p>
    -						SQL can be written as plain text and passed through the JDBC API. Over the years, people have become wary of this approach for many reasons:
    -					</p>
    -					<ul>
    -						<li>No typesafety</li>
    -						<li>No syntax safety</li>
    -						<li>No bind value index safety</li>
    -						<li>Verbose SQL String concatenation</li>
    -						<li>Boring bind value indexing techniques</li>
    -						<li>Verbose resource and exception handling in JDBC</li>
    -						<li>A very "stateful", not very object-oriented JDBC API, which is hard to use</li>
    -					</ul>
    -					<p>
    -						For these many reasons, other frameworks have tried to abstract JDBC away in the past in one way or another. Unfortunately, many have completely abstracted SQL away as well
    -					</p>
    -					<p>
    -						jOOQ has come to fill this gap.
    -					</p>					
    -					
    -					<h3>jOOQ is different</h3>
    -					<p>
    -						SQL was never meant to be abstracted. To be confined in the narrow boundaries of heavy mappers, hiding the beauty and simplicity of relational data. SQL was never meant to be object-oriented. SQL was never meant to be anything other than... SQL!
    -					</p>					
    -				</html></content>
    -			</section>
    -			
    -			<section id="copyright">
    -				<title>Copyright, License, and Trademarks</title>
    -				<content>
    -                    <html>
    -                        <p>
    -                            This section lists the various licenses that apply to different versions of jOOQ. Prior to version 3.2, jOOQ was shipped for free under the terms of the <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache Software License 2.0</a>. With jOOQ 3.2, jOOQ became dual-licensed: <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache Software License 2.0</a> (for use with Open Source databases) and <a href="http://www.jooq.org/licensing">commercial</a> (for use with commercial databases). Please contact <a href="mailto:sales@datageekery.com">sales@datageekery.com</a>, should you have any questions regarding licensing.
    -                        </p>
    -                        <h3>License for jOOQ 3.2 and later</h3>
    -                    </html>
    -                    
    -<text>Copyright (c) 2009-2013, Data Geekery GmbH (http://www.datageekery.com)
    -All rights reserved.
    -
    -This work is dual-licensed
    -- under the Apache Software License 2.0 (the "ASL")
    -- under the jOOQ License and Maintenance Agreement (the "jOOQ License")
    -=============================================================================
    -You may choose which license applies to you:
    -
    -- If you're using this work with Open Source databases, you may choose
    -  either ASL or jOOQ License.
    -- If you're using this work with at least one commercial database, you must
    -  choose jOOQ License
    -
    -For more information, please visit http://www.jooq.org/licenses
    -
    -Apache Software License 2.0:
    ------------------------------------------------------------------------------
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    - http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -
    -jOOQ License and Maintenance Agreement:
    ------------------------------------------------------------------------------
    -Data Geekery grants the Customer the non-exclusive, timely limited and
    -non-transferable license to install and use the Software under the terms of
    -the jOOQ License and Maintenance Agreement.
    -
    -This library is distributed with a LIMITED WARRANTY. See the jOOQ License
    -and Maintenance Agreement for more details: http://www.jooq.org/licensing</text>
    -
    -                    <html>    
    -                        <h3>Historic license for jOOQ 1.x, 2.x, 3.0, 3.1</h3>
    -                    </html>
    -                    
    -<text>Copyright (c) 2009-2013, Lukas Eder, lukas.eder@gmail.com
    -All rights reserved.
    -
    -This software is licensed to you under the Apache License, Version 2.0
    -(the "License"); You may obtain a copy of the License at
    -
    -  http://www.apache.org/licenses/LICENSE-2.0
    -
    -Redistribution and use in source and binary forms, with or without
    -modification, are permitted provided that the following conditions are met:
    -
    -. Redistributions of source code must retain the above copyright notice, this
    -  list of conditions and the following disclaimer.
    -
    -. Redistributions in binary form must reproduce the above copyright notice,
    -  this list of conditions and the following disclaimer in the documentation
    -  and/or other materials provided with the distribution.
    -
    -. Neither the name "jOOQ" nor the names of its contributors may be
    -  used to endorse or promote products derived from this software without
    -  specific prior written permission.
    -
    -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
    -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
    -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
    -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
    -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
    -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
    -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
    -POSSIBILITY OF SUCH DAMAGE.</text>
    -
    -                    <html>    
    -                        <h3>Trademarks owned by Data Geekeryâ„¢ GmbH</h3>
    -                        <ul>
    -                            <li>jOOQâ„¢ is a trademark by Data Geekeryâ„¢ GmbH</li>
    -                            <li>jOOXâ„¢ is a trademark by Data Geekeryâ„¢ GmbH</li>
    -                            <li>jOORâ„¢ is a trademark by Data Geekeryâ„¢ GmbH</li>
    -                            <li>jOOUâ„¢ is a trademark by Data Geekeryâ„¢ GmbH</li>
    -                        </ul>
    -                        
    -                        <h3>Trademarks owned by database vendors with no affiliation to Data Geekeryâ„¢ GmbH</h3>
    -                        <ul>
    -                            <li>Access® is a registered trademark of Microsoft® Inc.</li>
    -                            <li>Adaptive Server® Enterprise is a registered trademark of Sybase®, Inc.</li>
    -                            <li>CUBRID™ is a trademark of NHN® Corp.</li>
    -                            <li>DB2® is a registered trademark of IBM® Corp.</li>
    -                            <li>Derby is a trademark of the Apacheâ„¢ Software Foundation</li>
    -                            <li>H2 is a trademark of the H2 Group</li>
    -                            <li>HSQLDB is a trademark of The hsql Development Group</li>
    -                            <li>Ingres is a trademark of Actianâ„¢ Corp.</li>
    -                            <li>MariaDB is a trademark of Monty Program Ab</li>
    -                            <li>MySQL® is a registered trademark of Oracle® Corp.</li>
    -                            <li>Firebird® is a registered trademark of Firebird Foundation Inc.</li>
    -                            <li>Oracle® database is a registered trademark of Oracle® Corp.</li>
    -                            <li>PostgreSQL® is a registered trademark of The PostgreSQL Global Development Group</li>
    -                            <li>Postgres Plus® is a registered trademark of EnterpriseDB® software</li>
    -                            <li>SQL Anywhere® is a registered trademark of Sybase®, Inc.</li>
    -                            <li>SQL Server® is a registered trademark of Microsoft® Inc.</li>
    -                            <li>SQLite is a trademark of Hipp, Wyrick &amp; Company, Inc.</li>
    -                        </ul>
    -                        
    -                        <h3>Other trademarks by vendors with no affiliation to Data Geekeryâ„¢ GmbH</h3>
    -                        <ul>
    -                            <li>Java® is a registered trademark by Oracle® Corp. and/or its affiliates</li>
    -                            <li>Scala is a trademark of EPFL</li>
    -                        </ul>
    -                        
    -                        <h3>Other trademark remarks</h3>
    -                        <p>
    -                            Other names may be trademarks of their respective owners.
    -                        </p>
    -                        
    -                        <p>
    -                            Throughout the manual, the above trademarks are referenced without a formal ® (R) or ™ (TM) symbol. It is believed that referencing third-party trademarks in this manual or on the jOOQ website constitutes "fair use". Please <a href="mailto:contact@datageekery.com">contact us</a> if you think that your trademark(s) are not properly attributed.
    -                        </p>
    -                    </html>
    -				</content>
    -			</section>
    -			
    -			<section id="getting-started">
    -				<title>Getting started with jOOQ</title>
    -				<content><html>
    -					<p>
    -						These chapters contain a quick overview of how to get started with this manual and with jOOQ. While the subsequent chapters contain a lot of reference information, this chapter here just wraps up the essentials.
    -					</p>
    -				</html></content>
    -
    -				<sections>
    -					<section id="the-manual">
    -					    <title>How to read this manual</title>
    -						<content><html>
    -							<p>
    -								This section helps you correctly interpret this manual in the context of jOOQ.
    -							</p>
    -							
    -							<h3>Code blocks</h3>
    -							<p>
    -								The following are code blocks:
    -							</p>
    -							
    -</html><sql><![CDATA[-- A SQL code block
    -SELECT 1 FROM DUAL]]></sql>
    -
    -<java><![CDATA[// A Java code block
    -for (int i = 0; i < 10; i++);]]></java>
    -
    -<xml><![CDATA[<!-- An XML code block -->
    -<hello what="world"></hello>]]></xml>		
    -
    -<config><![CDATA[# A config file code block
    -org.jooq.property=value]]></config><html>		
    -
    -							<p>
    -								These are useful to provide examples in code. Often, with jOOQ, it is even more useful to compare SQL code with its corresponding Java/jOOQ code. When this is done, the blocks are aligned side-by-side, with SQL usually being on the left, and Java usually being on the right:
    -							</p>					
    -							
    -</html><code-pair>
    -<sql><![CDATA[-- In SQL:
    -SELECT 1 FROM DUAL]]></sql>
    -<java><![CDATA[// Using jOOQ:
    -create.selectOne()]]></java>
    -</code-pair><html>
    -
    -							<h3>Code block contents</h3>
    -							<p>
    -								The contents of code blocks follow conventions, too. If nothing else is mentioned next to any given code block, then the following can be assumed:
    -							</p>
    -							
    -							
    -</html><sql><![CDATA[-- SQL assumptions
    -------------------
    -
    --- If nothing else is specified, assume that the Oracle syntax is used 
    -SELECT 1 FROM DUAL]]></sql>
    -							
    -<java><![CDATA[// Java assumptions
    -// ----------------
    - 
    -// Whenever you see "standalone functions", assume they were static imported from org.jooq.impl.DSL 
    -exists(); max(); min(); val(); inline(); // correspond to DSL.exists(); DSL.max(); DSL.min(); etc...
    -
    -// Whenever you see BOOK/Book, AUTHOR/Author and similar entities, assume they were (static) imported from the generated schema
    -BOOK.TITLE, AUTHOR.LAST_NAME // correspond to com.example.generated.Tables.BOOK.TITLE, com.example.generated.Tables.BOOK.TITLE
    -
    -// Whenever you see "create" being used in Java code, assume that this is an instance of org.jooq.DSLContext.
    -// The reason why it is called "create" is the fact, that a jOOQ QueryPart is being created from the DSL object:
    -DSLContext create = DSL.using(connection, SQLDialect.ORACLE);]]></java><html>
    -
    -                            <p>
    -                                Your naming may differ, of course. For instance, you could name the "create" instance "db", instead.
    -                            </p>
    -
    -							<h3>Degree (arity)</h3>
    -							<p>
    -							    jOOQ records (and many other API elements) have a degree N between 1 and {max-row-degree}. The variable degree of an API element is denoted as [N], e.g. Row[N] or Record[N]. The term "degree" is preferred over arity, as "degree" is the term used in the SQL standard, whereas "arity" is used more often in mathematics and relational theory.
    -							</p>
    -
    -							<h3>Settings</h3>
    -							<p>
    -								jOOQ allows to override runtime behaviour using <reference class="org.jooq.conf.Settings"/>. If nothing is specified, the default runtime settings are assumed.
    -							</p>
    -							
    -							<h3>Sample database</h3>
    -							<p>
    -								jOOQ query examples run against the sample database. See the manual's section about <reference id="sample-database" title="the sample database used in this manual"/> to learn more about the sample database.
    -							</p>
    -						</html></content>
    -					</section>
    -
    -					<section id="sample-database">
    -					    <title>The sample database used in this manual</title>
    -						<content><html>
    -							<p>
    -							For the examples in this manual, the same database will always be referred to. It essentially consists of these entities created using the Oracle dialect
    -							</p>
    -</html><sql>CREATE TABLE language (
    -  id              NUMBER(7)     NOT NULL PRIMARY KEY,
    -  cd              CHAR(2)       NOT NULL,
    -  description     VARCHAR2(50)
    -)
    -
    -CREATE TABLE author (
    -  id              NUMBER(7)     NOT NULL PRIMARY KEY,
    -  first_name      VARCHAR2(50),
    -  last_name       VARCHAR2(50)  NOT NULL,
    -  date_of_birth   DATE,
    -  year_of_birth   NUMBER(7),
    -  distinguished   NUMBER(1)
    -)
    -
    -CREATE TABLE book (
    -  id              NUMBER(7)     NOT NULL PRIMARY KEY,
    -  author_id       NUMBER(7)     NOT NULL,
    -  title           VARCHAR2(400) NOT NULL,
    -  published_in    NUMBER(7)     NOT NULL,
    -  language_id     NUMBER(7)     NOT NULL,
    -  
    -  CONSTRAINT fk_book_author     FOREIGN KEY (author_id)   REFERENCES author(id),
    -  CONSTRAINT fk_book_language   FOREIGN KEY (language_id) REFERENCES language(id)
    -)
    -
    -CREATE TABLE book_store (
    -  name            VARCHAR2(400) NOT NULL UNIQUE
    -)
    -
    -CREATE TABLE book_to_book_store (
    -  name            VARCHAR2(400) NOT NULL,
    -  book_id         INTEGER       NOT NULL,
    -  stock           INTEGER,
    -  
    -  PRIMARY KEY(name, book_id),
    -  CONSTRAINT fk_b2bs_book_store FOREIGN KEY (name)        REFERENCES book_store (name) ON DELETE CASCADE,
    -  CONSTRAINT fk_b2bs_book       FOREIGN KEY (book_id)     REFERENCES book (id)         ON DELETE CASCADE
    -)</sql><html>
    -							<p>
    -								More entities, types (e.g. UDT's, ARRAY types, ENUM types, etc), stored procedures and packages are introduced for specific examples
    -							</p>
    -						</html></content>
    -					</section>
    -
    -					<section id="use-cases">
    -						<title>Different use cases for jOOQ</title>
    -						<content><html>
    -							<p>
    -								jOOQ has originally been created as a library for complete abstraction of JDBC and all database interaction. Various best practices that are frequently encountered in pre-existing software products are applied to this library. This includes:
    -							</p>
    -							<ul>
    -								<li>Typesafe database object referencing through generated schema, table, column, record, procedure, type, dao, pojo artefacts (see the chapter about <reference id="code-generation" title="code generation"/>)</li>
    -								<li>Typesafe SQL construction through a complete API modelling SQL as a domain specific language in Java (see the chapter about <reference id="dsl-and-non-dsl" title="the DSL API"/>)</li>
    -								<li>Convenient query execution through an improved API for result fetching (see the chapters about <reference id="fetching" title="the various types of data fetching"/>)</li>
    -								<li>SQL dialect abstraction and SQL clause simulation to improve cross-database compatibility and to enable missing features in simpler databases (see the chapter about <reference id="sql-dialects" title="SQL dialects"/>)</li>
    -								<li>SQL logging and debugging using jOOQ as an integral part of your development process (see the chapters about <reference id="logging" title="logging"/>)</li>
    -							</ul>
    -							<p>
    -								Effectively, jOOQ was originally designed to replace any other database abstraction framework short of the ones handling connection pooling and transaction management (see also the <reference id="reference-credits" title="credits for other database abstraction libraries"/>)
    -							</p>
    -							
    -							<h3>Use jOOQ the way you prefer</h3>
    -							<p>
    -								... but open source is community-driven. And the community has shown various ways of using jOOQ that diverge from its original intent. Some use cases encountered are:
    -							</p>
    -							<ul>
    -								<li>Using Hibernate for 70% of the queries (i.e. <reference id="crud-with-updatablerecords" title="CRUD"/>) and jOOQ for the remaining 30% where SQL is really needed</li>
    -								<li>Using jOOQ for SQL building and JDBC for SQL execution</li> 
    -								<li>Using jOOQ for SQL building and Spring Data for SQL execution</li>
    -								<li>Using jOOQ without the <reference id="code-generation" title="source code generator"/> to build the basis of a framework for dynamic SQL execution.</li> 
    -							</ul>
    -							
    -							<p>
    -								The following sections explain about various use cases for using jOOQ in your application.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="jooq-as-a-standalone-sql-builder">
    -								<title>jOOQ as a SQL builder</title>
    -								<content><html>
    -									<p>
    -										This is the most simple of all use cases, allowing for construction of valid SQL for any database. In this use case, you will not use <reference id="jooq-as-a-sql-builder-with-code-generation" title="jOOQ's code generator"/> and probably not even <reference id="jooq-as-a-sql-executor" title="jOOQ's query execution facilities"/>. Instead, you'll use jOOQ to wrap strings, literals and other user-defined objects into an object-oriented, type-safe AST modelling your SQL statements. An example is given here: 
    -									</p>
    -									
    -</html><java><![CDATA[// Fetch a SQL string from a jOOQ Query in order to manually execute it with another tool.
    -String sql = create.select(fieldByName("BOOK","TITLE"), fieldByName("AUTHOR","FIRST_NAME"), fieldByName("AUTHOR","LAST_NAME"))
    -                   .from(tableByName("BOOK"))
    -                   .join(tableByName("AUTHOR"))
    -                   .on(fieldByName("BOOK", "AUTHOR_ID").equal("AUTHOR", "ID"))
    -                   .where(fieldByName("BOOK", "PUBLISHED_IN").equal(1948))
    -                   .getSQL();]]></java><html>
    -                   
    -                   					<p>
    -                   						The SQL string that you can generate as such can then be executed using JDBC directly, using Spring's JdbcTemplate, using Apache DbUtils and many other tools.
    -                   					</p>
    -                   					<p>
    -                   						If you wish to use jOOQ only as a SQL builder, the following sections of the manual will be of interest to you:
    -                  					</p>
    -                  					<ul>
    -                  						<li><reference id="sql-building" title="SQL building"/>: This section contains a lot of information about creating SQL statements using the jOOQ API</li>
    -                  						<li><reference id="plain-sql" title="Plain SQL"/>: This section contains information useful in particular to those that want to supply <reference id="table-expressions" title="table expressions"/>, <reference id="column-expressions" title="column expressions"/>, etc. as plain SQL to jOOQ, rather than through generated artefacts</li>
    -                  					</ul>
    -								</html></content>
    -							</section>
    -
    -							<section id="jooq-as-a-sql-builder-with-code-generation">
    -								<title>jOOQ as a SQL builder with code generation</title>
    -								<content><html>
    -									<p>
    -										In addition to using jOOQ as a <reference id="jooq-as-a-standalone-sql-builder" title="standalone SQL builder"/>, you can also use jOOQ's code generation features in order to compile your SQL statements using a Java compiler against an actual database schema. This adds a lot of power and expressiveness to just simply constructing SQL using custom strings and literals, as you can be sure that all database artefacts actually exist in the database, and that their type is correct. An example is given here: 
    -									</p>
    -
    -</html><java><![CDATA[// Fetch a SQL string from a jOOQ Query in order to manually execute it with another tool.
    -String sql = create.select(BOOK.TITLE, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -                   .from(BOOK)
    -                   .join(AUTHOR)
    -                   .on(BOOK.AUTHOR_ID.equal(AUTHOR.ID))
    -                   .where(BOOK.PUBLISHED_IN.equal(1948))
    -                   .getSQL();]]></java><html>
    -                   
    -                   					<p>
    -                   						The SQL string that you can generate as such can then be executed using JDBC directly, using Spring's JdbcTemplate, using Apache DbUtils and many other tools.
    -                   					</p>
    -                   					<p>
    -                   						If you wish to use jOOQ only as a SQL builder with code generation, the following sections of the manual will be of interest to you:
    -                  					</p>
    -                  					<ul>
    -                  						<li><reference id="sql-building" title="SQL building"/>: This section contains a lot of information about creating SQL statements using the jOOQ API</li>
    -                  						<li><reference id="code-generation" title="Code generation"/>: This section contains the necessary information to run jOOQ's code generator against your developer database</li>
    -                  					</ul>
    -								</html></content>
    -							</section>
    -
    -							<section id="jooq-as-a-sql-executor">
    -								<title>jOOQ as a SQL executor</title>
    -								<content><html>
    -									<p>
    -										Instead of any tool mentioned in the previous chapters, you can also use jOOQ directly to execute your jOOQ-generated SQL statements. This will add a lot of convenience on top of the previously discussed API for typesafe SQL construction, when you can re-use the information from generated classes to fetch records and custom data types. An example is given here:
    -									</p>
    -									
    -</html><java><![CDATA[// Typesafely execute the SQL statement directly with jOOQ
    -Result<Record3<String, String, String>> result = 
    -create.select(BOOK.TITLE, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -      .from(BOOK)
    -      .join(AUTHOR)
    -      .on(BOOK.AUTHOR_ID.equal(AUTHOR.ID))
    -      .where(BOOK.PUBLISHED_IN.equal(1948))
    -      .fetch();]]></java><html>
    -
    -									<p>
    -										jOOQ doesn't stop here, though! You can execute any SQL with jOOQ. In other words, you can use any other SQL building tool and run the SQL statements with jOOQ. An example is given here:
    -									</p>
    -
    -</html><java><![CDATA[// Use your favourite tool to construct SQL strings:
    -String sql = "SELECT title, first_name, last_name FROM book JOIN author ON book.author_id = author.id " +
    -             "WHERE book.published_in = 1984";
    -
    -// Fetch results using jOOQ
    -Result<Record> result = create.fetch(sql);
    -
    -// Or execute that SQL with JDBC, fetching the ResultSet with jOOQ:
    -ResultSet rs = connection.createStatement().executeQuery(sql);
    -Result<Record> result = create.fetch(rs);]]></java><html>
    -
    -									<p>
    -                   						If you wish to use jOOQ as a SQL executor with (or without) code generation, the following sections of the manual will be of interest to you:
    -                  					</p>
    -                  					<ul>
    -                  						<li><reference id="sql-building" title="SQL building"/>: This section contains a lot of information about creating SQL statements using the jOOQ API</li>
    -                  						<li><reference id="code-generation" title="Code generation"/>: This section contains the necessary information to run jOOQ's code generator against your developer database</li>
    -                  						<li><reference id="sql-execution" title="SQL execution"/>: This section contains a lot of information about executing SQL statements using the jOOQ API</li>
    -                  						<li><reference id="fetching"/>: This section contains some useful information about the various ways of fetching data with jOOQ</li>
    -                  					</ul>
    -								</html></content>
    -							</section>
    -
    -							<section id="jooq-for-crud">
    -								<title>jOOQ for CRUD</title>
    -								<content><html>
    -									<p>
    -										This is probably the most complete use-case for jOOQ: Use all of jOOQ's features. Apart from jOOQ's fluent API for query construction, jOOQ can also help you execute everyday CRUD operations. An example is given here:
    -									</p>
    -
    -</html><java><![CDATA[// Fetch all authors
    -for (AuthorRecord author : create.fetch(AUTHOR)) {
    -
    -    // Skip previously distinguished authors  
    -    if ((int) author.getDistinguished() == 1)
    -        continue;
    -  
    -    // Check if the author has written more than 5 books
    -    if (author.fetchChildren(FK_BOOK_AUTHOR).size() > 5) {
    -    
    -        // Mark the author as a "distinguished" author
    -        author.setDistinguished(1);
    -        author.store();
    -    }
    -}]]></java><html>
    -
    -									<p>
    -                   						If you wish to use all of jOOQ's features, the following sections of the manual will be of interest to you (including all sub-sections):
    -                  					</p>
    -                  					<ul>
    -                  						<li><reference id="sql-building" title="SQL building"/>: This section contains a lot of information about creating SQL statements using the jOOQ API</li>
    -                  						<li><reference id="code-generation" title="Code generation"/>: This section contains the necessary information to run jOOQ's code generator against your developer database</li>
    -                  						<li><reference id="sql-execution" title="SQL execution"/>: This section contains a lot of information about executing SQL statements using the jOOQ API</li>
    -                  					</ul>
    -								</html></content>
    -							</section>
    -							
    -							<section id="jooq-for-pros">
    -								<title>jOOQ for PROs</title>
    -								<content><html>
    -									<p>
    -										jOOQ isn't just a library that helps you <reference id="sql-building" title="build"/> and <reference id="sql-execution" title="execute"/> SQL against your <reference id="code-generation" title="generated, compilable schema"/>. jOOQ ships with a lot of tools. Here are some of the most important tools shipped with jOOQ:
    -									</p>
    -									<ul>
    -										<li><reference id="execute-listeners" title="jOOQ's Execute Listeners"/>: jOOQ allows you to hook your custom execute listeners into jOOQ's SQL statement execution lifecycle in order to centrally coordinate any arbitrary operation performed on SQL being executed. Use this for logging, identity generation, SQL tracing, performance measurements, etc.</li>
    -										<li><reference id="logging" title="Logging"/>: jOOQ has a standard DEBUG logger built-in, for logging and tracing all your executed SQL statements and fetched result sets</li>
    -										<li><reference id="stored-procedures" title="Stored Procedures"/>: jOOQ supports stored procedures and functions of your favourite database. All routines and user-defined types are generated and can be included in jOOQ's SQL building API as function references.</li>
    -										<li><reference id="batch-execution" title="Batch execution"/>: Batch execution is important when executing a big load of SQL statements. jOOQ simplifies these operations compared to JDBC</li>
    -										<li><reference id="exporting" title="Exporting"/> and <reference id="importing" title="Importing"/>: jOOQ ships with an API to easily export/import data in various formats</li>
    -									</ul>
    -									<p>
    -										If you're a power user of your favourite, feature-rich database, jOOQ will help you access all of your database's vendor-specific features, such as OLAP features, stored procedures, user-defined types, vendor-specific SQL, functions, etc. Examples are given throughout this manual.
    -									</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -					<section id="tutorials">
    -						<title>Tutorials</title>
    -						<content><html>
    -							<p>
    -								Don't have time to read the full manual? Here are a couple of tutorials that will get you into the most essential parts of jOOQ as quick as possible.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="jooq-in-7-steps">
    -								<title>jOOQ in 7 easy steps</title>
    -								<content><html>
    -									<p>
    -										This manual section is intended for new users, to help them get a running application with jOOQ, quickly.
    -									</p>
    -								</html></content>
    -								
    -								<sections>
    -									<section id="jooq-in-7-steps-step1">
    -										<title>Step 1: Preparation</title>
    -										<content><html>
    -											<p>
    -												If you haven't already downloaded it, download jOOQ:<br/>
    -												<a href="https://sourceforge.net/projects/jooq/files/Release/" title="jOOQ download">https://sourceforge.net/projects/jooq/files/Release/</a>
    -											</p>
    -											
    -											<p>
    -												Alternatively, you can create a Maven dependency to download jOOQ artefacts:
    -											</p>
    -</html><xml><![CDATA[<dependency>
    -  <groupId>org.jooq</groupId>
    -  <artifactId>jooq</artifactId>
    -  <version>{jooq-version}</version>
    -</dependency>
    -<dependency>
    -  <groupId>org.jooq</groupId>
    -  <artifactId>jooq-meta</artifactId>
    -  <version>{jooq-version}</version>
    -</dependency>
    -<dependency>
    -  <groupId>org.jooq</groupId>
    -  <artifactId>jooq-codegen</artifactId>
    -  <version>{jooq-version}</version>
    -</dependency>]]></xml><html>
    -
    -											<p>
    -												Please refer to the manual's section about <reference id="codegen-configuration" title="Code generation configuration"/> to learn how to use jOOQ's code generator with Maven.
    -											</p>
    -
    -											<p>
    -												For this example, we'll be using MySQL. If you haven't already downloaded MySQL Connector/J, download it here:<br/>
    -												<a href="http://dev.mysql.com/downloads/connector/j/" target="_blank" title="MySQL JDBC driver">http://dev.mysql.com/downloads/connector/j/</a>
    -											</p>
    -
    -											<p>
    -												If you don't have a MySQL instance up and running yet, get <a href="http://www.apachefriends.org/en/xampp.html" title="XAMPP">XAMPP</a> now! XAMPP is a simple installation bundle for Apache, MySQL, PHP and Perl
    -											</p>
    -										</html></content>
    -									</section>
    -									
    -									<section id="jooq-in-7-steps-step2">
    -										<title>Step 2: Your database</title>
    -										<content><html>
    -											<p>
    -												We're going to create a database called "library" and a corresponding "author" table. Connect to MySQL via your command line client and type the following:
    -											</p>
    -											
    -</html><sql>CREATE DATABASE library;
    -
    -CREATE TABLE `author` (
    -  `id` int NOT NULL,
    -  `first_name` varchar(255) DEFAULT NULL,
    -  `last_name` varchar(255) DEFAULT NULL,
    -  PRIMARY KEY (`id`)
    -);
    -</sql>
    -										</content>
    -									</section>
    -									
    -									<section id="jooq-in-7-steps-step3">
    -										<title>Step 3: Code generation</title>
    -										<content><html>
    -											<p>
    -												In this step, we're going to use jOOQ's command line tools to generate classes that map to the Author table we just created. More detailed information about how to set up the jOOQ code generator can be found here:<br/>
    -												<reference id="code-generation" title="jOOQ manual pages about setting up the code generator"/>
    -											</p>
    -
    -											<p>
    -												The easiest way to generate a schema is to copy the jOOQ jar files (there should be 3) and the MySQL Connector jar file to a temporary directory. Then, create a library.xml that looks like this:
    -											</p>
    -											
    -</html><xml><![CDATA[<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    -<configuration xmlns="http://www.jooq.org/xsd/jooq-codegen-{codegen-xsd-version}.xsd">
    -  <!-- Configure the database connection here -->
    -  <jdbc>
    -    <driver>com.mysql.jdbc.Driver</driver>
    -    <url>jdbc:mysql://localhost:3306/library</url>
    -    <user>root</user>
    -    <password></password>
    -  </jdbc>
    -
    -  <generator>
    -    <!-- The default code generator. You can override this one, to generate your own code style
    -         Defaults to org.jooq.util.DefaultGenerator -->
    -    <name>org.jooq.util.DefaultGenerator</name>
    -
    -    <database>
    -      <!-- The database type. The format here is:
    -           org.util.[database].[database]Database -->
    -      <name>org.jooq.util.mysql.MySQLDatabase</name>
    -
    -      <!-- The database schema (or in the absence of schema support, in your RDBMS this
    -           can be the owner, user, database name) to be generated -->
    -      <inputSchema>library</inputSchema>
    -
    -      <!-- All elements that are generated from your schema 
    -           (A Java regular expression. Use the pipe to separate several expressions)
    -           Watch out for case-sensitivity. Depending on your database, this might be important! -->
    -      <includes>.*</includes>
    -
    -      <!-- All elements that are excluded from your schema 
    -           (A Java regular expression. Use the pipe to separate several expressions).
    -           Excludes match before includes -->
    -      <excludes></excludes>
    -    </database>
    -
    -    <target>
    -      <!-- The destination package of your generated classes (within the destination directory) -->
    -      <packageName>test.generated</packageName>
    -
    -      <!-- The destination directory of your generated classes -->
    -      <directory>C:/workspace/MySQLTest/src</directory>
    -    </target>
    -  </generator>
    -</configuration>]]></xml><html>
    -											<p>
    -												Replace the username with whatever user has the appropriate privileges to query the database meta data. You'll also want to look at the other values and replace as necessary. Here are the two interesting properties:
    -											</p>
    -											<p>
    -												<code>generator.target.package</code> - set this to the parent package you want to create for the generated classes. The setting of <code>test.generated</code> will cause the <code>test.generated.Author</code> and <code>test.generated.AuthorRecord</code> to be created
    -											</p>
    -											<p>
    -												<code>generator.target.directory</code> - the directory to output to.
    -											</p>
    -											
    -											<p>
    -												Once you have the JAR files and library.xml in your temp directory, type this (use colons instead of semi-colons on UNIX/Linux systems):
    -											</p>
    -
    -</html><text>java -classpath jooq-{jooq-version}.jar;jooq-meta-{jooq-version}.jar;jooq-codegen-{jooq-version}.jar;mysql-connector-java-5.1.18-bin.jar;. 
    -  org.jooq.util.GenerationTool /library.xml
    -</text><html>
    -
    -											<p>
    -												Note the prefix slash before library.xml. Even though it's in our working directory, we need to prepend a slash, as the configuration file is loaded from the classpath. Replace the filenames with your filenames. In this example, jOOQ {jooq-version} is being used. If everything has worked, you should see this in your console output:
    -											</p>
    -
    -</html><text>Nov 1, 2011 7:25:06 PM org.jooq.impl.JooqLogger info
    -INFO: Initialising properties  : /library.xml
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Database parameters
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: ----------------------------------------------------------
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO:   dialect                : MYSQL
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO:   schema                 : library
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO:   target dir             : C:/workspace/MySQLTest/src
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO:   target package         : test.generated
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: ----------------------------------------------------------
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Emptying                 : C:/workspace/MySQLTest/src/test/generated
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Generating classes in    : C:/workspace/MySQLTest/src/test/generated
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Generating schema        : Library.java
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Schema generated         : Total: 122.18ms
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Sequences fetched        : 0 (0 included, 0 excluded)
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Tables fetched           : 5 (5 included, 0 excluded)
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Generating tables        : C:/workspace/MySQLTest/src/test/generated/tables
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: ARRAYs fetched           : 0 (0 included, 0 excluded)
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Enums fetched            : 0 (0 included, 0 excluded)
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: UDTs fetched             : 0 (0 included, 0 excluded)
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Generating table         : Author.java
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Tables generated         : Total: 680.464ms, +558.284ms
    -Nov 1, 2011 7:25:07 PM org.jooq.impl.JooqLogger info
    -INFO: Generating Keys          : C:/workspace/MySQLTest/src/test/generated/tables
    -Nov 1, 2011 7:25:08 PM org.jooq.impl.JooqLogger info
    -INFO: Keys generated           : Total: 718.621ms, +38.157ms
    -Nov 1, 2011 7:25:08 PM org.jooq.impl.JooqLogger info
    -INFO: Generating records       : C:/workspace/MySQLTest/src/test/generated/tables/records
    -Nov 1, 2011 7:25:08 PM org.jooq.impl.JooqLogger info
    -INFO: Generating record        : AuthorRecord.java
    -Nov 1, 2011 7:25:08 PM org.jooq.impl.JooqLogger info
    -INFO: Table records generated  : Total: 782.545ms, +63.924ms
    -Nov 1, 2011 7:25:08 PM org.jooq.impl.JooqLogger info
    -INFO: Routines fetched         : 0 (0 included, 0 excluded)
    -Nov 1, 2011 7:25:08 PM org.jooq.impl.JooqLogger info
    -INFO: Packages fetched         : 0 (0 included, 0 excluded)
    -Nov 1, 2011 7:25:08 PM org.jooq.impl.JooqLogger info
    -INFO: GENERATION FINISHED!     : Total: 791.688ms, +9.143ms
    -</text>
    -										
    -										</content>
    -									</section>
    -									
    -									<section id="jooq-in-7-steps-step4">
    -										<title>Step 4: Connect to your database</title>
    -										<content><html>
    -											<p>
    -												Let's just write a vanilla main class in the project containing the generated classes:
    -											</p>
    -											
    -</html><java><![CDATA[// For convenience, always static import your generated tables and jOOQ functions to decrease verbosity:
    -import static test.generated.Tables.*;
    -import static org.jooq.impl.DSL.*;
    -
    -public class Main {
    -    public static void main(String[] args) {
    -        Connection conn = null;
    -
    -        String userName = "root";
    -        String password = "";
    -        String url = "jdbc:mysql://localhost:3306/library";
    -
    -        try {
    -            Class.forName("com.mysql.jdbc.Driver").newInstance();
    -            conn = DriverManager.getConnection(url, userName, password);
    -        } catch (Exception e) {
    -            // For the sake of this tutorial, let's keep exception handling simple
    -            e.printStackTrace();
    -        } finally {
    -            if (conn != null) {
    -                try {
    -                    conn.close();
    -                } catch (SQLException ignore) {
    -                }
    -            }
    -        }
    -    }
    -}]]></java><html>
    -
    -											<p>
    -												This is pretty standard code for establishing a MySQL connection.
    -											</p>
    -										</html></content>
    -									</section>
    -									
    -									<section id="jooq-in-7-steps-step5">
    -										<title>Step 5: Querying</title>
    -										<content><html>
    -											<p>
    -												Let's add a simple query:
    -											</p>
    -											
    -</html><java><![CDATA[DSLContext create = DSL.using(conn, SQLDialect.MYSQL);
    -Result<Record> result = create.select().from(AUTHOR).fetch();]]></java><html>
    -
    -											<p>
    -												First get an instance of <code>DSLContext</code> so we can write a simple <code>SELECT</code> query. We pass an instance of the MySQL connection to <code>DSL</code>. Note that the DSLContext doesn't close the connection. We'll have to do that ourselves.
    -											</p>
    -											<p>
    -												We then use jOOQ's DSL to return an instance of Result. We'll be using this result in the next step.
    -											</p>
    -										</html></content>
    -									</section>
    -									
    -									<section id="jooq-in-7-steps-step6">
    -										<title>Step 6: Iterating</title>
    -										<content><html>
    -											<p>
    -												After the line where we retrieve the results, let's iterate over the results and print out the data:
    -											</p>
    -
    -</html><java><![CDATA[for (Record r : result) {
    -    Integer id = r.getValue(AUTHOR.ID);
    -    String firstName = r.getValue(AUTHOR.FIRST_NAME);
    -    String lastName = r.getValue(AUTHOR.LAST_NAME);
    -
    -    System.out.println("ID: " + id + " first name: " + firstName + " last name: " + lastName);
    -}]]></java><html>
    -
    -											<p>
    -												The full program should now look like this:
    -											</p>
    -											
    -</html><java><![CDATA[package test;
    -
    -// For convenience, always static import your generated tables and
    -// jOOQ functions to decrease verbosity:
    -import static test.generated.Tables.*;
    -import static org.jooq.impl.DSL.*;
    -
    -import java.sql.*;
    -
    -import org.jooq.*;
    -import org.jooq.impl.*;
    -
    -public class Main {
    -
    -    /**
    -     * @param args
    -     */
    -    public static void main(String[] args) {
    -        Connection conn = null;
    -
    -        String userName = "root";
    -        String password = "";
    -        String url = "jdbc:mysql://localhost:3306/library";
    -
    -        try {
    -            Class.forName("com.mysql.jdbc.Driver").newInstance();
    -            conn = DriverManager.getConnection(url, userName, password);
    -
    -            DSLContext create = DSL.using(conn, SQLDialect.MYSQL);
    -            Result<Record> result = create.select().from(AUTHOR).fetch();
    -
    -            for (Record r : result) {
    -                Long id = r.getValue(AUTHOR.ID);
    -                String firstName = r.getValue(AUTHOR.FIRST_NAME);
    -                String lastName = r.getValue(AUTHOR.LAST_NAME);
    -
    -                System.out.println("ID: " + id + " first name: " + firstName + " last name: " + lastName);
    -            }
    -        } catch (Exception e) {
    -            // For the sake of this tutorial, let's keep exception handling simple
    -            e.printStackTrace();
    -        } finally {
    -            if (conn != null) {
    -                try {
    -                    conn.close();
    -                } catch (SQLException ignore) {
    -                }
    -            }
    -        }
    -    }
    -}]]></java>
    -										</content>
    -									</section>
    -									
    -									<section id="jooq-in-7-steps-step7">
    -										<title>Step 7: Explore!</title>
    -										<content><html>
    -											<p>
    -												jOOQ has grown to be a comprehensive SQL library. For more information, please consider the documentation:<br/>
    -												<a href="http://www.jooq.org/learn.php" title="jOOQ Manual">http://www.jooq.org/learn.php</a>
    -											</p>
    -											<p>
    -												... explore the Javadoc:<br/>
    -												<a href="http://www.jooq.org/javadoc/latest/" title="jOOQ Javadoc">http://www.jooq.org/javadoc/latest/</a>
    -											</p>
    -											<p>
    -												... or join the news group:<br/>
    -												<a href="https://groups.google.com/forum/#!forum/jooq-user" title="jOOQ news group">https://groups.google.com/forum/#!forum/jooq-user</a>
    -											</p>
    -											<p>
    -											    This tutorial is the courtesy of Ikai Lan. See the original source here:<br/>
    -											    <a href="http://ikaisays.com/2011/11/01/getting-started-with-jooq-a-tutorial/" target="_blank" title="Ikai Lan's jOOQ tutorial">http://ikaisays.com/2011/11/01/getting-started-with-jooq-a-tutorial/</a>
    -											</p>
    -										</html></content>
    -									</section>
    -								</sections>
    -							</section>
    -
    -							<section id="jooq-in-modern-ides">
    -								<title>Using jOOQ in modern IDEs</title>
    -								<content><html>
    -									<p>Feel free to contribute a tutorial!</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="jooq-with-spring">
    -								<title>Using jOOQ with Spring and DBCP</title>
    -								<content><html>
    -									<p>
    -                                        jOOQ and Spring are easy to integrate. In this example, we shall integrate:
    -                                    </p>
    -                                    <ul>
    -                                        <li><a href="http://commons.apache.org/proper/commons-dbcp">Apache Commons DBCP</a> as the connection pooling library.</li>
    -                                        <li><a href="http://www.springsource.org/spring-data">Spring JDBC</a> as the transaction management library.</li>
    -                                        <li><a href="http://www.jooq.org">jOOQ</a> as the <reference id="sql-building" title="SQL building"/> and <reference id="sql-execution" title="execution"/> library.</li>
    -                                    </ul>
    -                                    
    -                                    <p>
    -                                        The following steps show how to integrate the libraries.
    -                                    </p>
    -                                    
    -                                    <h3>Add the required Maven dependencies</h3>
    -                                    <p>
    -                                        For this example, we'll create the following Maven dependencies
    -                                    </p>
    -
    -</html><xml><![CDATA[<!-- Use this or the latest Spring RELEASE version -->
    -<properties>
    -    <org.springframework.version>3.2.3.RELEASE</org.springframework.version>
    -</properties>
    -
    -<dependencies>
    -    <dependency>
    -        <groupId>org.jooq</groupId>
    -        <artifactId>jooq</artifactId>
    -        <version>{jooq-version}</version>
    -    </dependency>
    -    <dependency>
    -        <groupId>com.h2database</groupId>
    -        <artifactId>h2</artifactId>
    -        <version>1.3.168</version>
    -    </dependency>
    -    <dependency>
    -        <groupId>commons-dbcp</groupId>
    -        <artifactId>commons-dbcp</artifactId>
    -        <version>1.4</version>
    -    </dependency>
    -    <dependency>
    -        <groupId>org.springframework</groupId>
    -        <artifactId>spring-core</artifactId>
    -        <version>${org.springframework.version}</version>
    -    </dependency>
    -    <dependency>
    -        <groupId>org.springframework</groupId>
    -        <artifactId>spring-beans</artifactId>
    -        <version>${org.springframework.version}</version>
    -    </dependency>
    -    <dependency>
    -        <groupId>org.springframework</groupId>
    -        <artifactId>spring-context</artifactId>
    -        <version>${org.springframework.version}</version>
    -    </dependency>
    -    <dependency>
    -        <groupId>org.springframework</groupId>
    -        <artifactId>spring-jdbc</artifactId>
    -        <version>${org.springframework.version}</version>
    -    </dependency>
    -</dependencies>
    -]]></xml><html>          
    -
    -                                    <h3>Create a minimal Spring configuration file</h3>
    -                                    <p>
    -                                        The above dependencies are configured together using a Spring Beans configuration:
    -                                    </p>
    -                                    
    -</html><xml><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
    -<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
    -
    -<beans>
    -    <!-- Using Apache DBCP as a connection pooling library.
    -         Replace this with your preferred DataSource implementation -->
    -    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
    -        init-method="createDataSource" destroy-method="close">
    -        <property name="driverClassName" value="org.h2.Driver" />
    -        <property name="url" value="jdbc:h2:~/maven-test" />
    -        <property name="username" value="sa" />
    -        <property name="password" value="" />
    -    </bean>
    -
    -    <!-- Using Spring JDBC for transaction management -->
    -    <bean id="transactionManager"
    -        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    -        <property name="dataSource" ref="dataSource" />
    -    </bean>
    -
    -    <bean id="transactionAwareDataSource"
    -        class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy">
    -        <constructor-arg ref="dataSource" />
    -    </bean>
    -
    -    <!-- Bridging Spring JDBC data sources to jOOQ's ConnectionProvider -->
    -    <bean class="org.jooq.impl.DataSourceConnectionProvider" name="connectionProvider">
    -        <constructor-arg ref="transactionAwareDataSource" />
    -    </bean>
    -
    -    <bean id="dsl" class="org.jooq.impl.DefaultDSLContext">
    -        <constructor-arg ref="config" />
    -    </bean>
    -
    -    <!-- Invoking an internal, package-private constructor for the example
    -         Implement your own Configuration for more reliable behaviour -->
    -    <bean class="org.jooq.impl.DefaultConfiguration" name="config">
    -        <constructor-arg index="0" ref="connectionProvider" />
    -        <constructor-arg index="1"><null /></constructor-arg>
    -        <constructor-arg index="2"><value type="org.jooq.SQLDialect">H2</value></constructor-arg>
    -        <constructor-arg index="3"><null /></constructor-arg>
    -        <constructor-arg index="4"><null /></constructor-arg>
    -    </bean>
    -</beans>]]></xml><html>
    -
    -                                    <h3>Run a query in the JDBC Connection's transaction:</h3>
    -                                    <p>
    -                                        The following simple program shows how you can now easily obtain a <reference id="dsl-context" title="DSLContext" /> instance, from which queries can be executed:
    -                                    </p>
    -                                    
    -</html><java><![CDATA[package org.jooq.test.spring;
    -
    -import org.jooq.DSLContext;
    -
    -import org.springframework.context.ApplicationContext;
    -import org.springframework.context.support.ClassPathXmlApplicationContext;
    -
    -public class Test {
    -    public static void main(String[] args) {
    -
    -        // Configure the Spring application context, loading the bean configuration
    -        ApplicationContext context =
    -        new ClassPathXmlApplicationContext(new String[] {
    -            "jooq-spring-config-minimal.xml"
    -        });
    -
    -        // Fetch a DSLContext reference
    -        DSLContext dsl = context.getBean("dsl", DSLContext.class);
    -
    -        // Execute a jOOQ query in its JDBC Connection's transaction
    -        // ---------------------------------------------------------
    -        System.out.println(dsl.selectOne().fetch());
    -    }
    -}]]></java><html>
    -
    -                                    <p>
    -                                        The above example shows how Spring's TransactionAwareDataSourceProxy discovers that a jOOQ query is not executed in a transactional context.
    -                                    </p>
    -                                    
    -                                    <h3>Run a query in an "explicit transaction":</h3>
    -                                    <p>
    -                                        The following simple program shows how Spring's TransactionAwareDataSourceProxy will discover that several jOOQ queries are executed in the context of an explicitly created transaction 
    -                                    </p>
    -                                    
    -</html><java><![CDATA[package org.jooq.test.spring;
    -
    -import org.jooq.DSLContext;
    -
    -import org.springframework.context.ApplicationContext;
    -import org.springframework.context.support.ClassPathXmlApplicationContext;
    -
    -public class Test {
    -    public static void main(String[] args) {
    -
    -        // Configure the Spring application context, loading the bean configuration
    -        ApplicationContext context =
    -        new ClassPathXmlApplicationContext(new String[] {
    -            "jooq-spring-config-minimal.xml"
    -        });
    -
    -        // Fetch a DSLContext reference
    -        DSLContext dsl = context.getBean("dsl", DSLContext.class);
    -
    -        // Execute some jOOQ queries in an explicit transaction
    -        // ----------------------------------------------------
    -        PlatformTransactionManager transactionManager =
    -            context.getBean("transactionManager", PlatformTransactionManager.class);
    -
    -        TransactionStatus tx = transactionManager.getTransaction(new DefaultTransactionDefinition());
    -        dsl.selectOne().fetch();
    -        dsl.selectOne().fetch();
    -        dsl.selectOne().fetch();
    -        transactionManager.commit(tx);
    -    }
    -}]]></java><html>                                  
    -
    -                                    <p>
    -                                        Of course, in an actual productive setup, you are more likely to use Spring's AOP features to declare transactions and transactional behaviour on service methods, instead of explicitly starting and committing / rollbacking transactions. There are many other transaction models that you can choose to use with jOOQ.
    -                                    </p>  
    -								</html></content>
    -							</section>
    -
    -							<section id="a-simple-web-application">
    -								<title>A simple web application with jOOQ</title>
    -								<content><html>
    -									<p>Feel free to contribute a tutorial!</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -					
    -					<section id="jooq-and-scala">
    -						<title>jOOQ and Scala</title>
    -						<content><html>
    -							<p>
    -								As any other library, jOOQ can be easily used in Scala, taking advantage of the many Scala language features such as for example:
    -							</p>
    -							<ul>
    -								<li>Optional "." to dereference methods from expressions</li>
    -								<li>Optional "(" and ")" to delimit method argument lists</li>
    -								<li>Optioanl ";" at the end of a Scala statement</li>
    -								<li>Type inference using "var" and "val" keywords</li>
    -							</ul>
    -						
    -							<p>
    -								But jOOQ also leverages other useful Scala features, such as
    -							</p>
    -							<ul>
    -								<li>implicit defs for operator overloading</li>
    -								<li>Scala Macros (soon to come)</li>
    -							</ul>
    -							
    -							<p>
    -								A short example jOOQ application in Scala might look like this:
    -							</p>
    -							
    -</html><scala><![CDATA[
    -import collection.JavaConversions._                                  // Import implicit defs for iteration over org.jooq.Result
    -                                                                     //
    -import java.sql.DriverManager                                        //
    -                                                                     //
    -import org.jooq._                                                    //
    -import org.jooq.impl._                                               //
    -import org.jooq.impl.DSL._                                           //
    -import org.jooq.scala.example.h2.Tables._                            //
    -import org.jooq.scala.Conversions._                                  // Import implicit defs for overloaded jOOQ/SQL operators
    -                                                                     //
    -object Test {                                                        //
    -  def main(args: Array[String]): Unit = {                            //
    -    val c = DriverManager.getConnection("jdbc:h2:~/test", "sa", ""); // Standard JDBC connection
    -    val e = DSL.using(c, SQLDialect.H2);                             //
    -    val x = T_AUTHOR as "x"                                          // SQL-esque table aliasing
    -                                                                     //
    -    for (r <- e                                                      // Iteration over Result. "r" is an org.jooq.Record3
    -        select (                                                     //
    -          T_BOOK.ID * T_BOOK.AUTHOR_ID,                              // Using the overloaded "*" operator
    -          T_BOOK.ID + T_BOOK.AUTHOR_ID * 3 + 4,                      // Using the overloaded "+" operator
    -          T_BOOK.TITLE || " abc" || " xy"                            // Using the overloaded "||" operator
    -        )                                                            //
    -        from T_BOOK                                                  // No need to use parentheses or "." here
    -        leftOuterJoin (                                              //
    -          select (x.ID, x.YEAR_OF_BIRTH)                             // Dereference fields from aliased table
    -          from x                                                     //
    -          limit 1                                                    //
    -          asTable x.getName()                                        //
    -        )                                                            //
    -        on T_BOOK.AUTHOR_ID === x.ID                                 // Using the overloaded "===" operator
    -        where (T_BOOK.ID <> 2)                                       // Using the olerloaded "<>" operator
    -        or (T_BOOK.TITLE in ("O Alquimista", "Brida"))               // Neat IN predicate expression
    -        fetch                                                        //
    -    ) {                                                              //
    -      println(r)                                                     //
    -    }                                                                //
    -  }                                                                  //
    -}]]></scala><html>
    -
    -							<p>
    -								For more details about jOOQ's Scala integration, please refer to the manual's section about <reference id="scala-sql-building" title="SQL building with Scala"/>.
    -							</p>
    -						</html></content>
    -					</section>
    -					
    -					<section id="dependencies">
    -						<title>Dependencies</title>
    -						<content><html>
    -							<p>
    -								Dependencies are a big hassle in modern software. Many libraries depend on other, non-JDK library parts that come in different, incompatible versions, potentially causing trouble in your runtime environment. jOOQ has no external dependencies on any third-party libraries.
    -							</p>
    -							<p>
    -								However, the above rule has some exceptions:
    -							</p>
    -							<ul>
    -								<li><reference id="logging" title="logging APIs"/> are referenced as "optional dependencies". jOOQ tries to find <a href="http://www.slf4j.org/">slf4j</a> or <a href="http://logging.apache.org/log4j">log4j</a> on the classpath. If it fails, it will use the <reference class="java.util.logging.Logger"/></li>
    -								<li>Oracle ojdbc types used for array creation are loaded using reflection. The same applies to Postgres PG* types.</li>
    -								<li>Small libraries with compatible licenses are incorporated into jOOQ. These include <a href="https://github.com/jOOQ/jOOR">jOOR</a>, <a href="https://github.com/jOOQ/jOOU">jOOU</a>, parts of <a href="http://opencsv.sourceforge.net/">OpenCSV</a>, <a href="http://code.google.com/p/json-simple/">json simple</a>, parts of <a href="http://commons.apache.org/lang/">commons-lang</a></li>
    -								<li><a href="http://docs.oracle.com/javaee/6/api/javax/persistence/package-summary.html">javax.persistence</a> and <a href="http://docs.oracle.com/javaee/6/api/javax/validation/package-summary.html">javax.validation</a> will be needed if you activate the relevant <reference id="code-generation" title="code generation flags"/></li>
    -							</ul>
    -						</html></content>
    -					</section>
    -					
    -					<section id="build-your-own">
    -						<title>Build your own</title>
    -						<content><html>
    -							<p>
    -								In order to build jOOQ yourself, please download the sources from <a href="https://github.com/jOOQ/jOOQ">https://github.com/jOOQ/jOOQ</a> and use Maven to build jOOQ, preferably in Eclipse. jOOQ requires Java 6+ to compile and run.
    -							</p>
    -							<p>
    -								Some useful hints to build jOOQ yourself:
    -							</p>
    -							<ul>
    -								<li>Get the latest version of <a href="http://git-scm.com">Git</a> or <a href="http://www.eclipse.org/egit">EGit</a></li>
    -								<li>Get the latest version of <a href="http://maven.apache.org">Maven</a> or <a href="http://eclipse.org/m2e">M2E</a></li>
    -								<li>Check out the jOOQ sources from <a href="https://github.com/jOOQ/jOOQ">https://github.com/jOOQ/jOOQ</a></li>
    -								<li>Optionally, import Maven artefacts into an Eclipse workspace using the following command (see the <a href="http://maven.apache.org/plugins/maven-eclipse-plugin/">maven-eclipse-plugin</a> documentation for details):
    -									<ul>
    -										<li><code>mvn eclipse:eclipse</code></li>
    -									</ul>
    -								</li>
    -								<li>Build the <code>jooq-parent</code> artefact by using any of these commands:
    -									<ul>
    -										<li><code>mvn clean package</code><br/>create .jar files in <code>${project.build.directory}</code></li>
    -										<li><code>mvn clean install</code><br/>install the .jar files in your local repository (e.g. <code>~/.m2</code>)</li>
    -										<li><code>mvn clean {goal} -Dmaven.test.skip=true</code><br/>don't run unit tests when building artefacts</li>
    -									</ul>
    -								</li>
    -							</ul>
    -						</html></content>
    -					</section>
    -					
    -					<section id="semantic-versioning">
    -						<title>jOOQ and backwards-compatibility</title>
    -						<content><html>
    -							<p>
    -								jOOQ follows the rules of semantic versioning according to <a href="http://semver.org">http://semver.org</a> quite strictly. Those rules impose a versioning scheme [X].[Y].[Z] that can be summarised as follows:
    -							</p>
    -							<ul>
    -								<li>If a patch release includes bugfixes, performance improvements and API-irrelevant new features, [Z] is incremented by one.</li>
    -								<li>If a minor release includes backwards-compatible, API-relevant new features, [Y] is incremented by one and [Z] is reset to zero.</li>
    -								<li>If a major release includes backwards-incompatible, API-relevant new features, [X] is incremented by one and [Y], [Z] are reset to zero.</li>
    -							</ul>
    -							
    -							<h3>jOOQ's understanding of backwards-compatibility</h3>
    -							<p>
    -								Backwards-compatibility is important to jOOQ. You've chosen jOOQ as a strategic SQL engine and you don't want your SQL to break. That is why there is at most one major release per year, which changes only those parts of jOOQ's API and functionality, which were agreed upon on the user group. During the year, only minor releases are shipped, adding new features in a backwards-compatible way
    -							</p>
    -							<p>
    -								However, there are some elements of API evolution that would be considered backwards-incompatible in other APIs, but not in jOOQ. As discussed later on in the section about <reference id="dsl-and-non-dsl" title="jOOQ's DSL API"/>, much of jOOQ's API is indeed an internal domain-specific language implemented mostly using Java interfaces. Adding language elements to these interfaces means any of these actions:  
    -							</p>
    -							<ul>
    -								<li>Adding methods to the interface</li>
    -								<li>Overloading methods for convenience</li>
    -								<li>Changing the type hierarchy of interfaces</li>
    -							</ul>
    -							
    -							<p>
    -								It becomes obvious that it would be impossible to add new language elements (e.g. new <reference id="column-expressions" title="SQL functions"/>, new <reference id="select-statement" title="SELECT clauses"/>) to the API without breaking any client code that actually implements those interfaces. Hence, the following rule should be observed: 
    -							</p>
    -							
    -							<p>jOOQ's DSL interfaces should not be implemented by client code! Extend only those extension points that are explicitly documented as "extendable" (e.g. <reference id="custom-queryparts" title="custom QueryParts"/>)</p>
    -						</html></content>
    -					</section>
    -				</sections>
    -			</section>
    -
    -			<section id="sql-building">
    -				<title>SQL building</title>
    -				<content><html>
    -					<p>
    -					    SQL is a declarative language that is hard to integrate into procedural, object-oriented, functional or any other type of programming languages. jOOQ's philosophy is to give SQL the credit it deserves and integrate SQL itself as an <a href="http://en.wikipedia.org/wiki/Domain_Specific_Language">"internal domain specific language"</a> directly into Java.
    -					</p>
    -					<p>
    -						With this philosophy in mind, SQL building is the main feature of jOOQ. All other features (such as <reference id="sql-execution" title="SQL execution"/> and <reference id="code-generation" title="code generation"/>) are mere convenience built on top of jOOQ's SQL building capabilities.
    -					</p>
    -					<p>
    -						This section explains all about the various syntax elements involved with jOOQ's SQL building capabilities. For a complete overview of all syntax elements, please refer to the manual's sections about <reference id="dsl-mapping-rules" title="SQL to DSL mapping rules"/> as well as <reference id="reference-bnf-notation" title="jOOQ's BNF notation"/>
    -					</p>
    -				</html></content>
    -
    -				<sections>
    -                    <redirect id="factory" redirect-to="dsl">
    -                        <redirect id="factory-subclasses" redirect-to="dsl-subclasses"/>
    -                    </redirect>
    -                    
    -					<section id="dsl">
    -					    <title>The DSL type</title>
    -					    <content><html>
    -							<p>
    -								jOOQ exposes a lot of interfaces and hides most implementation facts from client code. The reasons for this are:
    -							</p>
    -							<ul>
    -								<li>Interface-driven design. This allows for modelling queries in a fluent API most efficiently</li>
    -								<li>Reduction of complexity for client code.</li>
    -								<li>API guarantee. You only depend on the exposed interfaces, not concrete (potentially dialect-specific) implementations.</li>
    -							</ul>
    -							<p>
    -								The <reference class="org.jooq.impl.DSL"/> class is the main class from where you will create all jOOQ objects.	It serves as a static factory for <reference id="table-expressions" title="table expressions"/>, <reference id="column-expressions" title="column expressions"/> (or "fields"), <reference id="conditional-expressions" title="conditional expressions"/> and many other <reference id="queryparts" title="QueryParts"/>.
    -							</p>
    -
    -							<h3>The static DSL API</h3>
    -							<p>
    -								With jOOQ 2.0, static factory methods have been introduced in order to make client code look more like SQL. Ideally, when working with jOOQ, you will simply static import all methods from the DSL class:
    -							</p>
    -
    -</html><java>import static org.jooq.impl.DSL.*;</java><html>
    -
    -							<p>
    -							    Note, that when working with Eclipse, you could also add the DSL to your favourites. This will allow to access functions even more fluently:
    -							</p>
    -</html><java>concat(trim(FIRST_NAME), trim(LAST_NAME));
    -
    -// ... which is in fact the same as:
    -DSL.concat(DSL.trim(FIRST_NAME), DSL.trim(LAST_NAME));</java>
    -					    </content>
    -					    
    -					    <sections>
    -							<section id="dsl-subclasses">
    -								<title>DSL subclasses</title>
    -								<content><html>
    -									<p>
    -										There are a couple of subclasses for the general DSL. Each SQL dialect has its own dialect-specific DSL. For instance, if you're only using the MySQL dialect, you can choose to reference the MySQLDSL instead of the standard DSL:
    -									</p>
    -									<p>
    -										The advantage of referencing a dialect-specific DSL lies in the fact that you have access to more proprietary RDMBS functionality. This may include:
    -									</p>
    -									<ul>
    -		    							<li>MySQL's encryption functions</li>
    -		    							<li>PL/SQL constructs, pgplsql, or any other dialect's ROUTINE-language (maybe in the future)</li>
    -									</ul>
    -								</html></content>
    -							</section>
    -					    </sections>
    -					</section>
    -                    
    -                    <redirect id="executor" redirect-to="dsl-context">
    -                        <redirect id="sql-dialects" redirect-to="sql-dialects"/>
    -                        <redirect id="connection-vs-datasource" redirect-to="connection-vs-datasource"/>
    -                        <redirect id="custom-data" redirect-to="custom-data"/>
    -                        <redirect id="custom-execute-listeners" redirect-to="custom-execute-listeners"/>
    -                        <redirect id="custom-settings" redirect-to="custom-settings"/>
    -                        <redirect id="runtime-schema-mapping" redirect-to="runtime-schema-mapping"/>
    -                    </redirect>
    -					
    -					<section id="dsl-context">
    -						<title>The DSLContext class</title>
    -						<content><html>
    -							<p>
    -							    DSLContext references a <reference class="org.jooq.Configuration"/>, an object that configures jOOQ's behaviour when executing queries (see <reference id="sql-execution"/> for more details). Unlike the static DSL, the DSLContext allow for creating <reference id="sql-statements" title="SQL statements"/> that are already "configured" and ready for execution.
    -							</p>
    -							
    -                            <h3>Fluent creation of a DSLContext object</h3>
    -                            <p>
    -                                The DSLContext object can be created fluently from the <reference id="dsl" title="DSL type"/>:
    -                            </p>
    -
    -</html><java><![CDATA[// Create it from a pre-existing configuration
    -DSLContext create = DSL.using(configuration);
    -
    -// Create it from ad-hoc arguments
    -DSLContext create = DSL.using(connection, dialect);]]></java><html>
    -
    -                            <p>
    -                                If you do not have a reference to a pre-existing Configuration object (e.g. created from <reference class="org.jooq.impl.DefaultConfiguration"/>), the various overloaded <code>DSL.using()</code> methods will create one for you.
    -                            </p>
    -                            
    -							<h3>Contents of a Configuration object</h3>
    -							<p>
    -							    A Configuration can be supplied with these objects:
    -							</p>
    -							<ul>
    -								<li><reference class="org.jooq.SQLDialect"/> : The dialect of your database. This may be any of the currently supported database types (see <reference id="sql-dialects"/> for more details)</li>
    -    							<li><reference class="org.jooq.conf.Settings"/> : An optional runtime configuration (see <reference id="custom-settings"/> for more details)</li>
    -								<li><reference class="org.jooq.ExecuteListenerProvider"/> : An optional reference to a provider class that can provide execute listeners to jOOQ (see <reference id="execute-listeners"/> for more details)</li>
    -                                <li><reference class="org.jooq.RecordMapperProvider"/> : An optional reference to a provider class that can provide record mappers to jOOQ (see <reference id="pojos-with-recordmapper-provider"/> for more details)</li>
    -                                <li>
    -									Any of these:
    -									<ul>
    -										<li><reference class="java.sql.Connection"/> : An optional JDBC Connection that will be re-used for the whole lifecycle of your Configuration (see <reference id="connection-vs-datasource"/> for more details). For simplicity, this is the use-case referenced from this manual, most of the time.</li>
    -		    							<li><reference class="java.sql.DataSource"/> : An optional JDBC DataSource that will be re-used for the whole lifecycle of your Configuration. If you prefer using DataSources over Connections, jOOQ will internally fetch new Connections from your DataSource, conveniently closing them again after query execution. This is particularly useful in J2EE or Spring contexts (see <reference id="connection-vs-datasource"/> for more details)</li>
    -		    							<li><reference class="org.jooq.ConnectionProvider"/> : A custom abstraction that is used by jOOQ to "acquire" and "release" connections. jOOQ will internally "acquire" new Connections from your ConnectionProvider, conveniently "releasing" them again after query execution. (see <reference id="connection-vs-datasource"/> for more details)</li>
    -									</ul>
    -								</li>
    -							</ul>
    -							
    -							<p>
    -								Wrapping a Configuration object, a DSLContext can construct <reference id="sql-statements" title="statements"/>, for later <reference id="sql-execution" title="execution"/>. An example is given here:
    -							</p>
    -</html><java><![CDATA[// The DSLContext is "configured" with a Connection and a SQLDialect
    -DSLContext create = DSL.using(connection, dialect);
    -
    -// This select statement contains an internal reference to the DSLContext's Configuration:
    -Select<?> select = create.selectOne();
    -
    -// Using the internally referenced Configuration, the select statement can now be executed:
    -Result<?> result = select.fetch();]]></java><html>
    -
    -                            <p>
    -                                Note that you do not need to keep a reference to a DSLContext. You may as well inline your local variable, and fluently execute a SQL statement as such:
    -                            </p>
    -
    -</html><java><![CDATA[// Execute a statement from a single execution chain:
    -Result<?> result =
    -DSL.using(connection, dialect)
    -   .select()
    -   .from(BOOK)
    -   .where(BOOK.TITLE.like("Animal%"))
    -   .fetch();]]></java>
    -						</content>
    -
    -						<sections>
    -							<section id="sql-dialects">
    -								<title>SQL Dialect</title>
    -								<content><html>
    -									<p>
    -										While jOOQ tries to represent the SQL standard as much as possible, many features are vendor-specific to a given database and to its "SQL dialect". jOOQ models this using the <reference class="org.jooq.SQLDialect"/> enum type.
    -									</p>
    -									<p>
    -										The SQL dialect is one of the main attributes of a <reference id="dsl-context" title="Configuration"/>. Queries created from DSLContexts will assume dialect-specific behaviour when <reference id="sql-rendering" title="rendering SQL"/> and <reference id="variable-binding" title="binding bind values"/>.
    -									</p>
    -									<p>
    -										Some parts of the jOOQ API are officially supported only by a given subset of the supported SQL dialects. For instance, the <reference id="connect-by-clause" title="Oracle CONNECT BY clause"/>, which is supported by the Oracle and CUBRID databases, is annotated with a <reference class="org.jooq.Support"/> annotation, as such:
    -									</p>
    -</html><java><![CDATA[/**
    - * Add an Oracle-specific <code>CONNECT BY</code> clause to the query
    - */
    -@Support({ SQLDialect.CUBRID, SQLDialect.ORACLE })
    -SelectConnectByConditionStep<R> connectBy(Condition condition);]]></java><html>
    -
    -									<p>
    -									    jOOQ API methods which are not annotated with the <reference class="org.jooq.Support"/> annotation, or which are annotated with the Support annotation, but without any SQL dialects can be safely used in all SQL dialects. An example for this is the <reference id="select-statement" title="SELECT statement"/> factory method:
    -									</p>
    -</html><java><![CDATA[/**
    - * Create a new DSL select statement.
    - */
    -@Support
    -SelectSelectStep<R> select(Field<?>... fields);]]></java><html>
    -
    -									<h3>jOOQ's SQL clause simulation capabilities</h3>
    -									<p>
    -										The aforementioned Support annotation does not only designate, which databases natively support a feature. It also indicates that a feature is simulated by jOOQ for some databases lacking this feature. An example of this is the <reference id="distinct-predicate" title="DISTINCT predicate"/>, a predicate syntax defined by SQL:1999 and implemented only by H2, HSQLDB, and Postgres:
    -									</p>
    -
    -</html><sql><![CDATA[A IS DISTINCT FROM B]]></sql><html>
    -
    -									<p>
    -										Nevertheless, the <code>IS DISTINCT FROM</code> predicate is supported by jOOQ in all dialects, as its semantics can be expressed with an equivalent <reference id="case-expressions" title="CASE expression"/>. For more details, see the manual's section about the <reference id="distinct-predicate" title="DISTINCT predicate"/>.
    -									</p>
    -									
    -									<h3>jOOQ and the Oracle SQL dialect</h3>
    -									<p>
    -										Oracle SQL is much more expressive than many other SQL dialects. It features many unique keywords, clauses and functions that are out of scope for the SQL standard. Some examples for this are
    -									</p>
    -									<ul>
    -										<li>The <reference id="connect-by-clause" title="CONNECT BY clause"/>, for hierarchical queries</li>
    -										<li>The <reference id="pivot-tables" title="PIVOT"/> keyword for creating PIVOT tables</li>
    -										<li><reference id="oracle-packages" title="Packages"/>, <reference id="oracle-member-procedures" title="object-oriented user-defined types, member procedures"/> as described in the section about <reference id="stored-procedures" title="stored procedures and functions"/></li>
    -										<li>Advanced analytical functions as described in the section about <reference id="window-functions" title="window functions"/></li>
    -									</ul>
    -
    -									<p>
    -										jOOQ has a historic affinity to Oracle's SQL extensions. If something is supported in Oracle SQL, it has a high probability of making it into the jOOQ API
    -									</p>
    -								</html></content>
    -							</section>
    -
    -                            <section id="sql-dialect-family">
    -                                <title>SQL Dialect Family</title>
    -                                <content><html>
    -                                    <p>
    -                                        In jOOQ 3.1, the notion of a <code>SQLDialect.family()</code> was introduced, in order to group several similar <reference id="sql-dialects" title="SQL dialects"/> into a common family. An example for this is SQL Server, which is supported by jOOQ in various versions:
    -                                    </p>
    -                                    
    -                                    <ul>
    -                                        <li> <reference class="org.jooq.SQLDialect" title="SQL Server" anchor="#SQLSERVER"/>: The "version-less" SQL Server version. This always maps to the latest supported version of SQL Server</li>
    -                                        <li> <reference class="org.jooq.SQLDialect" title="SQL Server 2012" anchor="#SQLSERVER2012"/>: The SQL Server version 2012</li>
    -                                        <li> <reference class="org.jooq.SQLDialect" title="SQL Server 2008" anchor="#SQLSERVER2008"/>: The SQL Server version 2008</li>
    -                                    </ul>
    -                                    
    -                                    <p>
    -                                        In the above list, <code>SQLSERVER</code> is both a dialect and a family of three dialects. This distinction is used internally by jOOQ to distinguish whether to use the <reference id="limit-clause" title="OFFSET .. FETCH"/> clause (SQL Server 2012), or whether to simulate it using <code>ROW_NUMBER() OVER()</code> (SQL Server 2008).
    -                                    </p>
    -                                </html></content>
    -                            </section>
    -
    -							<section id="connection-vs-datasource">
    -								<title>Connection vs. DataSource</title>
    -								<content><html>
    -									<h3>Interact with JDBC Connections</h3>
    -									<p>
    -										While you can use jOOQ for <reference id="sql-building" title="SQL building"/> only, you can also run queries against a JDBC <reference class="java.sql.Connection"/>. Internally, jOOQ creates <reference class="java.sql.Statement"/> or <reference class="java.sql.PreparedStatement"/> objects from such a Connection, in order to execute statements. The normal operation mode is to provide a <reference id="dsl-context" title="Configuration"/> with a JDBC Connection, whose lifecycle you will control yourself. This means that jOOQ will not actively close connections, rollback or commit transactions.
    -									</p>
    -									<p>
    -										Note, in this case, jOOQ will internally use a <reference class="org.jooq.impl.DefaultConnectionProvider"/>, which you can reference directly if you prefer that. The DefaultConnectionProvider exposes various transaction-control methods, such as commit(), rollback(), etc.
    -									</p>
    -									
    -									<h3>Interact with JDBC DataSources</h3>
    -									<p>
    -										If you're in a J2EE or Spring context, however, you may wish to use a <reference class="javax.sql.DataSource"/> instead. Connections obtained from such a DataSource will be closed after query execution by jOOQ. The semantics of such a close operation should be the returning of the connection into a connection pool, not the actual closing of the underlying physical connection. Typically, this makes sense in an environment using distributed JTA transactions. An example of using DataSources with jOOQ can be seen in the tutorial section about <reference id="jooq-with-spring" title="using jOOQ with Spring"/>.
    -									</p>
    -									<p>
    -										Note, in this case, jOOQ iwll internally use a <reference class="org.jooq.impl.DataSourceConnectionProvider"/>, which you can reference directly if you prefer that.
    -									</p>
    -									
    -									<h3>Inject custom behaviour</h3>
    -									<p>
    -										If your specific environment works differently from any of the above approaches, you can inject your own custom implementation of a ConnectionProvider into jOOQ. This is the API contract you have to fulfil:
    -									</p>
    -									
    -</html><java><![CDATA[public interface ConnectionProvider {
    -
    -    // Provide jOOQ with a connection
    -    Connection acquire() throws DataAccessException;
    -  
    -    // Get a connection back from jOOQ
    -    void release(Connection connection) throws DataAccessException;
    -}]]></java><html>
    -
    -									<p>
    -									    Note that <code>acquire()</code> should always return the same Connection until this connection is returned via <code>release()</code> 
    -									</p>
    -								</html></content>
    -							</section>
    -							
    -							<section id="custom-data">
    -								<title>Custom data</title>
    -								<content><html>
    -									<p>
    -										In advanced use cases of integrating your application with jOOQ, you may want to put custom data into your <reference id="dsl-context" title="Configuration"/>, which you can then access from your...
    -									</p>
    -									
    -									<ul>
    -										<li><reference id="custom-execute-listeners" title="Custom ExecuteListeners"/></li>
    -										<li><reference id="custom-queryparts" title="Custom QueryParts"/></li>
    -									</ul>
    -									
    -									<p>
    -										Here is an example of how to use the custom data API. Let's assume that you have written an <reference id="execute-listeners" title="ExecuteListener"/>, that prevents <code>INSERT</code> statements, when a given flag is set to <code>true</code>: 
    -									</p>
    -
    -</html><java><![CDATA[// Implement an ExecuteListener
    -public class NoInsertListener extends DefaultExecuteListener {
    -
    -    @Override
    -    public void start(ExecuteContext ctx) {
    -    
    -        // This listener is active only, when your custom flag is set to true
    -        if (Boolean.TRUE.equals(ctx.configuration().data("com.example.my-namespace.no-inserts"))) {
    -        
    -            // If active, fail this execution, if an INSERT statement is being executed
    -            if (ctx.query() instanceof Insert) {
    -                throw new DataAccessException("No INSERT statements allowed");
    -            }
    -        }
    -    }
    -}]]></java><html>
    -									<p>
    -										See the manual's section about <reference id="execute-listeners" title="ExecuteListeners"/> to learn more about how to implement an <code>ExecuteListener</code>.
    -									</p>
    -									
    -									<p>
    -										Now, the above listener can be added to your <reference id="dsl-context" title="Configuration"/>, but you will also need to pass the flag to the <code>Configuration</code>, in order for the listener to work:
    -									</p>
    -									
    -</html><java><![CDATA[// Create your Configuration
    -Configuration configuration = new DefaultConfiguration().set(connection).set(dialect);
    -
    -// Set a new execute listener provider onto the configuration:
    -configuration.set(new DefaultExecuteListenerProvider(new NoInsertListener()));
    -
    -// Use any String literal to identify your custom data
    -configuration.data("com.example.my-namespace.no-inserts", true);
    -
    -// Try to execute an INSERT statement
    -try {
    -    DSL.using(configuration)
    -       .insertInto(AUTHOR, AUTHOR.ID, AUTHOR.LAST_NAME)
    -       .values(1, "Orwell")
    -       .execute();
    -          
    -    // You shouldn't get here
    -    Assert.fail();
    -}
    -
    -// Your NoInsertListener should be throwing this exception here:
    -catch (DataAccessException expected) {
    -    Assert.assertEquals("No INSERT statements allowed", expected.getMessage());
    -}]]></java><html>
    -
    -									<p>
    -										Using the <code>data()</code> methods, you can store and retrieve custom data in your <code>Configurations</code>.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="custom-execute-listeners">
    -								<title>Custom ExecuteListeners</title>
    -								<content><html>
    -									<p>
    -										<code>ExecuteListeners</code> are a useful tool to...
    -									</p>
    -									
    -									<ul>
    -										<li>implement custom logging</li>
    -										<li>apply triggers written in Java</li>
    -										<li>collect query execution statistics</li>
    -									</ul>
    -									
    -									<p>
    -										ExecuteListeners are hooked into your <reference id="dsl-context" title="Configuration"/> by returning them from an <reference class="org.jooq.ExecuteListenerProvider"/>:
    -									</p>
    -
    -</html><java><![CDATA[// Create your Configuration
    -Configuration configuration = new DefaultConfiguration().set(connection).set(dialect);
    -
    -// Hook your listener providers into the configuration:
    -configuration.set(
    -    new DefaultExecuteListenerProvider(new MyFirstListener()),
    -    new DefaultExecuteListenerProvider(new PerformanceLoggingListener()),
    -    new DefaultExecuteListenerProvider(new NoInsertListener())
    -);]]></java><html>
    -									
    -									<p>
    -										See the manual's section about <reference id="execute-listeners" title="ExecuteListeners"/> to see examples of such listener implementations.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="custom-settings">
    -								<title>Custom Settings</title>
    -								<content><html>
    -									<p>
    -										The jOOQ Configuration allows for some optional configuration elements to be used by advanced users. The <reference class="org.jooq.conf.Settings" /> class is a JAXB-annotated type, that can be provided to a Configuration in several ways:
    -									</p>
    -									<ul>
    -										<li>In the DSLContext constructor (<code>DSL.using()</code>). This will override default settings below</li>
    -										<li>in the <reference class="org.jooq.impl.DefaultConfiguration"/> constructor. This will override default settings below</li>
    -                                        <li>From a location specified by a JVM parameter: -Dorg.jooq.settings</li>
    -										<li>From the classpath at /jooq-settings.xml</li>
    -										<li>From the settings defaults, as specified in <a href="http://www.jooq.org/xsd/jooq-runtime-{runtime-xsd-version}.xsd" title="The jOOQ Runtime configuration XSD">http://www.jooq.org/xsd/jooq-runtime-{runtime-xsd-version}.xsd</a></li>
    -									</ul>
    -									<h3>Example</h3>
    -									<p>
    -										For example, if you want to indicate to jOOQ, that it should inline all bind variables, and execute static <reference class="java.sql.Statement"/> instead of binding its variables to <reference class="java.sql.PreparedStatement"/>, you can do so by creating the following DSLContext:
    -									</p>
    -</html><java><![CDATA[Settings settings = new Settings();
    -settings.setStatementType(StatementType.STATIC_STATEMENT);
    -DSLContext create = DSL.using(connection, dialect, settings);]]></java><html>
    -									<p>
    -										Subsequent sections of the manual contain some more in-depth explanations about these settings:
    -									</p>
    -									<ul>
    -										<li>
    -		     								<reference id="schema-mapping" title="Runtime schema and table mapping"/>
    -		   								</li>
    -		     							<li>
    -		     								<reference id="optimistic-locking" title="Execute CRUD with optimistic locking enabled"/>
    -		     							</li>
    -		     							<li>
    -		     								<reference id="logging" title="Enabling DEBUG logging of all executed SQL"/>
    -		     							</li>
    -		   							</ul>
    -		   							<p>
    -										Please refer to the jOOQ runtime configuration XSD for more details:<br/>
    -										<a href="http://www.jooq.org/xsd/jooq-runtime-{runtime-xsd-version}.xsd" title="The jOOQ Runtime configuration XSD">http://www.jooq.org/xsd/jooq-runtime-{runtime-xsd-version}.xsd</a>
    -									</p>
    -								</html></content>
    -							</section>
    -							
    -							<section id="runtime-schema-mapping">
    -								<title>Runtime schema and table mapping</title>
    -								<content><html>
    -									<h3>Mapping your DEV schema to a productive environment</h3>
    -									<p>
    -										You may wish to design your database in a way that you have several instances of your schema. This is useful when you want to cleanly separate data belonging to several customers / organisation units / branches / users and put each of those entities' data in a separate database or schema.
    -									</p>
    -									
    -									<p>
    -										In our AUTHOR example this would mean that you provide a book reference database to several companies, such as My Book World and Books R Us. In that case, you'll probably have a schema setup like this:
    -									</p>
    -									<ul>
    -										<li>DEV: Your development schema. This will be the schema that you base code generation upon, with jOOQ </li>
    -										<li>MY_BOOK_WORLD: The schema instance for My Book World </li>
    -										<li>BOOKS_R_US: The schema instance for Books R Us </li>
    -									</ul>
    -
    -									<h3>Mapping DEV to MY_BOOK_WORLD with jOOQ</h3>
    -									<p>
    -										When a user from My Book World logs in, you want them to access the MY_BOOK_WORLD schema using classes generated from DEV. This can be achieved with the <reference class="org.jooq.conf.RenderMapping"/> class, that you can equip your Configuration's <reference id="custom-settings" title="settings"/> with. Take the following example:
    -									</p>
    -
    -</html><java>Settings settings = new Settings()
    -    .withRenderMapping(new RenderMapping()
    -    .withSchemata(
    -        new MappedSchema().withInput("DEV")
    -                          .withOutput("MY_BOOK_WORLD")));
    -
    -// Add the settings to the DSLContext
    -DSLContext create = DSL.using(connection, SQLDialect.ORACLE, settings);
    -
    -// Run queries with the "mapped" Configuration
    -create.selectFrom(AUTHOR).fetch();</java><html>
    -
    -									<p>
    -										The query executed with a Configuration equipped with the above mapping will in fact produce this SQL statement:
    -									</p>
    -									
    -</html><sql>SELECT * FROM MY_BOOK_WORLD.AUTHOR</sql><html>
    -									<p>
    -										Even if AUTHOR was generated from DEV.
    -									</p>
    -
    -									<h3>Mapping several schemata</h3>
    -									<p>
    -										Your development database may not be restricted to hold only one DEV schema. You may also have a LOG schema and a MASTER schema. Let's say the MASTER schema is shared among all customers, but each customer has their own LOG schema instance. Then you can enhance your RenderMapping like this (e.g. using an XML configuration file):
    -									</p>
    -
    -</html><xml><![CDATA[<settings xmlns="http://www.jooq.org/xsd/jooq-runtime-{runtime-xsd-version}.xsd">
    -  <renderMapping>
    -    <schemata>
    -      <schema>
    -        <input>DEV</input>
    -        <output>MY_BOOK_WORLD</output>
    -      </schema>
    -      <schema>
    -        <input>LOG</input>
    -        <output>MY_BOOK_WORLD_LOG</output>
    -      </schema>
    -    </schemata>
    -  </renderMapping>
    -</settings>]]></xml><html>
    -
    -                            		<p>
    -                            			Note, you can load the above XML file like this:
    -                           			</p>
    -
    -</html><java>Settings settings = JAXB.unmarshal(new File("jooq-runtime.xml"), Settings.class);</java><html>
    -
    -									<p>
    -										This will map generated classes from DEV to MY_BOOK_WORLD, from LOG to MY_BOOK_WORLD_LOG, but leave the MASTER schema alone. Whenever you want to change your mapping configuration, you will have to create a new Configuration.
    -									</p>
    -
    -
    -									<h3>Using a default schema</h3>
    -                            		<p>
    -                            			If you wish not to render any schema name at all, use the following Settings property for this:
    -                           			</p>
    -
    -
    -</html><java>Settings settings = new Settings()
    -    .withRenderSchema(false);
    -
    -// Add the settings to the Configuration
    -DSLContext create = DSL.using(connection, SQLDialect.ORACLE, settings);
    -
    -// Run queries that omit rendering schema names
    -create.selectFrom(AUTHOR).fetch();</java><html>
    -
    -									<h3>Mapping of tables</h3>
    -									<p>
    -										Not only schemata can be mapped, but also tables. If you are not the owner of the database your application connects to, you might need to install your schema with some sort of prefix to every table. In our examples, this might mean that you will have to map DEV.AUTHOR to something MY_BOOK_WORLD.MY_APP__AUTHOR, where MY_APP__ is a prefix applied to all of your tables. This can be achieved by creating the following mapping: 
    -									</p>
    -
    -</html><java>Settings settings = new Settings()
    -    .withRenderMapping(new RenderMapping()
    -    .withSchemata(
    -        new MappedSchema().withInput("DEV")
    -                          .withOutput("MY_BOOK_WORLD")
    -                          .withTables(
    -         new MappedTable().withInput("AUTHOR")
    -                          .withOutput("MY_APP__AUTHOR"))));
    -
    -// Add the settings to the Configuration
    -DSLContext create = DSL.using(connection, SQLDialect.ORACLE, settings);
    -
    -// Run queries with the "mapped" configuration
    -create.selectFrom(AUTHOR).fetch();</java><html>
    -
    -									<p>
    -										The query executed with a Configuration equipped with the above mapping will in fact produce this SQL statement:
    -									</p>
    -									
    -</html><sql>SELECT * FROM MY_BOOK_WORLD.MY_APP__AUTHOR</sql><html>
    -
    -		                            <p>
    -		                           		Table mapping and schema mapping can be applied independently, by specifying several MappedSchema entries in the above configuration. jOOQ will process them in order of appearance and map at first match. Note that you can always omit a MappedSchema's output value, in case of which, only the table mapping is applied. If you omit a MappedSchema's input value, the table mapping is applied to all schemata!
    -		                            </p>
    -
    -									<h3>Hard-wiring mappings at code-generation time</h3>
    -									<p>
    -										Note that the manual's section about <reference id="schema-mapping" title="code generation schema mapping"/> explains how you can hard-wire your schema mappings at code generation time
    -									</p>									
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -					<section id="sql-statements">
    -						<title>SQL Statements</title>
    -						<content><html>
    -							<p>
    -								jOOQ currently supports 6 types of SQL statements. All of these statements are constructed from a DSLContext instance with an optional <reference id="connection-vs-datasource" title="JDBC Connection or DataSource"/>. If supplied with a Connection or DataSource, they can be executed. Depending on the <reference id="query-vs-resultquery" title="query type"/>, executed queries can return results.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="dsl-and-non-dsl">
    -								<title>jOOQ's DSL and model API</title>
    -								<content><html>
    -									<p>
    -										jOOQ ships with its own DSL (or	<a href="http://en.wikipedia.org/wiki/Domain-specific_language" title="Domain Specific Language">Domain Specific Language</a>) that	simulates SQL in Java. This means, that you can	write SQL statements almost as if Java natively supported it, just like .NET's C# does with <a href="http://msdn.microsoft.com/en-us/library/bb425822.aspx">LINQ to SQL.</a>
    -									</p>
    -									<p>
    -										Here is an example to illustrate what that means:
    -									</p>
    -									
    -</html><code-pair><sql><![CDATA[-- Select all books by authors born after 1920,
    --- named "Paulo" from a catalogue:
    -SELECT *
    -  FROM author a
    -  JOIN book b ON a.id = b.author_id
    - WHERE a.year_of_birth > 1920
    -   AND a.first_name = 'Paulo'
    - ORDER BY b.title]]></sql>
    -<java><![CDATA[Result<Record> result =
    -create.select()
    -      .from(AUTHOR.as("a"))
    -      .join(BOOK.as("b")).on(a.ID.equal(b.AUTHOR_ID))
    -      .where(a.YEAR_OF_BIRTH.greaterThan(1920)
    -      .and(a.FIRST_NAME.equal("Paulo")))
    -      .orderBy(b.TITLE)
    -      .fetch();]]></java></code-pair><html>
    -
    -									<p>
    -										We'll see how the aliasing works later in the section about <reference id="aliased-tables" title="aliased tables"/>
    -									</p>
    -
    -									<h3>jOOQ as an internal domain specific language in Java (a.k.a. the DSL API)</h3>
    -									<p>
    -										Many other frameworks have similar APIs with similar feature sets. Yet, what makes jOOQ special is its informal <reference id="reference-bnf-notation" title="BNF notation"/> modelling a unified SQL dialect suitable for many vendor-specific dialects, and implementing that BNF notation as a hierarchy of interfaces in Java. This concept is extremely powerful, when <reference id="jooq-in-modern-ides" title="using jOOQ in modern IDEs" /> with syntax completion. Not only can you code much faster, your SQL code will be compile-checked to a certain extent. An example of a DSL query equivalent to the previous one is given here:
    -									</p>
    -									
    -</html><java><![CDATA[DSLContext create = DSL.using(connection, dialect);
    -Result<?> result = create.select()
    -                         .from(AUTHOR)
    -                         .join(BOOK).on(BOOK.AUTHOR_ID.equal(AUTHOR.ID))
    -                         .fetch();]]></java><html>
    -
    -                         			<p>
    -                         				Unlike other, simpler frameworks that use <a href="http://en.wikipedia.org/wiki/Fluent_interface">"fluent APIs"</a> or <a href="http://en.wikipedia.org/wiki/Method_chaining">"method chaining"</a>, jOOQ's BNF-based interface hierarchy will not allow bad query syntax. The following will not compile, for instance:
    -                         			</p>
    -</html><java><![CDATA[DSLContext create = DSL.using(connection, dialect);
    -Result<?> result = create.select()
    -                         .join(BOOK).on(BOOK.AUTHOR_ID.equal(AUTHOR.ID))
    -                      //  ^^^^ "join" is not possible here
    -                         .from(AUTHOR)
    -                         .fetch();
    -
    -Result<?> result = create.select()
    -                         .from(AUTHOR)
    -                         .join(BOOK)
    -                         .fetch();
    -                      //  ^^^^^ "on" is missing here
    -
    -Result<?> result = create.select(rowNumber())
    -                      //         ^^^^^^^^^ "over()" is missing here
    -                         .from(AUTHOR)
    -                         .fetch();
    -
    -Result<?> result = create.select()
    -                         .from(AUTHOR)
    -                         .where(AUTHOR.ID.in(select(BOOK.TITLE).from(BOOK)))
    -                      //                     ^^^^^^^^^^^^^^^^^^
    -                      // AUTHOR.ID is of type Field<Integer> but subselect returns Record1<String>
    -                         .fetch();
    -
    -Result<?> result = create.select()
    -                         .from(AUTHOR)
    -                         .where(AUTHOR.ID.in(select(BOOK.AUTHOR_ID, BOOK.ID).from(BOOK)))
    -                      //                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    -                      // AUTHOR.ID is of degree 1 but subselect returns Record2<Integer, Integer>
    -                         .fetch();]]></java><html>
    -
    -									<h3>History of SQL building and incremental query building (a.k.a. the model API)</h3>
    -									<p>
    -										Historically, jOOQ started out as an object-oriented SQL builder library like any other. This meant that all queries and their syntactic components were modeled as so-called <reference id="queryparts" title="QueryParts"/>, which delegate <reference id="sql-rendering" title="SQL rendering"/> and <reference id="variable-binding" title="variable binding"/> to child components. This part of the API will be referred to as the model API (or non-DSL API), which is still maintained and used internally by jOOQ for incremental query building. An example of incremental query building is given here:
    -									</p>
    -									
    -</html><java><![CDATA[DSLContext create = DSL.using(connection, dialect);
    -SelectQuery<Record> query = create.selectQuery();
    -query.addFrom(AUTHOR);
    -
    -// Join books only under certain circumstances
    -if (join) {
    -    query.addJoin(BOOK, BOOK.AUTHOR_ID.equal(AUTHOR.ID));
    -}
    -
    -Result<?> result = query.fetch();]]></java><html>
    -
    -									<p>
    -										This query is equivalent to the one shown before using the DSL syntax. In fact, internally, the DSL API constructs precisely this SelectQuery object. Note, that you can always access the SelectQuery object to switch between DSL and model APIs:
    -									</p>
    -
    -</html><java><![CDATA[DSLContext create = DSL.using(connection, dialect);
    -SelectFinalStep<?> select = create.select().from(AUTHOR);
    -
    -// Add the JOIN clause on the internal QueryObject representation
    -SelectQuery<?> query = select.getQuery();
    -query.addJoin(BOOK, BOOK.AUTHOR_ID.equal(AUTHOR.ID));]]></java><html>
    -
    -									<h3>Mutability</h3>
    -									<p>
    -										Note, that for historic reasons, the DSL API mixes mutable and immutable behaviour with respect to the internal representation of the <reference id="queryparts" title="QueryPart"/> being constructed. While creating <reference id="conditional-expressions" title="conditional expressions"/>, <reference id="column-expressions" title="column expressions"/> (such as functions) assumes immutable behaviour, creating <reference id="sql-statements" title="SQL statements"/> does not. In other words, the following can be said:
    -									</p>
    -									
    -</html><java><![CDATA[// Conditional expressions (immutable)
    -// -----------------------------------
    -Condition a = BOOK.TITLE.equal("1984");
    -Condition b = BOOK.TITLE.equal("Animal Farm");
    -
    -// The following can be said
    -a       != a.or(b); // or() does not modify a
    -a.or(b) != a.or(b); // or() always creates new objects
    -
    -// Statements (mutable)
    -// --------------------
    -SelectFromStep<?> s1 = select();
    -SelectJoinStep<?> s2 = s1.from(BOOK);
    -SelectJoinStep<?> s3 = s1.from(AUTHOR);
    -
    -// The following can be said
    -s1 == s2; // The internal object is always the same
    -s2 == s3; // The internal object is always the same]]></java><html>
    -
    -									<p>
    -										On the other hand, beware that you can always extract and modify <reference id="bind-values" title="bind values"/> from any <code>QueryPart</code>.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="select-statement">
    -								<title>The SELECT statement</title>
    -								<content><html>
    -									<p>
    -										When you don't just perform <reference id="crud-with-updatablerecords" title="CRUD"/> (i.e. SELECT * FROM your_table WHERE ID = ?), you're usually generating new record types using custom projections. With jOOQ, this is as intuitive, as if using SQL directly. A more or less complete example of the "standard" SQL syntax, plus some extensions, is provided by a query like this:
    -									</p>
    -
    -									<h3>SELECT from a complex table expression</h3>
    -</html><code-pair>
    -<sql><![CDATA[-- get all authors' first and last names, and the number
    --- of books they've written in German, if they have written
    --- more than five books in German in the last three years
    --- (from 2011), and sort those authors by last names
    --- limiting results to the second and third row, locking
    --- the rows for a subsequent update... whew!
    -
    -  SELECT AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME, COUNT(*)
    -    FROM AUTHOR
    -    JOIN BOOK ON AUTHOR.ID = BOOK.AUTHOR_ID
    -   WHERE BOOK.LANGUAGE = 'DE'
    -     AND BOOK.PUBLISHED > '2008-01-01'
    -GROUP BY AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME
    -  HAVING COUNT(*) > 5
    -ORDER BY AUTHOR.LAST_NAME ASC NULLS FIRST
    -   LIMIT 2
    -  OFFSET 1
    -     FOR UPDATE]]></sql>
    -<java><![CDATA[// And with jOOQ...
    -
    -
    -
    -
    -DSLContext create = DSL.using(connection, dialect);
    -
    -create.select(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME, count())
    -      .from(AUTHOR)
    -      .join(BOOK).on(BOOK.AUTHOR_ID.equal(AUTHOR.ID))
    -      .where(BOOK.LANGUAGE.equal("DE"))
    -      .and(BOOK.PUBLISHED.greaterThan("2008-01-01"))
    -      .groupBy(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -      .having(count().greaterThan(5))
    -      .orderBy(AUTHOR.LAST_NAME.asc().nullsFirst())
    -      .limit(1)
    -      .offset(2)
    -      .forUpdate();]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										Details about the various clauses of this query will be provided in subsequent sections.
    -									</p>
    -
    -									<h3>SELECT from single physical tables</h3>
    -									<p>
    -										A very similar, but limited API is available, if you want to select from single physical tables in order to retrieve <reference id="crud-with-updatablerecords" title="TableRecords or even UpdatableRecords"/>. The decision, which type of select to create is already made at the very first step, when you create the <code>SELECT</code> statement with the DSL or DSLContext types:
    -									</p>
    -
    -</html><java><![CDATA[public <R extends Record> SelectWhereStep<R> selectFrom(Table<R> table);]]></java><html>
    -									<p>
    -										As you can see, there is no way to further restrict/project the selected fields. This just selects all known TableFields in the supplied Table, and it also binds &lt;R extends Record&gt; to your Table's associated Record. An example of such a Query would then be:
    -									</p>
    -</html><java><![CDATA[BookRecord book = create.selectFrom(BOOK)
    -                        .where(BOOK.LANGUAGE.equal("DE"))
    -                        .orderBy(BOOK.TITLE)
    -                        .fetchAny();]]></java><html>
    -
    -                   					<p>
    -                   						The "reduced" SELECT API is limited in the way that it skips DSL access to any of these clauses:
    -                   					</p>
    -                   					<ul>
    -                   						<li><reference id="select-clause"/></li>
    -                   						<li><reference id="join-clause"/></li>
    -                   					</ul>
    -                   					<p>
    -                   						In most parts of this manual, it is assumed that you do not use the "reduced" SELECT API. For more information about the simple SELECT API, see the manual's section about <reference id="record-vs-tablerecord" title="fetching strongly or weakly typed records"/>.
    -                   					</p>
    -								</html></content>
    -
    -								<sections>
    -									<section id="select-clause">
    -										<title>The SELECT clause</title>
    -										<content><html>
    -											<p>
    -												The SELECT clause lets you project your own record types, referencing table fields, functions, arithmetic expressions, etc. The DSL type provides several methods for expressing a SELECT clause:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[-- The SELECT clause
    -SELECT BOOK.ID, BOOK.TITLE
    -SELECT BOOK.ID, TRIM(BOOK.TITLE)
    -]]></sql>
    -<java><![CDATA[// Provide a varargs Fields list to the SELECT clause:
    -Select<?> s1 = create.select(BOOK.ID, BOOK.TITLE);
    -Select<?> s2 = create.select(BOOK.ID, trim(BOOK.TITLE));]]></java>
    -</code-pair><html>
    -
    -											<p>
    -												Some commonly used projections can be easily created using convenience methods:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[-- Simple SELECTs
    -SELECT COUNT(*)
    -SELECT 0 -- Not a bind variable
    -SELECT 1 -- Not a bind variable
    -]]></sql>
    -<java><![CDATA[// Select commonly used values
    -Select<?> select1 = create.selectCount();
    -Select<?> select2 = create.selectZero();
    -Select<?> select2 = create.selectOne();]]></java>
    -</code-pair><html>
    -
    -											<p>
    -												See more details about functions and expressions in the manual's section about <reference id="column-expressions"/>
    -											</p>
    -
    -											<h3>The SELECT DISTINCT clause</h3>
    -											<p>
    -												The DISTINCT keyword can be included in the method name, constructing a SELECT clause
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT DISTINCT BOOK.TITLE]]></sql>
    -<java><![CDATA[Select<?> select1 = create.selectDistinct(BOOK.TITLE);]]></java>
    -</code-pair><html>
    -
    -                                            <h3>SELECT *</h3>
    -                                            <p>
    -                                            	jOOQ does not explicitly support the asterisk operator in projections. However, you can omit the projection as in these examples:
    -                                            </p>
    -                                            
    -</html><java><![CDATA[// Explicitly selects all columns available from BOOK
    -create.select().from(BOOK);
    -
    -// Explicitly selects all columns available from BOOK and AUTHOR
    -create.select().from(BOOK, AUTHOR);
    -create.select().from(BOOK).crossJoin(AUTHOR);
    -
    -// Renders a SELECT * statement, as columns are unknown to jOOQ
    -create.select().from(tableByName("BOOK"));]]></java><html>                                            
    -
    -											<h3>Typesafe projections with degree up to {max-row-degree}</h3>
    -											<p>
    -												Since jOOQ 3.0, <reference id="record-n" title="records"/> and <reference id="row-value-expressions" title="row value expressions"/> up to degree {max-row-degree} are now generically typesafe. This is reflected by an overloaded <code>SELECT</code> (and <code>SELECT DISTINCT</code>) API in both DSL and DSLContext. An extract from the DSL type:
    -											</p>
    -											
    -</html><java><![CDATA[// Non-typesafe select methods:
    -public static SelectSelectStep<Record> select(Collection<? extends Field<?>> fields);
    -public static SelectSelectStep<Record> select(Field<?>... fields);
    -
    -// Typesafe select methods:
    -public static <T1>         SelectSelectStep<Record1<T1>>         select(Field<T1> field1);
    -public static <T1, T2>     SelectSelectStep<Record2<T1, T2>>     select(Field<T1> field1, Field<T2> field2);
    -public static <T1, T2, T3> SelectSelectStep<Record3<T1, T2, T3>> select(Field<T1> field1, Field<T2> field2, Field<T3> field3);
    -// [...]]]></java><html>
    -		
    -											<p>
    -												Since the generic R type is bound to some <reference id="record-n" title="Record[N]"/>, the associated T type information can be used in various other contexts, e.g. the <reference id="in-predicate" title="IN predicate"/>. Such a <code>SELECT</code> statement can be assigned typesafely:
    -											</p>
    -
    -</html><java><![CDATA[Select<Record2<Integer, String>> s1 = create.select(BOOK.ID, BOOK.TITLE);
    -Select<Record2<Integer, String>> s2 = create.select(BOOK.ID, trim(BOOK.TITLE));]]></java><html>
    -																				
    -											<p>
    -												For more information about typesafe record types with degree up to {max-row-degree}, see the manual's section about <reference id="record-n" title="Record1 to Record{max-row-degree}"/>.
    -											</p>
    -										</html></content>
    -									</section>
    -
    -									<section id="from-clause">
    -										<title>The FROM clause</title>
    -										<content><html>
    -											<p>
    -												The SQL FROM clause allows for specifying any number of <reference id="table-expressions" title="table expressions"/> to select data from. The following are examples of how to form normal FROM clauses:
    -											</p>
    -
    -</html><code-pair>
    -	<sql><![CDATA[SELECT 1 FROM BOOK
    -SELECT 1 FROM BOOK, AUTHOR
    -SELECT 1 FROM BOOK "b", AUTHOR "a"]]></sql>
    -	<java><![CDATA[create.selectOne().from(BOOK);
    -create.selectOne().from(BOOK, AUTHOR);
    -create.selectOne().from(BOOK.as("b"), AUTHOR.as("a"));]]></java>
    -</code-pair><html>
    -
    -											<p>
    -												Read more about aliasing in the manual's section about <reference id="aliased-tables" title="aliased tables"/>.
    -											</p>
    -											
    -											<h3>More advanced table expressions</h3>
    -											<p>
    -												Apart from simple tables, you can pass any arbitrary <reference id="table-expressions" title="table expression"/> to the jOOQ FROM clause. This may include <reference id="array-and-cursor-unnesting" title="unnested cursors"/> in Oracle:
    -											</p>
    -
    -</html><code-pair>
    -	<sql><![CDATA[SELECT *
    -FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(null, null, 'ALLSTATS'));]]></sql>
    -	<java><![CDATA[create.select()
    -      .from(table(DbmsXplan.displayCursor(null, null, "ALLSTATS"));]]></java>
    -</code-pair><html>
    -
    -											<p>
    -												Note, in order to access the DbmsXplan package, you can use the <reference id="code-generation" title="code generator"/> to generate Oracle's SYS schema.
    -											</p>
    -
    -
    -											<h3>Selecting FROM DUAL with jOOQ</h3>
    -											<p>
    -												In many SQL dialects, FROM is a mandatory clause, in some it isn't. jOOQ allows you to omit the FROM clause, returning just one record. An example:
    -											</p>
    -
    -</html><code-pair>
    -	<sql><![CDATA[SELECT 1 FROM DUAL
    -SELECT 1]]></sql>
    -	<java><![CDATA[DSL.using(SQLDialect.ORACLE).selectOne().getSQL();
    -DSL.using(SQLDialect.POSTGRES).selectOne().getSQL();]]></java>
    -</code-pair><html>
    -
    -											<p>
    -												Read more about dual or dummy tables in the manual's section about <reference id="dual" title="the DUAL table"/>. The following are examples of how to form normal FROM clauses:
    -											</p>
    -										</html></content>
    -									</section>
    -
    -									<section id="join-clause">
    -										<title>The JOIN clause</title>
    -										<content><html>
    -											<p>
    -												jOOQ supports many different types of standard SQL JOIN operations:
    -											</p>
    -											<ul>
    -												<li>[ INNER ] JOIN</li>
    -												<li>LEFT [ OUTER ] JOIN</li>
    -												<li>RIGHT [ OUTER ] JOIN</li>
    -												<li>FULL OUTER JOIN</li>
    -												<li>CROSS JOIN</li>
    -												<li>NATURAL JOIN</li>
    -												<li>NATURAL LEFT [ OUTER ] JOIN</li>
    -												<li>NATURAL RIGHT [ OUTER ] JOIN</li>
    -											</ul>
    -
    -											<p>
    -												All of these JOIN methods can be called on <reference class="org.jooq.Table"/> types, or directly after the FROM clause for convenience. The following example joins AUTHOR and BOOK
    -											</p>
    -
    -</html><java><![CDATA[DSLContext create = DSL.using(connection, dialect);
    -
    -// Call "join" directly on the AUTHOR table
    -Result<?> result = create.select()
    -                         .from(AUTHOR.join(BOOK)
    -                                     .on(BOOK.AUTHOR_ID.equal(AUTHOR.ID)))
    -                         .fetch();
    -
    -// Call "join" on the type returned by "from"
    -Result<?> result = create.select()
    -                         .from(AUTHOR)
    -                         .join(BOOK)
    -                         .on(BOOK.AUTHOR_ID.equal(AUTHOR.ID))
    -                         .fetch();]]></java><html>
    -
    -											<p>
    -												The two syntaxes will produce the same SQL statement. However, calling "join" on <reference class="org.jooq.Table"/> objects allows for more powerful, nested JOIN expressions (if you can handle the parentheses):
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT *
    -FROM AUTHOR
    -LEFT OUTER JOIN (
    -  BOOK JOIN BOOK_TO_BOOK_STORE
    -       ON BOOK_TO_BOOK_STORE.BOOK_ID = BOOK.ID
    -)
    -ON BOOK.AUTHOR_ID = AUTHOR.ID]]></sql>
    -<java><![CDATA[// Nest joins and provide JOIN conditions only at the end
    -create.select()
    -      .from(AUTHOR
    -      .leftOuterJoin(BOOK
    -        .join(BOOK_TO_BOOK_STORE)
    -        .on(BOOK_TO_BOOK_STORE.BOOK_ID.equal(BOOK.ID)))
    -      .on(BOOK.AUTHOR_ID.equal(AUTHOR.ID)));]]></java></code-pair><html>
    -
    -      										<ul>
    -      											<li>See the section about <reference id="conditional-expressions" title="conditional expressions"/> to learn more about the many ways to create <reference class="org.jooq.Condition"/> objects in jOOQ.</li>
    -      											<li>See the section about <reference id="table-expressions" title="table expressions"/> to learn about the various ways of referencing <reference class="org.jooq.Table"/> objects in jOOQ</li>
    -      										</ul>
    -
    -											<h3>JOIN ON KEY, convenience provided by jOOQ</h3>
    -											<p>
    -												Surprisingly, the SQL standard does not allow to formally JOIN on well-known foreign key relationship information. Naturally, when you join BOOK to AUTHOR, you will want to do that based on the BOOK.AUTHOR_ID foreign key to AUTHOR.ID primary key relation. Not being able to do this in SQL leads to a lot of repetitive code, re-writing the same JOIN predicate again and again - especially, when your foreign keys contain more than one column. With jOOQ, when you use <reference id="code-generation" title="code generation"/>, you can use foreign key constraint information in JOIN expressions as such:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT *
    -FROM AUTHOR
    -JOIN BOOK ON BOOK.AUTHOR_ID = AUTHOR.ID]]></sql>
    -<java><![CDATA[create.select()
    -      .from(AUTHOR)
    -      .join(BOOK).onKey();]]></java></code-pair><html>
    -
    -      										<p>
    -      											In case of ambiguity, you can also supply field references for your foreign keys, or the generated foreign key reference to the onKey() method.
    -      										</p>
    -      										<p>
    -      											Note that formal support for the Sybase <code>JOIN ON KEY</code> syntax is on the roadmap.
    -      										</p>
    -
    -											<h3>The JOIN USING syntax</h3>
    -											<p>
    -												Most often, you will provide jOOQ with JOIN conditions in the JOIN .. ON clause. SQL supports a different means of specifying how two tables are to be joined. This is the JOIN .. USING clause. Instead of a condition, you supply a set of fields whose names are common to both tables to the left and right of a JOIN operation. This can be useful when your database schema has a high degree of <a href="http://en.wikipedia.org/wiki/Database_normalization">relational normalisation</a>. An example:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[-- Assuming that both tables contain AUTHOR_ID columns
    -SELECT *
    -FROM AUTHOR
    -JOIN BOOK USING (AUTHOR_ID)]]></sql>
    -<java><![CDATA[// join(...).using(...)
    -create.select()
    -      .from(AUTHOR)
    -      .join(BOOK).using(AUTHOR.AUTHOR_ID);]]></java></code-pair><html>
    -
    -											<p>
    -												In schemas with high degrees of normalisation, you may also choose to use NATURAL JOIN, which takes no JOIN arguments as it joins using all fields that are common to the table expressions to the left and to the right of the JOIN operator. An example:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[-- Assuming that both tables contain AUTHOR_ID columns
    -SELECT *
    -FROM AUTHOR
    -NATURAL JOIN BOOK]]></sql>
    -<java><![CDATA[// naturalJoin(...)
    -create.select()
    -      .from(AUTHOR)
    -      .naturalJoin(BOOK);]]></java></code-pair><html>
    -
    -											<h3>Oracle's partitioned OUTER JOIN</h3>
    -											<p>
    -												Oracle SQL ships with a special syntax available for OUTER JOIN clauses. According to the <a href="http://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_10002.htm#i2196190">Oracle documentation about partitioned outer joins</a> this can be used to fill gaps for simplified analytical calculations. jOOQ only supports putting the PARTITION BY clause to the right of the OUTER JOIN clause. The following example will create at least one record per AUTHOR and per existing value in BOOK.PUBLISHED_IN, regardless if an AUTHOR has actually published a book in that year.
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT *
    -FROM AUTHOR
    -LEFT OUTER JOIN BOOK
    -PARTITION BY (PUBLISHED_IN)
    -ON BOOK.AUTHOR_ID = AUTHOR.ID]]></sql>
    -<java><![CDATA[create.select()
    -      .from(AUTHOR)
    -      .leftOuterJoin(BOOK)
    -      .partitionBy(BOOK.PUBLISHED_IN)
    -      .on(BOOK.AUTHOR_ID.equal(AUTHOR.ID));]]></java></code-pair>
    -
    -										</content>
    -									</section>
    -
    -									<section id="where-clause">
    -										<title>The WHERE clause</title>
    -										<content><html>
    -											<p>
    -												The WHERE clause can be used for JOIN or filter predicates, in order to restrict the data returned by the <reference id="table-expressions" title="table expressions"/> supplied to the previously specified <reference id="from-clause" title="from clause"/> and <reference id="join-clause" title="join clause"/>. Here is an example:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT *
    -FROM BOOK
    -WHERE AUTHOR_ID = 1
    -AND TITLE = '1984']]></sql>
    -<java><![CDATA[create.select()
    -      .from(BOOK)
    -      .where(BOOK.AUTHOR_ID.equal(1))
    -      .and(BOOK.TITLE.equal("1984"));]]></java></code-pair><html>
    -
    -											<p>
    -												The above syntax is convenience provided by jOOQ, allowing you to connect the <reference class="org.jooq.Condition"/> supplied in the WHERE clause with another condition using an AND operator. You can of course also create a more complex condition and supply that to the WHERE clause directly (observe the different placing of parentheses). The results will be the same:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT *
    -FROM BOOK
    -WHERE AUTHOR_ID = 1
    -AND TITLE = '1984']]></sql>
    -<java><![CDATA[create.select()
    -      .from(BOOK)
    -      .where(BOOK.AUTHOR_ID.equal(1).and(
    -             BOOK.TITLE.equal("1984")));]]></java></code-pair><html>
    -
    -											<p>
    -												You will find more information about creating <reference id="conditional-expressions" title="conditional expressions"/> later in the manual.
    -											</p>
    -										</html></content>
    -									</section>
    -
    -									<section id="connect-by-clause">
    -										<title>The CONNECT BY clause</title>
    -										<content><html>
    -											<p>
    -												The Oracle database knows a very succinct syntax for creating hierarchical queries: the CONNECT BY clause, which is fully supported by jOOQ, including all related functions and pseudo-columns. A more or less formal definition of this clause is given here:
    -											</p>
    -</html><sql>--   SELECT ..
    ---     FROM ..
    ---    WHERE ..
    - CONNECT BY [ NOCYCLE ] condition [ AND condition, ... ] [ START WITH condition ]
    --- GROUP BY ..
    --- ORDER [ SIBLINGS ] BY ..</sql><html>
    -
    -											<p>
    -												An example for an iterative query, iterating through values between 1 and 5 is this:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT LEVEL
    -FROM DUAL
    -CONNECT BY LEVEL <= 5]]></sql>
    -<java><![CDATA[// Get a table with elements 1, 2, 3, 4, 5
    -create.select(level())
    -      .connectBy(level().lessOrEqual(5));]]></java></code-pair><html>
    -
    -											<p>
    -												Here's a more complex example where you can recursively fetch directories in your database, and concatenate them to a path:
    -											</p>
    -</html><code-pair>
    -<sql><![CDATA[SELECT 
    -  SUBSTR(SYS_CONNECT_BY_PATH(DIRECTORY.NAME, '/'), 2)
    -FROM DIRECTORY
    -CONNECT BY 
    -  PRIOR DIRECTORY.ID = DIRECTORY.PARENT_ID
    -START WITH DIRECTORY.PARENT_ID IS NULL
    -ORDER BY 1]]></sql>
    -<java><![CDATA[.select(
    -   sysConnectByPath(DIRECTORY.NAME, "/").substring(2))
    -.from(DIRECTORY)
    -.connectBy(
    -   prior(DIRECTORY.ID).equal(DIRECTORY.PARENT_ID))
    -.startWith(DIRECTORY.PARENT_ID.isNull())
    -.orderBy(1);]]></java>
    -</code-pair><html>
    -
    -    										<p>
    -    											The output might then look like this
    -   											</p>
    -
    -</html><text>+------------------------------------------------+
    -|substring                                       |
    -+------------------------------------------------+
    -|C:                                              |
    -|C:/eclipse                                      |
    -|C:/eclipse/configuration                        |
    -|C:/eclipse/dropins                              |
    -|C:/eclipse/eclipse.exe                          |
    -+------------------------------------------------+
    -|...21 record(s) truncated...
    -</text><html>
    -
    -											<p>
    -												Some of the supported functions and pseudo-columns are these (available from the <reference id="dsl" title="DSL"/>):
    -											</p>
    -
    -											<ul>
    -												<li>LEVEL</li>
    -												<li>CONNECT_BY_IS_CYCLE</li>
    -												<li>CONNECT_BY_IS_LEAF</li>
    -												<li>CONNECT_BY_ROOT</li>
    -												<li>SYS_CONNECT_BY_PATH</li>
    -												<li>PRIOR</li>
    -											</ul>
    -
    -											<p>
    -												Note that this syntax is also supported in the CUBRID database and might be simulated in other dialects supporting common table expressions in the future.
    -											</p>
    -											
    -											<h3>ORDER SIBLINGS</h3>
    -											<p>
    -												The Oracle database allows for specifying a SIBLINGS keyword in the <reference id="order-by-clause" title="ORDER BY clause"/>. Instead of ordering the overall result, this will only order siblings among each other, keeping the hierarchy intact. An example is given here:
    -											</p>
    -											
    -</html><code-pair>
    -<sql><![CDATA[SELECT DIRECTORY.NAME
    -FROM DIRECTORY
    -CONNECT BY 
    -  PRIOR DIRECTORY.ID = DIRECTORY.PARENT_ID
    -START WITH DIRECTORY.PARENT_ID IS NULL
    -ORDER SIBLINGS BY 1]]></sql>
    -<java><![CDATA[.select(DIRECTORY.NAME)
    -.from(DIRECTORY)
    -.connectBy(
    -   prior(DIRECTORY.ID).equal(DIRECTORY.PARENT_ID))
    -.startWith(DIRECTORY.PARENT_ID.isNull())
    -.orderSiblingsBy(1);]]></java>
    -</code-pair>
    -											
    -										</content>
    -									</section>
    -
    -									<section id="group-by-clause">
    -										<title>The GROUP BY clause</title>
    -										<content><html>
    -											<p>
    -												GROUP BY can be used to create unique groups of data, to form aggregations, to remove duplicates and for other reasons. It will transform your previously defined <reference id="table-expressions" title="set of table expressions"/>, and return only one record per unique group as specified in this clause. For instance, you can group books by BOOK.AUTHOR_ID:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT AUTHOR_ID, COUNT(*)
    -FROM BOOK
    -GROUP BY AUTHOR_ID]]></sql>
    -<java><![CDATA[create.select(BOOK.AUTHOR_ID, count())
    -      .from(BOOK)
    -      .groupBy(BOOK.AUTHOR_ID);]]></java></code-pair><html>
    -
    -											<p>
    -												The above example counts all books per author.
    -											</p>
    -											<p>
    -												Note, as defined in the SQL standard, when grouping, you may no longer project any columns that are not a formal part of the GROUP BY clause, or <reference id="aggregate-functions" title="aggregate functions"/>.
    -											</p>
    -											
    -											<h3>MySQL's deviation from the SQL standard</h3>
    -											<p>
    -												MySQL has a peculiar way of not adhering to this standard behaviour. This is documented in the <a href="http://dev.mysql.com/doc/refman/5.6/en/group-by-hidden-columns.html">MySQL manual</a>. In short, with MySQL, you can also project any other field that is not part of the GROUP BY clause. The projected values will just be arbitrary values from within the group. You cannot rely on any ordering. For example:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT AUTHOR_ID, TITLE
    -FROM BOOK
    -GROUP BY AUTHOR_ID]]></sql>
    -<java><![CDATA[create.select(BOOK.AUTHOR_ID, BOOK.TITLE)
    -      .from(BOOK)
    -      .groupBy(AUTHOR_ID);]]></java></code-pair><html>
    -
    -											<p>
    -												This will return an arbitrary title per author. jOOQ supports this syntax, as jOOQ is not doing any checks internally, about the consistence of tables/fields/functions that you provide it.
    -											</p>
    -
    -											<h3>Empty GROUP BY clauses</h3>
    -											<p>
    -												jOOQ supports empty <code>GROUP BY ()</code> clause as well. This will result in <reference id="select-statement" title="SELECT statements"/> that return only one record.
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT COUNT(*)
    -FROM BOOK
    -GROUP BY ()]]></sql>
    -<java><![CDATA[create.selectCount()
    -      .from(BOOK)
    -      .groupBy();]]></java></code-pair><html>
    -
    -											
    -											<h3>ROLLUP(), CUBE() and GROUPING SETS()</h3>
    -											<p>
    -												Some databases support the SQL standard grouping functions and some extensions thereof. See the manual's section about <reference id="grouping-functions" title="grouping functions"/> for more details.
    -											</p>
    -										</html></content>
    -									</section>
    -
    -									<section id="having-clause">
    -										<title>The HAVING clause</title>
    -										<content><html>
    -											<p>
    -												The HAVING clause is commonly used to further restrict data resulting from a previously issued <reference id="group-by-clause" title="GROUP BY clause"/>. An example, selecting only those authors that have written at least two books:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT AUTHOR_ID, COUNT(*)
    -FROM BOOK
    -GROUP BY AUTHOR_ID
    -HAVING COUNT(*) >= 2]]></sql>
    -<java><![CDATA[create.select(BOOK.AUTHOR_ID, count(*))
    -      .from(BOOK)
    -      .groupBy(AUTHOR_ID)
    -      .having(count().greaterOrEqual(2));]]></java></code-pair><html>
    -
    -											<p>
    -												According to the SQL standard, you may omit the GROUP BY clause and still issue a HAVING clause. This will implicitly GROUP BY (). jOOQ also supports this syntax. The following example selects one record, only if there are at least 4 books in the books table:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT COUNT(*)
    -FROM BOOK
    -HAVING COUNT(*) >= 4]]></sql>
    -<java><![CDATA[create.select(count(*))
    -      .from(BOOK)
    -      .having(count().greaterOrEqual(4));]]></java></code-pair>
    -
    -										</content>
    -									</section>
    -
    -									<section id="order-by-clause">
    -										<title>The ORDER BY clause</title>
    -										<content><html>
    -											<p>
    -												Databases are allowed to return data in any arbitrary order, unless you explicitly declare that order in the ORDER BY clause. In jOOQ, this is straight-forward:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT AUTHOR_ID, TITLE
    -FROM BOOK
    -ORDER BY AUTHOR_ID ASC, TITLE DESC]]></sql>
    -<java><![CDATA[create.select(BOOK.AUTHOR_ID, BOOK.TITLE)
    -      .from(BOOK)
    -      .orderBy(BOOK.AUTHOR_ID.asc(), BOOK.TITLE.desc());]]></java></code-pair><html>
    -
    -											<p>
    -												Any jOOQ <reference id="column-expressions" title="column expression (or field)"/> can be transformed into an <reference class="org.jooq.SortField"/> by calling the asc() and desc() methods.
    -											</p>
    -
    -											<h3>Ordering by field index</h3>
    -											<p>
    -												The SQL standard allows for specifying integer literals (<reference id="inlined-parameters" title="literals"/>, not <reference id="bind-values" title="bind values"/>!) to reference column indexes from the projection (<reference id="select-clause" title="SELECT clause"/>). This may be useful if you do not want to repeat a lengthy expression, by which you want to order - although most databases also allow for referencing <reference id="aliased-columns" title="aliased column references"/> in the ORDER BY clause. An example of this is given here:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT AUTHOR_ID, TITLE
    -FROM BOOK
    -ORDER BY 1 ASC, 2 DESC]]></sql>
    -<java><![CDATA[create.select(BOOK.AUTHOR_ID, BOOK.TITLE)
    -      .from(BOOK)
    -      .orderBy(one().asc(), inline(2).desc());]]></java></code-pair><html>
    -
    -											<p>
    -												Note, how <code>one()</code> is used as a convenience short-cut for <code>inline(1)</code>
    -											</p>
    -
    -											<h3>Ordering and NULLS</h3>
    -											<p>
    -												A few databases support the SQL standard "null ordering" clause in sort specification lists, to define whether <code>NULL</code> values should come first or last in an ordered result.
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT 
    -  BOOK.AUTHOR_ID, 
    -  BOOK.CO_AUTHOR_ID, 
    -  BOOK.TITLE
    -FROM BOOK
    -ORDER BY AUTHOR_ID ASC,
    -         CO_AUTHOR_ID ASC NULLS LAST]]></sql>
    -<java><![CDATA[create.select(
    -         BOOK.AUTHOR_ID, 
    -         BOOK.CO_AUTHOR_ID, 
    -         BOOK.TITLE)
    -      .from(BOOK)
    -      .orderBy(BOOK.AUTHOR_ID.asc(),
    -               BOOK.CO_AUTHOR_ID.asc().nullsLast());]]></java></code-pair><html>
    -
    -											<p>
    -												If your database doesn't support this syntax, jOOQ simulates it using a <reference id="case-expressions" title="CASE expression"/> as follows
    -											</p>
    -</html><code-pair>
    -<sql><![CDATA[SELECT 
    -  BOOK.AUTHOR_ID, BOOK.CO_AUTHOR_ID, BOOK.TITLE
    -FROM BOOK
    -ORDER BY AUTHOR_ID ASC,
    -         CASE WHEN CO_AUTHOR_ID IS NULL 
    -              THEN 1 ELSE 0 END ASC,
    -         CO_AUTHOR_ID ASC]]></sql>
    -<java><![CDATA[create.select(
    -         BOOK.AUTHOR_ID, 
    -         BOOK.CO_AUTHOR_ID,
    -         BOOK.TITLE)
    -      .from(BOOK)
    -      .orderBy(BOOK.AUTHOR_ID.asc(),
    -               BOOK.CO_AUTHOR_ID.asc().nullsLast());]]></java></code-pair><html>
    -
    -											<h3>Ordering using CASE expressions</h3>
    -											<p>
    -												Using <reference id="case-expressions" title="CASE expressions"/> in SQL ORDER BY clauses is a common pattern, if you want to introduce some sort indirection / sort mapping into your queries. As with SQL, you can add any type of <reference id="column-expressions" title="column expression"/> into your ORDER BY clause. For instance, if you have two favourite books that you always want to appear on top, you could write:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT *
    -FROM BOOK
    -ORDER BY CASE TITLE
    -         WHEN '1984' THEN 0
    -         WHEN 'Animal Farm' THEN 1
    -         ELSE 2 END ASC]]></sql>
    -<java><![CDATA[create.select()
    -      .from(BOOK)
    -      .orderBy(decode().value(BOOK.TITLE)
    -                       .when("1984", 0)
    -                       .when("Animal Farm", 1)
    -                       .otherwise(2).asc());]]></java></code-pair><html>
    -
    -											<p>
    -												But writing these things can become quite verbose. jOOQ supports a convenient syntax for specifying sort mappings. The same query can be written in jOOQ as such:
    -											</p>
    -
    -</html><java><![CDATA[create.select()
    -      .from(BOOK)
    -      .orderBy(BOOK.TITLE.sortAsc("1984", "Animal Farm"));]]></java><html>
    -
    -											<p>
    -												More complex sort indirections can be provided using a Map:
    -											</p>
    -
    -</html><java><![CDATA[create.select()
    -      .from(BOOK)
    -      .orderBy(BOOK.TITLE.sort(new HashMap<String, Integer>() {{
    -          put("1984", 1);
    -          put("Animal Farm", 13);
    -          put("The jOOQ book", 10);
    -      }}));]]></java><html>
    -
    -      										<p>
    -      											Of course, you can combine this feature with the previously discussed NULLS FIRST / NULLS LAST feature. So, if in fact these two books are the ones you like least, you can put all NULLS FIRST (all the other books):
    -      										</p>
    -
    -</html><java><![CDATA[create.select()
    -      .from(BOOK)
    -      .orderBy(BOOK.TITLE.sortAsc("1984", "Animal Farm").nullsFirst());]]></java><html>
    -
    -											<h3>jOOQ's understanding of SELECT .. ORDER BY</h3>
    -											<p>
    -												The SQL standard defines that a "query expression" can be ordered, and that query expressions can contain <reference id="union-clause" title="UNION, INTERSECT and EXCEPT clauses"/>, whose subqueries cannot be ordered. While this is defined as such in the SQL standard, many databases allowing for the non-standard <reference id="limit-clause" title="LIMIT clause"/> in one way or another, do not adhere to this part of the SQL standard. Hence, jOOQ allows for ordering all SELECT statements, regardless whether they are constructed as a part of a UNION or not. Corner-cases are handled internally by jOOQ, by introducing synthetic subselects to adhere to the correct syntax, where this is needed.
    -											</p>
    -											
    -											
    -											<h3>Oracle's ORDER SIBLINGS BY clause</h3>
    -											<p>
    -												jOOQ also supports Oracle's SIBLINGS keyword to be used with ORDER BY clauses for <reference id="connect-by-clause" title="hierarchical queries using CONNECT BY"/>
    -											</p>
    -										</html></content>
    -									</section>
    -
    -									<section id="limit-clause">
    -										<title>The LIMIT .. OFFSET clause</title>
    -										<content><html>
    -											<p>
    -												While being extremely useful for every application that does paging, or just to limit result sets to reasonable sizes, this clause is not yet part of any SQL standard (up until SQL:2008). Hence, there exist a variety of possible implementations in various SQL dialects, concerning this limit clause. jOOQ chose to implement the LIMIT .. OFFSET clause as understood and supported by MySQL, H2, HSQLDB, Postgres, and SQLite. Here is an example of how to apply limits with jOOQ:
    -											</p>
    -
    -</html><java><![CDATA[create.select().from(BOOK).limit(1).offset(2);]]></java><html>
    -
    -											<p>
    -												This will limit the result to 1 books starting with the 2nd book (starting at offset 0!). limit() is supported in all dialects, offset() in all but Sybase ASE, which has no reasonable means to simulate it. This is how jOOQ simulates the above query in various SQL dialects:
    -											</p>
    -
    -</html><sql><![CDATA[-- MySQL, H2, HSQLDB, Postgres, and SQLite
    -SELECT * FROM BOOK LIMIT 1 OFFSET 2
    -
    --- CUBRID supports a MySQL variant of the LIMIT .. OFFSET clause
    -SELECT * FROM BOOK LIMIT 2, 1
    -
    --- Derby, SQL Server 2012
    -SELECT * FROM BOOK OFFSET 2 ROWS FETCH NEXT 1 ROWS ONLY
    -
    --- Ingres
    -SELECT * FROM BOOK OFFSET 2 FETCH FIRST 1 ROWS ONLY
    -
    --- Firebird
    -SELECT * FROM BOOK ROWS 2 TO 3
    -
    --- Sybase SQL Anywhere
    -SELECT TOP 1 ROWS START AT 3 * FROM BOOK
    -
    --- DB2 (without OFFSET)
    -SELECT * FROM BOOK FETCH FIRST 1 ROWS ONLY
    -
    --- Sybase ASE, SQL Server 2008 (without OFFSET)
    -SELECT TOP 1 * FROM BOOK
    -
    --- DB2 (with OFFSET), SQL Server 2008 (with OFFSET), Oracle (actual query may vary)
    -SELECT * FROM (
    -  SELECT LIMIT_98843777.*, ROW_NUMBER() OVER (ORDER BY ID ASC) AS ROWNUM_98843777
    -  FROM (
    -    SELECT TOP 100 PERCENT *
    -    FROM BOOK
    -    ORDER BY ID ASC
    -  ) AS LIMIT_98843777
    -) AS OUTER_LIMIT_98843777
    -WHERE ROWNUM_98843777 > 1
    -AND ROWNUM_98843777 <= 3
    -]]></sql><html>
    -
    -											<p>
    -												As you can see, jOOQ will take care of the incredibly painful ROW_NUMBER() OVER() (or ROWNUM for Oracle) filtering in subselects for you, you'll just have to write limit(1).offset(2) in any dialect.
    -											</p>
    -
    -											<h3>SQL Server's ORDER BY, TOP and subqueries</h3>
    -											<p>
    -												As can be seen in the above example, writing correct SQL can be quite tricky, depending on the SQL dialect. For instance, with SQL Server, you cannot have an ORDER BY clause in a subquery, unless you also have a TOP clause. This is illustrated by the fact that jOOQ renders a TOP 100 PERCENT clause for you. The same applies to the fact that ROW_NUMBER() OVER() needs an ORDER BY windowing clause, even if you don't provide one to the jOOQ query. By default, jOOQ adds ordering by the first column of your projection.
    -											</p>
    -										</html></content>
    -									</section>
    -
    -									<section id="for-update-clause">
    -										<title>The FOR UPDATE clause</title>
    -										<content><html>
    -											<p>
    -												For inter-process synchronisation and other reasons, you may choose to use the SELECT .. FOR UPDATE clause to indicate to the database, that a set of cells or records should be locked by a given transaction for subsequent updates. With jOOQ, this can be achieved as such:
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT *
    -FROM BOOK
    -WHERE ID = 3
    -FOR UPDATE]]></sql>
    -<java><![CDATA[create.select()
    -      .from(BOOK)
    -      .where(BOOK.ID.equal(3))
    -      .forUpdate();]]></java></code-pair><html>
    -
    -											<p>
    -												The above example will produce a record-lock, locking the whole record for updates. Some databases also support cell-locks using FOR UPDATE OF ..
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT *
    -FROM BOOK
    -WHERE ID = 3
    -FOR UPDATE OF TITLE]]></sql>
    -<java><![CDATA[create.select()
    -      .from(BOOK)
    -      .where(BOOK.ID.equal(3))
    -      .forUpdate().of(BOOK.TITLE);]]></java></code-pair><html>
    -
    -											<p>
    -												Oracle goes a bit further and also allows to specify the actual locking behaviour. It features these additional clauses, which are all supported by jOOQ:
    -											</p>
    -											<ul>
    -												<li><code>FOR UPDATE NOWAIT</code>: This is the default behaviour. If the lock cannot be acquired, the query fails immediately</li>
    -												<li><code>FOR UPDATE WAIT n</code>: Try to wait for [n] seconds for the lock acquisition. The query will fail only afterwards</li>
    -												<li><code>FOR UPDATE SKIP LOCKED</code>: This peculiar syntax will skip all locked records. This is particularly useful when implementing queue tables with multiple consumers</li>
    -											</ul>
    -											<p>
    -												With jOOQ, you can use those Oracle extensions as such:
    -											</p>
    -
    -</html><java><![CDATA[create.select().from(BOOK).where(BOOK.ID.equal(3)).forUpdate().nowait();
    -create.select().from(BOOK).where(BOOK.ID.equal(3)).forUpdate().wait(5);
    -create.select().from(BOOK).where(BOOK.ID.equal(3)).forUpdate().skipLocked();]]></java><html>
    -
    -											<h3>FOR UPDATE in CUBRID and SQL Server</h3>
    -											<p>
    -												The SQL standard specifies a <code>FOR UPDATE</code> clause to be applicable for cursors. Most databases interpret this as being applicable for all <code>SELECT</code> statements. An exception to this rule are the CUBRID and SQL Server databases, that do not allow for any <code>FOR UPDATE</code> clause in a regular SQL <code>SELECT</code> statement. jOOQ simulates the <code>FOR UPDATE</code> behaviour, by locking record by record with JDBC. JDBC allows for specifying the flags <code>TYPE_SCROLL_SENSITIVE</code>, <code>CONCUR_UPDATABLE</code> for any statement, and then using ResultSet.updateXXX() methods to produce a cell-lock / row-lock. Here's a simplified example in JDBC:
    -											</p>
    -</html><java><![CDATA[PreparedStatement stmt = connection.prepareStatement(
    -  "SELECT * FROM author WHERE id IN (3, 4, 5)",
    -  ResultSet.TYPE_SCROLL_SENSITIVE,
    -  ResultSet.CONCUR_UPDATABLE);
    -ResultSet rs = stmt.executeQuery();
    -
    -while (rs.next()) {
    -  // UPDATE the primary key for row-locks, or any other columns for cell-locks
    -  rs.updateObject(1, rs.getObject(1));
    -  rs.updateRow();
    -
    -  // Do more stuff with this record
    -}]]></java><html>
    -
    -											<p>
    -												The main drawback of this approach is the fact that the database has to maintain a scrollable cursor, whose records are locked one by one. This can cause a major risk of deadlocks or race conditions if the JDBC driver can recover from the unsuccessful locking, if two Java threads execute the following statements:
    -											</p>
    -
    -</html><sql><![CDATA[-- thread 1
    -SELECT * FROM author ORDER BY id ASC;
    -
    --- thread 2
    -SELECT * FROM author ORDER BY id DESC;]]></sql><html>
    -
    -											<p>
    -												So use this technique with care, possibly only ever locking single rows!
    -											</p>
    -
    -											<h3>Pessimistic (shared) locking with the <code>FOR SHARE</code> clause</h3>
    -											<p>
    -												Some databases (MySQL, Postgres) also allow to issue a non-exclusive lock explicitly using a <code>FOR SHARE</code> clause. This is also supported by jOOQ
    -											</p>
    -
    -											<h3>Optimistic locking in jOOQ</h3>
    -											<p>
    -												Note, that jOOQ also supports optimistic locking, if you're doing simple CRUD. This is documented in the section's manual about <reference id="optimistic-locking" title="optimistic locking"/>.
    -											</p>
    -										</html></content>
    -									</section>
    -
    -									<section id="union-clause">
    -										<title>UNION, INTERSECTION and EXCEPT</title>
    -										<content><html>
    -											<p>
    -												SQL allows to perform set operations as understood in standard set theory on result sets. These operations include unions, intersections, subtractions. For two subselects to be combinable by such a set operator, each subselect must return a <reference id="table-expressions" title="table expression"/> of the same degree and type.
    -											</p>
    -											
    -											<h3>UNION and UNION ALL</h3>
    -											<p>
    -												These operators combine two results into one. While <code>UNION</code> removes all duplicate records resulting from this combination, <code>UNION ALL</code> leaves subselect results as they are. Typically, you should prefer <code>UNION ALL</code> over <code>UNION</code>, if you don't really need to remove duplicates. The following example shows how to use such a <code>UNION</code> operation in jOOQ.
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT * FROM BOOK WHERE ID = 3
    -UNION ALL
    -SELECT * FROM BOOK WHERE ID = 5]]></sql>
    -<java><![CDATA[create.selectFrom(BOOK).where(BOOK.ID.equal(3))
    -      .unionAll(
    -create.selectFrom(BOOK).where(BOOK.ID.equal(5)));]]></java></code-pair><html>
    -											
    -											<h3>INTERSECT [ ALL ] and EXCEPT [ ALL ]</h3>
    -											<p>
    -												<code>INTERSECT</code> is the operation that produces only those values that are returned by both subselects. <code>EXCEPT</code> is the operation that returns only those values that are returned exclusively in the first subselect. Both operators will remove duplicates from their results. The SQL standard allows to specify the <code>ALL</code> keyword for both of these operators as well, but this is hardly supported in any database. jOOQ does not support <code>INTERSECT ALL</code>, <code>EXEPT ALL</code> operations either. 
    -											</p>
    -											
    -											<h3>jOOQ's set operators and how they're different from standard SQL</h3>
    -											<p>
    -												As previously mentioned in the manual's section about the <reference id="order-by-clause" title="ORDER BY clause"/>, jOOQ has slightly changed the semantics of these set operators. While in SQL, a subselect may not contain any <reference id="order-by-clause" title="ORDER BY clause"/> or <reference id="limit-clause" title="LIMIT clause"/> (unless you wrap the subselect into a <reference id="nested-selects" title="nested SELECT"/>), jOOQ allows you to do so. In order to select both the youngest and the oldest author from the database, you can issue the following statement with jOOQ (rendered to the MySQL dialect):
    -											</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[  (SELECT * FROM AUTHOR 
    -   ORDER BY DATE_OF_BIRTH ASC LIMIT 1)
    -UNION
    -  (SELECT * FROM AUTHOR 
    -   ORDER BY DATE_OF_BIRTH DESC LIMIT 1)]]></sql>
    -<java><![CDATA[create.selectFrom(AUTHOR)
    -      .orderBy(AUTHOR.DATE_OF_BIRTH.asc()).limit(1)
    -      .union(
    -create.selectFrom(AUTHOR)
    -      .orderBy(AUTHOR.DATE_OF_BIRTH.desc()).limit(1));]]></java></code-pair><html>
    -		
    -											<h3>Projection typesafety for degrees between 1 and {max-row-degree}</h3>
    -											<p>
    -												Two subselects that are combined by a set operator are required to be of the same degree and, in most databases, also of the same type. jOOQ 3.0's introduction of <reference id="record-n" title="Typesafe Record[N] types"/> helps compile-checking these constraints:
    -											</p>
    -											
    -</html><java><![CDATA[// Some sample SELECT statements
    -Select<Record2<Integer, String>>  s1 = select(BOOK.ID, BOOK.TITLE).from(BOOK);
    -Select<Record1<Integer>>          s2 = selectOne();
    -Select<Record2<Integer, Integer>> s3 = select(one(), zero());
    -Select<Record2<Integer, String>>  s4 = select(one(), inline("abc"));
    -
    -// Let's try to combine them:
    -s1.union(s2); // Doesn't compile because of a degree mismatch. Expected: Record2<...>, got: Record1<...>
    -s1.union(s3); // Doesn't compile because of a type mismatch. Expected: <Integer, String>, got: <Integer, Integer>
    -s1.union(s4); // OK. The two Record[N] types match]]></java>											
    -										</content>
    -									</section>
    -
    -									<section id="oracle-hints">
    -										<title>Oracle-style hints</title>
    -										<content><html>
    -											<p>
    -												If you are closely coupling your application to an Oracle (or CUBRID) database,	you might need to be able to pass hints of the form <code>/*+HINT*/</code> with your SQL statements to the Oracle database. For example:
    -											</p>
    -
    -</html><sql>SELECT /*+ALL_ROWS*/ FIRST_NAME, LAST_NAME
    -  FROM AUTHOR</sql><html>
    -
    -				  							<p>
    -				  								This can be done in jOOQ using the <code>.hint()</code> clause in your SELECT statement:
    -			  								</p>
    -
    -</html><java>create.select(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -      .hint("/*+ALL_ROWS*/")
    -      .from(AUTHOR);</java><html>
    -
    -											<p>
    -												Note that you can pass any string in the <code>.hint()</code> clause. If you use that clause, the passed string will always be put in between the <code>SELECT [DISTINCT]</code> keywords and the actual projection list. This can be useful in other databases too, such as MySQL, for instance:
    -											</p>
    -											
    -</html><code-pair>
    -<sql><![CDATA[SELECT SQL_CALC_FOUND_ROWS field1, field2
    -FROM table1
    -]]></sql>
    -<java><![CDATA[create.select(field1, field2)
    -       .hint("SQL_CALC_FOUND_ROWS")
    -       .from(table1)]]></java>
    -</code-pair>
    -										</content>
    -									</section>
    -									
    -									<section id="select-lexical-vs-logical-order">
    -										<title>Lexical and logical SELECT clause order</title>
    -										<content><html>
    -											<p>
    -												SQL has a lexical and a logical order of <code>SELECT</code> clauses. The lexical order of <code>SELECT</code> clauses is inspired by the English language. As SQL statements are commands for the database, it is natural to express a statement in an imperative tense, such as "SELECT this and that!".
    -											</p>
    -											
    -											<h3>Logical SELECT clause order</h3>
    -											<p>
    -												The logical order of <code>SELECT</code> clauses, however, does not correspond to the syntax. In fact, the logical order is this:
    -											</p>
    -											
    -											<ul>
    -												<li><reference id="from-clause" title="The FROM clause"/>: First, all data sources are defined and joined</li>
    -												<li><reference id="where-clause" title="The WHERE clause"/>: Then, data is filtered as early as possible</li>
    -												<li><reference id="connect-by-clause" title="The CONNECT BY clause"/>: Then, data is traversed iteratively or recursively, to produce new tuples</li>
    -												<li><reference id="group-by-clause" title="The GROUP BY clause"/>: Then, data is reduced to groups, possibly producing new tuples if <reference id="grouping-functions" title="grouping functions like ROLLUP(), CUBE(), GROUPING SETS()"/> are used</li>
    -												<li><reference id="having-clause" title="The HAVING clause"/>: Then, data is filtered again</li>
    -												<li><reference id="select-clause" title="The SELECT clause"/>: Only now, the projection is evaluated. In case of a <code>SELECT DISTINCT</code> statement, data is further reduced to remove duplicates</li>
    -												<li><reference id="union-clause" title="The UNION clause"/>: Optionally, the above is repeated for several <code>UNION</code>-connected subqueries. Unless this is a <code>UNION ALL</code> clause, data is further reduced to remove duplicates</li>
    -												<li><reference id="order-by-clause" title="The ORDER BY clause"/>: Now, all remaining tuples are ordered</li>
    -												<li><reference id="limit-clause" title="The LIMIT clause"/>: Then, a paging view is created for the ordered tuples</li>
    -												<li><reference id="for-update-clause" title="The FOR UPDATE clause"/>: Finally, pessimistic locking is applied</li>
    -											</ul>
    -											
    -											<p>
    -												The <a href="http://msdn.microsoft.com/en-us/library/ms189499.aspx">SQL Server documentation</a> also explains this, with slightly different clauses:
    -											</p>
    -											
    -											<ul>
    -												<li><code>FROM</code></li>
    -												<li><code>ON</code></li>
    -												<li><code>JOIN</code></li>
    -												<li><code>WHERE</code></li>
    -												<li><code>GROUP BY</code></li>
    -												<li><code>WITH CUBE</code> or <code>WITH ROLLUP</code></li>
    -												<li><code>HAVING</code></li>
    -												<li><code>SELECT</code></li>
    -												<li><code>DISTINCT</code></li>
    -												<li><code>ORDER BY</code></li>
    -												<li><code>TOP</code></li>
    -											</ul>
    -											
    -											<p>
    -												As can be seen, databases have to logically reorder a SQL statement in order to determine the best execution plan. 
    -											</p>
    -											
    -											<h3>Alternative syntaxes: LINQ, SLICK</h3>
    -											<p>
    -											    Some "higher-level" abstractions, such as C#'s LINQ or Scala's SLICK try to inverse the lexical order of <code>SELECT</code> clauses to what appears to be closer to the logical order. The obvious advantage of moving the <code>SELECT</code> clause to the end is the fact that the projection type, which is the record type returned by the <code>SELECT</code> statement can be re-used more easily in the target environment of the internal domain specific language.
    -											</p>
    -											
    -											<p>
    -												A LINQ example:
    -											</p>
    -</html><java><![CDATA[// LINQ-to-SQL looks somewhat similar to SQL
    -// AS clause    // FROM clause
    -From p          In db.Products
    -
    -// WHERE clause
    -Where p.UnitsInStock <= p.ReorderLevel AndAlso Not p.Discontinued
    -
    -// SELECT clause
    -Select p]]></java><html>											
    -											
    -											<p> 
    -											    A SLICK example:
    -											</p>
    -											
    -</html><scala><![CDATA[// "for" is the "entry-point" to the DSL
    -val q = for {
    -
    -    // FROM clause   WHERE clause
    -    c <- Coffees     if c.supID === 101
    -
    -// SELECT clause and projection to a tuple
    -} yield (c.name, c.price)]]></scala><html>
    -
    -											<p>
    -												While this looks like a good idea at first, it only complicates translation to more advanced SQL statements while impairing readability for those users that are used to writing SQL. jOOQ is designed to look just like SQL. This is specifically true for SLICK, which not only changed the <code>SELECT</code> clause order, but also heavily "integrated" SQL clauses with the Scala language.
    -											</p>
    -											<p>
    -												For these reasons, the jOOQ DSL API is modelled in SQL's lexical order.
    -											</p>
    -										</html></content>
    -									</section>
    -								</sections>
    -							</section>
    -
    -							<section id="insert-statement">
    -								<title>The INSERT statement</title>
    -								<content><html>
    -									<p>
    -										The <code>INSERT</code> statement is used to insert new records into a database table. Records can either be supplied using a <code>VALUES()</code> constructor, or a <code>SELECT</code> statement. jOOQ supports both types of <code>INSERT</code> statements. An example of an <code>INSERT</code> statement using a <code>VALUES()</code> constructor is given here:
    -									</p>
    -
    -
    -</html><code-pair>
    -<sql>INSERT INTO AUTHOR 
    -       (ID, FIRST_NAME, LAST_NAME)
    -VALUES (100, 'Hermann', 'Hesse');</sql>
    -<java>create.insertInto(AUTHOR,
    -        AUTHOR.ID, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -      .values(100, "Hermann", "Hesse");</java></code-pair><html>
    -
    -									<p>
    -										Note that for explicit degrees up to {max-row-degree}, the <code>VALUES()</code> constructor provides additional typesafety. The following example illustrates this:
    -									</p>
    -
    -</html><java><![CDATA[InsertValuesStep3<AuthorRecord, Integer, String, String> step = 
    -  create.insertInto(AUTHOR, AUTHOR.ID, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME);
    -    step.values("A", "B", "C");
    -         // ^^^ Doesn't compile, the expected type is Integer]]></java><html>
    -									<h3>INSERT multiple rows with the VALUES() constructor</h3>
    -									<p>
    -										The SQL standard specifies that multiple rows can be supplied to the VALUES() constructor in an INSERT statement. Here's an example of a multi-record INSERT
    -									</p>
    -</html><code-pair>
    -<sql>INSERT INTO AUTHOR
    -       (ID, FIRST_NAME, LAST_NAME)
    -VALUES (100, 'Hermann', 'Hesse'),
    -       (101, 'Alfred', 'Döblin');</sql>
    -<java>create.insertInto(AUTHOR,
    -        AUTHOR.ID, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -      .values(100, "Hermann", "Hesse")
    -      .values(101, "Alfred", "Döblin");</java></code-pair><html>
    -
    -									<p>
    -										jOOQ tries to stay close to actual SQL. In detail, however, Java's expressiveness is limited. That's why the values() clause is repeated for every record in multi-record inserts. 
    -									</p>
    -									<p> 
    -										Some RDBMS do not support inserting several records in a single statement. In those cases, jOOQ simulates multi-record INSERTs using the following SQL:
    -									</p>
    -
    -</html><code-pair>
    -<sql>INSERT INTO AUTHOR
    -    (ID, FIRST_NAME, LAST_NAME)
    -SELECT 100, 'Hermann', 'Hesse' FROM DUAL UNION ALL
    -SELECT 101, 'Alfred', 'Döblin' FROM DUAL;</sql>
    -<java>create.insertInto(AUTHOR,
    -        AUTHOR.ID, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -      .values(100, "Hermann", "Hesse")
    -      .values(101, "Alfred", "Döblin");
    -</java></code-pair><html>
    -
    -									<h3>INSERT using jOOQ's alternative syntax</h3>
    -									<p>
    -										MySQL (and some other RDBMS) allow for using a non-SQL-standard, UPDATE-like syntax for INSERT statements. This is also supported in jOOQ, should you prefer that syntax. The above INSERT statement can also be expressed as follows:
    -									</p>
    -
    -</html><java>create.insertInto(AUTHOR)
    -      .set(AUTHOR.ID, 100)
    -      .set(AUTHOR.FIRST_NAME, "Hermann")
    -      .set(AUTHOR.LAST_NAME, "Hesse")
    -      .newRecord()
    -      .set(AUTHOR.ID, 101)
    -      .set(AUTHOR.FIRST_NAME, "Alfred")
    -      .set(AUTHOR.LAST_NAME, "Döblin");</java><html>
    -      
    -									<p>
    -										As you can see, this syntax is a bit more verbose, but also more readable, as every field can be matched with its value. Internally, the two syntaxes are strictly equivalent.
    -									</p>
    -
    -									<h3>MySQL's INSERT .. ON DUPLICATE KEY UPDATE</h3>
    -									<p>
    -										The MySQL database supports a very convenient way to INSERT or UPDATE a record. This is a non-standard extension to the SQL syntax, which is supported by jOOQ and simulated in other RDBMS, where this is possible (i.e. if they support the SQL standard <reference id="merge-statement" title="MERGE statement"/>). Here is an example how to use the ON DUPLICATE KEY UPDATE clause:
    -									</p>
    -									
    -</html><java>// Add a new author called "Koontz" with ID 3.
    -// If that ID is already present, update the author's name
    -create.insertInto(AUTHOR, AUTHOR.ID, AUTHOR.LAST_NAME)
    -      .values(3, "Koontz")
    -      .onDuplicateKeyUpdate()
    -      .set(AUTHOR.LAST_NAME, "Koontz");</java><html>
    -
    -									<h3>The synthetic ON DUPLICATE KEY IGNORE clause</h3>
    -							
    -									<p>
    -										The MySQL database also supports an INSERT IGNORE INTO clause. This is supported by jOOQ using the more convenient SQL syntax variant of ON DUPLICATE KEY IGNORE, which can be equally simulated in other databases using a <reference id="merge-statement" title="MERGE statement"/>:
    -									</p>
    -									
    -</html><java>// Add a new author called "Koontz" with ID 3.
    -// If that ID is already present, ignore the INSERT statement
    -create.insertInto(AUTHOR, AUTHOR.ID, AUTHOR.LAST_NAME)
    -      .values(3, "Koontz")
    -      .onDuplicateKeyIgnore();</java><html>
    -
    -      								<h3>Postgres's INSERT .. RETURNING</h3>
    -									<p>
    -										The Postgres database has native support for an INSERT .. RETURNING clause. This is a very powerful concept that is simulated for all other dialects using JDBC's <reference class="java.sql.Statement" anchor="#getGeneratedKeys()" title="getGeneratedKeys()"/> method. Take this example:
    -									</p>
    -
    -</html><java><![CDATA[// Add another author, with a generated ID
    -Record<?> record =
    -create.insertInto(AUTHOR, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -      .values("Charlotte", "Roche")
    -      .returning(AUTHOR.ID)
    -      .fetchOne();
    -
    -System.out.println(record.getValue(AUTHOR.ID));
    -
    -// For some RDBMS, this also works when inserting several values
    -// The following should return a 2x2 table
    -Result<?> result =
    -create.insertInto(AUTHOR, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -      .values("Johann Wolfgang", "von Goethe")
    -      .values("Friedrich", "Schiller")
    -      // You can request any field. Also trigger-generated values
    -      .returning(AUTHOR.ID, AUTHOR.CREATION_DATE)
    -      .fetch();]]></java><html>
    -
    -		      						<p>
    -		      							Some databases have poor support for returning generated keys after INSERTs. In those cases, jOOQ might need to issue another <reference id="select-statement" title="SELECT statement"/> in order to fetch an @@identity value. Be aware, that this can lead to race-conditions in those databases that cannot properly return generated ID values. For more information, please consider the jOOQ Javadoc for the returning() clause.
    -		      						</p>
    -
    -									<h3>The INSERT SELECT statement</h3>
    -							
    -									<p>
    -										In some occasions, you may prefer the INSERT SELECT syntax, for instance, when you copy records from one table to another:
    -									</p>
    -									
    -</html><java>create.insertInto(AUTHOR_ARCHIVE)
    -      .select(create.selectFrom(AUTHOR).where(AUTHOR.DECEASED.isTrue()));</java>
    -								
    -								</content>
    -							</section>
    -
    -							<section id="update-statement">
    -								<title>The UPDATE statement</title>
    -								<content><html>
    -									<p>
    -										The UPDATE statement is used to modify one or several pre-existing records in a database table. UPDATE statements are only possible on single tables. Support for multi-table updates will be implemented in the near future. An example update query is given here:
    -									</p>
    -
    -</html><code-pair>
    -<sql>UPDATE AUTHOR
    -   SET FIRST_NAME = 'Hermann',
    -       LAST_NAME = 'Hesse'
    - WHERE ID = 3;</sql>
    -<java>create.update(AUTHOR)
    -      .set(AUTHOR.FIRST_NAME, "Hermann")
    -      .set(AUTHOR.LAST_NAME, "Hesse")
    -      .where(AUTHOR.ID.equal(3));</java>
    -</code-pair><html>
    -
    -									<p>
    -										Most databases allow for using scalar subselects in UPDATE statements in one way or another. jOOQ models this through a <code>set(Field&lt;T>, Select&lt;? extends Record1&lt;T>>)</code> method in the <code>UPDATE</code> DSL API:
    -									</p>
    -
    -</html><code-pair>
    -<sql>UPDATE AUTHOR
    -   SET FIRST_NAME = (
    -         SELECT FIRST_NAME
    -         FROM PERSON
    -         WHERE PERSON.ID = AUTHOR.ID
    -       ),
    - WHERE ID = 3;</sql>
    -<java>create.update(AUTHOR)
    -      .set(AUTHOR.FIRST_NAME, 
    -         select(PERSON.FIRST_NAME)
    -        .from(PERSON)
    -        .where(PERSON.ID.equal(AUTHOR.ID))
    -      )
    -      .where(AUTHOR.ID.equal(3));</java>
    -</code-pair><html>
    -
    -
    -									<h3>Using row value expressions in an UPDATE statement</h3>
    -									<p>
    -										jOOQ supports formal <reference id="row-value-expressions" title="row value expressions"/> in various contexts, among which the UPDATE statement. Only one row value expression can be updated at a time. Here's an example:
    -									</p>
    -									
    -</html><code-pair>
    -<sql>UPDATE AUTHOR
    -   SET (FIRST_NAME, LAST_NAME) = 
    -       ('Hermann',  'Hesse')
    - WHERE ID = 3;</sql>
    -<java>create.update(AUTHOR)
    -      .set(row(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME),
    -           row("Herman",          "Hesse"))
    -      .where(AUTHOR.ID.equal(3));</java>
    -</code-pair><html>
    -
    -									<p>
    -										This can be particularly useful when using subselects:
    -									</p>
    -
    -</html><code-pair>
    -<sql>UPDATE AUTHOR
    -   SET (FIRST_NAME, LAST_NAME) = (
    -         SELECT PERSON.FIRST_NAME, PERSON.LAST_NAME
    -         FROM PERSON
    -         WHERE PERSON.ID = AUTHOR.ID
    -       )
    - WHERE ID = 3;</sql>
    -<java>create.update(AUTHOR)
    -      .set(row(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME),
    -           select(PERSON.FIRST_NAME, PERSON.LAST_NAME)
    -          .from(PERSON)
    -          .where(PERSON.ID.equal(AUTHOR.ID))
    -      )
    -      .where(AUTHOR.ID.equal(3));</java>
    -</code-pair><html>
    -
    -									<p>
    -										The above row value expressions usages are completely typesafe.
    -									</p>
    -									
    -									<h3>UPDATE .. RETURNING</h3>
    -									<p>
    -										The Firebird and Postgres databases support a <code>RETURNING</code> clause on their <code>UPDATE</code> statements, similar as the <code>RETURNING</code> clause in <reference id="insert-statement" title="INSERT statements"/>. This is useful to fetch trigger-generated values in one go. An example is given here:
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[-- Fetch a trigger-generated value
    -UPDATE BOOK
    -SET TITLE = 'Animal Farm'
    -WHERE ID = 5
    -RETURNING UPDATE_COUNT]]></sql>
    -<java><![CDATA[int count = create.update(BOOK)
    -                  .set(BOOK.TITLE, "Animal Farm")
    -                  .where(BOOK.ID.equal(5))
    -                  .returning(BOOK.UPDATE_COUNT)
    -                  .fetchOne().getValue(BOOK.UPDATE_COUNT);]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										The <code>UPDATE .. RETURNING</code> clause is currently not simulated for other databases. Future versions might execute an additional <reference id="select-statement" title="SELECT statement"/> to fetch results.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="delete-statement">
    -								<title>The DELETE statement</title>
    -								<content><html>
    -									<p>
    -										The DELETE statement physically removes records from a database table. DELETE statements are only possible on single tables. Support for multi-table deletes will be implemented in the near future. An example delete query is given here:
    -									</p>
    -
    -</html><code-pair>
    -<sql>DELETE AUTHOR
    - WHERE ID = 100;</sql>
    -<java>create.delete(AUTHOR)
    -      .where(AUTHOR.ID.equal(100));</java>
    -</code-pair>
    -
    -								</content>
    -							</section>
    -
    -							<section id="merge-statement">
    -								<title>The MERGE statement</title>
    -								<content><html>
    -									<p>
    -										The MERGE statement is one of the most advanced standardised SQL constructs, which is supported by DB2, HSQLDB, Oracle, SQL Server and Sybase (MySQL has the similar INSERT .. ON DUPLICATE KEY UPDATE construct)
    -									</p>
    -									<p>
    -										The point of the standard MERGE statement is to take a TARGET table, and merge (INSERT, UPDATE) data from a SOURCE table into it. DB2, Oracle, SQL Server and Sybase also allow for DELETING some data and for adding many additional clauses. With jOOQ {jooq-version}, only Oracle's MERGE extensions are supported. Here is an example:
    -									</p>
    -
    -</html><code-pair>
    -<sql>-- Check if there is already an author called 'Hitchcock'
    --- If there is, rename him to John. If there isn't add him.
    -MERGE INTO AUTHOR
    -USING (SELECT 1 FROM DUAL)
    -ON (LAST_NAME = 'Hitchcock')
    -WHEN MATCHED THEN UPDATE SET FIRST_NAME = 'John'
    -WHEN NOT MATCHED THEN INSERT (LAST_NAME) VALUES ('Hitchcock')</sql>
    -<java>create.mergeInto(AUTHOR)
    -      .using(create().selectOne())
    -      .on(AUTHOR.LAST_NAME.equal("Hitchcock"))
    -      .whenMatchedThenUpdate()
    -      .set(AUTHOR.FIRST_NAME, "John")
    -      .whenNotMatchedThenInsert(AUTHOR.LAST_NAME)
    -      .values("Hitchcock");
    -
    -</java></code-pair><html>
    -
    -		                            <h3>MERGE Statement (H2-specific syntax)</h3>
    -									<p>
    -									    The H2 database ships with a somewhat less powerful but a little more intuitive syntax for its own version of the MERGE statement. An example more or less equivalent to the previous one can be seen here:
    -									</p>
    -									
    -</html><code-pair>
    -<sql>-- Check if there is already an author called 'Hitchcock'
    --- If there is, rename him to John. If there isn't add him.
    -
    -MERGE INTO AUTHOR (FIRST_NAME, LAST_NAME)
    -KEY (LAST_NAME)
    -VALUES ('John', 'Hitchcock')</sql>
    -<java>create.mergeInto(AUTHOR,
    -                 AUTHOR.FIRST_NAME,
    -                 AUTHOR.LAST_NAME)
    -      .key(AUTHOR.LAST_NAME)
    -      .values("John", "Hitchcock")
    -      .execute();
    -</java></code-pair><html>
    -
    -		                            <p>
    -		                                This syntax can be fully simulated by jOOQ for all other databases that support the SQL standard. For more information about the H2 MERGE syntax, see the documentation here:<br/>
    -		                                <a href="http://www.h2database.com/html/grammar.html#merge">http://www.h2database.com/html/grammar.html#merge</a>
    -		                            </p>
    -								
    -									<h3>Typesafety of VALUES() for degrees up to {max-row-degree}</h3>
    -									<p>
    -										Much like the <reference id="insert-statement" title="INSERT statement"/>, the <code>MERGE</code> statement's <code>VALUES()</code> clause provides typesafety for degrees up to {max-row-degree}, in both the standard syntax variant as well as the H2 variant.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="truncate-statement">
    -								<title>The TRUNCATE statement</title>
    -								<content><html>
    -									<p>
    -										The TRUNCATE statement is the only DDL statement supported by jOOQ so far. It is popular in many databases when you want to bypass constraints for table truncation. Databases may behave differently, when a truncated table is referenced by other tables. For instance, they may fail if records from a truncated table are referenced, even with ON DELETE CASCADE clauses in place. Please, consider your database manual to learn more about its TRUNCATE implementation.
    -									</p>
    -									<p>
    -										The TRUNCATE syntax is trivial:
    -									</p>
    -
    -</html><code-pair>
    -	<sql>TRUNCATE TABLE AUTHOR;</sql>
    -	<java>create.truncate(AUTHOR).execute();</java>
    -</code-pair><html>
    -									
    -									<p>
    -										TRUNCATE is not supported by Ingres and SQLite. jOOQ will execute a DELETE FROM AUTHOR statement instead.
    -									</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -					<section id="table-expressions">
    -						<title>Table expressions</title>
    -						<content><html>
    -							<p>
    -								The following sections explain the various types of table expressions supported by jOOQ
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="generated-tables">
    -								<title>Generated Tables</title>
    -								<content><html>
    -									<p>
    -										Most of the times, when thinking about a <reference id="table-expressions" title="table expression"/> you're probably thinking about an actual physical table in your database schema. If you're using jOOQ's <reference id="code-generation" title="code generator"/>, you will have all tables from your database schema available to you as type safe Java objects. You can then use these tables in SQL <reference id="from-clause" title="FROM clauses"/>, <reference id="join-clause" title="JOIN clauses"/> or in other <reference id="sql-statements" title="SQL statements"/>, just like any other table expression. An example is given here:
    -									</p>
    -							
    -</html><code-pair>
    -<sql><![CDATA[SELECT *
    -FROM AUTHOR -- Table expression AUTHOR
    -JOIN BOOK   -- Table expression BOOK
    -ON (AUTHOR.ID = BOOK.AUTHOR_ID)]]></sql>
    -<java><![CDATA[create.select()
    -      .from(AUTHOR) // Table expression AUTHOR
    -      .join(BOOK)   // Table expression BOOK
    -      .on(AUTHOR.ID.equal(BOOK.AUTHOR_ID));]]></java></code-pair><html>
    -							
    -									<p>
    -										The above example shows how AUTHOR and BOOK tables are joined in a <reference id="select-statement" title="SELECT statement"/>. It also shows how you can access physical <reference id="table-columns" title="table columns"/> by dereferencing the relevant Java attributes of their tables.
    -									</p>
    -									<p>
    -										See the manual's section about <reference id="codegen-tables" title="generated tables"/> for more information about what is really generated by the <reference id="code-generation" title="code generator"/>
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="aliased-tables">
    -								<title>Aliased Tables</title>
    -								<content><html>
    -									<p>
    -										The strength of jOOQ's <reference id="code-generation" title="code generator"/> becomes more obvious when you perform table aliasing and dereference fields from generated aliased tables. This can best be shown by example:
    -									</p>
    -
    -</html><code-pair><sql><![CDATA[-- Select all books by authors born after 1920,
    --- named "Paulo" from a catalogue:
    -
    -
    -
    -SELECT *
    -  FROM author a
    -  JOIN book b ON a.id = b.author_id
    - WHERE a.year_of_birth > 1920
    -   AND a.first_name = 'Paulo'
    - ORDER BY b.title]]></sql>
    -<java><![CDATA[// Declare your aliases before using them in SQL:
    -Author a = AUTHOR.as("a");
    -Book b = BOOK.as("b");
    -
    -// Use aliased tables in your statement
    -create.select()
    -      .from(a)
    -      .join(b).on(a.ID.equal(b.AUTHOR_ID))
    -      .where(a.YEAR_OF_BIRTH.greaterThan(1920)
    -      .and(a.FIRST_NAME.equal("Paulo")))
    -      .orderBy(b.TITLE);]]></java></code-pair><html>
    -								
    -									<p>
    -										As you can see in the above example, calling <code>as()</code> on generated tables returns an object of the same type as the table. This means that the resulting object can be used to dereference fields from the aliased table. This is quite powerful in terms of having your Java compiler check the syntax of your SQL statements. If you remove a column from a table, dereferencing that column from that table alias will cause compilation errors.
    -									</p>
    -									
    -									<h3>Dereferencing columns from other table expressions</h3>
    -									<p>
    -										Only few table expressions provide the SQL syntax typesafety as shown above, where generated tables are used. Most tables, however, expose their fields through <code>field()</code> methods:
    -									</p>
    -
    -</html><java><![CDATA[// "Type-unsafe" aliased table:
    -Table<?> a = AUTHOR.as("a");
    -
    -// Get fields from a:
    -Field<?> id = a.field("ID");
    -Field<?> firstName = a.field("FIRST_NAME");]]></java><html>
    -									
    -									<h3>Derived column lists</h3>
    -									<p>
    -										The SQL standard specifies how a table can be renamed / aliased in one go along with its columns. It references the term "derived column list" for the following syntax (as supported by Postgres, for instance):
    -									</p>
    -									
    -</html><sql><![CDATA[SELECT t.a, t.b
    -FROM (
    -  SELECT 1, 2
    -) t(a, b)]]></sql><html>
    -
    -									<p>
    -										This feature is useful in various use-cases where column names are not known in advance (but the table's degree is!). An example for this are <reference id="array-and-cursor-unnesting" title="unnested tables"/>, or the <reference id="values" title="VALUES() table constructor"/>:
    -									</p>
    -
    -</html><sql><![CDATA[-- Unnested tables
    -SELECT t.a, t.b
    -FROM unnest(my_table_function()) t(a, b)
    -
    --- VALUES() constructor
    -SELECT t.a, t.b
    -FROM VALUES(1, 2),(3, 4) t(a, b)]]></sql><html>
    -
    -									<p>
    -										Only few databases really support such a syntax, but fortunately, jOOQ can simulate it easily using <code>UNION ALL</code> and an empty dummy record specifying the new column names. The two statements are equivalent:
    -									</p>
    -
    -</html><sql><![CDATA[-- Using derived column lists
    -SELECT t.a, t.b
    -FROM (
    -  SELECT 1, 2
    -) t(a, b)
    -
    --- Using UNION ALL and a dummy record
    -SELECT t.a, t.b
    -FROM (
    -  SELECT null a, null b FROM DUAL WHERE 1 = 0
    -  UNION ALL
    -  SELECT 1, 2 FROM DUAL
    -) t]]></sql><html>
    -									<p>
    -										In jOOQ, you would simply specify a varargs list of column aliases as such:
    -									</p>
    -									
    -</html><java><![CDATA[// Unnested tables
    -create.select().from(unnest(myTableFunction()).as("t", "a", "b"));
    -
    -// VALUES() constructor
    -create.select().from(values(
    -  row(1, 2),
    -  row(3, 4)
    -).as("t", "a", "b"));]]></java>									
    -								</content>
    -							</section>
    -
    -							<section id="joined-tables">
    -								<title>Joined tables</title>
    -								<content><html>
    -									<p>
    -										The <reference id="join-clause" title="JOIN operators"/> that can be used in <reference id="select-statement" title="SQL SELECT statements"/> are the most powerful and best supported means of creating new <reference id="table-expressions" title="table expressions"/> in SQL. Informally, the following can be said:
    -									</p>
    -									
    -</html><text>A(colA1, ..., colAn) "join" B(colB1, ..., colBm) "produces" C(colA1, ..., colAn, colB1, ..., colBm)</text><html>
    -
    -									<p>
    -										SQL and relational algebra distinguish between at least the following JOIN types (upper-case: SQL, lower-case: relational algebra):
    -									</p>
    -									<ul>
    -										<li><strong>CROSS JOIN or cartesian product</strong>: The basic JOIN in SQL, producing a relational cross product, combining every record of table A with every record of table B. Note that cartesian products can also be produced by listing comma-separated <reference id="table-expressions" title="table expressions"/> in the <reference id="from-clause" title="FROM clause"/> of a <reference id="select-statement" title="SELECT statement"/></li>
    -										<li><strong>NATURAL JOIN</strong>: The basic JOIN in relational algebra, yet a rarely used JOIN in databases with everyday degree of normalisation. This JOIN type unconditionally equi-joins two tables by all columns with the same name (requiring foreign keys and primary keys to share the same name). Note that the JOIN columns will only figure once in the resulting <reference id="table-expressions" title="table expression"/>.</li>
    -										<li><strong>INNER JOIN or equi-join</strong>: This JOIN operation performs a cartesian product (CROSS JOIN) with a <reference id="conditional-expressions" title="filtering predicate"/> being applied to the resulting <reference id="table-expressions" title="table expression"/>. Most often, a <reference id="comparison-predicate" title="equal comparison predicate"/> comparing foreign keys and primary keys will be applied as a filter, but any other predicate will work, too.</li>
    -										<li><strong>OUTER JOIN</strong>: This JOIN operation performs a cartesian product (CROSS JOIN) with a <reference id="conditional-expressions" title="filtering predicate"/> being applied to the resulting <reference id="table-expressions" title="table expression"/>. Most often, a <reference id="comparison-predicate" title="equal comparison predicate"/> comparing foreign keys and primary keys will be applied as a filter, but any other predicate will work, too. Unlike the INNER JOIN, an OUTER JOIN will add "empty records" to the left (table A) or right (table B) or both tables, in case the conditional expression fails to produce a .</li>										
    -										<li><strong>semi-join</strong>: In SQL, this JOIN operation can only be expressed implicitly using <reference id="in-predicate" title="IN predicates"/> or <reference id="exists-predicate" title="EXISTS predicates"/>. The <reference id="table-expressions" title="table expression"/> resulting from a semi-join will only contain the left-hand side table A</li>										
    -										<li><strong>anti-join</strong>: In SQL, this JOIN operation can only be expressed implicitly using <reference id="in-predicate" title="NOT IN predicates"/> or <reference id="exists-predicate" title="NOT EXISTS predicates"/>. The <reference id="table-expressions" title="table expression"/> resulting from a semi-join will only contain the left-hand side table A</li>
    -										<li><strong>division</strong>: This JOIN operation is hard to express at all, in SQL. See the manual's chapter about <reference id="relational-division" title="relational division"/> for details on how jOOQ simulates this operation.</li>
    -									</ul>									
    -									<p>
    -										jOOQ supports all of these JOIN types (except semi-join and anti-join) directly on any <reference id="table-expressions" title="table expression"/>:
    -									</p>
    -									
    -</html><java><![CDATA[// jOOQ's relational division convenience syntax 
    -DivideByOnStep divideBy(Table<?> table)
    -
    -// Various overloaded INNER JOINs
    -TableOnStep join(TableLike<?>)
    -TableOnStep join(String)
    -TableOnStep join(String, Object...)
    -TableOnStep join(String, QueryPart...)
    -
    -// Various overloaded OUTER JOINs (supporting Oracle's partitioned OUTER JOIN)
    -// Overloading is similar to that of INNER JOIN
    -TablePartitionByStep leftOuterJoin(TableLike<?>)
    -TablePartitionByStep rightOuterJoin(TableLike<?>)
    -
    -// Various overloaded FULL OUTER JOINs
    -TableOnStep fullOuterJoin(TableLike<?>)
    -
    -// Various overloaded CROSS JOINs
    -Table<Record> crossJoin(TableLike<?>)
    -
    -// Various overloaded NATURAL JOINs
    -Table<Record> naturalJoin(TableLike<?>)
    -Table<Record> naturalLeftOuterJoin(TableLike<?>)
    -Table<Record> naturalRightOuterJoin(TableLike<?>)]]></java><html>							
    -
    -									<p>
    -										Note that most of jOOQ's JOIN operations give way to a similar DSL API hierarchy as previously seen in the manual's section about the <reference id="join-clause" title="JOIN clause"/>
    -									</p>		
    -								</html></content>
    -							</section>
    -
    -							<section id="values">
    -								<title>The VALUES() table constructor</title>
    -								<content><html>
    -									<p>
    -										Some databases allow for expressing in-memory temporary tables using a <code>VALUES()</code> constructor. This constructor usually works the same way as the <code>VALUES()</code> clause known from the <reference id="insert-statement" title="INSERT statement"/> or from the <reference id="merge-statement" title="MERGE statement"/>. With jOOQ, you can also use the <code>VALUES()</code> table constructor, to create tables that can be used in a <reference id="select-statement" title="SELECT statement's"/> <reference id="from-clause" title="FROM clause"/>:
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[SELECT a, b
    -FROM VALUES(1, 'a'), 
    -           (2, 'b') t(a, b)]]></sql>
    -<java><![CDATA[create.select()
    -      .from(values(row(1, "a"),
    -                   row(2, "b")).as("t", "a", "b"));]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										Note, that it is usually quite useful to provide column aliases ("derived column lists") along with the table alias for the <code>VALUES()</code> constructor.
    -									</p>
    -									
    -									<p>
    -										The above statement is simulated by jOOQ for those databases that do not support the <code>VALUES()</code> constructor, natively (actual simulations may vary):
    -									</p>
    -									
    -</html><sql><![CDATA[-- If derived column expressions are supported:
    -SELECT a, b
    -FROM (
    -  SELECT 1, 'a' FROM DUAL UNION ALL
    -  SELECT 2, 'b' FROM DUAL
    -) t(a, b)
    -
    --- If derived column expressions are not supported:
    -SELECT a, b
    -FROM (
    -
    -  -- An empty dummy record is added to provide column names for the simulated derived column expression
    -  SELECT NULL a, NULL b FROM DUAL WHERE 1 = 0 UNION ALL
    -  
    -  -- Then, the actual VALUES() constructor is simulated
    -  SELECT 1,      'a'    FROM DUAL             UNION ALL
    -  SELECT 2,      'b'    FROM DUAL
    -) t
    -]]></sql>									
    -								</content>
    -							</section>
    -
    -							<section id="nested-selects">
    -								<title>Nested SELECTs</title>
    -								<content><html>
    -									<p>
    -										A <reference id="select-statement" title="SELECT statement"/> can appear almost anywhere a <reference id="table-expressions" title="table expression"/> can. Such a "nested SELECT" is often called a "derived table". Apart from many convenience methods accepting <reference class="org.jooq.Select"/> objects directly, a SELECT statement can always be transformed into a <reference class="org.jooq.Table"/> object using the asTable() method.
    -									</p>
    -									
    -									<h3>Example: Scalar subquery</h3>
    -									
    -</html><code-pair>
    -<sql>SELECT *
    -  FROM BOOK
    - WHERE BOOK.AUTHOR_ID = (
    - 		SELECT ID
    -          FROM AUTHOR
    -         WHERE LAST_NAME = 'Orwell')</sql>
    -<java>create.select()
    -      .from(BOOK)
    -      .where(BOOK.AUTHOR_ID.equal(create
    -             .select(AUTHOR.ID)
    -             .from(AUTHOR)
    -             .where(AUTHOR.LAST_NAME.equal("Orwell"))));</java>
    -</code-pair><html>
    -
    -									<h3>Example: Derived table</h3>
    -
    -</html><code-pair>
    -<sql><![CDATA[SELECT nested.* FROM (
    -      SELECT AUTHOR_ID, count(*) books
    -        FROM BOOK
    -    GROUP BY AUTHOR_ID
    -) nested
    -ORDER BY nested.books DESC
    -
    -
    -
    -]]></sql>
    -<java><![CDATA[Table<Record> nested =
    -    create.select(BOOK.AUTHOR_ID, count().as("books"))
    -          .from(BOOK)
    -          .groupBy(BOOK.AUTHOR_ID).asTable("nested");
    -
    -create.select(nested.getFields())
    -      .from(nested)
    -      .orderBy(nested.getField("books"));]]></java>
    -</code-pair><html>
    -
    -									<h3>Example: Correlated subquery</h3>
    -</html><code-pair>
    -<sql><![CDATA[  SELECT LAST_NAME, (
    -      SELECT COUNT(*)
    -       FROM BOOK
    -      WHERE BOOK.AUTHOR_ID = AUTHOR.ID) books
    -    FROM AUTHOR
    -ORDER BY books DESC
    -
    -
    -
    -]]></sql>
    -<java><![CDATA[// The type of books cannot be inferred from the Select<?>
    -Field<Object> books =
    -    create.selectCount()
    -          .from(BOOK)
    -          .where(BOOK.AUTHOR_ID.equal(AUTHOR.ID))
    -          .asField("books");
    -create.select(AUTHOR.ID, books)
    -      .from(AUTHOR)
    -      .orderBy(books, AUTHOR.ID));]]></java>
    -</code-pair>									
    -								</content>
    -							</section>
    -
    -							<section id="pivot-tables">
    -								<title>The Oracle 11g PIVOT clause</title>
    -								<content><html>
    -									<p>
    -										If you are closely coupling your application to an Oracle database, you can take advantage of some Oracle-specific features, such as the PIVOT clause, used for statistical analyses. The formal syntax definition is as follows:
    -									</p>
    -									
    -</html><sql>-- SELECT ..
    -     FROM table PIVOT (aggregateFunction [, aggregateFunction] FOR column IN (expression [, expression]))
    ---  WHERE ..</sql><html>
    -		
    -									<p>
    -										The PIVOT clause is available from the <reference class="org.jooq.Table"/> type, as pivoting is done directly on a table. Currently, only Oracle's PIVOT clause is supported. Support for SQL Server's slightly different PIVOT clause will be added later. Also, jOOQ may simulate PIVOT for other dialects in the future.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="relational-division">
    -								<title>jOOQ's relational division syntax</title>
    -								<content><html>
    -									<p>
    -									    There is one operation in relational algebra that is not given a lot of attention, because it is rarely used in real-world applications. It is the relational division, the opposite operation of the cross product (or, relational multiplication). The following is an approximate definition of a relational division:
    -									</p>
    -
    -</html><config>Assume the following cross join / cartesian product
    -C = A × B
    -
    -Then it can be said that
    -A = C ÷ B
    -B = C ÷ A</config><html>
    -
    -									<p>
    -									   With jOOQ, you can simplify using relational divisions by using the following syntax:
    -									</p>
    -
    -</html><java>C.divideBy(B).on(C.ID.equal(B.C_ID)).returning(C.TEXT)</java><html>
    -
    -									<p>
    -										The above roughly translates to
    -									</p>
    -
    -</html><sql>SELECT DISTINCT C.TEXT FROM C "c1"
    -WHERE NOT EXISTS (
    -  SELECT 1 FROM B
    -  WHERE NOT EXISTS (
    -    SELECT 1 FROM C "c2"
    -    WHERE "c2".TEXT = "c1".TEXT
    -    AND "c2".ID = B.C_ID
    -  )
    -)</sql><html>
    -
    -									<p>
    -										Or in plain text: Find those TEXT values in C whose ID's correspond to all ID's in B. Note that from the above SQL statement, it is immediately clear that proper indexing is of the essence. Be sure to have indexes on all columns referenced from the on(...) and returning(...) clauses.
    -									</p>
    -
    -									<p>
    -										For more information about relational division and some nice, real-life examples, see
    -									</p>
    -
    -									<ul>
    -										<li><a href="http://en.wikipedia.org/wiki/Relational_algebra#Division" title="Wikipedia article on relational division">http://en.wikipedia.org/wiki/Relational_algebra#Division</a></li>
    -										<li><a href="http://www.simple-talk.com/sql/t-sql-programming/divided-we-stand-the-sql-of-relational-division/" title="A nice summary of what relational division is and how it is best implemented in SQL">http://www.simple-talk.com/sql/t-sql-programming/divided-we-stand-the-sql-of-relational-division/</a></li>
    -									</ul>
    -								</html></content>
    -
    -							</section>
    -
    -							<section id="array-and-cursor-unnesting">
    -								<title>Array and cursor unnesting</title>
    -								<content><html>
    -									<p>
    -										The SQL standard specifies how SQL databases should implement ARRAY and TABLE types, as well as CURSOR types. Put simply, a CURSOR is a pointer to any materialised <reference id="table-expressions" title="table expression"/>. Depending on the cursor's features, this table expression can be scrolled through in both directions, records can be locked, updated, removed, inserted, etc. Often, CURSOR types contain s, whereas ARRAY and TABLE types contain simple scalar values, although that is not a requirement
    -									</p>
    -									
    -									<p>
    -										ARRAY types in SQL are similar to Java's array types. They contain a "component type" or "element type" and a "dimension". This sort of ARRAY type is implemented in H2, HSQLDB and Postgres and supported by jOOQ as such. Oracle uses strongly-typed arrays, which means that an ARRAY type (VARRAY or TABLE type) has a name and possibly a maximum capacity associated with it.
    -									</p>
    -
    -									<h3>Unnesting array and cursor types</h3>									
    -									<p>
    -										The real power of these types become more obvious when you fetch them from <reference id="stored-procedures" title="stored procedures"/> to unnest them as <reference id="table-expressions" title="table expressions"/> and use them in your <reference id="from-clause" title="FROM clause"/>. An example is given here, where Oracle's DBMS_XPLAN package is used to fetch a cursor containing data about the most recent execution plan:
    -									</p>									
    -
    -</html><code-pair>
    -	<sql><![CDATA[SELECT *
    -FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(null, null, 'ALLSTATS'));]]></sql>
    -	<java><![CDATA[create.select()
    -      .from(table(DbmsXplan.displayCursor(null, null, "ALLSTATS"));]]></java>
    -</code-pair><html>
    -									<p>
    -										Note, in order to access the DbmsXplan package, you can use the <reference id="code-generation" title="code generator"/> to generate Oracle's SYS schema.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="dual">
    -								<title>The DUAL table</title>
    -								<content><html>
    -									<p>
    -										The SQL standard specifies that the <reference id="from-clause" title="FROM clause"/> is optional in a <reference id="select-statement" title="SELECT statement"/>. However, according to the standard, you may then no longer use some other clauses, such as the <reference id="where-clause" title="WHERE clause"/>. In the real world, there exist three types of databases:
    -									</p>
    -									<ul>
    -										<li>The ones that always require a <code>FROM</code> clause</li>
    -										<li>The ones that never require a <code>FROM</code> clause (and still allow a <code>WHERE</code> clause)</li>
    -										<li>The ones that correctly implement the SQL standard</li>
    -									</ul>
    -									<p>
    -										With jOOQ, you don't have to worry about the above distinction of SQL dialects. jOOQ never requires a <code>FROM</code> clause, but renders the necessary <code>"DUAL"</code> table, if needed. The following program shows how jOOQ renders <code>"DUAL"</code> tables
    -									</p>
    -
    -</html><code-pair>
    -	<sql><![CDATA[SELECT 1
    -SELECT 1 FROM "db_root"
    -SELECT 1 FROM "SYSIBM"."DUAL"
    -SELECT 1 FROM "SYSIBM"."SYSDUMMY1"
    -SELECT 1 FROM "RDB$DATABASE"
    -SELECT 1 FROM dual
    -SELECT 1 FROM "INFORMATION_SCHEMA"."SYSTEM_USERS"
    -SELECT 1 FROM (select 1 as dual) as dual
    -SELECT 1 FROM dual
    -SELECT 1 FROM dual
    -SELECT 1
    -SELECT 1
    -SELECT 1
    -SELECT 1 FROM [SYS].[DUMMY]
    -]]></sql>
    -	<java><![CDATA[DSL.using(SQLDialect.ASE      ).selectOne().getSQL();
    -DSL.using(SQLDialect.CUBRID   ).selectOne().getSQL();
    -DSL.using(SQLDialect.DB2      ).selectOne().getSQL();
    -DSL.using(SQLDialect.DERBY    ).selectOne().getSQL();
    -DSL.using(SQLDialect.FIREBIRD ).selectOne().getSQL();
    -DSL.using(SQLDialect.H2       ).selectOne().getSQL();
    -DSL.using(SQLDialect.HSQLDB   ).selectOne().getSQL();
    -DSL.using(SQLDialect.INGRES   ).selectOne().getSQL();
    -DSL.using(SQLDialect.MYSQL    ).selectOne().getSQL();
    -DSL.using(SQLDialect.ORACLE   ).selectOne().getSQL();
    -DSL.using(SQLDialect.POSTGRES ).selectOne().getSQL();
    -DSL.using(SQLDialect.SQLITE   ).selectOne().getSQL();
    -DSL.using(SQLDialect.SQLSERVER).selectOne().getSQL();
    -DSL.using(SQLDialect.SYBASE   ).selectOne().getSQL();]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										Note, that some databases (H2, MySQL) can normally do without <code>"DUAL"</code>. However, there exist some corner-cases with complex nested <code>SELECT</code> statements, where this will cause syntax errors (or parser bugs). To stay on the safe side, jOOQ will always render "dual" in those dialects.
    -									</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -					<section id="column-expressions">
    -						<title>Column expressions</title>
    -						<content><html>
    -						    <p>
    -						    	Column expressions can be used in various SQL clauses in order to refer to one or several columns. This chapter explains how to form various types of column expressions with jOOQ. A particular type of column expression is given in the section about <reference id="row-value-expressions" title="tuples or row value expressions"/>, where an expression may have a degree of more than one.
    -						    </p>
    -						
    -						    <h3>Using column expressions in jOOQ</h3>
    -							<p>
    -								jOOQ allows you to freely create arbitrary column expressions using a fluent expression construction API. Many expressions can be formed as functions from <reference id="dsl" title="DSL methods"/>, other expressions can be formed based on a pre-existing column expression. For example:
    -							</p>
    -							
    -</html><java><![CDATA[// A regular table column expression
    -Field<String> field1 = BOOK.TITLE;
    -
    -// A function created from the DSL using "prefix" notation
    -Field<String> field2 = trim(BOOK.TITLE);
    -
    -// The same function created from a pre-existing Field using "postfix" notation
    -Field<String> field3 = BOOK.TITLE.trim();
    -
    -// More complex function with advanced DSL syntax
    -Field<String> field4 = listAgg(BOOK.TITLE)
    -                          .withinGroupOrderBy(BOOK.ID.asc())
    -                          .over().partitionBy(AUTHOR.ID);]]></java><html>
    -
    -							<p>
    -								In general, it is up to you whether you want to use the "prefix" notation or the "postfix" notation to create new column expressions based on existing ones. The "SQL way" would be to use the "prefix notation", with functions created from the <reference id="dsl" title="DSL"/>. The "Java way" or "object-oriented way" would be to use the "postfix" notation with functions created from <reference class="org.jooq.Field"/> objects. Both ways ultimately create the same query part, though.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="table-columns">
    -								<title>Table columns</title>
    -								<content><html>
    -									<p>
    -										Table columns are the most simple implementations of a <reference id="column-expressions" title="column expression"/>. They are mainly produced by jOOQ's <reference id="code-generation" title="code generator"/> and can be dereferenced from the generated tables. This manual is full of examples involving table columns. Another example is given in this query:
    -									</p>
    -
    -</html><code-pair>
    -	<sql><![CDATA[SELECT BOOK.ID, BOOK.TITLE
    -FROM BOOK
    -WHERE BOOK.TITLE LIKE '%SQL%'
    -ORDER BY BOOK.TITLE]]></sql>
    -	<java><![CDATA[create.select(BOOK.ID, BOOK.TITLE)
    -	  .from(BOOK)
    -	  .where(BOOK.TITLE.like("%SQL%"))
    -	  .orderBy(BOOK.TITLE);]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										Table columns implement a more specific interface called <reference class="org.jooq.TableField"/>, which is parameterised with its associated <code>&lt;R extends Record&gt;</code> record type.
    -									</p>
    -									<p>
    -										See the manual's section about <reference id="codegen-tables" title="generated tables"/> for more information about what is really generated by the <reference id="code-generation" title="code generator"/>
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="aliased-columns">
    -								<title>Aliased columns</title>
    -								<content><html>
    -									<p>
    -										Just like <reference id="aliased-tables" title="tables"/>, columns can be renamed using aliases. Here is an example:
    -									</p>
    -									
    -</html><sql>  SELECT FIRST_NAME || ' ' || LAST_NAME author, COUNT(*) books
    -    FROM AUTHOR
    -    JOIN BOOK ON AUTHOR.ID = AUTHOR_ID
    -GROUP BY FIRST_NAME, LAST_NAME;</sql><html>
    -
    -									<p>
    -										Here is how it's done with jOOQ:
    -									</p>
    -									
    -</html><java>Record record = create.select(
    -         concat(AUTHOR.FIRST_NAME, val(" "), AUTHOR.LAST_NAME).as("author"),
    -         count().as("books"))
    -      .from(AUTHOR)
    -      .join(BOOK).on(AUTHOR.ID.equal(BOOK.AUTHOR_ID))
    -      .groupBy(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME).fetchAny();</java><html>
    -      
    -      								<p>
    -      									When you alias Fields like above, you can access those Fields' values using the alias name:
    -  									</p>
    -  									
    -</html><java>System.out.println("Author : " + record.getValue("author"));
    -System.out.println("Books  : " + record.getValue("books"));</java>
    -									
    -								</content>
    -							</section>
    -
    -							<section id="cast-expressions">
    -								<title>Cast expressions</title>
    -								<content><html>
    -									<p>
    -										jOOQ's source code generator tries to find the most accurate type mapping between your vendor-specific data types and a matching Java type. For instance, most <code>VARCHAR</code>, <code>CHAR</code>, <code>CLOB</code> types will map to String. Most <code>BINARY</code>, <code>BYTEA</code>, <code>BLOB</code> types will map to <code>byte[]</code>. <code>NUMERIC</code> types will default to <reference class="java.math.BigDecimal"/>, but can also be any of <reference class="java.math.BigInteger"/>, <reference class="java.lang.Long"/>, <reference class="java.lang.Integer"/>, <reference class="java.lang.Short"/>, <reference class="java.lang.Byte"/>, <reference class="java.lang.Double"/>, <reference class="java.lang.Float"/>.
    -									</p>
    -									<p>
    -										Sometimes, this automatic mapping might not be what you needed, or jOOQ cannot know the type of a field. In those cases you would write SQL type <code>CAST</code> like this:
    -									</p>
    -									
    -</html><sql>-- Let's say, your Postgres column LAST_NAME was VARCHAR(30)
    --- Then you could do this:
    -SELECT CAST(AUTHOR.LAST_NAME AS TEXT) FROM DUAL</sql><html>
    -
    -									<p>
    -										in jOOQ, you can write something like that:
    -									</p>
    -									
    -</html><java>create.select(TAuthor.LAST_NAME.cast(PostgresDataType.TEXT));</java><html>
    -
    -									<p>
    -										The same thing can be achieved by casting a Field directly to String.class, as <code>TEXT</code> is the default data type in Postgres to map to Java's String
    -									</p>
    -									
    -</html><java>create.select(TAuthor.LAST_NAME.cast(String.class));</java><html>
    -		
    -									<p>
    -										The complete <code>CAST</code> API in <reference class="org.jooq.Field"/> consists of these three methods:
    -									</p>
    -									
    -</html><java><![CDATA[public interface Field<T> {
    -
    -    // Cast this field to the type of another field
    -    <Z> Field<Z> cast(Field<Z> field);
    -    
    -    // Cast this field to a given DataType
    -    <Z> Field<Z> cast(DataType<Z> type);
    -    
    -    // Cast this field to the default DataType for a given Class
    -    <Z> Field<Z> cast(Class<? extends Z> type);
    -}
    -
    -// And additional convenience methods in the DSL:
    -public class DSL {
    -    <T> Field<T> cast(Object object, Field<T> field);
    -    <T> Field<T> cast(Object object, DataType<T> type);
    -    <T> Field<T> cast(Object object, Class<? extends T> type);
    -    <T> Field<T> castNull(Field<T> field);
    -    <T> Field<T> castNull(DataType<T> type);
    -    <T> Field<T> castNull(Class<? extends T> type);
    -}]]></java>
    -								</content>
    -							</section>
    -
    -                            <section id="datatype-coercions">
    -                                <title>Datatype coercions</title>
    -                                <content><html>
    -                                    <p>
    -                                        A slightly different use case than <reference id="cast-expressions" title="CAST expressions"/> are data type coercions, which are not rendered through to generated SQL. Sometimes, you may want to pretend that a numeric value is really treated as a string value, for instance when binding a numeric <reference id="variable-binding" title="bind value"/>:
    -                                    </p>
    -                                    
    -</html><java><![CDATA[Field<String>  field1 = val(1).coerce(String.class);
    -Field<Integer> field2 = val("1").coerce(Integer.class);]]></java><html>
    -
    -                                    <p>
    -                                        In the above example, <code>field1</code> will be treated by jOOQ as a <code>Field&lt;String></code>, binding the numeric literal <code>1</code> as a <code>VARCHAR</code> value. The same applies to <code>field2</code>, whose string literal <code>"1"</code> will be bound as an <code>INTEGER</code> value.
    -                                    </p>
    -                                    
    -                                    <p>
    -                                        This technique is better than performing unsafe or rawtype casting in Java, if you cannot access the "right" field type from any given expression.
    -                                    </p>
    -                                </html></content>
    -                            </section>
    -
    -							<section id="arithmetic-expressions">
    -								<title>Arithmetic expressions</title>
    -								<content><html>
    -									<h3>Numeric arithmetic expressions</h3>
    -									<p>
    -										Your database can do the math for you. Arithmetic operations are implemented just like <reference id="numeric-functions" title="numeric functions"/>, with similar limitations as far as type restrictions are concerned. You can use any of these operators:
    -									</p>
    -
    -</html><config>  +  -  *  /  %</config><html>
    -
    -									<p>
    -										In order to express a SQL query like this one:
    -									</p>
    -									
    -</html><sql>SELECT ((1 + 2) * (5 - 3) / 2) % 10 FROM DUAL</sql><html>
    -							
    -									<p>
    -										You can write something like this in jOOQ:
    -									</p>
    -									
    -</html><java>create.select(val(1).add(2).mul(val(5).sub(3)).div(2).mod(10));</java><html>
    -                                    
    -                                    <h3>Operator precedence</h3>
    -                                    <p>
    -                                        jOOQ does not know any operator precedence (see also <reference id="boolean-operator-precedence" title="boolean operator precedence"/>). All operations are evaluated from left to right, as with any object-oriented API. The two following expressions are the same:
    -                                    </p>
    -
    -</html><java>   val(1).add(2) .mul(val(5).sub(3)) .div(2) .mod(10);
    -(((val(1).add(2)).mul(val(5).sub(3))).div(2)).mod(10);</java><html>
    -
    -									<h3>Datetime arithmetic expressions</h3>
    -									<p>
    -										jOOQ also supports the Oracle-style syntax for adding days to a Field&lt;? extends java.util.Date&gt; 
    -									</p>
    -
    -</html><code-pair>
    -	<sql>SELECT SYSDATE + 3 FROM DUAL;</sql>
    -	<java>create.select(currentTimestamp().add(3));</java>
    -</code-pair><html>
    -
    -									<p>
    -										For more advanced datetime arithmetic, use the DSL's timestampDiff() and dateDiff() functions, as well as jOOQ's built-in SQL standard <code>INTERVAL</code> data type support:
    -									</p>
    -									<ul>
    -										<li><code>INTERVAL YEAR TO MONTH</code>: <reference class="org.jooq.types.YearToMonth"/></li>
    -										<li><code>INTERVAL DAY TO SECOND</code>: <reference class="org.jooq.types.DayToSecond"/></li>
    -									</ul>
    -								</html></content>
    -							</section>
    -							
    -							<section id="string-concatenation">
    -								<title>String concatenation</title>
    -								<content><html>
    -									<p>
    -										The SQL standard defines the concatenation operator to be an infix operator, similar to the ones we've seen in the chapter about <reference id="arithmetic-expressions" title="arithmetic expressions"/>. This operator looks like this: <code>||</code>. Some other dialects do not support this operator, but expect a <code>concat()</code> function, instead. jOOQ renders the right operator / function, depending on your <reference id="sql-dialects" title="SQL dialect"/>:
    -									</p>
    -									
    -</html><code-pair>
    -<sql>SELECT 'A' || 'B' || 'C' FROM DUAL
    --- Or in MySQL:
    -SELECT concat('A', 'B', 'C') FROM DUAL</sql>
    -<java>&#160;
    -// For all RDBMS, including MySQL:
    -create.select(concat("A", "B", "C"));
    -</java>
    -</code-pair>								
    -								</content>
    -							</section>
    -
    -							<section id="general-functions">
    -								<title>General functions</title>
    -								<content><html>
    -									<p>
    -										There are a variety of general functions supported by jOOQ As discussed in the chapter about <reference id="sql-dialects" title="SQL dialects"/> functions are mostly simulated in your database, in case they are not natively supported.
    -									</p>
    -									<p>
    -										This is a list of general functions supported by jOOQ's <reference id="dsl" title="DSL"/>:
    -									</p>
    -									<ul>
    -										<li><strong><code>COALESCE</code></strong>: Get the first non-null value in a list of arguments.</li>
    -										<li><strong><code>NULLIF</code></strong>: Return <code>NULL</code> if both arguments are equal, or the first argument, otherwise.</li>
    -										<li><strong><code>NVL</code></strong>: Get the first non-null value among two arguments.</li>
    -										<li><strong><code>NVL2</code></strong>: Get the second argument if the first is null, or the third argument, otherwise.</li>
    -									</ul>
    -																
    -									<p>
    -										Please refer to the <reference class="org.jooq.impl.DSL" title="DSL Javadoc"/> for more details.
    -									</p>
    -								</html></content>
    -							</section>
    -							
    -							<section id="numeric-functions">
    -								<title>Numeric functions</title>
    -								<content><html>
    -									<p>
    -										Math can be done efficiently in the database before returning results to your Java application. In addition to the <reference id="arithmetic-expressions" title="arithmetic expressions" /> discussed previously, jOOQ also supports a variety of numeric functions. As discussed in the chapter about <reference id="sql-dialects" title="SQL dialects"/> numeric functions (as any function type) are mostly simulated in your database, in case they are not natively supported.
    -									</p>
    -									<p>
    -										This is a list of numeric functions supported by jOOQ's <reference id="dsl" title="DSL"/>:
    -									</p>
    -									
    -									<ul>
    -										<li><strong><code>ABS</code></strong>: Get the absolute value of a value.</li>
    -										<li><strong><code>ACOS</code></strong>: Get the arc cosine of a value.</li>
    -										<li><strong><code>ASIN</code></strong>: Get the arc sine of a value.</li>
    -										<li><strong><code>ATAN</code></strong>: Get the arc tangent of a value.</li>
    -										<li><strong><code>ATAN2</code></strong>: Get the atan2 function of two values.</li>
    -										<li><strong><code>CEIL</code></strong>: Get the smalles integer value larger than a given numeric value.</li>
    -										<li><strong><code>COS</code></strong>: Get the cosine of a value.</li>
    -										<li><strong><code>COSH</code></strong>: Get the hyperbolic cosine of a value.</li>
    -										<li><strong><code>COT</code></strong>: Get the cotangent of a value.</li>
    -										<li><strong><code>COTH</code></strong>: Get the hyperbolic cotangent of a value.</li>
    -										<li><strong><code>DEG</code></strong>: Transform radians into degrees.</li>
    -										<li><strong><code>EXP</code></strong>: Calculate e^value.</li>
    -										<li><strong><code>FLOOR</code></strong>: Get the largest integer value smaller than a given numeric value.</li>
    -										<li><strong><code>GREATEST</code></strong>: Finds the greatest among all argument values (can also be used with non-numeric values).</li>
    -										<li><strong><code>LEAST</code></strong>: Finds the least among all argument values (can also be used with non-numeric values).</li>
    -										<li><strong><code>LN</code></strong>: Get the natural logarithm of a value.</li>
    -										<li><strong><code>LOG</code></strong>: Get the logarithm of a value given a base.</li>
    -										<li><strong><code>POWER</code></strong>: Calculate value^exponent.</li>
    -										<li><strong><code>RAD</code></strong>: Transform degrees into radians.</li>
    -										<li><strong><code>RAND</code></strong>: Get a random number.</li>
    -										<li><strong><code>ROUND</code></strong>: Rounds a value to the nearest integer.</li>
    -										<li><strong><code>SIGN</code></strong>: Get the sign of a value (-1, 0, 1).</li>
    -										<li><strong><code>SIN</code></strong>: Get the sine of a value.</li>
    -										<li><strong><code>SINH</code></strong>: Get the hyperbolic sine of a value.</li>
    -										<li><strong><code>SQRT</code></strong>: Calculate the square root of a value.</li>
    -										<li><strong><code>TAN</code></strong>: Get the tangent of a value.</li>
    -										<li><strong><code>TANH</code></strong>: Get the hyperbolic tangent of a value.</li>
    -										<li><strong><code>TRUNC</code></strong>: Truncate the decimals off a given value.</li>
    -									</ul>
    -									
    -									<p>
    -										Please refer to the <reference class="org.jooq.impl.DSL" title="DSL Javadoc"/> for more details.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="bitwise-functions">
    -								<title>Bitwise functions</title>
    -								<content><html>
    -									<p>
    -										Interestingly, bitwise functions and bitwise arithmetic is not very popular among SQL databases. Most databases only support a few bitwise operations, while others ship with the full set of operators. jOOQ's API includes most bitwise operations as listed below. In order to avoid ambiguities with <reference id="conditional-expressions" title="conditional operators"/>, all bitwise functions are prefixed with "bit"
    -									</p>
    -									<ul>
    -										<li><strong><code>BIT_COUNT</code></strong>: Count the number of bits set to 1 in a number</li>
    -										<li><strong><code>BIT_AND</code></strong>: Set only those bits that are set in two numbers</li>
    -										<li><strong><code>BIT_OR</code></strong>: Set all bits that are set in at least one number</li>
    -										<li><strong><code>BIT_NAND</code></strong>: Set only those bits that are set in two numbers, and inverse the result</li>
    -										<li><strong><code>BIT_NOR</code></strong>: Set all bits that are set in at least one number, and inverse the result</li>
    -										<li><strong><code>BIT_NOT</code></strong>: Inverse the bits in a number</li>
    -										<li><strong><code>BIT_XOR</code></strong>: Set all bits that are set in at exactly one number</li>
    -										<li><strong><code>BIT_XNOR</code></strong>: Set all bits that are set in at exactly one number, and inverse the result</li>
    -										<li><strong><code>SHL</code></strong>: Shift bits to the left</li>
    -										<li><strong><code>SHR</code></strong>: Shift bits to the right</li>
    -									</ul>
    -									
    -									<h3>Some background about bitwise operation simulation</h3>
    -									<p>
    -										As stated before, not all databases support all of these bitwise operations. jOOQ simulates them wherever this is possible. More details can be seen in this blog post: <br/>
    -										<a href="http://blog.jooq.org/2011/10/30/the-comprehensive-sql-bitwise-operations-compatibility-list/">http://blog.jooq.org/2011/10/30/the-comprehensive-sql-bitwise-operations-compatibility-list/</a>
    -									</p>
    -									
    -								</html></content>
    -							</section>
    -
    -							<section id="string-functions">
    -								<title>String functions</title>
    -								<content><html>
    -									<p>
    -										String formatting can be done efficiently in the database before returning results to your Java application. As discussed in the chapter about <reference id="sql-dialects" title="SQL dialects"/> string functions (as any function type) are mostly simulated in your database, in case they are not natively supported.
    -									</p>
    -									<p>
    -										This is a list of numeric functions supported by jOOQ's <reference id="dsl" title="DSL"/>:
    -									</p>
    -									
    -									<ul>
    -										<li><strong><code>ASCII</code></strong>: Get the <code>ASCII</code> code of a character.</li>
    -										<li><strong><code>BIT_LENGTH</code></strong>: Get the length of a string in bits.</li>
    -										<li><strong><code>CHAR_LENGTH</code></strong>: Get the length of a string in characters.</li>
    -										<li><strong><code>CONCAT</code></strong>: Concatenate several strings.</li>
    -										<li><strong><code>ESCAPE</code></strong>: Escape a string for use with the <reference id="like-predicate" title="LIKE predicate"/>.</li>
    -										<li><strong><code>LENGTH</code></strong>: Get the length of a string.</li>
    -										<li><strong><code>LOWER</code></strong>: Get a string in lower case letters.</li>
    -										<li><strong><code>LPAD</code></strong>: Pad a string on the left side.</li>
    -										<li><strong><code>LTRIM</code></strong>: Trim a string on the left side.</li>
    -										<li><strong><code>OCTET_LENGTH</code></strong>: Get the length of a string in octets.</li>
    -										<li><strong><code>POSITION</code></strong>: Find a string within another string.</li>
    -										<li><strong><code>REPEAT</code></strong>: Repeat a string a given number of times.</li>
    -										<li><strong><code>REPLACE</code></strong>: Replace a string within another string.</li>
    -										<li><strong><code>RPAD</code></strong>: Pad a string on the right side.</li>
    -										<li><strong><code>RTRIM</code></strong>: Trim a string on the right side.</li>
    -										<li><strong><code>SUBSTRING</code></strong>: Get a substring of a string.</li>
    -										<li><strong><code>TRIM</code></strong>: Trim a string on both sides.</li>
    -										<li><strong><code>UPPER</code></strong>: Get a string in upper case letters.</li>
    -									</ul>
    -									
    -									<p>
    -										Please refer to the <reference class="org.jooq.impl.DSL" title="DSL Javadoc"/> for more details.
    -									</p>
    -									
    -									<h3>Regular expressions, <code>REGEXP</code>, <code>REGEXP_LIKE</code>, etc.</h3>
    -									<p>
    -										Various databases have some means of searching through columns using regular expressions if the <reference id="like-predicate" title="LIKE predicate"/> does not provide sufficient pattern matching power. While there are many different functions and operators in the various databases, jOOQ settled for the SQL:2008 standard <code>REGEX_LIKE</code> operator. Being an operator (and not a function), you should use the corresponding method on <reference class="org.jooq.Field"/>:
    -									</p>
    -									
    -</html><java><![CDATA[create.selectFrom(BOOK).where(TITLE.likeRegex("^.*SQL.*$"));]]></java><html>
    -
    -									<p>
    -										Note that the SQL standard specifies that patterns should follow the XQuery standards. In the real world, the POSIX regular expression standard is the most used one, some use Java regular expressions, and only a few ones use Perl regular expressions. jOOQ does not make any assumptions about regular expression syntax. For cross-database compatibility, please read the relevant database manuals carefully, to learn about the appropriate syntax. Please refer to the <reference class="org.jooq.impl.DSL" title="DSL Javadoc"/> for more details.
    -									</p>
    -								</html></content>
    -								<!-- don't forget regex here! -->
    -							</section>
    -
    -							<section id="date-and-time-functions">
    -								<title>Date and time functions</title>
    -								<content><html>
    -									<p>
    -										This is a list of date and time functions supported by jOOQ's <reference id="dsl" title="DSL"/>:
    -									</p>
    -									
    -									<ul>
    -										<li><strong><code>CURRENT_DATE</code></strong>: Get current date as a <code>DATE</code> object.</li>
    -										<li><strong><code>CURRENT_TIME</code></strong>: Get current time as a <code>TIME</code> object.</li>
    -										<li><strong><code>CURRENT_TIMESTAMP</code></strong>: Get current date as a <code>TIMESTAMP</code> object.</li>
    -										<li><strong><code>DATE_ADD</code></strong>: Add a number of days or an interval to a date.</li>
    -										<li><strong><code>DATE_DIFF</code></strong>: Get the difference in days between two dates.</li>
    -										<li><strong><code>TIMESTAMP_ADD</code></strong>: Add a number of days or an interval to a timestamp.</li>
    -										<li><strong><code>TIMESTAMP_DIFF</code></strong>: Get the difference as an <code>INTERVAL DAY TO SECOND</code> between two dates.</li>
    -									</ul>
    -									
    -									<h3>Intervals in jOOQ</h3>
    -									<p>
    -										jOOQ fills a gap opened by JDBC, which neglects an important SQL data type as defined by the SQL standards: <code>INTERVAL</code> types. See the manual's section about <reference id="data-types-intervals" title="INTERVAL data types"/> for more details.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="system-functions">
    -								<title>System functions</title>
    -								<content><html>
    -									<p>
    -										This is a list of system functions supported by jOOQ's <reference id="dsl" title="DSL"/>:
    -									</p>
    -									<ul>
    -										<li><strong><code>CURRENT_USER</code></strong>: Get current user.</li>
    -									</ul>
    -								</html></content>
    -							</section>
    -
    -							<section id="aggregate-functions">
    -								<title>Aggregate functions</title>
    -								<content><html>
    -									<p>
    -										Aggregate functions work just like functions, even if they have a slightly different semantics. Here are some example aggregate functions from the <reference id="dsl" title="DSL"/>:
    -									</p>
    -
    -</html><java><![CDATA[// Every-day, SQL standard aggregate functions
    -AggregateFunction<Integer>    count();
    -AggregateFunction<Integer>    count(Field<?> field);
    -AggregateFunction<T>          max  (Field<T> field);
    -AggregateFunction<T>          min  (Field<T> field);
    -AggregateFunction<BigDecimal> sum  (Field<? extends Number> field);
    -AggregateFunction<BigDecimal> avg  (Field<? extends Number> field);
    -
    -// DISTINCT keyword in aggregate functions
    -AggregateFunction<Integer>    countDistinct(Field<?> field);
    -AggregateFunction<T>          maxDistinct  (Field<T> field);
    -AggregateFunction<T>          minDistinct  (Field<T> field);
    -AggregateFunction<BigDecimal> sumDistinct  (Field<? extends Number> field);
    -AggregateFunction<BigDecimal> avgDistinct  (Field<? extends Number> field);
    -
    -// String aggregate functions
    -AggregateFunction<String> groupConcat        (Field<?> field);
    -AggregateFunction<String> groupConcatDistinct(Field<?> field);
    -OrderedAggregateFunction<String> listAgg(Field<?> field);
    -OrderedAggregateFunction<String> listAgg(Field<?> field, String separator);
    -
    -// Statistical functions
    -AggregateFunction<BigDecimal> median    (Field<? extends Number> field);
    -AggregateFunction<BigDecimal> stddevPop (Field<? extends Number> field);
    -AggregateFunction<BigDecimal> stddevSamp(Field<? extends Number> field);
    -AggregateFunction<BigDecimal> varPop    (Field<? extends Number> field);
    -AggregateFunction<BigDecimal> varSamp   (Field<? extends Number> field);
    -
    -// Linear regression functions
    -AggregateFunction<BigDecimal> regrAvgX     (Field<? extends Number> y, Field<? extends Number> x);
    -AggregateFunction<BigDecimal> regrAvgY     (Field<? extends Number> y, Field<? extends Number> x);
    -AggregateFunction<BigDecimal> regrCount    (Field<? extends Number> y, Field<? extends Number> x);
    -AggregateFunction<BigDecimal> regrIntercept(Field<? extends Number> y, Field<? extends Number> x);
    -AggregateFunction<BigDecimal> regrR2       (Field<? extends Number> y, Field<? extends Number> x);
    -AggregateFunction<BigDecimal> regrSlope    (Field<? extends Number> y, Field<? extends Number> x);
    -AggregateFunction<BigDecimal> regrSXX      (Field<? extends Number> y, Field<? extends Number> x);
    -AggregateFunction<BigDecimal> regrSXY      (Field<? extends Number> y, Field<? extends Number> x);
    -AggregateFunction<BigDecimal> regrSYY      (Field<? extends Number> y, Field<? extends Number> x);]]></java><html>
    -
    -									<p>
    -										Here's an example, counting the number of books any author has written:
    -									</p>
    -
    -</html><code-pair>
    -<sql>SELECT AUTHOR_ID, COUNT(*)
    -FROM BOOK
    -GROUP BY AUTHOR_ID</sql>
    -<java>create.select(BOOK.AUTHOR_ID, count())
    -      .from(BOOK)
    -      .groupBy(BOOK.AUTHOR_ID);</java>
    -</code-pair><html>
    -
    -									<p>
    -										Aggregate functions have strong limitations about when they may be used and when not. For instance, you can use aggregate functions in scalar queries. Typically, this means you only select aggregate functions, no <reference id="table-columns" title="regular columns"/> or other <reference id="column-expressions" title="column expressions"/>. Another use case is to use them along with a <reference id="group-by-clause" title="GROUP BY clause"/> as seen in the previous example. Note, that jOOQ does not check whether your using of aggregate functions is correct according to the SQL standards, or according to your database's behaviour.
    -									</p>
    -
    -		                            <h3>Ordered aggregate functions</h3>
    -		                            <p>
    -		                            	Oracle and some other databases support "ordered aggregate functions". This means you can provide an <code>ORDER BY</code> clause to an aggregate function, which will be taken into consideration when aggregating. The best example for this is Oracle's <code>LISTAGG()</code> (also known as <code>GROUP_CONCAT</code> in other <reference id="sql-dialects" title="SQL dialects"/>). The following query groups by authors and concatenates their books' titles
    -		                           	</p>
    -</html><code-pair>
    -<sql>SELECT   LISTAGG(TITLE, ', ')
    -         WITHIN GROUP (ORDER BY TITLE)
    -FROM     BOOK
    -GROUP BY AUTHOR_ID</sql>
    -<java>create.select(listAgg(BOOK.TITLE, ", ")
    -      .withinGroupOrderBy(BOOK.TITLE))
    -      .from(BOOK)
    -      .groupBy(BOOK.AUTHOR_ID)</java>
    -</code-pair><html>
    -
    -									<p>
    -										The above query might yield:
    -									</p>
    -
    -</html><text>+---------------------+
    -| LISTAGG             |
    -+---------------------+
    -| 1984, Animal Farm   |
    -| O Alquimista, Brida |
    -+---------------------+</text><html>
    -
    -									<h3>FIRST and LAST: Oracle's "ranked" aggregate functions</h3>
    -									<p>
    -										Oracle allows for restricting aggregate functions using the <code>KEEP()</code> clause, which is supported by jOOQ. In Oracle, some aggregate functions (<code>MIN</code>, <code>MAX</code>, <code>SUM</code>, <code>AVG</code>, <code>COUNT</code>, <code>VARIANCE</code>, or <code>STDDEV</code>) can be restricted by this clause, hence <reference class="org.jooq.AggregateFunction"/> also allows for specifying it. Here are a couple of examples using this clause:
    -									</p>
    -
    -</html><code-pair>
    -<sql>SUM(BOOK.AMOUNT_SOLD)
    -  KEEP(DENSE_RANK FIRST ORDER BY BOOK.AUTHOR_ID)</sql>
    -<java>sum(BOOK.AMOUNT_SOLD)
    -  .keepDenseRankFirstOrderBy(BOOK.AUTHOR_ID)</java>
    -</code-pair><html>
    -
    -									<h3>User-defined aggregate functions</h3>
    -									<p>
    -										jOOQ also supports using your own user-defined aggregate functions. See the manual's section about <reference id="user-defined-aggregate-functions" title="user-defined aggregate functions"/> for more details.
    -									</p>
    -
    -									<h3>Window functions / analytical functions</h3>
    -									<p>
    -										In those databases that support <reference id="window-functions" title="window functions"/>, jOOQ's <reference class="org.jooq.AggregateFunction"/> can be transformed into a window function / analytical function by calling <code>over()</code> on it. See the manual's section about <reference id="window-functions" title="window functions"/> for more details.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="window-functions">
    -								<title>Window functions</title>
    -								<content><html>
    -									<p>
    -										Most major RDBMS support the concept of window functions. jOOQ knows of implementations in DB2, Oracle, Postgres, SQL Server, and Sybase SQL Anywhere, and supports most of their specific syntaxes. Note, that H2 and HSQLDB have implemented <code>ROW_NUMBER()</code> functions, without true windowing support.
    -									</p>
    -									<p>
    -										As previously discussed, any <reference class="org.jooq.AggregateFunction"/> can be transformed into a window function using the <code>over()</code> method. See the chapter about <reference id="aggregate-functions" title="aggregate functions"/> for details. In addition to those, there are also some more window functions supported by jOOQ, as declared in the <reference id="dsl" title="DSL"/>:
    -									</p>
    -
    -</html><java><![CDATA[// Ranking functions
    -    WindowOverStep<Integer>    rowNumber();
    -    WindowOverStep<Integer>    rank();
    -    WindowOverStep<Integer>    denseRank();
    -    WindowOverStep<BigDecimal> percentRank();
    -    
    -// Windowing functions
    -<T> WindowIgnoreNullsStep<T>   firstValue(Field<T> field);
    -<T> WindowIgnoreNullsStep<T>   lastValue(Field<T> field)
    -<T> WindowIgnoreNullsStep<T>   lead(Field<T> field);
    -<T> WindowIgnoreNullsStep<T>   lead(Field<T> field, int offset);
    -<T> WindowIgnoreNullsStep<T>   lead(Field<T> field, int offset, T defaultValue);
    -<T> WindowIgnoreNullsStep<T>   lead(Field<T> field, int offset, Field<T> defaultValue);
    -<T> WindowIgnoreNullsStep<T>   lag(Field<T> field);
    -<T> WindowIgnoreNullsStep<T>   lag(Field<T> field, int offset);
    -<T> WindowIgnoreNullsStep<T>   lag(Field<T> field, int offset, T defaultValue);
    -<T> WindowIgnoreNullsStep<T>   lag(Field<T> field, int offset, Field<T> defaultValue);
    -
    -// Statistical functions
    -    WindowOverStep<BigDecimal> cumeDist();
    -    WindowOverStep<Integer>    ntile(int number);]]></java><html>	
    -    								
    -    								<p>
    -    									SQL distinguishes between various window function types (e.g. "ranking functions"). Depending on the function, SQL expects mandatory <code>PARTITION BY</code> or <code>ORDER BY</code> clauses within the <code>OVER()</code> clause. jOOQ does not enforce those rules for two reasons:
    -    								</p>
    -    								<ul>
    -    									<li>Your JDBC driver or database already checks SQL syntax semantics</li>
    -    									<li>Not all databases behave correctly according to the SQL standard</li>
    -    								</ul>
    -    								<p>
    -    									If possible, however, jOOQ tries to render missing clauses for you, if a given <reference id="sql-dialects" title="SQL dialect"/> is more restrictive.
    -    								</p>
    -    								<h3>Some examples</h3>
    -									<p>
    -										 Here are some simple examples of window functions with jOOQ:
    -									</p>
    -									
    -</html><code-pair>
    -<sql>-- Sample uses of ROW_NUMBER()
    -ROW_NUMBER() OVER()
    -ROW_NUMBER() OVER(PARTITION BY 1)
    -ROW_NUMBER() OVER(ORDER BY BOOK.ID)
    -ROW_NUMBER() OVER(PARTITION BY BOOK.AUTHOR_ID ORDER BY BOOK.ID)
    -                  
    --- Sample uses of FIRST_VALUE
    -FIRST_VALUE(BOOK.ID) OVER()
    -FIRST_VALUE(BOOK.ID IGNORE NULLS) OVER()
    -FIRST_VALUE(BOOK.ID RESPECT NULLS) OVER()
    -</sql>
    -<java>// Sample uses of rowNumber()
    -rowNumber().over()
    -rowNumber().over().partitionByOne()
    -rowNumber().over().partitionBy(BOOK.AUTHOR_ID)
    -rowNumber().over().partitionBy(BOOK.AUTHOR_ID).orderBy(BOOK.ID)
    -                  
    -// Sample uses of firstValue()
    -firstValue(BOOK.ID).over()
    -firstValue(BOOK.ID).ignoreNulls().over()
    -firstValue(BOOK.ID).respectNulls().over()
    -</java>
    -</code-pair><html>
    -    								
    -									<h3>An advanced window function example</h3>
    -									<p>
    -										Window functions can be used for things like calculating a "running total". The following example fetches transactions and the running total for every transaction going back to the beginning of the transaction table (ordered by booked_at). Window functions are accessible from the previously seen <reference class="org.jooq.AggregateFunction"/> type using the <code>over()</code> method:
    -									</p>
    -
    -</html><code-pair>
    -<sql>SELECT booked_at, amount,
    -   SUM(amount) OVER (PARTITION BY 1
    -                     ORDER BY booked_at
    -                     ROWS BETWEEN UNBOUNDED PRECEDING
    -                     AND CURRENT ROW) AS total
    -  FROM transactions</sql>
    -<java>create.select(t.BOOKED_AT, t.AMOUNT,
    -         sum(t.AMOUNT).over().partitionByOne()
    -                      .orderBy(t.BOOKED_AT)
    -                      .rowsBetweenUnboundedPreceding()
    -                      .andCurrentRow().as("total")
    -      .from(TRANSACTIONS.as("t"));</java>
    -</code-pair><html>
    -
    -
    -									<h3>Window functions created from ordered aggregate functions</h3>
    -									<p>
    -										In the previous chapter about <reference id="aggregate-functions" title="aggregate functions"/>, we have seen the concept of "ordered aggregate functions", such as Oracle's <code>LISTAGG()</code>. These functions have a window function / analytical function variant, as well. For example:
    -									</p>
    -									
    -</html><code-pair>
    -<sql>SELECT   LISTAGG(TITLE, ', ')
    -         WITHIN GROUP (ORDER BY TITLE)
    -         OVER (PARTITION BY BOOK.AUTHOR_ID)
    -FROM     BOOK</sql>
    -<java>create.select(listAgg(BOOK.TITLE, ", ")
    -      .withinGroupOrderBy(BOOK.TITLE)
    -      .over().partitionBy(BOOK.AUTHOR_ID))
    -      .from(BOOK)</java>
    -</code-pair><html>
    -
    -									<h3>Window functions created from Oracle's <code>FIRST</code> and <code>LAST</code> aggregate functions</h3>
    -									<p>
    -										In the previous chapter about <reference id="aggregate-functions" title="aggregate functions"/>, we have seen the concept of "<code>FIRST</code> and <code>LAST</code> aggregate functions". These functions have a window function / analytical function variant, as well. For example:
    -									</p>
    -
    -</html><code-pair>
    -<sql>SUM(BOOK.AMOUNT_SOLD)
    -  KEEP(DENSE_RANK FIRST ORDER BY BOOK.AUTHOR_ID)
    -  OVER(PARTITION BY 1)</sql>
    -<java>sum(BOOK.AMOUNT_SOLD)
    -  .keepDenseRankFirstOrderBy(BOOK.AUTHOR_ID)
    -  .over().partitionByOne()</java>
    -</code-pair><html>
    -
    -
    -									<h3>Window functions created from user-defined aggregate functions</h3>
    -									<p>
    -										User-defined aggregate functions also implement <reference class="org.jooq.AggregateFunction"/>, hence they can also be transformed into window functions using <code>over()</code>. This is supported by Oracle in particular. See the manual's section about <reference id="user-defined-aggregate-functions" title="user-defined aggregate functions"/> for more details.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="grouping-functions">
    -								<title>Grouping functions</title>
    -								<content><html>
    -									<h3>ROLLUP() explained in SQL</h3>
    -									<p>
    -										The SQL standard defines special functions that can be used in the <reference id="group-by-clause" title="GROUP BY clause"/>: the grouping functions. These functions can be used to generate several groupings in a single clause. This can best be explained in SQL. Let's take <code>ROLLUP()</code> for instance:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[-- ROLLUP() with one argument 
    -SELECT AUTHOR_ID, COUNT(*)
    -FROM BOOK
    -GROUP BY ROLLUP(AUTHOR_ID)
    -
    -
    --- ROLLUP() with two arguments
    -SELECT AUTHOR_ID, PUBLISHED_IN, COUNT(*)
    -FROM BOOK
    -GROUP BY ROLLUP(AUTHOR_ID, PUBLISHED_IN)
    -
    -
    -
    -
    -
    -
    -
    -]]></sql>
    -<sql><![CDATA[-- The same query using UNION ALL:
    -  SELECT AUTHOR_ID, COUNT(*) FROM BOOK GROUP BY (AUTHOR_ID)
    -UNION ALL
    -  SELECT NULL, COUNT(*) FROM BOOK GROUP BY ()
    -ORDER BY 1 NULLS LAST
    -
    --- The same query using UNION ALL:
    -  SELECT AUTHOR_ID, PUBLISHED_IN, COUNT(*) 
    -  FROM BOOK GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -UNION ALL
    -  SELECT AUTHOR_ID, NULL, COUNT(*) 
    -  FROM BOOK GROUP BY (AUTHOR_ID)
    -UNION ALL
    -  SELECT NULL, NULL, COUNT(*) 
    -  FROM BOOK GROUP BY ()
    -ORDER BY 1 NULLS LAST, 2 NULLS LAST
    -]]></sql>
    -</code-pair><html>
    -
    -									<p>
    -										In English, the <code>ROLLUP()</code> grouping function provides <code>N+1</code> groupings, when <code>N</code> is the number of arguments to the <code>ROLLUP()</code> function. Each grouping has an additional group field from the <code>ROLLUP()</code> argument field list. The results of the second query might look something like this:
    -									</p>
    -									
    -</html><text><![CDATA[+-----------+--------------+----------+
    -| AUTHOR_ID | PUBLISHED_IN | COUNT(*) |
    -+-----------+--------------+----------+
    -|         1 |         1945 |        1 | <- GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -|         1 |         1948 |        1 | <- GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -|         1 |         NULL |        2 | <- GROUP BY (AUTHOR_ID)
    -|         2 |         1988 |        1 | <- GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -|         2 |         1990 |        1 | <- GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -|         2 |         NULL |        2 | <- GROUP BY (AUTHOR_ID)
    -|      NULL |         NULL |        4 | <- GROUP BY ()
    -+-----------+--------------+----------+]]></text><html>
    -
    -									<h3>CUBE() explained in SQL</h3>
    -									<p>
    -										<code>CUBE()</code> is different from <code>ROLLUP()</code> in the way that it doesn't just create <code>N+1</code> groupings, it creates all <code>2^N</code> possible combinations between all group fields in the <code>CUBE()</code> function argument list. Let's re-consider our second query from before:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[-- CUBE() with two arguments
    -SELECT AUTHOR_ID, PUBLISHED_IN, COUNT(*)
    -FROM BOOK
    -GROUP BY CUBE(AUTHOR_ID, PUBLISHED_IN)
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -]]></sql>
    -<sql><![CDATA[-- The same query using UNION ALL:
    -  SELECT AUTHOR_ID, PUBLISHED_IN, COUNT(*) 
    -  FROM BOOK GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -UNION ALL
    -  SELECT AUTHOR_ID, NULL, COUNT(*) 
    -  FROM BOOK GROUP BY (AUTHOR_ID)
    -UNION ALL
    -  SELECT NULL, PUBLISHED_IN, COUNT(*) 
    -  FROM BOOK GROUP BY (PUBLISHED_IN)
    -UNION ALL
    -  SELECT NULL, NULL, COUNT(*) 
    -  FROM BOOK GROUP BY ()
    -ORDER BY 1 NULLS FIRST, 2 NULLS FIRST
    -]]></sql>
    -</code-pair><html>
    -
    -									<p>
    -										The results would then hold:
    -									</p>
    -
    -</html><text><![CDATA[+-----------+--------------+----------+
    -| AUTHOR_ID | PUBLISHED_IN | COUNT(*) |
    -+-----------+--------------+----------+
    -|      NULL |         NULL |        2 | <- GROUP BY ()
    -|      NULL |         1945 |        1 | <- GROUP BY (PUBLISHED_IN)
    -|      NULL |         1948 |        1 | <- GROUP BY (PUBLISHED_IN)
    -|      NULL |         1988 |        1 | <- GROUP BY (PUBLISHED_IN)
    -|      NULL |         1990 |        1 | <- GROUP BY (PUBLISHED_IN)
    -|         1 |         NULL |        2 | <- GROUP BY (AUTHOR_ID)
    -|         1 |         1945 |        1 | <- GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -|         1 |         1948 |        1 | <- GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -|         2 |         NULL |        2 | <- GROUP BY (AUTHOR_ID)
    -|         2 |         1988 |        1 | <- GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -|         2 |         1990 |        1 | <- GROUP BY (AUTHOR_ID, PUBLISHED_IN)
    -+-----------+--------------+----------+]]></text><html>
    -
    -									<h3>GROUPING SETS()</h3>
    -									<p>
    -										<code>GROUPING SETS()</code> are the generalised way to create multiple groupings. From our previous examples 
    -									</p>
    -									<ul>
    -										<li><code>ROLLUP(AUTHOR_ID, PUBLISHED_IN)</code> corresponds to <code>GROUPING SETS((AUTHOR_ID, PUBLISHED_IN), (AUTHOR_ID), ())</code></li>
    -										<li><code>CUBE(AUTHOR_ID, PUBLISHED_IN)</code> corresponds to <code>GROUPING SETS((AUTHOR_ID, PUBLISHED_IN), (AUTHOR_ID), (PUBLISHED_IN), ())</code></li>
    -									</ul>
    -									<p>
    -										This is nicely explained in the SQL Server manual pages about <code>GROUPING SETS()</code> and other grouping functions:<br/>
    -										<a href="http://msdn.microsoft.com/en-us/library/bb510427(v=sql.105)">http://msdn.microsoft.com/en-us/library/bb510427(v=sql.105)</a>
    -									</p>
    -									
    -									<h3>jOOQ's support for ROLLUP(), CUBE(), GROUPING SETS()</h3>
    -									<p>
    -										jOOQ fully supports all of these functions, as well as the utility functions <code>GROUPING()</code> and <code>GROUPING_ID()</code>, used for identifying the grouping set ID of a record. The <reference id="dsl" title="DSL API"/> thus includes:
    -									</p>
    -									
    -</html><java><![CDATA[// The various grouping function constructors
    -GroupField rollup(Field<?>... fields);
    -GroupField cube(Field<?>... fields);
    -GroupField groupingSets(Field<?>... fields);
    -GroupField groupingSets(Field<?>[]... fields);
    -GroupField groupingSets(Collection<? extends Field<?>>... fields);
    -
    -// The utility functions generating IDs per GROUPING SET
    -Field<Integer> grouping(Field<?>);
    -Field<Integer> groupingId(Field<?>...);]]></java><html>
    -
    -									<h3>MySQL's and CUBRID's WITH ROLLUP syntax</h3>
    -									<p>
    -										MySQL and CUBRID don't know any grouping functions, but they support a <code>WITH ROLLUP</code> clause, that is equivalent to simple <code>ROLLUP()</code> grouping functions. jOOQ simulates <code>ROLLUP()</code> in MySQL and CUBRID, by rendering this <code>WITH ROLLUP</code> clause. The following two statements mean the same:
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[-- Statement 1: SQL standard
    -GROUP BY ROLLUP(A, B, C)
    -
    --- Statement 2: SQL standard
    -GROUP BY A, ROLLUP(B, C)]]></sql>
    -<sql><![CDATA[-- Statement 1: MySQL
    -GROUP BY A, B, C WITH ROLLUP
    -
    --- Statement 2: MySQL
    --- This is not supported in MySQL]]></sql>
    -</code-pair>
    -								</content>
    -							</section>
    -
    -							<section id="user-defined-functions">
    -								<title>User-defined functions</title>
    -								<content><html>
    -									<p>
    -										Some databases support user-defined functions, which can be embedded in any SQL statement, if you're using jOOQ's <reference id="code-generation" title="code generator"/>. Let's say you have the following simple function in Oracle SQL:
    -									</p>
    -									
    -</html><sql><![CDATA[CREATE OR REPLACE FUNCTION echo (INPUT NUMBER)
    -RETURN NUMBER
    -IS
    -BEGIN
    -    RETURN INPUT;
    -END echo;
    -]]></sql><html>
    -
    -                                    <p>
    -                                    	The above function will be made available from a generated <reference id="codegen-procedures" title="Routines"/> class. You can use it like any other <reference id="column-expressions" title="column expression"/>:
    -                                    </p>
    -                                    
    -</html><code-pair>
    -<sql><![CDATA[SELECT echo(1) FROM DUAL WHERE echo(2) = 2]]></sql>
    -<java><![CDATA[create.select(echo(1)).where(echo(2).equal(2));]]></java>
    -</code-pair><html>
    -                                
    -                                	<p>
    -                                		Note that user-defined functions returning <reference id="data-types-cursors" title="CURSOR"/> or <reference id="data-types-arrays" title="ARRAY"/> data types can also be used wherever <reference id="table-expressions" title="table expressions"/> can be used, if they are <reference id="array-and-cursor-unnesting" title="unnested"/>
    -                                	</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="user-defined-aggregate-functions">
    -								<title>User-defined aggregate functions</title>
    -								<content><html>
    -									<p>
    -										Some databases support user-defined aggregate functions, which can then be used along with <reference id="group-by-clause" title="GROUP BY clauses"/> or as <reference id="window-functions" title="window functions"/>. An example for such a database is Oracle. With Oracle, you can define the following <code>OBJECT</code> type (the example was taken from the <a href="http://docs.oracle.com/cd/B28359_01/appdev.111/b28425/ext_agg_ref.htm">Oracle 11g documentation</a>): 
    -									</p>
    -									
    -</html><sql><![CDATA[CREATE TYPE U_SECOND_MAX AS OBJECT
    -(
    -  MAX NUMBER, -- highest value seen so far
    -  SECMAX NUMBER, -- second highest value seen so far
    -  STATIC FUNCTION ODCIAggregateInitialize(sctx IN OUT U_SECOND_MAX) RETURN NUMBER,
    -  MEMBER FUNCTION ODCIAggregateIterate(self IN OUT U_SECOND_MAX, value IN NUMBER) RETURN NUMBER,
    -  MEMBER FUNCTION ODCIAggregateTerminate(self IN U_SECOND_MAX, returnValue OUT NUMBER, flags IN NUMBER) RETURN NUMBER,
    -  MEMBER FUNCTION ODCIAggregateMerge(self IN OUT U_SECOND_MAX, ctx2 IN U_SECOND_MAX) RETURN NUMBER
    -);
    -
    -CREATE OR REPLACE TYPE BODY U_SECOND_MAX IS
    -STATIC FUNCTION ODCIAggregateInitialize(sctx IN OUT U_SECOND_MAX)
    -RETURN NUMBER IS
    -BEGIN
    -  SCTX := U_SECOND_MAX(0, 0);
    -  RETURN ODCIConst.Success;
    -END;
    -
    -MEMBER FUNCTION ODCIAggregateIterate(self IN OUT U_SECOND_MAX, value IN NUMBER) RETURN NUMBER IS
    -BEGIN
    -  IF VALUE > SELF.MAX THEN
    -    SELF.SECMAX := SELF.MAX;
    -    SELF.MAX := VALUE;
    -  ELSIF VALUE > SELF.SECMAX THEN
    -    SELF.SECMAX := VALUE;
    -  END IF;
    -  RETURN ODCIConst.Success;
    -END;
    -
    -MEMBER FUNCTION ODCIAggregateTerminate(self IN U_SECOND_MAX, returnValue OUT NUMBER, flags IN NUMBER) RETURN NUMBER IS
    -BEGIN
    -  RETURNVALUE := SELF.SECMAX;
    -  RETURN ODCIConst.Success;
    -END;
    -
    -MEMBER FUNCTION ODCIAggregateMerge(self IN OUT U_SECOND_MAX, ctx2 IN U_SECOND_MAX) RETURN NUMBER IS
    -BEGIN
    -  IF CTX2.MAX > SELF.MAX THEN
    -    IF CTX2.SECMAX > SELF.SECMAX THEN
    -      SELF.SECMAX := CTX2.SECMAX;
    -    ELSE
    -      SELF.SECMAX := SELF.MAX;
    -    END IF;
    -    SELF.MAX := CTX2.MAX;
    -  ELSIF CTX2.MAX > SELF.SECMAX THEN
    -    SELF.SECMAX := CTX2.MAX;
    -  END IF;
    -  RETURN ODCIConst.Success;
    -END;
    -END;]]></sql><html>
    -
    -									<p>
    -										The above <code>OBJECT</code> type is then available to function declarations as such:
    -									</p>
    -
    -</html><sql><![CDATA[
    -CREATE FUNCTION SECOND_MAX (input NUMBER) RETURN NUMBER
    -PARALLEL_ENABLE AGGREGATE USING U_SECOND_MAX;]]></sql><html>
    -
    -									<h3>Using the generated aggregate function</h3>
    -									<p>
    -										jOOQ's <reference id="code-generation" title="code generator"/> will detect such aggregate functions and generate them differently from regular <reference id="user-defined-functions" title="user-defined functions"/>. They implement the <reference class="org.jooq.AggregateFunction"/> type, as mentioned in the manual's section about <reference id="aggregate-functions" title="aggregate functions"/>. Here's how you can use the <code>SECOND_MAX()</code> aggregate function with jOOQ:
    -									</p>
    -				
    -</html><code-pair>					
    -<sql><![CDATA[-- Get the second-latest publishing date by author
    -SELECT SECOND_MAX(PUBLISHED_IN) 
    -FROM BOOK
    -GROUP BY AUTHOR_ID]]></sql>
    -<java><![CDATA[// Routines.secondMax() can be static-imported
    -create.select(secondMax(BOOK.PUBLISHED_IN))
    -      .from(BOOK)
    -      .groupBy(BOOK.AUTHOR_ID)]]></java>
    -</code-pair>
    -								</content>
    -							</section>
    -
    -							<section id="case-expressions">
    -								<title>The CASE expression</title>
    -								<content><html>
    -									<p>
    -										The <code>CASE</code> expression is part of the standard SQL syntax. While some RDBMS also offer an <code>IF</code> expression, or a <code>DECODE</code> function, you can always rely on the two types of <code>CASE</code> syntax:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[CASE WHEN AUTHOR.FIRST_NAME = 'Paulo'  THEN 'brazilian'
    -     WHEN AUTHOR.FIRST_NAME = 'George' THEN 'english'
    -                                       ELSE 'unknown'
    -END
    -
    --- OR:
    -
    -CASE AUTHOR.FIRST_NAME WHEN 'Paulo'  THEN 'brazilian'
    -                       WHEN 'George' THEN 'english'
    -                                     ELSE 'unknown'
    -END]]></sql>
    -<java><![CDATA[create.decode()
    -      .when(AUTHOR.FIRST_NAME.equal("Paulo"), "brazilian")
    -      .when(AUTHOR.FIRST_NAME.equal("George"), "english")
    -      .otherwise("unknown");
    -
    -// OR:
    -
    -create.decode().value(AUTHOR.FIRST_NAME)
    -               .when("Paulo", "brazilian")
    -               .when("George", "english")
    -               .otherwise("unknown");]]></java>
    -</code-pair><html>
    -
    -								<p>
    -									In jOOQ, both syntaxes are supported (The second one is simulated in Derby, which only knows the first one). Unfortunately, both case and else are reserved words in Java. jOOQ chose to use decode() from the Oracle <code>DECODE</code> function, and otherwise(), which means the same as else.
    -								</p>
    -
    -								<p>
    -									A <code>CASE</code> expression can be used anywhere where you can place a <reference id="column-expressions" title="column expression (or Field)"/>. For instance, you can <code>SELECT</code> the above expression, if you're selecting from <code>AUTHOR</code>:
    -							 	</p>
    -
    -</html><sql>SELECT AUTHOR.FIRST_NAME, [... CASE EXPR ...] AS nationality
    -  FROM AUTHOR</sql><html>
    -
    -								<h3>The Oracle DECODE() function</h3>
    -								<p>
    -									Oracle knows a more succinct, but maybe less readable <code>DECODE()</code> function with a variable number of arguments. This function roughly does the same as the second case expression syntax. jOOQ supports the <code>DECODE()</code> function and simulates it using <code>CASE</code> expressions in all dialects other than Oracle:
    -								</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[-- Oracle:
    -DECODE(FIRST_NAME, 'Paulo', 'brazilian',
    -                   'George', 'english',
    -                   'unknown');
    -
    --- Other SQL dialects
    -CASE AUTHOR.FIRST_NAME WHEN 'Paulo'  THEN 'brazilian'
    -                       WHEN 'George' THEN 'english'
    -                                     ELSE 'unknown'
    -END]]></sql>
    -<java><![CDATA[
    -
    -
    -
    -
    -// Use the Oracle-style DECODE() function with jOOQ.
    -// Note, that you will not be able to rely on type-safety
    -create.decode(AUTHOR.FIRST_NAME,
    -    "Paulo", "brazilian",
    -    "George", "english",
    -    "unknown");]]></java>
    -</code-pair><html>
    -
    -		  							<h3>CASE clauses in an ORDER BY clause</h3>
    -									<p>
    -										Sort indirection is often implemented with a <code>CASE</code> clause of a <code>SELECT</code>'s <code>ORDER BY</code> clause. See the manual's section about the <reference id="order-by-clause" title="ORDER BY clause"/> for more details.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="sequences-and-serials">
    -								<title>Sequences and serials</title>
    -								<content><html>
    -									<p>
    -										Sequences implement the <reference class="org.jooq.Sequence"/> interface, providing essentially this functionality:
    -									</p>
    -
    -</html><java><![CDATA[// Get a field for the CURRVAL sequence property
    -Field<T> currval();
    -
    -// Get a field for the NEXTVAL sequence property
    -Field<T> nextval();]]></java><html>
    -
    -									<p>
    -										So if you have a sequence like this in Oracle:
    -									</p>
    -
    -</html><sql>CREATE SEQUENCE s_author_id</sql><html>
    -
    -									<p>
    -										You can then use your <reference id="codegen-sequences" title="generated sequence"/> object directly in a SQL statement as such:
    -									</p>
    -
    -</html><java><![CDATA[// Reference the sequence in a SELECT statement:
    -BigInteger nextID = create.select(s).fetchOne(S_AUTHOR_ID.nextval());
    -
    -// Reference the sequence in an INSERT statement:
    -create.insertInto(AUTHOR, AUTHOR.ID, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -      .values(S_AUTHOR_ID.nextval(), val("William"), val("Shakespeare"));
    -]]></java><html>
    -
    -									<ul>
    -										<li>For more information about generated sequences, refer to the manual's section about <reference id="codegen-sequences" title="generated sequences"/></li>
    -										<li>For more information about executing standalone calls to sequences, refer to the manual's section about <reference id="sequence-execution" title="sequence execution"/></li>
    -									</ul>
    -								</html></content>
    -							</section>
    -							
    -							<section id="row-value-expressions">
    -								<title>Tuples or row value expressions</title>
    -								<content><html>
    -									<p>
    -										According to the SQL standard, row value expressions can have a degree of more than one. This is commonly used in the <reference id="insert-statement" title="INSERT statement"/>, where the <code>VALUES</code> row value constructor allows for providing a row value expression as a source for <code>INSERT</code> data. Row value expressions can appear in various other places, though. They are supported by jOOQ as records / rows. jOOQ's <reference id="dsl" title="DSL"/> allows for the construction of type-safe records up to the degree of {max-row-degree}. Higher-degree Rows are supported as well, but without any type-safety. Row types are modelled as follows:
    -									</p>
    -									
    -</html><java><![CDATA[// The DSL provides overloaded row value expression constructor methods:
    -public static <T1>             Row1<T1>             row(T1 t1)                      { ... }
    -public static <T1, T2>         Row2<T1, T2>         row(T1 t1, T2 t2)               { ... }
    -public static <T1, T2, T3>     Row3<T1, T2, T3>     row(T1 t1, T2 t2, T3 t3)        { ... }
    -public static <T1, T2, T3, T4> Row4<T1, T2, T3, T4> row(T1 t1, T2 t2, T3 t3, T4 t4) { ... }
    -
    -// [ ... idem for Row5, Row6, Row7, ..., Row{max-row-degree} ]
    -
    -// Degrees of more than {max-row-degree} are supported without type-safety
    -public static RowN row(Object... values) { ... }]]></java><html>
    -
    -									<h3>Using row value expressions in predicates</h3>
    -                                	<p>
    -                                		Row value expressions are incompatible with most other <reference id="queryparts" title="QueryParts"/>, but they can be used as a basis for constructing various <reference id="conditional-expressions" title="conditional expressions"/>, such as:
    -                                	</p>
    -                                	<ul>
    -                                		<li><reference id="comparison-predicate-degree-n" title="comparison predicates"/></li>
    -                                		<li><reference id="null-predicate-degree-n" title="NULL predicates"/></li>
    -                                		<li><reference id="between-predicate-degree-n" title="BETWEEN predicates"/></li>
    -                                		<li><reference id="in-predicate-degree-n" title="IN predicates"/></li>
    -                                		<li><reference id="overlaps-predicate" title="OVERLAPS predicate"/> (for degree 2 row value expressions only)</li>
    -                                	</ul>
    -                                	<p>
    -                                		See the relevant sections for more details about how to use row value expressions in predicates.
    -                                	</p>
    -                                	
    -                                	<h3>Using row value expressions in UPDATE statements</h3>
    -                                	<p>
    -                                		The <reference id="update-statement" title="UPDATE statement"/> also supports a variant where row value expressions are updated, rather than single columns. See the relevant section for more details
    -                                	</p>
    -                                	
    -									<h3>Higher-degree row value expressions</h3>
    -									<p>
    -										jOOQ chose to explicitly support degrees up to {max-row-degree} to match Scala's typesafe tuple, function and product support. Unlike Scala, however, jOOQ also supports higher degrees without the additional typesafety. 
    -									</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -					<section id="conditional-expressions">
    -					    <title>Conditional expressions</title>
    -						<content><html>
    -							<p>
    -								Conditions or conditional expressions are widely used in SQL and in the jOOQ API. They can be used in
    -							</p>
    -							<ul>
    -								<li>The <reference id="case-expressions" title="CASE expression"/></li>
    -								<li>The <reference id="join-clause" title="JOIN clause"/> (or <code>JOIN .. ON</code> clause, to be precise) of a <reference id="select-statement" title="SELECT statement"/>, <reference id="update-statement" title="UPDATE statement"/>, <reference id="delete-statement" title="DELETE statement"/></li>
    -								<li>The <reference id="where-clause" title="WHERE clause"/> of a <reference id="select-statement" title="SELECT statement"/>, <reference id="update-statement" title="UPDATE statement"/>, <reference id="delete-statement" title="DELETE statement"/></li>
    -								<li>The <reference id="connect-by-clause" title="CONNECT BY clause"/> of a <reference id="select-statement" title="SELECT statement"/></li>
    -								<li>The <reference id="having-clause" title="HAVING clause"/> of a <reference id="select-statement" title="SELECT statement"/></li>
    -								<li>The <reference id="merge-statement" title="MERGE statement"/>'s ON clause</li>
    -							</ul>
    -							
    -							<h3>Boolean types in SQL</h3>
    -							<p>
    -								Before SQL:1999, boolean types did not really exist in SQL. They were modelled by 0 and 1 numeric/char values. With SQL:1999, true booleans were introduced and are now supported by most databases. In short, these are possible boolean values:
    -							</p>
    -							<ul>
    -								<li><code>1</code> or <code>TRUE</code></li>
    -								<li><code>0</code> or <code>FALSE</code></li>
    -								<li><code>NULL</code> or <code>UNKNOWN</code></li>
    -							</ul>
    -							<p>
    -								It is important to know that SQL differs from many other languages in the way it interprets the <code>NULL</code> boolean value. Most importantly, the following facts are to be remembered:
    -							</p>
    -							<ul>
    -								<li><code>[ANY] = NULL</code> yields <code>NULL</code> (not <code>FALSE</code>)</li>
    -								<li><code>[ANY] != NULL</code> yields <code>NULL</code> (not <code>TRUE</code>)</li>
    -								<li><code>NULL = NULL</code> yields <code>NULL</code> (not <code>TRUE</code>)</li>
    -								<li><code>NULL != NULL</code> yields <code>NULL</code> (not <code>FALSE</code>)</li>
    -							</ul>
    -							<p>
    -								For simplified <code>NULL</code> handling, please refer to the section about the <reference id="distinct-predicate" title="DISTINCT predicate"/>.
    -							</p>
    -							<p>
    -								Note that jOOQ does not model these values as actual <reference id="column-expressions" title="column expression"/> compatible.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -						    <section id="condition-building">
    -							    <title>Condition building</title>
    -								<content><html>
    -									<p>
    -										With jOOQ, most <reference id="conditional-expressions" title="conditional expressions"/> are built from <reference id="column-expressions" title="column expressions"/>, calling various methods on them. For instance, to build a <reference id="comparison-predicate" title="comparison predicate"/>, you can write the following expression:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[TITLE  = 'Animal Farm'
    -TITLE != 'Animal Farm']]></sql>
    -<java><![CDATA[BOOK.TITLE.equal("Animal Farm")
    -BOOK.TITLE.notEqual("Animal Farm")]]></java>
    -</code-pair><html>
    -
    -									<h3>Create conditions from the DSL</h3>
    -									<p>
    -										There are a few types of conditions, that can be created statically from the <reference id="dsl" title="DSL"/>. These are:
    -									</p>
    -									<ul>
    -										<li><reference id="plain-sql" title="plain SQL conditions"/>, that allow you to phrase your own SQL string <reference id="conditional-expressions" title="conditional expression"/></li>
    -										<li>The <reference id="exists-predicate" title="EXISTS predicate"/>, a standalone predicate that creates a conditional expression</li>
    -										<li>Constant <code>TRUE</code> and <code>FALSE</code> conditional expressions</li>
    -									</ul>
    -
    -									<h3>Connect conditions using boolean operators</h3>
    -									<p>
    -										Conditions can also be connected using <reference id="boolean-operators" title="boolean operators"/> as will be discussed in a subsequent chapter.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -						    <section id="boolean-operators">
    -							    <title>AND, OR, NOT boolean operators</title>
    -								<content><html>
    -									<p>
    -										In SQL, as in most other languages, <reference id="conditional-expressions" title="conditional expressions"/> can be connected using the <code>AND</code> and <code>OR</code> binary operators, as well as the <code>NOT</code> unary operator, to form new conditional expressions. In jOOQ, this is modelled as such: 
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[-- A simple conditional expression
    -TITLE = 'Animal Farm' OR TITLE = '1984'
    -
    --- A more complex conditional expression
    -        (TITLE = 'Animal Farm' OR TITLE = '1984') 
    -AND NOT (AUTHOR.LAST_NAME = 'Orwell')]]></sql>
    -<java><![CDATA[// A simple boolean connection
    -BOOK.TITLE.equal("Animal Farm").or(BOOK.TITLE.equal("1984"))
    -
    -// A more complex conditional expression
    -BOOK.TITLE.equal("Animal Farm").or(BOOK.TITLE.equal("1984"))
    -    .andNot(AUTHOR.LAST_NAME.equal("Orwell"))]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										The above example shows that the number of parentheses in Java can quickly explode. Proper indentation may become crucial in making such code readable. In order to understand how jOOQ composes combined conditional expressions, let's assign component expressions first:
    -									</p>
    -
    -</html><java><![CDATA[Condition a = BOOK.TITLE.equal("Animal Farm");
    -Condition b = BOOK.TITLE.equal("1984");
    -Condition c = AUTHOR.LAST_NAME.equal("Orwell");
    -
    -Condition combined1 = a.or(b);             // These OR-connected conditions form a new condition, wrapped in parentheses
    -Condition combined2 = combined1.andNot(c); // The left-hand side of the AND NOT () operator is already wrapped in parentheses]]></java><html>
    -
    -									<h3>The Condition API</h3>
    -									<p>
    -										Here are all boolean operators on the <reference class="org.jooq.Condition"/> interface:
    -									</p>
    -									
    -</html><java><![CDATA[and(Condition)            // Combine conditions with AND
    -and(String)               // Combine conditions with AND. Convenience for adding plain SQL to the right-hand side
    -and(String, Object...)    // Combine conditions with AND. Convenience for adding plain SQL to the right-hand side
    -and(String, QueryPart...) // Combine conditions with AND. Convenience for adding plain SQL to the right-hand side
    -andExists(Select<?>)      // Combine conditions with AND. Convenience for adding an exists predicate to the rhs
    -andNot(Condition)         // Combine conditions with AND. Convenience for adding an inverted condition to the rhs
    -andNotExists(Select<?>)   // Combine conditions with AND. Convenience for adding an inverted exists predicate to the rhs
    -
    -or(Condition)             // Combine conditions with OR
    -or(String)                // Combine conditions with OR. Convenience for adding plain SQL to the right-hand side
    -or(String, Object...)     // Combine conditions with OR. Convenience for adding plain SQL to the right-hand side
    -or(String, QueryPart...)  // Combine conditions with OR. Convenience for adding plain SQL to the right-hand side
    -orExists(Select<?>)       // Combine conditions with OR. Convenience for adding an exists predicate to the rhs
    -orNot(Condition)          // Combine conditions with OR. Convenience for adding an inverted condition to the rhs
    -orNotExists(Select<?>)    // Combine conditions with OR. Convenience for adding an inverted exists predicate to the rhs
    -
    -not()                     // Invert a condition (synonym for DSL.not(Condition)]]></java>
    -								</content>
    -							</section>
    -
    -						    <section id="comparison-predicate">
    -							    <title>Comparison predicate</title>
    -								<content><html>
    -									<p>
    -										In SQL, comparison predicates are formed using common comparison operators:
    -									</p>
    -									<ul>
    -										<li><strong>=</strong> to test for equality</li>
    -										<li><strong>&lt;&gt;</strong> or <strong>!=</strong> to test for non-equality</li>
    -										<li><strong>&gt;</strong> to test for being strictly greater</li>
    -										<li><strong>&gt;=</strong> to test for being greater or equal</li>
    -										<li><strong>&lt;</strong> to test for being strictly less</li>
    -										<li><strong>&lt;=</strong> to test for being less or equal</li>
    -									</ul>
    -									
    -									<p>
    -										Unfortunately, Java does not support operator overloading, hence these operators are also implemented as methods in jOOQ, like any other SQL syntax elements. The relevant parts of the <reference class="org.jooq.Field"/> interface are these:
    -									</p>
    -									
    -</html><java><![CDATA[eq or equal(T);                                     // =  (some bind value)
    -eq or equal(Field<T>);                              // =  (some column expression)
    -eq or equal(Select<? extends Record1<T>>);          // =  (some scalar SELECT statement)
    -ne or notEqual(T);                                  // <> (some bind value)
    -ne or notEqual(Field<T>);                           // <> (some column expression)
    -ne or notEqual(Select<? extends Record1<T>>);       // <> (some scalar SELECT statement)
    -lt or lessThan(T);                                  // <  (some bind value)
    -lt or lessThan(Field<T>);                           // <  (some column expression)
    -lt or lessThan(Select<? extends Record1<T>>);       // <  (some scalar SELECT statement)
    -le or lessOrEqual(T);                               // <= (some bind value)
    -le or lessOrEqual(Field<T>);                        // <= (some column expression)
    -le or lessOrEqual(Select<? extends Record1<T>>);    // <= (some scalar SELECT statement)
    -gt or greaterThan(T);                               // >  (some bind value)
    -gt or greaterThan(Field<T>);                        // >  (some column expression)
    -gt or greaterThan(Select<? extends Record1<T>>);    // >  (some scalar SELECT statement)
    -ge or greaterOrEqual(T);                            // >= (some bind value)
    -ge or greaterOrEqual(Field<T>);                     // >= (some column expression)
    -ge or greaterOrEqual(Select<? extends Record1<T>>); // >= (some scalar SELECT statement)]]></java><html>
    -
    -									<p>
    -										Note that every operator is represented by two methods. A verbose one (such as <code>equal()</code>) and a two-character one (such as <code>eq()</code>). Both methods are the same. You may choose either one, depending on your taste. The manual will always use the more verbose one.
    -									</p>
    -									
    -									<h3>jOOQ's convenience methods using comparison operators</h3>
    -									<p>
    -										In addition to the above, jOOQ provides a few convenience methods for common operations performed on strings using comparison predicates:
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[-- case insensitivity
    -LOWER(TITLE)  = LOWER('animal farm')
    -LOWER(TITLE) <> LOWER('animal farm')]]></sql>
    -<java><![CDATA[// case insensitivity
    -BOOK.TITLE.equalIgnoreCase("animal farm")
    -BOOK.TITLE.notEqualIgnoreCase("animal farm")]]></java>
    -</code-pair>
    -								</content>
    -							</section>
    -                            
    -                            <section id="boolean-operator-precedence">
    -                                <title>Boolean operator precedence</title>
    -                                <content><html>
    -                                    <p>
    -                                        As previously mentioned in the manual's section about <reference id="arithmetic-expressions" title="arithmetic expressions"/>, jOOQ does not implement operator precedence. All operators are evaluated from left to right, as expected in an object-oriented API. This is important to understand when combining <reference id="boolean-operators" title="boolean operators"/>, such as <code>AND</code>, <code>OR</code>, and <code>NOT</code>. The following expressions are equivalent:
    -                                    </p>
    -
    -</html><java>
    -   A.and(B) .or(C) .and(D) .or(E)
    -(((A.and(B)).or(C)).and(D)).or(E)
    -</java><html>
    -
    -                                    <p>
    -                                        In SQL, the two expressions wouldn't be the same, as SQL natively knows operator precedence.
    -                                    </p>
    -                                    
    -</html><sql>
    -   A AND B  OR C  AND D  OR E -- Precedence is applied
    -(((A AND B) OR C) AND D) OR E -- Precedence is overridden
    -</sql>                                    
    -                                </content>
    -                            </section>
    -
    -							<section id="comparison-predicate-degree-n">
    -							    <title>Comparison predicate (degree > 1)</title>
    -							    <content><html>
    -							    	<p>
    -							    		All variants of the <reference id="comparison-predicate" title="comparison predicate"/> that we've seen in the previous chapter also work for <reference id="row-value-expressions" title="row value expressions"/>. If your database does not support row value expression comparison predicates, jOOQ simulates them the way they are defined in the SQL standard:
    -							    	</p>
    -	
    -</html><code-pair>
    -<sql><![CDATA[-- Row value expressions (equal)
    -(A, B)    =  (X, Y)
    -(A, B, C) =  (X, Y, Z)
    --- greater than
    -(A, B)    >  (X, Y)
    -
    -(A, B, C) >  (X, Y, Z)
    -
    -
    --- greater or equal  
    -(A, B)    >= (X, Y)
    -
    -
    -(A, B, C) >= (X, Y, Z)
    -
    -
    -
    --- Inverse comparisons
    -
    -(A, B)    <> (X, Y)
    -(A, B)    <  (X, Y)
    -(A, B)    <= (X, Y)]]></sql>	
    -<sql><![CDATA[-- Equivalent factored-out predicates (equal)
    -(A = X) AND (B = Y)
    -(A = X) AND (B = Y) AND (C = Z)
    --- greater than
    -(A > X) 
    -  OR ((A = X) AND (B > Y)) 
    -(A > X) 
    -  OR ((A = X) AND (B > Y)) 
    -  OR ((A = X) AND (B = Y) AND (C > Z))
    --- greater or equal  
    -(A > X) 
    -  OR ((A = X) AND (B > Y))
    -  OR ((A = X) AND (B = Y))
    -(A > X) 
    -  OR ((A = X) AND (B > Y)) 
    -  OR ((A = X) AND (B = Y) AND (C > Z))
    -  OR ((A = X) AND (B = Y) AND (C = Z))
    --- For simplicity, these predicates are shown in terms
    --- of their negated counter parts
    -NOT((A, B) =  (X, Y))
    -NOT((A, B) >= (X, Y))
    -NOT((A, B) >  (X, Y))]]></sql>	
    -</code-pair><html>						    	
    -
    -									<p>
    -										jOOQ supports all of the above row value expression comparison predicates, both with <reference id="column-expressions" title="column expression lists"/> and <reference id="select-statement" title="scalar subselects"/> at the right-hand side:
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[-- With regular column expressions
    -(BOOK.AUTHOR_ID, BOOK.TITLE) = (1, 'Animal Farm')
    -
    --- With scalar subselects
    -(BOOK.AUTHOR_ID, BOOK.TITLE) = (
    -  SELECT PERSON.ID, 'Animal Farm'
    -  FROM PERSON
    -  WHERE PERSON.ID = 1
    -)]]></sql>
    -<java><![CDATA[// Column expressions
    -row(BOOK.AUTHOR_ID, BOOK.TITLE).equal(1, "Animal Farm");
    -
    -// Subselects
    -row(BOOK.AUTHOR_ID, BOOK.TITLE).equal(
    -  select(PERSON.ID, val("Animal Farm"))
    -  .from(PERSON)
    -  .where(PERSON.ID.equal(1))
    -);]]></java>
    -</code-pair>									
    -							    </content>
    -						    </section>
    -						    
    -						    <section id="quantified-comparison-predicate">
    -							    <title>Quantified comparison predicate</title>
    -								<content><html>
    -									<p>
    -										If the right-hand side of a <reference id="comparison-predicate" title="comparison predicate"/> turns out to be a non-scalar table subquery, you can wrap that subquery in a quantifier, such as <code>ALL</code>, <code>ANY</code>, or <code>SOME</code>. Note that the SQL standard defines <code>ANY</code> and <code>SOME</code> to be equivalent. jOOQ settled for the more intuitive <code>ANY</code> and doesn't support <code>SOME</code>. Here are some examples, supported by jOOQ:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[TITLE = ANY('Animal Farm', '1982')
    -PUBLISHED_IN > ALL(1920, 1940)]]></sql>
    -<java><![CDATA[BOOK.TITLE.equal(any("Animal Farm", "1982"));
    -BOOK.PUBLISHED_IN.greaterThan(all(1920, 1940));]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										For the example, the right-hand side of the quantified comparison predicates were filled with argument lists. But it is easy to imagine that the source of values results from a <reference id="nested-selects" title="subselect"/>.
    -									</p>
    -
    -									<h3>ANY and the IN predicate</h3>
    -									<p>
    -										It is interesting to note that the SQL standard defines the <reference id="in-predicate" title="IN predicate"/> in terms of the <code>ANY</code>-quantified predicate. The following two expressions are equivalent:
    -									</p>
    -									
    -</html><code-pair>
    -<text><![CDATA[[ROW VALUE EXPRESSION] IN [IN PREDICATE VALUE]]]></text>
    -<text><![CDATA[[ROW VALUE EXPRESSION] = ANY [IN PREDICATE VALUE]]]></text>
    -</code-pair><html>
    -
    -									<p>
    -										Typically, the <reference id="in-predicate" title="IN predicate"/> is more readable than the quantified comparison predicate.
    -									</p>
    -								</html></content>
    -							</section>
    -							
    -						    <section id="null-predicate">
    -							    <title>NULL predicate</title>
    -								<content><html>
    -									<p>
    -										In SQL, you cannot compare <code>NULL</code> with any value using <reference id="comparison-predicate" title="comparison predicates"/>, as the result would yield <code>NULL</code> again, which is neither <code>TRUE</code> nor <code>FALSE</code> (see also the manual's section about <reference id="conditional-expressions" title="conditional expressions"/>). In order to test a <reference id="column-expressions" title="column expression"/> for <code>NULL</code>, use the <code>NULL</code> predicate as such:
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[TITLE IS NULL
    -TITLE IS NOT NULL]]></sql>
    -<java><![CDATA[BOOK.TITLE.isNull()
    -BOOK.TITLE.isNotNull()]]></java>
    -</code-pair>
    -
    -								</content>
    -							</section>
    -
    -						    <section id="null-predicate-degree-n">
    -							    <title>NULL predicate (degree > 1)</title>
    -							    <content><html>
    -							    	<p>
    -							    		The SQL <code>NULL</code> predicate also works well for <reference id="row-value-expressions" title="row value expressions"/>, although it has some subtle, counter-intuitive features when it comes to inversing predicates with the <code>NOT()</code> operator! Here are some examples:
    -							    	</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[-- Row value expressions
    -(A, B) IS     NULL
    -(A, B) IS NOT NULL
    -
    --- Inverse of the above
    -NOT((A, B) IS     NULL)
    -NOT((A, B) IS NOT NULL)]]></sql>	
    -<sql><![CDATA[-- Equivalent factored-out predicates
    -(A IS     NULL) AND (B IS     NULL)
    -(A IS NOT NULL) AND (B IS NOT NULL)
    -
    --- Inverse
    -(A IS NOT NULL) OR  (B IS NOT NULL)
    -(A IS     NULL) OR  (B IS     NULL)]]></sql>	
    -</code-pair><html>						    	
    -
    -									<p>
    -										The SQL standard contains a nice truth table for the above rules:
    -									</p>
    -									
    -</html><text>+-----------------------+-----------+---------------+---------------+-------------------+
    -| Expression            | R IS NULL | R IS NOT NULL | NOT R IS NULL | NOT R IS NOT NULL |
    -+-----------------------+-----------+---------------+---------------+-------------------+
    -| degree 1: null        | true      | false         | false         |  true             |
    -| degree 1: not null    | false     | true          | true          |  false            |
    -| degree > 1: all null  | true      | false         | false         |  true             |
    -| degree > 1: some null | false     | false         | true          |  true             |
    -| degree > 1: none null | false     | true          | true          |  false            |
    -+-----------------------+-----------+---------------+---------------+-------------------+</text><html>		
    -
    -									<p>
    -										In jOOQ, you would simply use the <code>isNull()</code> and <code>isNotNull()</code> methods on row value expressions. Again, as with the <reference id="comparison-predicate-degree-n" title="row value expression comparison predicate"/>, the row value expression <code>NULL</code> predicate is simulated by jOOQ, if your database does not natively support it:
    -									</p>
    -									
    -</html><java><![CDATA[row(BOOK.ID, BOOK.TITLE).isNull();
    -row(BOOK.ID, BOOK.TITLE).isNotNull();]]></java>
    -
    -							    </content>
    -						    </section>
    -						    
    -						    <section id="distinct-predicate">
    -							    <title>DISTINCT predicate</title>
    -								<content><html>
    -									<p>
    -										Some databases support the <code>DISTINCT</code> predicate, which serves as a convenient, <code>NULL</code>-safe <reference id="comparison-predicate" title="comparison predicate"/>. With the <code>DISTINCT</code> predicate, the following truth table can be assumed:
    -									</p>
    -									<ul>
    -										<li><code>[ANY] IS DISTINCT FROM NULL</code> yields <code>TRUE</code></li>
    -										<li><code>[ANY] IS NOT DISTINCT FROM NULL</code> yields <code>FALSE</code></li>
    -										<li><code>NULL IS DISTINCT FROM NULL</code> yields <code>FALSE</code></li>
    -										<li><code>NULL IS NOT DISTINCT FROM NULL</code> yields <code>TRUE</code></li>
    -									</ul>
    -									<p>
    -										For instance, you can compare two fields for distinctness, ignoring the fact that any of the two could be <code>NULL</code>, which would lead to funny results. This is supported by jOOQ as such:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[TITLE IS DISTINCT FROM SUB_TITLE
    -TITLE IS NOT DISTINCT FROM SUB_TITLE]]></sql>
    -<java><![CDATA[BOOK.TITLE.isDistinctFrom(BOOK.SUB_TITLE)
    -BOOK.TITLE.isNotDistinctFrom(BOOK.SUB_TITLE)]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										If your database does not natively support the <code>DISTINCT</code> predicate, jOOQ simulates it with an equivalent <reference id="case-expressions" title="CASE expression"/>, modelling the above truth table:
    -									</p>
    -	
    -</html><code-pair>								
    -<sql><![CDATA[-- [A] IS DISTINCT FROM [B] 
    -CASE WHEN [A] IS     NULL AND [B] IS     NULL THEN FALSE
    -     WHEN [A] IS     NULL AND [B] IS NOT NULL THEN TRUE
    -     WHEN [A] IS NOT NULL AND [B] IS     NULL THEN TRUE
    -     WHEN [A] =               [B]             THEN FALSE
    -     ELSE                                          TRUE
    -END
    -]]></sql>
    -<sql><![CDATA[-- [A] IS NOT DISTINCT FROM [B] 
    -CASE WHEN [A] IS     NULL AND [B] IS     NULL THEN TRUE
    -     WHEN [A] IS     NULL AND [B] IS NOT NULL THEN FALSE
    -     WHEN [A] IS NOT NULL AND [B] IS     NULL THEN FALSE
    -     WHEN [A] =               [B]             THEN TRUE
    -     ELSE                                          FALSE
    -END
    -]]></sql>
    -</code-pair>							
    -								</content>
    -							</section>
    -
    -						    <section id="between-predicate">
    -							    <title>BETWEEN predicate</title>
    -								<content><html>
    -									<p>
    -										The <code>BETWEEN</code> predicate can be seen as syntactic sugar for a pair of <reference id="comparison-predicate" title="comparison predicates"/>. According to the SQL standard, the following two predicates are equivalent:
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[[A] BETWEEN [B] AND [C]]]></sql>
    -<sql><![CDATA[[A] >= [B] AND [A] <= [C]]]></sql>
    -</code-pair><html>
    -
    -									<p>
    -										Note the inclusiveness of range boundaries in the definition of the <code>BETWEEN</code> predicate. Intuitively, this is supported in jOOQ as such:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[PUBLISHED_IN     BETWEEN 1920 AND 1940
    -PUBLISHED_IN NOT BETWEEN 1920 AND 1940]]></sql>
    -<java><![CDATA[BOOK.PUBLISHED_IN.between(1920).and(1940)
    -BOOK.PUBLISHED_IN.notBetween(1920).and(1940)]]></java>
    -</code-pair><html>
    -
    -									<h3>BETWEEN SYMMETRIC</h3>
    -									<p>
    -										The SQL standard defines the <code>SYMMETRIC</code> keyword to be used along with <code>BETWEEN</code> to indicate that you do not care which bound of the range is larger than the other. A database system should simply swap range bounds, in case the first bound is greater than the second one. jOOQ supports this keyword as well, simulating it if necessary.
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[PUBLISHED_IN     BETWEEN SYMMETRIC 1940 AND 1920
    -PUBLISHED_IN NOT BETWEEN SYMMETRIC 1940 AND 1920]]></sql>
    -<java><![CDATA[BOOK.PUBLISHED_IN.betweenSymmetric(1940).and(1920)
    -BOOK.PUBLISHED_IN.notBetweenSymmetric(1940).and(1920)]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										The simulation is done trivially:
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[[A] BETWEEN SYMMETRIC [B] AND [C]]]></sql>
    -<sql><![CDATA[([A] BETWEEN [B] AND [C]) OR ([A] BETWEEN [C] AND [B])]]></sql>
    -</code-pair>
    -
    -								</content>
    -							</section>
    -
    -						    <section id="between-predicate-degree-n">
    -							    <title>BETWEEN predicate (degree > 1)</title>
    -							    <content><html>
    -							    	<p>
    -							    	    The SQL <code>BETWEEN</code> predicate also works well for <reference id="row-value-expressions" title="row value expressions"/>. Much like the <reference id="between-predicate" title="BETWEEN predicate for degree 1"/>, it is defined in terms of a pair of regular <reference id="comparison-predicate" title="comparison predicates"/>:
    -							    	</p>
    -							    	
    -</html><code-pair>
    -<sql><![CDATA[[A] BETWEEN           [B] AND [C]
    -[A] BETWEEN SYMMETRIC [B] AND [C]]]></sql>
    -<sql><![CDATA[ [A] >= [B] AND [A] <= [C]
    -([A] >= [B] AND [A] <= [C]) OR ([A] >= [C] AND [A] <= [B])]]></sql>
    -</code-pair><html>
    -							    	
    -							    	<p>
    -							    		The above can be factored out according to the rules listed in the manual's section about <reference id="comparison-predicate-degree-n" title="row value expression comparison predicates"/>.
    -							    	</p>
    -							    	
    -							    	<p>
    -							    		jOOQ supports the <code>BETWEEN [SYMMETRIC]</code> predicate and simulates it in all SQL dialects where necessary. An example is given here:
    -							    	</p>
    -							    	
    -</html><java><![CDATA[row(BOOK.ID, BOOK.TITLE).between(1, "A").and(10, "Z");]]></java>
    -							    	
    -							    </content>
    -							</section>
    -							
    -						    <section id="like-predicate">
    -							    <title>LIKE predicate</title>
    -								<content><html>
    -									<p>
    -										<code>LIKE</code> predicates are popular for simple wildcard-enabled pattern matching. Supported wildcards in all SQL databases are:
    -									</p>
    -									<ul>
    -										<li><strong>_</strong>: (single-character wildcard)</li>
    -										<li><strong>%</strong>: (multi-character wildcard)</li>
    -									</ul>
    -									<p>
    -										With jOOQ, the <code>LIKE</code> predicate can be created from any <reference id="column-expressions" title="column expression"/> as such:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[TITLE     LIKE '%abc%'
    -TITLE NOT LIKE '%abc%']]></sql>
    -<java><![CDATA[BOOK.TITLE.like("%abc%")
    -BOOK.TITLE.notLike("%abc%")]]></java>
    -</code-pair><html>
    -									
    -									<h3>Escaping operands with the LIKE predicate</h3>
    -									<p>
    -										Often, your pattern may contain any of the wildcard characters <code>"_"</code> and <code>"%"</code>, in case of which you may want to escape them. jOOQ does not automatically escape patterns in <code>like()</code> and <code>notLike()</code> methods. Instead, you can explicitly define an escape character as such:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[TITLE     LIKE '%The !%-Sign Book%' ESCAPE '!'
    -TITLE NOT LIKE '%The !%-Sign Book%' ESCAPE '!']]></sql>
    -<java><![CDATA[BOOK.TITLE.like("%The !%-Sign Book%", '!')
    -BOOK.TITLE.notLike("%The !%-Sign Book%", '!')]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										In the above predicate expressions, the exclamation mark character is passed as the escape character to escape wildcard characters <code>"!_"</code> and <code>"!%"</code>, as well as to escape the escape character itself: <code>"!!"</code>
    -									</p>
    -									<p>
    -										Please refer to your database manual for more details about escaping patterns with the <code>LIKE</code> predicate.
    -									</p>
    -									
    -									<h3>jOOQ's convenience methods using the LIKE predicate</h3>
    -									<p>
    -										In addition to the above, jOOQ provides a few convenience methods for common operations performed on strings using the <code>LIKE</code> predicate. Typical operations are "contains predicates", "starts with predicates", "ends with predicates", etc. Here is the full convenience API wrapping <code>LIKE</code> predicates:
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[-- case insensitivity
    -LOWER(TITLE) LIKE LOWER('%abc%')
    -LOWER(TITLE) NOT LIKE LOWER('%abc%')
    -
    --- contains and similar methods
    -TITLE LIKE '%' || 'abc' || '%'
    -TITLE LIKE 'abc' || '%'
    -TITLE LIKE '%' || 'abc']]></sql>
    -<java><![CDATA[// case insensitivity
    -BOOK.TITLE.likeIgnoreCase("%abc%")
    -BOOK.TITLE.notLikeIgnoreCase("%abc%")
    -
    -// contains and similar methods
    -BOOK.TITLE.contains("abc")
    -BOOK.TITLE.startsWith("abc")
    -BOOK.TITLE.endsWith("abc")]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										Note, that jOOQ escapes <code>%</code> and <code>_</code> characters in value in some of the above predicate implementations. For simplicity, this has been omitted in this manual.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -						    <section id="in-predicate">
    -							    <title>IN predicate</title>
    -								<content><html>
    -									<p>
    -										In SQL, apart from comparing a value against several values, the <code>IN</code> predicate can be used to create semi-joins or anti-joins. jOOQ knows the following methods on the <reference class="org.jooq.Field" /> interface, to construct such <code>IN</code> predicates:
    -									</p>
    -
    -</html><java><![CDATA[in(Collection<T>)                   // Construct an IN predicate from a collection of bind values
    -in(T...)                            // Construct an IN predicate from bind values
    -in(Field<?>...)                     // Construct an IN predicate from column expressions
    -in(Select<? extends Record1<T>>)    // Construct an IN predicate from a subselect
    -notIn(Collection<T>)                // Construct a NOT IN predicate from a collection of bind values
    -notIn(T...)                         // Construct a NOT IN predicate from bind values
    -notIn(Field<?>...)                  // Construct a NOT IN predicate from column expressions
    -notIn(Select<? extends Record1<T>>) // Construct a NOT IN predicate from a subselect]]></java><html>
    -
    -									<p>
    -										A sample <code>IN</code> predicate might look like this:
    -									</p>
    -									
    -</html><code-pair>
    -<sql><![CDATA[TITLE     IN ('Animal Farm', '1984')
    -TITLE NOT IN ('Animal Farm', '1984')]]></sql>
    -<java><![CDATA[BOOK.TITLE.in("Animal Farm", "1984")
    -BOOK.TITLE.notIn("Animal Farm", "1984")]]></java>
    -</code-pair><html>
    -
    -									
    -									<h3>NOT IN and NULL values</h3>
    -									<p>
    -										Beware that you should probably not have any <code>NULL</code> values in the right hand side of a <code>NOT IN</code> predicate, as the whole expression would evaluate to <code>NULL</code>, which is rarely desired. This can be shown informally using the following reasoning:
    -									</p>
    -									
    -</html><sql>-- The following conditional expressions are formally or informally equivalent
    -A NOT IN (B, C)
    -A != ANY(B, C)
    -A != B AND A != C
    -
    --- Substitute C for NULL, you'll get
    -A NOT IN (B, NULL)   -- Substitute C for NULL
    -A != B AND A != NULL -- From the above rules
    -A != B AND NULL      -- [ANY] != NULL yields NULL
    -NULL                 -- [ANY] AND NULL yields NULL</sql><html>
    -
    -									<p>
    -										A good way to prevent this from happening is to use the <reference id="exists-predicate" title="EXISTS predicate"/> for anti-joins, which is <code>NULL</code>-value insensitive. See the manual's section about <reference id="conditional-expressions" title="conditional expressions"/> to see a boolean truth table.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -						    <section id="in-predicate-degree-n">
    -							    <title>IN predicate (degree > 1)</title>
    -							    <content><html>
    -							    	<p>
    -							    	    The SQL <code>IN</code> predicate also works well for <reference id="row-value-expressions" title="row value expressions"/>. Much like the <reference id="in-predicate" title="IN predicate for degree 1"/>, it is defined in terms of a <reference id="quantified-comparison-predicate" title="quantified comparison predicate"/>. The two expressions are equivalent:
    -							    	</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[R IN [IN predicate value]]]></sql>
    -<sql><![CDATA[R = ANY [IN predicate value]]]></sql>
    -</code-pair><html>		
    -
    -									<p>
    -							    		jOOQ supports the <code>IN</code> predicate. Simulation of the <code>IN</code> predicate where row value expressions aren't well supported is currently only available for <code>IN</code> predicates that do not take a subselect as an <code>IN</code> predicate value. An example is given here:
    -							    	</p>
    -							    	
    -</html><java><![CDATA[row(BOOK.ID, BOOK.TITLE).in(row(1, "A"), row(2, "B"));]]></java>					    	
    -							    </content>
    -							</section>
    -							
    -						    <section id="exists-predicate">
    -							    <title>EXISTS predicate</title>
    -								<content><html>
    -									<p>
    -										Slightly less intuitive, yet more powerful than the previously discussed <reference id="in-predicate" title="IN predicate"/> is the <code>EXISTS</code> predicate, that can be used to form semi-joins or anti-joins. With jOOQ, the <code>EXISTS</code> predicate can be formed in various ways:
    -									</p>
    -									<ul>
    -										<li>From the <reference id="dsl" title="DSL"/>, using static methods. This is probably the most used case</li>
    -										<li>From a <reference id="conditional-expressions" title="conditional expression"/> using <reference id="boolean-operators" title="convenience methods attached to boolean operators"/></li>
    -										<li>From a <reference id="select-statement" title="SELECT statement"/> using <reference id="where-clause" title="convenience methods attached to the where clause"/>, and from other clauses</li>
    -									</ul>
    -									
    -									<p>
    -										An example of an <code>EXISTS</code> predicate can be seen here:
    -									</p>
    -
    -</html><code-pair>
    -<sql><![CDATA[    EXISTS (SELECT 1 FROM BOOK 
    -            WHERE AUTHOR_ID = 3)
    -NOT EXISTS (SELECT 1 FROM BOOK 
    -            WHERE AUTHOR_ID = 3)]]></sql>
    -<java><![CDATA[   exists(create.selectOne().from(BOOK)
    -                .where(BOOK.AUTHOR_ID.equal(3)));
    -notExists(create.selectOne().from(BOOK)
    -                .where(BOOK.AUTHOR_ID.equal(3)));]]></java>
    -</code-pair><html>
    -
    -									<p>
    -										Note that in SQL, the projection of a subselect in an <code>EXISTS</code> predicate is irrelevant. To help you write queries like the above, you can use jOOQ's selectZero() or selectOne() <reference id="dsl" title="DSL"/> methods
    -									</p>
    -									
    -									<h3>Performance of IN vs. EXISTS</h3>
    -									<p>
    -										In theory, the two types of predicates can perform equally well. If your database system ships with a sophisticated cost-based optimiser, it will be able to transform one predicate into the other, if you have all necessary constraints set (e.g. referential constraints, not null constraints). However, in reality, performance between the two might differ substantially. An interesting blog post investigating this topic on the MySQL database can be seen here:<br/>
    -										<a href="http://blog.jooq.org/2012/07/27/not-in-vs-not-exists-vs-left-join-is-null-mysql/">http://blog.jooq.org/2012/07/27/not-in-vs-not-exists-vs-left-join-is-null-mysql/</a>
    -									</p>
    -								</html></content>
    -							</section>
    -							
    -							<section id="overlaps-predicate">
    -								<title>OVERLAPS predicate</title>
    -								<content><html>
    -									<p>
    -										When comparing dates, the SQL standard allows for using a special <code>OVERLAPS</code> predicate, which checks whether two date ranges overlap each other. The following can be said:
    -									</p>
    -
    -</html><sql><![CDATA[-- This yields true
    -(DATE '2010-01-01', DATE '2010-01-03') OVERLAPS (DATE '2010-01-02' DATE '2010-01-04')
    -
    --- INTERVAL data types are also supported. This is equivalent to the above
    -(DATE '2010-01-01', CAST('+2 00:00:00' AS INTERVAL DAY TO SECOND)) OVERLAPS 
    -(DATE '2010-01-02', CAST('+2 00:00:00' AS INTERVAL DAY TO SECOND))]]></sql><html>
    -
    -									<h3>The OVERLAPS predicate in jOOQ</h3>
    -									<p>
    -									    jOOQ supports the <code>OVERLAPS</code> predicate on <reference id="row-value-expressions" title="row value expressions of degree 2"/>. The following methods are contained in <reference class="org.jooq.Row2"/>:
    -									</p>
    -
    -</html><java><![CDATA[Condition overlaps(T1 t1, T2 t2);
    -Condition overlaps(Field<T1> t1, Field<T2> t2);
    -Condition overlaps(Row2<T1, T2> row);]]></java><html>
    -
    -									<p>
    -										This allows for expressing the above predicates as such:
    -									</p>																		
    -
    -</html><java><![CDATA[// The date range tuples version
    -row(Date.valueOf('2010-01-01'), Date.valueOf('2010-01-03')).overlaps(Date.valueOf('2010-01-02'), Date.valueOf('2010-01-04'))
    -
    -// The INTERVAL tuples version
    -row(Date.valueOf('2010-01-01'), new DayToSecond(2)).overlaps(Date.valueOf('2010-01-02'), new DayToSecond(2))]]></java><html>
    -
    -									<h3>jOOQ's extensions to the standard</h3>
    -									<p>
    -										Unlike the standard (or any database implementing the standard), jOOQ also supports the <code>OVERLAPS</code> predicate for comparing arbitrary <reference id="row-value-expressions" title="row vlaue expressions of degree 2"/>. For instance, <code>(1, 3) OVERLAPS (2, 4)</code> will yield true in jOOQ. This is simulated as such
    -									</p>
    -									
    -</html><sql><![CDATA[-- This predicate
    -(A, B) OVERLAPS (C, D)
    -
    --- can be simulated as such
    -(C <= B) AND (A <= D)]]></sql>
    -								</content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -					<section id="plain-sql">
    -						<title>Plain SQL</title>
    -						<content><html>
    -							<p>
    -								A DSL is a nice thing to have, it feels "fluent" and "natural", especially if it models a well-known language, such as SQL. But a DSL is always expressed in a host language (Java in this case), which was not made for exactly the same purposes as its hosted DSL. If it were, then jOOQ would be implemented on a compiler-level, similar to LINQ in .NET. But it's not, and so, the DSL is limited by language constraints of its host language. We have seen many functionalities where the DSL becomes a bit verbose. This can be especially true for:
    -							</p>
    -							<ul>
    -								<li><reference id="aliased-columns" title="aliasing"/></li>
    -								<li><reference id="nested-selects" title="nested selects"/></li>
    -								<li><reference id="arithmetic-expressions" title="arithmetic expressions"/></li>
    -								<li><reference id="cast-expressions" title="casting"/></li>
    -							</ul>
    -							
    -							<p>
    -								You'll probably find other examples. If verbosity scares you off, don't worry. The verbose use-cases for jOOQ are rather rare, and when they come up, you do have an option. Just write SQL the way you're used to!
    -							</p>
    -							<p>
    -								jOOQ allows you to embed SQL as a String into any supported <reference id="sql-statements" title="statement"/> in these contexts:
    -							</p>
    -							<ul>
    -								<li>Plain SQL as a <reference id="conditional-expressions" title="conditional expression"/></li>
    -								<li>Plain SQL as a <reference id="column-expressions" title="column expression"/></li>
    -								<li>Plain SQL as a <reference id="column-expressions" title="function"/></li>
    -								<li>Plain SQL as a <reference id="table-expressions" title="table expression"/></li>
    -								<li>Plain SQL as a <reference id="query-vs-resultquery" title="query"/></li>
    -							</ul>
    -
    -							<h3>The DSL plain SQL API</h3>
    -							<p>
    -								Plain SQL API methods are usually overloaded in three ways. Let's look at the <code>condition</code> query part constructor:
    -							</p>
    -</html><java><![CDATA[// Construct a condition without bind values
    -// Example: condition("a = b")
    -Condition condition(String sql);
    -
    -// Construct a condition with bind values
    -// Example: condition("a = ?", 1);
    -Condition condition(String sql, Object... bindings);
    -
    -// Construct a condition taking other jOOQ object arguments
    -// Example: condition("a = {0}", val(1));
    -Condition condition(String sql, QueryPart... parts);]]></java><html>
    -							
    -							<p>
    -								Please refer to the <reference class="org.jooq.impl.DSL"/> Javadoc for more details. The following is a more complete listing of plain SQL construction methods from the DSL:
    -							</p>
    -
    -</html><java><![CDATA[// A condition
    -Condition condition(String sql);
    -Condition condition(String sql, Object... bindings);
    -Condition condition(String sql, QueryPart... parts);
    -
    -// A field with an unknown data type
    -Field<Object> field(String sql);
    -Field<Object> field(String sql, Object... bindings);
    -Field<Object> field(String sql, QueryPart... parts);
    -
    -// A field with a known data type
    -<T> Field<T> field(String sql, Class<T> type);
    -<T> Field<T> field(String sql, Class<T> type, Object... bindings);
    -<T> Field<T> field(String sql, Class<T> type, QueryPart... parts);
    -<T> Field<T> field(String sql, DataType<T> type);
    -<T> Field<T> field(String sql, DataType<T> type, Object... bindings);
    -<T> Field<T> field(String sql, DataType<T> type, QueryPart... parts);
    -
    -// A field with a known name (properly escaped)
    -Field<Object> fieldByName(String... fieldName);
    -<T> Field<T>  fieldByName(Class<T> type, String... fieldName);
    -<T> Field<T>  fieldByName(DataType<T> type, String... fieldName)
    -
    -// A function
    -<T> Field<T> function(String name, Class<T> type, Field<?>... arguments);
    -<T> Field<T> function(String name, DataType<T> type, Field<?>... arguments);
    -
    -// A table
    -Table<?> table(String sql);
    -Table<?> table(String sql, Object... bindings);
    -Table<?> table(String sql, QueryPart... parts);
    -
    -// A table with a known name (properly escaped)
    -Table<Record> tableByName(String... fieldName);
    -
    -// A query without results (update, insert, etc)
    -Query query(String sql);
    -Query query(String sql, Object... bindings);
    -Query query(String sql, QueryPart... parts);
    -
    -// A query with results
    -ResultQuery<Record> resultQuery(String sql);
    -ResultQuery<Record> resultQuery(String sql, Object... bindings);
    -ResultQuery<Record> resultQuery(String sql, QueryPart... parts);
    -
    -// A query with results. This is the same as resultQuery(...).fetch();
    -Result<Record> fetch(String sql);
    -Result<Record> fetch(String sql, Object... bindings);
    -Result<Record> fetch(String sql, QueryPart... parts);]]></java><html>
    -
    -							<p>
    -								Apart from the general factory methods, plain SQL is also available in various other contexts. For instance, when adding a <code>.where("a = b")</code> clause to a query. Hence, there exist several convenience methods where plain SQL can be inserted usefully. This is an example displaying all various use-cases in one single query:
    -							</p>
    -							
    -</html><java><![CDATA[// You can use your table aliases in plain SQL fields
    -// As long as that will produce syntactically correct SQL
    -Field<?> LAST_NAME    = create.field("a.LAST_NAME");
    -
    -// You can alias your plain SQL fields
    -Field<?> COUNT1       = create.field("count(*) x");
    -
    -// If you know a reasonable Java type for your field, you
    -// can also provide jOOQ with that type
    -Field<Integer> COUNT2 = create.field("count(*) y", Integer.class);
    -
    -       // Use plain SQL as select fields
    -create.select(LAST_NAME, COUNT1, COUNT2)
    -
    -       // Use plain SQL as aliased tables (be aware of syntax!)
    -      .from("author a")
    -      .join("book b")
    -
    -       // Use plain SQL for conditions both in JOIN and WHERE clauses
    -      .on("a.id = b.author_id")
    -
    -       // Bind a variable in plain SQL
    -      .where("b.title != ?", "Brida")
    -
    -       // Use plain SQL again as fields in GROUP BY and ORDER BY clauses
    -      .groupBy(LAST_NAME)
    -      .orderBy(LAST_NAME);]]></java><html>
    -
    -							<h3>Important things to note about plain SQL!</h3>
    -							<p>
    -								There are some important things to keep in mind when using plain SQL:
    -							</p>
    -							<ul>
    -								<li>jOOQ doesn't know what you're doing. You're on your own again!</li>
    -								<li>You have to provide something that will be syntactically correct. If it's not, then jOOQ won't know. Only your JDBC driver or your RDBMS will detect the syntax error.</li>
    -								<li>You have to provide consistency when you use variable binding. The number of ? must match the number of variables</li>
    -								<li>Your SQL is inserted into jOOQ queries without further checks. Hence, jOOQ can't prevent SQL injection. </li>
    -							</ul>
    -						</html></content>
    -					</section>
    -
    -					<section id="bind-values">
    -					    <title>Bind values and parameters</title>
    -						<content><html>
    -							<p>
    -								Bind values are used in SQL / JDBC for various reasons. Among the most obvious ones are:
    -							</p>
    -							<ul>
    -								<li>
    -									Protection against SQL injection. Instead of inlining values possibly originating from user input, you bind those values to your prepared statement and let the JDBC driver / database take care of handling security aspects.
    -								</li>
    -								<li>
    -									Increased speed. Advanced databases such as Oracle can keep execution plans of similar queries in a dedicated cache to prevent hard-parsing your query again and again. In many cases, the actual value of a bind variable does not influence the execution plan, hence it can be reused. Preparing a statement will thus be faster
    -								</li>
    -								<li>
    -									On a JDBC level, you can also reuse the SQL string and prepared statement object instead of constructing it again, as you can bind new values to the prepared statement. jOOQ currently does not cache prepared statements, internally.
    -								</li>
    -							</ul>
    -							
    -							<p>
    -								The following sections explain how you can introduce bind values in jOOQ, and how you can control the way they are rendered and bound to SQL.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -						    <section id="indexed-parameters">
    -							    <title>Indexed parameters</title>
    -								<content><html>
    -									<p>
    -										JDBC only knows indexed bind values. A typical example for using bind values with JDBC is this:
    -									</p>
    -									
    -</html><java><![CDATA[PreparedStatement stmt = connection.prepareStatement("SELECT * FROM BOOK WHERE ID = ? AND TITLE = ?");
    -
    -// bind values to the above statement for appropriate indexes 
    -stmt.setInt(1, 5);
    -stmt.setString(2, "Animal Farm");
    -stmm.executeQuery();]]></java><html>
    -
    -									<p>
    -										With dynamic SQL, keeping track of the number of question marks and their corresponding index may turn out to be hard. jOOQ abstracts this and lets you provide the bind value right where it is needed. A trivial example is this:
    -									</p>
    -									
    -</html><java><![CDATA[create.select().from(BOOK).where(BOOK.ID.equal(5)).and(BOOK.TITLE.equal("Animal Farm"));
    -
    -// This notation is in fact a short form for the equivalent:
    -create.select().from(BOOK).where(BOOK.ID.equal(val(5))).and(BOOK.TITLE.equal(val("Animal Farm")));]]></java><html>
    -
    -									<p>
    -										Note the using of <reference class="org.jooq.impl.DSL" anchor="#val(java.lang.Object)" title="DSL.val()"/> to explicitly create an indexed bind value. You don't have to worry about that index. When the query is <reference id="sql-rendering" title="rendered"/>, each bind value will render a question mark. When the query <reference id="variable-binding" title="binds its variables"/>, each bind value will generate the appropriate bind value index. 
    -									</p>
    -									
    -									<h3>Extract bind values from a query</h3>
    -									<p>
    -										Should you decide to run the above query outside of jOOQ, using your own <reference class="java.sql.PreparedStatement"/>, you can do so as follows:
    -									</p>
    -									
    -</html><java><![CDATA[Select<?> select = create.select().from(BOOK).where(BOOK.ID.equal(5)).and(BOOK.TITLE.equal("Animal Farm"));
    -
    -// Render the SQL statement:
    -String sql = select.getSQL();
    -assertEquals("SELECT * FROM BOOK WHERE ID = ? AND TITLE = ?", sql);
    -
    -// Get the bind values:
    -List<Object> values = select.getBindValues();
    -assertEquals(2, values.size());
    -assertEquals(5, values.get(0));
    -assertEquals("Animal Farm", values.get(1));]]></java><html>
    -
    -									<p>
    -										You can also extract specific bind values by index from a query, if you wish to modify their underlying value after creating a query. This can be achieved as such:
    -									</p>
    -
    -</html><java><![CDATA[Select<?> select = create.select().from(BOOK).where(BOOK.ID.equal(5)).and(BOOK.TITLE.equal("Animal Farm"));
    -Param<?> param = select.getParam("2");
    -
    -// You could now modify the Query's underlying bind value:
    -if ("Animal Farm".equals(param.getValue())) {
    -    param.setConverted("1984");
    -}]]></java><html>
    -
    -									<p>
    -										For more details about jOOQ's internals, see the manual's section about <reference id="queryparts" title="QueryParts"/>.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -						    <section id="named-parameters">
    -							    <title>Named parameters</title>
    -								<content><html>
    -									<p>
    -										Some SQL access abstractions that are built on top of JDBC, or some that bypass JDBC may support named parameters. jOOQ allows you to give names to your parameters as well, although those names are not rendered to SQL strings by default. Here is an example of how to create named parameters using the <reference class="org.jooq.Param"/> type:
    -									</p>
    -
    -</html><java><![CDATA[// Create a query with a named parameter. You can then use that name for accessing the parameter again
    -Query query1 = create.select().from(AUTHOR).where(LAST_NAME.equal(param("lastName", "Poe")));
    -Param<?> param1 = query.getParam("lastName");
    -
    -// Or, keep a reference to the typed parameter in order not to lose the <T> type information:
    -Param<String> param2 = param("lastName", "Poe");
    -Query query2 = create.select().from(AUTHOR).where(LAST_NAME.equal(param2));
    -
    -// You can now change the bind value directly on the Param reference:
    -param2.setValue("Orwell");]]></java><html>
    -
    -									<p>
    -										The <reference class="org.jooq.Query"/> interface also allows for setting new bind values directly, without accessing the Param type:
    -									</p>
    -
    -</html><java><![CDATA[Query query1 = create.select().from(AUTHOR).where(LAST_NAME.equal("Poe"));
    -query1.bind(1, "Orwell");
    -
    -// Or, with named parameters
    -Query query2 = create.select().from(AUTHOR).where(LAST_NAME.equal(param("lastName", "Poe")));
    -query2.bind("lastName", "Orwell");]]></java><html>
    -
    -									<p>
    -										In order to actually render named parameter names in generated SQL, use the <reference class="org.jooq.DSLContext" anchor="#renderNamedParams(org.jooq.QueryPart)" title="DSLContext.renderNamedParams()"/> method:
    -									</p>
    -
    -</html><code-pair>
    -<java><![CDATA[create.renderNamedParams(
    -    create.select()
    -          .from(AUTHOR)
    -          .where(LAST_NAME.equal(
    -                 param("lastName", "Poe"))));]]></java>
    -<sql><![CDATA[-- The named bind variable can be rendered
    -
    -SELECT *
    -FROM AUTHOR
    -WHERE LAST_NAME = :lastName]]></sql>
    -</code-pair>
    -								</content>
    -							</section>
    -
    -						    <section id="inlined-parameters">
    -							    <title>Inlined parameters</title>
    -								<content><html>
    -									<p>
    -										Sometimes, you may wish to avoid rendering bind variables while still using custom values in SQL. jOOQ refers to that as "inlined" bind values. When bind values are inlined, they render the actual value in SQL rather than a JDBC question mark. Bind value inlining can be achieved in two ways:
    -									</p>
    -									<ul>
    -										<li>
    -											By using the <reference id="custom-settings" title="Settings"/> and setting the <reference class="org.jooq.conf.StatementType"/> to STATIC_STATEMENT. This will inline all bind values for SQL statements rendered from such a Configuration.
    -										</li>
    -										<li>
    -											By using <reference class="org.jooq.impl.DSL" anchor="#inline(java.lang.Object)" title="DSL.inline()"/> methods.
    -										</li>
    -									</ul>
    -									<p>
    -										In both cases, your inlined bind values will be properly escaped to avoid SQL syntax errors and SQL injection. Some examples:
    -									</p>
    -
    -</html><java><![CDATA[
    -// Use dedicated calls to inline() in order to specify
    -// single bind values to be rendered as inline values
    -// --------------------------------------------------
    -create.select()
    -      .from(AUTHOR)
    -      .where(LAST_NAME.equal(inline("Poe")));
    -
    -// Or render the whole query with inlined values
    -// --------------------------------------------------
    -Settings settings = new Settings()
    -    .withStatementType(StatementType.STATIC_STATEMENT);
    -
    -// Add the settings to the Configuration
    -DSLContext create = DSL.using(connection, SQLDialect.ORACLE, settings);
    -
    -// Run queries that omit rendering schema names
    -create.select()
    -      .from(AUTHOR)
    -      .where(LAST_NAME.equal("Poe"));]]></java>
    -								</content>
    -							</section>
    -
    -						    <section id="sql-injection-and-plain-sql-queryparts">
    -							    <title>SQL injection and plain SQL QueryParts</title>
    -								<content><html>
    -									<p>
    -										Special care needs to be taken when using <reference id="plain-sql" title="plain SQL QueryParts"/>. While jOOQ's API allows you to specify bind values for use with plain SQL, you're not forced to do that. For instance, both of the following queries will lead to the same, valid result:
    -									</p>
    -									
    -</html><java><![CDATA[// This query will use bind values, internally.
    -create.fetch("SELECT * FROM BOOK WHERE ID = ? AND TITLE = ?", 5 "Animal Farm");
    -
    -// This query will not use bind values, internally.
    -create.fetch("SELECT * FROM BOOK WHERE ID = 5 AND TITLE = 'Animal Farm'");]]></java><html>
    -
    -									<p>
    -										All methods in the jOOQ API that allow for plain (unescaped, untreated) SQL contain a warning message in their relevant Javadoc, to remind you of the risk of SQL injection in what is otherwise a SQL-injection-safe API.
    -									</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -					<section id="queryparts">
    -					    <title>QueryParts</title>
    -						<content><html>
    -							<p>
    -								A <reference class="org.jooq.Query" /> and all its contained objects is a <reference class="org.jooq.QueryPart" />. QueryParts essentially provide this functionality:
    -							</p>
    -							<ul>
    -								<li>they can <reference id="sql-rendering" title="render SQL"/> using the <reference class="org.jooq.QueryPartInternal" anchor="#toSQL(org.jooq.RenderContext)" title="toSQL(RenderContext)"/> method</li>
    -								<li>they can <reference id="variable-binding" title="bind variables"/> using the <reference class="org.jooq.QueryPartInternal" anchor="#bind(org.jooq.BindContext)" title="bind(BindContext)"/> method</li>
    -							</ul>
    -
    -							<p>
    -								Both of these methods are contained in jOOQ's internal API's <reference class="org.jooq.QueryPartInternal"/>, which is internally implemented by every QueryPart.
    -							</p>
    -
    -							<p>
    -								The following sections explain some more details about <reference id="sql-rendering" title="SQL rendering"/> and <reference id="variable-binding" title="variable binding"/>, as well as other implementation details about QueryParts in general.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -						    <section id="sql-rendering">
    -							    <title>SQL rendering</title>
    -								<content><html>
    -									<p>
    -										Every <reference class="org.jooq.QueryPart"/> must implement the <reference class="org.jooq.QueryPartInternal" anchor="#toSQL(org.jooq.RenderContext)" title="toSQL(RenderContext)"/> method to render its SQL string to a <reference class="org.jooq.RenderContext"/>. This RenderContext has two purposes:
    -									</p>
    -									<ul>
    -										<li>It provides some information about the "state" of SQL rendering.</li>
    -										<li>It provides a common API for constructing SQL strings on the context's internal <reference class="java.lang.StringBuilder"/></li>
    -									</ul>
    -									<p>
    -										An overview of the <reference class="org.jooq.RenderContext"/> API is given here:
    -									</p>
    -
    -</html><java><![CDATA[// These methods are useful for generating unique aliases within a RenderContext (and thus within a Query)
    -String peekAlias();
    -String nextAlias();
    -
    -// These methods return rendered SQL
    -String render();
    -String render(QueryPart part);
    -
    -// These methods allow for fluent appending of SQL to the RenderContext's internal StringBuilder
    -RenderContext keyword(String keyword);
    -RenderContext literal(String literal);
    -RenderContext sql(String sql);
    -RenderContext sql(char sql);
    -RenderContext sql(int sql);
    -RenderContext sql(QueryPart part);
    -
    -// These methods allow for controlling formatting of SQL, if the relevant Setting is active
    -RenderContext formatNewLine();
    -RenderContext formatSeparator();
    -RenderContext formatIndentStart();
    -RenderContext formatIndentStart(int indent);
    -RenderContext formatIndentLockStart();
    -RenderContext formatIndentEnd();
    -RenderContext formatIndentEnd(int indent);
    -RenderContext formatIndentLockEnd();
    -
    -// These methods control the RenderContext's internal state
    -boolean       inline();
    -RenderContext inline(boolean inline);
    -boolean       qualify();
    -RenderContext qualify(boolean qualify);
    -boolean       namedParams();
    -RenderContext namedParams(boolean renderNamedParams);
    -CastMode      castMode();
    -RenderContext castMode(CastMode mode);
    -Boolean       cast();
    -RenderContext castModeSome(SQLDialect... dialects);]]></java><html>
    -
    -									<p>
    -										The following additional methods are inherited from a common <reference class="org.jooq.Context"/>, which is shared among <reference class="org.jooq.RenderContext"/> and <reference class="org.jooq.BindContext"/>:
    -									</p>
    -
    -</html><java><![CDATA[// These methods indicate whether fields or tables are being declared (MY_TABLE AS MY_ALIAS) or referenced (MY_ALIAS)
    -boolean declareFields();
    -Context declareFields(boolean declareFields);
    -boolean declareTables();
    -Context declareTables(boolean declareTables);
    -
    -// These methods indicate whether a top-level query is being rendered, or a subquery
    -boolean subquery();
    -Context subquery(boolean subquery);
    -
    -// These methods provide the bind value indices within the scope of the whole Context (and thus of the whole Query)
    -int nextIndex();
    -int peekIndex();]]></java><html>
    -
    -									<h3>An example of rendering SQL</h3>
    -								   	<p>
    -								   		A simple example can be provided by checking out jOOQ's internal representation of a (simplified) <reference id="comparison-predicate" title="CompareCondition"/>. It is used for any <reference class="org.jooq.Condition"/> comparing two fields as for example the <code>AUTHOR.ID = BOOK.AUTHOR_ID</code> condition here:
    -							   		</p>
    -							   		
    -</html><sql>-- [...]
    -FROM AUTHOR
    -JOIN BOOK ON AUTHOR.ID = BOOK.AUTHOR_ID
    --- [...]</sql><html>
    -
    -									<p>
    -										This is how jOOQ renders such a condition (simplified example):
    -									</p>
    -
    -</html><java><![CDATA[@Override
    -public final void toSQL(RenderContext context) {
    -    // The CompareCondition delegates rendering of the Fields to the Fields
    -    // themselves and connects them using the Condition's comparator operator:
    -    context.sql(field1)
    -           .sql(" ")
    -           .sql(comparator.toSQL())
    -           .sql(" ")
    -           .sql(field2);
    -}]]></java><html>
    -
    -									<p>
    -										See the manual's sections about <reference id="custom-queryparts" title="custom QueryParts"/> and <reference id="plain-sql-queryparts" title="plain SQL QueryParts"/> to learn about how to write your own query parts in order to extend jOOQ.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="pretty-printing">
    -								<title>Pretty printing SQL</title>
    -								<content><html>
    -									<p>
    -										As mentioned in the previous chapter about <reference id="sql-rendering" title="SQL rendering"/>, there are some elements in the <reference class="org.jooq.RenderContext"/> that are used for formatting / pretty-printing rendered SQL. In order to obtain pretty-printed SQL, just use the following <reference id="custom-settings" title="custom settings"/>: 
    -									</p>
    -	
    -	
    -</html><java><![CDATA[// Create a DSLContext that will render "formatted" SQL
    -DSLContext pretty = DSL.using(dialect, new Settings().withRenderFormatted(true));]]></java><html>
    -
    -									<p>
    -										And then, use the above DSLContext to render pretty-printed SQL:
    -									</p>
    -									
    -</html><code-pair>
    -<java><![CDATA[String sql = pretty.select(
    -                       AUTHOR.LAST_NAME, count().as("c"))
    -                   .from(BOOK)
    -                   .join(AUTHOR)
    -                   .on(BOOK.AUTHOR_ID.equal(AUTHOR.ID))
    -                   .where(BOOK.TITLE.notEqual("1984"))
    -                   .groupBy(AUTHOR.LAST_NAME)
    -                   .having(count().equal(2))
    -                   .getSQL();]]></java>
    -<sql><![CDATA[select 
    -  "TEST"."AUTHOR"."LAST_NAME", 
    -  count(*) "c"
    -from "TEST"."BOOK"
    -  join "TEST"."AUTHOR"
    -  on "TEST"."BOOK"."AUTHOR_ID" = "TEST"."AUTHOR"."ID"
    -where "TEST"."BOOK"."TITLE" <> '1984'
    -group by "TEST"."AUTHOR"."LAST_NAME"
    -having count(*) = 2]]></sql>
    -</code-pair><html>
    -
    -									<p>
    -										The section about <reference id="execute-listeners" title="ExecuteListeners"/> shows an example of how such pretty printing can be used to log readable SQL to the stdout.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -						    <section id="variable-binding">
    -							    <title>Variable binding</title>
    -								<content><html>
    -									<p>
    -										Every <reference class="org.jooq.QueryPart"/> must implement the <reference class="org.jooq.QueryPartInternal" anchor="#bind(org.jooq.BindContext)" title="bind(BindContext)"/> method. This BindContext has two purposes:
    -									</p>
    -									<ul>
    -										<li>It provides some information about the "state" of the variable binding in process.</li>
    -										<li>It provides a common API for binding values to the context's internal <reference class="java.sql.PreparedStatement"/></li>
    -									</ul>
    -									<p>
    -										An overview of the <reference class="org.jooq.RenderContext"/> API is given here:
    -									</p>
    -
    -</html><java><![CDATA[// This method provides access to the PreparedStatement to which bind values are bound
    -PreparedStatement statement();
    -
    -// These methods provide convenience to delegate variable binding
    -BindContext bind(QueryPart part) throws DataAccessException;
    -BindContext bind(Collection<? extends QueryPart> parts) throws DataAccessException;
    -BindContext bind(QueryPart[] parts) throws DataAccessException;
    -
    -// These methods perform the actual variable binding
    -BindContext bindValue(Object value, Class<?> type) throws DataAccessException;
    -BindContext bindValues(Object... values) throws DataAccessException;]]></java><html>
    -
    -									<p>
    -										Some additional methods are inherited from a common <reference class="org.jooq.Context"/>, which is shared among <reference class="org.jooq.RenderContext"/> and <reference class="org.jooq.BindContext"/>. Details are documented in the previous chapter about <reference id="sql-rendering" title="SQL rendering"/>
    -									</p>
    -
    -									<h3>An example of binding values to SQL</h3>
    -								   	<p>
    -								   		A simple example can be provided by checking out jOOQ's internal representation of a (simplified) <reference id="comparison-predicate" title="CompareCondition"/>. It is used for any <reference class="org.jooq.Condition"/> comparing two fields as for example the <code>AUTHOR.ID = BOOK.AUTHOR_ID</code> condition here:
    -							   		</p>
    -							   		
    -</html><sql>-- [...]
    -WHERE AUTHOR.ID = ?
    --- [...]</sql><html>
    -
    -									<p>
    -										This is how jOOQ binds values on such a condition:
    -									</p>
    -</html><java><![CDATA[@Override
    -public final void bind(BindContext context) throws DataAccessException {
    -    // The CompareCondition itself does not bind any variables.
    -    // But the two fields involved in the condition might do so...
    -    context.bind(field1).bind(field2);
    -}]]></java><html>
    -
    -									<p>
    -										See the manual's sections about <reference id="custom-queryparts" title="custom QueryParts"/> and <reference id="plain-sql-queryparts" title="plain SQL QueryParts"/> to learn about how to write your own query parts in order to extend jOOQ.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -						    <section id="custom-queryparts">
    -							    <title>Extend jOOQ with custom types</title>
    -								<content><html>
    -									<p>
    -										If a SQL clause is too complex to express with jOOQ, you can extend either one of the following types for use directly in a jOOQ query:
    -									</p>
    -									
    -</html><java><![CDATA[public abstract class CustomField<T> extends AbstractField<T> {}
    -public abstract class CustomCondition extends AbstractCondition {}
    -public abstract class CustomTable<R extends TableRecord<R>> extends TableImpl<R> {}
    -public abstract class CustomRecord<R extends TableRecord<R>> extends TableRecordImpl<R> {}]]></java><html>
    -
    -									<p>
    -										These classes are declared public and covered by jOOQ's integration tests. When you extend these classes, you will have to provide your own implementations for the <reference id="queryparts" title="QueryParts'"/> <reference id="sql-rendering" title="toSQL()"/> and <reference id="variable-binding" title="bind()"/> methods, as discussed before:
    -									</p>
    -									
    -</html><java><![CDATA[// This method must produce valid SQL. If your QueryPart contains other QueryParts, you may delegate SQL generation to them
    -// in the correct order, passing the render context.
    -//
    -// If context.inline() is true, you must inline all bind variables
    -// If context.inline() is false, you must generate ? for your bind variables
    -public void toSQL(RenderContext context);
    -
    -// This method must bind all bind variables to a PreparedStatement. If your QueryPart contains other QueryParts, $
    -// you may delegate variable binding to them in the correct order, passing the bind context.
    -//
    -// Every QueryPart must ensure, that it starts binding its variables at context.nextIndex().
    -public void bind(BindContext context) throws DataAccessException;]]></java><html>
    -
    -									<p>
    -										The above contract may be a bit tricky to understand at first. The best thing is to check out jOOQ source code and have a look at a couple of QueryParts, to see how it's done. Here's an example <reference class="org.jooq.impl.CustomField"/> showing how to create a field multiplying another field by 2
    -									</p>
    -									
    -</html><java><![CDATA[// Create an anonymous CustomField, initialised with BOOK.ID arguments
    -final Field<Integer> IDx2 = new CustomField<Integer>(BOOK.ID.getName(), BOOK.ID.getDataType()) {
    -    @Override
    -    public void toSQL(RenderContext context) {
    -    
    -        // In inline mode, render the multiplication directly
    -        if (context.inline()) {
    -            context.sql(BOOK.ID).sql(" * 2");
    -        }
    -        
    -        // In non-inline mode, render a bind value
    -        else {
    -            context.sql(BOOK.ID).sql(" * ?");
    -        }
    -    }
    -
    -    @Override
    -    public void bind(BindContext context) {
    -        try {
    -        
    -            // Manually bind the value 2
    -            context.statement().setInt(context.nextIndex(), 2);
    -            
    -            // Alternatively, you could also write:
    -            // context.bind(DSL.val(2));
    -        }
    -        catch (SQLException e) {
    -            throw translate(getSQL(), e);
    -        }
    -    }
    -};
    -
    -// Use the above field in a SQL statement:
    -create.select(IDx2).from(BOOK);]]></java>    								
    -								</content>
    -							</section>
    -							
    -						    <section id="plain-sql-queryparts">
    -							    <title>Plain SQL QueryParts</title>
    -								<content><html>
    -									<p>
    -										If you don't need the integration of rather complex QueryParts into jOOQ, then you might be safer using simple <reference id="plain-sql" title="Plain SQL"/> functionality, where you can provide jOOQ with a simple String representation of your embedded SQL. Plain SQL methods in jOOQ's API come in two flavours. 
    -									</p>
    -									<ul>
    -										<li><strong>method(String, Object...)</strong>: This is a method that accepts a SQL string and a list of bind values that are to be bound to the variables contained in the SQL string</li>
    -										<li><strong>method(String, QueryPart...)</strong>: This is a method that accepts a SQL string and a list of QueryParts that are "injected" at the position of their respective placeholders in the SQL string</li>
    -									</ul>
    -									<p>
    -										The above distinction is best explained using an example:
    -									</p>
    -									
    -</html><java><![CDATA[// Plain SQL using bind values. The value 5 is bound to the first variable, "Animal Farm" to the second variable:
    -create.selectFrom(BOOK).where("BOOK.ID = ? AND TITLE = ?", 5, "Animal Farm");
    -
    -// Plain SQL using placeholders (counting from zero). 
    -// The QueryPart "id" is substituted for the placeholder {0}, the QueryPart "title" for {1}
    -Field<Integer> id   = val(5);
    -Field<String> title = val("Animal Farm");
    -create.selectFrom(BOOK).where("BOOK.ID = {0} AND TITLE = {1}", id, title);]]></java><html>
    -
    -									<p>
    -										The above technique allows for creating rather complex SQL clauses that are currently not supported by jOOQ, without extending any of the <reference id="custom-queryparts" title="custom QueryParts"/> as indicated in the previous chapter.
    -									</p>									
    -								</html></content>
    -							</section>
    -
    -						    <section id="serializability">
    -							    <title>Serializability</title>
    -								<content><html>
    -									<p>
    -										The only transient, non-serializable element in any jOOQ object is the <reference id="dsl-context" title="Configuration's"/> underlying <reference class="java.sql.Connection"/>. When you want to execute queries after de-serialisation, or when you want to store/refresh/delete <reference id="crud-with-updatablerecords" title="Updatable Records"/>, you may have to "re-attach" them to a Configuration
    -									</p>
    -
    -</html><java><![CDATA[// Deserialise a SELECT statement
    -ObjectInputStream in = new ObjectInputStream(...);
    -Select<?> select = (Select<?>) in.readObject();
    -
    -// This will throw a DetachedException:
    -select.execute();
    -
    -// In order to execute the above select, attach it first
    -DSLContext create = DSL.using(connection, SQLDialect.ORACLE);
    -create.attach(select);]]></java><html>
    -
    -									<h3>Automatically attaching QueryParts</h3>
    -									<p>
    -										Another way of attaching QueryParts automatically, or rather providing them with a new <reference class="java.sql.Connection"/> at will, is to hook into the <reference id="execute-listeners" title="Execute Listener support"/>. More details about this can be found in the manual's chapter about <reference id="execute-listeners" title="ExecuteListeners"/>
    -									</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -					
    -					<section id="scala-sql-building">
    -						<title>SQL building in Scala</title>
    -						<content><html>
    -							<p>
    -								jOOQ-Scala is a maven module used for leveraging some advanced Scala features for those users that wish to use jOOQ with Scala.
    -							</p>
    -							
    -							<h3>Using Scala's implicit defs to allow for operator overloading</h3>
    -							<p>
    -								The most obvious Scala feature to use in jOOQ are implicit defs for implicit conversions in order to enhance the <reference class="org.jooq.Field"/> type with SQL-esque operators. 
    -							</p>
    -							<p>
    -								The following depicts a trait which wraps all fields:
    -							</p>
    -							
    -</html><scala><![CDATA[/**
    - * A Scala-esque representation of {@link org.jooq.Field}, adding overloaded
    - * operators for common jOOQ operations to arbitrary fields
    - */
    -trait SAnyField[T] extends Field[T] {
    -
    -    // String operations
    -    // -----------------
    -
    -    def ||(value : String)            : Field[String]
    -    def ||(value : Field[_])          : Field[String]
    -
    -    // Comparison predicates
    -    // ---------------------
    -
    -    def ===(value : T)                : Condition
    -    def ===(value : Field[T])         : Condition
    -
    -    def !==(value : T)                : Condition
    -    def !==(value : Field[T])         : Condition
    -
    -    def <>(value : T)                 : Condition
    -    def <>(value : Field[T])          : Condition
    -
    -    def >(value : T)                  : Condition
    -    def >(value : Field[T])           : Condition
    -
    -    def >=(value : T)                 : Condition
    -    def >=(value : Field[T])          : Condition
    -
    -    def <(value : T)                  : Condition
    -    def <(value : Field[T])           : Condition
    -
    -    def <=(value : T)                 : Condition
    -    def <=(value : Field[T])          : Condition
    -
    -    def <=>(value : T)                : Condition
    -    def <=>(value : Field[T])         : Condition
    -}]]></scala><html>
    -
    -							<p>
    -								The following depicts a trait which wraps numeric fields:
    -							</p>
    -							
    -</html><scala><![CDATA[/**
    - * A Scala-esque representation of {@link org.jooq.Field}, adding overloaded
    - * operators for common jOOQ operations to numeric fields
    - */
    -trait SNumberField[T <: Number] extends SAnyField[T] {
    -
    -    // Arithmetic operations
    -    // ---------------------
    -
    -    def unary_-                       : Field[T]
    -
    -    def +(value : Number)             : Field[T]
    -    def +(value : Field[_ <: Number]) : Field[T]
    -
    -    def -(value : Number)             : Field[T]
    -    def -(value : Field[_ <: Number]) : Field[T]
    -
    -    def *(value : Number)             : Field[T]
    -    def *(value : Field[_ <: Number]) : Field[T]
    -
    -    def /(value : Number)             : Field[T]
    -    def /(value : Field[_ <: Number]) : Field[T]
    -
    -    def %(value : Number)             : Field[T]
    -    def %(value : Field[_ <: Number]) : Field[T]
    -
    -    // Bitwise operations
    -    // ------------------
    -
    -    def unary_~                       : Field[T]
    -
    -    def &(value : T)                  : Field[T]
    -    def &(value : Field[T])           : Field[T]
    -
    -    def |(value : T)                  : Field[T]
    -    def |(value : Field[T])           : Field[T]
    -
    -    def ^(value : T)                  : Field[T]
    -    def ^(value : Field[T])           : Field[T]
    -
    -    def <<(value : T)                 : Field[T]
    -    def <<(value : Field[T])          : Field[T]
    -
    -    def >>(value : T)                 : Field[T]
    -    def >>(value : Field[T])          : Field[T]
    -}]]></scala><html>
    -
    -							<p>
    -								An example query using such overloaded operators would then look like this:
    -							</p>
    -							
    -</html><scala><![CDATA[select (
    -  T_BOOK.ID * T_BOOK.AUTHOR_ID,
    -  T_BOOK.ID + T_BOOK.AUTHOR_ID * 3 + 4,
    -  T_BOOK.TITLE || " abc" || " xy")
    -from T_BOOK
    -leftOuterJoin (
    -  select (x.ID, x.YEAR_OF_BIRTH)
    -  from x
    -  limit 1
    -  asTable x.getName()
    -)
    -on T_BOOK.AUTHOR_ID === x.ID
    -where (T_BOOK.ID <> 2)
    -or (T_BOOK.TITLE in ("O Alquimista", "Brida"))
    -fetch]]></scala><html>
    -
    -							<h3>Scala 2.10 Macros</h3>
    -							<p>
    -								This feature is still being experimented with. With Scala Macros, it might be possible to inline a true SQL dialect into the Scala syntax, backed by the jOOQ API. Stay tuned!
    -							</p>
    -						</html></content>
    -					</section>
    -				</sections>
    -			</section>
    -
    -			<section id="sql-execution">
    -				<title>SQL execution</title>
    -				<content><html>
    -					<p>
    -						In a previous section of the manual, we've seen how jOOQ can be used to <reference id="sql-building" title="build SQL"/> that can be executed with any API including JDBC or ... jOOQ. This section of the manual deals with various means of actually executing SQL with jOOQ.
    -					</p>
    -					
    -					<h3>SQL execution with JDBC</h3>
    -					<p>
    -						JDBC calls executable objects "<reference class="java.sql.Statement"/>". It distinguishes between three types of statements:
    -					</p>
    -					<ul>
    -						<li><reference class="java.sql.Statement"/>, or "static statement": This statement type is used for any arbitrary type of SQL statement. It is particularly useful with <reference id="inlined-parameters" title="inlined parameters"/></li>
    -						<li><reference class="java.sql.PreparedStatement"/>: This statement type is used for any arbitrary type of SQL statement. It is particularly useful with <reference id="indexed-parameters" title="indexed parameters"/> (note that JDBC does not support <reference id="named-parameters" title="named parameters"/>)</li>
    -						<li><reference class="java.sql.CallableStatement"/>: This statement type is used for SQL statements that are "called" rather than "executed". In particular, this includes calls to <reference id="stored-procedures" title="stored procedures"/>. Callable statements can register OUT parameters</li>
    -					</ul>
    -					<p>
    -						Today, the JDBC API may look weird to users being used to object-oriented design. While statements hide a lot of SQL dialect-specific implementation details quite well, they assume a lot of knowledge about the internal state of a statement. For instance, you can use the <reference class="java.sql.PreparedStatement" anchor="#addBatch()" title="PreparedStatement.addBatch()"/> method, to add a the prepared statement being created to an "internal list" of batch statements. Instead of returning a new type, this method forces user to reflect on the prepared statement's internal state or "mode".
    -					</p>
    -					
    -					<h3>jOOQ is wrapping JDBC</h3>
    -					<p>						
    -						These things are abstracted away by jOOQ, which exposes such concepts in a more object-oriented way. For more details about jOOQ's batch query execution, see the manual's section about <reference id="batch-execution" title="batch execution"/>.
    -					</p> 
    -					<p>
    -						The following sections of this manual will show how jOOQ is wrapping JDBC for SQL execution
    -					</p>
    -				</html></content>
    -
    -				<sections>
    -					<section id="comparison-with-jdbc">
    -						<title>Comparison between jOOQ and JDBC</title>
    -						<content><html>
    -							<h3>Similarities with JDBC</h3>
    -							<p>
    -								Even if there are <reference id="query-vs-resultquery" title="two general types of Query"/>, there are a lot of similarities between JDBC and jOOQ. Just to name a few:
    -							</p>
    -							<ul>
    -								<li>Both APIs return the number of affected records in non-result queries. JDBC: <reference class="java.sql.Statement" anchor="#executeUpdate(java.lang.String)" title="Statement.executeUpdate()"/>, jOOQ: <reference class="org.jooq.Query" anchor="#execute()" title="Query.execute()"/></li>
    -								<li>Both APIs return a scrollable result set type from result queries. JDBC: <reference class="java.sql.ResultSet"/>, jOOQ: <reference class="org.jooq.Result"/></li>
    -							</ul>
    -							
    -							<h3>Differences to JDBC</h3>
    -							<p>
    -								Some of the most important differences between JDBC and jOOQ are listed here:
    -							</p>
    -							<ul>
    -								<li><reference id="query-vs-resultquery" title="Query vs. ResultQuery"/>: JDBC does not formally distinguish between queries that can return results, and queries that cannot. The same API is used for both. This greatly reduces the possibility for <reference id="fetching" title="fetching convenience methods"/></li>
    -								<li><reference id="exception-handling" title="Exception handling"/>: While SQL uses the checked <reference class="java.sql.SQLException"/>, jOOQ wraps all exceptions in an unchecked <reference class="org.jooq.exception.DataAccessException"/></li>
    -								<li><reference class="org.jooq.Result"/>: Unlike its JDBC counter-part, this type implements <reference class="java.util.List"/> and is fully loaded into Java memory, freeing resources as early as possible. Just like statements, this means that users don't have to deal with a "weird" internal result set state.</li>
    -								<li><reference class="org.jooq.Cursor"/>: If you want more fine-grained control over how many records are fetched into memory at once, you can still do that using jOOQ's <reference id="lazy-fetching" title="lazy fetching"/> feature</li>
    -								<li><reference id="statement-type" title="Statement type"/>: jOOQ does not formally distinguish between static statements and prepared statements. By default, all statements are prepared statements in jOOQ, internally. Executing a statement as a static statement can be done simply using a <reference id="custom-settings" title="custom settings flag"/></li>
    -								<li><reference id="reusing-statements" title="Closing Statements"/>: JDBC keeps open resources even if they are already consumed. With JDBC, there is a lot of verbosity around safely closing resources. In jOOQ, resources are closed after consumption, by default. If you want to keep them open after consumption, you have to explicitly say so.</li>
    -                                <li><reference id="jdbc-flags" title="JDBC flags"/>: JDBC execution flags and modes are not modified. They can be set fluently on a <reference id="query-vs-resultquery" title="Query"/></li>
    -							</ul>
    -						</html></content>
    -					</section>
    -				    
    -				    <section id="query-vs-resultquery">
    -						<title>Query vs. ResultQuery</title>
    -						<content><html>
    -							<p>
    -								Unlike JDBC, jOOQ has a lot of knowledge about a SQL query's structure and internals (see the manual's section about <reference id="sql-building" title="SQL building"/>). Hence, jOOQ distinguishes between these two fundamental types of queries. While every <reference class="org.jooq.Query"/> can be executed, only <reference class="org.jooq.ResultQuery"/> can return results (see the manual's section about <reference id="fetching" title="fetching"/> to learn more about fetching results). With plain SQL, the distinction can be made clear most easily:
    -							</p>
    -							
    -</html><java><![CDATA[// Create a Query object and execute it:
    -Query query = create.query("DELETE FROM BOOK");
    -query.execute();
    -
    -// Create a ResultQuery object and execute it, fetching results:
    -ResultQuery<Record> resultQuery = create.resultQuery("SELECT * FROM BOOK");
    -Result<Record> resultQuery.fetch();]]></java>
    -						</content>
    -					</section>
    -
    -				    <section id="fetching">
    -						<title>Fetching</title>
    -						<content><html>
    -							<p>
    -								Fetching is something that has been completely neglegted by JDBC and also by various other database abstraction libraries. Fetching is much more than just looping or listing records or mapped objects. There are so many ways you may want to fetch data from a database, it should be considered a first-class feature of any database abstraction API. Just to name a few, here are some of jOOQ's fetching modes:
    -							</p>
    -							<ul>
    -								<li><reference id="record-vs-tablerecord" title="Untyped vs. typed fetching"/>: Sometimes you care about the returned type of your records, sometimes (with arbitrary projections) you don't.</li>
    -								<li><reference id="arrays-maps-and-lists" title="Fetching arrays, maps, or lists"/>: Instead of letting you transform your result sets into any more suitable data type, a library should do that work for you.</li>
    -								<li><reference id="recordhandler" title="Fetching through handler callbacks"/>: This is an entirely different fetching paradigm. With Java 8's lambda expressions, this will become even more powerful.</li>
    -								<li><reference id="recordmapper" title="Fetching through mapper callbacks"/>: This is an entirely different fetching paradigm. With Java 8's lambda expressions, this will become even more powerful.</li>
    -								<li><reference id="pojos" title="Fetching custom POJOs"/>: This is what made Hibernate and JPA so strong. Automatic mapping of tables to custom POJOs.</li>
    -								<li><reference id="lazy-fetching" title="Lazy vs. eager fetching"/>: It should be easy to distinguish these two fetch modes.</li>
    -								<li><reference id="many-fetching" title="Fetching many results"/>: Some databases allow for returning many result sets from a single query. JDBC can handle this but it's very verbose. A list of results should be returned instead.</li>
    -								<li><reference id="later-fetching" title="Fetching data asynchronously"/>: Some queries take too long to execute to wait for their results. You should be able to spawn query execution in a separate process.</li>
    -							</ul>
    -							
    -							<h3>Convenience and how ResultQuery, Result, and Record share API</h3>
    -							<p>
    -								The term "fetch" is always reused in jOOQ when you can fetch data from the database. An <reference class="org.jooq.ResultQuery"/> provides many overloaded means of fetching data:
    -							</p>
    -							
    -							<h3>Various modes of fetching</h3>
    -							<p>
    -								These modes of fetching are also documented in subsequent sections of the manual
    -							</p>
    -							
    -</html><java><![CDATA[// The "standard" fetch
    -Result<R> fetch();    
    -
    -// The "standard" fetch when you know your query returns only one record
    -R fetchOne();
    -
    -// The "standard" fetch when you only want to fetch the first record
    -R fetchAny();
    -
    -// Create a "lazy" Cursor, that keeps an open underlying JDBC ResultSet
    -Cursor<R> fetchLazy();
    -Cursor<R> fetchLazy(int fetchSize);
    -
    -// Fetch several results at once
    -List<Result<Record>> fetchMany();
    -
    -// Fetch records into a custom callback
    -<H extends RecordHandler<R>> H fetchInto(H handler);
    -
    -// Map records using a custom callback
    -<E> List<E> fetch(RecordMapper<? super R, E> mapper);
    -
    -// Execute a ResultQuery with jOOQ, but return a JDBC ResultSet, not a jOOQ object
    -ResultSet fetchResultSet();]]></java><html>
    -							
    -							<h3>Fetch convenience</h3>
    -							<p>
    -								These means of fetching are also available from <reference class="org.jooq.Result"/> and <reference class="org.jooq.Record"/> APIs
    -							</p>
    -
    -</html><java><![CDATA[// These methods are convenience for fetching only a single field, 
    -// possibly converting results to another type
    -<T>    List<T> fetch(Field<T> field);
    -<T>    List<T> fetch(Field<?> field, Class<? extends T> type);
    -<T, U> List<U> fetch(Field<T> field, Converter<? super T, U> converter);
    -       List<?> fetch(int fieldIndex);
    -<T>    List<T> fetch(int fieldIndex, Class<? extends T> type);
    -<U>    List<U> fetch(int fieldIndex, Converter<?, U> converter);
    -       List<?> fetch(String fieldName);
    -<T>    List<T> fetch(String fieldName, Class<? extends T> type);
    -<U>    List<U> fetch(String fieldName, Converter<?, U> converter);
    -
    -// These methods are convenience for fetching only a single field, possibly converting results to another type
    -// Instead of returning lists, these return arrays
    -<T>    T[]      fetchArray(Field<T> field);
    -<T>    T[]      fetchArray(Field<?> field, Class<? extends T> type);
    -<T, U> U[]      fetchArray(Field<T> field, Converter<? super T, U> converter);
    -       Object[] fetchArray(int fieldIndex);
    -<T>    T[]      fetchArray(int fieldIndex, Class<? extends T> type);
    -<U>    U[]      fetchArray(int fieldIndex, Converter<?, U> converter);
    -       Object[] fetchArray(String fieldName);
    -<T>    T[]      fetchArray(String fieldName, Class<? extends T> type);
    -<U>    U[]      fetchArray(String fieldName, Converter<?, U> converter);
    -
    -// These methods are convenience for fetching only a single field from a single record, 
    -// possibly converting results to another type
    -<T>    T      fetchOne(Field<T> field);
    -<T>    T      fetchOne(Field<?> field, Class<? extends T> type);
    -<T, U> U      fetchOne(Field<T> field, Converter<? super T, U> converter);
    -       Object fetchOne(int fieldIndex);
    -<T>    T      fetchOne(int fieldIndex, Class<? extends T> type);
    -<U>    U      fetchOne(int fieldIndex, Converter<?, U> converter);
    -       Object fetchOne(String fieldName);
    -<T>    T      fetchOne(String fieldName, Class<? extends T> type);
    -<U>    U      fetchOne(String fieldName, Converter<?, U> converter);]]></java><html>
    -
    -							<h3>Fetch transformations</h3>
    -							<p>
    -								These means of fetching are also available from <reference class="org.jooq.Result"/> and <reference class="org.jooq.Record"/> APIs
    -							</p>
    -							
    -</html><java><![CDATA[// Transform your Records into arrays, Results into matrices
    -       Object[][] fetchArrays();
    -       Object[]   fetchOneArray();
    -       
    -// Reduce your Result object into maps
    -<K>    Map<K, R>      fetchMap(Field<K> key);
    -<K, V> Map<K, V>      fetchMap(Field<K> key, Field<V> value);
    -<K, E> Map<K, E>      fetchMap(Field<K> key, Class<E> value);
    -       Map<Record, R> fetchMap(Field<?>[] key);
    -<E>    Map<Record, E> fetchMap(Field<?>[] key, Class<E> value);       
    -
    -// Transform your Result object into maps
    -       List<Map<String, Object>> fetchMaps();
    -       Map<String, Object>       fetchOneMap();
    -
    -// Transform your Result object into groups
    -<K>    Map<K, Result<R>>      fetchGroups(Field<K> key);
    -<K, V> Map<K, List<V>>        fetchGroups(Field<K> key, Field<V> value);
    -<K, E> Map<K, List<E>>        fetchGroups(Field<K> key, Class<E> value);
    -       Map<Record, Result<R>> fetchGroups(Field<?>[] key);
    -<E>    Map<Record, List<E>>   fetchGroups(Field<?>[] key, Class<E> value);
    -
    -// Transform your Records into custom POJOs
    -<E>    List<E> fetchInto(Class<? extends E> type);
    -
    -// Transform your records into another table type
    -<Z extends Record> Result<Z> fetchInto(Table<Z> table);]]></java><html>
    -
    -							<p>
    -								Note, that apart from the <reference class="org.jooq.ResultQuery" anchor="#fetchLazy()" title="fetchLazy()"/> methods, all fetch() methods will immediately close underlying JDBC result sets.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="record-vs-tablerecord">
    -								<title>Record vs. TableRecord</title>
    -								<content><html>
    -									<p>
    -										jOOQ understands that SQL is much more expressive than Java, when it comes to the declarative typing of <reference id="table-expressions" title="table expressions"/>. As a declarative language, SQL allows for creating ad-hoc row value expressions (records with indexed columns, or tuples) and records (records with named columns). In Java, this is not possible to the same extent. Yet, still, sometimes you wish to use strongly typed records, when you know that you're selecting only from a single table
    -									</p>
    -									
    -									<h3>Fetching strongly or weakly typed records</h3>
    -									<p>
    -										When fetching data only from a single table, the <reference id="table-expressions" title="table expression's"/> type is known to jOOQ if you use jOOQ's <reference id="code-generation" title="code generator"/> to generate <reference id="codegen-records" title="TableRecords"/> for your database tables. In order to fetch such strongly typed records, you will have to use the <reference id="select-statement" title="simple select API"/>:
    -									</p>
    -
    -</html><java><![CDATA[// Use the selectFrom() method:
    -BookRecord book = create.selectFrom(BOOK).where(BOOK.ID.equal(1)).fetchOne();
    -
    -// Typesafe field access is now possible:
    -System.out.println("Title       : " + book.getTitle());
    -System.out.println("Published in: " + book.getPublishedIn());]]></java><html>
    -									
    -									<p>
    -										When you use the <reference class="org.jooq.DSLContext" anchor="#selectFrom(org.jooq.Table)" title="DSLContext.selectFrom()"/> method, jOOQ will return the record type supplied with the argument table. Beware though, that you will no longer be able to use any clause that modifies the type of your <reference id="table-expressions" title="table expression"/>. This includes: 
    -									</p>
    -									<ul>
    -                   						<li><reference id="select-clause" title="The SELECT clause"/></li>
    -                   						<li><reference id="join-clause" title="The JOIN clause"/></li>
    -                   					</ul>		
    -								</html></content>
    -							</section>
    -
    -							<section id="record-n">
    -								<title>Record1 to Record{max-row-degree}</title>
    -								<content><html>
    -									<p>
    -										jOOQ's <reference id="row-value-expressions" title="row value expression (or tuple)"/> support has been explained earlier in this manual. It is useful for constructing row value expressions where they can be used in SQL. The same typesafety is also applied to records for degrees up to {max-row-degree}. To express this fact, <reference class="org.jooq.Record"/> is extended by <reference class="org.jooq.Record1"/> to <reference class="org.jooq.Record{max-row-degree}"/>. Apart from the fact that these extensions of the R type can be used throughout the <reference id="dsl-and-non-dsl" title="jOOQ DSL"/>, they also provide a useful API. Here is <reference class="org.jooq.Record2"/>, for instance: 
    -									</p>
    -
    -</html><java><![CDATA[public interface Record2<T1, T2> extends Record {
    -
    -    // Access fields and values as row value expressions
    -    Row2<T1, T2> fieldsRow();
    -    Row2<T1, T2> valuesRow();
    -
    -    // Access fields by index
    -    Field<T1> field1();
    -    Field<T2> field2();
    -
    -    // Access values by index
    -    T1 value1();
    -    T2 value2();
    -}]]></java><html>
    -
    -									<h3>Higher-degree records</h3>
    -									<p>
    -										jOOQ chose to explicitly support degrees up to {max-row-degree} to match Scala's typesafe tuple, function and product support. Unlike Scala, however, jOOQ also supports higher degrees without the additional typesafety. 
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="arrays-maps-and-lists">
    -								<title>Arrays, Maps and Lists</title>
    -								<content><html>
    -									<p>
    -										By default, jOOQ returns an <reference class="org.jooq.Result"/> object, which is essentially a <reference class="java.util.List"/> of <reference class="org.jooq.Record"/>. Often, you will find yourself wanting to transform this result object into a type that corresponds more to your specific needs. Or you just want to list all values of one specific column. Here are some examples to illustrate those use cases:
    -									</p>
    -									
    -</html><java><![CDATA[// Fetching only book titles (the two calls are equivalent):
    -List<String> titles1 = create.select().from(BOOK).fetch().getValues(BOOK.TITLE);
    -List<String> titles2 = create.select().from(BOOK).fetch(BOOK.TITLE);
    -String[]     titles3 = create.select().from(BOOK).fetchArray(BOOK.TITLE);
    -
    -// Fetching only book IDs, converted to Long
    -List<Long> ids1 = create.select().from(BOOK).fetch().getValues(BOOK.ID, Long.class);
    -List<Long> ids2 = create.select().from(BOOK).fetch(BOOK.ID, Long.class);
    -Long[]     ids3 = create.select().from(BOOK).fetchArray(BOOK.ID, Long.class);
    -
    -// Fetching book IDs and mapping each ID to their records or titles
    -Map<Integer, BookRecord> map1 = create.selectFrom(BOOK).fetch().intoMap(BOOK.ID);
    -Map<Integer, BookRecord> map2 = create.selectFrom(BOOK).fetchMap(BOOK.ID);
    -Map<Integer, String>     map3 = create.selectFrom(BOOK).fetch().intoMap(BOOK.ID, BOOK.TITLE);
    -Map<Integer, String>     map4 = create.selectFrom(BOOK).fetchMap(BOOK.ID, BOOK.TITLE);
    -
    -// Group by AUTHOR_ID and list all books written by any author:       
    -Map<Integer, Result<BookRecord>> group1 = create.selectFrom(BOOK).fetch().intoGroups(BOOK.AUTHOR_ID);
    -Map<Integer, Result<BookRecord>> group2 = create.selectFrom(BOOK).fetchGroups(BOOK.AUTHOR_ID);
    -Map<Integer, List<String>>       group3 = create.selectFrom(BOOK).fetch().intoGroups(BOOK.AUTHOR_ID, BOOK.TITLE);
    -Map<Integer, List<String>>       group4 = create.selectFrom(BOOK).fetchGroups(BOOK.AUTHOR_ID, BOOK.TITLE);]]></java><html>									
    -
    -									<p>
    -										Note that most of these convenience methods are available both through <reference class="org.jooq.ResultQuery"/> and <reference class="org.jooq.Result"/>, some are even available through <reference class="org.jooq.Record"/> as well.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="recordhandler">
    -								<title>RecordHandler</title>
    -								<content><html>
    -									<p>
    -										In a more functional operating mode, you might want to write callbacks that receive records from your select statement results in order to do some processing. This is a common data access pattern in Spring's JdbcTemplate, and it is also available in jOOQ. With jOOQ, you can implement your own <reference class="org.jooq.RecordHandler"/> classes and plug them into jOOQ's <reference class="org.jooq.ResultQuery"/>:
    -									</p>
    -									
    -</html><java><![CDATA[// Write callbacks to receive records from select statements
    -create.selectFrom(BOOK)
    -      .orderBy(BOOK.ID)
    -      .fetch()
    -      .into(new RecordHandler<BookRecord>() {
    -          @Override
    -          public void next(BookRecord book) {
    -              Util.doThingsWithBook(book);
    -          }
    -      });
    -      
    -// Or more concisely
    -create.selectFrom(BOOK)
    -      .orderBy(BOOK.ID)
    -      .fetchInto(new RecordHandler<BookRecord>() {...});
    -      
    -// Or even more concisely with Java 8's lambda expressions:
    -create.selectFrom(BOOK)
    -      .orderBy(BOOK.ID)
    -      .fetchInto(book -> { Util.doThingsWithBook(book); }; );
    -]]></java><html>
    -
    -									<p>
    -										See also the manual's section about the <reference id="recordmapper" title="RecordMapper"/>, which provides similar features
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="recordmapper">
    -								<title>RecordMapper</title>
    -								<content><html>
    -									<p>
    -										In a more functional operating mode, you might want to write callbacks that map records from your select statement results in order to do some processing. This is a common data access pattern in Spring's JdbcTemplate, and it is also available in jOOQ. With jOOQ, you can implement your own <reference class="org.jooq.RecordMapper"/> classes and plug them into jOOQ's <reference class="org.jooq.ResultQuery"/>:
    -									</p>
    -									
    -</html><java><![CDATA[// Write callbacks to receive records from select statements
    -List<Integer> ids =
    -create.selectFrom(BOOK)
    -      .orderBy(BOOK.ID)
    -      .fetch()
    -      .map(new RecordMapper<BookRecord, Integer>() {
    -          @Override
    -          public Integer map(BookRecord book) {
    -              return book.getId();
    -          }
    -      });
    -      
    -// Or more concisely
    -create.selectFrom(BOOK)
    -      .orderBy(BOOK.ID)
    -      .fetch(new RecordMapper<BookRecord, Integer>() {...});
    -      
    -// Or even more concisely with Java 8's lambda expressions:
    -create.selectFrom(BOOK)
    -      .orderBy(BOOK.ID)
    -      .fetch(book -> book.getId());
    -]]></java><html>
    -
    -                                    <p>
    -                                        Your custom <code>RecordMapper</code> types can be used automatically through jOOQ's <reference id="pojos" title="POJO mapping APIs"/>, by injecting a <reference id="pojos-with-recordmapper-provider" title="RecordMapperProvider"/> into your <reference id="dsl-context" title="Configuration"/>. 
    -                                    </p>
    -
    -									<p>
    -										See also the manual's section about the <reference id="recordhandler" title="RecordHandler"/>, which provides similar features
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="pojos">
    -								<title>POJOs</title>
    -								<content><html>
    -									<p>
    -										Fetching data in records is fine as long as your application is not really layered, or as long as you're still writing code in the DAO layer. But if you have a more advanced application architecture, you may not want to allow for jOOQ artefacts to leak into other layers. You may choose to write POJOs (Plain Old Java Objects) as your primary DTOs (Data Transfer Objects), without any dependencies on jOOQ's <reference class="org.jooq.Record"/> types, which may even potentially hold a reference to a <reference id="dsl-context" title="Configuration"/>, and thus a JDBC <reference class="java.sql.Connection"/>. Like Hibernate/JPA, jOOQ allows you to operate with POJOs. Unlike Hibernate/JPA, jOOQ does not "attach" those POJOs or create proxies with any magic in them.
    -									</p>
    -									<p>
    -										If you're using jOOQ's <reference id="code-generation" title="code generator"/>, you can configure it to <reference id="codegen-pojos" title="generate POJOs"/> for you, but you're not required to use those generated POJOs. You can use your own. See the manual's section about <reference id="pojos-with-recordmapper-provider" title="POJOs with custom RecordMappers"/> to see how to modify jOOQ's standard POJO mapping behaviour.
    -									</p>
    -									
    -									<h3>Using JPA-annotated POJOs</h3>									
    -									<p>
    -										jOOQ tries to find JPA annotations on your POJO types. If it finds any, they are used as the primary source for mapping meta-information. Only the <reference class="javax.persistence.Column"/> annotation is used and understood by jOOQ. An example:
    -									</p>
    -
    -</html><java><![CDATA[// A JPA-annotated POJO class
    -public class MyBook {
    -  @Column(name = "ID")
    -  public int myId;
    -  
    -  @Column(name = "TITLE")
    -  public String myTitle;
    -}
    -
    -// The various "into()" methods allow for fetching records into your custom POJOs:
    -MyBook myBook        = create.select().from(BOOK).fetchAny().into(MyBook.class); 
    -List<MyBook> myBooks = create.select().from(BOOK).fetch().into(MyBook.class);
    -List<MyBook> myBooks = create.select().from(BOOK).fetchInto(MyBook.class);]]></java><html>									
    -									
    -									<p>
    -										Just as with any other JPA implementation, you can put the <reference class="javax.persistence.Column"/> annotation on any class member, including attributes, setters and getters. Please refer to the <reference class="org.jooq.Record" anchor="#into(java.lang.Class)" title="Record.into()"/> Javadoc for more details.
    -									</p>
    -									
    -									<h3>Using simple POJOs</h3>
    -									<p>
    -										If jOOQ does not find any JPA-annotations, columns are mapped to the "best-matching" constructor, attribute or setter. An example illustrates this:
    -									</p>
    -									
    -</html><java><![CDATA[// A "mutable" POJO class
    -public class MyBook1 {
    -  public int id;
    -  public String title;
    -}
    -
    -// The various "into()" methods allow for fetching records into your custom POJOs:
    -MyBook1 myBook        = create.select().from(BOOK).fetchAny().into(MyBook1.class); 
    -List<MyBook1> myBooks = create.select().from(BOOK).fetch().into(MyBook1.class);
    -List<MyBook1> myBooks = create.select().from(BOOK).fetchInto(MyBook1.class);]]></java><html>	
    -
    -									<p>
    -										Please refer to the <reference class="org.jooq.Record" anchor="#into(java.lang.Class)" title="Record.into()"/> Javadoc for more details.
    -									</p>
    -									
    -									<h3>Using "immutable" POJOs</h3>
    -									<p>
    -										If jOOQ does not find any default constructor, columns are mapped to the "best-matching" constructor. This allows for using "immutable" POJOs with jOOQ. An example illustrates this:
    -									</p>
    -									
    -</html><java><![CDATA[// An "immutable" POJO class
    -public class MyBook2 {
    -  public final int id;
    -  public final String title;
    -  
    -  public MyBook2(int id, String title) {
    -    this.id = id;
    -    this.title = title;
    -  }
    -}
    -
    -// With "immutable" POJO classes, there must be an exact match between projected fields and available constructors:
    -MyBook2 myBook        = create.select(BOOK.ID, BOOK.TITLE).from(BOOK).fetchAny().into(MyBook2.class); 
    -List<MyBook2> myBooks = create.select(BOOK.ID, BOOK.TITLE).from(BOOK).fetch().into(MyBook2.class);
    -List<MyBook2> myBooks = create.select(BOOK.ID, BOOK.TITLE).from(BOOK).fetchInto(MyBook2.class);
    -
    -// An "immutable" POJO class with a java.beans.ConstructorProperties annotation
    -public class MyBook3 {
    -  public final String title;
    -  public final int id;
    -  
    -  @ConstructorProperties({ "title", "id"})
    -  public MyBook2(String title, int id) {
    -    this.title = title;
    -    this.id = id;
    -  }
    -}
    -
    -// With annotated "immutable" POJO classes, there doesn't need to be an exact match between fields and constructor arguments.
    -// In the below cases, only BOOK.ID is really set onto the POJO, BOOK.TITLE remains null and BOOK.AUTHOR_ID is ignored
    -MyBook3 myBook        = create.select(BOOK.ID, BOOK.AUTHOR_ID).from(BOOK).fetchAny().into(MyBook3.class); 
    -List<MyBook3> myBooks = create.select(BOOK.ID, BOOK.AUTHOR_ID).from(BOOK).fetch().into(MyBook3.class);
    -List<MyBook3> myBooks = create.select(BOOK.ID, BOOK.AUTHOR_ID).from(BOOK).fetchInto(MyBook3.class);
    -]]></java><html>	
    -									
    -									<p>
    -										Please refer to the <reference class="org.jooq.Record" anchor="#into(java.lang.Class)" title="Record.into()"/> Javadoc for more details.
    -									</p>
    -
    -									<h3>Using proxyable types</h3>
    -									<p>
    -										jOOQ also allows for fetching data into abstract classes or interfaces, or in other words, "proxyable" types. This means that jOOQ will return a <reference class="java.util.HashMap"/> wrapped in a <reference class="java.lang.reflect.Proxy"/> implementing your custom type. An example of this is given here:
    -									</p>
    -									
    -</html><java><![CDATA[// A "proxyable" type
    -public interface MyBook3 {
    -  int getId(); 
    -  void setId(int id);
    -  
    -  String getTitle();
    -  void setTitle(String title);
    -}
    -
    -// The various "into()" methods allow for fetching records into your custom POJOs:
    -MyBook3 myBook        = create.select(BOOK.ID, BOOK.TITLE).from(BOOK).fetchAny().into(MyBook3.class); 
    -List<MyBook3> myBooks = create.select(BOOK.ID, BOOK.TITLE).from(BOOK).fetch().into(MyBook3.class);
    -List<MyBook3> myBooks = create.select(BOOK.ID, BOOK.TITLE).from(BOOK).fetchInto(MyBook3.class);]]></java><html>									
    -
    -									<p>
    -										Please refer to the <reference class="org.jooq.Record" anchor="#into(java.lang.Class)" title="Record.into()"/> Javadoc for more details.
    -									</p>
    -
    -									<h3>Loading POJOs back into Records to store them</h3>
    -									<p>
    -										The above examples show how to fetch data into your own custom POJOs / DTOs. When you have modified the data contained in POJOs, you probably want to store those modifications back to the database. An example of this is given here:
    -									</p>
    -
    -</html><java><![CDATA[// A "mutable" POJO class
    -public class MyBook {
    -  public int id;
    -  public String title;
    -}
    -
    -// Create a new POJO instance
    -MyBook myBook = new MyBook();
    -myBook.id = 10;
    -myBook.title = "Animal Farm";
    -
    -// Load a jOOQ-generated BookRecord from your POJO
    -BookRecord book = create.newRecord(BOOK, myBook); 
    -
    -// Insert it (implicitly)
    -book.store();
    -
    -// Insert it (explicitly)
    -create.executeInsert(book);
    -
    -// or update it (ID = 10)
    -create.executeUpdate(book);]]></java><html>
    -							
    -									<p>
    -										Note: Because of your manual setting of ID = 10, jOOQ's store() method will asume that you want to insert a new record. See the manual's section about <reference id="crud-with-updatablerecords" title="CRUD with UpdatableRecords"/> for more details on this.
    -									</p>
    -											
    -									<h3>Interaction with DAOs</h3>
    -									<p>
    -										If you're using jOOQ's <reference id="code-generation" title="code generator"/>, you can configure it to <reference id="codegen-daos" title="generate DAOs"/> for you. Those DAOs operate on <reference id="codegen-pojos" title="generated POJOs"/>. An example of using such a DAO is given here:
    -									</p>
    -
    -</html><java><![CDATA[// Initialise a Configuration
    -Configuration configuration = new DefaultConfiguration().set(connection).set(SQLDialect.ORACLE);
    -
    -// Initialise the DAO with the Configuration
    -BookDao bookDao = new BookDao(configuration);
    -
    -// Start using the DAO
    -Book book = bookDao.findById(5);
    -
    -// Modify and update the POJO
    -book.setTitle("1984");
    -book.setPublishedIn(1948);
    -bookDao.update(book);
    -
    -// Delete it again
    -bookDao.delete(book);]]></java><html>
    -									
    -									<h3>More complex data structures</h3>
    -									<p>
    -										jOOQ currently doesn't support more complex data structures, the way Hibernate/JPA attempt to map relational data onto POJOs. While future developments in this direction are not excluded, jOOQ claims that generic mapping strategies lead to an enormous additional complexity that only serves very few use cases. You are likely to find a solution using any of jOOQ's various <reference id="fetching" title="fetching modes"/>, with only little boiler-plate code on the client side.
    -									</p>
    -								</html></content>
    -							</section>
    -                            
    -                            <section id="pojos-with-recordmapper-provider">
    -                                <title>POJOs with RecordMappers</title>
    -                                <content><html>
    -                                    <p>
    -                                        In the previous sections we have seen how to create <reference id="recordmapper" title="RecordMapper"/> types to map jOOQ records onto arbitrary objects. We have also seen how jOOQ provides default algorithms to map jOOQ records onto <reference id="pojos" title="POJOs"/>. Your own custom domain model might be much more complex, but you want to avoid looking up the most appropriate <code>RecordMapper</code> every time you need one. For this, you can provide jOOQ's <reference id="dsl-context" title="Configuration"/> with your own implementation of the <reference class="org.jooq.RecordMapperProvider"/> interface. An example is given here:
    -                                    </p>
    -                                    
    -</html><java><![CDATA[DSL.using(new DefaultConfiguration()
    -   .set(connection)
    -   .set(SQLDialect.ORACLE)
    -   .set(
    -       new RecordMapperProvider() {
    -           @Override
    -           public <R extends Record, E> RecordMapper<R, E> provide(RecordType<R> recordType, Class<? extends E> type) {
    -
    -               // UUID mappers will always try to find the ID column
    -               if (type == UUID.class) {
    -                   return new RecordMapper<R, E>() {
    -                       @Override
    -                       public E map(R record) {
    -                           return (E) record.getValue("ID");
    -                       }
    -                   }
    -               }
    -               
    -               // Books might be joined with their authors, create a 1:1 mapping
    -               if (type == Book.class) {
    -                   return new BookMapper();
    -               }
    -
    -               // Fall back to jOOQ's DefaultRecordMapper, which maps records onto
    -               // POJOs using reflection.
    -               return new DefaultRecordMapper(recordType, type);           
    -           }
    -       }
    -   ))
    -   .selectFrom(BOOK)
    -   .orderBy(BOOK.ID)
    -   .fetchInto(UUID.class);]]></java><html>
    -
    -                                    <p>
    -                                        The above is a very simple example showing that you will have complete flexibility in how to override jOOQ's record to POJO mapping mechanisms.
    -                                    </p>
    -                                    
    -                                    <p>
    -                                        If you're looking into a generic, third-party mapping utility, have a look at <a href="http://modelmapper.org">ModelMapper</a>, or <a href="http://orika-mapper.github.io/orika-docs">Orika Mapper</a>, which can both be easily integrated with jOOQ.
    -                                    </p>
    -                                </html></content>
    -                            </section>
    -
    -							<section id="lazy-fetching">
    -								<title>Lazy fetching</title>
    -								<content><html>
    -									<p>
    -										Unlike JDBC's <reference class="java.sql.ResultSet"/>, jOOQ's <reference class="org.jooq.Result"/> does not represent an open database cursor with various fetch modes and scroll modes, that needs to be closed after usage. jOOQ's results are simple in-memory Java <reference class="java.util.List"/> objects, containing all of the result values. If your result sets are large, or if you have a lot of network latency, you may wish to fetch records one-by-one, or in small chunks. jOOQ supports a <reference class="org.jooq.Cursor"/> type for that purpose. In order to obtain such a reference, use the <reference class="org.jooq.ResultQuery" anchor="#fetchLazy()" title="ResultQuery.fetchLazy()"/> method. An example is given here:
    -									</p>
    -									
    -</html><java><![CDATA[// Obtain a Cursor reference:
    -Cursor<BookRecord> cursor = null;
    -
    -try {
    -    cursor = create.selectFrom(BOOK).fetchLazy();
    -
    -    // Cursor has similar methods as Iterator<R>
    -    while (cursor.hasNext()) {
    -        BookRecord book = cursor.fetchOne();
    -        
    -        Util.doThingsWithBook(book);
    -    }
    -}
    -
    -// Close the cursor and the cursor's underlying JDBC ResultSet
    -finally {
    -    if (cursor != null) {
    -        cursor.close();
    -    }
    -}]]></java><html>
    -
    -									<p>
    -										As a <reference class="org.jooq.Cursor"/> holds an internal reference to an open <reference class="java.sql.ResultSet"/>, it may need to be closed at the end of iteration. If a cursor is completely scrolled through, it will conveniently close the underlying ResultSet. However, you should not rely on that.
    -									</p>
    -									
    -									<h3>Cursors ship with all the other fetch features</h3>
    -									<p>
    -										Like <reference class="org.jooq.ResultQuery"/> or <reference class="org.jooq.Result"/>, <reference class="org.jooq.Cursor"/> gives access to all of the other fetch features that we've seen so far, i.e.
    -									</p>
    -									<ul>
    -										<li><reference id="record-vs-tablerecord" title="Strongly or weakly typed records"/>: Cursors are also typed with the &lt;R&gt; type, allowing to fetch custom, generated <reference class="org.jooq.TableRecord"/> or plain <reference class="org.jooq.Record"/> types.</li>
    -										<li><reference id="recordhandler" title="RecordHandler callbacks"/>: You can use your own <reference class="org.jooq.RecordHandler"/> callbacks to receive lazily fetched records.</li>
    -										<li><reference id="recordmapper" title="RecordMapper callbacks"/>: You can use your own <reference class="org.jooq.RecordMapper"/> callbacks to map lazily fetched records.</li>
    -										<li><reference id="pojos" title="POJOs"/>: You can fetch data into your own custom POJO types.</li>
    -									</ul>
    -								</html></content>
    -							</section>
    -
    -							<section id="many-fetching">
    -								<title>Many fetching</title>
    -								<content><html>
    -									<p>
    -										Many databases support returning several result sets, or cursors, from single queries. An example for this is Sybase ASE's sp_help command:
    -									</p>
    -</html><text><![CDATA[> sp_help 'author'
    -
    -+--------+-----+-----------+-------------+-------------------+
    -|Name    |Owner|Object_type|Object_status|Create_date        |
    -+--------+-----+-----------+-------------+-------------------+
    -|  author|dbo  |user table | -- none --  |Sep 22 2011 11:20PM|
    -+--------+-----+-----------+-------------+-------------------+
    -
    -+-------------+-------+------+----+-----+-----+
    -|Column_name  |Type   |Length|Prec|Scale|...  |
    -+-------------+-------+------+----+-----+-----+
    -|id           |int    |     4|NULL| NULL|    0|
    -|first_name   |varchar|    50|NULL| NULL|    1|
    -|last_name    |varchar|    50|NULL| NULL|    0|
    -|date_of_birth|date   |     4|NULL| NULL|    1|
    -|year_of_birth|int    |     4|NULL| NULL|    1|
    -+-------------+-------+------+----+-----+-----+]]></text><html>
    -
    -
    -									<p>
    -										The correct (and verbose) way to do this with JDBC is as follows:
    -									</p>
    -									
    -</html><java><![CDATA[ResultSet rs = statement.executeQuery();
    -
    -// Repeat until there are no more result sets
    -for (;;) {
    -
    -  // Empty the current result set
    -  while (rs.next()) {
    -    // [ .. do something with it .. ]
    -  }
    -
    -  // Get the next result set, if available
    -  if (statement.getMoreResults()) {
    -    rs = statement.getResultSet();
    -  }
    -  else {
    -    break;
    -  }
    -}
    -
    -// Be sure that all result sets are closed
    -statement.getMoreResults(Statement.CLOSE_ALL_RESULTS);
    -statement.close();]]></java><html>
    -
    -									<p>
    -										As previously discussed in the chapter about <reference id="comparison-with-jdbc" title="differences between jOOQ and JDBC"/>, jOOQ does not rely on an internal state of any JDBC object, which is "externalised" by Javadoc. Instead, it has a straight-forward API allowing you to do the above in a one-liner: 
    -									</p>
    -									
    -</html><java><![CDATA[// Get some information about the author table, its columns, keys, indexes, etc
    -List<Result<Record>> results = create.fetchMany("sp_help 'author'");]]></java><html>
    -
    -									<p>
    -										Using generics, the resulting structure is immediately clear.
    -									</p>									
    -								</html></content>
    -							</section>
    -
    -							<section id="later-fetching">
    -								<title>Later fetching</title>
    -								<content><html>
    -									<p>
    -										Some queries take very long to execute, yet they are not crucial for the continuation of the main program. For instance, you could be generating a complicated report in a Swing application, and while this report is being calculated in your database, you want to display a background progress bar, allowing the user to pursue some other work. This can be achived simply with jOOQ, by creating a <reference class="org.jooq.FutureResult"/>, a type that extends <reference class="java.util.concurrent.Future"/>. An example is given here:
    -									</p>
    -									
    -</html><java><![CDATA[// Spawn off this query in a separate process:
    -FutureResult<BookRecord> future = create.selectFrom(BOOK).where(... complex predicates ...).fetchLater();
    -
    -// This example actively waits for the result to be done
    -while (!future.isDone()) {
    -    progressBar.increment(1);
    -    Thread.sleep(50);
    -}
    -
    -// The result should be ready, now
    -Result<BookRecord> result = future.get();]]></java><html>
    -
    -									<p>
    -										Note, that instead of letting jOOQ spawn a new thread, you can also provide jOOQ with your own <reference class="java.util.concurrent.ExecutorService"/>:
    -									</p>
    -									
    -</html><java><![CDATA[// Spawn off this query in a separate process:
    -ExecutorService service = // [...]
    -FutureResult<BookRecord> future = create.selectFrom(BOOK).where(... complex predicates ...).fetchLater(service);]]></java>
    -
    -								</content>
    -							</section>
    -
    -							<section id="resultset-fetching">
    -								<title>ResultSet fetching</title>
    -								<content><html>
    -									<p>
    -										When interacting with legacy applications, you may prefer to have jOOQ return a <reference class="java.sql.ResultSet"/>, rather than jOOQ's own <reference class="org.jooq.Result"/> types. This can be done simply, in two ways:
    -									</p>
    -									
    -</html><java><![CDATA[// jOOQ's Cursor type exposes the underlying ResultSet:
    -ResultSet rs1 = create.selectFrom(BOOK).fetchLazy().resultSet();
    -
    -// But you can also directly access that ResultSet from ResultQuery:
    -ResultSet rs2 = create.selectFrom(BOOK).fetchResultSet();
    -
    -// Don't forget to close these, though!
    -rs1.close();
    -rs2.close();]]></java><html>
    -
    -									<h3>Transform jOOQ's Result into a JDBC ResultSet</h3>
    -									<p>
    -										Instead of operating on a JDBC ResultSet holding an open resource from your database, you can also let jOOQ's <reference class="org.jooq.Result"/> wrap itself in a <reference class="java.sql.ResultSet"/>. The advantage of this is that the so-created ResultSet has no open connection to the database. It is a completely in-memory ResultSet:								
    -									</p>
    -
    -</html><java><![CDATA[// Transform a jOOQ Result into a ResultSet
    -Result<BookRecord> result = create.selectFrom(BOOK).fetch();
    -ResultSet rs = result.intoResultSet();]]></java><html>
    -
    -									<h3>The inverse: Fetch data from a legacy ResultSet using jOOQ</h3>
    -									<p>
    -										The inverse of the above is possible too. Maybe, a legacy part of your application produces JDBC <reference class="java.sql.ResultSet"/>, and you want to turn them into a <reference class="org.jooq.Result"/>: 
    -									</p>
    -
    -</html><java><![CDATA[// Transform a JDBC ResultSet into a jOOQ Result
    -ResultSet rs = connection.createStatement().executeQuery("SELECT * FROM BOOK");
    -
    -// As a Result:
    -Result<Record> result = create.fetch(rs);
    -
    -// As a Cursor
    -Cursor<Record> cursor = create.fetchLazy(rs);]]></java><html>
    -
    -                                    <p>
    -                                        You can also tighten the interaction with jOOQ's data type system and <reference id="data-type-conversion" title="data type conversion"/> features, by passing the record type to the above fetch methods:
    -                                    </p>
    -                                    
    -</html><java><![CDATA[// Pass an array of types:
    -Result<Record> result = create.fetch    (rs, Integer.class, String.class);
    -Cursor<Record> result = create.fetchLazy(rs, Integer.class, String.class);
    -
    -// Pass an array of data types:
    -Result<Record> result = create.fetch    (rs, SQLDataType.INTEGER, SQLDataType.VARCHAR);
    -Cursor<Record> result = create.fetchLazy(rs, SQLDataType.INTEGER, SQLDataType.VARCHAR);
    -
    -// Pass an array of fields:
    -Result<Record> result = create.fetch    (rs, BOOK.ID, BOOK.TITLE);
    -Cursor<Record> result = create.fetchLazy(rs, BOOK.ID, BOOK.TITLE);]]></java><html>
    -
    -                                    <p>
    -                                        If supplied, the additional information is used to override the information obtained from the <reference class="java.sql.ResultSet" title="ResultSet"/>'s <reference class="java.sql.ResultSetMetaData"/> information.
    -                                    </p>                                    
    -								</html></content>
    -							</section>
    -
    -							<section id="data-type-conversion">
    -								<title>Data type conversion</title>
    -								<content><html>
    -									<p>
    -										Apart from a few extra features (<reference id="codegen-udts" title="user-defined types"/>), jOOQ only supports basic types as supported by the JDBC API. In your application, you may choose to transform these data types into your own ones, without writing too much boiler-plate code. This can be done using jOOQ's <reference class="org.jooq.Converter"/> types. A converter essentially allows for two-way conversion between two Java data types &lt;T&gt; and &lt;U&gt;. By convention, the &lt;T&gt; type corresponds to the type in your database whereas the &gt;U&gt; type corresponds to your own user type. The Converter API is given here:
    -									</p>
    -									
    -</html><java><![CDATA[public interface Converter<T, U> extends Serializable {
    -
    -    /**
    -     * Convert a database object to a user object
    -     */
    -    U from(T databaseObject);
    -
    -    /**
    -     * Convert a user object to a database object
    -     */
    -    T to(U userObject);
    -
    -    /**
    -     * The database type
    -     */
    -    Class<T> fromType();
    -
    -    /**
    -     * The user type
    -     */
    -    Class<U> toType();
    -}]]></java><html>
    -
    -									<p>
    -										Such a converter can be used in many parts of the jOOQ API. Some examples have been illustrated in the manual's section about <reference id="fetching" title="fetching"/>.
    -									</p>
    -									
    -									<h3>A Converter for GregorianCalendar</h3>
    -									<p>
    -										Here is a some more elaborate example involving a Converter for <reference class="java.util.GregorianCalendar"/>: 
    -									</p>
    -									
    -</html><java><![CDATA[// You may prefer Java Calendars over JDBC Timestamps
    -public class CalendarConverter implements Converter<Timestamp, GregorianCalendar> {
    -
    -    @Override
    -    public GregorianCalendar from(Timestamp databaseObject) {
    -        GregorianCalendar calendar = (GregorianCalendar) Calendar.getInstance();
    -        calendar.setTimeInMillis(databaseObject.getTime());
    -        return calendar;
    -    }
    -
    -    @Override
    -    public Timestamp to(GregorianCalendar userObject) {
    -        return new Timestamp(userObject.getTime().getTime());
    -    }
    -
    -    @Override
    -    public Class<Timestamp> fromType() {
    -        return Timestamp.class;
    -    }
    -
    -    @Override
    -    public Class<GregorianCalendar> toType() {
    -        return GregorianCalendar.class;
    -    }
    -}
    -
    -// Now you can fetch calendar values from jOOQ's API:
    -List<GregorianCalendar> dates1 = create.selectFrom(BOOK).fetch().getValues(BOOK.PUBLISHING_DATE, new CalendarConverter());
    -List<GregorianCalendar> dates2 = create.selectFrom(BOOK).fetch(BOOK.PUBLISHING_DATE, new CalendarConverter());
    -]]></java><html>									
    -									
    -									<h3>Enum Converters</h3>
    -									<p>
    -										jOOQ ships with a built-in default <reference class="org.jooq.impl.EnumConverter"/>, that you can use to map VARCHAR values to enum literals or NUMBER values to enum ordinals (both modes are supported). Let's say, you want to map a YES / NO / MAYBE column to a custom Enum:
    -									</p>
    -									
    -</html><java><![CDATA[// Define your Enum
    -public enum YNM {
    -    YES, NO, MAYBE
    -}
    -
    -// Define your converter
    -public class YNMConverter extends EnumConverter<String, YNM> {
    -    public YNMConverter() {
    -        super(String.class, YNM.class);
    -    }
    -}
    -
    -// And you're all set for converting records to your custom Enum:
    -for (BookRecord book : create.selectFrom(BOOK).fetch()) {
    -    switch (book.getValue(BOOK.I_LIKE, new YNMConverter())) {
    -        case YES:    System.out.println("I like this book             : " + book.getTitle()); break;
    -        case NO:     System.out.println("I didn't like this book      : " + book.getTitle()); break;
    -        case MAYBE:  System.out.println("I'm not sure about this book : " + book.getTitle()); break;
    -    }
    -}]]></java><html>
    -									
    -									<h3>Using Converters in generated source code</h3>
    -									<p>
    -										jOOQ also allows for generated source code to reference your own custom converters, in order to permanently replace a <reference id="table-columns" title="table column's"/> &lt;T&gt; type by your own, custom &lt;U&gt; type. See the manual's section about <reference id="custom-data-types" title="custom data types"/> for details.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="interning">
    -								<title>Interning data</title>
    -								<content><html>
    -									<p>
    -										SQL result tables are not optimal in terms of used memory as they are not designed to represent hierarchical data as produced by <code>JOIN</code> operations. Specifically, <code>FOREIGN KEY</code> values may repeat themselves unnecessarily:
    -									</p>
    -
    -</html><text>+----+-----------+--------------+
    -| ID | AUTHOR_ID | TITLE        |
    -+----+-----------+--------------+
    -|  1 |         1 | 1984         |
    -|  2 |         1 | Animal Farm  |
    -|  3 |         2 | O Alquimista |
    -|  4 |         2 | Brida        |
    -+----+-----------+--------------+</text><html>
    -
    -									<p>
    -										Now, if you have millions of records with only few distinct values for <code>AUTHOR_ID</code>, you may not want to hold references to distinct (but equal) <reference class="java.lang.Integer"/> objects. This is specifically true for IDs of type <reference class="java.util.UUID"/> or string representations thereof. jOOQ allows you to "intern" those values:
    -									</p>
    -
    -</html><java><![CDATA[// Interning data after fetching
    -Result<?> r1 = create.select(BOOK.ID, BOOK.AUTHOR_ID, BOOK.TITLE)
    -                     .from(BOOK)
    -                     .join(AUTHOR).on(BOOK.AUTHOR_ID.eq(AUTHOR.ID))
    -                     .fetch()
    -                     .intern(BOOK.AUTHOR_ID);
    -
    -// Interning data while fetching
    -Result<?> r1 = create.select(BOOK.ID, BOOK.AUTHOR_ID, BOOK.TITLE)
    -                     .from(BOOK)
    -                     .join(AUTHOR).on(BOOK.AUTHOR_ID.eq(AUTHOR.ID))
    -                     .intern(BOOK.AUTHOR_ID)
    -                     .fetch();]]></java><html>
    -                     
    -                     				<p>
    -                     					You can specify as many fields as you want for interning. The above has the following effect:
    -                     				</p>
    -                     				
    -                     				<ul>
    -                     					<li>If the interned Field is of type <reference class="java.lang.String"/>, then <reference class="java.lang.String" anchor="#intern()" title="String.intern()"/> is called upon each string</li>
    -                     					<li>If the interned Field is of any other type, then the call is ignored</li>
    -                     				</ul>
    -                     				
    -                     				<p>
    -                     					Future versions of jOOQ will implement interning of data for non-String data types by collecting values in <reference class="java.util.Set"/>, removing duplicate instances.
    -                     				</p>
    -                     				
    -                     				<p>
    -                     					Note, that jOOQ will not use interned data for identity comparisons: <code>string1 == string2</code>. Interning is used only to reduce the memory footprint of <reference class="org.jooq.Result"/> objects.
    -                     				</p>
    -								</html></content>
    -							</section>							
    -						</sections>
    -					</section>
    -					
    -					<section id="statement-type">
    -						<title>Static statements vs. Prepared Statements</title>
    -						<content><html>
    -							<p>
    -								With JDBC, you have full control over your SQL statements. You can decide yourself, if you want to execute a static <reference class="java.sql.Statement"/> without bind values, or a <reference class="java.sql.PreparedStatement"/> with (or without) bind values. But you have to decide early, which way to go. And you'll have to prevent SQL injection and syntax errors manually, when inlining your bind variables.
    -							</p>
    -							<p>
    -								With jOOQ, this is easier. As a matter of fact, it is plain simple. With jOOQ, you can just set a flag in your <reference id="dsl-context" title="Configuration's"/> <reference id="custom-settings" title="Settings"/>, and all queries produced by that configuration will be executed as static statements, with all bind values inlined. An example is given here:
    -							</p>
    -							
    -</html><code-pair>
    -<sql><![CDATA[
    -
    -
    -
    -
    -
    -
    --- These statements are rendered by the two factories:
    -SELECT ? FROM DUAL WHERE ? = ?
    -SELECT 1 FROM DUAL WHERE 1 = 1]]></sql>
    -<java><![CDATA[// This DSLContext executes PreparedStatements
    -DSLContext prepare = DSL.using(connection, SQLDialect.ORACLE);
    -
    -// This DSLContext executes static Statements
    -DSLContext inlined = DSL.using(connection, SQLDialect.ORACLE, 
    -  new Settings().withStatementType(StatementType.STATIC_STATEMENT));
    -  
    -prepare.select(val(1)).where(val(1).equal(1)).fetch();
    -inlined.select(val(1)).where(val(1).equal(1)).fetch();]]></java>
    -</code-pair><html>
    -
    -							<h3>Reasons for choosing one or the other</h3>
    -							<p>
    -								Not all databases are equal. Some databases show improved performance if you use <reference class="java.sql.PreparedStatement"/>, as the database will then be able to re-use execution plans for identical SQL statements, regardless of actual bind values. This heavily improves the time it takes for soft-parsing a SQL statement. In other situations, assuming that bind values are irrelevant for SQL execution plans may be a bad idea, as you might run into "bind value peeking" issues. You may be better off spending the extra cost for a new hard-parse of your SQL statement and instead having the database fine-tune the new plan to the concrete bind values.
    -							</p>
    -							<p>
    -								Whichever aproach is more optimal for you cannot be decided by jOOQ. In most cases, prepared statements are probably better. But you always have the option of forcing jOOQ to render inlined bind values.
    -							</p>
    -							
    -							<h3>Inlining bind values on a per-bind-value basis</h3>
    -							<p>
    -								Note that you don't have to inline all your bind values at once. If you know that a bind value is not really a variable and should be inlined explicitly, you can do so by using <reference class="org.jooq.impl.DSL" anchor="#inline(Object)" title="DSL.inline()"/>, as documented in the manual's section about <reference id="inlined-parameters" title="inlined parameters"/>
    -							</p>
    -						</html></content>
    -					</section>
    -
    -					<section id="reusing-statements">
    -						<title>Reusing a Query's PreparedStatement</title>
    -						<content><html>
    -							<p>
    -								As previously discussed in the chapter about <reference id="comparison-with-jdbc" title="differences between jOOQ and JDBC"/>, reusing PreparedStatements is handled a bit differently in jOOQ from how it is handled in JDBC
    -							</p>
    -							
    -							<h3>Keeping open PreparedStatements with JDBC</h3>
    -							<p>
    -								With JDBC, you can easily reuse a <reference class="java.sql.PreparedStatement"/> by not closing it between subsequent executions. An example is given here:
    -							</p>
    -							
    -</html><java><![CDATA[PreparedStatement stmt = null;
    -ResultSet rs1 = null;
    -ResultSet rs2 = null;
    -
    -try {
    -    // Execute the statement and fetch a first ResultSet
    -    stmt = connection.prepareStatement("SELECT 1 FROM DUAL");
    -    rs1  = stmt.executeQuery();
    -
    -    // Without closing the statement, execute it again to fetch another ResultSet
    -    rs2  = stmt.executeQuery();
    -}
    -finally {
    -    try { rs1.close();  } catch (Exception ignore) {}
    -    try { rs2.close();  } catch (Exception ignore) {}
    -    try { stmt.close(); } catch (Exception ignore) {}
    -}]]></java><html>
    -
    -							<p>
    -								The above technique can be quite useful when you want to reuse expensive database resources. This can be the case when your statement is executed very frequently and your database would take non-negligible time to soft-parse the prepared statement and generate a new statement / cursor resource.
    -							</p>
    -							
    -							<h3>Keeping open PreparedStatements with jOOQ</h3>
    -							<p>
    -								This is also modeled in jOOQ. However, the difference to JDBC is that closing a statement is the default action, whereas keeping it open has to be configured explicitly. This is better than JDBC, because the default action should be the one that is used most often. Keeping open statements is rarely done in average applications. Here's an example of how to keep open PreparedStatements with jOOQ:
    -							</p>
    -							
    -</html><java><![CDATA[// Create a query which is configured to keep its underlying PreparedStatement open
    -ResultQuery<Record> query = create.selectOne().keepStatement(true);
    -
    -// Execute the query twice, against the same underlying PreparedStatement:
    -try {
    -    Result<Record> result1 = query.fetch(); // This will lazily create a new PreparedStatement
    -    Result<Record> result2 = query.fetch(); // This will reuse the previous PreparedStatement
    -}
    -
    -// ... but now, you must not forget to close the query
    -finally {
    -    query.close();
    -}]]></java><html>
    -
    -							<p>
    -								The above example shows how a query can be executed twice against the same underlying PreparedStatement. Unlike in other execution scenarios, you must not forget to close this query now
    -							</p>
    -						</html></content>
    -					</section>
    -
    -                    <section id="jdbc-flags">
    -                        <title>JDBC flags</title>
    -                        <content><html>
    -                            <p>
    -                                JDBC knows a couple of execution flags and modes, which can be set through the jOOQ API as well. jOOQ essentially supports these flags and execution modes:
    -                            </p>
    -                            
    -</html><java><![CDATA[public interface Query extends QueryPart, Attachable {
    -
    -    // [...]
    -
    -    // The query execution timeout.
    -    // -----------------------------------------------------------
    -    Query queryTimeout(int timeout);
    -    
    -}]]></java>
    -                            
    -<java><![CDATA[public interface ResultQuery<R extends Record> extends Query {
    -
    -    // [...]
    -
    -    // The query execution timeout.
    -    // -----------------------------------------------------------
    -    @Override
    -    ResultQuery<R> queryTimeout(int timeout);
    -
    -    // Flags allowing to specify the resulting ResultSet modes
    -    // -----------------------------------------------------------
    -    ResultQuery<R> resultSetConcurrency(int resultSetConcurrency);
    -    ResultQuery<R> resultSetType(int resultSetType);
    -    ResultQuery<R> resultSetHoldability(int resultSetHoldability);
    -
    -    // The maximum number of rows to be fetched by JDBC
    -    // -----------------------------------------------------------
    -    ResultQuery<R> maxRows(int rows);
    -    
    -}]]></java><html>
    -
    -                            <h3>Using ResultSet concurrency with ExecuteListeners</h3>
    -                            <p>
    -                                An example of why you might want to manually set a ResultSet's concurrency flag to something non-default is given here:
    -                            </p>
    -                            
    -</html><java><![CDATA[
    -DSL.using(new DefaultConfiguration()
    -   .set(connection)
    -   .set(SQLDialect.ORACLE)
    -   .set(DefaultExecuteListenerProvider.providers(
    -           new DefaultExecuteListener() {
    -        
    -               @Override
    -               public void recordStart(ExecuteContext ctx) {
    -                   try {
    -            
    -                       // Change values in the cursor before reading a record
    -                       ctx.resultSet().updateString(BOOK.TITLE.getName(), "New Title");
    -                       ctx.resultSet().updateRow();
    -                   }
    -                   catch (SQLException e) {
    -                       throw new DataAccessException("Exception", e);
    -                   }
    -               }
    -          }
    -       )
    -   ))
    -   .select(BOOK.ID, BOOK.TITLE)
    -   .from(BOOK)
    -   .orderBy(BOOK.ID)
    -   .resultSetType(ResultSet.TYPE_SCROLL_INSENSITIVE)
    -   .resultSetConcurrency(ResultSet.CONCUR_UPDATABLE)
    -   .fetch(BOOK.TITLE);]]></java><html>
    -   
    -                            <p>
    -                                In the above example, your custom <reference id="execute-listeners" title="ExecuteListener callback"/> is triggered before jOOQ loads a new <code>Record</code> from the JDBC <code>ResultSet</code>. With the concurrency being set to <code>ResultSet.CONCUR_UPDATABLE</code>, you can now modify the database cursor through the standard JDBC <code>ResultSet</code> API.  
    -                            </p>
    -                        </html></content>
    -                    </section>
    -
    -				    <section id="batch-execution">
    -						<title>Using JDBC batch operations</title>
    -						<content><html>
    -							<p>
    -								With JDBC, you can easily execute several statements at once using the addBatch() method. Essentially, there are two modes in JDBC
    -							</p>
    -
    -							<ul>
    -								<li>Execute several queries without bind values</li>
    -								<li>Execute one query several times with bind values</li>
    -							</ul>
    -
    -							<p>
    -								In code, this looks like the following snippet:
    -							</p>
    -</html><java><![CDATA[// 1. several queries
    -// ------------------
    -Statement stmt = connection.createStatement();
    -stmt.addBatch("INSERT INTO author(id, first_name, last_name) VALUES (1, 'Erich', 'Gamma')");
    -stmt.addBatch("INSERT INTO author(id, first_name, last_name) VALUES (2, 'Richard', 'Helm')");
    -stmt.addBatch("INSERT INTO author(id, first_name, last_name) VALUES (3, 'Ralph', 'Johnson')");
    -stmt.addBatch("INSERT INTO author(id, first_name, last_name) VALUES (4, 'John', 'Vlissides')");
    -int[] result = stmt.executeBatch();
    -
    -// 2. a single query
    -// -----------------
    -PreparedStatement stmt = connection.prepareStatement("INSERT INTO author(id, first_name, last_name) VALUES (?, ?, ?)");
    -stmt.setInt(1, 1);
    -stmt.setString(2, "Erich");
    -stmt.setString(3, "Gamma");
    -stmt.addBatch();
    -
    -stmt.setInt(1, 2);
    -stmt.setString(2, "Richard");
    -stmt.setString(3, "Helm");
    -stmt.addBatch();
    -
    -stmt.setInt(1, 3);
    -stmt.setString(2, "Ralph");
    -stmt.setString(3, "Johnson");
    -stmt.addBatch();
    -
    -stmt.setInt(1, 4);
    -stmt.setString(2, "John");
    -stmt.setString(3, "Vlissides");
    -stmt.addBatch();
    -
    -int[] result = stmt.executeBatch();]]></java><html>
    -
    -
    -							<h3>This will also be supported by jOOQ</h3>
    -							<p>
    -								jOOQ supports executing queries in batch mode as follows:
    -							</p>
    -							
    -</html><java><![CDATA[// 1. several queries
    -// ------------------
    -create.batch(
    -	create.insertInto(AUTHOR, ID, FIRST_NAME, LAST_NAME).values(1, "Erich", "Gamma"),
    -	create.insertInto(AUTHOR, ID, FIRST_NAME, LAST_NAME).values(2, "Richard", "Helm"),
    -	create.insertInto(AUTHOR, ID, FIRST_NAME, LAST_NAME).values(3, "Ralph", "Johnson"),
    -	create.insertInto(AUTHOR, ID, FIRST_NAME, LAST_NAME).values(4, "John", "Vlissides"))
    -.execute();
    -
    -// 2. a single query
    -// -----------------
    -create.batch(create.insertInto(AUTHOR, ID, FIRST_NAME, LAST_NAME).values((Integer) null, null, null))
    -      .bind(1, "Erich", "Gamma")
    -      .bind(2, "Richard", "Helm")
    -      .bind(3, "Ralph", "Johnson")
    -      .bind(4, "John", "Vlissides")
    -      .execute();]]></java><html>
    -      
    -                            <p>
    -                                When creating a batch execution with a single query and multiple bind values, you will still have to provide jOOQ with dummy bind values for the original query. In the above example, these are set to <code>null</code>. For subsequent calls to <code>bind()</code>, there will be no type safety provided by jOOQ.
    -                            </p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="sequence-execution">
    -						<title>Sequence execution</title>
    -						<content><html>
    -							<p>
    -								Most databases support sequences of some sort, to provide you with unique values to be used for primary keys and other enumerations. If you're using jOOQ's <reference id="code-generation" title="code generator"/>, it will generate a sequence object per sequence for you. There are two ways of using such a sequence object:
    -							</p>
    -
    -							<h3>Standalone calls to sequences</h3>
    -							<p>
    -								Instead of actually phrasing a select statement, you can also use the <reference id="dsl-context" title="DSLContext's"/> convenience methods:
    -							</p>							
    -							
    -</html><java><![CDATA[// Fetch the next value from a sequence
    -BigInteger nextID = create.nextval(S_AUTHOR_ID);
    -
    -// Fetch the current value from a sequence
    -BigInteger currID = create.currval(S_AUTHOR_ID);]]></java><html>
    -							
    -							<h3>Inlining sequence references in SQL</h3>
    -							<p>
    -								You can inline sequence references in jOOQ SQL statements. The following are examples of how to do that:
    -							</p>
    -							
    -</html><java><![CDATA[// Reference the sequence in a SELECT statement:
    -BigInteger nextID = create.select(s).fetchOne(S_AUTHOR_ID.nextval());
    -
    -// Reference the sequence in an INSERT statement:
    -create.insertInto(AUTHOR, AUTHOR.ID, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
    -      .values(S_AUTHOR_ID.nextval(), val("William"), val("Shakespeare"));
    -]]></java><html>
    -
    -							<p>
    -								For more info about inlining sequence references in SQL statements, please refer to the manual's section about <reference id="sequences-and-serials" title="sequences and serials"/>.
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="stored-procedures">
    -						<title>Stored procedures and functions</title>
    -						<content><html>
    -							<p>
    -								Many RDBMS support the concept of "routines", usually calling them procedures and/or functions. These concepts have been around in programming languages for a while, also outside of databases. Famous languages distinguishing procedures from functions are:
    -							</p>
    -							<ul>
    -								<li>Ada</li>
    -								<li>BASIC</li>
    -								<li>Pascal</li>
    -								<li>etc...</li>
    -							</ul>
    -							<p>
    -								The general distinction between (stored) procedures and (stored) functions can be summarised like this:
    -							</p>
    -							
    -							<h3>Procedures</h3>
    -							<ul>
    -								<li>Are called using JDBC CallableStatement</li>
    -								<li>Have no return value</li>
    -								<li>Usually support OUT parameters</li>
    -							</ul>
    -							
    -							<h3>Functions</h3>
    -							<ul>
    -								<li>Can be used in SQL statements</li>
    -								<li>Have a return value</li>
    -								<li>Usually don't support OUT parameters</li>
    -							</ul>
    -							
    -							<h3>Exceptions to these rules</h3>
    -							<ul>
    -								<li>DB2, H2, and HSQLDB don't allow for JDBC escape syntax when calling functions. Functions must be used in a SELECT statement</li>
    -								<li>H2 only knows functions (without OUT parameters)</li>
    -								<li>Oracle functions may have OUT parameters</li>
    -								<li>Oracle knows functions that must not be used in SQL statements for transactional reasons</li>
    -								<li>Postgres only knows functions (with all features combined). OUT parameters can also be interpreted as return values, which is quite elegant/surprising, depending on your taste</li>
    -								<li>The Sybase jconn3 JDBC driver doesn't handle null values correctly when using the JDBC escape syntax on functions</li>
    -							</ul>
    -							<p>
    -								In general, it can be said that the field of routines (procedures / functions) is far from being standardised in modern RDBMS even if the SQL:2008 standard specifies things quite well. Every database has its ways and JDBC only provides little abstraction over the great variety of procedures / functions implementations, especially when advanced data types such as cursors / UDT's / arrays are involved.
    -							</p>
    -							<p>
    -								To simplify things a little bit, jOOQ handles both procedures and functions the same way, using a more general <reference class="org.jooq.Routine"/> type.
    -							</p>
    -							
    -							<h3>Using jOOQ for standalone calls to stored procedures and functions</h3>
    -							<p>
    -								If you're using jOOQ's <reference id="code-generation" title="code generator"/>, it will generate <reference class="org.jooq.Routine"/> objects for you. Let's consider the following example:
    -							</p>
    -							
    -</html><sql><![CDATA[-- Check whether there is an author in AUTHOR by that name and get his ID
    -CREATE OR REPLACE PROCEDURE author_exists (author_name VARCHAR2, result OUT NUMBER, id OUT NUMBER);]]></sql><html>
    -
    -							<p>
    -								The generated artefacts can then be used as follows:
    -							</p>
    -							
    -</html><java><![CDATA[// Make an explicit call to the generated procedure object:
    -AuthorExists procedure = new AuthorExists();
    -
    -// All IN and IN OUT parameters generate setters
    -procedure.setAuthorName("Paulo");
    -procedure.execute(configuration);
    -
    -// All OUT and IN OUT parameters generate getters
    -assertEquals(new BigDecimal("1"), procedure.getResult());
    -assertEquals(new BigDecimal("2"), procedure.getId();]]></java><html>							
    -							
    -							<p>
    -								But you can also call the procedure using a generated convenience method in a global Routines class:
    -							</p>
    -
    -</html><java><![CDATA[// The generated Routines class contains static methods for every procedure.
    -// Results are also returned in a generated object, holding getters for every OUT or IN OUT parameter.
    -AuthorExists result = Routines.authorExists("Paulo");
    -
    -// All OUT and IN OUT parameters generate getters
    -assertEquals(new BigDecimal("1"), procedure.getResult());
    -assertEquals(new BigDecimal("2"), procedure.getId();]]></java><html>			
    -
    -							<p>
    -								For more details about <reference id="code-generation" title="code generation"/> for procedures, see the manual's section about <reference id="codegen-procedures" title="procedures and code generation"/>.
    -							</p>				
    -							
    -							<h3>Inlining stored function references in SQL</h3>
    -							<p>
    -								Unlike procedures, functions can be inlined in SQL statements to generate <reference id="column-expressions" title="column expressions"/> or <reference id="table-expressions" title="table expressions"/>, if you're using <reference id="array-and-cursor-unnesting" title="unnesting operators"/>. Assume you have a function like this:
    -							</p>
    -
    -</html><sql><![CDATA[-- Check whether there is an author in AUTHOR by that name and get his ID
    -CREATE OR REPLACE FUNCTION author_exists (author_name VARCHAR2) RETURN NUMBER;]]></sql><html>
    -							
    -							<p>
    -								The generated artefacts can then be used as follows:
    -							</p>
    -							
    -</html><code-pair>
    -<sql><![CDATA[-- This is the rendered SQL
    -
    -SELECT AUTHOR_EXISTS('Paulo') FROM DUAL]]></sql>
    -<java><![CDATA[// Use the static-imported method from Routines:
    -boolean exists = 
    -create.select(authorExists("Paulo")).fetchOne(0, boolean.class);]]></java>							
    -</code-pair><html>
    -							
    -							<p>
    -								For more info about inlining stored function references in SQL statements, please refer to the manual's section about <reference id="user-defined-functions" title="user-defined functions"/>.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="oracle-packages">
    -								<title>Oracle Packages</title>
    -								<content><html>
    -									<p>
    -										Oracle uses the concept of a PACKAGE to group several procedures/functions into a sort of namespace. The <a href="http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt" title="SQL 92 standard">SQL 92 standard</a> talks about "modules", to represent this concept, even if this is rarely implemented as such. This is reflected in jOOQ by the use of Java sub-packages in the <reference id="code-generation" title="source code generation"/> destination package. Every Oracle package will be reflected by
    -									</p>
    -									<ul>
    -										<li>A Java package holding classes for formal Java representations of the procedure/function in that package</li>
    -										<li>A Java class holding convenience methods to facilitate calling those procedures/functions</li>
    -									</ul>
    -									<p>
    -										Apart from this, the generated source code looks exactly like the one for standalone procedures/functions.
    -									</p>
    -									<p>
    -										For more details about <reference id="code-generation" title="code generation"/> for procedures and packages see the manual's section about <reference id="codegen-procedures" title="procedures and code generation"/>.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="oracle-member-procedures">
    -								<title>Oracle member procedures</title>
    -								<content><html>
    -									<p>
    -										Oracle UDTs can have object-oriented structures including member functions and procedures. With Oracle, you can do things like this:
    -									</p>
    -									
    -</html><sql><![CDATA[CREATE OR REPLACE TYPE u_author_type AS OBJECT (
    -  id NUMBER(7),
    -  first_name VARCHAR2(50),
    -  last_name VARCHAR2(50),
    -
    -  MEMBER PROCEDURE LOAD,
    -  MEMBER FUNCTION counBOOKs RETURN NUMBER
    -)
    -
    --- The type body is omitted for the example]]></sql><html>
    -
    -									<p>
    -										These member functions and procedures can simply be mapped to Java methods:
    -									</p>
    -
    -</html><java><![CDATA[// Create an empty, attached UDT record from the DSLContext
    -UAuthorType author = create.newRecord(U_AUTHOR_TYPE);
    -
    -// Set the author ID and load the record using the LOAD procedure
    -author.setId(1);
    -author.load();
    -
    -// The record is now updated with the LOAD implementation's content
    -assertNotNull(author.getFirstName());
    -assertNotNull(author.getLastName());]]></java><html>
    -
    -									<p>
    -										For more details about <reference id="code-generation" title="code generation"/> for UDTs see the manual's section about <reference id="codegen-udts" title="user-defined types and code generation"/>.
    -									</p>								
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -				    <section id="exporting">
    -						<title>Exporting to XML, CSV, JSON, HTML, Text</title>
    -						<content><html>
    -							<p>
    -								If you are using jOOQ for scripting purposes or in a slim, unlayered application server, you might be interested in using jOOQ's exporting functionality (see also the <reference id="importing" title="importing functionality"/>). You can export any Result&lt;Record&gt; into the formats discussed in the subsequent chapters of the manual
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="exporting-xml">
    -								<title>Exporting XML</title>
    -								<content>
    -
    -<java>// Fetch books and format them as XML
    -String xml = create.selectFrom(BOOK).fetch().formatXML();</java><html>
    -
    -									<p>
    -										The above query will result in an XML document looking like the following one:
    -									</p>
    -
    -</html><xml><![CDATA[<result xmlns="http://www.jooq.org/xsd/jooq-export-{export-xsd-version}.xsd">
    -  <fields>
    -    <field name="ID" type="INTEGER"/>
    -    <field name="AUTHOR_ID" type="INTEGER"/>
    -    <field name="TITLE" type="VARCHAR"/>
    -  </fields>
    -  <records>
    -    <record>
    -      <value field="ID">1</value>
    -      <value field="AUTHOR_ID">1</value>
    -      <value field="TITLE">1984</value>
    -    </record>
    -    <record>
    -      <value field="ID">2</value>
    -      <value field="AUTHOR_ID">1</value>
    -      <value field="TITLE">Animal Farm</value>
    -    </record>
    -  </records>
    -</result>]]></xml><html>
    -
    -									<p>
    -										The same result as an <reference class="org.w3c.dom.Document"/> can be obtained using the Result.intoXML() method:
    -									</p>
    -
    -
    -</html><java>// Fetch books and format them as XML
    -Document xml = create.selectFrom(BOOK).fetch().intoXML();</java><html>
    -
    -									<p>
    -										See the XSD schema definition here, for a formal definition of the XML export format:<br/>
    -										<a href="http://www.jooq.org/xsd/jooq-export-{export-xsd-version}.xsd">http://www.jooq.org/xsd/jooq-export-{export-xsd-version}.xsd</a>
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="exporting-csv">
    -								<title>Exporting CSV</title>
    -								<content>
    -
    -<java>// Fetch books and format them as CSV
    -String csv = create.selectFrom(BOOK).fetch().formatCSV();</java><html>
    -
    -									<p>
    -										The above query will result in a CSV document looking like the following one:
    -									</p>
    -
    -</html><text>ID,AUTHOR_ID,TITLE
    -1,1,1984
    -2,1,Animal Farm</text><html>
    -
    -									<p>
    -										In addition to the standard behaviour, you can also specify a separator character, as well as a special string to represent NULL values (which cannot be represented in standard CSV):
    -									</p>
    -
    -</html><java>// Use ";" as the separator character
    -String csv = create.selectFrom(BOOK).fetch().formatCSV(';');
    -
    -// Specify "{null}" as a representation for NULL values
    -String csv = create.selectFrom(BOOK).fetch().formatCSV(';', "{null}");</java>
    -
    -								</content>
    -							</section>
    -
    -							<section id="exporting-json">
    -								<title>Exporting JSON</title>
    -								<content>
    -
    -<java>// Fetch books and format them as JSON
    -String json = create.selectFrom(BOOK).fetch().formatJSON();</java><html>
    -
    -									<p>
    -										The above query will result in a JSON document looking like the following one:
    -									</p>
    -
    -</html><text>{"fields":[{"name":"field-1","type":"type-1"},
    -           {"name":"field-2","type":"type-2"},
    -           ...,
    -           {"name":"field-n","type":"type-n"}],
    - "records":[[value-1-1,value-1-2,...,value-1-n],
    -            [value-2-1,value-2-2,...,value-2-n]]}</text><html>
    -             
    -             						<p>
    -             							Note: This format has changed in jOOQ 2.6.0
    -             						</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="exporting-html">
    -								<title>Exporting HTML</title>
    -								<content>
    -<java>// Fetch books and format them as HTML
    -String html = create.selectFrom(BOOK).fetch().formatHTML();</java><html>
    -
    -									<p>
    -										The above query will result in an HTML document looking like the following one
    -									</p>
    -
    -</html><xml><![CDATA[<table>
    -  <thead>
    -    <tr>
    -      <th>ID</th>
    -      <th>AUTHOR_ID</th>
    -      <th>TITLE</th>
    -    </tr>
    -  </thead>
    -  <tbody>
    -    <tr>
    -      <td>1</td>
    -      <td>1</td>
    -      <td>1984</td>
    -    </tr>
    -    <tr>
    -      <td>2</td>
    -      <td>1</td>
    -      <td>Animal Farm</td>
    -    </tr>
    -  </tbody>
    -</table>]]></xml>
    -
    -								</content>
    -							</section>
    -
    -							<section id="exporting-text">
    -								<title>Exporting Text</title>
    -								<content>
    -
    -<java>// Fetch books and format them as text
    -String text = create.selectFrom(BOOK).fetch().format();</java><html>
    -
    -									<p>
    -										The above query will result in a text document looking like the following one
    -									</p>
    -
    -</html><text>+---+---------+-----------+
    -| ID|AUTHOR_ID|TITLE      |
    -+---+---------+-----------+
    -|  1|        1|1984       |
    -|  2|        1|Animal Farm|
    -+---+---------+-----------+</text><html>
    -
    -									<p>
    -										A simple text representation can also be obtained by calling toString() on a Result object. See also the manual's section about <reference id="logging" title="DEBUG logging"/>
    -									</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -				    <section id="importing">
    -						<title>Importing data</title>
    -						<content><html>
    -							<p>
    -								If you are using jOOQ for scripting purposes or in a slim, unlayered application server, you might be interested in using jOOQ's importing functionality (see also exporting functionality). You can import data directly into a table from the formats described in the subsequent sections of this manual.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="importing-csv">
    -								<title>Importing CSV</title>
    -								<content><html>
    -
    -									<p>
    -										The below CSV data represents two author records that may have been exported previously, by jOOQ's <reference id="exporting" title="exporting functionality"/>, and then modified in Microsoft Excel or any other spreadsheet tool:
    -									</p>
    -
    -</html><text>ID;AUTHOR_ID;TITLE
    -1;1;1984
    -2;1;Animal Farm</text><html>
    -
    -									<p>
    -										With jOOQ, you can load this data using various parameters from the	loader API. A simple load may look like this:
    -									</p>
    -
    -</html><java>DSLContext create = DSL.using(connection, dialect);
    -
    -// Load data into the AUTHOR table from an input stream
    -// holding the CSV data.
    -create.loadInto(AUTHOR)
    -      .loadCSV(inputstream)
    -      .fields(ID, AUTHOR_ID, TITLE)
    -      .execute();</java><html>
    -
    -      								<p>
    -      									Here are various other examples:
    -   									</p>
    -
    -</html><java>// Ignore the AUTHOR_ID column from the CSV file when inserting
    -create.loadInto(AUTHOR)
    -      .loadCSV(inputstream)
    -      .fields(ID, null, TITLE)
    -      .execute();
    -
    -// Specify behaviour for duplicate records.
    -create.loadInto(AUTHOR)
    -
    -      // choose any of these methods
    -      .onDuplicateKeyUpdate()
    -      .onDuplicateKeyIgnore()
    -      .onDuplicateKeyError() // the default
    -
    -      .loadCSV(inputstream)
    -      .fields(ID, null, TITLE)
    -      .execute();
    -
    -// Specify behaviour when errors occur.
    -create.loadInto(AUTHOR)
    -
    -      // choose any of these methods
    -      .onErrorIgnore()
    -      .onErrorAbort() // the default
    -
    -      .loadCSV(inputstream)
    -      .fields(ID, null, TITLE)
    -      .execute();
    -
    -// Specify transactional behaviour where this is possible
    -// (e.g. not in container-managed transactions)
    -create.loadInto(AUTHOR)
    -
    -      // choose any of these methods
    -      .commitEach()
    -      .commitAfter(10)
    -      .commitAll()
    -      .commitNone() // the default
    -
    -      .loadCSV(inputstream)
    -      .fields(ID, null, TITLE)
    -      .execute();</java><html>
    -
    -									<p>
    -										Any of the above configuration methods can be combined to achieve the type of load you need. Please refer to the API's Javadoc to learn about more details. Errors that occur during the load are reported by the execute method's result:
    -									</p>
    -
    -</html><java><![CDATA[Loader<Author> loader = /* .. */ .execute();
    -
    -// The number of processed rows
    -int processed = loader.processed();
    -
    -// The number of stored rows (INSERT or UPDATE)
    -int stored = loader.stored();
    -
    -// The number of ignored rows (due to errors, or duplicate rule)
    -int ignored = loader.ignored();
    -
    -// The errors that may have occurred during loading
    -List<LoaderError> errors = loader.errors();
    -LoaderError error = errors.get(0);
    -
    -// The exception that caused the error
    -DataAccessException exception = error.exception();
    -
    -// The row that caused the error
    -int rowIndex = error.rowIndex();
    -String[] row = error.row();
    -
    -// The query that caused the error
    -Query query = error.query();]]></java>
    -
    -								</content>
    -							</section>
    -
    -							<section id="importing-xml">
    -								<title>Importing XML</title>
    -								<content><html>
    -									<p>This is not yet supported</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -				    <section id="crud-with-updatablerecords">
    -						<title>CRUD with UpdatableRecords</title>
    -						<content><html>
    -							<p>
    -								Your database application probably consists of 50% - 80% CRUD, whereas only the remaining 20% - 50% of querying is actual querying. Most often, you will operate on records of tables without using any advanced relational concepts. This is called CRUD for
    -							</p>
    -							<ul>
    -								<li>Create (<reference id="insert-statement" title="INSERT"/>)</li>
    -								<li>Read (<reference id="select-statement" title="SELECT"/>)</li>
    -								<li>Update (<reference id="update-statement" title="UPDATE"/>)</li>
    -								<li>Delete (<reference id="delete-statement" title="DELETE"/>)</li>
    -							</ul>
    -							<p>								
    -								CRUD always uses the same patterns, regardless of the nature of underlying tables. This again, leads to a lot of boilerplate code, if you have to issue your statements yourself. Like Hibernate / JPA and other ORMs, jOOQ facilitates CRUD using a specific API involving <reference class="org.jooq.UpdatableRecord"/> types.
    -							</p>
    -							
    -							<h3>Primary keys and updatability</h3>
    -							<p>
    -								In normalised databases, every table has a primary key by which a tuple/record within that table can be uniquely identified. In simple cases, this is a (possibly auto-generated) number called ID. But in many cases, primary keys include several non-numeric columns. An important feature of such keys is the fact that in most databases, they are enforced using an index that allows for very fast random access to the table. A typical way to access / modify / delete a book is this:
    -							</p>
    -							
    -</html><sql><![CDATA[-- Inserting uses a previously generated key value or generates it afresh
    -INSERT INTO BOOK (ID, TITLE) VALUES (5, 'Animal Farm');
    -
    --- Other operations can use a previously generated key value
    -SELECT * FROM BOOK WHERE ID = 5;
    -UPDATE BOOK SET TITLE = '1984' WHERE ID = 5;
    -DELETE FROM BOOK WHERE ID = 5;]]></sql><html>
    -							
    -							<p>
    -								Normalised databases assume that a primary key is unique "forever", i.e. that a key, once inserted into a table, will never be changed or re-inserted after deletion. In order to use jOOQ's <reference id="simple-crud" title="CRUD"/> operations correctly, you should design your database accordingly.
    -							</p>
    -						</html></content>
    -
    -						<sections>
    -							<section id="simple-crud">
    -								<title>Simple CRUD</title>
    -								<content><html>
    -									<p>
    -										If you're using jOOQ's <reference id="code-generation" title="code generator"/>, it will generate <reference class="org.jooq.UpdatableRecord"/> implementations for every table that has a primary key. When <reference id="fetching" title="fetching"/> such a record form the database, these records are "attached" to the <reference id="dsl-context" title="Configuration" /> that created them. This means that they hold an internal reference to the same database connection that was used to fetch them. This connection is used internally by any of the following methods of the UpdatableRecord:
    -									</p>
    -									
    -</html><java><![CDATA[// Refresh a record from the database.
    -void refresh() throws DataAccessException;
    -
    -// Store (insert or update) a record to the database.
    -int store() throws DataAccessException;
    -
    -// Delete a record from the database
    -int delete() throws DataAccessException;]]></java><html>
    -									
    -									<p>
    -										See the manual's section about <reference id="serializability" title="serializability"/> for some more insight on "attached" objects. 
    -									</p>
    -									
    -									<h3>Storing</h3>
    -									<p>
    -										Storing a record will perform an <reference id="insert-statement" title="INSERT statement"/> or an <reference id="update-statement" title="UPDATE statement"/>. In general, new records are always inserted, whereas records loaded from the database are always updated. This is best visualised in code:
    -									</p>
    -
    -</html><java><![CDATA[// Create a new record
    -BookRecord book1 = create.newRecord(BOOK);
    -
    -// Insert the record: INSERT INTO BOOK (TITLE) VALUES ('1984');
    -book1.setTitle("1984");
    -book1.store();
    -
    -// Update the record: UPDATE BOOK SET PUBLISHED_IN = 1984 WHERE ID = [id]
    -book1.setPublishedIn(1948);
    -book1.store();
    -
    -// Get the (possibly) auto-generated ID from the record
    -Integer id = book1.getId();
    -
    -// Get another instance of the same book
    -BookRecord book2 = create.fetchOne(BOOK, BOOK.ID.equal(id));
    -
    -// Update the record: UPDATE BOOK SET TITLE = 'Animal Farm' WHERE ID = [id]
    -book2.setTitle("Animal Farm");
    -book2.store();]]></java><html>
    -									
    -									<p>
    -										Some remarks about storing:
    -									</p>
    -									<ul>
    -										<li>jOOQ sets only modified values in <reference id="insert-statement" title="INSERT statements"/> or <reference id="update-statement" title="UPDATE statements"/>. This allows for default values to be applied to inserted records, as specified in CREATE TABLE DDL statements.</li>
    -										<li>When store() performs an <reference id="insert-statement" title="INSERT statement"/>, jOOQ attempts to load any generated keys from the database back into the record. For more details, see the manual's section about <reference id="identity-values" title="IDENTITY values"/>.</li>
    -										<li>When loading records from <reference id="pojos" title="POJOs"/>, jOOQ will assume the record is a new record. It will hence attempt to INSERT it.</li>
    -										<li>When you activate <reference id="optimistic-locking" title="optimistic locking"/>, storing a record may fail, if the underlying database record has been changed in the mean time.</li>
    -									</ul>
    -																		
    -									<h3>Deleting</h3>
    -									<p>
    -										Deleting a record will remove it from the database. Here's how you delete records:
    -									</p>
    -									
    -</html><java><![CDATA[// Get a previously inserted book
    -BookRecord book = create.fetchOne(BOOK, BOOK.ID.equal(5));
    -
    -// Delete the book
    -book.delete();]]></java><html>
    -									
    -									<h3>Refreshing</h3>
    -									<p>
    -										Refreshing a record from the database means that jOOQ will issue a <reference id="select-statement" title="SELECT statement"/> to refresh all record values that are not the primary key. This is particularly useful when you use jOOQ's <reference id="optimistic-locking" title="optimistic locking"/> feature, in case a modified record is "stale" and cannot be stored to the database, because the underlying database record has changed in the mean time.
    -									</p>
    -									<p>
    -										In order to perform a refresh, use the following Java code:
    -									</p>									
    -
    -</html><java><![CDATA[// Fetch an updatable record from the database
    -BookRecord book = create.fetchOne(BOOK, BOOK.ID.equal(5));
    -
    -// Refresh the record
    -book.refresh();]]></java><html>
    -
    -									<h3>CRUD and SELECT statements</h3>
    -									<p>
    -										CRUD operations can be combined with regular querying, if you select records from single database tables, as explained in the manual's section about <reference id="select-statement" title="SELECT statements"/>. For this, you will need to use the <code>selectFrom()</code> method from the <reference id="dsl-context" title="DSLContext"/>:
    -									</p>
    -									
    -</html><java><![CDATA[// Loop over records returned from a SELECT statement
    -for (BookRecord book : create.fetch(BOOK, BOOK.PUBLISHED_IN.equal(1948))) {
    -
    -  // Perform actions on BookRecords depending on some conditions
    -  if ("Orwell".equals(book.fetchParent(FK_BOOK_AUTHOR).getLastName())) {
    -    book.delete();
    -  }
    -}]]></java>
    -								</content>
    -							</section>
    -
    -							<section id="internal-flags">
    -								<title>Records' internal flags</title>
    -								<content><html>
    -									<p>
    -										All of jOOQ's <reference id="record-vs-tablerecord" title="Record types and subtypes"/> maintain an internal state for every column value. This state is composed of three elements:
    -									</p>
    -									<ul>
    -										<li>The value itself</li>
    -										<li>The "original" value, i.e. the value as it was originally fetched from the database or <code>null</code>, if the record was never in the database</li>
    -										<li>The "changed" flag, indicating if the value was ever changed through the <code>Record</code> API.</li>
    -									</ul>
    -									
    -									<p>
    -										The purpose of the above information is for jOOQ's <reference id="simple-crud" title="CRUD operations"/> to know, which values need to be stored to the database, and which values have been left untouched.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="identity-values">
    -								<title>IDENTITY values</title>
    -								<content><html>
    -									<p>
    -										Many databases support the concept of IDENTITY values, or <reference id="sequence-execution" title="SEQUENCE-generated"/> key values. This is reflected by JDBC's <reference class="java.sql.Statement" anchor="#getGeneratedKeys()" title="getGeneratedKeys()"/> method. jOOQ abstracts using this method as many databases and JDBC drivers behave differently with respect to generated keys. Let's assume the following SQL Server BOOK table:
    -									</p>
    -									
    -</html><sql><![CDATA[CREATE TABLE book (
    -  ID INTEGER IDENTITY(1,1) NOT NULL,
    -  
    -  -- [...]
    -  
    -  CONSTRAINT pk_book PRIMARY KEY (id)
    -)]]></sql><html>
    -
    -									<p>
    -										If you're using jOOQ's <reference id="code-generation" title="code generator"/>, the above table will generate a <reference class="org.jooq.UpdatableRecord"/> with an IDENTITY column. This information is used by jOOQ internally, to update IDs after calling <reference id="crud-with-updatablerecords" title="store()"/>: 
    -									</p>
    -									
    -</html><java><![CDATA[BookRecord book = create.newRecord(BOOK);
    -book.setTitle("1984");
    -book.store();
    -
    -// The generated ID value is fetched after the above INSERT statement
    -System.out.println(book.getId());]]></java><html>
    -
    -									<h3>Database compatibility</h3>
    -									<p>
    -										<strong>DB2, Derby, HSQLDB, Ingres</strong>
    -									</p>
    -									<p>
    -										These SQL dialects implement the standard very neatly.
    -									</p>
    -</html><sql><![CDATA[id INTEGER GENERATED BY DEFAULT AS IDENTITY
    -id INTEGER GENERATED BY DEFAULT AS IDENTITY (START WITH 1)]]></sql><html>
    -
    -									<p>
    -										<strong>H2, MySQL, Postgres, SQL Server, Sybase ASE, Sybase SQL Anywhere</strong>
    -									</p>
    -									<p>
    -										These SQL dialects implement identites, but the DDL syntax doesn’t follow the standard
    -									</p>
    -</html><sql><![CDATA[-- H2 mimicks MySQL's and SQL Server's syntax
    -ID INTEGER IDENTITY(1,1)
    -ID INTEGER AUTO_INCREMENT
    --- MySQL and SQLite
    -ID INTEGER NOT NULL AUTO_INCREMENT
    -
    --- Postgres serials implicitly create a sequence
    --- Postgres also allows for selecting from custom sequences
    --- That way, sequences can be shared among tables
    -id SERIAL NOT NULL
    -
    --- SQL Server
    -ID INTEGER IDENTITY(1,1) NOT NULL
    --- Sybase ASE
    -id INTEGER IDENTITY NOT NULL
    --- Sybase SQL Anywhere
    -id INTEGER NOT NULL IDENTITY]]></sql><html>
    -
    -									<p>
    -										<strong>Oracle</strong>
    -									</p>
    -									<p>
    -										Oracle does not know any identity columns at all. Instead, you will have to use a trigger and update the ID column yourself, using a custom sequence. Something along these lines:
    -									</p>
    -</html><sql><![CDATA[CREATE OR REPLACE TRIGGER my_trigger
    -BEFORE INSERT
    -ON my_table
    -REFERENCING NEW AS new
    -FOR EACH ROW
    -BEGIN
    -  SELECT my_sequence.nextval
    -  INTO :new.id
    -  FROM dual;
    -END my_trigger;]]></sql><html>
    -
    -									<p>
    -										Note, that this approach can be employed in most databases supporting sequences and triggers! It is a lot more flexible than standard identities
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="navigation-methods">
    -								<title>Navigation methods</title>
    -								<content><html>
    -									<p>
    -										<reference class="org.jooq.TableRecord"/> and <reference class="org.jooq.UpdatableRecord"/> contain foreign key navigation methods. These navigation methods allow for "navigating" inbound or outbound foreign key references by executing an appropriate query. An example is given here: 
    -									</p>
    -				
    -</html><code-pair>
    -<sql><![CDATA[CREATE TABLE book (
    -  AUTHOR_ID NUMBER(7) NOT NULL,
    -  
    -  -- [...]
    -  
    -  FOREIGN KEY (AUTHOR_ID) REFERENCES author(ID)
    -)]]></sql>
    -<java><![CDATA[BookRecord book = create.fetch(BOOK, BOOK.ID.equal(5));
    -
    -// Find the author of a book
    -AuthorRecord author = book.fetchParent(FK_BOOK_AUTHOR);
    -
    -// Find other books by that author
    -List<BookRecord> books = author.fetchChildren(FK_BOOK_AUTHOR);]]></java>
    -</code-pair><html>					
    -
    -									<p>
    -										Note that, unlike in Hibernate, jOOQ's navigation methods will always lazy-fetch relevant records, without caching any results. In other words, every time you run such a fetch method, a new query will be issued.
    -									</p>
    -									<p>
    -										These fetch methods only work on "attached" records. See the manual's section about <reference id="serializability" title="serializability"/> for some more insight on "attached" objects.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="non-updatable-records">
    -								<title>Non-updatable records</title>
    -								<content><html>
    -									<p>
    -										Tables without a <code>PRIMARY KEY</code> are considered non-updatable by jOOQ, as jOOQ has no way of uniquely identifying such a record within the database. If you're using jOOQ's <reference id="code-generation" title="code generator"/>, such tables will generate <reference class="org.jooq.TableRecord"/> classes, instead of <reference class="org.jooq.UpdatableRecord"/> classes. When you fetch <reference id="record-vs-tablerecord" title="typed records"/> from such a table, the returned records will not allow for calling any of the <reference id="crud-with-updatablerecords" title="store(), refresh(), delete()"/> methods. 
    -									</p>
    -									
    -									<p>
    -										Note, that some databases use internal rowid or object-id values to identify such records. jOOQ does not support these vendor-specific record meta-data.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="optimistic-locking">
    -								<title>Optimistic locking</title>
    -								<content><html>
    -									<p>
    -										jOOQ allows you to perform <reference id="crud-with-updatablerecords" title="CRUD"/> operations using optimistic locking. You can immediately take advantage of this feature by activating the relevant <reference id="custom-settings" title="executeWithOptimisticLocking Setting"/>. Without any further knowledge of the underlying data semantics, this will have the following impact on store() and delete() methods:
    -									</p>
    -									<ul>
    -										<li>INSERT statements are not affected by this Setting flag</li>
    -										<li>Prior to UPDATE or DELETE statements, jOOQ will run a <reference id="for-update-clause" title="SELECT .. FOR UPDATE"/> statement, pessimistically locking the record for the subsequent UPDATE / DELETE</li>
    -										<li>The data fetched with the previous SELECT will be compared against the data in the record being stored or deleted</li>
    -										<li>An <reference class="org.jooq.exception.DataChangedException"/> is thrown if the record had been modified in the mean time</li>
    -										<li>The record is successfully stored / deleted, if the record had not been modified in the mean time.</li>
    -									</ul>
    -									<p>
    -										The above changes to jOOQ's behaviour are transparent to the API, the only thing you need to do for it to be activated is to set the Settings flag. Here is an example illustrating optimistic locking:
    -									</p>
    -
    -</html><java><![CDATA[// Properly configure the DSLContext
    -DSLContext optimistic = DSLContext.using(connection, SQLDialect.ORACLE, 
    -  new Settings().withExecuteWithOptimisticLocking(true));
    -  
    -// Fetch a book two times
    -BookRecord book1 = optimistic.fetch(BOOK, BOOK.ID.equal(5));
    -BookRecord book2 = optimistic.fetch(BOOK, BOOK.ID.equal(5));
    -
    -// Change the title and store this book. The underlying database record has not been modified, it can be safely updated.
    -book1.setTitle("Animal Farm");
    -book1.store();
    -
    -// Book2 still references the original TITLE value, but the database holds a new value from book1.store(). 
    -// This store() will thus fail:
    -book2.setTitle("1984");
    -book2.store();]]></java><html>								
    -	
    -									<h3>Optimised optimistic locking using TIMESTAMP fields</h3>
    -									<p>
    -										If you're using jOOQ's <reference id="code-generation" title="code generator"/>, you can take indicate TIMESTAMP or UPDATE COUNTER fields for every generated table in the <reference id="codegen-advanced" title="code generation configuration"/>. Let's say we have this table:
    -									</p>
    -
    -</html><sql><![CDATA[CREATE TABLE book (
    -  
    -  -- This column indicates when each book record was modified for the last time
    -  MODIFIED TIMESTAMP NOT NULL,
    -  -- [...]
    -)]]></sql><html>									
    -
    -									<p>
    -										The MODIFIED column will contain a timestamp indicating the last modification timestamp for any book in the BOOK table. If you're using jOOQ and it's <reference id="crud-with-updatablerecords" title="store() methods on UpdatableRecords"/>, jOOQ will then generate this TIMESTAMP value for you, automatically. However, instead of running an additional <reference id="for-update-clause" title="SELECT .. FOR UPDATE"/> statement prior to an UPDATE or DELETE statement, jOOQ adds a WHERE-clause to the UPDATE or DELETE statement, checking for TIMESTAMP's integrity. This can be best illustrated with an example:   
    -									</p>
    -									
    -</html><java><![CDATA[// Properly configure the DSLContext
    -DSLContext optimistic = DSL.using(connection, SQLDialect.ORACLE, 
    -  new Settings().withExecuteWithOptimisticLocking(true));
    -  
    -// Fetch a book two times
    -BookRecord book1 = optimistic.fetch(BOOK, BOOK.ID.equal(5));
    -BookRecord book2 = optimistic.fetch(BOOK, BOOK.ID.equal(5));
    -
    -// Change the title and store this book. The MODIFIED value has not been changed since the book was fetched. 
    -// It can be safely updated
    -book1.setTitle("Animal Farm");
    -book1.store();
    -
    -// Book2 still references the original MODIFIED value, but the database holds a new value from book1.store(). 
    -// This store() will thus fail:
    -book2.setTitle("1984");
    -book2.store();]]></java><html>
    -
    -									<p>
    -										As before, without the added TIMESTAMP column, optimistic locking is transparent to the API.
    -									</p>
    -									
    -									<h3>Optimised optimistic locking using VERSION fields</h3>
    -									<p>
    -										Instead of using TIMESTAMPs, you may also use numeric VERSION fields, containing version numbers that are incremented by jOOQ upon store() calls.
    -									</p>
    -
    -									<p>
    -										Note, for explicit pessimistic locking, please consider the manual's section about the <reference id="for-update-clause" title="FOR UPDATE clause"/>. For more details about how to configure TIMESTAMP or VERSION fields, consider the manual's section about <reference id="codegen-advanced" title="advanced code generator configuration"/>.
    -									</p>
    -								</html></content>
    -							</section>
    -
    -							<section id="batch-execution-for-crud">
    -								<title>Batch execution</title>
    -								<content><html>
    -									<p>
    -										When inserting, updating, deleting a lot of records, you may wish to profit from JDBC batch operations, which can be performed by jOOQ. These are available through jOOQ's <reference id="dsl-context" title="DSLContext"/> as shown in the following example:
    -									</p>
    -									
    -</html><java><![CDATA[// Fetch a bunch of books
    -List<BookRecord> books = create.fetch(BOOK);
    -
    -// Modify the above books, and add some new ones:
    -modify(books);
    -addMore(books);
    -
    -// Batch-update and/or insert all of the above books
    -create.batchStore(books);]]></java><html>					
    -
    -									<p>
    -										Internally, jOOQ will render all the required SQL statements and execute them as a regular <reference id="batch-execution" title="JDBC batch execution"/>. 
    -									</p>				
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -				    <section id="daos">
    -						<title>DAOs</title>
    -						<content><html>
    -							<p>
    -								If you're using jOOQ's <reference id="code-generation" title="code generator"/>, you can configure it to generate <reference id="pojos" title="POJOs" /> and DAOs for you. jOOQ then generates one DAO per <reference id="crud-with-updatablerecords" title="UpdatableRecord"/>, i.e. per table with a single-column primary key. Generated DAOs implement a common jOOQ type called <reference class="org.jooq.DAO"/>. This type contains the following methods:
    -							</p>
    -							
    -</html><java><![CDATA[// <R> corresponds to the DAO's related table
    -// <P> corresponds to the DAO's related generated POJO type
    -// <T> corresponds to the DAO's related table's primary key type. 
    -// Note that multi-column primary keys are not yet supported by DAOs
    -public interface DAO<R extends TableRecord<R>, P, T> {
    -
    -    // These methods allow for inserting POJOs
    -    void insert(P object) throws DataAccessException;
    -    void insert(P... objects) throws DataAccessException;
    -    void insert(Collection<P> objects) throws DataAccessException;
    -    
    -    // These methods allow for updating POJOs based on their primary key
    -    void update(P object) throws DataAccessException;
    -    void update(P... objects) throws DataAccessException;
    -    void update(Collection<P> objects) throws DataAccessException;
    -    
    -    // These methods allow for deleting POJOs based on their primary key
    -    void delete(P... objects) throws DataAccessException;
    -    void delete(Collection<P> objects) throws DataAccessException;
    -    void deleteById(T... ids) throws DataAccessException;
    -    void deleteById(Collection<T> ids) throws DataAccessException;
    -    
    -    // These methods allow for checking record existence
    -    boolean exists(P object) throws DataAccessException;
    -    boolean existsById(T id) throws DataAccessException;
    -    long count() throws DataAccessException;
    -    
    -    // These methods allow for retrieving POJOs by primary key or by some other field
    -    List<P> findAll() throws DataAccessException;
    -    P findById(T id) throws DataAccessException;
    -    <Z> List<P> fetch(Field<Z> field, Z... values) throws DataAccessException;
    -    <Z> P fetchOne(Field<Z> field, Z value) throws DataAccessException;
    -
    -    // These methods provide DAO meta-information
    -    Table<R> getTable();
    -    Class<P> getType();
    -}]]></java><html>
    -
    -							<p>
    -								Besides these base methods, generated DAO classes implement various useful fetch methods. An incomplete example is given here, for the BOOK table:
    -							</p>
    -
    -</html><java><![CDATA[// An example generated BookDao class
    -public class BookDao extends DAOImpl<BookRecord, Book, Integer> {
    -
    -    // Columns with primary / unique keys produce fetchOne() methods    
    -    public Book fetchOneById(Integer value) { ... }
    -
    -    // Other columns produce fetch() methods, returning several records
    -    public List<Book> fetchByAuthorId(Integer... values) { ... }
    -    public List<Book> fetchByTitle(String... values) { ... }
    -}]]></java><html>
    -							<p>
    -								Note that you can further subtype those pre-generated DAO classes, to add more useful DAO methods to them. Using such a DAO is simple:
    -							</p>
    -							
    -</html><java><![CDATA[// Initialise an Configuration
    -Configuration configuration = new DefaultConfiguration().set(connection).set(SQLDialect.ORACLE);
    -
    -// Initialise the DAO with the Configuration
    -BookDao bookDao = new BookDao(configuration);
    -
    -// Start using the DAO
    -Book book = bookDao.findById(5);
    -
    -// Modify and update the POJO
    -book.setTitle("1984");
    -book.setPublishedIn(1948);
    -bookDao.update(book);
    -
    -// Delete it again
    -bookDao.delete(book);]]></java>
    -
    -						</content>
    -					</section>
    -
    -				    <section id="exception-handling">
    -						<title>Exception handling</title>
    -						<content><html>
    -							<h3>Checked vs. unchecked exceptions</h3>
    -							<p>
    -								This is an eternal and religious debate. Pros and cons have been discussed time and again, and it still is a matter of taste, today. In this case, jOOQ clearly takes a side. jOOQ's exception strategy is simple:
    -							</p>
    -							<ul>
    -								<li>All "system exceptions" are unchecked. If in the middle of a transaction involving business logic, there is no way that you can recover sensibly from a lost database connection, or a constraint violation that indicates a bug in your understanding of your database model.</li>
    -								<li>All "business exceptions" are checked. Business exceptions are true exceptions that you should handle (e.g. not enough funds to complete a transaction).</li>
    -							</ul>
    -							<p>
    -								With jOOQ, it's simple. All of jOOQ's exceptions are "system exceptions", hence they are all unchecked.
    -							</p>
    -							
    -							<h3>jOOQ's DataAccessException</h3>
    -							<p>
    -								jOOQ uses its own <reference class="org.jooq.exception.DataAccessException"/> to wrap any underlying <reference class="java.sql.SQLException"/> that might have occurred. Note that all methods in jOOQ that may cause such a DataAccessException document this both in the Javadoc as well as in their method signature.
    -							</p>
    -							<p>
    -								DataAccessException is subtyped several times as follows:
    -							</p>
    -							<ul>
    -								<li><strong>DataAccessException</strong>: General exception usually originating from a <reference class="java.sql.SQLException"/></li>
    -								<li><strong>DataChangedException</strong>: An exception indicating that the database's underlying record has been changed in the mean time (see <reference id="optimistic-locking" title="optimistic locking"/>)</li>
    -								<li><strong>DataTypeException</strong>: Something went wrong during type conversion</li>
    -								<li><strong>DetachedException</strong>: A SQL statement was executed on a "detached" <reference id="crud-with-updatablerecords" title="UpdatableRecord"/> or a "detached" <reference id="sql-statements" title="SQL statement"/>.</li>
    -								<li><strong>InvalidResultException</strong>: An operation was performed expecting only one result, but several results were returned.</li>
    -								<li><strong>MappingException</strong>: Something went wrong when loading a record from a <reference id="pojos" title="POJO"/> or when mapping a record into a POJO</li>
    -							</ul>
    -							
    -							<h3>Override jOOQ's exception handling</h3>
    -							<p>
    -								The following section about <reference id="execute-listeners" title="execute listeners"/> documents means of overriding jOOQ's exception handling, if you wish to deal separately with some types of constraint violations, or if you raise business errors from your database, etc.
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="execute-listeners">
    -						<title>ExecuteListeners</title>
    -						<content><html>
    -							<p>
    -								The <reference id="dsl-context" title="Executor class"/> lets you specify a list of <reference class="org.jooq.ExecuteListener"/> instances. The ExecuteListener is essentially an event listener for Query, Routine, or ResultSet render, prepare, bind, execute, fetch steps. It is a base type for loggers, debuggers, profilers, data collectors, triggers, etc. Advanced ExecuteListeners can also provide custom implementations of Connection, PreparedStatement and ResultSet to jOOQ in apropriate methods.
    -							</p>
    -							<p>
    -								For convenience and better backwards-compatibility, consider extending <reference class="org.jooq.impl.DefaultExecuteListener"/> instead of implementing this interface.
    -							</p>
    -                            
    -                            <h3>Example: Query statistics ExecuteListener</h3>
    -							<p>
    -								Here is a sample implementation of an ExecuteListener, that is simply counting the number of queries per type that are being executed using jOOQ:
    -							</p>
    -
    -</html><java><![CDATA[package com.example;
    -
    -// Extending DefaultExecuteListener, which provides empty implementations for all methods...
    -public class StatisticsListener extends DefaultExecuteListener {
    -    public static Map<ExecuteType, Integer> STATISTICS = new HashMap<ExecuteType, Integer>();
    -
    -    // Count "start" events for every type of query executed by jOOQ
    -    @Override
    -    public void start(ExecuteContext ctx) {
    -        synchronized (STATISTICS) {
    -            Integer count = STATISTICS.get(ctx.type());
    -    
    -            if (count == null) {
    -                count = 0;
    -            }
    -    
    -            STATISTICS.put(ctx.type(), count + 1);
    -        }
    -    }
    -}]]></java><html>
    -
    -							<p>
    -								Now, configure jOOQ's runtime to load your listener
    -							</p>
    -
    -</html><java><![CDATA[// Create a configuration with an appropriate listener provider:
    -Configuration configuration = new DefaultConfiguration().set(connection).set(dialect);
    -configuration.set(new DefaultExecuteListenerProvider(new StatisticsListener()));
    -
    -// Create a DSLContext from the above configuration
    -DSLContext create = DSL.using(configuration);]]></java><html>
    -
    -							<p>
    -								And log results any time with a snippet like this:
    -							</p>
    -
    -</html><java><![CDATA[log.info("STATISTICS");
    -log.info("----------");
    -
    -for (ExecuteType type : ExecuteType.values()) {
    -    log.info(type.name(), StatisticsListener.STATISTICS.get(type) + " executions");
    -}]]></java><html>
    -                            <p>
    -                            	This may result in the following log output:
    -                            </p>
    -
    -</html><config>15:16:52,982  INFO - TEST STATISTICS
    -15:16:52,982  INFO - ---------------
    -15:16:52,983  INFO - READ                     : 919 executions
    -15:16:52,983  INFO - WRITE                    : 117 executions
    -15:16:52,983  INFO - DDL                      : 2 executions
    -15:16:52,983  INFO - BATCH                    : 4 executions
    -15:16:52,983  INFO - ROUTINE                  : 21 executions
    -15:16:52,983  INFO - OTHER                    : 30 executions</config><html>
    -
    -							<p>
    -								Please read the <reference class="org.jooq.ExecuteListener" title="ExecuteListener Javadoc"/> for more details
    -							</p>
    -							
    -							<h3>Example: Custom Logging ExecuteListener</h3>
    -							<p>
    -								The following depicts an example of a custom ExecuteListener, which pretty-prints all queries being executed by jOOQ to stdout:
    -							</p>
    -
    -</html><java><![CDATA[import org.jooq.DSLContext;
    -import org.jooq.ExecuteContext;
    -import org.jooq.conf.Settings;
    -import org.jooq.impl.DefaultExecuteListener;
    -import org.jooq.tools.StringUtils;
    -
    -public class PrettyPrinter extends DefaultExecuteListener {
    -
    -    /**
    -     * Hook into the query execution lifecycle before executing queries
    -     */
    -    @Override
    -    public void executeStart(ExecuteContext ctx) {
    -
    -        // Create a new DSLContext for logging rendering purposes
    -        // This DSLContext doesn't need a connection, only the SQLDialect...
    -        DSLContext create = DSL.using(ctx.dialect(), 
    -        
    -        // ... and the flag for pretty-printing
    -        	new Settings().withRenderFormatted(true));
    -
    -        // If we're executing a query
    -        if (ctx.query() != null) {
    -            System.out.println(create.renderInlined(ctx.query()));
    -        }
    -        
    -        // If we're executing a routine
    -        else if (ctx.routine() != null) {
    -            System.out.println(create.renderInlined(ctx.routine()));
    -        }
    -        
    -        // If we're executing anything else (e.g. plain SQL)
    -        else if (!StringUtils.isBlank(ctx.sql())) {
    -            System.out.println(ctx.sql());
    -        }
    -    }
    -}]]></java><html>
    -							<p>
    -								See also the manual's sections about <reference id="logging" title="logging"/> for more sample implementations of actual ExecuteListeners.
    -							</p>
    -                            
    -                            <h3>Example: Bad query execution ExecuteListener</h3>
    -                            <p>
    -                                You can also use ExecuteListeners to interact with your SQL statements, for instance when you want to check if executed <code><reference id="update-statement" title="UPDATE"/></code> or <code><reference id="delete-statement" title="DELETE"/></code> statements contain a <code>WHERE</code> clause. This can be achieved trivially with the following sample ExecuteListener:
    -                            </p>
    -                            
    -</html><java><![CDATA[public class DeleteOrUpdateWithoutWhereListener extends DefaultExecuteListener {
    -
    -    @Override
    -    public void renderEnd(ExecuteContext ctx) {
    -        if (ctx.sql().matches("^(?i:(UPDATE|DELETE)(?!.* WHERE ).*)$")) {
    -            throw new DeleteOrUpdateWithoutWhereException();
    -        }
    -    }
    -}
    -
    -public class DeleteOrUpdateWithoutWhereException extends RuntimeException {}
    -]]></java><html>
    -                            <p>
    -                                You might want to replace the above implementation with a more efficient and more reliable one, of course.
    -                            </p>
    -						</html></content>
    -					</section>
    -
    -					<section id="meta-data">
    -						<title>Database meta data</title>
    -						<content><html>
    -							<p>
    -								Since jOOQ 3.0, a simple wrapping API has been added to wrap JDBC's rather awkward <reference class="java.sql.DatabaseMetaData"/>. This API is still experimental, as the calls to the underlying JDBC type are not always available for all SQL dialects.
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="logging">
    -						<title>Logging</title>
    -						<content><html>
    -							<p>
    -								jOOQ logs all SQL queries and fetched result sets to its internal DEBUG logger, which is implemented as an <reference id="execute-listeners" title="execute listener"/>. By default, execute logging is activated in the <reference id="custom-settings" title="jOOQ Settings"/>. In order to see any DEBUG log output, put either log4j or slf4j on jOOQ's classpath along with their respective configuration. A sample log4j configuration can be seen here:
    -							</p>
    -							
    -</html><xml><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
    -<log4j:configuration>
    -    <appender name="stdout" class="org.apache.log4j.ConsoleAppender">
    -        <layout class="org.apache.log4j.PatternLayout">
    -            <param name="ConversionPattern" value="%m%n" />
    -        </layout>
    -    </appender>
    -
    -    <root>
    -        <priority value="debug" />
    -        <appender-ref ref="stdout" />
    -    </root>
    -</log4j:configuration>]]></xml><html>
    -
    -							<p>
    -								With the above configuration, let's fetch some data with jOOQ
    -							</p>
    -							
    -</html><java><![CDATA[create.select(BOOK.ID, BOOK.TITLE).from(BOOK).orderBy(BOOK.ID).limit(1, 2).fetch();]]></java><html>
    -
    -							<p>
    -								The above query may result in the following log output:
    -							</p>
    -
    -</html><text><![CDATA[Executing query          : select "BOOK"."ID", "BOOK"."TITLE" from "BOOK" order by "BOOK"."ID" asc limit ? offset ?
    --> with bind values      : select "BOOK"."ID", "BOOK"."TITLE" from "BOOK" order by "BOOK"."ID" asc limit 2 offset 1
    -Query executed           : Total: 1.439ms
    -Fetched result           : +----+------------+
    -                         : |  ID|TITLE       |
    -                         : +----+------------+
    -                         : |   2|Animal Farm |
    -                         : |   3|O Alquimista|
    -                         : +----+------------+
    -Finishing                : Total: 4.814ms, +3.375ms
    -]]></text><html>
    -
    -							<p>
    -								Essentially, jOOQ will log
    -							</p>
    -							<ul>
    -								<li>The SQL statement as rendered to the prepared statement</li>
    -								<li>The SQL statement with inlined bind values (for improved debugging)</li>
    -								<li>The query execution time</li>
    -								<li>The first 5 records of the result. This is formatted using <reference id="exporting-text" title="jOOQ's text export"/></li>
    -								<li>The total execution + fetching time</li>
    -							</ul>
    -
    -							<p>
    -								If you wish to use your own logger (e.g. avoiding printing out sensitive data), you can deactivate jOOQ's logger using <reference id="custom-settings" title="your custom settings"/> and implement your own <reference id="execute-listeners" title="execute listener logger"/>.
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="performance-considerations">
    -						<title>Performance considerations</title>
    -						<content><html>
    -							<p>
    -								Many users may have switched from higher-level abstractions such as Hibernate to jOOQ, because of Hibernate's difficult-to-manage performance, when it comes to large database schemas and complex second-level caching strategies. However, jOOQ itself is not a lightweight database abstraction framework, and it comes with its own overhead. Please be sure to consider the following points:
    -							</p>
    -							<ul>
    -								<li>It takes some time to construct jOOQ queries. If you can reuse the same queries, you might cache them. Beware of thread-safety issues, though, as jOOQ's <reference id="dsl-context" title="Configuration"/> is not necessarily threadsafe, and queries are "attached" to their creating DSLContext</li>
    -								<li>It takes some time to render SQL strings. Internally, jOOQ reuses the same <reference class="java.lang.StringBuilder"/> for the complete query, but some rendering elements may take their time. You could, of course, cache SQL generated by jOOQ and prepare your own <reference class="java.sql.PreparedStatement"/> objects</li>
    -								<li>It takes some time to bind values to prepared statements. jOOQ does not keep any open prepared statements, internally. Use a sophisticated connection pool, that will cache prepared statements and inject them into jOOQ through the standard JDBC API</li>
    -								<li>It takes some time to fetch results. By default, jOOQ will always fetch the complete <reference class="java.sql.ResultSet"/> into memory. Use <reference id="lazy-fetching" title="lazy fetching"/> to prevent that, and scroll over an open underlying database cursor</li>
    -							</ul>
    -							
    -							<h3>Optimise wisely</h3>
    -							<p>
    -								Don't be put off by the above paragraphs. You should optimise wisely, i.e. only in places where you really need very high throughput to your database. jOOQ's overhead compared to plain JDBC is typically less than 1ms per query.
    -							</p>
    -						</html></content>
    -					</section>
    -				</sections>
    -			</section>
    -
    -			<section id="code-generation">
    -				<title>Code generation</title>
    -				<content><html>
    -					<p>
    -						While optional, source code generation is one of jOOQ's main assets if you wish to increase developer productivity. jOOQ's code generator takes your database schema and reverse-engineers it into a set of Java classes modelling <reference id="table-expressions" title="tables"/>, <reference id="record-vs-tablerecord" title="records"/>, <reference id="sequence-execution" title="sequences"/>, <reference id="pojos" title="POJOs"/>, <reference id="daos" title="DAOs"/>, <reference id="stored-procedures" title="stored procedures"/>, user-defined types and many more.
    -					</p>
    -					<p>
    -						The essential ideas behind source code generation are these:
    -					</p>
    -					<ul>
    -						<li><strong>Increased IDE support</strong>: Type your Java code directly against your database schema, with all type information available</li>
    -						<li><strong>Type-safety</strong>: When your database schema changes, your generated code will change as well. Removing columns will lead to compilation errors, which you can detect early.</li>
    -					</ul>
    -					<p>
    -						The following chapters will show how to configure the code generator and how to generate various artefacts.
    -					</p>
    -				</html></content>
    -
    -				<sections>
    -				    <section id="codegen-configuration">
    -						<title>Configuration and setup of the generator</title>
    -						<content><html>
    -							<p>
    -								There are three binaries available with jOOQ, to be downloaded from <a href="https://sourceforge.net/projects/jooq/">SourceForge</a> or from Maven central:
    -							</p>
    -							<ul>
    -								<li>
    -									<strong>jooq-{jooq-version}.jar</strong>
    -									<br />
    -									The main library that you will include in your application to run jOOQ
    -								</li>
    -								<li>
    -									<strong>jooq-meta-{jooq-version}.jar</strong>
    -									<br />
    -									The utility that you will include in your build to navigate your database schema for code generation. This can be used as a schema crawler as well.
    -								</li>
    -								<li>
    -									<strong>jooq-codegen-{jooq-version}.jar</strong>
    -									<br />
    -									The utility that you will include in your build to generate your database schema
    -								</li>
    -							</ul>
    -
    -							<h3>Configure jOOQ's code generator</h3>
    -							<p>
    -								You need to tell jOOQ some things about your database connection. Here's an example of how to do it for an Oracle database
    -							</p>
    -							
    -</html><xml><![CDATA[<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    -<configuration>
    -  <!-- Configure the database connection here -->
    -  <jdbc>
    -    <driver>oracle.jdbc.OracleDriver</driver>
    -    <url>jdbc:oracle:thin:@[your jdbc connection parameters]</url>
    -    <user>[your database user]</user>
    -    <password>[your database password]</password>
    -    
    -    <!-- You can also pass user/password and other JDBC properties in the optional properties tag: -->
    -    <properties>
    -      <property><key>user</key><value>[db-user]</value></property>
    -      <property><key>password</key><value>[db-password]</value></property>
    -    </properties>
    -  </jdbc>
    -
    -  <generator>
    -    <database>
    -      <!-- The database dialect from jooq-meta. Available dialects are
    -           named org.util.[database].[database]Database. Known values are:
    -
    -           org.jooq.util.ase.ASEDatabase (to be used with Sybase ASE)
    -           org.jooq.util.cubrid.CUBRIDDatabase
    -           org.jooq.util.db2.DB2Database
    -           org.jooq.util.derby.DerbyDatabase
    -           org.jooq.util.h2.H2Database
    -           org.jooq.util.hsqldb.HSQLDBDatabase
    -           org.jooq.util.ingres.IngresDatabase
    -           org.jooq.util.mysql.MySQLDatabase
    -           org.jooq.util.oracle.OracleDatabase
    -           org.jooq.util.postgres.PostgresDatabase
    -           org.jooq.util.sqlite.SQLiteDatabase
    -           org.jooq.util.sqlserver.SQLServerDatabase
    -           org.jooq.util.sybase.SybaseDatabase (to be used with Sybase SQL Anywhere)
    -
    -           You can also provide your own org.jooq.util.Database implementation
    -           here, if your database is currently not supported or if you wish to
    -           read the database schema from a file, such as a Hibernate .hbm.xml file -->
    -      <name>org.jooq.util.oracle.OracleDatabase</name>
    -
    -      <!-- All elements that are generated from your schema (A Java regular expression. 
    -           Use the pipe to separate several expressions) Watch out for
    -           case-sensitivity. Depending on your database, this might be
    -           important! You can create case-insensitive regular expressions
    -           using this syntax: (?i:expr) -->
    -      <includes>.*</includes>
    -
    -      <!-- All elements that are excluded from your schema (A Java regular expression. 
    -           Use the pipe to separate several expressions). Excludes match before
    -           includes -->
    -      <excludes></excludes>
    -
    -      <!-- The schema that is used locally as a source for meta information.
    -           This could be your development schema or the production schema, etc
    -           This cannot be combined with the schemata element.
    -
    -           If left empty, jOOQ will generate all available schemata. See the
    -           manual's next section to learn how to generate several schemata -->
    -      <inputSchema>[your database schema / owner / name]</inputSchema>
    -    </database>
    -
    -    <generate>
    -      <!-- Generation flags: See advanced configuration properties -->
    -    </generate>
    -
    -    <target>
    -      <!-- The destination package of your generated classes (within the
    -           destination directory)
    -           
    -           jOOQ may append the schema name to this package if generating multiple schemas,
    -           e.g. org.jooq.your.packagename.schema1
    -                org.jooq.your.packagename.schema2 -->
    -      <packageName>[org.jooq.your.packagename]</packageName>
    -
    -      <!-- The destination directory of your generated classes -->
    -      <directory>[/path/to/your/dir]</directory>
    -    </target>
    -  </generator>
    -</configuration>]]></xml><html>
    -
    -							<p>
    -								There are also lots of advanced configuration parameters, which will be treated in the <reference id="codegen-advanced" title="manual's section about advanced code generation features"/> Note, you can find the official XSD file for a formal specification at:<br/>
    -							    <a href="http://www.jooq.org/xsd/jooq-codegen-{codegen-xsd-version}.xsd" title="The jOOQ-codegen configuration XSD">http://www.jooq.org/xsd/jooq-codegen-{codegen-xsd-version}.xsd</a>
    -						    </p>
    -
    -							<h3>Run jOOQ code generation</h3>
    -							<p>
    -								Code generation works by calling this class with the above property file as argument.
    -							</p>
    -							
    -</html><config>org.jooq.util.GenerationTool /jooq-config.xml</config><html>
    -
    -							<p>
    -								Be sure that these elements are located on the classpath:
    -							</p>
    -							
    -							<ul>
    -								<li>The XML configuration file</li>
    -								<li>jooq-{jooq-version}.jar, jooq-meta-{jooq-version}.jar, jooq-codegen-{jooq-version}.jar</li>
    -								<li>The JDBC driver you configured</li>
    -							</ul>
    -
    -							<h3>A command-line example (For Windows, unix/linux/etc will be similar)</h3>
    -							<ul>
    -								<li>Put the property file, jooq*.jar and the JDBC driver into a directory, e.g. C:\temp\jooq</li>
    -							    <li>Go to C:\temp\jooq</li>
    -							    <li>Run java -cp jooq-{jooq-version}.jar;jooq-meta-{jooq-version}.jar;jooq-codegen-{jooq-version}.jar;[JDBC-driver].jar;. org.jooq.util.GenerationTool /[XML file] </li>
    -							</ul>
    -							<p>
    -								Note that the property file must be passed as a classpath resource
    -							</p>
    -
    -							<h3>Run code generation from Eclipse</h3>
    -							<p>
    -								Of course, you can also run code generation from your IDE. In Eclipse, set up a project like this. Note that:
    -							</p>
    -                            <ul>
    -                                <li>this example uses jOOQ's log4j support by adding log4j.xml and log4j.jar to the project classpath.</li>
    -                                <li>the actual jooq-{jooq-version}.jar, jooq-meta-{jooq-version}.jar, jooq-codegen-{jooq-version}.jar artefacts may contain version numbers in the file names.</li>
    -                            </ul>
    -                            
    -							<div class="screenshot">
    -							<img class="screenshot" src="&lt;?=$root?&gt;/img/eclipse-example-01.png" alt="Eclipse configuration"/>
    -							</div>
    -
    -							<p>
    -								Once the project is set up correctly with all required artefacts on the classpath, you can configure an Eclipse Run Configuration for org.jooq.util.GenerationTool.
    -							</p>
    -							<div class="screenshot">
    -							<img class="screenshot" src="&lt;?=$root?&gt;/img/eclipse-example-02.png" alt="Eclipse configuration"/>
    -							</div>
    -
    -							<p>
    -								With the XML file as an argument
    -							</p>
    -							<div class="screenshot">
    -							<img class="screenshot" src="&lt;?=$root?&gt;/img/eclipse-example-03.png" alt="Eclipse configuration"/>
    -							</div>
    -
    -							<p>
    -								And the classpath set up correctly
    -							</p>
    -							<div class="screenshot">
    -							<img class="screenshot" src="&lt;?=$root?&gt;/img/eclipse-example-04.png" alt="Eclipse configuration"/>
    -							</div>
    -
    -							<p>
    -								Finally, run the code generation and see your generated artefacts
    -							</p>
    -							<div class="screenshot">
    -							<img class="screenshot" src="&lt;?=$root?&gt;/img/eclipse-example-05.png" alt="Eclipse configuration"/>
    -							</div>
    -
    -							<h3>Run generation with ant</h3>
    -							<p>
    -								When running code generation with ant's &lt;java/&gt; task, you may have to set fork="true":
    -							</p>
    -
    -</html><xml><![CDATA[<!-- Run the code generation task -->
    -<target name="generate-test-classes">
    -  <java fork="true" classname="org.jooq.util.GenerationTool">
    -    [...]
    -  </java><html>
    -</target>
    -]]></xml><html>
    -
    -							<h3>Integrate generation with Maven</h3>
    -							<p>
    -								Using the official jOOQ-codegen-maven plugin, you can integrate source code generation in your Maven build process:
    -							</p>
    -
    -</html><xml><![CDATA[<plugin>
    -
    -  <!-- Specify the maven code generator plugin -->
    -  <groupId>org.jooq</groupId>
    -  <artifactId>jooq-codegen-maven</artifactId>
    -  <version>{jooq-version}</version>
    -
    -  <!-- The plugin should hook into the generate goal -->
    -  <executions>
    -    <execution>
    -      <goals>
    -        <goal>generate</goal>
    -      </goals>
    -    </execution>
    -  </executions>
    -
    -  <!-- Manage the plugin's dependency. In this example, we'll use a PostgreSQL database -->
    -  <dependencies>
    -    <dependency>
    -      <groupId>postgresql</groupId>
    -      <artifactId>postgresql</artifactId>
    -      <version>8.4-702.jdbc4</version>
    -    </dependency>
    -  </dependencies>
    -
    -  <!-- Specify the plugin configuration.
    -       The configuration format is the same as for the standalone code generator -->
    -  <configuration>
    -
    -    <!-- JDBC connection parameters -->
    -    <jdbc>
    -      <driver>org.postgresql.Driver</driver>
    -      <url>jdbc:postgresql:postgres</url>
    -      <user>postgres</user>
    -      <password>test</password>
    -    </jdbc>
    -
    -    <!-- Generator parameters -->
    -    <generator>
    -      <name>org.jooq.util.DefaultGenerator</name>
    -      <database>
    -        <name>org.jooq.util.postgres.PostgresDatabase</name>
    -        <includes>.*</includes>
    -        <excludes></excludes>
    -        <inputSchema>public</inputSchema>
    -      </database>
    -      <target>
    -        <packageName>org.jooq.util.maven.example</packageName>
    -        <directory>target/generated-sources/jooq</directory>
    -      </target>
    -    </generator>
    -  </configuration>
    -</plugin>
    -]]></xml><html>
    -
    -							<p>
    -								See the full example of a pom.xml including the jOOQ-codegen artefact here:<br/>
    -								<a href="https://github.com/jOOQ/jOOQ/blob/master/jOOQ-codegen-maven-example/pom.xml"
    -								  title="jOOQ-codegen-maven example pom.xml file">https://github.com/jOOQ/jOOQ/blob/master/jOOQ-codegen-maven-example/pom.xml</a>
    -							  </p>
    -
    -							<h3>Use jOOQ generated classes in your application</h3>
    -							<p>
    -								Be sure, both jooq-{jooq-version}.jar and your generated package (see configuration) are located on your classpath. Once this is done, you can execute SQL statements with your generated classes.
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="codegen-advanced">
    -						<title>Advanced generator configuration</title>
    -						<content><html>
    -							<p>
    -								In the <reference id="codegen-configuration" title="previous section"/> we have seen how jOOQ's source code generator is configured and run within a few steps. In this chapter we'll cover some advanced settings
    -							</p>
    -
    -</html><xml><![CDATA[<!-- These properties can be added directly to the generator element: -->
    -<generator>
    -  <!-- The default code generator. You can override this one, to generate your own code style
    -       Defaults to org.jooq.util.DefaultGenerator -->
    -  <name>org.jooq.util.DefaultGenerator</name>
    -
    -  <!-- The naming strategy used for class and field names.
    -       You may override this with your custom naming strategy. Some examples follow
    -       Defaults to org.jooq.util.DefaultGeneratorStrategy -->
    -  <strategy>
    -    <name>org.jooq.util.DefaultGeneratorStrategy</name>
    -  </strategy>
    -</generator>]]></xml><html>
    -
    -							<p>
    -								The following example shows how you can override the DefaultGeneratorStrategy to render table and column names the way they are defined in the database, rather than switching them to camel case:
    -							</p>
    -
    -</html><java><![CDATA[/**
    - * It is recommended that you extend the DefaultGeneratorStrategy. Most of the
    - * GeneratorStrategy API is already declared final. You only need to override any
    - * of the following methods, for whatever generation behaviour you'd like to achieve
    - *
    - * Beware that most methods also receive a "Mode" object, to tell you whether a
    - * TableDefinition is being rendered as a Table, Record, POJO, etc. Depending on
    - * that information, you can add a suffix only for TableRecords, not for Tables
    - */
    -public class AsInDatabaseStrategy extends DefaultGeneratorStrategy {
    -
    -    /**
    -     * Override this to specifiy what identifiers in Java should look like.
    -     * This will just take the identifier as defined in the database.
    -     */
    -    @Override
    -    public String getJavaIdentifier(Definition definition) {
    -        return definition.getOutputName();
    -    }
    -
    -    /**
    -     * Override these to specify what a setter in Java should look like. Setters
    -     * are used in TableRecords, UDTRecords, and POJOs. This example will name
    -     * setters "set[NAME_IN_DATABASE]"
    -     */
    -    @Override
    -    public String getJavaSetterName(Definition definition, Mode mode) {
    -        return "set" + definition.getOutputName();
    -    }
    -
    -    /**
    -     * Just like setters...
    -     */
    -    @Override
    -    public String getJavaGetterName(Definition definition, Mode mode) {
    -        return "get" + definition.getOutputName();
    -    }
    -
    -    /**
    -     * Override this method to define what a Java method generated from a database
    -     * Definition should look like. This is used mostly for convenience methods
    -     * when calling stored procedures and functions. This example shows how to
    -     * set a prefix to a CamelCase version of your procedure
    -     */
    -    @Override
    -    public String getJavaMethodName(Definition definition, Mode mode) {
    -        return "call" + org.jooq.tools.StringUtils.toCamelCase(definition.getOutputName());
    -    }
    -
    -    /**
    -     * Override this method to define how your Java classes and Java files should
    -     * be named. This example applies no custom setting and uses CamelCase versions
    -     * instead
    -     */
    -    @Override
    -    public String getJavaClassName(Definition definition, Mode mode) {
    -        return super.getJavaClassName(definition, mode);
    -    }
    -
    -    /**
    -     * Override this method to re-define the package names of your generated
    -     * artefacts.
    -     */
    -    @Override
    -    public String getJavaPackageName(Definition definition, Mode mode) {
    -        return super.getJavaPackageName(definition, mode);
    -    }
    -
    -    /**
    -     * Override this method to define how Java members should be named. This is
    -     * used for POJOs and method arguments
    -     */
    -    @Override
    -    public String getJavaMemberName(Definition definition, Mode mode) {
    -        return definition.getOutputName();
    -    }
    -
    -    /**
    -     * Override this method to define the base class for those artefacts that
    -     * allow for custom base classes
    -     */
    -    @Override
    -    public String getJavaClassExtends(Definition definition, Mode mode) {
    -        return Object.class.getName();
    -    }
    -
    -    /**
    -     * Override this method to define the interfaces to be implemented by those
    -     * artefacts that allow for custom interface implementation
    -     */
    -    @Override
    -    public List<String> getJavaClassImplements(Definition definition, Mode mode) {
    -        return Arrays.asList(Serializable.class.getName(), Cloneable.class.getName());
    -    }
    -
    -    /**
    -     * Override this method to define the suffix to apply to routines when
    -     * they are overloaded.
    -     *
    -     * Use this to resolve compile-time conflicts in generated source code, in
    -     * case you make heavy use of procedure overloading
    -     */
    -    @Override
    -    public String getOverloadSuffix(Definition definition, Mode mode, String overloadIndex) {
    -        return "_OverloadIndex_" + overloadIndex;
    -    }
    -}]]></java><html>
    -
    -                            <p>
    -                                More examples can be found here:
    -                            </p>
    -                            <ul>
    -                                <li><a href="https://github.com/jOOQ/jOOQ/blob/master/jOOQ-codegen/src/main/java/org/jooq/util/example/JPrefixGeneratorStrategy.java">org.jooq.util.example.JPrefixGeneratorStrategy</a></li>
    -                                <li><a href="https://github.com/jOOQ/jOOQ/blob/master/jOOQ-codegen/src/main/java/org/jooq/util/example/JVMArgsGeneratorStrategy.java">org.jooq.util.example.JVMArgsGeneratorStrategy</a></li>
    -                            </ul>
    -
    -                            <h3>jooq-meta configuration</h3>
    -							<p>
    -								Within the &lt;generator/&gt; element, there are other configuration elements:
    -							</p>
    -
    -</html><xml><![CDATA[<!-- These properties can be added to the database element: -->
    -<database>
    -
    -  <!-- All table and view columns that are used as "version" fields for
    -       optimistic locking (A Java regular expression. Use the pipe to separate several expressions).
    -       See UpdatableRecord.store() and UpdatableRecord.delete() for details -->
    -  <recordVersionFields>REC_VERSION</recordVersionFields/>
    -
    -  <!-- All table and view columns that are used as "timestamp" fields for
    -       optimistic locking (A Java regular expression. Use the pipe to separate several expressions).
    -       See UpdatableRecord.store() and UpdatableRecord.delete() for details -->
    -  <recordTimestampFields>REC_TIMESTAMP</recordTimestampFields/>
    -      
    -  <!-- Generate java.sql.Timestamp fields for DATE columns. This is
    -       particularly useful for Oracle databases.
    -       Defaults to false -->
    -  <dateAsTimestamp>false</dateAsTimestamp>
    -
    -  <!-- Generate jOOU data types for your unsigned data types, which are
    -       not natively supported in Java.
    -       Defaults to true -->
    -  <unsignedTypes>true</unsignedTypes>
    -
    -  <!-- The schema that is used in generated source code. This will be the
    -       production schema. Use this to override your local development
    -       schema name for source code generation. If not specified, this
    -       will be the same as the input-schema. -->
    -  <outputSchema>[your database schema / owner / name]</outputSchema>
    -
    -  <!-- A configuration element to configure several input and/or output
    -       schemata for jooq-meta, in case you're using jooq-meta in a multi-
    -       schema environment.
    -       This cannot be combined with the above inputSchema / outputSchema -->
    -  <schemata>
    -    <schema>
    -      <inputSchema>...</inputSchema>
    -      <outputSchema>...</outputSchema>
    -    </schema>
    -    [ <schema>...</schema> ... ]
    -  </schemata>
    -
    -  <!-- A configuration element to configure custom data types -->
    -  <customTypes>...</customTypes>
    -
    -  <!-- A configuration element to configure type overrides for generated
    -       artefacts (e.g. in combination with customTypes) -->
    -  <forcedTypes>...</forcedTypes>
    -</database>]]></xml><html>
    -
    -							<p>
    -								Check out the some of the manual's "advanced" sections to find out more about the advanced configuration parameters.
    -							</p>
    -							<ul>
    -								<li><reference id="schema-mapping" title="Schema mapping"/></li>
    -								<li><reference id="custom-data-types" title="Custom types"/></li>
    -							</ul>
    -
    -							<h3>jooq-codegen configuration</h3>
    -                            <p>
    -                            	Also, you can add some optional advanced configuration parameters for the generator:
    -                           	</p>
    -
    -</html><xml><![CDATA[<!-- These properties can be added to the generate element: -->
    -<generate>
    -  <!-- Primary key / foreign key relations should be generated and used.
    -       This is a prerequisite for various advanced features.
    -       Defaults to true -->
    -  <relations>true</relations>
    -
    -  <!-- Generate deprecated code for backwards compatibility
    -       Defaults to true -->
    -  <deprecated>true</deprecated>
    -
    -  <!-- Generate instance fields in your tables, as opposed to static
    -       fields. This simplifies aliasing.
    -       Defaults to true -->
    -  <instanceFields>true</instanceFields>
    -
    -  <!-- Generate the javax.annotation.Generated annotation to indicate
    -       jOOQ version used for source code.
    -       Defaults to true -->
    -  <generatedAnnotation>true</generatedAnnotation>
    -
    -  <!-- Generate jOOQ Record classes for type-safe querying. You can
    -       turn this off, if you don't need "active records" for CRUD
    -       Defaults to true -->
    -  <records>true</records>
    -
    -  <!-- Generate POJOs in addition to Record classes for usage of the
    -       ResultQuery.fetchInto(Class) API
    -       Defaults to false -->
    -  <pojos>false</pojos>
    -
    -  <!-- Generate immutable POJOs for usage of the ResultQuery.fetchInto(Class) API
    -       This overrides any value set in <pojos/>
    -       Defaults to false -->
    -  <immutablePojos>false</immutablePojos>
    -
    -  <!-- Generate interfaces that will be implemented by records and/or pojos.
    -       You can also use these interfaces in Record.into(Class<?>) and similar
    -       methods, to let jOOQ return proxy objects for them.
    -       Defaults to false -->
    -  <interfaces>false</interfaces>
    -
    -  <!-- Generate DAOs in addition to POJO classes
    -       Defaults to false -->
    -  <daos>false</daos>
    -
    -  <!-- Annotate POJOs and Records with JPA annotations for increased
    -       compatibility and better integration with JPA/Hibernate, etc
    -       Defaults to false -->
    -  <jpaAnnotations>false</jpaAnnotations>
    -
    -  <!-- Annotate POJOs and Records with JSR-303 validation annotations
    -       Defaults to false -->
    -  <validationAnnotations>false</validationAnnotations>
    -  
    -  <!-- Allow to turn off the generation of global object references, which include
    -  
    -       - Tables.java
    -       - Sequences.java
    -       - UDTs.java
    -  
    -       Turning off the generation of the above files may be necessary for very
    -       large schemas, which exceed the amount of allowed constants in a class's
    -       constant pool (64k) or, whose static initialiser would exceed 64k of
    -       byte code
    -       
    -       Defaults to true -->
    -  <globalObjectReferences>true</globalObjectReferences>
    -</generate>]]></xml><html>
    -
    -							<h3>Property interdependencies</h3>
    -							<p>
    -								Some of the above properties depend on other properties to work correctly. For instance, when generating immutable pojos, pojos must be generated. jOOQ will enforce such properties even if you tell it otherwise. Here is a list of property interdependencies:
    -							</p>
    -							
    -							<ul>
    -								<li>When <code>daos = true</code>, then jOOQ will set <code>relations = true</code></li>
    -								<li>When <code>daos = true</code>, then jOOQ will set <code>records = true</code></li>
    -								<li>When <code>daos = true</code>, then jOOQ will set <code>pojos = true</code></li>
    -								<li>When <code>immutablePojos = true</code>, then jOOQ will set <code>pojos = true</code></li>
    -							</ul>
    -						</html></content>
    -					</section>
    -
    -				    <section id="codegen-globals">
    -						<title>Generated global artefacts</title>
    -						<content><html>
    -							<p>
    -								For increased convenience at the use-site, jOOQ generates "global" artefacts at the code generation root location, referencing tables, routines, sequences, etc. In detail, these global artefacts include the following:
    -							</p>
    -							<ul>
    -								<li><strong>Keys.java</strong>: This file contains all of the required primary key, unique key, foreign key and identity references in the form of static members of type <reference class="org.jooq.Key"/>.</li>
    -								<li><strong>Routines.java</strong>: This file contains all standalone routines (not in packages) in the form of static factory methods for <reference class="org.jooq.Routine"/> types.</li>
    -								<li><strong>Sequences.java</strong>: This file contains all sequence objects in the form of static members of type <reference class="org.jooq.Sequence"/>.</li>
    -								<li><strong>Tables.java</strong>: This file contains all table objects in the form of static member references to the actual singleton <reference class="org.jooq.Table"/> object</li>
    -								<li><strong>UDTs.java</strong>: This file contains all UDT objects in the form of static member references to the actual singleton <reference class="org.jooq.UDT"/> object</li>
    -							</ul>
    -							
    -							<h3>Referencing global artefacts</h3>
    -							<p>
    -								When referencing global artefacts from your client application, you would typically static import them as such:
    -							</p>
    -							
    -</html><java><![CDATA[// Static imports for all global artefacts
    -import static com.example.generated.Routines.*;
    -import static com.example.generated.Sequences.*;
    -import static com.example.generated.Tables.*;
    -
    -// You could then reference your artefacts as follows:
    -create.insertInto(MY_TABLE)
    -      .values(MY_SEQUENCE.nextval(), myFunction())
    -      
    -// as a more concise form of this:
    -create.insertInto(com.example.generated.Tables.MY_TABLE)
    -      .values(com.example.generated.Sequences.MY_SEQUENCE.nextval(), com.example.generated.Routines.myFunction())]]></java>
    -						</content>
    -					</section>
    -
    -				    <section id="codegen-tables">
    -						<title>Generated tables</title>
    -						<content><html>
    -							<p>
    -								Every table in your database will generate a <reference class="org.jooq.Table"/> implementation that looks like this:
    -							</p>
    -							
    -</html><java><![CDATA[public class Book extends TableImpl<BookRecord> {
    -
    -    // The singleton instance
    -    public static final Book BOOK = new Book();
    -
    -    // Generated columns
    -    public final TableField<BookRecord, Integer> ID        = createField("ID",        SQLDataType.INTEGER, this);
    -    public final TableField<BookRecord, Integer> AUTHOR_ID = createField("AUTHOR_ID", SQLDataType.INTEGER, this);
    -    public final TableField<BookRecord, String>  ITLE      = createField("TITLE",     SQLDataType.VARCHAR, this);
    -
    -    // Covariant aliasing method, returning a table of the same type as BOOK
    -    @Override
    -    public Book as(java.lang.String alias) {
    -        return new Book(alias);
    -    }
    -    
    -    // [...]
    -}]]></java><html>
    -
    -							<h3>Flags influencing generated tables</h3>
    -							<p>
    -								These flags from the <reference id="codegen-advanced" title="code generation configuration"/> influence generated tables:
    -							</p>
    -							<ul>
    -								<li><strong>recordVersionFields</strong>: Relevant methods from super classes are overridden to return the VERSION field</li>
    -								<li><strong>recordTimestampFields</strong>: Relevant methods from super classes are overridden to return the TIMESTAMP field</li>
    -								<li><strong>dateAsTimestamp</strong>: This influences all relevant columns</li>
    -								<li><strong>unsignedTypes</strong>: This influences all relevant columns</li>
    -								<li><strong>relations</strong>: Relevant methods from super classes are overridden to provide primary key, unique key, foreign key and identity information</li>
    -								<li><strong>instanceFields</strong>: This flag controls the "static" keyword on table columns, as well as aliasing convenience</li>
    -								<li><strong>records</strong>: The generated record type is referenced from tables allowing for type-safe single-table record fetching</li>
    -							</ul>
    -							
    -							<h3>Flags controlling table generation</h3>
    -							<p>
    -								Table generation cannot be deactivated
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="codegen-records">
    -						<title>Generated records</title>
    -						<content><html>
    -							<p>
    -								Every table in your database will generate a <reference class="org.jooq.Table"/> implementation that looks like this:
    -							</p>
    -							
    -</html><java><![CDATA[// JPA annotations can be generated, optionally
    -@Entity
    -@Table(name = "BOOK", schema = "TEST")
    -public class BookRecord extends UpdatableRecordImpl<BookRecord> 
    -
    -// An interface common to records and pojos can be generated, optionally
    -implements IBook {
    -
    -    // Every column generates a setter and a getter
    -    @Override
    -    public void setId(Integer value) {
    -        setValue(BOOK.ID, value);
    -    }
    -    
    -    @Id
    -    @Column(name = "ID", unique = true, nullable = false, precision = 7)
    -    @Override
    -    public Integer getId() {
    -        return getValue(BOOK.ID);
    -    }
    -    
    -    // More setters and getters
    -    public void setAuthorId(Integer value) {...}
    -    public Integer getAuthorId() {...}
    -    
    -    // Convenience methods for foreign key methods
    -    public void setAuthorId(AuthorRecord value) {
    -        if (value == null) {
    -            setValue(BOOK.AUTHOR_ID, null);
    -        }
    -        else {
    -            setValue(BOOK.AUTHOR_ID, value.getValue(AUTHOR.ID));
    -        }
    -    }
    -    
    -    // Navigation methods
    -    public AuthorRecord fetchAuthor() {
    -        return create().selectFrom(AUTHOR).where(AUTHOR.ID.equal(getValue(BOOK.AUTHOR_ID))).fetchOne();
    -    }
    -    
    -    // [...]
    -}]]></java><html>							
    -							
    -							<h3>Flags influencing generated records</h3>
    -							<p>
    -								These flags from the <reference id="codegen-advanced" title="code generation configuration"/> influence generated records:
    -							</p>
    -							<ul>
    -								<li><strong>dateAsTimestamp</strong>: This influences all relevant getters and setters</li>
    -								<li><strong>unsignedTypes</strong>: This influences all relevant getters and setters</li>
    -								<li><strong>relations</strong>: This is needed as a prerequisite for navigation methods</li>
    -								<li><strong>navigationMethods</strong>: This controls whether navigation methods will be generated or not</li>
    -								<li><strong>daos</strong>: Records are a pre-requisite for DAOs. If DAOs are generated, records are generated as well</li>
    -								<li><strong>interfaces</strong>: If interfaces are generated, records will implement them</li>
    -								<li><strong>jpaAnnotations</strong>: JPA annotations are used on generated records</li>
    -							</ul>
    -														
    -							<h3>Flags controlling record generation</h3>
    -							<p>
    -								Record generation can be deactivated using the <strong>records</strong> flag
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="codegen-pojos">
    -						<title>Generated POJOs</title>
    -						<content><html>
    -							<p>
    -								Every table in your database will generate a POJO implementation that looks like this:
    -							</p>
    -							
    -</html><java><![CDATA[// JPA annotations can be generated, optionally
    -@javax.persistence.Entity
    -@javax.persistence.Table(name = "BOOK", schema = "TEST")
    -public class Book implements java.io.Serializable
    -
    -// An interface common to records and pojos can be generated, optionally
    -, IBook {
    -
    -    // JSR-303 annotations can be generated, optionally
    -    @NotNull
    -    private Integer id;
    -
    -    @NotNull
    -    private Integer authorId;
    -
    -    @NotNull
    -    @Size(max = 400)
    -    private String title;
    -
    -    // Every column generates a getter and a setter
    -    @Id
    -    @Column(name = "ID", unique = true, nullable = false, precision = 7)
    -    @Override
    -    public Integer getId() {
    -        return this.id;
    -    }
    -
    -    @Override
    -    public void setId(Integer id) {
    -        this.id = id;
    -    }
    -    
    -    // [...]
    -}]]></java><html>							
    -							
    -							<h3>Flags influencing generated POJOs</h3>
    -							<p>
    -								These flags from the <reference id="codegen-advanced" title="code generation configuration"/> influence generated POJOs:
    -							</p>
    -							<ul>
    -								<li><strong>dateAsTimestamp</strong>: This influences all relevant getters and setters</li>
    -								<li><strong>unsignedTypes</strong>: This influences all relevant getters and setters</li>
    -								<li><strong>interfaces</strong>: If interfaces are generated, POJOs will implement them</li>
    -								<li><strong>immutablePojos</strong>: Immutable POJOs have final members and no setters. All members must be passed to the constructor</li>
    -								<li><strong>daos</strong>: POJOs are a pre-requisite for DAOs. If DAOs are generated, POJOs are generated as well</li>
    -								<li><strong>jpaAnnotations</strong>: JPA annotations are used on generated records</li>
    -								<li><strong>validationAnnotations</strong>: JSR-303 validation annotations are used on generated records</li>
    -							</ul>
    -														
    -							<h3>Flags controlling POJO generation</h3>
    -							<p>
    -								POJO generation can be activated using the <strong>pojos</strong> flag
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="codegen-interfaces">
    -						<title>Generated Interfaces</title>
    -						<content><html>
    -							<p>
    -								Every table in your database will generate an interface that looks like this:
    -							</p>
    -							
    -</html><java><![CDATA[public interface IBook extends java.io.Serializable {
    -
    -    // Every column generates a getter and a setter
    -    public void setId(Integer value);
    -    public Integer getId();
    -    
    -    // [...]
    -}]]></java><html>    						
    -							
    -							<h3>Flags influencing generated interfaces</h3>
    -							<p>
    -								These flags from the <reference id="codegen-advanced" title="code generation configuration"/> influence generated interfaces:
    -							</p>
    -							<ul>
    -								<li><strong>dateAsTimestamp</strong>: This influences all relevant getters and setters</li>
    -								<li><strong>unsignedTypes</strong>: This influences all relevant getters and setters</li>
    -							</ul>
    -														
    -							<h3>Flags controlling POJO generation</h3>
    -							<p>
    -								POJO generation can be activated using the <strong>interfaces</strong> flag
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="codegen-daos">
    -						<title>Generated DAOs</title>
    -						<content><html>
    -							<h3>Generated DAOs</h3>
    -							<p>
    -								Every table in your database will generate a <reference class="org.jooq.DAO"/> implementation that looks like this:
    -							</p>
    -							
    -</html><java><![CDATA[public class BookDao extends DAOImpl<BookRecord, Book, Integer> {
    -
    -    // Generated constructors
    -    public BookDao() {
    -        super(BOOK, Book.class);
    -    }
    -
    -    public BookDao(Configuration configuration) {
    -        super(BOOK, Book.class, configuration);
    -    }
    -
    -    // Every column generates at least one fetch method
    -    public List<Book> fetchById(Integer... values) {
    -        return fetch(BOOK.ID, values);
    -    }
    -
    -    public Book fetchOneById(Integer value) {
    -        return fetchOne(BOOK.ID, value);
    -    }
    -
    -    public List<Book> fetchByAuthorId(Integer... values) {
    -        return fetch(BOOK.AUTHOR_ID, values);
    -    }
    -    
    -    // [...]
    -}]]></java><html>							
    -							
    -							<h3>Flags controlling DAO generation</h3>
    -							<p>
    -								DAO generation can be activated using the <strong>daos</strong> flag
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="codegen-sequences">
    -						<title>Generated sequences</title>
    -						<content><html>
    -							<p>
    -								Every sequence in your database will generate a <reference class="org.jooq.Sequence"/> implementation that looks like this:
    -							</p>
    -							
    -</html><java><![CDATA[public final class Sequences {
    -
    -    // Every sequence generates a member
    -    public static final Sequence<Integer> S_AUTHOR_ID = new SequenceImpl<Integer>("S_AUTHOR_ID", TEST, SQLDataType.INTEGER);
    -}]]></java><html>		
    -							
    -							<h3>Flags controlling sequence generation</h3>
    -							<p>
    -								Sequence generation cannot be deactivated
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="codegen-procedures">
    -						<title>Generated procedures</title>
    -						<content><html>
    -							<p>
    -								Every procedure or function (routine) in your database will generate a <reference class="org.jooq.Routine"/> implementation that looks like this:
    -							</p>
    -
    -</html><java><![CDATA[public class AuthorExists extends AbstractRoutine<java.lang.Void> {
    -
    -    // All IN, IN OUT, OUT parameters and function return values generate a static member
    -    public static final Parameter<String>     AUTHOR_NAME = createParameter("AUTHOR_NAME", SQLDataType.VARCHAR);
    -    public static final Parameter<BigDecimal> RESULT      = createParameter("RESULT",      SQLDataType.NUMERIC);
    -
    -    // A constructor for a new "empty" procedure call
    -    public AuthorExists() {
    -        super("AUTHOR_EXISTS", TEST);
    -
    -        addInParameter(AUTHOR_NAME);
    -        addOutParameter(RESULT);
    -    }
    -
    -    // Every IN and IN OUT parameter generates a setter
    -    public void setAuthorName(String value) {
    -        setValue(AUTHOR_NAME, value);
    -    }
    -
    -    // Every IN OUT, OUT and RETURN_VALUE generates a getter
    -    public BigDecimal getResult() {
    -        return getValue(RESULT);
    -    }
    -    
    -    // [...]
    -}]]></java><html>
    -
    -							<h3>Package and member procedures or functions</h3>
    -							<p>
    -								Procedures or functions contained in packages or UDTs are generated in a sub-package that corresponds to the package or UDT name.
    -							</p>
    -
    -							<h3>Flags controlling routine generation</h3>
    -							<p>
    -								Routine generation cannot be deactivated
    -							</p>
    -						</html></content>
    -					</section>
    -
    -				    <section id="codegen-udts">
    -						<title>Generated UDTs</title>
    -						<content><html>
    -							<p>
    -								Every UDT in your database will generate a <reference class="org.jooq.UDT"/> implementation that looks like this:
    -							</p>
    -						
    -</html><java><![CDATA[public class AddressType extends UDTImpl<AddressTypeRecord> {
    -
    -    // The singleton UDT instance
    -    public static final UAddressType U_ADDRESS_TYPE = new UAddressType();
    -
    -    // Every UDT attribute generates a static member
    -    public static final UDTField<AddressTypeRecord, String> ZIP     = 
    -      createField("ZIP",     SQLDataType.VARCHAR, U_ADDRESS_TYPE);
    -    public static final UDTField<AddressTypeRecord, String> CITY    = 
    -      createField("CITY",    SQLDataType.VARCHAR, U_ADDRESS_TYPE);
    -    public static final UDTField<AddressTypeRecord, String> COUNTRY = 
    -      createField("COUNTRY", SQLDataType.VARCHAR, U_ADDRESS_TYPE);
    -    
    -    // [...]
    -}]]></java><html>						
    -										
    -							<p>
    -								Besides the <reference class="org.jooq.UDT"/> implementation, a <reference class="org.jooq.UDTRecord"/> implementation is also generated
    -							</p>		
    -
    -</html><java><![CDATA[public class AddressTypeRecord extends UDTRecordImpl<AddressTypeRecord> {
    -
    -    // Every attribute generates a getter and a setter
    -
    -    public void setZip(String value) {...}
    -    public String getZip() {...}
    -    public void setCity(String value) {...}
    -    public String getCity() {...}
    -    public void setCountry(String value) {...}
    -    public String getCountry() {...}
    -    
    -    // [...]
    -}]]></java><html>						
    -
    -							<h3>Flags controlling UDT generation</h3>
    -							<p>
    -								UDT generation cannot be deactivated
    -							</p>
    -						</html></content>
    -					</section>
    -
    -
    -                    <section id="data-type-rewrites">
    -                        <title>Data type rewrites</title>
    -                        <content><html>
    -                            <p>
    -                                Sometimes, the actual database data type does not match the SQL data type that you would like to use in Java. This is often the case for ill-supported SQL data types, such as <code>BOOLEAN</code> or <code>UUID</code>. jOOQ's code generator allows you to apply simple data type rewriting. The following configuration will rewrite <code>IS_VALID</code> columns in all tables to be of type <code>BOOLEAN</code>.
    -                            </p>
    -
    -
    -</html><xml><![CDATA[<database>
    -
    -  <!-- Associate data type rewrites with database columns -->
    -  <forcedTypes>
    -    <forcedType>
    -      <!-- Specify any data type from org.jooq.impl.SQLDataType -->
    -      <name>BOOLEAN</name>
    -
    -      <!-- Add a Java regular expression matching fully-qualified columns. 
    -           Use the pipe to separate several expressions -->
    -      <expressions>.*\.IS_VALID</expressions>
    -    </forcedType>
    -  </forcedTypes>
    -</database>]]></xml><html>
    -
    -                            <p>
    -                                See the section about <reference id="custom-data-types" title="Custom data types"/> for rewriting columns to your own custom data types.
    -                            </p>
    -                        </html></content>
    -                    </section>
    -
    -
    -				    <section id="custom-data-types">
    -						<title>Custom data types and type conversion</title>
    -						<content><html>
    -							<p>
    -								When using a custom type in jOOQ, you need to let jOOQ know about its associated <reference class="org.jooq.Converter"/>. Ad-hoc usages of such converters has been discussed in the chapter about <reference id="data-type-conversion" title="data type conversion"/>. A more common use-case, however, is to let jOOQ know about custom types at code generation time. Use the following configuration elements to specify, that you'd like to use GregorianCalendar for all database fields that start with DATE_OF_
    -      						</p>
    -
    -</html><xml><![CDATA[<database>
    -  <!-- First, register your custom types here -->
    -  <customTypes>
    -    <customType>
    -      <!-- Specify the fully-qualified class name of your custom type -->
    -      <name>java.util.GregorianCalendar</name>
    -
    -      <!-- Associate that custom type with your converter. Note, a
    -           custom type can only have one converter in jOOQ -->
    -      <converter>com.example.CalendarConverter</converter>
    -    </customType>
    -  </customTypes>
    -
    -  <!-- Then, associate custom types with database columns -->
    -  <forcedTypes>
    -    <forcedType>
    -      <!-- Specify again he fully-qualified class name of your custom type -->
    -      <name>java.util.GregorianCalendar</name>
    -
    -      <!-- Add a Java regular expression matching fully-columns. 
    -           Use the pipe to separate several expressions -->
    -      <expressions>.*\.DATE_OF_.*</expressions>
    -    </forcedType>
    -  </forcedTypes>
    -</database>]]></xml><html>
    -
    -                            <p>
    -                            	The above configuration will lead to AUTHOR.DATE_OF_BIRTH being generated like this:
    -                            </p>
    -
    -</html><java><![CDATA[public class TAuthor extends TableImpl<TAuthorRecord> {
    -
    -    // [...]
    -    public final TableField<TAuthorRecord, GregorianCalendar> DATE_OF_BIRTH =    // [...]
    -    // [...]
    -
    -}]]></java><html>
    -
    -                            <p>
    -                            	This means that the bound type of &lt;T&gt; will be GregorianCalendar, wherever you reference DATE_OF_BIRTH. jOOQ will use your custom converter when binding variables and when fetching data from <reference class="java.util.ResultSet"/>:
    -                            </p>
    -
    -</html><java><![CDATA[// Get all date of births of authors born after 1980
    -List<GregorianCalendar> result =
    -create.selectFrom(AUTHOR)
    -      .where(AUTHOR.DATE_OF_BIRTH.greaterThan(new GregorianCalendar(1980, 0, 1)))
    -      .fetch(AUTHOR.DATE_OF_BIRTH);]]></java>
    -
    -						</content>
    -					</section>
    -
    -				    <section id="schema-mapping">
    -						<title>Mapping generated schemata and tables</title>
    -						<content><html>
    -							<p>
    -								We've seen previously in the chapter about <reference id="runtime-schema-mapping" title="runtime schema mapping"/>, that schemata and tables can be mapped at runtime to other names. But you can also hard-wire schema mapping in generated artefacts at code generation time, e.g. when you have 5 developers with their own dedicated developer databases, and a common integration database. In the code generation configuration, you would then write.
    -							</p>
    -
    -</html><xml><![CDATA[<schemata>
    -  <schema>
    -    <!-- Use this as the developer's schema: -->
    -    <inputSchema>LUKAS_DEV_SCHEMA</inputSchema>
    -
    -    <!-- Use this as the integration / production database: -->
    -    <outputSchema>PROD</outputSchema>
    -  </schema>
    -</schemata>]]></xml>
    -
    -						</content>
    -					</section>
    -					
    -					<section id="codegen-large-schemas">
    -						<title>Code generation for large schemas</title>
    -						<content><html>
    -							<p>
    -								Databases can become very large in real-world applications. This is not a problem for jOOQ's code generator, but it can be for the Java compiler. jOOQ generates some classes for <reference id="codegen-globals" title="global access"/>. These classes can hit two sorts of limits of the compiler / JVM:
    -							</p>
    -							
    -							<ul>
    -								<li>Methods (including static / instance initialisers) are allowed to contain only 64kb of bytecode.</li>
    -								<li>Classes are allowed to contain at most 64k of constant literals</li>
    -							</ul>
    -							
    -							<p>
    -								While there exist workarounds for the above two limitations (delegating initialisations to nested classes, inheriting constant literals from implemented interfaces), the preferred approach is either one of these:
    -							</p>
    -							
    -							<ul>
    -								<li>Distribute your database objects in several schemas. That is probably a good idea anyway for such large databases</li>
    -								<li><reference id="codegen-configuration" title="Configure jOOQ's code generator"/> to exclude excess database objects</li>
    -								<li><reference id="codegen-configuration" title="Configure jOOQ's code generator"/> to avoid generating <reference id="codegen-globals" title="global objects"/> using <code>&lt;globalObjectReferences/&gt;</code></li>
    -								<li>Remove uncompilable classes after code generation</li>
    -							</ul>
    -						</html></content>
    -					</section>
    -				</sections>
    -			</section>
    -
    -			<section id="tools">
    -				<title>Tools</title>
    -				<content><html>
    -					<p>
    -						These chapters hold some information about tools to be used with jOOQ
    -					</p>
    -				</html></content>
    -
    -				<sections>
    -					<section id="jdbc-mocking">
    -						<title>JDBC mocking for unit testing</title>
    -						<content><html>
    -							<p>
    -								When writing unit tests for your data access layer, you have probably used some generic mocking tool offered by popular providers like <a href="http://code.google.com/p/mockito/">Mockito</a>, <a href="http://jmock.org/">jmock</a>, <a href="http://mockrunner.sourceforge.net/">mockrunner</a>, or even <a href="http://www.dbunit.org/">DBUnit</a>. With jOOQ, you can take advantage of the built-in JDBC mock API that allows you to simulate a database on the JDBC level for precisely those SQL/JDBC use cases supported by jOOQ.
    -							</p>
    -							
    -							<h3>Mocking the JDBC API</h3>
    -							<p>
    -								JDBC is a very complex API. It takes a lot of time to write a useful and correct mock implementation, implementing at least these interfaces:
    -							</p>
    -							<ul>
    -								<li><reference class="java.sql.Connection"/></li>
    -								<li><reference class="java.sql.Statement"/></li>
    -								<li><reference class="java.sql.PreparedStatement"/></li>
    -								<li><reference class="java.sql.CallableStatement"/></li>
    -								<li><reference class="java.sql.ResultSet"/></li>
    -								<li><reference class="java.sql.ResultSetMetaData"/></li>
    -							</ul>
    -							
    -							<p>
    -								Optionally, you may even want to implement interfaces, such as <reference class="java.sql.Array"/>, <reference class="java.sql.Blob"/>, <reference class="java.sql.Clob"/>, and many others. In addition to the above, you might need to find a way to simultaneously support incompatible JDBC minor versions, such as 4.0, 4.1
    -							</p>
    -							
    -							<h3>Using jOOQ's own mock API</h3>
    -							<p>
    -								This work is greatly simplified, when using jOOQ's own mock API. The <code>org.jooq.tools.jdbc</code> package contains all the essential implementations for both JDBC 4.0 and 4.1, which are needed to mock JDBC for jOOQ. In order to write mock tests, provide the jOOQ <reference id="dsl-context" title="Configuration"/> with a <reference class="org.jooq.tools.jdbc.MockConnection" title="MockConnection"/>, and implement the <reference class="org.jooq.tools.jdbc.MockDataProvider" title="MockDataProvider"/>:
    -							</p>
    -							
    -</html><java><![CDATA[// Initialise your data provider (implementation further down):
    -MockDataProvider provider = new MyProvider();
    -MockConnection connection = new MockConnection(provider);
    -
    -// Pass the mock connection to a jOOQ DSLContext:
    -DSLContext create = DSL.using(connection, SQLDialect.ORACLE);
    -
    -// Execute queries transparently, with the above DSLContext:
    -Result<BookRecord> result = create.selectFrom(BOOK).where(BOOK.ID.equal(5)).fetch();]]></java><html>
    -
    -                            <p>
    -                                As you can see, the configuration setup is simple. Now, the <code>MockDataProvider</code> acts as your single point of contact with JDBC / jOOQ. It unifies any of these execution modes, transparently:
    -                            </p>
    -                            
    -                            <ul>
    -                                <li>Statements without results</li>
    -                                <li>Statements without results but with generated keys</li>
    -                                <li>Statements with results</li>
    -                                <li>Statements with several results</li>
    -                                <li>Batch statements with single queries and multiple bind value sets</li>
    -                                <li>Batch statements with multiple queries and no bind values</li>
    -                            </ul>
    -                            
    -                            <p>
    -                                The above are the execution modes supported by jOOQ. Whether you're using any of jOOQ's various fetching modes (e.g. <reference id="pojos" title="pojo fetching"/>, <reference id="lazy-fetching" title="lazy fetching"/>, <reference id="many-fetching" title="many fetching"/>, <reference id="later-fetching" title="later fetching"/>) is irrelevant, as those modes are all built on top of the standard JDBC API.
    -                            </p>
    -                            
    -                            <h3>Implementing MockDataProvider</h3>
    -                            <p>
    -                                 Now, here's how to implement <code>MockDataProvider</code>:
    -                            </p>
    -                            
    -</html><java><![CDATA[public class MyProvider implements MockDataProvider {
    -
    -    @Override
    -    public MockResult[] execute(MockExecuteContext ctx) throws SQLException {
    -
    -        // You might need a DSLContext to create org.jooq.Result and org.jooq.Record objects
    -        DSLContext create = DSL.using(SQLDialect.ORACLE);
    -        MockResult[] mock = new MockResult[1];
    -        
    -        // The execute context contains SQL string(s), bind values, and other meta-data
    -        String sql = ctx.sql();
    -        
    -        // Exceptions are propagated through the JDBC and jOOQ APIs
    -        if (sql.toUpperCase().startsWith("DROP")) {
    -            throw new SQLException("Statement not supported: " + sql);
    -        }
    -        
    -        // You decide, whether any given statement returns results, and how many
    -        else if (sql.toUpperCase().startsWith("SELECT")) {
    -            
    -            // Always return one author record
    -            Result<AuthorRecord> result = create.newResult(AUTHOR);
    -            result.add(create.newRecord(AUTHOR));
    -            result.get(0).setValue(AUTHOR.ID, 1);
    -            result.get(0).setValue(AUTHOR.LAST_NAME, "Orwell");
    -            mock[0] = new MockResult(1, result);
    -        }
    -        
    -        // You can detect batch statements easily
    -        else if (ctx.batch()) {
    -            // [...]
    -        }
    -        
    -        return mock;
    -    }
    -}]]></java><html>
    -
    -							<p>
    -								Essentially, the <reference class="org.jooq.tools.jdbc.MockExecuteContext" title="MockExecuteContext"/> contains all the necessary information for you to decide, what kind of data you should return. The <reference class="org.jooq.tools.jdbc.MockResult" title="MockResult"/> wraps up two pieces of information:
    -							</p>
    -							<ul>
    -							    <li> <reference class="java.sql.Statement" anchor="#getUpdateCount" title="Statement.getUpdateCount()"/>: The number of affected rows</li>
    -							    <li> <reference class="java.sql.Statement" anchor="#getResultSet()" title="Statement.getResultSet()"/>: The result set</li>
    -							</ul>
    -							
    -							<p>
    -								You should return as many <code>MockResult</code> objects as there were query executions (in <reference id="batch-execution" title="batch mode"/>) or results (in <reference id="many-fetching" title="fetch-many mode"/>). Instead of an awkward JDBC <code>ResultSet</code>, however, you can construct a "friendlier" <reference class="org.jooq.Result"/> with your own record types. The jOOQ mock API will use meta data provided with this <code>Result</code> in order to create the necessary JDBC <reference class="java.sql.ResultSetMetaData"/> 
    -							</p>
    -														
    -							<p>
    -								See the <reference class="org.jooq.tools.jdbc.MockDataProvider" title="MockDataProvider Javadoc"/> for a list of rules that you should follow.
    -							</p>
    -						</html></content>
    -					</section>
    -					
    -					<section id="jooq-console">
    -						<title>jOOQ Console</title>
    -						<content><html>
    -							<p>
    -							    The jOOQ Console is no longer supported or shipped with jOOQ 3.2+. You may still use the jOOQ 3.1 Console with new versions of jOOQ, at your own risk.
    -						    </p>
    -						</html></content>
    -					</section>
    -				</sections>
    -			</section>
    -
    -			<section id="reference">
    -				<title>Reference</title>
    -				<content><html>
    -					<p>
    -						These chapters hold some general jOOQ reference information
    -					</p>
    -				</html></content>
    -
    -				<sections>
    -					<section id="supported-rdbms">
    -						<title>Supported RDBMS</title>
    -						<content><html>
    -							<h3>A list of supported databases</h3>
    -							<p>
    -						   		Every RDMBS out there has its own little specialties. jOOQ considers those specialties as much as possible, while trying to standardise the behaviour in jOOQ. In order to increase the quality of jOOQ, some 70 unit tests are run for syntax and variable binding verification, as well as some 180 integration tests with an overall of around 1200 queries for any of these databases:
    -					   		</p>
    -							<ul>
    -							    <li>CUBRID 8.4.1 and 9.0.0</li>
    -							    <li>DB2 9.7</li>
    -							    <li>Derby 10.8</li>
    -							    <li>Firebird 2.5.1</li>
    -							    <li>H2 1.3.161</li>
    -							    <li>HSQLDB 2.2.5</li>
    -							    <li>Ingres 10.1.0</li>
    -							    <li>MySQL 5.1.41 and 5.5.8</li>
    -							    <li>Oracle XE 10.2.0.1.0 and 11g</li>
    -							    <li>PostgreSQL 9.0</li>
    -							    <li>SQLite with inofficial JDBC driver v056</li>
    -							    <li>SQL Server 2008 R8 and 2012</li>
    -							    <li>Sybase Adaptive Server Enterprise 15.5</li>
    -							    <li>Sybase SQL Anywhere 12</li>
    -							</ul>
    -							<p>
    -								These platforms have been observed to work as well, but are not integration-tested
    -							</p>
    -							<ul>
    -								<li>Google Cloud SQL (MySQL)</li>
    -							</ul>
    -								
    -							<h3>Databases planned for support</h3>
    -							<p>
    -								Any of the following databases might be available in the future
    -							</p>
    -						    <ul>
    -							    <li>Informix</li>
    -							    <li>Interbase</li>
    -							    <li>MS Access</li>
    -							    <li>MS Excel</li>
    -							    <li>SQL Azure</li>
    -							    <li>Sybase SQL Anywhere OnDemand</li>
    -							    <li>Teradata</li>
    -						    </ul>
    -						    
    -							<h3>Databases being watched</h3>
    -							<p>
    -								Any of the following databases are being observed for a potential integration
    -							</p>
    -							<ul>
    -								<li>Mondrian</li>
    -								<li>Netezza</li>
    -								<li>SQLFire</li>
    -								<li>Vectorwise</li>
    -								<li>Vertica</li>
    -								<li>VoltDB</li>
    -							</ul>
    -
    -							<h3>Feature matrix</h3>
    -							<p>
    -								This section will soon contain a feature matrix, documenting what feature is available for which database.
    -							</p>
    -						</html></content>
    -					</section>
    -
    -					<section id="reference-data-types">
    -						<title>Data types</title>
    -						<content><html>
    -							<p>
    -								There is always a small mismatch between SQL data types and Java data types. This is for two reasons:
    -							</p>
    -							<ul>
    -								<li>SQL data types are insufficiently covered by the JDBC API.</li>
    -								<li>Java data types are often less expressive than SQL data types</li>
    -							</ul>
    -							<p>
    -								This chapter should document the most important notes about SQL, JDBC and jOOQ data types.
    -							</p>
    -						</html></content>
    -						
    -						<sections>
    -							<section id="data-types-lobs">
    -								<title>BLOBs and CLOBs</title>
    -								<content><html>
    -									<p>
    -										jOOQ currently doesn't explicitly support JDBC BLOB and CLOB data types. If you use any of these data types in your database, jOOQ will map them to byte[] and String instead. In simple cases (small data), this simplification is sufficient. In more sophisticated cases, you may have to bypass jOOQ, in order to deal with these data types and their respective resources. True support for LOBs is on the roadmap, though.
    -									</p>
    -								</html></content>
    -							</section>
    -							
    -							<section id="data-types-unsigned">
    -								<title>Unsigned integer types</title>
    -								<content><html>
    -									<p>
    -										Some databases explicitly support unsigned integer data types. In most normal JDBC-based applications, they would just be mapped to their signed counterparts letting bit-wise shifting and tweaking to the user. jOOQ ships with a set of unsigned <reference class="java.lang.Number"/> implementations modelling the following types:
    -									</p>
    -									<ul>
    -										<li><reference class="org.jooq.types.UByte"/>: Unsigned byte, an 8-bit unsigned integer</li>
    -										<li><reference class="org.jooq.types.UShort"/>: Unsigned short, a 16-bit unsigned integer</li>
    -										<li><reference class="org.jooq.types.UInteger"/>: Unsigned int, a 32-bit unsigned integer</li>
    -										<li><reference class="org.jooq.types.ULong"/>: Unsigned long, a 64-bit unsigned integer</li>
    -									</ul>
    -									<p>
    -										Each of these wrapper types extends <reference class="java.lang.Number"/>, wrapping a higher-level integer type, internally:
    -									</p>
    -									<ul>
    -										<li>UByte wraps <reference class="java.lang.Short"/></li>
    -										<li>UShort wraps <reference class="java.lang.Integer"/></li>
    -										<li>UInteger wraps <reference class="java.lang.Long"/></li>
    -										<li>ULong wraps <reference class="java.math.BigInteger"/></li>
    -									</ul>
    -								</html></content>
    -							</section>
    -							
    -							<section id="data-types-intervals">
    -								<title>INTERVAL data types</title>
    -								<content><html>
    -									<p>
    -										jOOQ fills a gap opened by JDBC, which neglects an important SQL data type as defined by the SQL standards: INTERVAL types. SQL knows two different types of intervals:
    -									</p>
    -									<ul>
    -										<li><strong>YEAR TO MONTH</strong>: This interval type models a number of months and years</li>
    -										<li><strong>DAY TO SECOND</strong>: This interval type models a number of days, hours, minutes, seconds and milliseconds</li>
    -									</ul>
    -									
    -									<p>
    -										Both interval types ship with a variant of subtypes, such as DAY TO HOUR, HOUR TO SECOND, etc. jOOQ models these types as Java objects extending <reference class="java.lang.Number"/>: <reference class="org.jooq.types.YearToMonth"/> (where Number.intValue() corresponds to the absolute number of months) and <reference class="org.jooq.types.DayToSecond"/> (where Number.intValue() corresponds to the absolute number of milliseconds)
    -									</p>
    -									
    -									<h3>Interval arithmetic</h3>
    -									<p>
    -										In addition to the <reference id="arithmetic-expressions" title="arithmetic expressions"/> documented previously, interval arithmetic is also supported by jOOQ. Essentially, the following operations are supported:
    -									</p>
    -									<ul>
    -										<li>DATETIME - DATETIME => INTERVAL</li>
    -										<li>DATETIME + or - INTERVAL => DATETIME</li>
    -										<li>INTERVAL + DATETIME => DATETIME</li>
    -										<li>INTERVAL + - INTERVAL => INTERVAL</li>
    -										<li>INTERVAL * or / NUMERIC => INTERVAL</li>
    -										<li>NUMERIC * INTERVAL => INTERVAL</li>
    -									</ul>
    -								</html></content>
    -							</section>
    -							
    -							<section id="data-types-xml">
    -								<title>XML data types</title>
    -								<content><html>
    -									<p>
    -										XML data types are currently not supported
    -									</p>
    -								</html></content>
    -							</section>
    -							
    -							<section id="data-types-geospacial">
    -								<title>Geospacial data types</title>
    -								<content><html>
    -									<h3>Geospacial data types</h3>
    -									<p>
    -										Geospacial data types are currently not supported
    -									</p>
    -								</html></content>
    -							</section>
    -							
    -							<section id="data-types-cursors">
    -								<title>CURSOR data types</title>
    -								<content><html>
    -									<p>
    -										Some databases support cursors returned from stored procedures. They are mapped to the following jOOQ data type:
    -									</p>
    -
    -</html><java><![CDATA[Field<Result<Record>> cursor;]]></java><html>
    -									
    -									<p>
    -										In fact, such a cursor will be fetched immediately by jOOQ and wrapped in an <reference class="org.jooq.Result"/> object.
    -									</p>
    -								</html></content>
    -							</section>
    -							
    -							<section id="data-types-arrays">
    -								<title>ARRAY and TABLE data types</title>
    -								<content><html>
    -									<p>
    -										The SQL standard specifies ARRAY data types, that can be mapped to Java arrays as such:
    -									</p>
    -									
    -</html><java><![CDATA[Field<Integer[]> intArray;]]></java><html>
    -										
    -									<p>
    -										The above array type is supported by these SQL dialects:
    -									</p>
    -									<ul>
    -										<li>H2</li>
    -										<li>HSQLDB</li>
    -										<li>Postgres</li>
    -									</ul>
    -									
    -									<h3>Oracle typed arrays</h3>
    -									<p>
    -										Oracle has strongly-typed arrays and table types (as opposed to the previously seen anonymously typed arrays). These arrays are wrapped by <reference class="org.jooq.ArrayRecord"/> types.
    -									</p>
    -								</html></content>
    -							</section>
    -						</sections>
    -					</section>
    -
    -                    <section id="dsl-mapping-rules">
    -                        <title>SQL to DSL mapping rules</title>
    -                        <content><html>
    -                            <p>
    -                                jOOQ takes SQL as an external domain-specific language and maps it onto Java, creating an internal domain-specific language. Internal DSLs cannot 100% implement their external language counter parts, as they have to adhere to the syntax rules of their host or target language (i.e. Java). This section explains the various problems and workarounds encountered and implemented in jOOQ.
    -                            </p>
    -                            
    -                            <h3>SQL allows for "keywordless" syntax</h3>
    -                            <p>
    -                                SQL syntax does not always need keywords to form expressions. The <code><reference id="update-statement" title="UPDATE .. SET"/></code> clause takes various argument assignments:
    -                            </p>
    -     
    -</html><code-pair>
    -<sql>UPDATE t SET a = 1, b = 2</sql>
    -<java>update(t).set(a, 1).set(b, 2)</java>
    -</code-pair><html>
    -
    -                            <p>
    -                                The above example also shows missing operator overloading capabilities, where <code>"="</code> is replaced by <code>","</code> in jOOQ. Another example are <reference id="row-value-expressions" title="row value expressions"/>, which can be formed with parentheses only in SQL:
    -                            </p>
    -
    -</html><code-pair>
    -<sql>(a, b) IN ((1, 2), (3, 4))</sql>
    -<java>row(a, b).in(row(1, 2), row(3, 4))</java>
    -</code-pair><html>
    -
    -                            <p>
    -                                In this case, <code>ROW</code> is an actual (optional) SQL keyword, implemented by at least PostgreSQL.
    -                            </p>
    -                            
    -                            <h3>SQL contains "composed" keywords</h3>
    -                            <p>
    -                                As most languages, SQL does not attribute any meaning to whitespace. However, whitespace is important when forming "composed" keywords, i.e. SQL clauses composed of several keywords. jOOQ follows standard Java method naming conventions to map SQL keywords (case-insensitive) to Java methods (case-sensitive, camel-cased). Some examples:
    -                            </p>
    -                            
    -</html><code-pair>
    -<sql>GROUP BY
    -ORDER BY
    -WHEN MATCHED THEN UPDATE</sql>
    -<java>groupBy()
    -orderBy()
    -whenMatchedThenUpdate()</java>
    -</code-pair><html>
    -
    -                            <p>
    -                                Future versions of jOOQ may use all-uppercased method names in addition to the camel-cased ones (to prevent collisions with Java keywords):
    -                            </p>
    -                            
    -</html><code-pair>
    -<sql>GROUP BY
    -ORDER BY
    -WHEN MATCHED THEN UPDATE</sql>
    -<java>GROUP_BY()
    -ORDER_BY()
    -WHEN_MATCHED_THEN_UPDATE()</java>
    -</code-pair><html>
    -
    -                            <h3>SQL contains "superfluous" keywords</h3>
    -                            <p>
    -                                Some SQL keywords aren't really necessary. They are just part of a keyword-rich language, the way Java developers aren't used to anymore. These keywords date from times when languages such as ADA, BASIC, COBOL, FORTRAN, PASCAL were more verbose:
    -                            </p>
    -                            <ul>
    -                                <li><code>BEGIN .. END</code></li>
    -                                <li><code>REPEAT .. UNTIL</code></li>
    -                                <li><code>IF .. THEN .. ELSE .. END IF</code></li>
    -                            </ul>
    -                            <p>
    -                                jOOQ omits some of those keywords when it is too tedious to write them in Java.
    -                            </p>
    -
    -</html><code-pair>
    -<sql>CASE WHEN .. THEN .. END</sql>
    -<java>decode().when(.., ..)</java>
    -</code-pair><html>
    -
    -                            <p>
    -                                The above example omits <code>THEN</code> and <code>END</code> keywords in Java. Future versions of jOOQ may comprise a more complete DSL, including such keywords again though, to provide a more 1:1 match for the SQL language.
    -                            </p>
    -                            
    -                            <h3>SQL contains "superfluous" syntactic elements</h3>
    -                            <p>
    -                                Some SQL constructs are hard to map to Java, but they are also not really necessary. SQL often expects syntactic parentheses where they wouldn't really be needed, or where they feel slightly inconsistent with the rest of the SQL language. 
    -                            </p>
    -
    -</html><code-pair>
    -<sql>LISTAGG(a, b) WITHIN GROUP (ORDER BY c)
    -              OVER (PARTITION BY d)</sql>
    -<java>listagg(a, b).withinGroupOrderBy(c)
    -             .over().partitionBy(d)</java>
    -</code-pair><html>
    -
    -                            <p>
    -                                The parentheses used for the <code>WITHIN GROUP (..)</code> and <code>OVER (..)</code> clauses are required in SQL but do not seem to add any immediate value. In some cases, jOOQ omits them, although the above might be optionally re-phrased in the future to form a more SQLesque experience:  
    -                            </p>
    -
    -</html><code-pair>
    -<sql>LISTAGG(a, b) WITHIN GROUP (ORDER BY c)
    -              OVER (PARTITION BY d)</sql>
    -<java>listagg(a, b).withinGroup(orderBy(c))
    -             .over(partitionBy(d))</java>
    -</code-pair><html>
    -
    -                            <h3>SQL uses some of Java's reserved words</h3>
    -                            <p>
    -                                Some SQL keywords map onto <a href="http://download.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html">Java Language Keywords</a> if they're mapped using camel-casing. These keywords currently include: 
    -                            </p>
    -                            <ul>
    -                                <li><code>CASE</code></li>
    -                                <li><code>ELSE</code></li>
    -                                <li><code>FOR</code></li>
    -                            </ul>
    -
    -                            <p>
    -                                jOOQ replaces those keywords by "synonyms":
    -                            </p>
    -                            
    -</html><code-pair>
    -<sql>CASE .. ELSE
    -PIVOT .. FOR .. IN ..</sql>
    -<java>decode() .. otherwise()
    -pivot(..).on(..).in(..)</java>
    -</code-pair><html>           
    -
    -                            <p>
    -                                There is more future collision potential with:
    -                            </p>
    -                            <ul>
    -                                <li><code>BOOLEAN</code></li>
    -                                <li><code>CHAR</code></li>
    -                                <li><code>DEFAULT</code></li>
    -                                <li><code>DOUBLE</code></li>
    -                                <li><code>ENUM</code></li>
    -                                <li><code>FLOAT</code></li>
    -                                <li><code>IF</code></li>
    -                                <li><code>INT</code></li>
    -                                <li><code>LONG</code></li>
    -                                <li><code>PACKAGE</code></li>
    -                            </ul>
    -
    -                            <h3>SQL operators cannot be overloaded in Java</h3>
    -                            <p>
    -                                Most SQL operators have to be mapped to descriptive method names in Java, as Java does not allow operator overloading:
    -                            </p>
    -                            
    -</html><code-pair>
    -<sql><![CDATA[=
    -<>, !=
    -||
    -SET a = b]]></sql>
    -<java>equal(), eq()
    -notEqual(), ne()
    -concat()
    -set(a, b)</java>
    -</code-pair><html>
    -
    -                            <p>
    -                                For those users using <reference id="scala-sql-building" title="jOOQ with Scala or Groovy"/>, operator overloading and implicit conversion can be leveraged to enhance jOOQ:
    -                            </p>
    -
    -</html><code-pair>
    -<sql><![CDATA[=
    -<>, !=
    -||]]></sql>
    -<java><![CDATA[===
    -<>, !==
    -||]]></java>
    -</code-pair><html>
    -
    -                            <h3>SQL's reference before declaration capability</h3>
    -                            <p>
    -                                This is less of a syntactic SQL feature than a semantic one. In SQL, objects can be referenced before (i.e. "lexicographically before") they are declared. This is particularly true for <reference id="aliased-tables" title="aliasing"/>
    -                            </p>
    - 
    -</html><code-pair>
    -<sql><![CDATA[SELECT t.a
    -FROM my_table t]]></sql>
    -<java><![CDATA[MyTable t = MY_TABLE.as("t");
    -select(t.a).from(t)]]></java>
    -</code-pair><html>
    -
    -                            <p>
    -                                A more sophisticated example are common table expressions (CTE), which are currently not supported by jOOQ:
    -                            </p>
    -                            
    -</html><sql>WITH t(a, b) AS (
    -  SELECT 1, 2 FROM DUAL
    -)
    -SELECT t.a, t.b
    -FROM t</sql><html>
    -
    -                            <p>
    -                                Common table expressions define a "derived column list", just like <reference id="aliased-tables" title="table aliases"/> can do. The formal record type thus created cannot be typesafely verified by the Java compiler, i.e. it is not possible to formally dereference <code>t.a</code> from <code>t</code>.
    -                            </p>
    -                        </html></content>
    -                    </section>
    -                    
    -					<section id="reference-bnf-notation">
    -						<title>jOOQ's BNF pseudo-notation</title>
    -						<content><html>
    -							<p>
    -								This chapter will soon contain an overview over jOOQ's API using a pseudo BNF notation.
    -							</p>
    -						</html></content>
    -					</section>
    -					
    -					<section id="quality-assurance">
    -						<title>Quality Assurance</title>
    -						<content><html>
    -							<p>
    -								jOOQ is running some of your most mission-critical logic: the interface layer between your Java / Scala application and the database. You have probably chosen jOOQ for any of the following reasons:
    -							</p>
    -							<ul>
    -								<li>To evade JDBC's verbosity and error-proneness due to string concatenation and index-based variable binding</li>
    -								<li>To add lots of type-safety to your inline SQL</li>
    -								<li>To increase productivity when writing inline SQL using your favourite IDE's autocompletion capabilities</li>
    -							</ul>
    -							
    -							<p>
    -								With jOOQ being in the core of your application, you want to be sure that you can trust jOOQ. That is why jOOQ is heavily unit and integration tested with a strong focus on integration tests:
    -							</p>
    -							
    -							<h3>Unit tests</h3>
    -							<p>
    -								Unit tests are performed against dummy JDBC interfaces using <a href="http://jmock.org/" title="jmock">http://jmock.org/</a>. These tests verify that various <reference class="org.jooq.QueryPart"/> implementations render correct SQL and bind variables correctly.
    -							</p>
    -							
    -							<h3>Integration tests</h3>
    -							<p>
    -								This is the most important part of the jOOQ test suites. Some 1500 queries are currently run against a standard integration test database. Both the test database and the queries are translated into every one of the 14 supported SQL dialects to ensure that regressions are unlikely to be introduced into the code base.
    -							</p>
    -							<p>
    -								For libraries like jOOQ, integration tests are much more expressive than unit tests, as there are so many subtle differences in SQL dialects. Simple mocks just don't give as much feedback as an actual database instance.
    -							</p>
    -							<p>
    -								jOOQ integration tests run the weirdest and most unrealistic queries. As a side-effect of these extensive integration test suites, many corner-case bugs for JDBC drivers and/or open source databases have been discovered, feature requests submitted through jOOQ and reported mainly to CUBRID, Derby, H2, HSQLDB.
    -							</p>
    -							
    -							<h3>Code generation tests</h3>
    -							<p>
    -								For every one of the 14 supported integration test databases, source code is generated and the tiniest differences in generated source code can be discovered. In case of compilation errors in generated source code, new test tables/views/columns are added to avoid regressions in this field.
    -							</p>
    -							
    -							<h3>API Usability tests and proofs of concept</h3>
    -							<p>
    -								jOOQ is used in jOOQ-meta as a proof of concept. This includes complex queries such as the following Postgres query
    -							</p>
    -							
    -</html><java><![CDATA[Routines r1 = ROUTINES.as("r1");
    -Routines r2 = ROUTINES.as("r2");
    -
    -for (Record record : create().select(
    -        r1.ROUTINE_SCHEMA,
    -        r1.ROUTINE_NAME,
    -        r1.SPECIFIC_NAME,
    -
    -        // Ignore the data type when there is at least one out parameter
    -        decode()
    -            .when(exists(
    -                selectOne()
    -                .from(PARAMETERS)
    -                .where(PARAMETERS.SPECIFIC_SCHEMA.equal(r1.SPECIFIC_SCHEMA))
    -                .and(PARAMETERS.SPECIFIC_NAME.equal(r1.SPECIFIC_NAME))
    -                .and(upper(PARAMETERS.PARAMETER_MODE).notEqual("IN"))),
    -                    val("void"))
    -            .otherwise(r1.DATA_TYPE).as("data_type"),
    -        r1.CHARACTER_MAXIMUM_LENGTH,
    -        r1.NUMERIC_PRECISION,
    -        r1.NUMERIC_SCALE,
    -        r1.TYPE_UDT_NAME,
    -
    -        // Calculate overload index if applicable
    -        decode().when(
    -        exists(
    -            selectOne()
    -            .from(r2)
    -            .where(r2.ROUTINE_SCHEMA.in(getInputSchemata()))
    -            .and(r2.ROUTINE_SCHEMA.equal(r1.ROUTINE_SCHEMA))
    -            .and(r2.ROUTINE_NAME.equal(r1.ROUTINE_NAME))
    -            .and(r2.SPECIFIC_NAME.notEqual(r1.SPECIFIC_NAME))),
    -            select(count())
    -            .from(r2)
    -            .where(r2.ROUTINE_SCHEMA.in(getInputSchemata()))
    -            .and(r2.ROUTINE_SCHEMA.equal(r1.ROUTINE_SCHEMA))
    -            .and(r2.ROUTINE_NAME.equal(r1.ROUTINE_NAME))
    -            .and(r2.SPECIFIC_NAME.lessOrEqual(r1.SPECIFIC_NAME)).asField())
    -        .as("overload"))
    -    .from(r1)
    -    .where(r1.ROUTINE_SCHEMA.in(getInputSchemata()))
    -    .orderBy(
    -        r1.ROUTINE_SCHEMA.asc(),
    -        r1.ROUTINE_NAME.asc())
    -    .fetch()) {
    -
    -    result.add(new PostgresRoutineDefinition(this, record));
    -}]]></java><html>
    -							<p>
    -								These rather complex queries show that the jOOQ API is fit for advanced SQL use-cases, compared to the rather simple, often unrealistic queries in the integration test suite. 
    -							</p>
    -							
    -							<h3>Clean API and implementation. Code is kept DRY</h3>
    -							<p>
    -								As a general rule of thumb throughout the jOOQ code, everything is kept <a href="http://en.wikipedia.org/wiki/DRY">DRY</a>. Some examples:
    -							</p>
    -							<ul>
    -								<li>There is only one place in the entire code base, which consumes values from a JDBC ResultSet</li>
    -								<li>There is only one place in the entire code base, which transforms jOOQ Records into custom POJOs</li>
    -							</ul>
    -							<p>
    -								Keeping things DRY leads to longer stack traces, but in turn, also increases the relevance of highly reusable code-blocks. Chances that some parts of the jOOQ code base slips by integration test coverage decrease significantly.
    -							</p>
    -						</html></content>
    -					</section>
    -					
    -					<section id="migrating-to-3.0">
    -						<title>Migrating to jOOQ 3.0</title>
    -						<content><html>
    -							<p>
    -								This section is for all users of jOOQ 2.x who wish to upgrade to the next major release. In the next sub-sections, the most important changes are explained. Some code hints are also added to help you fix compilation errors.
    -							</p>
    -							
    -							<h3>Type-safe row value expressions</h3>
    -							<p>
    -								Support for <reference id="row-value-expressions" title="row value expressions"/> has been added in jOOQ 2.6. In jOOQ 3.0, many API parts were thoroughly (but often incompatibly) changed, in order to provide you with even more type-safety. 
    -							</p>
    -							
    -							<p>
    -								Here are some affected API parts:
    -							</p>
    -							<ul>
    -								<li>[N] in Row[N] has been raised from 8 to 22. This means that existing row value expressions with degree >= 9 are now type-safe</li>
    -								<li>Subqueries returned from <code>DSL.select(...)</code> now implement <code>Select&lt;Record[N]>, not Select&lt;Record></code></li>
    -								<li><code>IN</code> predicates and comparison predicates taking subselects changed incompatibly</li>
    -								<li><code>INSERT</code> and <code>MERGE</code> statements now take typesafe <code>VALUES()</code> clauses</li>
    -							</ul>
    -							
    -							<p>
    -								Some hints related to row value expressions:
    -							</p>
    -							
    -</html><java><![CDATA[// SELECT statements are now more typesafe:
    -Record2<String, Integer> record         = create.select(BOOK.TITLE, BOOK.ID).from(BOOK).where(ID.eq(1)).fetchOne();
    -Result<Record2<String, Integer>> result = create.select(BOOK.TITLE, BOOK.ID).from(BOOK).fetch();
    -
    -// But Record2 extends Record. You don't have to use the additional typesafety:
    -Record record    = create.select(BOOK.TITLE, BOOK.ID).from(BOOK).where(ID.eq(1)).fetchOne();
    -Result<?> result = create.select(BOOK.TITLE, BOOK.ID).from(BOOK).fetch();]]></java><html>
    -							
    -							<h3>SelectQuery and SelectXXXStep are now generic</h3>
    -							<p>
    -								In order to support type-safe row value expressions and type-safe Record[N] types, SelectQuery is now generic: SelectQuery&lt;R>
    -							</p>
    -							
    -							<h3>SimpleSelectQuery and SimpleSelectXXXStep API were removed</h3>
    -							<p>
    -							    The duplication of the SELECT API is no longer useful, now that SelectQuery and SelectXXXStep are generic.
    -							</p>
    -							
    -							<h3>Factory was split into DSL (query building) and DSLContext (query execution)</h3>
    -							<p>
    -								The pre-existing Factory class has been split into two parts:
    -							</p>
    -							
    -							<ol>
    -								<li><strong>The DSL</strong>: This class contains only static factory methods. All QueryParts constructed from this class are "unattached", i.e. queries that are constructed through DSL cannot be executed immediately. This is useful for subqueries.<br/>The DSL class corresponds to the static part of the jOOQ 2.x Factory type</li>
    -								<li><strong>The DSLContext</strong>: This type holds a reference to a Configuration and can construct executable ("attached") QueryParts.<br/>The DSLContext type corresponds to the non-static part of the jOOQ 2.x Factory / FactoryOperations type.</li>
    -							</ol>
    -							
    -							<p>
    -								The FactoryOperations interface has been renamed to DSLContext. An example:
    -							</p>
    -							
    -</html><java><![CDATA[// jOOQ 2.6, check if there are any books
    -Factory create = new Factory(connection, dialect);
    -create.selectOne()
    -      .whereExists(
    -        create.selectFrom(BOOK) // Reuse the factory to create subselects
    -      ).fetch();                // Execute the "attached" query
    -
    -// jOOQ 3.0
    -DSLContext create = DSL.using(connection, dialect);
    -create.selectOne()
    -      .whereExists(
    -        selectFrom(BOOK)        // Create a static subselect from the DSL
    -      ).fetch();                // Execute the "attached" query]]></java><html>							
    -							
    -							<h3>Quantified comparison predicates</h3>
    -							<p>
    -								Field.equalAny(...) and similar methods have been removed in favour of Field.equal(any(...)). This greatly simplified the Field API. An example:
    -							</p>
    -							
    -</html><java><![CDATA[// jOOQ 2.6
    -Condition condition = BOOK.ID.equalAny(create.select(BOOK.ID).from(BOOK));
    -
    -// jOOQ 3.0 adds some typesafety to comparison predicates involving quantified selects
    -QuantifiedSelect<Record1<Integer>> subselect = any(select(BOOK.ID).from(BOOK));
    -Condition condition = BOOK.ID.equal(subselect);]]></java><html>							
    -							
    -							<h3>FieldProvider</h3>
    -							<p>
    -								The FieldProvider marker interface was removed. Its methods still exist on FieldProvider subtypes. Note, they have changed names from <code>getField()</code> to <code>field()</code> and from <code>getIndex()</code> to <code>indexOf()</code>
    -							</p>
    -							
    -							<h3>GroupField</h3>
    -							<p>
    -								GroupField has been introduced as a DSL marker interface to denote fields that can be passed to <code>GROUP BY</code> clauses. This includes all org.jooq.Field types. However, fields obtained from <code>ROLLUP()</code>, <code>CUBE()</code>, and <code>GROUPING SETS()</code> functions no longer implement Field. Instead, they only implement GroupField. An example:
    -							</p>
    -							
    -</html><java><![CDATA[// jOOQ 2.6
    -Field<?>   field1a = Factory.rollup(...); // OK
    -Field<?>   field2a = Factory.one();       // OK
    -
    -// jOOQ 3.0
    -GroupField field1b = DSL.rollup(...); // OK
    -Field<?>   field1c = DSL.rollup(...); // Compilation error
    -GroupField field2b = DSL.one();       // OK
    -Field<?>   field2c = DSL.one();       // OK]]></java><html>
    -							
    -							<h3>NULL predicate</h3>
    -							<p>
    -							   Beware! Previously, Field.equal(null) was translated internally to an IS NULL predicate. This is no longer the case. Binding Java "null" to a comparison predicate will result in a regular comparison predicate (which never returns true). This was changed for several reasons:
    -							</p>
    -							
    -							<ul>
    -								<li>To most users, this was a surprising "feature".</li>
    -								<li>Other predicates didn't behave in such a way, e.g. the IN predicate, the BETWEEN predicate, or the LIKE predicate.</li>
    -								<li>Variable binding behaved unpredictably, as IS NULL predicates don't bind any variables.</li>
    -								<li>The generated SQL depended on the possible combinations of bind values, which creates unnecessary hard-parses every time a new unique SQL statement is rendered.</li>
    -							</ul>
    -							
    -							<p>
    -								Here is an example how to check if a field has a given value, without applying SQL's ternary NULL logic:
    -							</p>
    -
    -</html><java><![CDATA[String possiblyNull = null; // Or else...
    -
    -// jOOQ 2.6
    -Condition condition1 = BOOK.TITLE.equal(possiblyNull);
    -
    -// jOOQ 3.0
    -Condition condition2 = BOOK.TITLE.equal(possiblyNull).or(BOOK.TITLE.isNull().and(val(possiblyNull).isNull()));
    -Condition condition3 = BOOK.TITLE.isNotDistinctFrom(possiblyNull);]]></java><html>
    -							
    -							<h3>Configuration</h3>
    -							<p>
    -								<code>DSLContext</code>, <code>ExecuteContext</code>, <code>RenderContext</code>, <code>BindContext</code> no longer extend <code>Configuration</code> for "convenience". From jOOQ 3.0 onwards, composition is chosen over inheritance as these objects are not really configurations. Most importantly
    -							</p>
    -							<ul>
    -								<li><code>DSLContext</code> is only a DSL entry point for constructing "attached" QueryParts</li>
    -								<li><code>ExecuteContext</code> has a well-defined lifecycle, tied to that of a single query execution</li>
    -								<li><code>RenderContext</code> has a well-defined lifecycle, tied to that of a single rendering operation</li>
    -								<li><code>BindContext</code> has a well-defined lifecycle, tied to that of a single variable binding operation</li>
    -							</ul>
    -							<p>
    -								In order to resolve confusion that used to arise because of different lifecycle durations, these types are now no longer formally connected through inheritance.
    -							</p>
    -							
    -							<h3>ConnectionProvider</h3>
    -							<p>
    -							    In order to allow for simpler connection / data source management, jOOQ externalised connection handling in a new ConnectionProvider type. The previous two connection modes are maintained backwards-compatibly (JDBC standalone connection mode, pooled DataSource mode). Other connection modes can be injected using:
    -							</p>
    -
    -</html><java><![CDATA[public interface ConnectionProvider {
    -
    -    // Provide jOOQ with a connection
    -    Connection acquire() throws DataAccessException;
    -  
    -    // Get a connection back from jOOQ
    -    void release(Connection connection) throws DataAccessException;
    -}]]></java><html>
    -							
    -							<p>
    -							    These are some side-effects of the above change
    -							</p>
    -							
    -							<ul>
    -								<li>Connection-related JDBC wrapper utility methods (commit, rollback, etc) have been moved to the new DefaultConnectionProvider. They're no longer available from the DSLContext. This had been confusing to some users who called upon these methods while operating in pool DataSource mode.</li>
    -							</ul>
    -							
    -							<h3>ExecuteListeners</h3>
    -							<p>
    -								ExecuteListeners can no longer be configured via Settings. Instead they have to be injected into the Configuration. This resolves many class loader issues that were encountered before. It also helps listener implementations control their lifecycles themselves.
    -							</p>
    -							
    -							<h3>Data type API</h3>
    -							<p>
    -								The data type API has been changed drastically in order to enable some new DataType-related features. These changes include:
    -							</p>
    -
    -							<ul>
    -								<li>[SQLDialect]DataType and SQLDataType no longer implement DataType. They're mere constant containers</li>
    -								<li>Various minor API changes have been done.</li>
    -							</ul>
    -														
    -							<h3>Object renames</h3>
    -							<p>
    -								These objects have been moved / renamed:
    -							</p>
    -							
    -							<ul>
    -								<li>jOOU: a library used to represent unsigned integer types was moved from <code>org.jooq.util.unsigned</code> to <code>org.jooq.util.types</code> (which already contained INTERVAL data types)</li>
    -							</ul>
    -							
    -							<h3>Feature removals</h3>
    -							<p>
    -								Here are some minor features that have been removed in jOOQ 3.0
    -							</p>
    -
    -							<ul>
    -								<li>The ant task for code generation was removed, as it was not up to date at all. Code generation through ant can be performed easily by calling jOOQ's GenerationTool through a &lt;java> target.</li>
    -								<li>The navigation methods and "foreign key setters" are no longer generated in Record classes, as they are useful only to few users and the generated code is very collision-prone.</li>
    -								<li>The code generation configuration no longer accepts comma-separated regular expressions. Use the regex pipe | instead.</li>
    -								<li>The code generation configuration can no longer be loaded from .properties files. Only XML configurations are supported.</li>
    -								<li>The master data type feature is no longer supported. This feature was unlikely to behave exactly as users expected. It is better if users write their own code generators to generate master enum data types from their database tables. jOOQ's enum mapping and converter features sufficiently cover interacting with such user-defined types.</li>
    -								<li>The DSL subtypes are no longer instanciable. As DSL now only contains static methods, subclassing is no longer useful. There are still dialect-specific DSL types providing static methods for dialect-specific functions. But the code-generator no longer generates a schema-specific DSL</li>
    -								<li>The concept of a "main key" is no longer supported. The code generator produces UpdatableRecords only if the underlying table has a PRIMARY KEY. The reason for this removal is the fact that "main keys" are not reliable enough. They were chosen arbitrarily among UNIQUE KEYs.</li>
    -								<li>The UpdatableTable type has been removed. While adding significant complexity to the type hierarchy, this type adds not much value over a simple <code>Table.getPrimaryKey() != null</code> check.</li>
    -							    <li>The <code>USE</code> statement support has been removed from jOOQ. Its behaviour was ill-defined, while it didn't work the same way (or didn't work at all) in some databases.</li>
    -                            </ul>
    -						</html></content>
    -					</section>
    -
    -					<!-- 
    -					<section id="reference-glossary">
    -					  Analytical function -> window function
    -					  Arity -> Degree
    -					  AST
    -					  Batch
    -					  BNF
    -					  Catalog
    -					  Clause
    -					  Code generation
    -					  Column -> Field
    -					  Column expression
    -					  Common table expression
    -					  Condition -> Predicate
    -					  Configuration
    -					  Connection
    -					  CRUD -> OLTP
    -					  DAO
    -					  Database
    -					  DataSource
    -					  Degree
    -					  Dialect
    -					  Domain Specific language (internal / external)
    -                      DSL
    -                      DSLContext
    -					  Execute
    -					  Execute listener
    -					  Execution lifecycle
    -					  Export
    -					  Expression
    -					  Fetch
    -					  Field
    -					  Function
    -					  Generic R-type
    -					  Generic T-type
    -					  JDBC
    -					  JPQL
    -					  Hibernate
    -					  Hierarchical query
    -					  HQL
    -					  Identifier
    -					  Import
    -					  Keyword
    -					  LINQ
    -					  Literal
    -					  Locking (optimistic / pessimistic)
    -					  Name -> Identifier
    -					  OLAP
    -					  OLTP
    -					  Pivot
    -					  POJO
    -					  Predicate
    -					  PreparedStatement
    -					  Procedure
    -					  Projection
    -					  Query
    -					  Schema
    -					  Settings
    -					  SLICK
    -					  SQL
    -					  SQL building
    -					  SQL execution
    -					  SQL standard
    -					  Statement
    -					  Table
    -					  Table expression
    -					  Record
    -					  Row
    -					  Row value expression
    -					  Result
    -					  ResultQuery
    -					  UDT
    -					  View
    -					  Window function
    -					
    -					</section>
    -					  -->
    -
    -					<section id="reference-credits">
    -						<title>Credits</title>
    -						<content><html>
    -							<p>
    -								jOOQ lives in a very challenging ecosystem. The Java to SQL interface is still one of the most important system interfaces. Yet there are still a lot of open questions, best practices and no "true" standard has been established. This situation gave way to a lot of tools, APIs, utilities which essentially tackle the same problem domain as jOOQ. jOOQ has gotten great inspiration from pre-existing tools and this section should give them some credit. Here is a list of inspirational tools in alphabetical order:
    -							</p>
    -							<ul>
    -								<li><a href="http://www.hibernate.org">Hibernate</a>: The de-facto standard (JPA) with its useful table-to-POJO mapping features have influenced jOOQ's <reference class="org.jooq.ResultQuery" anchor="#fetchInto(java.lang.Class)"/> facilities</li>
    -								<li><a href="http://www.h2database.com/html/jaqu.html">JaQu</a>: H2's own fluent API for querying databases</li>
    -								<li><a href="http://www.oracle.com/technetwork/java/javaee/tech/persistence-jsp-140049.html">JPA</a>: The de-facto standard in the javax.persistence packages, supplied by Oracle. Its annotations are useful to jOOQ as well.</li>
    -								<li><a href="http://onewebsql.com">OneWebSQL</a>: A commercial SQL abstraction API with support for DAO source code generation, which was integrated also in jOOQ</li>
    -								<li><a href="http://www.querydsl.com">QueryDSL</a>: A "LINQ-port" to Java. It has a similar fluent API, a similar code-generation facility, yet quite a different purpose. While jOOQ is all about SQL, QueryDSL (like LINQ) is mostly about querying.</li>
    -								<li><a href="http://slick.typesafe.com">SLICK</a>: A "LINQ-like" database abstraction layer for Scala. Unlike LINQ, its API doesn't really remind of SQL. Instead, it makes SQL look like Scala.</li>
    -								<li><a href="http://www.springsource.org/features/data-access">Spring Data</a>: Spring's JdbcTemplate knows RowMappers, which are reflected by jOOQ's <reference id="recordhandler"/> or <reference id="recordmapper"/></li>
    -							</ul>
    -						</html></content>
    -					</section>
    -				</sections>
    -			</section>
    -		</sections>
    -	</section>
    -</manual>
    diff --git a/jOOQ-website/src/main/resources/manual.xml b/jOOQ-website/src/main/resources/manual.xml
    deleted file mode 100644
    index 8aeb18fed8..0000000000
    --- a/jOOQ-website/src/main/resources/manual.xml
    +++ /dev/null
    @@ -1,5206 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?>
    -<!-- 
    -  - Copyright (c) 2009-2013, Lukas Eder, lukas.eder@gmail.com
    -  - All rights reserved.
    -  -
    -  - This software is licensed to you under the Apache License, Version 2.0
    -  - (the "License"); You may obtain a copy of the License at
    -  -
    -  -   http://www.apache.org/licenses/LICENSE-2.0
    -  -
    -  - Redistribution and use in source and binary forms, with or without
    -  - modification, are permitted provided that the following conditions are met:
    -  -
    -  - . Redistributions of source code must retain the above copyright notice, this
    -  -   list of conditions and the following disclaimer.
    -  -
    -  - . Redistributions in binary form must reproduce the above copyright notice,
    -  -   this list of conditions and the following disclaimer in the documentation
    -  -   and/or other materials provided with the distribution.
    -  -
    -  - . Neither the name "jOOQ" nor the names of its contributors may be
    -  -   used to endorse or promote products derived from this software without
    -  -   specific prior written permission.
    -  -
    -  - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    -  - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    -  - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    -  - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
    -  - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
    -  - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
    -  - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
    -  - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
    -  - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
    -  - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
    -  - POSSIBILITY OF SUCH DAMAGE.
    -  -->
    -<manual>
    -	<section id="manual">
    -		<title>The jOOQ User Manual. Multiple Pages</title>
    -		<content><html>
    -			<h2 id="Overview"><a href="#Overview" name="Overview">#</a> Overview</h2>
    -			<p>This manual is divided into four main sections:</p>
    -			<ul>
    -				<li>
    -					<reference id="JOOQ"/>
    -					<p>
    -						See these chapters for an overview of the jOOQ internal architecture
    -						and all types that are involved with jOOQ's query creation and
    -						execution. This is the important part for you, also, if you wish to
    -						extend jOOQ
    -					</p>
    -				</li>
    -				<li>
    -					<reference id="META"/>
    -					<p>
    -						See these chapters to understand how you can use jOOQ as a source code
    -						generator, and what type of artefacts are generated by jOOQ
    -					</p>
    -				</li>
    -				<li>
    -					<reference id="DSL"/>
    -					<p>
    -						See these chapters to learn about how to use jOOQ in every day's work. The
    -						jOOQ DSL is the main way to create and execute jOOQ queries almost as
    -						if SQL was embedded in Java directly
    -					</p>
    -				</li>
    -				<li>
    -					<reference id="ADVANCED"/>
    -					<p>
    -						Some advanced topics including not-everyday functionality
    -					</p>
    -				</li>
    -			</ul>
    -		</html></content>
    -
    -
    -		<sections>
    -			<section id="JOOQ">
    -				<title>jOOQ classes and their usage</title>
    -				<content><html>
    -					<h3>Overview</h3>
    -					<p>jOOQ essentially has two packages:</p>
    -					<ul>
    -						<li>org.jooq: the jOOQ API. Here you will find interfaces for all
    -							SQL concepts
    -						</li>
    -						<li>org.jooq.impl: the jOOQ implementation and factories. Most
    -							implementation classes are package private, you can only access
    -							them using the <reference id="Factory" title="org.jooq.impl.Factory"/>
    -						</li>
    -					</ul>
    -					<p>
    -						This section is about the main jOOQ classes and the global
    -						architecture. Most of the time, however, you will be using the
    -						<reference id="DSL" />
    -						in order to create queries
    -						the way you're used to in SQL
    -					</p>
    -				</html></content>
    -
    -
    -				<sections>
    -					<section id="ExampleDatabase">
    -						<title>The example database</title>
    -						<content><html>
    -							<h3>Example CREATE TABLE statements</h3>
    -							<p>
    -							For the examples in this manual, the same database will always be
    -							referred to. It essentially consists of these entities created using
    -							the Oracle dialect
    -							</p>
    -</html><sql>CREATE TABLE t_language (
    -  id NUMBER(7) NOT NULL PRIMARY KEY,
    -  cd CHAR(2) NOT NULL,
    -  description VARCHAR2(50)
    -)
    -
    -CREATE TABLE t_author (
    -  id NUMBER(7) NOT NULL PRIMARY KEY,
    -  first_name VARCHAR2(50),
    -  last_name VARCHAR2(50) NOT NULL,
    -  date_of_birth DATE,
    -  year_of_birth NUMBER(7)
    -)
    -
    -CREATE TABLE t_book (
    -  id NUMBER(7) NOT NULL PRIMARY KEY,
    -  author_id NUMBER(7) NOT NULL,
    -  title VARCHAR2(400) NOT NULL,
    -  published_in NUMBER(7) NOT NULL,
    -  language_id NUMBER(7) NOT NULL,
    -  FOREIGN KEY (AUTHOR_ID) REFERENCES T_AUTHOR(ID),
    -  FOREIGN KEY (LANGUAGE_ID) REFERENCES T_LANGUAGE(ID)
    -)
    -
    -CREATE TABLE t_book_store (
    -  name VARCHAR2(400) NOT NULL UNIQUE
    -)
    -
    -CREATE TABLE t_book_to_book_store (
    -  book_store_name VARCHAR2(400) NOT NULL,
    -  book_id INTEGER NOT NULL,
    -  stock INTEGER,
    -  PRIMARY KEY(book_store_name, book_id),
    -  CONSTRAINT b2bs_book_store_id
    -    FOREIGN KEY (book_store_name)
    -    REFERENCES t_book_store (name)
    -    ON DELETE CASCADE,
    -  CONSTRAINT b2bs_book_id
    -    FOREIGN KEY (book_id)
    -    REFERENCES t_book (id)
    -    ON DELETE CASCADE
    -)</sql><html>
    -							<p>
    -								More entities, types (e.g. UDT's, ARRAY types, ENUM types, etc),
    -								stored procedures and packages are introduced for specific examples
    -							</p>
    -						</html></content>
    -					</section>
    -
    -
    -					<section id="Factory">
    -						<title>The Factory class</title>
    -						<content><html>
    -							<h3>The Factory and the jOOQ API</h3>
    -							<p>
    -								jOOQ exposes a lot of interfaces and hides most implementation facts
    -								from client code. The reasons for this are:
    -							</p>
    -							<ul>
    -								<li>Interface-driven design. This allows for modelling queries in a fluent API most efficiently</li>
    -								<li>Reduction of complexity for client code.</li>
    -								<li>API guarantee. You only depend on the exposed interfaces, not concrete (potentially dialect-specific) implementations.</li>
    -							</ul>
    -							<p>
    -								The <reference class="org.jooq.impl.Factory"/>
    -								class is the main class from where you will create all jOOQ objects.
    -								The Factory implements <reference class="org.jooq.Configuration"/>
    -								and needs to be instanciated with the Configuration's properties:
    -							</p>
    -							<ul>
    -								<li><reference class="org.jooq.SQLDialect"/> :
    -								The dialect of your database. This may be any of the currently
    -								supported database types</li>
    -								<li><reference class="java.sql.Connection"/> :
    -								An optional JDBC Connection that will be re-used for the whole
    -    							lifecycle of your Factory</li>
    -    							<li><reference class="java.sql.DataSource"/> :
    -    							An optional JDBC DataSource that will be re-used for the whole
    -    							lifecycle of your Factory. If you prefer using DataSources over
    -    							Connections, jOOQ will internally fetch new Connections from
    -    							your DataSource, conveniently closing them again after query execution.
    -    							This is particularly useful in J2EE or Spring contexts.</li>
    -    							<li><reference class="org.jooq.conf.Settings"/> :
    -    							An optional runtime configuration.</li>
    -							</ul>
    -							<p>If you are planning on using several RDBMS (= SQLDialects) or
    -								several distinct JDBC Connections in your software, this will mean
    -								that you have to create a new Factory every time. </p>
    -
    -							<h3>Factory settings</h3>
    -							<p>
    -								The jOOQ Factory allows for some optional configuration elements to be used by advanced users.
    -								The <reference class="org.jooq.conf.Settings" title="Settings"/> class is a JAXB-annotated
    -								type, that can be provided to a Factory in several ways:
    -							</p>
    -							<ul>
    -								<li>In the constructor. This will override default settings below</li>
    -								<li>From a location specified by a JVM parameter: -Dorg.jooq.settings</li>
    -								<li>From the classpath at /jooq-settings.xml</li>
    -								<li>From the settings defaults, as specified in
    -								    <a href="http://www.jooq.org/xsd/jooq-runtime-2.1.0.xsd" title="The jOOQ Runtime configuration XSD">http://www.jooq.org/xsd/jooq-runtime-2.1.0.xsd</a>
    -								</li>
    -							</ul>
    -							<p>
    -								Subsequent sections of the manual contain some more in-depth explanations about these settings:
    -							</p>
    -							<ul>
    -								<li>
    -     								<reference id="SchemaMapping" title="Runtime schema and table mapping"/>
    -   								</li>
    -     							<li>
    -     								<reference id="ExecuteListener" title="Execute listeners and SQL tracing"/>
    -     							</li>
    -   							</ul>
    -							<p>
    -								Please refer to the jOOQ runtime configuration XSD for more details:<br/>
    -								<a href="http://www.jooq.org/xsd/jooq-runtime-2.1.0.xsd" title="The jOOQ Runtime configuration XSD">http://www.jooq.org/xsd/jooq-runtime-2.1.0.xsd</a>
    -							</p>
    -
    -							<h3>Factory subclasses</h3>
    -							<p>
    -								There are a couple of subclasses for the general Factory. Each SQL
    -								dialect has its own dialect-specific factory. For instance, if you're
    -								only using the MySQL dialect, you can choose to create a new Factory
    -								using any of the following types:
    -							</p>
    -</html><java>// A general, dialect-unspecific factory
    -Factory create = new Factory(connection, SQLDialect.MYSQL);
    -
    -// A MySQL-specific factory
    -MySQLFactory create = new MySQLFactory(connection);</java><html>
    -							<p>
    -								The advantage of using a dialect-specific Factory lies in the fact,
    -								that you have access to more proprietary RDMBS functionality. This may
    -								include:
    -							</p>
    -							<ul>
    -								<li>Oracle's <reference id="CONNECTBY" title="CONNECT BY"/>
    -								    pseudo columns and functions</li>
    -    							<li>MySQL's encryption functions</li>
    -    							<li>PL/SQL constructs, pgplsql, or any other dialect's ROUTINE-language (maybe in the future)</li>
    -							</ul>
    -							<p>
    -								Another type of Factory subclasses are each generated schema's
    -								factories. If you generate your schema TEST, then you will have access
    -								to a TestFactory. This will be useful in the future, when access to
    -								schema artefacts will be unified. Currently, this has no use.
    -							</p>
    -
    -							<h3>Static Factory methods</h3>
    -							<p>
    -								With jOOQ 2.0, static factory methods have been introduced in order to
    -								make your code look more like SQL. Ideally, when working with jOOQ, you
    -								will simply static import all methods from the Factory class:
    -							</p>
    -							</html><java>import static org.jooq.impl.Factory.*;</java><html>
    -							<p>
    -								This will allow to access functions even more fluently:
    -							</p>
    -
    -</html><java>concat(trim(FIRST_NAME), trim(LAST_NAME));
    -// ... which is in fact the same as:
    -Factory.concat(Factory.trim(FIRST_NAME), Factory.trim(LAST_NAME));</java><html>
    -							<p>
    -								Objects created statically from the Factory do not need a reference to
    -								any factory, as they can be constructed independently from your Configuration
    -								(connection, dialect, schema mapping). They will access that information at
    -								render / bind time. See
    -								<reference id="QueryPart" title="more details on the QueryParts' internals"/>
    -							</p>
    -
    -							<h3>Potential problems</h3>
    -							<p>
    -								The jOOQ Factory expects its underlying
    -								<reference class="java.sql.Connection" />
    -								to be <strong>open and ready</strong>
    -								for
    -								<reference class="java.sql.PreparedStatement" />
    -								creation. You are responsible yourself for the
    -								lifecycle dependency between Factory and Connection. This means:
    -							</p>
    -							<ul>
    -								<li>jOOQ will never close the Connection.</li>
    -								<li>jOOQ will never commit or rollback on the Connection
    -									(Except for CSV-imports, if explicitly configured in the <reference id="Import" title="Import API"/>)</li>
    -								<li>jOOQ will never start any transactions.</li>
    -								<li>
    -									jOOQ does not know the concept of a session as for instance
    -									<a href="http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/architecture.html#architecture-current-session">Hibernate</a>
    -								</li>
    -								<li>jOOQ does not know the concept of a second-level cache. SQL is
    -									executed directly on the underlying RDBMS.</li>
    -								<li>jOOQ does not make assumptions about the origin of the Connection.
    -									If it is container managed, that is fine.</li>
    -							</ul>
    -							<p>
    -								So if you want your queries to run in separate transactions, if you
    -								want to roll back a transaction, if you want to close a Connection and
    -								return it to your container, you will have to take care of that
    -								yourself. jOOQ's Factory will always expect its Connection to be in a
    -								ready state for creating new PreparedStatements. If it is not, you have
    -								to create a new Factory.
    -							</p>
    -							<p>
    -								Please keep in mind that many jOOQ objects will reference your Factory
    -								for their whole lifecycle. This is especially interesting, when dealing
    -								with <reference id="UpdatableRecord" title="Updatable Records"/>,
    -								that can perform CRUD operations on the
    -								Factory's underlying Connection.
    -							</p>
    -						</html></content>
    -					</section>
    -
    -
    -					<section id="Table">
    -						<title>Tables and Fields</title>
    -						<content><html>
    -							<h3>The Table</h3>
    -							<p>Tables represent any entity in your underlying RDBMS, that holds
    -							  data for selection, insertion, updates, and deletion. In other
    -							  words, views are also considered tables by jOOQ. </p>
    -							<p>The formal definition of a <reference class="org.jooq.Table"/> starts with </p>
    -							</html><java>public interface Table&lt;R extends Record&gt; // [...]</java><html>
    -							<p>
    -								This means that every table is associated with a subtype of the
    -								<reference class="org.jooq.Record" />
    -								class (see also
    -								<reference id="Result" title="Results and Records" />
    -								). For anonymous or ad-hoc tables,
    -								&lt;R&gt; will always bind to Record itself.
    -							</p>
    -							<p>
    -								Unlike in the
    -								<a href="http://download.oracle.com/javaee/6/tutorial/doc/gjitv.html"
    -									title="Tutorial about JPA CriteriaQuery">JPA CriteriaQuery API</a>,
    -								this generic type
    -								&lt;R&gt;
    -								is not given so much importance as far as
    -								type-safety is concerned.
    -								SQL itself is highly typesafe. You have
    -								incredible flexibility of creating anonymous or ad-hoc
    -								types and
    -								reusing them from
    -								<reference id="NESTED" title="NESTED SELECT statements" />
    -								or from many other
    -								use-cases. There is no way that this typesafety can be
    -								mapped to the Java world in a convenient way. If
    -								&lt;R&gt; would play a role as important
    -								as in JPA, jOOQ would suffer from the same verbosity, or inflexibility
    -								that JPA CriteriaQueries may have.
    -							</p>
    -
    -							<h3>The Field</h3>
    -							<p>The formal definition of a Field starts with </p>
    -							</html><java>public interface Field&lt;T&gt; // [...]</java><html>
    -							<p>
    -								Fields are generically parameterised with a Java type
    -								&lt;T&gt;
    -								that reflects the closest match to the RDMBS's underlying datatype for that
    -								field. For instance, if you have a VARCHAR2 type Field in Oracle,
    -								&lt;T&gt;
    -								would bind to
    -								<reference class="java.lang.String" />
    -								for that Field in jOOQ. Oracle's NUMBER(7) would
    -								let
    -								&lt;T&gt;
    -								bind to
    -								<reference class="java.lang.Integer" />,
    -								etc. This generic type is useful for two purposes:
    -							</p>
    -							<ul>
    -								<li>It allows you to write type safe queries. For instance, you cannot
    -									compare Field
    -									&lt;String&gt;
    -									with Field
    -									&lt;Integer&gt;</li>
    -
    -								<li>It
    -									allows you to fetch correctly cast and converted values from
    -									your database result set. This is especially useful when &lt;T&gt; binds
    -									to
    -									advanced data types, such as
    -									<reference id="UDT" title="UDT's, ARRAY or ENUM types" />
    -									, where jOOQ
    -									does the difficult non-standardised JDBC data type conversions for you.
    -								</li>
    -							</ul>
    -
    -							<h3>Fields and tables put into action</h3>
    -							<p>The Field itself is a very broad concept. Other tools, or databases
    -								refer to it as expression or column. When you just want to </p>
    -
    -							</html><sql>SELECT 1 FROM DUAL</sql><html>
    -							<p>
    -								Then 1 is considered a Field or more explicitly, a
    -								<reference class="org.jooq.impl.Constant" />,
    -								which implements Field, and DUAL is considered a Table or more explicitly
    -								<reference class="org.jooq.impl.Dual"/>, which implements Table
    -							</p>
    -							<p>
    -								More advanced uses become clear quickly, when you do things like
    -							</p>
    -							</html><sql>SELECT 1 + 1 FROM DUAL</sql><html>
    -							<p>
    -								Where 1 + 1 itself is a Field or more explicitly, an
    -								<reference class="org.jooq.impl.Expression"/>
    -								joining two Constants together.
    -							</p>
    -							<p>
    -								See some details about how to create these queries in the
    -								<reference id="Query" title="Query section"/> of the manual
    -							</p>
    -
    -							<h3>TableFields</h3>
    -							<p>
    -								A specific type of field is the
    -								<reference class="org.jooq.TableField" />,
    -								which represents a physical
    -								Field in a physical Table. Both the
    -								TableField and its referenced Table
    -								know each other. The physical aspect
    -								of their nature is represented in
    -								jOOQ by
    -								<reference id="TABLE" title="meta model code generation" />,
    -								where every entity in your database
    -								schema will be generated into a
    -								corresponding Java class.
    -							</p>
    -							<p>
    -								TableFields join both &lt;R&gt; and &lt;T&gt; generic parameters into their specification:
    -							</p>
    -							</html><java>public interface TableField&lt;R extends Record, T&gt; // [...]</java><html>
    -							<p>
    -								This can be used for additional type safety in the future, or by client code.
    -							</p>
    -						</html></content>
    -					</section>
    -
    -
    -					<section id="Result">
    -						<title>Results, Cursors and Records</title>
    -						<content><html>
    -							<h3>The Result</h3>
    -							<p>
    -								The
    -								<reference class="org.jooq.Result" title="Result" />&lt;R extends <reference class="org.jooq.Record" title="Record" />&gt;
    -								is essentially a wrapper for a List&lt;R extends Record&gt;
    -								providing
    -								many convenience methods for accessing single elements in
    -								the result
    -								set. Depending on the type of SELECT statement,
    -								&lt;R&gt; can be bound
    -								to a sub-type of Record, for instance to an
    -								<reference class="org.jooq.UpdatableRecord" />.
    -								See the section on
    -								<reference id="UpdatableRecord" title="Updatable Records" />
    -								for further details.
    -							</p>
    -
    -							<h3>The Cursor</h3>
    -							<p>
    -								A similar object is the
    -								<reference class="org.jooq.Cursor" title="Cursor"/>&lt;R extends Record&gt;.
    -								Unlike the Result, the cursor has not fetched all data from the database yet.
    -								This means, you save memory (and potentially speed), but you can only access
    -								data sequentially and you have to keep a JDBC ResultSet alive. Cursors behave
    -								very much like the <reference class="java.util.Iterator"/>,
    -								by providing a very simple API. Some sample methods are:
    -							</p>
    -</html><java>// Check whether there are any more records to be fetched
    -boolean hasNext() throws DataAccessException;
    -
    -// Fetch the next record from the underlying JDBC ResultSet
    -R fetchOne() throws DataAccessException;
    -
    -// Close the underlying JDBC ResultSet. Don't forget to call this, before disposing the Cursor.
    -void close() throws DataAccessException;</java><html>
    -
    -							<h3>The Record</h3>
    -							<p>
    -								The Record itself holds all the data from your selected tuple. If it is
    -								a <reference class="org.jooq.TableRecord"/>, then it corresponds exactly to the type of one of your
    -								physical tables in your database. But any anonymous or ad-hoc tuple can
    -								be represented by the plain Record. A record mainly provides access to
    -								its data and adds convenience methods for data type conversion. These
    -								are the main access ways:
    -							</p>
    -</html><java>// If you can keep a reference of the selected field, then you can get the corresponding value type-safely
    -&lt;T&gt; T getValue(Field&lt;T&gt; field);
    -
    -// If you know the name of the selected field within the tuple,
    -// then you can get its value without any type information
    -Object getValue(String fieldName);
    -
    -// If you know the index of the selected field within the tuple,
    -// then you can get its value without any type information
    -Object getValue(int index);</java><html>
    -							<p>
    -								In some cases, you will not be able to reference the selected Fields
    -								both when you create the SELECT statement and when you fetch data from
    -								Records. Then you might use field names or indexes, as with JDBC.
    -								However, of course, the type information will then be lost as well. If
    -								you know what type you want to get, you can always use the Record's
    -								convenience methods for type conversion, however. Some examples:
    -							</p>
    -</html><java>// These methods will try to convert a value to a BigDecimal.
    -// This will work for all numeric types and for CHAR/VARCHAR types, if they contain numeric values:
    -BigDecimal getValueAsBigDecimal(String fieldName);
    -BigDecimal getValueAsBigDecimal(int fieldIndex);
    -
    -// This method can perform arbitrary conversions
    -&lt;T&gt; T getValue(String fieldName, Class&lt;? extends T&gt; type);
    -&lt;T&gt; T getValue(int fieldIndex, Class&lt;? extends T&gt; type);</java><html>
    -
    -							<p>
    -								For more information about the type conversions that are supported by
    -								jOOQ, read the Javadoc on
    -								<reference class="org.jooq.tools.Convert"/>
    -							</p>
    -						</html></content>
    -					</section>
    -
    -
    -					<section id="UpdatableRecord">
    -						<title>CRUD and Updatable Records</title>
    -						<content><html>
    -							<h3>CRUD Operations with UpdatableRecords</h3>
    -							<p>
    -								UpdatableRecords are a specific subtype of TableRecord that have
    -								primary key information associated with them.
    -							</p>
    -							<p>As of jOOQ 1.5, the UpdatableRecord essentially contains three additional
    -							 methods <a href="http://de.wikipedia.org/wiki/CRUD">CRUD</a>
    -							 (Create Read Update Delete) operations: </p>
    -</html><java>// Store any changes made to this record to the database.
    -// The record executes an INSERT if the PRIMARY KEY is NULL or has been changed. Otherwise, an UPDATE is performed.
    -int store();
    -
    -// Deletes the record from the database.
    -int delete();
    -
    -// Reflects changes made in the database to this Record
    -void refresh();</java><html>
    -							<p>An example lifecycle of a book can be implemented as such:</p>
    -</html><java>// Create a new record and insert it into the database
    -TBookRecord book = create.newRecord(T_BOOK);
    -book.setTitle("My first book");
    -book.store();
    -
    -// Update it with new values
    -book.setPublishedIn(2010);
    -book.store();
    -
    -// Delete it
    -book.delete();</java><html>
    -							<p>These operations are very simple utilities. They do not
    -							reflect the functionality offered by <a href="http://www.hibernate.org/">Hibernate</a>
    -							or other persistence managers. </p>
    -
    -							<h3>Performing CRUD on non-updatable records</h3>
    -							<p>
    -								If the jOOQ code-generator cannot detect any PRIMARY KEY, or UNIQUE KEY
    -								on your tables, then the generated artefacts implement TableRecord,
    -								instead of UpdatableRecord. A TableRecord can perform the same CRUD
    -								operations as we have seen before, if you provide it with the necessary
    -								key fields. The API looks like this:
    -							</p>
    -
    -</html><java>// INSERT or UPDATE the record using the provided keys
    -int storeUsing(TableField&lt;R, ?&gt;... keys)
    -
    -// DELETE a record using the provided keys
    -int deleteUsing(TableField&lt;R, ?&gt;... keys);
    -
    -// Reflects changes made in the database to this Record
    -void refreshUsing(TableField&lt;R, ?&gt;... keys);</java><html>
    -
    -							<p>
    -								This is useful if your RDBMS does not support referential constraints (e.g. MySQL's
    -								<a href="http://en.wikipedia.org/wiki/MyISAM">MyISAM</a>), or if you want to
    -								store records to an unconstrained view. An example lifecycle of a book without
    -								any keys can then be implemented as such:
    -							</p>
    -</html><java>// Create a new record and insert it into the database
    -TBookRecord book = create.newRecord(T_BOOK);
    -book.setTitle("My first book");
    -book.storeUsing(TBook.ID);
    -
    -// Update it with new values
    -book.setPublishedIn(2010);
    -book.storeUsing(TBook.ID);
    -
    -// Delete it
    -book.deleteUsing(TBook.ID);</java></content>
    -					</section>
    -
    -
    -					<section id="Query">
    -						<title>The Query and its various subtypes</title>
    -						<content><html>
    -							<h3>SELECT statements</h3>
    -							<p>
    -								There are essentially two ways of creating SELECT statements in jOOQ.
    -								For historical reasons, you can create
    -								<reference class="org.jooq.SimpleSelectQuery"/> or
    -								<reference class="org.jooq.SelectQuery"/>
    -								objects and add additional query clauses, such as
    -								<reference class="org.jooq.Condition" title="Conditions"/> or
    -								<reference class="org.jooq.SortField" title="SortFields"/> to it.
    -								Since jOOQ 1.3, there is also the possibility to
    -								create SELECT statements using jOOQ's
    -								<reference id="DSL" title="DSL API"/> in a much more intuitive
    -								and SQL-like way.
    -							</p>
    -							<p>Use the DSL API when: </p>
    -							<ul>
    -								<li>You want your code to look like SQL</li>
    -								<li>You want your IDE to help you with auto-completion (you will not be able to write select .. order by .. where .. join or any of that stuff) </li>
    -							</ul>
    -							<p>Use the regular API when: </p>
    -							<ul>
    -								<li>You want to create your query step-by-step, creating query parts one-by-one</li>
    -							    <li>You need to assemble your query from various places, passing the query around, adding new conditions and joins on the way </li>
    -							</ul>
    -							<p>In any case, all API's will construct the same underlying
    -								implementation object, and in many cases, you can combine the two
    -								approaches. Let's check out the various SELECT statement types: </p>
    -
    -							<ul>
    -								<li><reference class="org.jooq.Select"/>:
    -								    This Query subtype stands for a general type of SELECT statement.
    -								    It is also the main Select type for the
    -								    <reference id="DSL" title="DSL API"/>. When executed, this object
    -								    will hold a <reference id="Result" title="Result containing the resulting Records"/>.
    -								    This type is further subtyped for the various uses of a SELECT statement as such:</li>
    -								<li><reference class="org.jooq.SimpleSelectQuery"/>:
    -									This Query will allow for selecting from single physical Tables only.
    -									It therefore has access to the Table's generic type parameter
    -									&lt;R extends Record&gt; and will provide a matching Result&lt;R&gt;.
    -									This is especially useful if &lt;R&gt; is a subtype of
    -									<reference id="UpdatableRecord" title="UpdatableRecord"/>.
    -									Then you will be able to perform updates on your result set immediately.</li>
    -								<li><reference class="org.jooq.SelectQuery"/>:
    -									This Query will allow for selecting a subset of Fields from several
    -									Tables. Because the results of such a query are considered of an anonymous
    -									or ad-hoc type, this Query will bind &lt;R&gt; to the general type Record
    -									itself. The purpose of this Query type is to allow for full SQL support,
    -									including SELECT, JOIN and GROUP BY clauses. </li>
    -							</ul>
    -
    -							<h3>Example: SQL query and DSL query</h3>
    -							</html><code-pair>
    -<sql>-- Select all books by authors born after 1920, named "Paulo"
    --- from a catalogue consisting of authors and books:
    -
    -
    -SELECT *
    -  FROM t_author
    -  JOIN t_book
    -    ON t_author.id = t_book.author_id
    - WHERE t_author.year_of_birth &gt; 1920
    -   AND t_author.first_name = 'Paulo'
    - ORDER BY t_book.title</sql><java>// Instanciate your factory using a JDBC connection.
    -Factory create = new Factory(connection, SQLDialect.ORACLE);
    -
    -// Execute the query "on a single line"
    -Result&lt;Record&gt; result = create.select()
    -    .from(T_AUTHOR)
    -    .join(T_BOOK)
    -    .on(T_AUTHOR.ID.equal(T_BOOK.AUTHOR_ID))
    -    .where(T_AUTHOR.YEAR_OF_BIRTH.greaterThan(1920)
    -    .and(T_AUTHOR.FIRST_NAME.equal("Paulo")))
    -    .orderBy(T_BOOK.TITLE).fetch();</java>
    -    						</code-pair><html>
    -
    -							<p>
    -								In the above example, some generated artefacts are used for querying.
    -								In this case, T_AUTHOR and T_BOOK are instances of types
    -								<reference class="org.jooq.test.oracle.generatedclasses.test.tables.TAuthor" title="TAuthor"/> and
    -								<reference class="org.jooq.test.oracle.generatedclasses.test.tables.TBook" title="TBook"/> respectively.
    -								Their full qualification would read TAuthor.T_AUTHOR and TBook.T_BOOK, but in many cases,
    -								it's useful to static import elements involved with queries, in order to decrease verbosity:
    -								</html><java>import static com.example.jooq.Tables.*;</java><html>
    -							</p>
    -
    -							<p>
    -								Apart from the singleton Table instances TAuthor.T_AUTHOR and
    -								TBook.T_BOOK, these generated classes also contain one member
    -								for every physical field, such as TAuthor.ID or TBook.TAUTHOR_ID, etc.
    -								Depending on your configuration, those members can be static members
    -								(better for static imports) or instance members (better for aliasing)
    -							</p>
    -
    -							<ul>
    -								<li>For more information about code generation, check out the manual's section about
    -									<reference id="META" title="Meta model source code generation"/>.</li>
    -    							<li>For more DSL examples, please consider the manual's section about the
    -    								<reference id="DSL" title="DSL API"/>.</li>
    -							</ul>
    -
    -							<h3>Example: Non-DSL query</h3>
    -							<p>
    -								If you choose not to use the DSL API (for instance, because you don't
    -								want to add Query parts in the order SQL expects them), you can use
    -								this syntax:
    -							</p>
    -</html><java>// Re-use the factory to create a SelectQuery. This example will not make use of static imports...
    -SelectQuery q = create.selectQuery();
    -q.addFrom(T_AUTHOR);
    -
    -// This example shows some "mixed" API usage, where the JOIN is added with the standard API, and the
    -// Condition is created using the DSL API
    -q.addJoin(T_BOOK, T_AUTHOR.ID.equal(T_BOOK.AUTHOR_ID));
    -
    -// The AND operator between Conditions is implicit here
    -q.addConditions(T_AUTHOR.YEAR_OF_BIRTH.greaterThan(1920));
    -q.addConditions(T_AUTHOR.FIRST_NAME.equal("Paulo"));
    -q.addOrderBy(T_BOOK.TITLE);</java><html>
    -
    -							<h3>Fetching data</h3>
    -							<p>
    -								The <reference class="org.jooq.Select"/> interface extends
    -								<reference class="org.jooq.ResultQuery"/>,
    -								which provides a range of methods to fetch data from the database.
    -								Once you have constructed your SELECT query (see examples above), you
    -								may choose to either simply execute() it, or use a variety of convenience
    -								fetchXXX() methods.
    -							</p>
    -							<p>
    -								See the manual's
    -								<reference id="ResultQuery" title="section on the ResultQuery"/>
    -								for more details.
    -							</p>
    -
    -
    -							<h3>INSERT Statements</h3>
    -							<p>jOOQ supports two modes for INSERT statements.
    -							The INSERT VALUES and the INSERT SELECT syntax</p>
    -
    -							<h3>Example: SQL query and DSL query</h3>
    -							</html><code-pair>
    -<sql>INSERT INTO T_AUTHOR
    -    (ID, FIRST_NAME, LAST_NAME)
    -VALUES
    -    (100, 'Hermann', 'Hesse'),
    -    (101, 'Alfred', 'Döblin');</sql><java>create.insertInto(T_AUTHOR,
    -        T_AUTHOR.ID, T_AUTHOR.FIRST_NAME, T_AUTHOR.LAST_NAME)
    -      .values(100, "Hermann", "Hesse")
    -      .values(101, "Alfred", "Döblin")
    -      .execute();</java></code-pair><html>
    -
    -							<p>The DSL syntax tries to stay close to actual SQL. In detail,
    -								however, Java is limited in its possibilities. That's why the
    -								.values() clause is repeated for every record in multi-record inserts.
    -								Some RDBMS support
    -								inserting several records at the same time. This is also supported in
    -								jOOQ, and simulated using UNION clauses for those RDBMS that don't
    -								support this syntax.
    -								</html><sql>INSERT INTO .. SELECT .. UNION ALL SELECT ..</sql><html>
    -							</p>
    -							<p>Note: Just like in SQL itself, you can have syntax errors when you
    -								don't have matching numbers of fields/values. Also, you can run into
    -								runtime problems, if your field/value types don't match. </p>
    -
    -							<h3>Example: DSL Query, alternative syntax</h3>
    -							<p>MySQL (and some other RDBMS) allow for using an UPDATE-like syntax
    -								for INSERT statements. This is also supported in jOOQ, should you
    -								prefer that syntax. The above INSERT statement can also be expressed
    -								as follows: </p>
    -</html><java>create.insertInto(T_AUTHOR)
    -      .set(T_AUTHOR.ID, 100)
    -      .set(T_AUTHOR.FIRST_NAME, "Hermann")
    -      .set(T_AUTHOR.LAST_NAME, "Hesse")
    -      .newRecord()
    -      .set(T_AUTHOR.ID, 101)
    -      .set(T_AUTHOR.FIRST_NAME, "Alfred")
    -      .set(T_AUTHOR.LAST_NAME, "Döblin")
    -      .execute();</java><html>
    -							<p>As you can see, this syntax is a bit more verbose, but also more
    -								type-safe, as every field can be matched with its value.</p>
    -
    -							<h3>Example: ON DUPLICATE KEY UPDATE clause</h3>
    -							<p>The MySQL database supports a very convenient way to INSERT or
    -								UPDATE a record. This is a non-standard extension to the SQL syntax,
    -								which is supported by jOOQ and simulated in other RDBMS, where this is
    -								possible. Here is an example how to use the ON DUPLICATE KEY UPDATE
    -								clause: </p>
    -</html><java>// Add a new author called "Koontz" with ID 3.
    -// If that ID is already present, update the author's name
    -create.insertInto(T_AUTHOR, T_AUTHOR.ID, T_AUTHOR.LAST_NAME)
    -      .values(3, "Koontz")
    -      .onDuplicateKeyUpdate()
    -      .set(T_AUTHOR.LAST_NAME, "Koontz")
    -      .execute();</java><html>
    -
    -							<h3>Example: ON DUPLICATE KEY IGNORE clause</h3>
    -							<p>The MySQL database also supports an INSERT IGNORE INTO clause.
    -							    This is supported by jOOQ using the more convenient SQL
    -							    syntax variant of ON DUPLICATE KEY IGNORE, which can be equally
    -							    simulated in other databases using a MERGE statement: </p>
    -</html><java>// Add a new author called "Koontz" with ID 3.
    -// If that ID is already present, ignore the INSERT statement
    -create.insertInto(T_AUTHOR, T_AUTHOR.ID, T_AUTHOR.LAST_NAME)
    -      .values(3, "Koontz")
    -      .onDuplicateKeyIgnore()
    -      .execute();</java><html>
    -
    -      						<h3>Example: INSERT .. RETURNING clause</h3>
    -							<p>The Postgres database has native support for an INSERT .. RETURNING
    -								clause. This is a very powerful concept that is simulated for all
    -								other dialects using JDBC's
    -								<reference class="java.sql.Statement" anchor="#getGeneratedKeys()" title="getGeneratedKeys()"/>
    -								method. Take this example:</p>
    -
    -</html><java>// Add another author, with a generated ID
    -Record&lt;?&gt; record =
    -create.insertInto(T_AUTHOR, T_AUTHOR.FIRST_NAME, T_AUTHOR.LAST_NAME)
    -      .values("Charlotte", "Roche")
    -      .returning(T_AUTHOR.ID)
    -      .fetchOne();
    -
    -System.out.println(record.getValue(T_AUTHOR.ID));
    -
    -// For some RDBMS, this also works when inserting several values
    -// The following should return a 2x2 table
    -Result&lt;?&gt; result =
    -create.insertInto(T_AUTHOR, T_AUTHOR.FIRST_NAME, T_AUTHOR.LAST_NAME)
    -      .values("Johann Wolfgang", "von Goethe")
    -      .values("Friedrich", "Schiller")
    -      // You can request any field. Also trigger-generated values
    -      .returning(T_AUTHOR.ID, T_AUTHOR.CREATION_DATE)
    -      .fetch();</java><html>
    -
    -      						<p>
    -      							Be aware though, that this can lead to race-conditions
    -      							in those databases that cannot properly return generated
    -      							ID values.
    -      						</p>
    -
    -      						<h3>Example: Non-DSL Query</h3>
    -      						<p>You can always use the more verbose regular syntax of the InsertQuery, if you need more control: </p>
    -</html><java>// Insert a new author into the T_AUTHOR table
    -InsertQuery&lt;TAuthorRecord&gt; i = create.insertQuery(T_AUTHOR);
    -i.addValue(T_AUTHOR.ID, 100);
    -i.addValue(T_AUTHOR.FIRST_NAME, "Hermann");
    -i.addValue(T_AUTHOR.LAST_NAME, "Hesse");
    -
    -i.newRecord();
    -i.addValue(T_AUTHOR.ID, 101);
    -i.addValue(T_AUTHOR.FIRST_NAME, "Alfred");
    -i.addValue(T_AUTHOR.LAST_NAME, "Döblin");
    -i.execute();</java><html>
    -
    -							<h3>Example: INSERT Query combined with SELECT statements</h3>
    -							<p>The InsertQuery.addValue() method is overloaded, such that you can
    -								also provide a Field, potentially containing an expression: </p>
    -</html><java>// Insert a new author into the T_AUTHOR table
    -InsertQuery&lt;TAuthorRecord&gt; i = create.insertQuery(T_AUTHOR);
    -i.addValue(T_AUTHOR.ID, create.select(max(T_AUTHOR.ID).add(1)).from(T_AUTHOR).asField())
    -i.addValue(T_AUTHOR.FIRST_NAME, "Hermann");
    -i.addValue(T_AUTHOR.LAST_NAME, "Hesse");
    -i.execute();</java><html>
    -							<p>Note that especially MySQL (and some other RDBMS) has some
    -								limitations regarding that syntax. You may not be able to
    -								select from the same table you're inserting into</p>
    -
    -							<h3>Example: INSERT SELECT syntax support</h3>
    -							<p>In some occasions, you may prefer the INSERT SELECT syntax, for instance, when
    -								you copy records from one table to another: </p>
    -</html><java>Insert i = create.insertInto(T_AUTHOR_ARCHIVE)
    -                 .select(create.selectFrom(T_AUTHOR).where(T_AUTHOR.DECEASED.isTrue()));
    -i.execute();</java><html>
    -
    -
    -							<h3>UPDATE Statements</h3>
    -							<p>UPDATE statements are only possible on single tables. Support for
    -							multi-table updates will be implemented in the near future. </p>
    -
    -							<h3>Example: SQL query and DSL query</h3>
    -							</html><code-pair>
    -<sql>UPDATE T_AUTHOR
    -   SET FIRST_NAME = 'Hermann',
    -       LAST_NAME = 'Hesse'
    - WHERE ID = 3;
    - </sql><java>create.update(T_AUTHOR)
    -      .set(T_AUTHOR.FIRST_NAME, "Hermann")
    -      .set(T_AUTHOR.LAST_NAME, "Hesse")
    -      .where(T_AUTHOR.ID.equal(3))
    -      .execute();</java></code-pair><html>
    -
    -							<h3>Example: Non-DSL Query</h3>
    -							<p>Using the <reference class="org.jooq.UpdateQuery"/> class,
    -							this is how you could express an UPDATE statement:</p>
    -</html><java>UpdateQuery&lt;TAuthorRecord&gt; u = create.updateQuery(T_AUTHOR);
    -u.addValue(T_AUTHOR.FIRST_NAME, "Hermann");
    -u.addValue(T_AUTHOR.FIRST_NAME, "Hesse");
    -u.addConditions(T_AUTHOR.ID.equal(3));
    -u.execute();</java><html>
    -
    -
    -							<h3>DELETE Statements</h3>
    -							<p>DELETE statements are only possible on single tables. Support for
    -							multi-table deletes will be implemented in the near future. </p>
    -
    -							<h3>Example: SQL query and DSL query</h3>
    -							</html><code-pair>
    -<sql>DELETE T_AUTHOR
    - WHERE ID = 100;
    - </sql><java>create.delete(T_AUTHOR)
    -      .where(T_AUTHOR.ID.equal(100))
    -      .execute();</java></code-pair><html>
    -
    -							<h3>Example: Non-DSL Query</h3>
    -							<p>Using the <reference class="org.jooq.DeleteQuery"/> class,
    -							this is how you could express a DELETE statement: </p>
    -</html><java>DeleteQuery&lt;TAuthorRecord&gt; d = create.deleteQuery(T_AUTHOR);
    -d.addConditions(T_AUTHOR.ID.equal(100));
    -d.execute();</java><html>
    -
    -
    -							<h3>MERGE Statement</h3>
    -							<p>
    -								The MERGE statement is one of the most advanced standardised SQL
    -								constructs, which is supported by DB2, HSQLDB, Oracle, SQL Server and
    -								Sybase (MySQL has the similar INSERT .. ON DUPLICATE KEY UPDATE
    -								construct)
    -							</p>
    -							<p>
    -								The point of the standard MERGE statement is to take a TARGET table, and
    -								merge (INSERT, UPDATE) data from a SOURCE table into it. DB2, Oracle,
    -								SQL Server and Sybase also allow for DELETING some data and for adding
    -								many additional clauses. With jOOQ 2.0.1, only Oracle's MERGE extensions are supported.
    -								Here is an example:
    -							</p>
    -
    -							</html><code-pair>
    -<sql>-- Check if there is already an author called 'Hitchcock'
    --- If there is, rename him to John. If there isn't add him.
    -
    -MERGE INTO T_AUTHOR
    -USING (SELECT 1 FROM DUAL)
    -ON (LAST_NAME = 'Hitchcock')
    -WHEN MATCHED THEN UPDATE SET FIRST_NAME = 'John'
    -WHEN NOT MATCHED THEN INSERT (LAST_NAME)
    -                      VALUES ('Hitchcock')</sql><java>create.mergeInto(T_AUTHOR)
    -      .using(create().selectOne())
    -      .on(T_AUTHOR.LAST_NAME.equal("Hitchcock"))
    -      .whenMatchedThenUpdate()
    -      .set(T_AUTHOR.FIRST_NAME, "John")
    -      .whenNotMatchedThenInsert(T_AUTHOR.LAST_NAME)
    -      .values("Hitchcock")
    -      .execute();
    -
    -</java></code-pair><html>
    -
    -                            <h3>MERGE Statement (H2-specific syntax)</h3>
    -							<p>
    -							    The H2 database ships with a somewhat less powerful
    -							    but a little more intuitive syntax for its own version of the MERGE statement.
    -							    An example more or less equivalent to the previous one
    -							    can be seen here:
    -							</p>
    -</html><code-pair>
    -<sql>-- Check if there is already an author called 'Hitchcock'
    --- If there is, rename him to John. If there isn't add him.
    -
    -MERGE INTO T_AUTHOR (FIRST_NAME, LAST_NAME)
    -KEY (LAST_NAME)
    -VALUES ('John', 'Hitchcock')</sql><java>create.mergeInto(T_AUTHOR,
    -                 T_AUTHOR.FIRST_NAME,
    -                 T_AUTHOR.LAST_NAME)
    -      .key(T_AUTHOR.LAST_NAME)
    -      .values("John", "Hitchcock")
    -      .execute();
    -</java></code-pair><html>
    -
    -                            <p>
    -                                This syntax can be fully simulated by jOOQ for all other
    -                                databases that support the SQL standard. For more information
    -                                about the H2 MERGE syntax, see the documentation here:
    -                                <br/>
    -                                <br/>
    -                                <a href="http://www.h2database.com/html/grammar.html#merge">http://www.h2database.com/html/grammar.html#merge</a>
    -                            </p>
    -
    -							<h3>TRUNCATE Statement</h3>
    -							<p>
    -								The syntax is trivial:
    -							</p>
    -
    -							</html><code-pair>
    -								<sql>TRUNCATE TABLE T_AUTHOR;</sql><java>create.truncate(T_AUTHOR).execute();</java>
    -							</code-pair><html>
    -							<p>This is not supported by Ingres and SQLite. jOOQ will execute a DELETE FROM
    -								T_AUTHOR statement instead. </p>
    -						</html></content>
    -					</section>
    -
    -
    -
    -					<section id="ResultQuery">
    -						<title>ResultQuery and fetch() methods</title>
    -						<content><html>
    -							<h3>The ResultQuery and its convenience methods</h3>
    -							<p>
    -							    Data fetching is one of the great hassles in JDBC and JPA.
    -							    With jOOQ, you will be able to specify exactly, what kind of
    -							    data you want to fetch from any given query, as well as how
    -							    you want to fetch that data. This doesn't just mean distinguishing
    -							    between fetching one record at a time, or the whole resultset,
    -							    between fetching one column at a time, or the whole resultset.
    -							    This also means transforming your result (a list) into a map,
    -							    into arrays, into custom types, into JPA-annotated types, into
    -							    a call-back, or simply fetching it asynchronously
    -							</p>
    -							<p>These methods allow for fetching a jOOQ Result or parts of it.</p>
    -
    -</html><java><![CDATA[// Fetch the whole result
    -Result<R> fetch();
    -
    -// Fetch a single field from the result
    -<T> List<T> fetch(Field<T> field);
    -    List<?> fetch(int fieldIndex);
    -<T> List<T> fetch(int fieldIndex, Class<? extends T> type);
    -    List<?> fetch(String fieldName);
    -<T> List<T> fetch(String fieldName, Class<? extends T> type);
    -
    -// Fetch the first Record
    -R fetchAny();
    -
    -// Fetch exactly one Record
    -R fetchOne();
    -
    -// Fetch a single field of exactly one Record
    -<T> T  fetchOne(Field<T> field);
    -Object fetchOne(int fieldIndex);
    -<T> T  fetchOne(int fieldIndex, Class<? extends T> type);
    -Object fetchOne(String fieldName);
    -<T> T  fetchOne(String fieldName, Class<? extends T> type);]]></java><html>
    -
    -							<p>These methods transform the result into another form, if org.jooq.Result is not optimal</p>
    -
    -</html><java><![CDATA[// Fetch the resulting records as Maps
    -List<Map<String, Object>> fetchMaps();
    -     Map<String, Object>  fetchOneMap();
    -
    -// Fetch the result as a Map
    -<K>    Map<K, R> fetchMap(Field<K> key);
    -<K, V> Map<K, V> fetchMap(Field<K> key, Field<V> value);
    -
    -// Fetch the resulting records as arrays
    -Object[][] fetchArrays();
    -Object[]   fetchOneArray();
    -
    -// Fetch a single field as an array
    -<T>  T[] fetchArray(Field<T> field);
    -Object[] fetchArray(int fieldIndex);
    -<T>  T[] fetchArray(int fieldIndex, Class<? extends T> type);
    -Object[] fetchArray(String fieldName);
    -<T>  T[] fetchArray(String fieldName, Class<? extends T> type);]]></java><html>
    -
    -							<p>These methods transform the result into a user-defined form, if org.jooq.Result is not optimal</p>
    -
    -</html><java><![CDATA[// Fetch the resulting records into a custom POJO
    -// type, which may or may not be JPA-annotated
    -// Use the generator's <pojos>true</pojos> and <jpaAnnotation>true</jpaAnnotation>
    -// configurations to generate such POJOs with jOOQ
    -<E> List<E> fetchInto(Class<? extends E> type);
    -
    -// Fetch the resulting records into a custom
    -// record handler, similar to how Spring JdbcTemplate's
    -// RowMapper or the Ollin Framework works.
    -<H extends RecordHandler<R>> H fetchInto(H handler);
    -
    -// These change the behaviour of fetching itself,
    -// especially, when not all data should be
    -// fetched at once
    -// ----------------------------------------------
    -
    -// Fetch a Cursor for lazy iteration
    -Cursor<R> fetchLazy();
    -
    -// Or a JDBC ResultSet, if you prefer that
    -ResultSet fetchResultSet();
    -
    -// Fetch data asynchronously and let client code
    -// decide, when the data must be available.
    -// This makes use of the java.util.concurrent API,
    -// Similar to how Avajé Ebean works.
    -FutureResult<R> fetchLater();
    -FutureResult<R> fetchLater(ExecutorService executor);]]></java></content>
    -					</section>
    -
    -
    -					<section id="BindValues">
    -						<title>Bind values and parameters</title>
    -						<content><html>
    -							<h3>Bind values</h3>
    -							<p>
    -								Bind values are used in SQL / JDBC for various reasons. Among the most
    -								obvious ones are:
    -							</p>
    -							<ul>
    -								<li>
    -									Protection against SQL injection. Instead of inlining values
    -									possibly originating from user input, you bind those values to
    -									your prepared statement and let the JDBC driver / database take
    -									care of handling security aspects.
    -								</li>
    -								<li>
    -									Increased speed. Advanced databases such as Oracle can keep
    -									execution plans of similar queries in a dedicated cache to prevent
    -									hard-parsing your query again and again. In many cases, the actual
    -									value of a bind variable does not influence the execution plan, hence
    -									it can be reused. Preparing a statement will thus be faster
    -								</li>
    -								<li>
    -									On a JDBC level, you can also reuse the SQL string and prepared statement
    -									object instead of constructing it again, as you can bind new values to
    -									the prepared statement. This is currently not supported by jOOQ, though
    -								</li>
    -							</ul>
    -
    -							<h3>Ways to introduce bind values with jOOQ</h3>
    -							<p>
    -								Bind values are omni-present in jOOQ. Whenever you create a condition,
    -								you're actually also adding a bind value:
    -							</p>
    -</html><java>// In jOOQ, "Poe" will be the bind value bound to the condition
    -LAST_NAME.equal("Poe");</java><html>
    -
    -
    -							<p>
    -								The above notation is actually convenient way to explicitly create
    -								a bind value for "Poe". You could also write this, instead:
    -							</p>
    -</html><java>// The Factory allows for explicitly creating bind values
    -LAST_NAME.equal(Factory.val("Poe"));
    -
    -// Or, when static importing Factory.val:
    -LAST_NAME.equal(val("Poe"))</java><html>
    -
    -							<p>
    -								Once created, bind values are part of the query's syntax tree (see
    -								<reference id="QueryPart" title="the manual's section about jOOQ's architecture"/>
    -							    for more information about jOOQ's internals),
    -								and cannot be modified directly anymore. If you wish to reuse a query and
    -								modify bind values between subsequent query executions, you can access them again
    -								through the <reference class="org.jooq.Query"/> interface:
    -							</p>
    -
    -</html><java><![CDATA[// Access the first bind value from a query. Indexes are counted from 1, just as with JDBC
    -Query query = create.select().from(T_AUTHOR).where(LAST_NAME.equal("Poe"));
    -Param<?> param = query.getParam("1");
    -
    -// You could now modify the Query's underlying bind value:
    -if ("Poe".equal(param.getValue())) {
    -    param.setConverted("Orwell");
    -}]]></java><html>
    -
    -							<p>
    -								The <reference class="org.jooq.Param"/> type can also be named explicitly
    -								using the Factory's param() methods:
    -							</p>
    -</html><java><![CDATA[// Create a query with a named parameter. You can then use that name for accessing the parameter again
    -Query query1 = create.select().from(T_AUTHOR).where(LAST_NAME.equal(param("lastName", "Poe")));
    -Param<?> param1 = query.getParam("lastName");
    -
    -// Or, keep a reference to the typed parameter in order not to lose the <T> type information:
    -Param<String> param2 = param("lastName", "Poe");
    -Query query2 = create.select().from(T_AUTHOR).where(LAST_NAME.equal(param2));
    -
    -// You can now change the bind value directly on the Param reference:
    -param2.setValue("Orwell");
    -]]></java><html>
    -
    -							<p>
    -								The <reference class="org.jooq.Query"/> interface also allows for
    -								setting new bind values directly, without accessing the Param type:
    -							</p>
    -
    -</html><java>Query query1 = create.select().from(T_AUTHOR).where(LAST_NAME.equal("Poe"));
    -query1.bind(1, "Orwell");
    -
    -// Or, with named parameters
    -Query query2 = create.select().from(T_AUTHOR).where(LAST_NAME.equal(param("lastName", "Poe")));
    -query2.bind("lastName", "Orwell");</java><html>
    -
    -							<p>
    -								NOTE: Should you wish to use jOOQ only as a query builder and execute
    -								queries with another tool, such as Spring Data instead, you can also
    -								use the Factory's renderNamedParams() method, to actually render named
    -								parameter names in generated SQL:
    -							</p>
    -
    -							</html><code-pair>
    -<java>create.renderNamedParams(
    -    create.select()
    -          .from(T_AUTHOR)
    -          .where(LAST_NAME.equal(
    -                 param("lastName", "Poe"))));</java><sql>-- The named bind variable can be rendered
    -
    -SELECT *
    -FROM T_AUTHOR
    -WHERE LAST_NAME = :lastName
    -</sql>
    -							</code-pair><html>
    -
    -							<h3>Inlining bind values</h3>
    -
    -							<p>
    -								Sometimes, you may wish to avoid rendering bind
    -								variables while still using custom values in SQL.
    -								jOOQ refers to that as "inlined" bind values.
    -								When bind values are inlined, they render the
    -								actual value in SQL rather than a JDBC question mark.
    -								Bind value inlining can be achieved in two ways:
    -							</p>
    -
    -							<ol>
    -								<li>
    -									By using the settings and setting the
    -									<reference class="org.jooq.conf.StatementType"/>
    -									to STATIC_STATEMENT. This will inline all
    -									bind values for SQL statements rendered from
    -									such a Factory.
    -								</li>
    -								<li>
    -									By using Factory.inline() methods.
    -								</li>
    -							</ol>
    -
    -							<p>
    -								In both cases, your inlined bind values will be
    -								properly escaped to avoid SQL syntax errors and
    -								SQL injection.
    -								Some examples:
    -							</p>
    -
    -</html><java><![CDATA[
    -// Use dedicated calls to inline() in order to specify
    -// single bind values to be rendered as inline values
    -// --------------------------------------------------
    -create.select()
    -      .from(T_AUTHOR)
    -      .where(LAST_NAME.equal(inline("Poe")));
    -
    -// Or render the whole query with inlined values
    -// --------------------------------------------------
    -Settings settings = new Settings()
    -    .withStatementType(StatementType.STATIC_STATEMENT);
    -
    -// Add the settings to the factory
    -Factory create = new Factory(connection, SQLDialect.ORACLE, settings);
    -
    -// Run queries that omit rendering schema names
    -create.select()
    -      .from(T_AUTHOR)
    -      .where(LAST_NAME.equal("Poe"));]]></java></content>
    -					</section>
    -
    -
    -					<section id="QueryPart">
    -						<title>QueryParts and the global architecture</title>
    -						<content><html>
    -							<h3>Everything is a QueryPart</h3>
    -							<p>
    -								A
    -								<reference class="org.jooq.Query" />
    -								and all its contained objects is a
    -								<reference class="org.jooq.QueryPart" />.
    -								QueryParts essentially provide this functionality:
    -							</p>
    -							<ul>
    -								<li>they can render SQL using the toSQL(RenderContext) method</li>
    -								<li>they can bind variables using the bind(BindContext) method</li>
    -							</ul>
    -
    -							<p>Both of these methods are contained in jOOQ's internal API's
    -							   <reference class="org.jooq.QueryPartInternal"/>, which is
    -							   internally implemented by every QueryPart. QueryPart internals are best
    -							   illustrated with an example.</p>
    -
    -						   <h3>Example: CompareCondition</h3>
    -						   <p>A simple example can be provided by checking out jOOQ's internal
    -								representation of a
    -								<reference class="org.jooq.impl.CompareCondition"/>.
    -								It is used for any condition
    -								comparing two fields as for example the T_AUTHOR.ID = T_BOOK.AUTHOR_ID
    -								condition here: </p>
    -</html><sql>-- [...]
    -FROM T_AUTHOR
    -JOIN T_BOOK ON T_AUTHOR.ID = T_BOOK.AUTHOR_ID
    --- [...]</sql><html>
    -
    -							<p>This is how jOOQ implements such a condition: </p>
    -
    -</html><java><![CDATA[@Override
    -public final void bind(BindContext context) throws DataAccessException {
    -    // The CompareCondition itself does not bind any variables.
    -    // But the two fields involved in the condition might do so...
    -    context.bind(field1).bind(field2);
    -}
    -
    -@Override
    -public final void toSQL(RenderContext context) {
    -    // The CompareCondition delegates rendering of the Fields to the Fields
    -    // themselves and connects them using the Condition's comparator operator:
    -    context.sql(field1)
    -           .sql(" ");
    -
    -    // If the second field is null, some convenience behaviour can be
    -    // implemented here
    -    if (field2.isNullLiteral()) {
    -        switch (comparator) {
    -            case EQUALS:
    -                context.sql("is null");
    -                break;
    -
    -            case NOT_EQUALS:
    -                context.sql("is not null");
    -                break;
    -
    -            default:
    -                throw new IllegalStateException("Cannot compare null with " + comparator);
    -        }
    -    }
    -
    -    // By default, also delegate the right hand side's SQL rendering to the
    -    // underlying field
    -    else {
    -        context.sql(comparator.toSQL())
    -               .sql(" ")
    -               .sql(field2);
    -    }
    -}
    -]]></java><html>
    -							<p>For more complex examples, please refer to the codebase, directly</p>
    -						</html></content>
    -					</section>
    -
    -
    -					<section id="Serializability">
    -						<title>Serializability of jOOQ objects</title>
    -						<content><html>
    -							<h3>Attaching QueryParts</h3>
    -							<p>
    -								The only transient element in any jOOQ object is the
    -								<reference id="Factory"/>'s
    -								underlying
    -								<reference class="java.sql.Connection"/>. When you want to execute queries after
    -								de-serialisation, or when you want to store/refresh/delete
    -								<reference id="UpdatableRecord" title="Updatable Records"/>,
    -								you will have to "import" or "re-attach" them to a Factory
    -							</p>
    -</html><java>// Deserialise a SELECT statement
    -ObjectInputStream in = new ObjectInputStream(...);
    -Select&lt;?&gt; select = (Select&lt;?&gt;) in.readObject();
    -
    -// This will throw a DetachedException:
    -select.execute();
    -
    -// In order to execute the above select, attach it first
    -Factory create = new Factory(connection, SQLDialect.ORACLE);
    -create.attach(select);</java><html>
    -
    -
    -							<h3>Automatically attaching QueryParts</h3>
    -							<p>
    -								Note, this functionality is deprecated with jOOQ 2.1.0.
    -								Please use the <reference id="ExecuteListener" title="ExecuteListener"/> API
    -								instead, to provide jOOQ queries with a
    -								<reference class="java.sql.Connection"/> before
    -								execution.
    -							</p>
    -							<p>In simple cases, you can register a ConfigurationProvider in jOOQ's ConfigurationRegistry</p>
    -</html><java>// Create your own custom ConfigurationProvider that will make
    -// your default Factory available to jOOQ
    -ConfigurationProvider provider = new CustomConfigurationProvider();
    -
    -// Statically register the provider to jOOQ's ConfigurationRegistry
    -ConfigurationRegistry.setProvider(provider);</java><html>
    -
    -							<p>Once you have executed these steps, all subsequent deserialisations
    -								will try to access a Configuration (containing a JDBC Connection) from
    -								your ConfigurationProvider. This may be useful when </p>
    -							<ul>
    -								<li>transporting jOOQ QueryParts or Records via TCP/IP, RMI, etc (e.g.
    -									between client and server), before immediately executing queries,
    -									storing UpdatableRecords</li>
    -								<li>
    -									Using automatic mechanisms as known in
    -									<a href="http://wicket.apache.org/">Wicket</a>
    -								</li>
    -							</ul>
    -						</html></content>
    -					</section>
    -
    -
    -					<section id="Extend">
    -						<title>Extend jOOQ with custom types</title>
    -						<content><html>
    -							<h3>Write your own QueryPart implementations</h3>
    -							<p>If a SQL clause is too complex to express with jOOQ, you can extend
    -								either one of the following types for use directly in a jOOQ query:</p>
    -</html><java>public abstract class CustomField&lt;T&gt; extends AbstractField&lt;T&gt; {
    -  // [...]
    -}
    -public abstract class CustomCondition extends AbstractCondition {
    -  // [...]
    -}</java><html>
    -
    -							<p>These two classes are declared public and covered by integration
    -								tests. When you extend these classes, you will have to provide your
    -								own implementations for the <reference id="QueryPart" title="QueryParts"/>'
    -								bind(<reference class="org.jooq.BindContext" title="BindContext"/>) and
    -								toSQL(<reference class="org.jooq.RenderContext" title="RenderContext"/>) methods:</p>
    -</html><java>// This method must produce valid SQL. If your QueryPart contains other QueryParts, you may delegate SQL code generation to them
    -// in the correct order, passing the render context.
    -//
    -// If context.inline() is true, you must inline all bind variables
    -// If context.inline() is false, you must generate ? for your bind variables
    -public void toSQL(RenderContext context);
    -
    -// This method must bind all bind variables to a PreparedStatement. If your QueryPart contains other QueryParts, you may delegate
    -// variable binding to them in the correct order, passing the bind context.
    -//
    -// Every QueryPart must ensure, that it starts binding its variables at context.nextIndex().
    -public void bind(BindContext context) throws DataAccessException;</java><html>
    -
    -							<p>The above contract may be a bit tricky to understand at first. The
    -								best thing is to check out jOOQ source code and have a look at a
    -								couple of QueryParts, to see how it's done.</p>
    -							<h3>Plain SQL as an alternative</h3>
    -							<p>If you don't need integration of rather complex QueryParts into
    -								jOOQ, then you might be safer using simple
    -								<reference id="SQL" title="Plain SQL"/> functionality,
    -								where you can provide jOOQ with a simple String representation of your
    -								embedded SQL. </p>
    -						</html></content>
    -					</section>
    -				</sections>
    -			</section>
    -
    -
    -
    -
    -			<section id="META">
    -				<title>Meta model code generation</title>
    -				<content><html>
    -					<h3>Overview</h3>
    -					<p>
    -						In the previous chapter, we have seen how to use the
    -						<reference id="Factory" title="Factory"/> in order to create
    -						<reference id="Query" title="Queries"/> and fetch data in
    -						<reference id="Result" title="Results"/>. The strength of jOOQ not
    -						only lies in its object-oriented
    -						<reference id="QueryPart" title="Query model"/>,
    -						but also in the fact
    -						that Java source code is generated from your database schema into the
    -						META data model. jOOQ follows the paradigm, that your database comes
    -						first (see also <a href="&lt;?=$root?&gt;/">home page</a>).
    -						This means that you should not modify
    -						generated source code, but only adapt entities in your database. Every
    -						change in your database is reflected in a corresponding change in your
    -						generated meta-model.
    -					</p>
    -					<p>
    -						Artefacts, such as tables, views, user defined types, sequences, stored
    -						procedures, packages have a corresponding artefact in Java.
    -					</p>
    -				</html></content>
    -
    -
    -				<sections>
    -					<section id="Configuration">
    -						<title>Configuration and setup of the generator</title>
    -						<content><html>
    -							<h3>The deliverables</h3>
    -							<p>
    -								There are three binaries available with jOOQ, to be downloaded from
    -								<a href="https://sourceforge.net/projects/jooq/">SourceForge</a>
    -								or from Maven central:
    -							</p>
    -							<ul>
    -								<li>
    -									<strong>jOOQ.jar</strong>
    -									<br />
    -									The main library that you will include in your application to run jOOQ
    -								</li>
    -								<li>
    -									<strong>jOOQ-meta.jar</strong>
    -									<br />
    -									The utility that you will include in your build to navigate your
    -									database schema for code generation. This can be used as a schema
    -									crawler as well.
    -								</li>
    -								<li>
    -									<strong>jOOQ-codegen.jar</strong>
    -									<br />
    -									The utility that you will include in your build to generate your
    -									database schema
    -								</li>
    -							</ul>
    -
    -							<h3>Dependencies</h3>
    -							<p>All of jOOQ's dependencies are "optional", i.e. you can run
    -								jOOQ without any of those libraries.
    -								For instance, jOOQ maintains an "optional" dependency on log4j and slf4j.
    -								This means, that jOOQ tries to find log4j (and /log4j.xml) or slf4j on the
    -								classpath. If they are not present, then java.util.logging.Logger is
    -								used instead.
    -							</p>
    -							<p>
    -								Other optional dependencies are the JPA API, and the Oracle JDBC driver,
    -								which is needed for Oracle's advanced data types, only
    -							</p>
    -
    -
    -							<h3>Configure jOOQ's code generator</h3>
    -							<p>You need to tell jOOQ some things about your database connection.
    -								Here's an example of how to do it for an Oracle database </p>
    -</html><xml><![CDATA[<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    -<configuration>
    -  <!-- Configure the database connection here -->
    -  <jdbc>
    -    <driver>oracle.jdbc.OracleDriver</driver>
    -    <url>jdbc:oracle:thin:@[your jdbc connection parameters]</url>
    -    <user>[your database user]</user>
    -    <password>[your database password]</password>
    -    <!-- You can also pass user/password and other JDBC properties in the optional properties tag: -->
    -    <properties>
    -      <property><key>user</key><value>[db-user]</value></property>
    -      <property><key>password</key><value>[db-password]</value></property>
    -    </properties>
    -  </jdbc>
    -
    -  <generator>
    -    <database>
    -      <!-- The database dialect from jooq-meta. Available dialects are
    -           named org.util.[database].[database]Database. Known values are:
    -
    -           org.jooq.util.ase.ASEDatabase (to be used with Sybase ASE)
    -           org.jooq.util.cubrid.CUBRIDDatabase
    -           org.jooq.util.db2.DB2Database
    -           org.jooq.util.derby.DerbyDatabase
    -           org.jooq.util.h2.H2Database
    -           org.jooq.util.hsqldb.HSQLDBDatabase
    -           org.jooq.util.ingres.IngresDatabase
    -           org.jooq.util.mysql.MySQLDatabase
    -           org.jooq.util.oracle.OracleDatabase
    -           org.jooq.util.postgres.PostgresDatabase
    -           org.jooq.util.sqlite.SQLiteDatabase
    -           org.jooq.util.sqlserver.SQLServerDatabase
    -           org.jooq.util.sybase.SybaseDatabase (to be used with Sybase SQL Anywhere)
    -
    -           You can also provide your own org.jooq.util.Database implementation
    -           here, if your database is currently not supported -->
    -      <name>org.jooq.util.oracle.OracleDatabase</name>
    -
    -      <!-- All elements that are generated from your schema (several Java
    -           regular expressions, separated by comma) Watch out for
    -           case-sensitivity. Depending on your database, this might be
    -           important! You can create case-insensitive regular expressions
    -           using this syntax: (?i:expr)A comma-separated list of regular
    -           expressions -->
    -      <includes>.*</includes>
    -
    -      <!-- All elements that are excluded from your schema (several Java
    -           regular expressions, separated by comma). Excludes match before
    -           includes -->
    -      <excludes></excludes>
    -
    -      <!-- The schema that is used locally as a source for meta information.
    -           This could be your development schema or the production schema, etc
    -           This cannot be combined with the schemata element.
    -
    -           If left empty, jOOQ will generate all available schemata. See the
    -           manual's next section to learn how to generate several schemata -->
    -      <inputSchema>[your database schema / owner / name]</inputSchema>
    -    </database>
    -
    -    <generate>
    -      <!-- See advanced configuration properties -->
    -    </generate>
    -
    -    <target>
    -      <!-- The destination package of your generated classes (within the
    -           destination directory) -->
    -      <packageName>[org.jooq.your.packagename]</packageName>
    -
    -      <!-- The destination directory of your generated classes -->
    -      <directory>[/path/to/your/dir]</directory>
    -    </target>
    -  </generator>
    -</configuration>]]></xml><html>
    -
    -							<p>
    -								There are also lots of advanced configuration parameters, which will be
    -								treated in the <reference id="AdvancedConfiguration" title="manual's next section"/>
    -								Note, you can find the official XSD file at
    -							   <a href="http://www.jooq.org/xsd/jooq-codegen-2.1.0.xsd" title="The jOOQ-codegen configuration XSD">http://www.jooq.org/xsd/jooq-codegen-2.1.0.xsd</a>
    -							   for a formal specification</p>
    -
    -							<h3>Run jOOQ code generation</h3>
    -							<p>Code generation works by calling this class with the above property file as argument.</p>
    -							</html><config>org.jooq.util.GenerationTool /jooq-config.xml</config><html>
    -							<p>Be sure that these elements are located on the classpath: </p>
    -							<ul>
    -								<li>The property file</li>
    -								<li>jooq.jar, jooq-meta.jar, jooq-codegen.jar</li>
    -								<li>The JDBC driver you configured</li>
    -							</ul>
    -
    -							<h3>A command-line example (For Windows, unix/linux/etc will be similar)</h3>
    -							<ul>
    -								<li>Put the property file, jooq*.jar and the JDBC driver into
    -									a directory, e.g. C:\temp\jooq</li>
    -							    <li>Go to C:\temp\jooq</li>
    -							    <li>Run java -cp jooq.jar;jooq-meta.jar;jooq-codegen.jar;[JDBC-driver].jar;. org.jooq.util.GenerationTool /[property file] </li>
    -							</ul>
    -							<p>Note that the property file must be passed as a classpath resource</p>
    -
    -							<h3>Run code generation from Eclipse</h3>
    -							<p>Of course, you can also run code generation from your IDE. In
    -								Eclipse, set up a project like this. Note that this example uses
    -								jOOQ's log4j support by adding log4j.xml and log4j.jar to the project
    -								classpath: </p>
    -							<div class="screenshot">
    -							<img class="screenshot" src="&lt;?=$root?&gt;/img/eclipse-example-01.png" alt="Eclipse configuration"/>
    -							</div>
    -
    -							<p>Once the project is set up correctly with all required artefacts on
    -								the classpath, you can configure an Eclipse Run Configuration for
    -								org.jooq.util.GenerationTool. </p>
    -							<div class="screenshot">
    -							<img class="screenshot" src="&lt;?=$root?&gt;/img/eclipse-example-02.png" alt="Eclipse configuration"/>
    -							</div>
    -
    -							<p>With the properties file as an argument </p>
    -							<div class="screenshot">
    -							<img class="screenshot" src="&lt;?=$root?&gt;/img/eclipse-example-03.png" alt="Eclipse configuration"/>
    -							</div>
    -
    -							<p>And the classpath set up correctly</p>
    -							<div class="screenshot">
    -							<img class="screenshot" src="&lt;?=$root?&gt;/img/eclipse-example-04.png" alt="Eclipse configuration"/>
    -							</div>
    -
    -							<p>Finally, run the code generation and see your generated artefacts</p>
    -							<div class="screenshot">
    -							<img class="screenshot" src="&lt;?=$root?&gt;/img/eclipse-example-05.png" alt="Eclipse configuration"/>
    -							</div>
    -
    -							<h3>Run generation with ant</h3>
    -							<p>
    -								You can also use an ant task to generate your classes. As a rule of thumb,
    -								remove the dots "." and dashes "-" from the .properties file's property names to get the
    -								ant task's arguments:
    -							</p>
    -</html><xml><![CDATA[<!-- Task definition -->
    -<taskdef name="generate-classes" classname="org.jooq.util.GenerationTask">
    -  <classpath>
    -    <fileset dir="${path.to.jooq.distribution}">
    -      <include name="jOOQ.jar"/>
    -      <include name="jOOQ-meta.jar"/>
    -      <include name="jOOQ-codegen.jar"/>
    -    </fileset>
    -    <fileset dir="${path.to.mysql.driver}">
    -      <include name="${mysql.driver}.jar"/>
    -    </fileset>
    -  </classpath>
    -</taskdef>
    -
    -<!-- Run the code generation task -->
    -<target name="generate-test-classes">
    -  <generate-classes
    -      jdbcurl="jdbc:mysql://localhost/test"
    -      jdbcuser="root"
    -      jdbcpassword=""
    -      generatordatabaseinputschema="test"
    -      generatortargetpackage="org.jooq.test.generatedclasses"
    -      generatortargetdirectory="${basedir}/src"/>
    -</target>]]></xml><html>
    -
    -							<p>
    -								Note that when running code generation with ant's &lt;java/&gt; task,
    -								you may have to set fork="true":
    -							</p>
    -
    -</html><xml><![CDATA[<!-- Run the code generation task -->
    -<target name="generate-test-classes">
    -  <java fork="true" classname="org.jooq.util.GenerationTool">
    -    [...]
    -  </java><html>
    -</target>
    -]]></xml><html>
    -							<h3>Integrate generation with Maven</h3>
    -							<p>Using the official jOOQ-codegen-maven plugin, you can integrate
    -								source code generation in your Maven build process: </p>
    -
    -</html><xml><![CDATA[<plugin>
    -
    -  <!-- Specify the maven code generator plugin -->
    -  <groupId>org.jooq</groupId>
    -  <artifactId>jooq-codegen-maven</artifactId>
    -  <version>2.4.2</version>
    -
    -  <!-- The plugin should hook into the generate goal -->
    -  <executions>
    -    <execution>
    -      <goals>
    -        <goal>generate</goal>
    -      </goals>
    -    </execution>
    -  </executions>
    -
    -  <!-- Manage the plugin's dependency. In this example, we'll use a PostgreSQL database -->
    -  <dependencies>
    -    <dependency>
    -      <groupId>postgresql</groupId>
    -      <artifactId>postgresql</artifactId>
    -      <version>8.4-702.jdbc4</version>
    -    </dependency>
    -  </dependencies>
    -
    -  <!-- Specify the plugin configuration.
    -       The configuration format is the same as for the standalone code generator -->
    -  <configuration>
    -
    -    <!-- JDBC connection parameters -->
    -    <jdbc>
    -      <driver>org.postgresql.Driver</driver>
    -      <url>jdbc:postgresql:postgres</url>
    -      <user>postgres</user>
    -      <password>test</password>
    -    </jdbc>
    -
    -    <!-- Generator parameters -->
    -    <generator>
    -      <name>org.jooq.util.DefaultGenerator</name>
    -      <database>
    -        <name>org.jooq.util.postgres.PostgresDatabase</name>
    -        <includes>.*</includes>
    -        <excludes></excludes>
    -        <inputSchema>public</inputSchema>
    -      </database>
    -      <generate>
    -        <relations>true</relations>
    -        <deprecated>false</deprecated>
    -      </generate>
    -      <target>
    -        <packageName>org.jooq.util.maven.example</packageName>
    -        <directory>target/generated-sources/jooq</directory>
    -      </target>
    -    </generator>
    -  </configuration>
    -</plugin>
    -]]></xml><html>
    -							<p>See the full example of a pom.xml including the jOOQ-codegen artefact here:
    -							<a href="https://github.com/jOOQ/jOOQ/blob/master/jOOQ-codegen-maven-example/pom.xml"
    -							  title="jOOQ-codegen-maven example pom.xml file">https://github.com/jOOQ/jOOQ/blob/master/jOOQ-codegen-maven-example/pom.xml</a></p>
    -
    -                            <h3>Migrate properties files from jOOQ 1.7, early versions of jOOQ 2.0.x:</h3>
    -                            <p>
    -                                Before jOOQ 2.0.4, the code generator was configured using properties files
    -                                These files are still supported for source code generation, but their syntax
    -                                won't be maintained any longer. If you wish to migrate to XML, you can
    -                                migrate the file using this command on the command line
    -                            </p>
    -							</html><config>org.jooq.util.GenerationTool /jooq-config.properties migrate</config><html>
    -							<p>
    -								Using the migrate flag, jOOQ will read the properties file and output
    -								a corresponding XML file on system out
    -							</p>
    -
    -							<h3>Use jOOQ generated classes in your application</h3>
    -							<p>Be sure, both jOOQ.jar and your generated package (see
    -								configuration) are located on your classpath. Once this is done, you
    -								can execute SQL statements with your generated classes.</p>
    -						</html></content>
    -					</section>
    -
    -
    -					<section id="AdvancedConfiguration">
    -					    <title>Advanced generator configuration</title>
    -						<content><html>
    -							<h3>Code generation</h3>
    -							<p>
    -								In the <reference id="Configuration" title="previous section"/>
    -								we have seen how jOOQ's source code generator is configured and
    -								run within a few steps. In this chapter we'll treat some advanced
    -								settings
    -							</p>
    -
    -</html><xml><![CDATA[<!-- These properties can be added directly to the generator element: -->
    -<generator>
    -  <!-- The default code generator. You can override this one, to generate your own code style
    -       Defaults to org.jooq.util.DefaultGenerator -->
    -  <name>org.jooq.util.DefaultGenerator</name>
    -
    -  <!-- The naming strategy used for class and field names.
    -       You may override this with your custom naming strategy. Some examples follow
    -       Defaults to org.jooq.util.DefaultGeneratorStrategy -->
    -  <strategy>
    -    <name>org.jooq.util.DefaultGeneratorStrategy</name>
    -  </strategy>
    -</generator>]]></xml><html>
    -
    -							<p>
    -								The following example shows how you can override the
    -								DefaultGeneratorStrategy to render table and column names the way
    -								they are defined in the database, rather than switching them to
    -								camel case:
    -							</p>
    -
    -</html><java><![CDATA[/**
    - * It is recommended that you extend the DefaultGeneratorStrategy. Most of the
    - * GeneratorStrategy API is already declared final. You only need to override any
    - * of the following methods, for whatever generation behaviour you'd like to achieve
    - *
    - * Beware that most methods also receive a "Mode" object, to tell you whether a
    - * TableDefinition is being rendered as a Table, Record, POJO, etc. Depending on
    - * that information, you can add a suffix only for TableRecords, not for Tables
    - */
    -public class AsInDatabaseStrategy extends DefaultGeneratorStrategy {
    -
    -    /**
    -     * Override this to specifiy what identifiers in Java should look like.
    -     * This will just take the identifier as defined in the database.
    -     */
    -    @Override
    -    public String getJavaIdentifier(Definition definition) {
    -        return definition.getOutputName();
    -    }
    -
    -    /**
    -     * Override these to specify what a setter in Java should look like. Setters
    -     * are used in TableRecords, UDTRecords, and POJOs. This example will name
    -     * setters "set[NAME_IN_DATABASE]"
    -     */
    -    @Override
    -    public String getJavaSetterName(Definition definition, Mode mode) {
    -        return "set" + definition.getOutputName();
    -    }
    -
    -    /**
    -     * Just like setters...
    -     */
    -    @Override
    -    public String getJavaGetterName(Definition definition, Mode mode) {
    -        return "get" + definition.getOutputName();
    -    }
    -
    -    /**
    -     * Override this method to define what a Java method generated from a database
    -     * Definition should look like. This is used mostly for convenience methods
    -     * when calling stored procedures and functions. This example shows how to
    -     * set a prefix to a CamelCase version of your procedure
    -     */
    -    @Override
    -    public String getJavaMethodName(Definition definition, Mode mode) {
    -        return "call" + org.jooq.tools.StringUtils.toCamelCase(definition.getOutputName());
    -    }
    -
    -    /**
    -     * Override this method to define how your Java classes and Java files should
    -     * be named. This example applies no custom setting and uses CamelCase versions
    -     * instead
    -     */
    -    @Override
    -    public String getJavaClassName(Definition definition, Mode mode) {
    -        return super.getJavaClassName(definition, mode);
    -    }
    -
    -    /**
    -     * Override this method to re-define the package names of your generated
    -     * artefacts.
    -     */
    -    @Override
    -    public String getJavaPackageName(Definition definition, Mode mode) {
    -        return super.getJavaPackageName(definition, mode);
    -    }
    -
    -    /**
    -     * Override this method to define how Java members should be named. This is
    -     * used for POJOs and method arguments
    -     */
    -    @Override
    -    public String getJavaMemberName(Definition definition, Mode mode) {
    -        return definition.getOutputName();
    -    }
    -
    -    /**
    -     * Override this method to define the base class for those artefacts that
    -     * allow for custom base classes
    -     */
    -    @Override
    -    public String getJavaClassExtends(Definition definition, Mode mode) {
    -        return Object.class.getName();
    -    }
    -
    -    /**
    -     * Override this method to define the interfaces to be implemented by those
    -     * artefacts that allow for custom interface implementation
    -     */
    -    @Override
    -    public List<String> getJavaClassImplements(Definition definition, Mode mode) {
    -        return Arrays.asList(Serializable.class.getName(), Cloneable.class.getName());
    -    }
    -
    -    /**
    -     * Override this method to define the suffix to apply to routines when
    -     * they are overloaded.
    -     *
    -     * Use this to resolve compile-time conflicts in generated source code, in
    -     * case you make heavy use of procedure overloading
    -     */
    -    @Override
    -    public String getOverloadSuffix(Definition definition, Mode mode, String overloadIndex) {
    -        return "_OverloadIndex_" + overloadIndex;
    -    }
    -}]]></java><html>
    -
    -                            <h3>jooq-meta configuration</h3>
    -							<p>
    -								Within the &lt;generator/&gt; element, there are other configuration elements:
    -							</p>
    -
    -</html><xml><![CDATA[<!-- These properties can be added to the database element: -->
    -<database>
    -  <!-- Generate java.sql.Timestamp fields for DATE columns. This is
    -       particularly useful for Oracle databases.
    -       Defaults to false -->
    -  <dateAsTimestamp>false</dateAsTimestamp>
    -
    -  <!-- Generate jOOU data types for your unsigned data types, which are
    -       not natively supported in Java.
    -       Defaults to true -->
    -  <unsignedTypes>true</unsignedTypes>
    -
    -  <!-- The schema that is used in generated source code. This will be the
    -       production schema. Use this to override your local development
    -       schema name for source code generation. If not specified, this
    -       will be the same as the input-schema. -->
    -  <outputSchema>[your database schema / owner / name]</outputSchema>
    -
    -  <!-- A configuration element to configure several input and/or output
    -       schemata for jooq-meta, in case you're using jooq-meta in a multi-
    -       schema environment.
    -       This cannot be combined with the above inputSchema / outputSchema -->
    -  <schemata>
    -    <schema>
    -      <inputSchema>...</inputSchema>
    -      <outputSchema>...</outputSchema>
    -    </schema>
    -    [ <schema>...</schema> ... ]
    -  </schemata>
    -
    -  <!-- A configuration element to configure master data table enum classes -->
    -  <masterDataTables>...</masterDataTables>
    -
    -  <!-- A configuration element to configure custom data types -->
    -  <customTypes>...</customTypes>
    -
    -  <!-- A configuration element to configure type overrides for generated
    -       artefacts (e.g. in combination with customTypes) -->
    -  <forcedTypes>...</forcedTypes>
    -</database>]]></xml><html>
    -
    -							<p>
    -								Check out the some of the manual's "advanced" sections
    -								to find out more about the advanced configuration parameters.
    -							</p>
    -							<ul>
    -								<li><reference id="SchemaMapping" title="Schema mapping"/></li>
    -								<li><reference id="MasterData" title="Master data types"/></li>
    -								<li><reference id="CustomTypes" title="Custom types"/></li>
    -							</ul>
    -
    -							<h3>jooq-codegen configuration</h3>
    -                            <p>Also, you can add some optional advanced configuration parameters for the generator: </p>
    -
    -</html><xml><![CDATA[<!-- These properties can be added to the generate element: -->
    -<generate>
    -  <!-- Primary key / foreign key relations should be generated and used.
    -       This is a prerequisite for various advanced features.
    -       Defaults to false -->
    -  <relations>false</relations>
    -
    -  <!-- Generate navigation methods to navigate foreign key relationships
    -       directly from Record classes. This is only relevant if relations
    -       is set to true, too.
    -       Defaults to true -->
    -  <navigationMethods>true</navigationMethods>
    -
    -  <!-- Generate deprecated code for backwards compatibility
    -       Defaults to true -->
    -  <deprecated>true</deprecated>
    -
    -  <!-- Generate instance fields in your tables, as opposed to static
    -       fields. This simplifies aliasing.
    -       Defaults to true -->
    -  <instanceFields>true</instanceFields>
    -
    -  <!-- Generate the javax.annotation.Generated annotation to indicate
    -       jOOQ version used for source code.
    -       Defaults to true -->
    -  <generatedAnnotation>true</generatedAnnotation>
    -
    -  <!-- Generate jOOQ Record classes for type-safe querying. You can
    -       turn this off, if you don't need "active records" for CRUD
    -       Defaults to true -->
    -  <records>true</records>
    -
    -  <!-- Generate POJOs in addition to Record classes for usage of the
    -       ResultQuery.fetchInto(Class) API
    -       Defaults to false -->
    -  <pojos>false</pojos>
    -
    -  <!-- Generate interfaces that will be implemented by records and/or pojos.
    -       You can also use these interfaces in Record.into(Class<?>) and similar
    -       methods, to let jOOQ return proxy objects for them.
    -       Defaults to false -->
    -  <interfaces>false</interfaces>
    -
    -  <!-- Generate DAOs in addition to POJO classes
    -       Defaults to false -->
    -  <daos>false</daos>
    -
    -  <!-- Annotate POJOs and Records with JPA annotations for increased
    -       compatibility and better integration with JPA/Hibernate, etc
    -       Defaults to false -->
    -  <jpaAnnotations>false</jpaAnnotations>
    -
    -  <!-- Annotate POJOs and Records with JSR-303 validation annotations
    -       Defaults to false -->
    -  <validationAnnotations>false</validationAnnotations>
    -</generate>]]></xml></content>
    -					</section>
    -
    -
    -					<section id="SCHEMA">
    -						<title>The schema, top-level generated artefact</title>
    -						<content><html>
    -							<h3>The Schema</h3>
    -							<p>
    -								As of jOOQ 1.5, the top-level generated object is the
    -								<reference class="org.jooq.Schema" />.
    -								The Schema itself has no relevant functionality, except for holding
    -								the schema name for all dependent generated artefacts. jOOQ queries try
    -								to always fully qualify an entity within the database using that Schema
    -							</p>
    -
    -							<p>
    -								Currently, it is not possible to link generated artefacts from various
    -								schemata. If you have a stored function from Schema A, which returns a
    -								UDT from Schema B, the types cannot be linked. This enhancement is on
    -								the roadmap, though: <reference ticket="282"/>.
    -							</p>
    -
    -							<p>
    -								When you have several schemata that are logically equivalent (i.e. they
    -								contain identical entities, but the schemata stand for different
    -								users/customers/clients, etc), there is a solution for that. Check out
    -								the manual's section on support for
    -								<reference id="SchemaMapping" title="multiple equivalent schemata"/>
    -							</p>
    -
    -							<h3>Schema contents</h3>
    -							<p>The schema can be used to dynamically discover generate database
    -								artefacts. Tables, sequences, and other items are accessible from the
    -								schema. For example:</p>
    -</html><java>public final java.util.List&lt;org.jooq.Sequence&lt;?&gt;&gt; getSequences();
    -public final java.util.List&lt;org.jooq.Table&lt;?&gt;&gt; getTables();</java></content>
    -					</section>
    -
    -
    -					<section id="TABLE">
    -						<title>Tables, views and their records</title>
    -						<content><html>
    -							<h3>Tables and TableRecords</h3>
    -							<p>
    -								The most important generated artefacts are
    -								<reference class="org.jooq.Table" title="Tables"/> and
    -								<reference class="org.jooq.TableRecord" title="TableRecords"/>. As
    -								discussed in previous chapters about
    -								<reference id="Table" title="Tables"/> and
    -								<reference id="Result" title="Results"/>, jOOQ uses the
    -								Table class to model entities (both tables and views) in your database
    -								Schema. Every Table has a Record type associated with it that models a
    -								single tuple of that entity: Table&lt;R extends Record&gt;. This
    -								couple of Table&lt;R&gt; and R are generated as such:
    -							</p>
    -							<p>
    -								Suppose we have the tables as defined in the
    -								<reference id="ExampleDatabase" title="example database"/>.
    -								Then, using a
    -								default configuration, these (simplified for the example) classes will
    -								be generated:
    -							</p>
    -
    -							<h3>The Table as an entity meta model</h3>
    -</html><java>public class TAuthor extends UpdatableTableImpl&lt;TAuthorRecord&gt; {
    -
    -    // The singleton instance of the Table
    -    public static final TAuthor T_AUTHOR = new TAuthor();
    -
    -    // The Table's fields.
    -    // Depending on your jooq-codegen configuraiton, they can also be static
    -    public final TableField&lt;TAuthorRecord, Integer&gt; ID =            // [...]
    -    public final TableField&lt;TAuthorRecord, String&gt; FIRST_NAME =     // [...]
    -    public final TableField&lt;TAuthorRecord, String&gt; LAST_NAME =      // [...]
    -    public final TableField&lt;TAuthorRecord, Date&gt; DATE_OF_BIRTH =    // [...]
    -    public final TableField&lt;TAuthorRecord, Integer&gt; YEAR_OF_BIRTH = // [...]
    -
    -    // When you don't choose the static meta model, you can typesafely alias your tables.
    -    // Aliased tables will then hold references to the above final fields, too
    -    public TAuthor as(String alias) {
    -      // [...]
    -    }
    -}</java><html>
    -
    -							<h3>The Table's associated TableRecord</h3>
    -							<p>If you use the
    -								<reference id="Query" title="SimpleSelectQuery"/>
    -								 syntax (both in standard and DSL
    -								mode), then your SELECT statement will return the single Table&lt;R
    -								extends Record&gt;'s associated Record type &lt;R&gt;. In the case of
    -								the above TAuthor Table, this will be a TAuthorRecord. </p>
    -
    -</html><java>public class TAuthorRecord extends UpdatableRecordImpl&lt;TAuthorRecord&gt; {
    -
    -    // Getters and setters for the various fields
    -    public void setId(Integer value) {       // [...]
    -    public Integer getId() {                 // [...]
    -    public void setFirstName(String value) { // [...]
    -    public String getFirstName() {           // [...]
    -    public void setLastName(String value) {  // [...]
    -    public String getLastName() {            // [...]
    -    public void setDateOfBirth(Date value) { // [...]
    -    public Date getDateOfBirth() {           // [...]
    -
    -    // Navigation methods for foreign keys
    -    public List&lt;TBookRecord&gt; fetchTBooks() { // [...]
    -}</java><html>
    -
    -
    -							<h3>Generated or custom POJO's instead of jOOQ's Records</h3>
    -							<p>
    -								If you're using jOOQ along with Hibernate / JPA, or if you
    -								want to use your own, custom domain-model instead of jOOQ's
    -								Record type-hierarchy, you can choose to select values into
    -								POJOs. Let's say you defined a POJO for authors:
    -							</p>
    -
    -</html><java><![CDATA[package com.example;
    -
    -import javax.persistence.Column;
    -import javax.persistence.Entity;
    -
    -@Entity
    -public class MyAuthor {
    -    // Some fields may be public
    -    @Column(name = "ID")
    -    public int id;
    -
    -    // Others are private and have associated getters / setters:
    -    private String firstName;
    -    private String lastName;
    -
    -    public void setFirstName(String firstName) {
    -        this.firstName = firstName;
    -    }
    -
    -    @Column(name = "FIRST_NAME")
    -    public String getFirstName() {
    -        return firstName;
    -    }
    -
    -    public void setLastName(String lastName) {
    -        this.lastName = lastName;
    -    }
    -
    -    @Column(name = "LAST_NAME")
    -    public String getLastName() {
    -        return lastName;
    -    }
    -}]]></java><html>
    -
    -                            <p>
    -                            	The above could be your custom POJO or a POJO generated
    -                            	by jooq-codegen (see
    -                            	<reference id="AdvancedConfiguration" title="the manual's section about advanced codegen configuration"/>
    -                            	for more details). Also, JPA-annotations are not necessary
    -                            	if you wish to let jOOQ map record columns onto your POJO
    -                            	attributes by convention. Instead of fetching records normally,
    -                            	you can now let jOOQ fetch records "into" your custom type:
    -                            </p>
    -
    -</html><java><![CDATA[List<MyAuthor> results = create.select().from(TAuthor.T_AUTHOR).fetchInto(MyAuthor.class);]]></java><html>
    -
    -							<p>
    -								Read the javadoc for
    -								<a href="http://www.jooq.org/javadoc/latest/org/jooq/Record.html#into%28java.lang.Class%29" title="Record.into() javadoc, explaining about how to map jOOQ Records onto custom types">Record.into()</a>
    -								for more details.
    -							</p>
    -						</html></content>
    -					</section>
    -
    -
    -					<section id="PROCEDURE">
    -						<title>Procedures and packages</title>
    -						<content><html>
    -							<h3>Stored procedures in modern RDBMS</h3>
    -							<p>This is one of the most important reasons why you should consider
    -								jOOQ. Read also my
    -								<a href="http://java.dzone.com/articles/2011-great-year-stored" title="Article on stored procedures and how to use them with jOOQ">article on dzone</a>
    -								about why stored procedures become
    -								more and more important in future versions of RDMBS. In this section
    -								of the manual, we will learn how jOOQ handles stored procedures in
    -								code generation. Especially before
    -								<reference id="UDT" title="UDT and ARRAY support"/> was
    -								introduced to major RDBMS, these procedures tend to have dozens of
    -								parameters, with IN, OUT, IN OUT parameters mixed in all variations.
    -								JDBC only knows very basic, low-level support for those constructs.
    -								jOOQ heavily facilitates the use of stored procedures and functions
    -								via its source code generation. Essentially, it comes down to this:
    -							</p>
    -
    -							<h3>"Standalone" stored procedures and functions</h3>
    -							<p>Let's say you have these stored procedures and functions in your Oracle database </p>
    -</html><sql>-- Check whether there is an author in T_AUTHOR by that name
    -CREATE OR REPLACE FUNCTION f_author_exists (author_name VARCHAR2) RETURN NUMBER;
    -
    --- Check whether there is an author in T_AUTHOR by that name
    -CREATE OR REPLACE PROCEDURE p_author_exists (author_name VARCHAR2, result OUT NUMBER);
    -
    --- Check whether there is an author in T_AUTHOR by that name and get his ID
    -CREATE OR REPLACE PROCEDURE p_author_exists_2 (author_name VARCHAR2, result OUT NUMBER, id OUT NUMBER);</sql><html>
    -
    -							<p>jOOQ will essentially generate two artefacts for every procedure/function: </p>
    -							<ul>
    -								<li>A class holding a formal Java representation of the procedure/function</li>
    -    							<li>Some convenience methods to facilitate calling that procedure/function </li>
    -							</ul>
    -							<p>Let's see what these things look like, in Java. The classes (simplified for the example): </p>
    -
    -</html><java>// The function has a generic type parameter &lt;T&gt; bound to its return value
    -public class FAuthorExists extends org.jooq.impl.AbstractRoutine&lt;BigDecimal&gt; {
    -
    -    // Much like Tables, functions have static parameter definitions
    -    public static final Parameter&lt;String&gt; AUTHOR_NAME = // [...]
    -
    -    // And much like TableRecords, they have setters for their parameters
    -    public void setAuthorName(String value) { // [...]
    -    public void setAuthorName(Field&lt;String&gt; value) { // [...]
    -}
    -
    -public class PAuthorExists extends org.jooq.impl.AbstractRoutine&lt;java.lang.Void&gt; {
    -
    -    // In procedures, IN, OUT, IN OUT parameters are all represented
    -    // as static parameter definitions as well
    -    public static final Parameter&lt;String&gt; AUTHOR_NAME = // [...]
    -    public static final Parameter&lt;BigDecimal&gt; RESULT = // [...]
    -
    -    // IN and IN OUT parameters have generated setters
    -    public void setAuthorName(String value) { // [...]
    -
    -    // OUT and IN OUT parameters have generated getters
    -    public BigDecimal getResult() { // [...]
    -}
    -
    -public class PAuthorExists_2 extends org.jooq.impl.AbstractRoutine&lt;java.lang.Void&gt; {
    -    public static final Parameter&lt;String&gt; AUTHOR_NAME = // [...]
    -    public static final Parameter&lt;BigDecimal&gt; RESULT = // [...]
    -    public static final Parameter&lt;BigDecimal&gt; ID = // [...]
    -
    -    // the setters...
    -    public void setAuthorName(String value) { // [...]
    -
    -    // the getters...
    -    public BigDecimal getResult() { // [...]
    -    public BigDecimal getId() { // [...]
    -}</java><html>
    -
    -							<p>An example invocation of such a stored procedure might look like this: </p>
    -
    -</html><java>PAuthorExists p = new PAuthorExists();
    -p.setAuthorName("Paulo");
    -p.execute(configuration);
    -assertEquals(BigDecimal.ONE, p.getResult());</java><html>
    -
    -							<p>
    -								The above configuration is a
    -								<reference id="Factory" title="Factory"/>,
    -								holding a reference to a JDBC connection, as discussed in a previous section.
    -
    -								If you use the generated convenience methods, however, things are much simpler, still:
    -							</p>
    -</html><java>// Every schema has a single Routines class with convenience methods
    -public final class Routines {
    -
    -    // Convenience method to directly call the stored function
    -    public static BigDecimal fAuthorExists(Configuration configuration, String authorName) { // [...]
    -
    -    // Convenience methods to transform the stored function into a
    -    // Field&lt;BigDecimal&gt;, such that it can be used in SQL
    -    public static Field&lt;BigDecimal&gt; fAuthorExists(Field&lt;String&gt; authorName) { // [...]
    -    public static Field&lt;BigDecimal&gt; fAuthorExists(String authorName) { // [...]
    -
    -    // Procedures with 0 OUT parameters create void methods
    -    // Procedures with 1 OUT parameter create methods as such:
    -    public static BigDecimal pAuthorExists(Configuration configuration, String authorName) { // [...]
    -
    -    // Procedures with more than 1 OUT parameter return the procedure
    -    // object (see above example)
    -    public static PAuthorExists_2 pAuthorExists_2(Configuration configuration, String authorName) { // [...]
    -}</java><html>
    -
    -							<p>An sample invocation, equivalent to the previous example:</p>
    -</html><java>assertEquals(BigDecimal.ONE, Procedures.pAuthorExists(configuration, "Paulo"));</java><html>
    -
    -
    -							<h3>jOOQ's understanding of procedures vs functions</h3>
    -							<p>
    -								jOOQ does not formally distinguish procedures from functions.
    -								jOOQ only knows about routines, which can have return values
    -								and/or OUT parameters. This is the best option to handle the
    -								variety of stored procedure / function support across the
    -								various supported RDBMS. For more details, read on about this
    -								topic, here:
    -							</p>
    -							<p>
    -								<a href="http://blog.jooq.org/2011/10/17/what-are-procedures-and-functions-after-all/" title="Blog post about the difference between procedures and functions in various RDBMS">blog.jooq.org/2011/10/17/what-are-procedures-and-functions-after-all/</a>
    -							</p>
    -
    -							<h3>Packages in Oracle</h3>
    -							<p>
    -								Oracle uses the concept of a PACKAGE to group several
    -								procedures/functions into a sort of namespace. The
    -								<a href="http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt"
    -									title="SQL 92 standard">SQL standard</a>
    -								talks about "modules", to represent this concept, even if this is
    -								rarely implemented. This is reflected in jOOQ by the use of Java
    -								sub-packages in the source code generation destination package. Every
    -								Oracle package will be reflected by
    -							</p>
    -							<ul>
    -								<li>A Java package holding classes for formal Java representations of
    -									the procedure/function in that package
    -								</li>
    -								<li>A Java class holding convenience methods to facilitate calling
    -									those procedures/functions
    -								</li>
    -							</ul>
    -							<p>
    -								Apart from this, the generated source code looks exactly like the
    -								one for
    -								standalone procedures/functions.
    -							</p>
    -
    -							<h3>Member functions and procedures in Oracle</h3>
    -							<p>
    -								Oracle UDT's can have object-oriented structures including member functions
    -								and procedures. With Oracle, you can do things like this:
    -							</p>
    -</html><sql>CREATE OR REPLACE TYPE u_author_type AS OBJECT (
    -  id NUMBER(7),
    -  first_name VARCHAR2(50),
    -  last_name VARCHAR2(50),
    -
    -  MEMBER PROCEDURE LOAD,
    -  MEMBER FUNCTION count_books RETURN NUMBER
    -)
    -
    --- The type body is omitted for the example
    -</sql><html>
    -
    -							<p>
    -								These member functions and procedures can simply be mapped to Java
    -								methods:
    -							</p>
    -
    -</html><java>
    -// Create an empty, attached UDT record from the Factory
    -UAuthorType author = create.newRecord(U_AUTHOR_TYPE);
    -
    -// Set the author ID and load the record using the LOAD procedure
    -author.setId(1);
    -author.load();
    -
    -// The record is now updated with the LOAD implementation's content
    -assertNotNull(author.getFirstName());
    -assertNotNull(author.getLastName());</java><html>
    -
    -							<p>For more details about UDT's see the Manual's section on
    -							<reference id="UDT" title="User Defined Types"/></p>
    -
    -						</html></content>
    -					</section>
    -
    -
    -					<section id="UDT">
    -						<title>UDT's including ARRAY and ENUM types</title>
    -						<content><html>
    -							<h3>Increased RDBMS support for UDT's</h3>
    -							<p>
    -								In recent years, most RDBMS have started to implement some support for
    -								advanced data types. This support has not been adopted very well by
    -								database users in the Java world, for several reasons:
    -							</p>
    -							<ul>
    -								<li>They are usually orthogonal to relational concepts. It is not easy
    -									to modify a UDT once it is referenced by a table column.</li>
    -								<li>There is little standard support of accessing them from JDBC (and
    -									probably other database connectivity standards). </li>
    -							</ul>
    -							<p>
    -								On the other hand, especially with stored procedures, these data types
    -								are likely to become more and more useful in the future. If you have a
    -								look at Postgres' capabilities of dealing with advanced data types
    -								(<a href="http://www.postgresql.org/docs/9.0/interactive/datatype-enum.html">ENUMs</a>,
    -								<a href="http://www.postgresql.org/docs/9.0/interactive/arrays.html">ARRAYs</a>,
    -								<a href="http://www.postgresql.org/docs/9.0/interactive/rowtypes.html">UDT's</a>),
    -								 this becomes more and more obvious.
    -							</p>
    -							<p>It is a central strategy for jOOQ, to standardise access to these
    -								kinds of types (as well as to
    -								<reference id="PROCEDURE" title="stored procedures"/>, of course) across all
    -								RDBMS, where these types are supported. </p>
    -
    -							<h3>UDT types</h3>
    -							<p>User Defined Types (UDT) are helpful in major RDMBS with lots
    -							of proprietary functionality. The biggest player is clearly Oracle.
    -							Currently, jOOQ provides UDT support for only two databases: </p>
    -							<ul>
    -								<li>Oracle</li>
    -								<li>Postgres</li>
    -							</ul>
    -							<p>Apart from that, </p>
    -							<ul>
    -								<li>
    -									DB2 UDT's are not supported as they are very tough to
    -									serialise/deserialise. We don't think that this is a big enough
    -									requirement to put more effort in those, right now (see also the
    -									developers' discussion on
    -									<reference ticket="164" />)
    -								</li>
    -							</ul>
    -
    -							<p>In Oracle, you would define UDTs like this: </p>
    -</html><sql>CREATE TYPE u_street_type AS OBJECT (
    -  street VARCHAR2(100),
    -  no VARCHAR2(30)
    -)
    -
    -CREATE TYPE u_address_type AS OBJECT (
    -  street u_street_type,
    -  zip VARCHAR2(50),
    -  city VARCHAR2(50),
    -  country VARCHAR2(50),
    -  since DATE,
    -  code NUMBER(7)
    -)</sql><html>
    -
    -							<p>These types could then be used in tables and/or stored procedures like such: </p>
    -</html><sql>CREATE TABLE t_author (
    -  id NUMBER(7) NOT NULL PRIMARY KEY,
    -  -- [...]
    -  address u_address_type
    -)
    -
    -CREATE OR REPLACE PROCEDURE p_check_address (address IN OUT u_address_type);</sql><html>
    -
    -							<p>
    -								Standard JDBC UDT support encourages JDBC-driver developers to implement
    -								interfaces such as
    -								<reference class="java.sql.SQLData"/>,
    -								<reference class="java.sql.SQLInput"/> and
    -								<reference class="java.sql.SQLOutput"/>.
    -								Those interfaces are non-trivial to implement, or
    -								to hook into. Also access to
    -								<reference class="java.sql.Struct"/>
    -								is not really simple. Due
    -								to the lack of a well-defined JDBC standard, Oracle's JDBC driver
    -								rolls their own proprietary methods of dealing with these types. jOOQ
    -								goes a different way, it hides those facts from you entirely. With
    -								jOOQ, the above UDT's will be generated in simple
    -								<reference class="org.jooq.UDT" title="UDT meta-model classes"/> and
    -								<reference class="org.jooq.UDTRecord" title="UDT record classes"/> as such:
    -							</p>
    -</html><java>// There is an analogy between UDT/Table and UDTRecord/TableRecord...
    -public class UAddressType extends UDTImpl&lt;UAddressTypeRecord&gt; {
    -
    -    // The UDT meta-model singleton instance
    -    public static final UAddressType U_ADDRESS_TYPE = new UAddressType();
    -
    -    // UDT attributes are modeled as static members. Nested UDT's
    -    // behave similarly
    -    public static final UDTField&lt;UAddressTypeRecord, UStreetTypeRecord&gt; STREET = // [...]
    -    public static final UDTField&lt;UAddressTypeRecord, String&gt; ZIP =               // [...]
    -    public static final UDTField&lt;UAddressTypeRecord, String&gt; CITY =              // [...]
    -    public static final UDTField&lt;UAddressTypeRecord, String&gt; COUNTRY =           // [...]
    -    public static final UDTField&lt;UAddressTypeRecord, Date&gt; SINCE =               // [...]
    -    public static final UDTField&lt;UAddressTypeRecord, Integer&gt; CODE =             // [...]
    -}</java><html>
    -
    -							<p>Now, when you interact with entities or procedures that hold UDT's, that's very simple as well. Here is an example: </p>
    -</html><java>// Fetch any author from the T_AUTHOR table
    -TAuthorRecord author = create.selectFrom(T_AUTHOR).fetchAny();
    -
    -// Print out the author's address's house number
    -System.out.println(author.getAddress().getStreet().getNo());</java><html>
    -
    -							<p>A similar thing can be achieved when interacting with the example stored procedure: </p>
    -</html><java>// Create a new UDTRecord of type U_ADDRESS_TYPE
    -UAddressTypeRecord address = new UAddressTypeRecord();
    -address.setCountry("Switzerland");
    -
    -// Call the stored procedure with IN OUT parameter of type U_ADDRESS_TYPE
    -address = Procedures.pCheckAddress(connection, address);</java><html>
    -
    -
    -							<h3>ARRAY types</h3>
    -							<p>
    -								The notion of ARRAY types in RDBMS is not standardised at all. Very
    -								modern databases (especially the Java-based ones) have implemented
    -								ARRAY types exactly as what they are. "ARRAYs of something". In other
    -								words, an ARRAY OF VARCHAR would be something very similar to Java's
    -								notion of String[]. An ARRAY OF ARRAY OF VARCHAR would then be a
    -								String[][] in Java. Some RDMBS, however, enforce stronger typing and
    -								need the explicit creation of types for every ARRAY as well. These are
    -								example String[] ARRAY types in various SQL dialects supported by jOOQ
    -								1.5.4:
    -							</p>
    -							<ul>
    -								<li>Oracle: VARRAY OF VARCHAR2. A strongly typed object encapsulating an ARRAY of a given type. See the <a href="http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/collection_definition.htm">documentation.</a></li>
    -								<li>Postgres: text[]. Any data type can be turned into an array by suffixing it with []. See the <a href="http://www.postgresql.org/docs/9.0/interactive/arrays.html">documentation</a></li>
    -								<li>HSQLDB: VARCHAR ARRAY. Any data type can be turned into an array by suffixing it with ARRAY. See the <a href="http://hsqldb.org/doc/2.0/guide/sqlgeneral-chapt.html#N1070F">documentation</a></li>
    -								<li>H2: ARRAY. H2 does not know of typed arrays. All ARRAYs are mapped to Object[]. See the <a href="http://www.h2database.com/html/datatypes.html#array_type">documentation</a></li>
    -							</ul>
    -							<p>Soon to be supported: </p>
    -							<ul>
    -								<li>DB2: Knows a similar strongly-typed ARRAY type, like Oracle </li>
    -							</ul>
    -							<p>
    -								From jOOQ's perspective, the ARRAY types fit in just like any other
    -								type wherever the
    -								&lt;T&gt; generic type parameter is existent. It integrates well with tables
    -									and stored procedures.
    -							</p>
    -
    -							<h3>Example: General ARRAY types</h3>
    -							<p>An example usage of ARRAYs is given here for the Postgres dialect </p>
    -
    -</html><sql>CREATE TABLE t_arrays (
    -  id integer not null primary key,
    -  string_array VARCHAR(20)[],
    -  number_array INTEGER[]
    -)
    -
    -CREATE FUNCTION f_arrays(in_array IN text[]) RETURNS text[]</sql><html>
    -
    -							<p>When generating source code from the above entities, these artefacts will be created in Java: </p>
    -</html><java>public class TArrays extends UpdatableTableImpl&lt;TArraysRecord&gt; {
    -
    -    // The generic type parameter &lt;T&gt; is bound to an array of a matching type
    -    public static final TableField&lt;TArraysRecord, String[]&gt; STRING_ARRAY =  // [...]
    -    public static final TableField&lt;TArraysRecord, Integer[]&gt; NUMBER_ARRAY = // [...]
    -}
    -
    -// The convenience class is enhanced with these methods
    -public final class Functions {
    -    public static String[] fArrays(Connection connection, String[] inArray) { // [...]
    -    public static Field&lt;String[]&gt; fArrays(String[] inArray) {                                     // [...]
    -    public static Field&lt;String[]&gt; fArrays(Field&lt;String[]&gt; inArray) {                              // [...]
    -}</java><html>
    -
    -							<h3>Example: Oracle VARRAY types</h3>
    -							<p>In Oracle, a VARRAY type is something slightly different than in
    -								other RDMBS. It is a type that encapsules the actual ARRAY and creates
    -								a new type from it. While all text[] types are equal and thus
    -								compatible in Postgres, this does not apply for all VARRAY OF VARCHAR2
    -								types. Hence, it is important to provide access to VARRAY types and
    -								generated objects from those types as well. The example above would
    -								read like this in Oracle: </p>
    -
    -</html><sql>CREATE TYPE u_string_array AS VARRAY(4) OF VARCHAR2(20)
    -CREATE TYPE u_number_array AS VARRAY(4) OF NUMBER(7)
    -
    -CREATE TABLE t_arrays (
    -  id NUMBER(7) not null primary key,
    -  string_array u_string_array,
    -  number_array u_number_array
    -)
    -
    -CREATE OR REPLACE FUNCTION f_arrays (in_array u_string_array)
    -RETURN u_string_array</sql><html>
    -
    -							<p>Note that it becomes clear immediately, that a mapping from
    -								U_STRING_ARRAY to String[] is obvious. But a mapping from String[] to
    -								U_STRING_ARRAY is not. These are the generated
    -								<reference class="org.jooq.ArrayRecord" /> and other
    -								artefacts in Oracle: </p>
    -
    -</html><java>public class UStringArrayRecord extends ArrayRecordImpl&lt;String&gt; {  // [...]
    -public class UNumberArrayRecord extends ArrayRecordImpl&lt;Integer&gt; { // [...]
    -
    -public class TArrays extends UpdatableTableImpl&lt;TArraysRecord&gt; {
    -    public static final TableField&lt;TArraysRecord, UStringArrayRecord&gt; STRING_ARRAY = // [...]
    -    public static final TableField&lt;TArraysRecord, UNumberArrayRecord&gt; NUMBER_ARRAY = // [...]
    -}
    -
    -public final class Functions {
    -    public static UStringArrayRecord fArrays3(Connection connection, UStringArrayRecord inArray) { // [...]
    -    public static Field&lt;UStringArrayRecord&gt; fArrays3(UStringArrayRecord inArray) {                 // [...]
    -    public static Field&lt;UStringArrayRecord&gt; fArrays3(Field&lt;UStringArrayRecord&gt; inArray) {          // [...]
    -}</java><html>
    -
    -
    -							<h3>ENUM types</h3>
    -							<p>True ENUM types are a rare species in the RDBMS world. Currently,
    -								MySQL and Postgres are the only RDMBS supported by jOOQ, that provide
    -								ENUM types. </p>
    -
    -							<ul>
    -								<li>In MySQL, an ENUM type is declared directly upon a column. It cannot be reused as a type. See the <a href="http://dev.mysql.com/doc/refman/5.5/en/enum.html">documentation.</a> </li>
    -								<li>In Postgres, the ENUM type is declared independently and can be reused among tables, functions, etc. See the <a href="http://www.postgresql.org/docs/9.0/interactive/datatype-enum.html">documentation.</a> </li>
    -								<li>Other RDMBS know about "ENUM constraints", such as the Oracle CHECK constraint. These are not true ENUMS, however. jOOQ refrains from using their information for source code generation </li>
    -							</ul>
    -
    -							<p>Some examples: </p>
    -</html><sql>-- An example enum type
    -CREATE TYPE u_book_status AS ENUM ('SOLD OUT', 'ON STOCK', 'ORDERED')
    -
    --- An example useage of that enum type
    -CREATE TABLE t_book (
    -  id INTEGER NOT NULL PRIMARY KEY,
    -
    -  -- [...]
    -  status u_book_status
    -)</sql><html>
    -
    -							<p>The above Postgres ENUM type will be generated as </p>
    -</html><java>public enum UBookStatus implements EnumType {
    -    ORDERED("ORDERED"),
    -    ON_STOCK("ON STOCK"),
    -    SOLD_OUT("SOLD OUT");
    -
    -    // [...]
    -}</java><html>
    -							<p>Intuitively, the generated classes for the T_BOOK table in Postgres would look like this: </p>
    -</html><sql>// The meta-model class
    -public class TBook extends UpdatableTableImpl&lt;TBookRecord&gt; {
    -
    -    // The TableField STATUS binds &lt;T&gt; to UBookStatus
    -    public static final TableField&lt;TBookRecord, UBookStatus&gt; STATUS = // [...]
    -
    -    // [...]
    -}
    -
    -// The record class
    -public class TBookRecord extends UpdatableRecordImpl&lt;TBookRecord&gt; {
    -
    -    // Corresponding to the Table meta-model, also setters and getters
    -    // deal with the generated UBookStatus
    -    public void setStatus(UBookStatus value) { // [...]
    -    public UBookStatus getStatus() {           // [...]
    -}</sql><html>
    -
    -							<p>Note that jOOQ allows you to simulate ENUM types where this makes
    -								sense in your data model. See the section on
    -								<reference id="MasterData" title="master data"/> for more
    -								details. </p>
    -						</html></content>
    -					</section>
    -
    -
    -					<section id="SEQUENCE">
    -						<title>Sequences and Serials</title>
    -						<content><html>
    -							<h3>Sequences as a source for identity values</h3>
    -							<p> Sequences implement the
    -							<reference class="org.jooq.Sequence"/> interface, providing essentially this functionality:</p>
    -
    -</html><java>// Get a field for the CURRVAL sequence property
    -Field&lt;T&gt; currval();
    -
    -// Get a field for the NEXTVAL sequence property
    -Field&lt;T&gt; nextval();</java><html>
    -							<p>So if you have a sequence like this in Oracle: </p>
    -							</html><sql>CREATE SEQUENCE s_author_id</sql><html>
    -							<p>This is what jOOQ will generate: </p>
    -</html><java>public final class Sequences {
    -
    -    // A static sequence instance
    -    public static final Sequence&lt;BigInteger&gt; S_AUTHOR_ID = // [...]
    -}</java><html>
    -
    -							<p>Which you can use in a select statement as such: </p>
    -</html><java>Field&lt;BigInteger&gt; s = Sequences.S_AUTHOR_ID.nextval();
    -BigInteger nextID   = create.select(s).fetchOne(s);</java><html>
    -
    -							<p>Or directly fetch currval() and nextval() from the sequence using the Factory: </p>
    -</html><java>BigInteger currval = create.currval(Sequences.S_AUTHOR_ID);
    -BigInteger nextval = create.nextval(Sequences.S_AUTHOR_ID);</java></content>
    -					</section>
    -				</sections>
    -			</section>
    -
    -
    -
    -
    -			<section id="DSL">
    -				<title>DSL or fluent API. Where SQL meets Java</title>
    -				<content><html>
    -					<h3>Overview</h3>
    -					<p>jOOQ ships with its own DSL (or
    -						<a href="http://en.wikipedia.org/wiki/Domain-specific_language" title="Domain Specific Language">Domain Specific Language</a>) that
    -						simulates SQL as good as possible in Java. This means, that you can
    -						write SQL statements almost as if Java natively supported that syntax
    -						just like .NET's C# does with <a href="http://msdn.microsoft.com/en-us/library/bb425822.aspx">LINQ to SQL.</a></p>
    -
    -					<p>Here is an example to show you what that means. When you want to write a query like this in SQL: </p>
    -					</html><code-pair>
    -<sql>-- Select all books by authors born after 1920,
    --- named "Paulo" from a catalogue:
    -SELECT *
    -  FROM t_author a
    -  JOIN t_book b ON a.id = b.author_id
    - WHERE a.year_of_birth &gt; 1920
    -   AND a.first_name = 'Paulo'
    - ORDER BY b.title</sql><java>Result&lt;Record&gt; result =
    -create.select()
    -      .from(T_AUTHOR.as("a"))
    -      .join(T_BOOK.as("b")).on(a.ID.equal(b.AUTHOR_ID))
    -      .where(a.YEAR_OF_BIRTH.greaterThan(1920)
    -      .and(a.FIRST_NAME.equal("Paulo")))
    -      .orderBy(b.TITLE)
    -      .fetch();</java></code-pair><html>
    -
    -					<p>
    -						You couldn't come much closer to SQL itself in Java, without re-writing the compiler.
    -						We'll see how the aliasing works later in the section about
    -						<reference id="ALIAS" title="aliasing"/>
    -					</p>
    -				</html></content>
    -
    -
    -				<sections>
    -					<section id="SELECT">
    -						<title>Complete SELECT syntax</title>
    -						<content><html>
    -							<h3>SELECT from anonymous or ad-hoc types</h3>
    -							<p>When you don't just perform CRUD (i.e. SELECT * FROM your_table WHERE ID = ?),
    -							you're usually generating new types using custom projections. With jOOQ, this is
    -							as intuitive, as if using SQL directly. A more or less complete example of the "standard" SQL syntax, plus
    -							some extensions, is provided by a query like this:
    -							</p>
    -
    -</html><sql>-- get all authors' first and last names, and the number
    --- of books they've written in German, if they have written
    --- more than five books in German in the last three years
    --- (from 2011), and sort those authors by last names
    --- limiting results to the second and third row, locking
    --- the rows for a subsequent update... whew!
    -
    -  SELECT T_AUTHOR.FIRST_NAME, T_AUTHOR.LAST_NAME, COUNT(*)
    -    FROM T_AUTHOR
    -    JOIN T_BOOK ON T_AUTHOR.ID = T_BOOK.AUTHOR_ID
    -   WHERE T_BOOK.LANGUAGE = 'DE'
    -     AND T_BOOK.PUBLISHED > '2008-01-01'
    -GROUP BY T_AUTHOR.FIRST_NAME, T_AUTHOR.LAST_NAME
    -  HAVING COUNT(*) > 5
    -ORDER BY T_AUTHOR.LAST_NAME ASC NULLS FIRST
    -   LIMIT 2
    -  OFFSET 1
    -     FOR UPDATE</sql><html>
    -
    -     						<p>So that's daily business. How to do it with jOOQ: When you first create a SELECT statement using the Factory's select() methods </p>
    -</html><java>SelectFromStep select(Field&lt;?&gt;... fields);
    -
    -// Example:
    -create.select(T_AUTHOR.FIRST_NAME, T_AUTHOR.LAST_NAME, count());</java><html>
    -
    -							<p>
    -								jOOQ will return an "intermediary" type to you, representing the
    -								SELECT statement about to be created (by the way, check out the
    -								section on <reference id="FUNCTIONS" title="aggregate operators"/>
    -								 to learn more about the COUNT(*)
    -								function). This type is the
    -								<reference class="org.jooq.SelectFromStep"/>.
    -								When you have a reference
    -								to this type, you may add a FROM clause, although that clause is
    -								optional. This is reflected by the fact, that the SelectFromStep type
    -								extends
    -								<reference class="org.jooq.SelectJoinStep"/>,
    -								which allows for adding the subsequent
    -								clauses. Let's say you do decide to add a FROM clause, then you can
    -								use this method for instance:
    -							</p>
    -</html><java>SelectJoinStep from(TableLike&lt;?&gt;... table);
    -
    -// The example, continued:
    -create.select(T_AUTHOR.FIRST_NAME, T_AUTHOR.LAST_NAME, count())
    -      .from(T_AUTHOR);</java><html>
    -
    -							<p>After adding the table-like structures (mostly just Tables) to
    -								select from, you may optionally choose to add a JOIN clause, as the
    -								type returned by jOOQ is the step where you can add JOINs. Again,
    -								adding these clauses is optional, as the
    -								<reference class="org.jooq.SelectJoinStep"/> extends
    -								<reference class="org.jooq.SelectWhereStep"/>.
    -								But let's say we add a JOIN: </p>
    -</html><java>// These join types are supported
    -SelectOnStep                    join(Table&lt;?&gt; table);
    -SelectOnStep           leftOuterJoin(Table&lt;?&gt; table);
    -SelectOnStep          rightOuterJoin(Table&lt;?&gt; table);
    -SelectOnStep           fullOuterJoin(Table&lt;?&gt; table);
    -SelectJoinStep             crossJoin(Table&lt;?&gt; table);
    -SelectJoinStep           naturalJoin(Table&lt;?&gt; table);
    -SelectJoinStep  naturalLeftOuterJoin(Table&lt;?&gt; table);
    -SelectJoinStep naturalRightOuterJoin(Table&lt;?&gt; table);
    -
    -// The example, continued:
    -create.select(T_AUTHOR.FIRST_NAME, T_AUTHOR.LAST_NAME, count())
    -      .from(T_AUTHOR)
    -      .join(T_BOOK);</java><html>
    -
    -							<p>Now, if you do add a JOIN clause, you have to specify the JOIN .. ON
    -								condition before you can add more clauses. That's not an optional step
    -								for some JOIN types. This is reflected by the fact that
    -								<reference class="org.jooq.SelectOnStep"/>
    -								is a top-level interface. </p>
    -
    -</html><java><![CDATA[// These join conditions are supported
    -SelectJoinStep    on(Condition... conditions);
    -SelectJoinStep onKey();
    -SelectJoinStep onKey(TableField<?, ?>... keyFields);
    -SelectJoinStep onKey(ForeignKey<?, ?> key);
    -SelectJoinStep using(Field<?>... fields);
    -
    -// The example, continued:
    -create.select(T_AUTHOR.FIRST_NAME, T_AUTHOR.LAST_NAME, count())
    -      .from(T_AUTHOR)
    -      .join(T_BOOK).on(T_BOOK.AUTHOR_ID.equal(T_AUTHOR.ID));]]></java><html>
    -
    -							<p>
    -								See the section about
    -								<reference id="CONDITION" title="conditions"/>
    -								to learn more about the many ways
    -								to create Conditions in jOOQ.
    -								See also the section about
    -								<reference id="TABLESOURCE" title="table sources"/>
    -								to learn more about the various ways of creating JOIN
    -								expressions
    -							</p>
    -							<p>
    -								Now we're half way through. As you can
    -								see above, we're back to the SelectJoinStep. This means, we can
    -								re-iterate and add another JOIN clause, just like in SQL. Or we go on
    -								to the next step, adding conditions in the
    -								<reference class="org.jooq.SelectWhereStep"/>: </p>
    -</html><java>SelectConditionStep where(Condition... conditions);
    -
    -// The example, continued:
    -create.select(TAuthor.FIRST_NAME, TAuthor.LAST_NAME, count())
    -      .from(T_AUTHOR)
    -      .join(T_BOOK).on(T_BOOK.AUTHOR_ID.equal(T_AUTHOR.ID))
    -      .where(T_BOOK.LANGUAGE.equal("DE"));</java><html>
    -
    -							<p>Now the returned type
    -								<reference class="org.jooq.SelectConditionStep"/> is a special one, where
    -								you can add more conditions to the already existing WHERE clause.
    -								Every time you add a condition, you will return to that
    -								SelectConditionStep, as the number of additional conditions is
    -								unlimited. Note that of course you can also just add a single combined
    -								condition, if that is more readable or suitable for your use-case.
    -								Here's how we add another condition: </p>
    -</html><java>SelectConditionStep and(Condition condition);
    -
    -// The example, continued:
    -create.select(T_AUTHOR.FIRST_NAME, T_AUTHOR.LAST_NAME, count())
    -      .from(T_AUTHOR)
    -      .join(T_BOOK).on(T_BOOK.AUTHOR_ID.equal(T_AUTHOR.ID))
    -      .where(T_BOOK.LANGUAGE.equal("DE"))
    -      .and(T_BOOK.PUBLISHED.greaterThan(parseDate('2008-01-01')));</java><html>
    -
    -							<p>Let's assume we have that method parseDate() creating a
    -								<reference class="java.sql.Date"/> for us.
    -								Then we'll continue adding the GROUP BY clause
    -							</p>
    -</html><java>SelectHavingStep groupBy(Field&lt;?&gt;... fields);
    -
    -// The example, continued:
    -create.select(T_AUTHOR.FIRST_NAME, T_AUTHOR.LAST_NAME, count())
    -      .from(T_AUTHOR)
    -      .join(T_BOOK).on(T_BOOK.AUTHOR_ID.equal(T_AUTHOR.ID))
    -      .where(T_BOOK.LANGUAGE.equal("DE"))
    -      .and(T_BOOK.PUBLISHED.greaterThan(parseDate('2008-01-01')))
    -      .groupBy(T_AUTHOR.FIRST_NAME, T_AUTHOR.LAST_NAME);</java><html>
    -
    -      						<p>and the HAVING clause: </p>
    -</html><java>SelectOrderByStep having(Condition... conditions);
    -
    -// The example, continued:
    -create.select(T_AUTHOR.FIRST_NAME, T_AUTHOR.LAST_NAME, count())
    -      .from(T_AUTHOR)
    -      .join(T_BOOK).on(T_BOOK.AUTHOR_ID.equal(T_AUTHOR.ID))
    -      .where(T_BOOK.LANGUAGE.equal("DE"))
    -      .and(T_BOOK.PUBLISHED.greaterThan(parseDate('2008-01-01')))
    -      .groupBy(T_AUTHOR.FIRST_NAME, T_AUTHOR.LAST_NAME)
    -      .having(count().greaterThan(5));</java><html>
    -
    -							<p>and the ORDER BY clause. Some RDBMS support NULLS FIRST and NULLS
    -								LAST extensions to the ORDER BY clause. If this is not supported by
    -								the RDBMS, then the behaviour is simulated with an additional CASE
    -								WHEN ... IS NULL THEN 1 ELSE 0 END clause. </p>
    -</html><java>SelectLimitStep orderBy(Field&lt;?&gt;... fields);
    -
    -// The example, continued:
    -create.select(T_AUTHOR.FIRST_NAME, T_AUTHOR.LAST_NAME, count())
    -      .from(T_AUTHOR)
    -      .join(T_BOOK).on(T_BOOK.AUTHOR_ID.equal(T_AUTHOR.ID))
    -      .where(T_BOOK.LANGUAGE.equal("DE"))
    -      .and(T_BOOK.PUBLISHED.greaterThan(parseDate('2008-01-01')))
    -      .groupBy(T_AUTHOR.FIRST_NAME, T_AUTHOR.LAST_NAME)
    -      .having(count().greaterThan(5))
    -      .orderBy(T_AUTHOR.LAST_NAME.asc().nullsFirst());</java><html>
    -
    -							<p>and finally the LIMIT clause. Most dialects have a means of limiting
    -								the number of result records (except Oracle). Some even support having
    -								an OFFSET to the LIMIT clause. Even if your RDBMS does not support the
    -								full LIMIT ... OFFSET ... (or TOP ... START AT ..., or FETCH FIRST ... ROWS ONLY, etc)
    -								clause, jOOQ will simulate the LIMIT clause using nested selects and filtering on
    -								ROWNUM (for Oracle), or on ROW_NUMBER() (for DB2 and SQL
    -								Server): </p>
    -</html><java>SelectFinalStep limit(int offset, int numberOfRows);
    -
    -// The example, continued:
    -create.select(T_AUTHOR.FIRST_NAME, T_AUTHOR.LAST_NAME, count())
    -      .from(T_AUTHOR)
    -      .join(T_BOOK).on(T_BOOK.AUTHOR_ID.equal(T_AUTHOR.ID))
    -      .where(T_BOOK.LANGUAGE.equal("DE"))
    -      .and(T_BOOK.PUBLISHED.greaterThan(parseDate('2008-01-01')))
    -      .groupBy(T_AUTHOR.FIRST_NAME, T_AUTHOR.LAST_NAME)
    -      .having(count().greaterThan(5))
    -      .orderBy(T_AUTHOR.LAST_NAME.asc().nullsFirst())
    -      .limit(1, 2);</java><html>
    -
    -							<p>In the final step, there are some proprietary extensions available
    -								only in some RDBMS. One of those extensions are the FOR UPDATE
    -								(supported in most RDBMS) and FOR SHARE clauses (supported only in
    -								MySQL and Postgres): </p>
    -</html><java>SelectFinalStep forUpdate();
    -
    -// The example, continued:
    -create.select(T_AUTHOR.FIRST_NAME, T_AUTHOR.LAST_NAME, count())
    -      .from(T_AUTHOR)
    -      .join(T_BOOK).on(T_BOOK.AUTHOR_ID.equal(T_AUTHOR.ID))
    -      .where(T_BOOK.LANGUAGE.equal("DE"))
    -      .and(T_BOOK.PUBLISHED.greaterThan(parseDate('2008-01-01')))
    -      .groupBy(T_AUTHOR.FIRST_NAME, T_AUTHOR.LAST_NAME)
    -      .having(count().greaterThan(5))
    -      .orderBy(T_AUTHOR.LAST_NAME.asc().nullsFirst())
    -      .limit(1, 2)
    -      .forUpdate();</java><html>
    -
    -							<p>
    -								Now the most relevant super-type of the object we have just created is
    -								<reference class="org.jooq.Select"/>.
    -								This type can be reused in various expressions such as in the
    -								<reference id="UNION" title="UNION and other set operations"/>,
    -								<reference id="EXISTS" title="Nested select statements using the EXISTS operator"/>,
    -								etc. If you just want to execute this select
    -								statement, you can choose any of these methods as discussed in the
    -								section about the <reference id="ResultQuery" title="ResultQuery"/>:
    -							</p>
    -
    -</html><java>// Just execute the query.
    -int execute();
    -
    -// Execute the query and retrieve the results
    -Result&lt;Record&gt; fetch();
    -
    -// Execute the query and retrieve the first Record
    -Record fetchAny();
    -
    -// Execute the query and retrieve the single Record
    -// An Exception is thrown if more records were available
    -Record fetchOne();
    -
    -// [...]</java><html>
    -
    -
    -							<h3>SELECT from single physical tables</h3>
    -							<p>A very similar, but limited API is available, if you want to select from single
    -								physical tables in order to retrieve TableRecords or even
    -								UpdatableRecords (see also the manual's section on
    -								<reference id="Query" title="SelectQuery vs SimpleSelectQuery"/>).
    -								The decision, which type of select to create is
    -								already made at the very first step, when you create the SELECT
    -								statement with the Factory: </p>
    -
    -							</html><java>public &lt;R extends Record&gt; SimpleSelectWhereStep&lt;R&gt; selectFrom(Table&lt;R&gt; table);</java><html>
    -							<p>As you can see, there is no way to further restrict/project the selected
    -								fields. This just selects all known TableFields in the supplied Table,
    -								and it also binds &lt;R extends Record&gt; to your Table's associated
    -								Record. An example of such a Query would then be: </p>
    -</html><java>TBook book = create.selectFrom(T_BOOK)
    -                   .where(TBook.LANGUAGE.equal("DE"))
    -                   .orderBy(TBook.TITLE)
    -                   .fetchAny();</java></content>
    -					</section>
    -
    -
    -					<section id="TABLESOURCE">
    -						<title>Table sources</title>
    -						<content><html>
    -							<h3>Create complex and nested table sources</h3>
    -							<p>
    -								In the <a href="http://en.wikipedia.org/wiki/Relational_model" title="The Relational Data Model">relational data model</a>,
    -								there are many operations performed on entities, i.e. tables in order to join them together
    -								before applying predicates, renaming operations and projections. Apart from the convenience
    -								methods for joining table sources in the
    -								<reference id="SELECT" title="manual's section about the full SELECT syntax"/>,
    -								the <reference class="org.jooq.Table" title="Table"/> type itself provides a
    -								rich API for creating joined table sources. See an extract of the Table API:
    -							</p>
    -</html><java><![CDATA[// These are the various supported JOIN clauses. These JOIN types
    -// are followed by an additional ON / ON KEY / USING clause
    -TableOnStep join(TableLike<?> table);
    -TableOnStep join(String sql);
    -TableOnStep join(String sql, Object... bindings);
    -
    -// All other JOIN types are equally overloaded with "String sql" convenience methods...
    -TableOnStep  leftOuterJoin(TableLike<?> table);
    -TableOnStep rightOuterJoin(TableLike<?> table);
    -TableOnStep  fullOuterJoin(TableLike<?> table);
    -
    -// These JOIN types don't take any additional clause
    -Table<Record>             crossJoin(TableLike<?> table);
    -Table<Record>           naturalJoin(TableLike<?> table);
    -Table<Record>  naturalLeftOuterJoin(TableLike<?> table);
    -Table<Record> naturalRightOuterJoin(TableLike<?> table);
    -
    -// Oracle and SQL Server also know PIVOT / UNPIVOT clauses for transforming a
    -// table into another one using a list of PIVOT values
    -PivotForStep pivot(Field<?>... aggregateFunctions);
    -PivotForStep pivot(Collection<? extends Field<?>> aggregateFunctions);
    -
    -// Relational division can be applied to a table, transforming it into a
    -// "quotient" using an intuitive syntax
    -DivideByOnStep divideBy(Table<?> divisor);]]></java><html>
    -
    -							<p>
    -								The <reference class="org.jooq.TableOnStep" title="TableOnStep"/> type
    -								contains methods for constructing the ON / ON KEY / USING clauses
    -							</p>
    -
    -</html><java><![CDATA[// The ON clause is the most widely used JOIN condition. Provide arbitrary conditions as arguments
    -TableOnConditionStep on(Condition... conditions);
    -TableOnConditionStep on(String sql);
    -TableOnConditionStep on(String sql, Object... bindings);
    -
    -// The USING clause is also part of the SQL standard. Use this if joined tables contain identical field names.
    -// The USING clause is simulated in databases that do not support it.
    -Table<Record> using(Field<?>... fields);
    -Table<Record> using(Collection<? extends Field<?>> fields);
    -
    -// The ON KEY clause is a "synthetic" clause that does not exist in any SQL dialect. jOOQ usually has all
    -// foreign key relationship information to dynamically render "ON [ condition ... ]" clauses
    -TableOnConditionStep onKey() throws DataAccessException;
    -TableOnConditionStep onKey(TableField<?, ?>... keyFields) throws DataAccessException;
    -TableOnConditionStep onKey(ForeignKey<?, ?> key);]]></java><html>
    -
    -							<ul>
    -							<li>
    -								For more details about the PIVOT clause, see the
    -								<reference id="PIVOT" title="manual's section about the Oracle PIVOT syntax"/>
    -							</li>
    -							<li>
    -								For more details about the DIVIDE BY clause, see the
    -								<reference id="DIVISION" title="manual's section about the relational division syntax"/>
    -							</li>
    -							</ul>
    -						</html></content>
    -					</section>
    -
    -
    -					<section id="CONDITION">
    -						<title>Conditions</title>
    -						<content><html>
    -							<h3>Conditions are the SELECT's core business</h3>
    -							<p>In your average application, you will typically have 3-4 SQL queries
    -								that have quite a long list of predicates (and possibly JOINs), such
    -								that you start to lose track over the overall boolean expression that
    -								you're trying to apply.</p>
    -							<p>In jOOQ, most Conditions can be created and combined almost as
    -								easily as in SQL itself. The two main participants for creating
    -								Conditions are the <reference class="org.jooq.Field" title="Field"/>,
    -								which is typically a participant of a
    -								condition, and the <reference class="org.jooq.Condition" title="Condition"/>
    -								itself: </p>
    -</html><java>public interface Condition {
    -    Condition and(Condition other);
    -    Condition and(String sql);
    -    Condition and(String sql, Object... bindings);
    -    Condition andNot(Condition other);
    -    Condition andExists(Select&lt;?&gt; select);
    -    Condition andNotExists(Select&lt;?&gt; select);
    -    Condition or(Condition other);
    -    Condition or(String sql);
    -    Condition or(String sql, Object... bindings);
    -    Condition orNot(Condition other);
    -    Condition orExists(Select&lt;?&gt; select);
    -    Condition orNotExists(Select&lt;?&gt; select);
    -    Condition not();
    -}</java><html>
    -
    -							<p>The above example describes the essence of boolean logic in jOOQ. As
    -								soon as you have a Condition object, you can connect that to other
    -								Conditions, which will then give you a combined condition with exactly
    -								the same properties. There are also convenience methods to create an
    -								EXISTS clause and connect it to an existing condition. In order to
    -								create a new Condition you are going to depart from a Field in most
    -								cases. Here are some important API elements in the Field interface:
    -							</p>
    -
    -</html><java><![CDATA[public interface Field<T> {
    -    Condition isNull();
    -    Condition isNotNull();
    -    Condition like(T value);
    -    Condition likeIgnoreCase(T value);
    -    Condition notLike(T value);
    -    Condition notLikeIgnoreCase(T value);
    -    Condition in(T... values);
    -    Condition in(Select<?> query);
    -    Condition notIn(Collection<T> values);
    -    Condition notIn(T... values);
    -    Condition notIn(Select<?> query);
    -    Condition in(Collection<T> values);
    -    Condition between(T minValue, T maxValue);
    -    Condition contains(T value);
    -    Condition contains(Field<T> value);
    -    Condition equal(T value);
    -    Condition equal(Field<T> field);
    -    Condition equal(Select<?> query);
    -    Condition equalAny(Select<?> query);
    -    Condition equalAny(T... array);
    -    Condition equalAny(Field<T[]> array);
    -    Condition equalAll(Select<?> query);
    -    Condition equalAll(T... array);
    -    Condition equalAll(Field<T[]> array);
    -    Condition equalIgnoreCase(String value);
    -    Condition equalIgnoreCase(Field<String> value);
    -    Condition notEqual(T value);
    -    Condition notEqual(Field<T> field);
    -    Condition notEqual(Select<?> query);
    -    Condition notEqualAny(Select<?> query);
    -    Condition notEqualAny(T... array);
    -    Condition notEqualAny(Field<T[]> array);
    -    Condition notEqualAll(Select<?> query);
    -    Condition notEqualAll(T... array);
    -    Condition notEqualAll(Field<T[]> array);
    -
    -    // Subselects, ANY and ALL quantifiers are also supported for these:
    -    Condition lessThan(T value);
    -    Condition lessOrEqual(T value);
    -    Condition greaterThan(T value);
    -    Condition greaterOrEqual(T value);
    -}]]></java><html>
    -
    -							<p>As you see in the partially displayed API above, you can compare a
    -								Field either with other Fields, with constant values (which is a
    -								shortcut for calling Factory.val(T value)), or with a nested SELECT
    -								statement. See some more
    -								<reference id="NESTED" title="Examples of nested SELECTs"/>. </p>
    -							<p>Combining the API of Field and Condition you can express complex predicates like this: </p>
    -
    -</html><sql>(T_BOOK.TYPE_CODE IN (1, 2, 5, 8, 13, 21)       AND T_BOOK.LANGUAGE = 'DE') OR
    -(T_BOOK.TYPE_CODE IN (2, 3, 5, 7, 11, 13)       AND T_BOOK.LANGUAGE = 'FR') OR
    -(T_BOOK.TYPE_CODE IN (SELECT CODE FROM T_TYPES) AND T_BOOK.LANGUAGE = 'EN')</sql><html>
    -
    -							<p>Just write: </p>
    -</html><java>T_BOOK.TYPE_CODE.in(1, 2, 5, 8, 13, 21)                       .and(T_BOOK.LANGUAGE.equal("DE")).or(
    -T_BOOK.TYPE_CODE.in(2, 3, 5, 7, 11, 13)                       .and(T_BOOK.LANGUAGE.equal("FR")).or(
    -T_BOOK.TYPE_CODE.in(create.select(T_TYPES.CODE).from(T_TYPES)).and(T_BOOK.LANGUAGE.equal("EN"))));</java></content>
    -					</section>
    -
    -
    -					<section id="ALIAS">
    -						<title>Aliased tables and fields</title>
    -						<content><html>
    -							<h3>Aliasing Tables</h3>
    -							<p>A typical example of what you might want to do in SQL is this: </p>
    -</html><sql>SELECT a.ID, b.ID
    -  FROM T_AUTHOR a
    -  JOIN T_BOOK b on a.ID = b.AUTHOR_ID</sql><html>
    -
    -  							<p>
    -  								In this example, we are aliasing Tables, calling them a and b.
    -  								The way aliasing works depends on how you generate your meta model
    -  								using jooq-codegen (see the manual's section about
    -  								<reference id="TABLE" title="generating tables"/>). Things become
    -  								simpler when you choose the instance/dynamic model, instead of the
    -  								static one.
    -  								Here is how you can create Table aliases in jOOQ:
    -  							</p>
    -
    -</html><java>Table&lt;TBookRecord&gt; book = T_BOOK.as("b");
    -Table&lt;TAuthorRecord&gt; author = T_AUTHOR.as("a");
    -
    -// If you choose not to generate a static meta model, this becomes even better
    -TBook book = T_BOOK.as("b");
    -TAuthor author = T_AUTHOR.as("a");</java><html>
    -
    -							<p>Now, if you want to reference any fields from those Tables, you may
    -								not use the original T_BOOK or T_AUTHOR meta-model objects anymore.
    -								Instead, you have to get the fields from the new book and author Table
    -								aliases: </p>
    -
    -</html><java><![CDATA[Field<Integer> bookID = book.getField(TBook.ID);
    -Field<Integer> authorID = author.getField(TAuthor.ID);
    -
    -// Or with the instance field model:
    -Field<Integer> bookID = book.ID;
    -Field<Integer> authorID = author.ID;]]></java><html>
    -
    -							<p>
    -								So this is how the above SQL statement would read in jOOQ:
    -							</p>
    -</html><java>create.select(authorID, bookID)
    -      .from(author)
    -      .join(book).on(authorID.equal(book.getField(T_BOOK.AUTHOR_ID)));
    -
    -// Or with the instance field model:
    -create.select(author.ID, book.ID)
    -      .from(author)
    -      .join(book).on(author.ID.equal(book.AUTHOR_ID))</java><html>
    -
    -
    -      						<h3>Aliasing nested selects as tables</h3>
    -							<p>There is an interesting, more advanced example of how you can select
    -								from an aliased nested select in the manual's section about
    -								<reference id="NESTED" title="nested selects"/></p>
    -
    -
    -							<h3>Aliasing fields</h3>
    -							<p>Fields can also be aliased independently from Tables. Most often,
    -								this is done when using functions or aggregate operators. Here is an
    -								example: </p>
    -</html><sql>  SELECT FIRST_NAME || ' ' || LAST_NAME author, COUNT(*) books
    -    FROM T_AUTHOR
    -    JOIN T_BOOK ON T_AUTHOR.ID = AUTHOR_ID
    -GROUP BY FIRST_NAME, LAST_NAME;</sql><html>
    -							<p>Here is how it's done with jOOQ: </p>
    -</html><java>Record record = create.select(
    -         concat(T_AUTHOR.FIRST_NAME, " ", T_AUTHOR.LAST_NAME).as("author"),
    -         count().as("books"))
    -      .from(T_AUTHOR)
    -      .join(T_BOOK).on(T_AUTHOR.ID.equal(T_BOOK.AUTHOR_ID))
    -      .groupBy(T_AUTHOR.FIRST_NAME, T_AUTHOR.LAST_NAME).fetchAny();</java><html>
    -      						<p>When you alias Fields like above, you can access those Fields' values using the alias name: </p>
    -</html><java>System.out.println("Author : " + record.getValue("author"));
    -System.out.println("Books  : " + record.getValue("books"));</java></content>
    -					</section>
    -
    -
    -					<section id="IN">
    -						<title>Nested SELECT using the IN operator</title>
    -						<content><html>
    -							<h3>The IN operator for use in semi-joins or anti-joins</h3>
    -							<p>
    -								In addition to a list of constant values, the IN operator in
    -								<reference class="org.jooq.Field"/>
    -								also supports a
    -								<reference class="org.jooq.Select"/> as an argument.
    -								This can be any type of select as
    -								discussed in the manual's section about
    -								<reference id="Query" title="Query types"/>.
    -								However, you must
    -								ensure yourself, that the provided Select will only select a single
    -								Field.
    -							</p>
    -							<p>Let's say you want to select books by authors born in 1920. Of
    -								course, this is possible with a plain JOIN as well, but let's say we
    -								want to use the IN operator. Then you have two possibilities: </p>
    -
    -							</html><code-pair>
    -<sql>SELECT *
    -  FROM T_BOOK
    - WHERE T_BOOK.AUTHOR_ID IN (
    -           SELECT ID FROM T_AUTHOR
    -            WHERE T_AUTHOR.BORN = 1920)
    -
    --- OR:
    -
    -SELECT T_BOOK.*
    -  FROM T_BOOK
    -  JOIN T_AUTHOR ON (T_BOOK.AUTHOR_ID = T_AUTHOR.ID
    -                AND T_AUTHOR.BORN    = 1920)</sql><java>create.select()
    -      .from(T_BOOK)
    -      .where(T_BOOK.AUTHOR_ID.in(
    -          create.select(T_AUTHOR.ID).from(T_AUTHOR)
    -                .where(T_AUTHOR.BORN.equal(1920))));
    -
    -// OR:
    -
    -create.select(T_BOOK.getFields())
    -      .from(T_BOOK)
    -      .join(T_AUTHOR).on(T_BOOK.AUTHOR_ID.equal(TAuthor.ID)
    -                     .and(T_AUTHOR.BORN.equal(1920)));</java></code-pair><html>
    -						</html></content>
    -					</section>
    -
    -
    -					<section id="EXISTS">
    -						<title>Nested SELECT using the EXISTS operator</title>
    -						<content><html>
    -							<h3>The EXISTS operator for use in semi-joins or anti-joins</h3>
    -							<p>The EXISTS operator is rather independent and can stand any place
    -								where there may be a new condition: </p>
    -							<ul>
    -								<li>It may be placed right after a WHERE keyword </li>
    -								<li>It may be the right-hand-side of a boolean operator</li>
    -								<li>It may be placed right after a ON or HAVING keyword (although, this is less likely to be done...) </li>
    -							</ul>
    -
    -							<p>This is reflected by the fact that an EXISTS clause is usually
    -								created directly from the Factory: </p>
    -
    -</html><java>Condition exists(Select&lt;?&gt; query);
    -Condition notExists(Select&lt;?&gt; query);</java><html>
    -
    -							<p>When you create such a Condition, it can then be connected to any
    -								other condition using AND, OR operators (see also the manual's section
    -								on
    -								<reference id="CONDITION" title="Conditions"/>). There are also quite a few
    -								convenience methods, where they might be useful. For instance in the
    -								<reference class="org.jooq.Condition"/> itself: </p>
    -
    -</html><java>Condition andExists(Select&lt;?&gt; select);
    -Condition andNotExists(Select&lt;?&gt; select);
    -Condition orExists(Select&lt;?&gt; select);
    -Condition orNotExists(Select&lt;?&gt; select);</java><html>
    -
    -							<p>Or in the <reference class="org.jooq.SelectWhereStep"/>:</p>
    -
    -</html><java>SelectConditionStep whereExists(Select&lt;?&gt; select);
    -SelectConditionStep whereNotExists(Select&lt;?&gt; select);</java><html>
    -
    -							<p>Or in the <reference class="org.jooq.SelectConditionStep"/>: </p>
    -
    -</html><java>SelectConditionStep andExists(Select&lt;?&gt; select);
    -SelectConditionStep andNotExists(Select&lt;?&gt; select);
    -SelectConditionStep orExists(Select&lt;?&gt; select);
    -SelectConditionStep orNotExists(Select&lt;?&gt; select);</java><html>
    -
    -							<p>An example of how to use it is quickly given. Get all authors that haven't written any books: </p>
    -							</html><code-pair>
    -<sql>SELECT *
    -  FROM T_AUTHOR
    - WHERE NOT EXISTS (SELECT 1
    -                     FROM T_BOOK
    -                    WHERE T_BOOK.AUTHOR_ID = T_AUTHOR.ID)</sql><java>create.select()
    -      .from(T_AUTHOR)
    -      .whereNotExists(create.selectOne()
    -            .from(T_BOOK)
    -            .where(T_BOOK.AUTHOR_ID.equal(T_AUTHOR.ID)));</java>
    -							</code-pair><html>
    -						</html></content>
    -					</section>
    -
    -
    -					<section id="NESTED">
    -						<title>Other types of nested SELECT</title>
    -						<content><html>
    -							<h3>Comparison with single-field SELECT clause</h3>
    -							<p>If you can ensure that a nested SELECT will only return one Record
    -								with one Field, then you can test for equality. This is how it is done
    -								in SQL: </p>
    -
    -							</html><code-pair>
    -<sql>SELECT *
    -  FROM T_BOOK
    - WHERE T_BOOK.AUTHOR_ID = (
    - 		SELECT ID
    -          FROM T_AUTHOR
    -         WHERE LAST_NAME = 'Orwell')</sql><java>create.select()
    -      .from(T_BOOK)
    -      .where(T_BOOK.AUTHOR_ID.equal(create
    -             .select(T_AUTHOR.ID)
    -             .from(T_AUTHOR)
    -             .where(T_AUTHOR.LAST_NAME.equal("Orwell"))));</java>
    -                            </code-pair><html>
    -
    -                            <p>More examples like the above can be guessed from the
    -                            <reference class="org.jooq.Field"/> API, as documented in the manual's section about
    -                            <reference id="CONDITION" title="Conditions"/>. For the = operator, the available comparisons are these:</p>
    -
    -</html><java>Condition equal(Select&lt;?&gt; query);
    -Condition equalAny(Select&lt;?&gt; query);
    -Condition equalAll(Select&lt;?&gt; query);</java><html>
    -
    -
    -                            <h3>Selecting from a SELECT - SELECT acts as a Table</h3>
    -							<p>Often, you need to nest a SELECT statement simply because SQL is
    -								limited in power. For instance, if you want to find out which author
    -								has written the most books, then you cannot do this: </p>
    -
    -</html><sql>  SELECT AUTHOR_ID, count(*) books
    -    FROM T_BOOK
    -GROUP BY AUTHOR_ID
    -ORDER BY books DESC</sql><html>
    -
    -							<p>Instead, you have to do this (or something similar). For jOOQ, this
    -								is an excellent example, combining various SQL features into a single
    -								statement. Here's how to do it: </p>
    -
    -							</html><code-pair>
    -<sql>SELECT nested.* FROM (
    -      SELECT AUTHOR_ID, count(*) books
    -        FROM T_BOOK
    -    GROUP BY AUTHOR_ID
    -) nested
    -ORDER BY nested.books DESC
    -
    -
    -</sql><java>Table&lt;Record&gt; nested =
    -    create.select(T_BOOK.AUTHOR_ID, count().as("books"))
    -          .from(T_BOOK)
    -          .groupBy(T_BOOK.AUTHOR_ID).asTable("nested");
    -
    -create.select(nested.getFields())
    -      .from(nested)
    -      .orderBy(nested.getField("books"));</java>
    -							</code-pair><html>
    -
    -							<p>You'll notice how some verbosity seems inevitable when you combine nested SELECT statements with aliasing. </p>
    -
    -	                    	<h3>Selecting a SELECT - SELECT acts as a Field</h3>
    -							<p>Now SQL is even more powerful than that. You can also have SELECT
    -								statements, wherever you can have Fields. It get's harder and harder
    -								to find good examples, because there is always an easier way to
    -								express the same thing. But why not just count the number of books the
    -								really hard way? :-) But then again, maybe you want to take advantage
    -								of <a href="http://blog.jooq.org/2011/09/02/oracle-scalar-subquery-caching/" title="Oracle Scalar Subquery Caching with jOOQ">Oracle Scalar Subquery Caching</a></p>
    -
    -							</html><code-pair>
    -<sql>  SELECT LAST_NAME, (
    -      SELECT COUNT(*)
    -       FROM T_BOOK
    -      WHERE T_BOOK.AUTHOR_ID = T_AUTHOR.ID) books
    -    FROM T_AUTHOR
    -ORDER BY books DESC
    -
    -
    -
    -</sql><java>// The type of books cannot be inferred from the Select&lt;?&gt;
    -Field&lt;Object&gt; books =
    -    create.selectCount()
    -          .from(T_BOOK)
    -          .where(T_BOOK.AUTHOR_ID.equal(T_AUTHOR.ID))
    -          .asField("books");
    -create.select(T_AUTHOR.ID, books)
    -      .from(T_AUTHOR)
    -      .orderBy(books, T_AUTHOR.ID));</java>
    -							</code-pair><html>
    -                    	</html></content>
    -					</section>
    -
    -
    -					<section id="UNION">
    -						<title>UNION and other set operations</title>
    -						<content><html>
    -							<h3>jOOQ's set operation API</h3>
    -							<p>The
    -								<reference class="org.jooq.Select"/> API directly supports the UNION
    -								syntax for all types of Select as discussed in the manual's section about
    -								<reference id="Query" title="Queries and Query subtypes"/>.
    -								It consists of these methods: </p>
    -
    -</html><java>public interface Select&lt;R extends Record&gt; {
    -    Select&lt;R&gt; union(Select&lt;R&gt; select);
    -    Select&lt;R&gt; unionAll(Select&lt;R&gt; select);
    -    Select&lt;R&gt; except(Select&lt;R&gt; select);
    -    Select&lt;R&gt; intersect(Select&lt;R&gt; select);
    -}</java><html>
    -
    -							<p>Hence, this is how you can write a simple UNION with jOOQ:</p>
    -							</html><code-pair>
    -<sql>SELECT TITLE
    -  FROM T_BOOK
    - WHERE PUBLISHED_IN &gt; 1945
    -UNION
    -SELECT TITLE
    -  FROM T_BOOK
    - WHERE AUTHOR_ID = 1</sql><java>create.select(TBook.TITLE)
    -      .from(T_BOOK)
    -      .where(T_BOOK.PUBLISHED_IN.greaterThan(1945))
    -      .union(
    -create.select(T_BOOK.TITLE)
    -      .from(T_BOOK)
    -      .where(T_BOOK.AUTHOR_ID.equal(1)));</java>
    -							</code-pair><html>
    -
    -							<h3>Nested UNIONs</h3>
    -							<p>In some SQL dialects, you can arbitrarily nest UNIONs to several
    -								levels. Be aware, though, that SQLite, Derby and MySQL have serious
    -								syntax limitations. jOOQ tries to render correct UNION SQL statements,
    -								but unfortunately, you can create situations that will cause syntax
    -								errors in the aforementioned dialects. </p>
    -
    -							<p>An example of advanced UNION usage is the following statement in jOOQ: </p>
    -</html><java>// Create a UNION of several types of books
    -Select&lt;?&gt; union =
    -    create.select(T_BOOK.TITLE, T_BOOK.AUTHOR_ID).from(T_BOOK).where(T_BOOK.PUBLISHED_IN.greaterThan(1945)).union(
    -    create.select(T_BOOK.TITLE, T_BOOK.AUTHOR_ID).from(T_BOOK).where(T_BOOK.AUTHOR_ID.equal(1)));
    -
    -// Now, re-use the above UNION and order it by author
    -create.select(union.getField(T_BOOK.TITLE))
    -      .from(union)
    -      .orderBy(union.getField(T_BOOK.AUTHOR_ID).descending());</java><html>
    -
    -							<p>This example does not seem surprising, when you have read the
    -								previous chapters about
    -								<reference id="NESTED" title="nested SELECT statements"/>.
    -								But when you check
    -								out the rendered SQL: </p>
    -
    -</html><sql>-- alias_38173 is an example of a generated alias,
    --- generated by jOOQ for union queries
    -SELECT alias_38173.TITLE FROM (
    -  SELECT T_BOOK.TITLE, T_BOOK.AUTHOR_ID FROM T_BOOK WHERE T_BOOK.PUBLISHED_IN > 1945
    -  UNION
    -  SELECT T_BOOK.TITLE, T_BOOK.AUTHOR_ID FROM T_BOOK WHERE T_BOOK.AUTHOR_ID = 1
    -) alias_38173
    -ORDER BY alias_38173.AUTHOR_ID DESC</sql><html>
    -
    -							<p>You can see that jOOQ takes care of many syntax pitfalls, when
    -								you're not used to the various dialects' unique requirements. The
    -								above automatic aliasing was added in order to be compliant with
    -								MySQL's requirements about aliasing nested selects. </p>
    -
    -							<h3>Several UNIONs</h3>
    -							<p>It is no problem either for you to create SQL statements with several unions. Just write: </p>
    -</html><java>Select&lt;?&gt; part1;
    -Select&lt;?&gt; part2;
    -Select&lt;?&gt; part3;
    -Select&lt;?&gt; part4;
    -
    -// [...]
    -
    -part1.union(part2).union(part3).union(part4);</java><html>
    -
    -							<h3>UNION and the ORDER BY clause</h3>
    -							<p>
    -								Strictly speaking, in SQL, you cannot order a subselect that is part
    -								of a UNION operation. You can only order the whole set. In set theory,
    -								or relational algebra, it wouldn't make sense to order subselects
    -								anyway, as a set operation cannot guarantee order correctness. Often,
    -								you still want to do it, because you apply a LIMIT to every subselect.
    -								Let's say, you want to find the employees with the highest salary in
    -								every department in Postgres syntax:
    -							</p>
    -							</html><code-pair>
    -<sql>SELECT * FROM (
    -  SELECT * FROM emp WHERE dept = 'IT'
    -  ORDER BY salary LIMIT 1
    -) UNION (
    -  SELECT * FROM emp WHERE dept = 'Marketing'
    -  ORDER BY salary LIMIT 1
    -) UNION (
    -  SELECT * FROM emp WHERE dept = 'R&amp;D'
    -  ORDER BY salary LIMIT 1
    -)</sql><java>create.selectFrom(EMP).where(DEPT.equal("IT"))
    -      .orderBy(SALARY).limit(1)
    -      .union(
    -create.selectFrom(EMP).where(DEPT.equal("Marketing"))
    -      .orderBy(SALARY).limit(1))
    -      .union(
    -create.selectFrom(EMP).where(DEPT.equal("R&amp;D")
    -      .orderBy(SALARY).limit(1)))
    -
    -
    -</java>
    -							</code-pair><html>
    -
    -							<p>There is a subtle difference between the above two queries.
    -								In SQL, every UNION subselect is in fact a
    -							<reference id="NESTED" title="nested SELECT"/>, wrapped in parentheses.
    -							In this example, the notion of "nested SELECT" and "subselect" are slightly
    -							different.</p>
    -						</html></content>
    -					</section>
    -
    -
    -					<section id="FUNCTIONS">
    -						<title>Functions and aggregate operators</title>
    -						<content><html>
    -							<h3>Supporting for vendor-specific functions</h3>
    -							<p>jOOQ allows you to access native functions from your RDBMS. jOOQ
    -								follows two strategies: </p>
    -							<ul>
    -								<li>Implement all SQL-92, SQL:1999, SQL:2003, and SQL:2008 standard
    -									functions, aggregate operators, and window functions. Standard
    -									functions could be
    -									<a href="http://oreilly.com/catalog/sqlnut/chapter/ch04.html" title="O'Reilly listing of SQL-92 standard functions and deviations thereof">these functions as listed by O'Reilly</a>. </li>
    -								<li>Take the most useful of vendor-specific functions and simulate
    -									them for other RDBMS, where they may not be supported. An example for
    -									this are
    -									<a href="http://psoug.org/reference/analytic_functions.html" title="An example listing of Oracle Analytic Functions">Oracle Analytic Functions</a></li>
    -							</ul>
    -
    -							<h3>Functions </h3>
    -							<p>These are just a few functions in the Factory, so you get the idea: </p>
    -
    -</html><java><![CDATA[Field<String> rpad(Field<String> field, Field<? extends Number> length);
    -Field<String> rpad(Field<String> field, int length);
    -Field<String> rpad(Field<String> field, Field<? extends Number> length, Field<String> c);
    -Field<String> rpad(Field<String> field, int length, char c);
    -Field<String> lpad(Field<String> field, Field<? extends Number> length);
    -Field<String> lpad(Field<String> field, int length);
    -Field<String> lpad(Field<String> field, Field<? extends Number> length, Field<String> c);
    -Field<String> lpad(Field<String> field, int length, char c);
    -Field<String> replace(Field<String> field, Field<String> search);
    -Field<String> replace(Field<String> field, String search);
    -Field<String> replace(Field<String> field, Field<String> search, Field<String> replace);
    -Field<String> replace(Field<String> field, String search, String replace);
    -Field<Integer> position(Field<String> field, String search);
    -Field<Integer> position(Field<String> field, Field<String> search);]]></java><html>
    -
    -							<h3>Aggregate functions</h3>
    -							<p>Aggregate functions work just like functions, even if they have a
    -								slightly different semantics. Here are some examples from
    -								Factory: </p>
    -
    -</html><java><![CDATA[// Every-day, SQL standard aggregate functions
    -AggregateFunction<Integer> count(Field<?> field);
    -AggregateFunction<T> max(Field<T> field);
    -AggregateFunction<T> min(Field<T> field);
    -AggregateFunction<BigDecimal> sum(Field<? extends Number> field);
    -AggregateFunction<BigDecimal> avg(Field<? extends Number> field);
    -
    -
    -// DISTINCT keyword in aggregate functions
    -AggregateFunction<Integer> countDistinct(Field<?> field);
    -AggregateFunction<T> maxDistinct(Field<T> field);
    -AggregateFunction<T> minDistinct(Field<T> field);
    -AggregateFunction<BigDecimal> sumDistinct(Field<? extends Number> field);
    -AggregateFunction<BigDecimal> avgDistinct(Field<? extends Number> field);
    -
    -// String aggregate functions
    -AggregateFunction<String> groupConcat(Field<?> field);
    -AggregateFunction<String> groupConcatDistinct(Field<?> field);
    -OrderedAggregateFunction<String> listAgg(Field<?> field);
    -OrderedAggregateFunction<String> listAgg(Field<?> field, String separator);
    -
    -// Statistical functions
    -AggregateFunction<BigDecimal> median(Field<? extends Number> field);
    -AggregateFunction<BigDecimal> stddevPop(Field<? extends Number> field);
    -AggregateFunction<BigDecimal> stddevSamp(Field<? extends Number> field);
    -AggregateFunction<BigDecimal> varPop(Field<? extends Number> field);
    -AggregateFunction<BigDecimal> varSamp(Field<? extends Number> field);
    -]]></java><html>
    -
    -							<p>A typical example of how to use an aggregate operator is when
    -								generating the next key on insertion of an ID. When you want to
    -								achieve something like this </p>
    -
    -							</html><code-pair>
    -<sql>SELECT MAX(ID) + 1 AS next_id
    -  FROM T_AUTHOR</sql><java>create.select(max(ID).add(1).as("next_id"))
    -      .from(T_AUTHOR);</java>
    -							</code-pair><html>
    -
    -							<p>See also the section about
    -								<reference id="ARITHMETIC" title="Arithmetic operations"/></p>
    -
    -                            <h3>Ordered aggregate functions</h3>
    -                            <p>Oracle and some other databases support ordered
    -                               aggregate functions. This means you can provide
    -                               an ORDER BY clause to an aggregate function, which will
    -                               be taken into consideration when aggregating. The best example
    -                               for this is LISTAGG() (also known as GROUP_CONCAT in other dialects).
    -                               The following query groups by authors and concatenates
    -                               their books' titles</p>
    -							</html><code-pair>
    -<sql>SELECT   LISTAGG(TITLE, ', ')
    -         WITHIN GROUP (ORDER BY TITLE)
    -FROM     BOOK
    -GROUP BY AUTHOR_ID</sql><java>create.select(listAgg(BOOK.TITLE, ", ")
    -      .withinGroupOrderBy(BOOK.TITLE))
    -      .from(BOOK)
    -      .groupBy(BOOK.AUTHOR_ID)</java>
    -							</code-pair><html>
    -
    -
    -							<h3>Window functions</h3>
    -							<p>Most major RDBMS support the concept of window functions. jOOQ knows
    -								of implementations in DB2, Oracle, Postgres, SQL Server, and Sybase
    -								SQL Anywhere,
    -								and supports most of their specific syntaxes. Window functions can be
    -								used for things like calculating a "running total". The following example
    -								fetches transactions and the running total for every transaction going
    -								back to the beginning of the transaction table (ordered by booked_at).
    -
    -								They are accessible from the previously seen AggregateFunction type using
    -								the over() method:
    -							</p>
    -
    -							</html><code-pair>
    -<sql>SELECT booked_at, amount,
    -   SUM(amount) OVER (PARTITION BY 1
    -                     ORDER BY booked_at
    -                     ROWS BETWEEN UNBOUNDED PRECEDING
    -                     AND CURRENT ROW) AS total
    -  FROM transactions</sql><java>create.select(t.BOOKED_AT, t.AMOUNT,
    -         sum(t.AMOUNT).over().partitionByOne()
    -                      .orderBy(t.BOOKED_AT)
    -                      .rowsBetweenUnboundedPreceding()
    -                      .andCurrentRow().as("total")
    -      .from(TRANSACTIONS.as("t"));</java>
    -							</code-pair><html>
    -						</html></content>
    -					</section>
    -
    -
    -					<section id="PROCEDURES">
    -						<title>Stored procedures and functions</title>
    -						<content><html>
    -							<h3>Interaction with stored procedures</h3>
    -							<p>
    -								The full power of your database's vendor-specific extensions can hardly
    -								be obtained outside of the
    -								database itself. Most modern RDBMS support
    -								their own procedural language. With jOOQ, stored procedures are
    -								integrated easily
    -							</p>
    -
    -							<p>The main way to interact with your RDBMS's stored procedures and
    -								functions is by using the generated artefacts. See the manual's
    -								section about
    -								<reference id="PROCEDURE" title="generating procedures and packages"/>
    -							    for more details
    -								about the source code generation for stored procedures and functions.
    -							</p>
    -
    -							<h3>Stored functions</h3>
    -							<p>When it comes to DSL, stored functions can be very handy in SQL
    -								statements as well. Every stored function (this also applies to
    -								FUNCTIONS in Oracle PACKAGES) can generate a Field representing a call
    -								to that function. Typically, if you have this type of function in your
    -								database: </p>
    -
    -</html><sql>CREATE OR REPLACE FUNCTION f_author_exists (author_name VARCHAR2)
    -RETURN NUMBER;</sql><html>
    -
    -							<p>Then convenience methods like these are generated: </p>
    -</html><java>// Create a field representing a function with another field as parameter
    -public static Field&lt;BigDecimal&gt; fAuthorExists(Field&lt;String&gt; authorName) { // [...]
    -
    -// Create a field representing a function with a constant parameter
    -public static Field&lt;BigDecimal&gt; fAuthorExists(String authorName) { // [...]</java><html>
    -
    -							<p>Let's say, you have a T_PERSON table with persons' names in it, and
    -								you want to know whether there exists an author with precisely that
    -								name, you can reuse the above stored function in a SQL query: </p>
    -
    -							</html><code-pair>
    -<sql>SELECT T_PERSON.NAME, F_AUTHOR_EXISTS(T_PERSON.NAME)
    -  FROM T_PERSON
    -
    --- OR:
    -
    -SELECT T_PERSON.NAME
    -  FROM T_PERSON
    - WHERE F_AUTHOR_EXISTS(T_PERSON.NAME) = 1</sql><java>create.select(T_PERSON.NAME, Functions.fAuthorExists(T_PERSON.NAME))
    -      .from(T_PERSON);
    -
    -// OR: Note, the static import of Functions.*
    -create.select(T_PERSON.NAME)
    -      .from(T_PERSON)
    -      .where(fAuthorExists(T_PERSON.NAME));</java>
    -							</code-pair><html>
    -
    -							<h3>Stored procedures</h3>
    -							<p>The notion of a stored procedure is implemented in most RDBMS by the
    -								fact, that the procedure has no RETURN VALUE (like void in Java), but
    -								it may well have OUT parameters. Since there is not a standard way how
    -								to embed stored procedures in SQL, they cannot be integrated in jOOQ's
    -								DSL either. </p>
    -						</html></content>
    -					</section>
    -
    -
    -					<section id="ARITHMETIC">
    -						<title>Arithmetic operations and concatenation</title>
    -						<content><html>
    -							<h3>Mathematical operations</h3>
    -							<p>
    -								Your database can do the math for you. Most arithmetic operations are
    -								supported, but also string concatenation can be very efficient if done
    -								already in the database.
    -							</p>
    -							<p>Arithmetic operations are implemented just like
    -								<reference id="FUNCTIONS" title="functions"/>, with
    -								similar limitations as far as type restrictions are concerned. You can
    -								use any of these operators: </p>
    -
    -							</html><config>  +  -  *  /  %</config><html>
    -
    -							<p>In order to express a SQL query like this one: </p>
    -							</html><sql>SELECT ((1 + 2) * (5 - 3) / 2) % 10 FROM DUAL</sql><html>
    -							<p>You can write something like this in jOOQ: </p>
    -							</html><java>create.select(val(1).add(2).mul(val(5).sub(3)).div(2).mod(10));	</java><html>
    -
    -							<h3>Datetime arithmetic</h3>
    -							<p>jOOQ also supports the Oracle-style syntax for adding days to a Field&lt;? extends java.util.Date&gt; </p>
    -							</html><code-pair>
    -								<sql>SELECT SYSDATE + 3 FROM DUAL;</sql><java>create.select(currentTimestamp().add(3));</java>
    -							</code-pair><html>
    -
    -							<p>
    -								For more advanced datetime arithmetic, use the Factory's timestampDiff() and dateDiff() functions,
    -								as well as jOOQ's built-in SQL standard INTERVAL data type support:
    -							</p>
    -							<ul>
    -								<li>INTERVAL YEAR TO MONTH: <reference class="org.jooq.types.YearToMonth"/></li>
    -								<li>INTERVAL DAY TO SECOND: <reference class="org.jooq.types.DayToSecond"/></li>
    -							</ul>
    -
    -							<h3>String concatenation</h3>
    -							<p>This is not really an arithmetic expression, but it's still an
    -								expression with operators: The string concatenation. jOOQ
    -								provides you with the Field's concat() method:</p>
    -							</html><code-pair>
    -<sql>SELECT 'A' || 'B' || 'C' FROM DUAL
    -
    --- Or in MySQL:
    -SELECT concat('A', 'B', 'C')</sql><java>&#160;
    -// For all RDBMS, including MySQL:
    -create.select(concat("A", "B", "C"));
    -
    -</java>
    -							</code-pair><html>
    -						</html></content>
    -					</section>
    -
    -
    -					<section id="CASE">
    -						<title>The CASE clause</title>
    -						<content><html>
    -							<h3>The two flavours of CASE</h3>
    -							<p>The CASE clause is part of the standard SQL syntax. While some RDBMS
    -								also offer an IF clause, or a DECODE function, you can always rely on
    -								the two types of CASE syntax: </p>
    -
    -							</html><code-pair>
    -<sql>CASE WHEN T_AUTHOR.FIRST_NAME = 'Paulo'  THEN 'brazilian'
    -     WHEN T_AUTHOR.FIRST_NAME = 'George' THEN 'english'
    -                                         ELSE 'unknown'
    -END
    -
    --- OR:
    -
    -CASE T_AUTHOR.FIRST_NAME WHEN 'Paulo'  THEN 'brazilian'
    -                         WHEN 'George' THEN 'english'
    -                                       ELSE 'unknown'
    -END </sql><java>create.decode()
    -      .when(T_AUTHOR.FIRST_NAME.equal("Paulo"), "brazilian")
    -      .when(T_AUTHOR.FIRST_NAME.equal("George"), "english")
    -      .otherwise("unknown");
    -
    -// OR:
    -
    -create.decode().value(T_AUTHOR.FIRST_NAME)
    -               .when("Paulo", "brazilian")
    -               .when("George", "english")
    -               .otherwise("unknown");</java>
    -							</code-pair><html>
    -
    -							<p>
    -								In jOOQ, both syntaxes are supported (although, Derby only knows the
    -								first one, which is more general). Unfortunately, both case and else
    -								are reserved words in Java. jOOQ chose to use decode() from the Oracle
    -								DECODE function, and otherwise(), which means the same as else. Please
    -								note that in the above examples, all values were always constants. You
    -								can of course also use Field instead of the various constants.
    -							</p>
    -							<p>A CASE clause can be used anywhere where you can place a Field. For
    -								instance, you can SELECT the above expression, if you're selecting
    -								from T_AUTHOR: </p>
    -</html><sql>SELECT T_AUTHOR.FIRST_NAME, [... CASE EXPR ...] AS nationality
    -  FROM T_AUTHOR</sql><html>
    -
    -
    -  							<h3>CASE clauses in an ORDER BY clause</h3>
    -							<p>Sort indirection is often implemented with a CASE clause of a
    -								SELECT's ORDER BY clause. In SQL, this reads: </p>
    -
    -</html><sql>SELECT *
    -FROM T_AUTHOR
    -ORDER BY CASE FIRST_NAME WHEN 'Paulo'  THEN 1
    -                         WHEN 'George' THEN 2
    -                                       ELSE null
    -         END</sql><html>
    -
    -							<p>This will order your authors such that all 'Paulo' come first, then
    -								all 'George' and everyone else last (depending on your RDBMS' handling
    -								of NULL values in sorting). This is a very common task, such that jOOQ
    -								simplifies its use: </p>
    -</html><java>create.select()
    -      .from(T_AUTHOR)
    -      .orderBy(T_AUTHOR.FIRST_NAME.sortAsc("Paulo", "George"))
    -      .execute();</java></content>
    -					</section>
    -
    -
    -					<section id="CAST">
    -						<title>Type casting</title>
    -						<content><html>
    -							<h3>Enforcing a specific type when you need it</h3>
    -							<p>jOOQ's source code generator tries to find the most accurate type
    -								mapping between your vendor-specific data types and a matching Java
    -								type. For instance, most VARCHAR, CHAR, CLOB types will map to String.
    -								Most BINARY, BYTEA, BLOB types will map to byte[]. NUMERIC types will
    -								default to java.math.BigDecimal, but can also be any of
    -								java.math.BigInteger, Long, Integer, Short, Byte, Double, Float. </p>
    -							<p>Sometimes, this automatic mapping might not be what you needed, or
    -								jOOQ cannot know the type of a field (because you created it from a
    -								<reference id="NESTED" title="nested select"/>).
    -								In those cases you would write SQL type CASTs like
    -								this: </p>
    -</html><sql>-- Let's say, your Postgres column LAST_NAME was VARCHAR(30)
    --- Then you could do this:
    -SELECT CAST(T_AUTHOR.LAST_NAME AS TEXT) FROM DUAL</sql><html>
    -							<p>in jOOQ, you can write something like that: </p>
    -							</html><java>create.select(TAuthor.LAST_NAME.cast(PostgresDataType.TEXT));</java><html>
    -							<p>The same thing can be achieved by casting a Field directly to
    -								String.class, as TEXT is the default data type in Postgres to map to
    -								Java's String</p>
    -							</html><java>create.select(TAuthor.LAST_NAME.cast(String.class));</java><html>
    -							<p>The complete CAST API in Field consists of these three methods: </p>
    -</html><java>public interface Field&lt;T&gt; {
    -    &lt;Z&gt; Field&lt;Z&gt; cast(Field&lt;Z&gt; field);
    -    &lt;Z&gt; Field&lt;Z&gt; cast(DataType&lt;Z&gt; type);
    -    &lt;Z&gt; Field&lt;Z&gt; cast(Class&lt;? extends Z&gt; type);
    -}
    -
    -// And additional convenience methods in the Factory:
    -public class Factory {
    -    &lt;T&gt; Field&lt;T&gt; cast(Object object, Field&lt;T&gt; field);
    -    &lt;T&gt; Field&lt;T&gt; cast(Object object, DataType&lt;T&gt; type);
    -    &lt;T&gt; Field&lt;T&gt; cast(Object object, Class&lt;? extends T&gt; type);
    -    &lt;T&gt; Field&lt;T&gt; castNull(Field&lt;T&gt; field);
    -    &lt;T&gt; Field&lt;T&gt; castNull(DataType&lt;T&gt; type);
    -    &lt;T&gt; Field&lt;T&gt; castNull(Class&lt;? extends T&gt; type);
    -}</java></content>
    -					</section>
    -
    -
    -					<section id="SQL">
    -						<title>When it's just easier: Plain SQL</title>
    -						<content><html>
    -							<h3>Plain SQL in jOOQ</h3>
    -							<p>A DSL is a nice thing to have, it feels "fluent" and "natural",
    -								especially if it models a well-known language, such as SQL. But a DSL
    -								is always expressed in another language (Java in this case), which was
    -								not made for exactly that DSL. If it were, then jOOQ would be
    -								implemented on a compiler-level, similar to Linq in .NET. But it's
    -								not, and so, the DSL is limited. We have seen many functionalities
    -								where the DSL becomes verbose. This can be especially true for: </p>
    -							<ul>
    -								<li><reference id="ALIAS" title="aliasing"/></li>
    -								<li><reference id="NESTED" title="nested selects"/></li>
    -								<li><reference id="ARITHMETIC" title="arithmetic expressions"/></li>
    -								<li><reference id="CAST" title="casting"/></li>
    -							</ul>
    -							<p>You'll probably find other examples. If verbosity scares you off,
    -								don't worry. The verbose use-cases for jOOQ are rather rare, and when
    -								they come up, you do have an option. Just write SQL the way you're
    -								used to! </p>
    -							<p>jOOQ allows you to embed SQL as a String in these contexts: </p>
    -							<ul>
    -								<li>Plain SQL as a condition </li>
    -								<li>Plain SQL as a field </li>
    -								<li>Plain SQL as a function </li>
    -								<li>Plain SQL as a table </li>
    -								<li>Plain SQL as a query </li>
    -							</ul>
    -
    -							<p>To construct artefacts wrapping plain SQL, you should use any of
    -								these methods from the Factory class: </p>
    -
    -</html><java><![CDATA[// A condition
    -Condition condition(String sql);
    -Condition condition(String sql, Object... bindings);
    -
    -// A field with an unknown data type
    -Field<Object> field(String sql);
    -Field<Object> field(String sql, Object... bindings);
    -
    -// A field with a known data type
    -<T> Field<T> field(String sql, Class<T> type);
    -<T> Field<T> field(String sql, Class<T> type, Object... bindings);
    -<T> Field<T> field(String sql, DataType<T> type);
    -<T> Field<T> field(String sql, DataType<T> type, Object... bindings);
    -
    -// A field with a known name (properly escaped)
    -Field<Object> fieldByName(String... fieldName);
    -<T> Field<T> fieldByName(Class<T> type, String... fieldName);
    -<T> Field<T> fieldByName(DataType<T> type, String... fieldName)
    -
    -// A function
    -<T> Field<T> function(String name, Class<T> type, Field<?>... arguments);
    -<T> Field<T> function(String name, DataType<T> type, Field<?>... arguments);
    -
    -// A table
    -Table<?> table(String sql);
    -Table<?> table(String sql, Object... bindings);
    -
    -// A query without results (update, insert, etc)
    -Query query(String sql);
    -Query query(String sql, Object... bindings);
    -
    -// A query with results
    -ResultQuery<Record> resultQuery(String sql);
    -ResultQuery<Record> resultQuery(String sql, Object... bindings);
    -
    -// A query with results. This is the same as resultQuery(...).fetch();
    -Result<Record> fetch(String sql);
    -Result<Record> fetch(String sql, Object... bindings);]]></java><html>
    -
    -							<p>Apart from the general factory methods, plain SQL is useful also in
    -								various other contexts. For instance, when adding a .where("a = b")
    -								clause to a query. Hence, there exist several convenience methods
    -								where plain SQL can be inserted usefully. This is an example
    -								displaying all various use-cases in one single query: </p>
    -</html><java><![CDATA[// You can use your table aliases in plain SQL fields
    -// As long as that will produce syntactically correct SQL
    -Field<?> LAST_NAME    = create.field("a.LAST_NAME");
    -
    -// You can alias your plain SQL fields
    -Field<?> COUNT1       = create.field("count(*) x");
    -
    -// If you know a reasonable Java type for your field, you
    -// can also provide jOOQ with that type
    -Field<Integer> COUNT2 = create.field("count(*) y", Integer.class);
    -
    -       // Use plain SQL as select fields
    -create.select(LAST_NAME, COUNT1, COUNT2)
    -
    -       // Use plain SQL as aliased tables (be aware of syntax!)
    -      .from("t_author a")
    -      .join("t_book b")
    -
    -       // Use plain SQL for conditions both in JOIN and WHERE clauses
    -      .on("a.id = b.author_id")
    -
    -       // Bind a variable in plain SQL
    -      .where("b.title != ?", "Brida")
    -
    -       // Use plain SQL again as fields in GROUP BY and ORDER BY clauses
    -      .groupBy(LAST_NAME)
    -      .orderBy(LAST_NAME);]]></java><html>
    -
    -							<p>There are some important things to keep in mind when using plain
    -								SQL: </p>
    -							<ul>
    -								<li>jOOQ doesn't know what you're doing. You're on your own again!
    -								</li>
    -								<li>You have to provide something that will be syntactically correct.
    -									If it's not, then jOOQ won't know. Only your JDBC driver or your
    -									RDBMS will detect the syntax error. </li>
    -								<li>You have to provide consistency when you use variable binding. The
    -									number of ? must match the number of variables </li>
    -								<li>Your SQL is inserted into jOOQ queries without further checks.
    -									Hence, jOOQ can't prevent SQL injection. </li>
    -							</ul>
    -						</html></content>
    -					</section>
    -				</sections>
    -			</section>
    -
    -
    -
    -			<section id="ADVANCED">
    -				<title>Advanced topics</title>
    -				<content><html>
    -					<h3>Overview</h3>
    -					<p>This section covers some advanced topics and features that don't fit into any other section. </p>
    -				</html></content>
    -
    -
    -				<sections>
    -					<section id="MasterData">
    -						<title>Master data and enumeration tables</title>
    -						<content><html>
    -							<h3>Enumeration tables</h3>
    -							<p>Only MySQL and Postgres databases support true ENUM types natively.
    -								Some other RDBMS allow you to map the concept of an ENUM data type to
    -								a CHECK constraint, but those constraints can contain arbitrary SQL.
    -								 With jOOQ, you
    -								can "simulate" ENUM types by declaring a table as a "master data
    -								table" in the configuration. At code-generation time, this table will
    -								be treated specially, and a Java enum type is generated from its data.
    -							</p>
    -
    -							<h3>Configure master data tables</h3>
    -							<p>As previously discussed in the
    -							  <reference id="Configuration" title="configuration and setup"/>
    -							   section, you can configure master data tables as follows: </p>
    -</html><xml><![CDATA[<!-- These properties can be added to the database element: -->
    -<database>
    -  <masterDataTables>
    -    <masterDataTable>
    -      <!-- The name of a master data table -->
    -      <name>[a table name]</name>
    -
    -      <!-- The column used for enum literals -->
    -      <literal>[a column name]</literal>
    -
    -      <!-- The column used for documentation -->
    -      <description>[a column name]</description>
    -    </masterDataTable>
    -
    -    [ <masterDataTable>...</masterDataTable> ... ]
    -  </masterDataTables>
    - </database>]]></xml><html>
    -
    -							<p>The results of this will be a Java enum that looks similar to this: </p>
    -</html><java><![CDATA[public enum TLanguage implements MasterDataType<Integer> {
    -
    -  /**
    -   * English
    -   */
    -  en(1, "en", "English"),
    -
    -  /**
    -   * Deutsch
    -   */
    -  de(2, "de", "Deutsch"),
    -
    -  /**
    -   * Français
    -   */
    -  fr(3, "fr", "Français"),
    -
    -  /**
    -   * null
    -   */
    -  pt(4, "pt", null),
    -  ;
    -
    -  private final Integer id;
    -  private final String cd;
    -  private final String description;
    -
    -  // [ ... constructor and getters for the above properties ]
    -}]]></java><html>
    -
    -							<p>In the above example, you can see how the configured primary key is
    -								mapped to the id member, the configured literal column is mapped to
    -								the cd member and the configured description member is mapped to the
    -								description member and output as Javadoc. In other words, T_LANGUAGE
    -								is a table with 4 rows and at least three columns. </p>
    -							<p>The general contract (with jOOQ 1.6.2+) is that there must be </p>
    -							<ul>
    -								<li> A single-column primary key column of character or integer type
    -								</li>
    -								<li>An optional unique literal column of character or integer type
    -									(otherwise, the primary key is used as enum literal) </li>
    -								<li>An optional description column of any type </li>
    -							</ul>
    -
    -							<h3>Using MasterDataTypes</h3>
    -							<p>The point of MasterDataTypes in jOOQ is that they behave exactly
    -								like true ENUM types. When the above T_LANGUAGE table is referenced by
    -								T_BOOK, instead of generating foreign key navigation methods and a
    -								LANGUAGE_ID Field&lt;Integer&gt;, a Field&lt;TLanguage&gt; is
    -								generated: </p>
    -
    -</html><java><![CDATA[public class TBook extends UpdatableTableImpl<TBookRecord> {
    -
    -  // [...]
    -  public static final TableField<TBookRecord, TLanguage> LANGUAGE_ID =
    -                  new TableFieldImpl<TBookRecord, TLanguage>( /* ... */ );
    -}]]></java><html>
    -
    -							<p>Which can then be used in the TBookRecord directly: </p>
    -</html><java><![CDATA[public class TBookRecord extends UpdatableRecordImpl<TBookRecord> {
    -
    -  // [...]
    -  public TLanguage getLanguageId() { // [...]
    -  public void setLanguageId(TLanguage value) { // [...]
    -}]]></java><html>
    -
    -							<h3>When to use MasterDataTypes</h3>
    -							<p>You can use master data types when you're actually mapping master
    -								data to a Java enum. When the underlying table changes frequently,
    -								those updates will not be reflected by the statically generated code.
    -								Also, be aware that it will be difficult to perform actual JOIN
    -								operations on the underlying table with jOOQ, once the master data
    -								type is generated. </p>
    -						</html></content>
    -					</section>
    -
    -
    -					<section id="CustomTypes">
    -						<title>Custom data types and type conversion</title>
    -						<content><html>
    -							<h3>Your custom type and its associated Converter</h3>
    -							<p>
    -								When using a custom type in jOOQ, you need to let jOOQ know about
    -								its associated <reference class="org.jooq.Converter"/>.
    -								A converter essentially has two generic type parameters:
    -							</p>
    -							<ul>
    -								<li>&lt;U&gt;: The user-defined Java type. This could be <reference class="java.util.GregorianCalendar"/>, for instance.</li>
    -								<li>&lt;T&gt;: The database / SQL type. This could be <reference class="java.sql.Timestamp"/>, for instance.</li>
    -							</ul>
    -							<p>
    -								The above conversion implies that you may want to use a GregorianCalendar for
    -								SQL timestamps, rather than the timestamp type itself. You could then write
    -								a Converter like this:
    -							</p>
    -
    -</html><java><![CDATA[package com.example;
    -
    -import java.sql.Timestamp;
    -import java.util.Calendar;
    -import java.util.GregorianCalendar;
    -
    -import org.jooq.Converter;
    -
    -// Bind T to Timestamp and U to Gregorian calendar, here
    -public class CalendarConverter implements Converter<Timestamp, GregorianCalendar> {
    -
    -    // Provide jOOQ with Class<?> objects of <U> and <T>. These are used by
    -    // jOOQ to discover your converter based on your custom type
    -    // --------------------------------------------------------------------
    -    @Override
    -    public Class<Timestamp> fromType() {
    -        return Timestamp.class;
    -    }
    -
    -    @Override
    -    public Class<GregorianCalendar> toType() {
    -        return GregorianCalendar.class;
    -    }
    -
    -    // Implement the type conversion methods. Convert your user-defined type
    -    // "from" the SQL type when reading "from" the database, or "to" the SQL
    -    // type when writing "to" the database.
    -    @Override
    -    public GregorianCalendar from(Timestamp databaseObject) {
    -        GregorianCalendar calendar = (GregorianCalendar) Calendar.getInstance();
    -        calendar.setTimeInMillis(databaseObject.getTime());
    -        return calendar;
    -    }
    -
    -    @Override
    -    public Timestamp to(GregorianCalendar userObject) {
    -        return new Timestamp(userObject.getTime().getTime());
    -    }
    -}
    -]]></java><html>
    -
    -							<p>
    -								Such a Converter can now be used in various places of the jOOQ
    -								API, especially when reading data from the database:
    -							</p>
    -
    -</html><java><![CDATA[List<GregorianCalendar> result =
    -create.select(T_AUTHOR.DATE_OF_BIRTH)
    -      .from(T_AUTHOR)
    -      .fetch(0, new CalendarConverter());]]></java><html>
    -
    -      						<h3>Using Converters in generated code</h3>
    -      						<p>
    -								A more common use-case, however, is to let jOOQ know about custom
    -								types at code generation time. Use the following configuration elements
    -								to specify, that you'd like to use GregorianCalendar for all database
    -								fields that start with DATE_OF_
    -      						</p>
    -
    -</html><xml><![CDATA[<database>
    -  <!-- First, register your custom types here -->
    -  <customTypes>
    -    <customType>
    -      <!-- Specify the fully-qualified class name of your custom type -->
    -      <name>java.util.GregorianCalendar</name>
    -
    -      <!-- Associate that custom type with your converter. Note, a
    -           custom type can only have one converter in jOOQ -->
    -      <converter>com.example.CalendarConverter</converter>
    -    </customType>
    -  </customTypes>
    -
    -  <!-- Then, associate custom types with database columns -->
    -  <forcedTypes>
    -    <forcedType>
    -      <!-- Specify again he fully-qualified class name of your custom type -->
    -      <name>java.util.GregorianCalendar</name>
    -
    -      <!-- Add a list of comma-separated regular expressions matching columns -->
    -      <expressions>.*\.DATE_OF_.*</expressions>
    -    </forcedType>
    -  </forcedTypes>
    -</database>]]></xml><html>
    -
    -                            <p>
    -                            	The above configuration will lead to T_AUTHOR.DATE_OF_BIRTH
    -                            	being generated like this:
    -                            </p>
    -
    -</html><java>public class TAuthor extends UpdatableTableImpl&lt;TAuthorRecord&gt; {
    -
    -    // [...]
    -    public final TableField&lt;TAuthorRecord, GregorianCalendar&gt; DATE_OF_BIRTH =    // [...]
    -    // [...]
    -
    -}</java><html>
    -
    -                            <p>
    -                            	This means that the bound of &lt;T&gt; will be GregorianCalendar,
    -                            	wherever you reference DATE_OF_BIRTH. jOOQ will use your custom
    -                            	converter when binding variables and when fetching data from
    -                            	<reference class="java.util.ResultSet"/>:
    -                            </p>
    -
    -</html><java><![CDATA[// Get all date of births of authors born after 1980
    -List<GregorianCalendar> result =
    -create.selectFrom(T_AUTHOR)
    -      .where(T_AUTHOR.DATE_OF_BIRTH.greaterThan(new GregorianCalendar(1980, 0, 1)))
    -      .fetch(T_AUTHOR.DATE_OF_BIRTH);]]></java><html>
    -
    -      						<p>
    -      						    Read more about advanced code generation configuration in
    -      						    <reference id="AdvancedConfiguration" title="the manual's section about advanced code generation configuration"/>.
    -      						</p>
    -
    -      						<h3>Using Converters for enum types</h3>
    -      						<p>
    -      							Java's Enum types can be very useful in SQL too.
    -      							Some databases support enumeration types natively (MySQL, Postgres).
    -      							In other cases, you can use the above custom type configuration
    -      							also to provide jOOQ with Converters for your custom Enum types.
    -      							Instead of implementing <reference class="org.jooq.Converter"/>,
    -      							you may choose to extend <reference class="org.jooq.impl.EnumConverter"/>
    -      							instead, which provides some enum-specific default behaviour.
    -      						</p>
    -						</html></content>
    -					</section>
    -
    -
    -					<section id="SchemaMapping">
    -						<title>Mapping generated schemata and tables</title>
    -						<content><html>
    -							<h3>Mapping your DEV schema to a productive environment</h3>
    -							<p>You may wish to design your database in a way that you have several
    -								instances of your schema. This is useful when you want to cleanly
    -								separate data belonging to several customers / organisation units /
    -								branches / users and put each of those entities' data in a separate
    -								database or schema. </p>
    -							<p>In our T_AUTHOR example this would mean that you provide a book
    -								reference database to several companies, such as My Book World and
    -								Books R Us. In that case, you'll probably have a schema setup like
    -								this: </p>
    -							<ul>
    -								<li>DEV: Your development schema. This will be the schema that you
    -									base code generation upon, with jOOQ </li>
    -								<li>MY_BOOK_WORLD: The schema instance for My Book World </li>
    -								<li>BOOKS_R_US: The schema instance for Books R Us </li>
    -							</ul>
    -
    -
    -							<h3>Mapping DEV to MY_BOOK_WORLD with jOOQ</h3>
    -							<p>When a user from My Book World logs in, you want them to access the
    -								MY_BOOK_WORLD schema using classes generated from DEV. This can be
    -								achieved with the
    -								<reference class="org.jooq.conf.RenderMapping"/>
    -								class, that you can equip your Factory's settings
    -								with. Take the following example: </p>
    -
    -</html><java>Settings settings = new Settings()
    -    .withRenderMapping(new RenderMapping()
    -    .withSchemata(
    -        new MappedSchema().withInput("DEV")
    -                          .withOutput("MY_BOOK_WORLD")));
    -
    -// Add the settings to the factory
    -Factory create = new Factory(connection, SQLDialect.ORACLE, settings);
    -
    -// Run queries with the "mapped" factory
    -create.selectFrom(T_AUTHOR).fetch();</java><html>
    -
    -							<p>The query executed with a Factory equipped with the above mapping
    -								will in fact produce this SQL statement: </p>
    -							</html><sql>SELECT * FROM MY_BOOK_WORLD.T_AUTHOR</sql><html>
    -							<p>Even if T_AUTHOR was generated from DEV. </p>
    -
    -							<h3>Mapping several schemata</h3>
    -							<p>Your development database may not be restricted to hold only one DEV
    -								schema. You may also have a LOG schema and a MASTER schema. Let's say
    -								the MASTER schema is shared among all customers, but each customer has
    -								their own LOG schema instance. Then you can enhance your RenderMapping
    -								like this (e.g. using an XML configuration file): </p>
    -
    -</html><xml><![CDATA[<settings xmlns="http://www.jooq.org/xsd/jooq-runtime-2.1.0.xsd">
    -  <renderMapping>
    -    <schemata>
    -      <schema>
    -        <input>DEV</input>
    -        <output>MY_BOOK_WORLD</output>
    -      </schema>
    -      <schema>
    -        <input>LOG</input>
    -        <output>MY_BOOK_WORLD_LOG</output>
    -      </schema>
    -    </schemata>
    -  </renderMapping>
    -</settings>]]></xml><html>
    -
    -                            <p>Note, you can load the above XML file like this:</p>
    -
    -</html><java>Settings settings = JAXB.unmarshal(new File("jooq-runtime.xml"), Settings.class);</java><html>
    -
    -							<p>This will map generated classes from DEV to MY_BOOK_WORLD, from LOG
    -								to MY_BOOK_WORLD_LOG, but leave the MASTER schema alone. Whenever you
    -								want to change your mapping configuration, you will have to create a
    -								new Factory</p>
    -
    -
    -							<h3>Using a default schema</h3>
    -							<p>Another option to switch schema names is to use a default schema for
    -								the Factory's underlying Connection. Many RDBMS support a USE or SET
    -								SCHEMA command, which you can call like this: </p>
    -
    -</html><java>// Set the default schema
    -Schema MY_BOOK_WORLD = ...
    -create.use(MY_BOOK_WORLD);
    -
    -// Run queries with factory having a default schema
    -create.selectFrom(T_AUTHOR).fetch();</java><html>
    -							<p>Queries generated from the above Factory will produce this kind of SQL statement: </p>
    -
    -</html><sql>-- the schema name is omitted from all SQL constructs.
    -SELECT * FROM T_AUTHOR</sql><html>
    -
    -                            <p>If you wish not to render any schema name at all, use the
    -                                following Settings property for this:</p>
    -
    -
    -</html><java>Settings settings = new Settings()
    -    .withRenderSchema(false);
    -
    -// Add the settings to the factory
    -Factory create = new Factory(connection, SQLDialect.ORACLE, settings);
    -
    -// Run queries that omit rendering schema names
    -create.selectFrom(T_AUTHOR).fetch();</java><html>
    -
    -							<h3>Mapping of tables</h3>
    -							<p>Not only schemata can be mapped, but also tables. If you are not the
    -								owner of the database your application connects to, you might need to
    -								install your schema with some sort of prefix to every table. In our
    -								examples, this might mean that you will have to map DEV.T_AUTHOR to
    -								something MY_BOOK_WORLD.MY_APP__T_AUTHOR, where MY_APP__ is a prefix
    -								applied to all of your tables. This can be achieved by creating the
    -								following mapping: </p>
    -
    -</html><java>Settings settings = new Settings()
    -    .withRenderMapping(new RenderMapping()
    -    .withSchemata(
    -        new MappedSchema().withInput("DEV")
    -                          .withOutput("MY_BOOK_WORLD")
    -                          .withTables(
    -         new MappedTable().withInput("T_AUTHOR")
    -                          .withOutput("MY_APP__T_AUTHOR"))));
    -
    -// Add the settings to the factory
    -Factory create = new Factory(connection, SQLDialect.ORACLE, settings);
    -
    -// Run queries with the "mapped" factory
    -create.selectFrom(T_AUTHOR).fetch();</java><html>
    -
    -							<p>The query executed with a Factory equipped with the above mapping will in fact produce this SQL statement: </p>
    -</html><sql>SELECT * FROM MY_BOOK_WORLD.MY_APP__T_AUTHOR</sql><html>
    -
    -                            <p>
    -                            Table mapping and schema mapping can be applied independently, by specifying several MappedSchema entries
    -                            in the above configuration. jOOQ will process them in order of appearance and map at first match. Note that
    -                            you can always omit a MappedSchema's output value, in case of which, only the table mapping is applied.
    -                            If you omit a MappedSchema's input value, the table mapping is applied to all schemata!
    -                            </p>
    -
    -							<h3>Mapping at code generation time</h3>
    -							<p>
    -								Note that you can also hard-wire schema mapping in generated artefacts
    -								at code generation time, e.g. when you have 5 developers with their own
    -								dedicated developer databases, and a common integration database. In the
    -								code generation configuration, you would then write.
    -							</p>
    -</html><xml><![CDATA[<schemata>
    -  <schema>
    -    <!-- Use this as the developer's schema: -->
    -    <inputSchema>LUKAS_DEV_SCHEMA</inputSchema>
    -
    -    <!-- Use this as the integration / production database: -->
    -    <outputSchema>PROD</outputSchema>
    -  </schema>
    -</schemata>]]></xml><html>
    -							<p>
    -								See the manual's section about
    -								<reference id="META" title="jooq-codegen configuration"/>
    -								for more details
    -							</p>
    -						</html></content>
    -					</section>
    -
    -
    -					<section id="ExecuteListener">
    -						<title>Execute listeners and the jOOQ Console</title>
    -						<content><html>
    -							<h3>ExecuteListener</h3>
    -							<p>
    -								The <reference id="Factory" title="jOOQ Factory Settings"/>
    -								let you specify a list of <reference class="org.jooq.ExecuteListener"/> classes.
    -								The ExecuteListener is essentially an event listener for
    -								Query, Routine, or ResultSet render, prepare, bind, execute, fetch steps. It is a
    -								base type for loggers, debuggers, profilers, data collectors. Advanced ExecuteListeners
    -								can also provide custom implementations of Connection, PreparedStatement and ResultSet
    -								to jOOQ in apropriate methods. For convenience, consider extending
    -								<reference class="org.jooq.impl.DefaultExecuteListener"/>
    -								instead of implementing this interface.
    -							</p>
    -							<p>
    -								Here is a sample implementation of an ExecuteListener, that is simply counting
    -								the number of queries per type that are being executed using jOOQ:
    -							</p>
    -
    -</html><java><![CDATA[package com.example;
    -
    -public class StatisticsListener extends DefaultExecuteListener {
    -    public static Map<ExecuteType, Integer> STATISTICS = new HashMap<ExecuteType, Integer>();
    -
    -    // Count "start" events for every type of query executed by jOOQ
    -    @Override
    -    public void start(ExecuteContext ctx) {
    -        Integer count = STATISTICS.get(ctx.type());
    -
    -        if (count == null) {
    -            count = 0;
    -        }
    -
    -        STATISTICS.put(ctx.type(), count + 1);
    -    }
    -}]]></java><html>
    -
    -							<p>
    -								Now, configure jOOQ's runtime to load your listener
    -							</p>
    -
    -</html><xml><![CDATA[<settings>
    -  <executeListeners>
    -    <executeListener>com.example.StatisticsListener</executeListener>
    -  </executeListeners>
    -</settings>]]></xml><html>
    -
    -							<p>
    -								And log results any time with a snippet like this:
    -							</p>
    -
    -</html><java><![CDATA[log.info("STATISTICS");
    -log.info("----------");
    -
    -for (ExecuteType type : ExecuteType.values()) {
    -    log.info(type.name(), StatisticsListener.STATISTICS.get(type) + " executions");
    -}]]></java><html>
    -                            <p>
    -                            	This may result in the following log output:
    -                            </p>
    -
    -</html><config>15:16:52,982  INFO - TEST STATISTICS
    -15:16:52,982  INFO - ---------------
    -15:16:52,983  INFO - READ                     : 919 executions
    -15:16:52,983  INFO - WRITE                    : 117 executions
    -15:16:52,983  INFO - DDL                      : 2 executions
    -15:16:52,983  INFO - BATCH                    : 4 executions
    -15:16:52,983  INFO - ROUTINE                  : 21 executions
    -15:16:52,983  INFO - OTHER                    : 30 executions</config><html>
    -							<p>
    -								Please read the
    -								<a href="http://www.jooq.org/javadoc/latest/org/jooq/ExecuteListener.html" title="ExecuteListener Javadoc">ExecuteListener Javadoc</a>
    -								for more details
    -							</p>
    -
    -							<h3>jOOQ Console</h3>
    -							<p>
    -							    The ExecuteListener API was driven by a feature request by Christopher Deckers, who has
    -							    had the courtesy to contribute the jOOQ Console, a sample application interfacing
    -							    with jOOQ's ExecuteListeners. The jOOQ Console logs all queries executed by jOOQ and
    -							    displays them nicely in a Swing application. With the jOOQ Console's logger, you can:
    -						    </p>
    -						    <ul>
    -						    	<li>Activate the console's DebugListener anytime (in-process or if the remote server is active).</li>
    -						    	<li>View simple and batch queries and their parameters.</li>
    -						    	<li>Reformat queries along with syntax highlighting for better readability.</li>
    -						    	<li>View stack trace of originator of the call.</li>
    -						    	<li>Dump the stack to stdout when in an IDE, to directly navigate to relevant classes.</li>
    -						    	<li>Track execution time, binding time, parsing time, rows read, fields read.</li>
    -						    	<li>Show/hide queries depending on their type (SELECT, UPDATE, etc.).</li>
    -						    	<li>Sort any column (timing columns, queries, types, etc.)</li>
    -						    	<li>Easy copy paste of rows/columns to Spreadsheet editors.</li>
    -						    </ul>
    -
    -						    <p>
    -						    	A short overview of such a debugging session can be seen here:
    -						    </p>
    -   							<div class="screenshot">
    -								<img class="screenshot" src="&lt;?=$root?&gt;/img/jooq-console-01.png" alt="jOOQ Console example"/>
    -							</div>
    -						    <p>
    -							    Please note that the jOOQ Console is still experimental.
    -							    Any feedback is very welcome on
    -							    <a href="http://groups.google.com/group/jooq-user" title="the jooq-user group">the jooq-user group</a>
    -							</p>
    -							<h3>jOOQ Console operation modes</h3>
    -							<p>
    -								The jOOQ Console can be run in two different modes:
    -							</p>
    -							<ul>
    -								<li>In-process mode: running in the same process as the queries you're analysing</li>
    -								<li>"headless" mode: running remotely</li>
    -							</ul>
    -
    -							<p>
    -								Both modes will require that you set the
    -								<reference class="org.jooq.debug.DebugListener"/>
    -								in the Factory's settings. When using XML settings:
    -							</p>
    -
    -</html><xml><![CDATA[<settings>
    -  <executeListeners>
    -    <executeListener>org.jooq.debug.DebugListener</executeListener>
    -  </executeListeners>
    -</settings>]]></xml><html>
    -
    -							<p>
    -								Or when using programmatic settings:
    -							</p>
    -</html><java><![CDATA[Settings settings = new Settings()
    -    .getExecuteListeners().add("org.jooq.debug.DebugListener");
    -Factory factory = new Factory(connection, dialect, settings);]]></java><html>
    -
    -							<h3>In-process mode</h3>
    -							<p>
    -								The in-process mode is useful for Swing applications or other,
    -								locally run Java programs accessing the database via jOOQ.
    -								In order to launch the jOOQ Console "in-process", specify the
    -								previously documented settings and launch the Console as follows:
    -							</p>
    -
    -</html><java><![CDATA[// Define a DatabaseDescriptor for the "in-process" mode
    -// It is needed for the "Editor" tab
    -DatabaseDescriptor descriptor = new DatabaseDescriptor() {
    -
    -    // Return your generated schema. This is used by the console
    -    // to introspect your schema data
    -    @Override
    -    public Schema getSchema() {
    -        return com.example.MySchema.MY_SCHEMA;
    -    }
    -
    -    // Return the SQL dialect that you're using
    -    @Override
    -    public SQLDialect getSQLDialect() {
    -        return SQLDialect.ORACLE;
    -    }
    -
    -    // Return a connection
    -    @Override
    -    public Connection createConnection() {
    -        try {
    -            return DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "test", "test");
    -        }
    -        catch (Exception ignore) {}
    -    }
    -};
    -
    -// Now pass this database descriptor to the Console and make it visible
    -try {
    -
    -    // Use this for a nicer look-and-feel
    -    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    -
    -    // Create a new Console
    -    Console console = new Console(descriptor, true);
    -    console.setLoggingActive(true);
    -    console.setVisible(true);
    -}
    -catch (Exception ignore) {}
    -]]></java><html>
    -
    -							<p>
    -								Only in the in-process mode, you can execute ad-hoc queries directly
    -								from the console, if you provide it with proper DatabaseDescriptor.
    -								These queries are executed from the Editor pane which features:
    -							</p>
    -							<ul>
    -								<li>SQL editing within the console.</li>
    -								<li>Incremental search on tables.</li>
    -								<li>Simple code completion with tables/columns/SQL keywords.</li>
    -								<li>Syntax highlighting and formatting capabilities.</li>
    -								<li>Results shown in one or several tabs.</li>
    -								<li>Easy analysis of Logger output by copy/pasting/running queries in the Editor.</li>
    -							</ul>
    -   							<div class="screenshot">
    -								<img class="screenshot" src="&lt;?=$root?&gt;/img/jooq-console-02.png" alt="jOOQ Console example"/>
    -							</div>
    -
    -                            <h3>"Headless" mode</h3>
    -							<p>
    -								In J2EE or other server/client environments, you may not be able
    -								to run the console in the same process as your application. You
    -								can then run the jOOQ Console in "headless" mode. In addition to
    -								the previously documented settings, you'll have to start a
    -								debugger server in your application process, that the console can
    -								connect to:
    -							</p>
    -
    -</html><java>// Create a new RemoteDebuggerServer in your application that listens to
    -// incoming connections on a given port
    -SERVER = new RemoteDebuggerServer(DEBUGGER_PORT);</java><html>
    -
    -							<p>
    -								Now start your application along with the debugger server
    -								and launch the console with this command:
    -							</p>
    -
    -</html><config>java -jar jooq-console-2.1.0.jar [host] [port]</config><html>
    -
    -							<p>
    -								Depending on your distribution, you may have to manually add
    -								rsyntaxtextarea-1.5.0.jar and jOOQ artefacts on your classpath.
    -							</p>
    -						</html></content>
    -					</section>
    -
    -
    -					<section id="OracleHints">
    -						<title>Adding Oracle hints to queries</title>
    -						<content><html>
    -							<h3>How to embed Oracle hints in SELECT</h3>
    -							<p>If you are closely coupling your application to an Oracle (or CUBRID) database,
    -								you might need to be able to pass hints of the form /*+HINT*/ with
    -								your SQL statements to the Oracle database. For example: </p>
    -</html><sql>SELECT /*+ALL_ROWS*/ FIRST_NAME, LAST_NAME
    -  FROM T_AUTHOR</sql><html>
    -
    -  							<p>This can be done in jOOQ using the .hint() clause in your SELECT statement: </p>
    -</html><java>create.select(FIRST_NAME, LAST_NAME)
    -      .hint("/*+ALL_ROWS*/")
    -      .from(T_AUTHOR);</java><html>
    -
    -							<p>Note that you can pass any string in the .hint() clause. If you use
    -								that clause, the passed string will always be put in between the
    -								SELECT [DISTINCT] keywords and the actual projection list </p>
    -						</html></content>
    -					</section>
    -
    -
    -					<section id="CONNECTBY">
    -						<title>The Oracle CONNECT BY clause</title>
    -						<content><html>
    -							<h3>CONNECT BY .. STARTS WITH</h3>
    -							<p>If you are closely coupling your application to an Oracle (or CUBRID) database,
    -								you can take advantage of some Oracle-specific features, such as the
    -								CONNECT BY clause, used for hierarchical queries. The formal syntax
    -								definition is as follows: </p>
    -
    -</html><sql>--   SELECT ..
    ---     FROM ..
    ---    WHERE ..
    - CONNECT BY [NOCYCLE] condition [AND condition, ...] [START WITH condition]
    --- GROUP BY ..</sql><html>
    -							<p>This can be done in jOOQ using the .connectBy(Condition) clauses in your SELECT statement: </p>
    -</html><java>// Some Oracle-specific features are only available
    -// from the OracleFactory
    -OracleFactory create = new OracleFactory(connection);
    -
    -// Get a table with elements 1, 2, 3, 4, 5
    -create.select(create.rownum())
    -      .connectBy(create.level().lessOrEqual(5))
    -      .fetch();</java><html>
    -
    -							<p>Here's a more complex example where you can recursively fetch
    -								directories in your database, and concatenate them to a path:</p>
    -</html><java><![CDATA[ OracleFactory ora = new OracleFactory(connection);
    -
    - List<?> paths =
    - ora.select(ora.sysConnectByPath(DIRECTORY.NAME, "/").substring(2))
    -    .from(DIRECTORY)
    -    .connectBy(ora.prior(DIRECTORY.ID).equal(DIRECTORY.PARENT_ID))
    -    .startWith(DIRECTORY.PARENT_ID.isNull())
    -    .orderBy(ora.literal(1))
    -    .fetch(0);]]></java><html>
    -
    -    						<p>The output might then look like this</p>
    -</html><text>+------------------------------------------------+
    -|substring                                       |
    -+------------------------------------------------+
    -|C:                                              |
    -|C:/eclipse                                      |
    -|C:/eclipse/configuration                        |
    -|C:/eclipse/dropins                              |
    -|C:/eclipse/eclipse.exe                          |
    -+------------------------------------------------+
    -|...21 record(s) truncated...
    -</text></content>
    -					</section>
    -
    -
    -				    <section id="PIVOT">
    -				    	<title>The Oracle 11g PIVOT clause</title>
    -						<content><html>
    -							<h3>PIVOT (aggregate FOR column IN (columns))</h3>
    -							<p>If you are closely coupling your application to an Oracle database,
    -								you can take advantage of some Oracle-specific features, such as the
    -								PIVOT clause, used for statistical analyses. The formal syntax
    -								definition is as follows: </p>
    -</html><sql>-- SELECT ..
    -     FROM table PIVOT (aggregateFunction [, aggregateFunction] FOR column IN (expression [, expression]))
    ---  WHERE ..</sql><html>
    -
    -							<p>
    -								The PIVOT clause is available from the
    -								<reference class="org.jooq.Table"/>
    -								type, as pivoting is done directly on a table.
    -								Currently, only Oracle's PIVOT clause is supported. Support for SQL Server's
    -								PIVOT clause will be added later. Also, jOOQ may simulate PIVOT for other
    -								dialects in the future.
    -							</p>
    -						</html></content>
    -				    </section>
    -
    -
    -				    <section id="DIVISION">
    -				    	<title>jOOQ's relational division syntax</title>
    -						<content><html>
    -							<h3>Relational division</h3>
    -							<p>
    -							    There is one operation in relational algebra that is not given
    -							    a lot of attention, because it is rarely used in real-world
    -							    applications. It is the relational division, the opposite operation
    -							    of the cross product (or, relational multiplication).
    -								The following is an approximate definition of a relational division:
    -							</p>
    -
    -</html><config>Assume the following cross join / cartesian product
    -C = A × B
    -
    -Then it can be said that
    -A = C ÷ B
    -B = C ÷ A</config><html>
    -
    -
    -							<p>
    -							   With jOOQ, you can simplify using relational divisions
    -							   by using the following syntax:
    -							</p>
    -
    -</html><java>C.divideBy(B).on(C.ID.equal(B.C_ID)).returning(C.TEXT)</java><html>
    -
    -							<p>The above roughly translates to</p>
    -
    -</html><sql>SELECT DISTINCT C.TEXT FROM C "c1"
    -WHERE NOT EXISTS (
    -  SELECT 1 FROM B
    -  WHERE NOT EXISTS (
    -    SELECT 1 FROM C "c2"
    -    WHERE "c2".TEXT = "c1".TEXT
    -    AND "c2".ID = B.C_ID
    -  )
    -)</sql><html>
    -
    -							<p>
    -								Or in plain text: Find those TEXT values in C
    -								whose ID's correspond to all ID's in B. Note
    -								that from the above SQL statement, it is immediately
    -								clear that proper indexing is of the essence.
    -								Be sure to have indexes on all columns referenced
    -								from the on(...) and returning(...) clauses.
    -							</p>
    -
    -							<p>
    -								For more information about relational division
    -								and some nice, real-life examples, see
    -							</p>
    -
    -							<ul>
    -								<li>
    -									<a href="http://en.wikipedia.org/wiki/Relational_algebra#Division" title="Wikipedia article on relational division">http://en.wikipedia.org/wiki/Relational_algebra#Division</a>
    -								</li>
    -								<li>
    -									<a href="http://www.simple-talk.com/sql/t-sql-programming/divided-we-stand-the-sql-of-relational-division/" title="A nice summary of what relational division is and how it is best implemented in SQL">http://www.simple-talk.com/sql/t-sql-programming/divided-we-stand-the-sql-of-relational-division/</a>
    -								</li>
    -							</ul>
    -						</html></content>
    -				    </section>
    -
    -
    -					<section id="Export">
    -						<title>Exporting to XML, CSV, JSON, HTML, Text</title>
    -						<content><html>
    -							<h3>Exporting with jOOQ</h3>
    -							<p>If you are using jOOQ for scripting purposes or in a slim, unlayered
    -								application server, you might be interested in using jOOQ's exporting
    -								functionality (see also importing functionality). You can export any
    -								Result&lt;Record&gt; into any of these formats: </p>
    -
    -							<h3>XML</h3>
    -							<p>Export your results as XML: </p>
    -</html><java>// Fetch books and format them as XML
    -String xml = create.selectFrom(T_BOOK).fetch().formatXML();</java><html>
    -
    -							<p>The above query will result in an XML document looking like the following one: </p>
    -</html><xml><![CDATA[<!-- Find the XSD definition on www.jooq.org: -->
    -<jooq-export:result xmlns:jooq-export="http://www.jooq.org/xsd/jooq-export-1.6.2.xsd">
    -  <fields>
    -    <field name="ID"/>
    -    <field name="AUTHOR_ID"/>
    -    <field name="TITLE"/>
    -  </fields>
    -  <records>
    -    <record>
    -      <value field="ID">1</value>
    -      <value field="AUTHOR_ID">1</value>
    -      <value field="TITLE">1984</value>
    -    </record>
    -    <record>
    -      <value field="ID">2</value>
    -      <value field="AUTHOR_ID">1</value>
    -      <value field="TITLE">Animal Farm</value>
    -    </record>
    -  </records>
    -</jooq-export:result>]]></xml><html>
    -
    -							<h3>CSV</h3>
    -							<p>Export your results as CSV: </p>
    -</html><java>// Fetch books and format them as CSV
    -String csv = create.selectFrom(T_BOOK).fetch().formatCSV();</java><html>
    -
    -							<p>The above query will result in a CSV document looking like the following one: </p>
    -</html><text>ID;AUTHOR_ID;TITLE
    -1;1;1984
    -2;1;Animal Farm</text><html>
    -
    -
    -							<h3>JSON</h3>
    -							<p>Export your results as JSON: </p>
    -
    -</html><java>// Fetch books and format them as JSON
    -String json = create.selectFrom(T_BOOK).fetch().formatJSON();</java><html>
    -							<p>The above query will result in a JSON document looking like the following one: </p>
    -</html><text>{fields:["ID","AUTHOR_ID","TITLE"],
    - records:[[1,1,"1984"],[2,1,"Animal Farm"]]}</text><html>
    -
    - 							<h3>HTML </h3>
    - 							<p>Export your results as HTML: </p>
    -</html><java>// Fetch books and format them as HTML
    -String html = create.selectFrom(T_BOOK).fetch().formatHTML();</java><html>
    -							<p>The above query will result in an HTML document looking like the following one: </p>
    -</html><xml><![CDATA[<table>
    -  <thead>
    -    <tr>
    -      <th>ID</th>
    -      <th>AUTHOR_ID</th>
    -      <th>TITLE</th>
    -    </tr>
    -  </thead>
    -  <tbody>
    -    <tr>
    -      <td>1</td>
    -      <td>1</td>
    -      <td>1984</td>
    -    </tr>
    -    <tr>
    -      <td>2</td>
    -      <td>1</td>
    -      <td>Animal Farm</td>
    -    </tr>
    -  </tbody>
    -</table>]]></xml><html>
    -
    -							<h3>Text</h3>
    -							<p>Export your results as text: </p>
    -</html><java>// Fetch books and format them as text
    -String text = create.selectFrom(T_BOOK).fetch().format();</java><html>
    -
    -							<p>The above query will result in a text document looking like the following one: </p>
    -</html><text>+---+---------+-----------+
    -| ID|AUTHOR_ID|TITLE      |
    -+---+---------+-----------+
    -|  1|        1|1984       |
    -|  2|        1|Animal Farm|
    -+---+---------+-----------+</text></content>
    -					</section>
    -
    -
    -					<section id="Import">
    -						<title>Importing data from XML, CSV</title>
    -						<content><html>
    -							<h3>Importing with jOOQ</h3>
    -							<p>If you are using jOOQ for scripting purposes or in a slim, unlayered
    -								application server, you might be interested in using jOOQ's importing
    -								functionality (see also exporting functionality). You can import data
    -								directly into a table from any of these formats: </p>
    -
    -							<h3>CSV</h3>
    -							<p>The below CSV data represents two author records that may have been
    -								exported previously, by jOOQ's exporting functionality, and then
    -								modified in Microsoft Excel or any other spreadsheet tool: </p>
    -
    -</html><text>ID;AUTHOR_ID;TITLE
    -1;1;1984
    -2;1;Animal Farm</text><html>
    -
    -							<p>With jOOQ, you can load this data using various parameters from the
    -								loader API. A simple load may look like this: </p>
    -
    -</html><java>Factory create = new Factory(connection, SQLDialect.ORACLE);
    -
    -// Load data into the T_AUTHOR table from an input stream
    -// holding the CSV data.
    -create.loadInto(T_AUTHOR)
    -      .loadCSV(inputstream)
    -      .fields(ID, AUTHOR_ID, TITLE)
    -      .execute();</java><html>
    -
    -      						<p>Here are various other examples: </p>
    -</html><java>// Ignore the AUTHOR_ID column from the CSV file when inserting
    -create.loadInto(T_AUTHOR)
    -      .loadCSV(inputstream)
    -      .fields(ID, null, TITLE)
    -      .execute();
    -
    -// Specify behaviour for duplicate records.
    -create.loadInto(T_AUTHOR)
    -
    -      // choose any of these methods
    -      .onDuplicateKeyUpdate()
    -      .onDuplicateKeyIgnore()
    -      .onDuplicateKeyError() // the default
    -
    -      .loadCSV(inputstream)
    -      .fields(ID, null, TITLE)
    -      .execute();
    -
    -// Specify behaviour when errors occur.
    -create.loadInto(T_AUTHOR)
    -
    -      // choose any of these methods
    -      .onErrorIgnore()
    -      .onErrorAbort() // the default
    -
    -      .loadCSV(inputstream)
    -      .fields(ID, null, TITLE)
    -      .execute();
    -
    -// Specify transactional behaviour where this is possible
    -// (e.g. not in container-managed transactions)
    -create.loadInto(T_AUTHOR)
    -
    -      // choose any of these methods
    -      .commitEach()
    -      .commitAfter(10)
    -      .commitAll()
    -      .commitNone() // the default
    -
    -      .loadCSV(inputstream)
    -      .fields(ID, null, TITLE)
    -      .execute();</java><html>
    -
    -							<p>Any of the above configuration methods can be combined to achieve
    -								the type of load you need. Please refer to the API's Javadoc to learn
    -								about more details. Errors that occur during the load are reported by
    -								the execute method's result: </p>
    -
    -</html><java><![CDATA[Loader<TAuthor> loader = /* .. */ .execute();
    -
    -// The number of processed rows
    -int processed = loader.processed();
    -
    -// The number of stored rows (INSERT or UPDATE)
    -int stored = loader.stored();
    -
    -// The number of ignored rows (due to errors, or duplicate rule)
    -int ignored = loader.ignored();
    -
    -// The errors that may have occurred during loading
    -List<LoaderError> errors = loader.errors();
    -LoaderError error = errors.get(0);
    -
    -// The exception that caused the error
    -DataAccessException exception = error.exception();
    -
    -// The row that caused the error
    -int rowIndex = error.rowIndex();
    -String[] row = error.row();
    -
    -// The query that caused the error
    -Query query = error.query();]]></java><html>
    -
    -							<h3>XML </h3>
    -							<p>This will be implemented soon... </p>
    -						</html></content>
    -					</section>
    -
    -
    -					<section id="Batch">
    -						<title>Using JDBC batch operations</title>
    -						<content><html>
    -							<h3>JDBC batch operations</h3>
    -							<p>With JDBC, you can easily execute several statements at once using
    -								the addBatch() method. Essentially, there are two modes in JDBC</p>
    -
    -							<ol>
    -								<li>Execute several queries without bind values</li>
    -								<li>Execute one query several times with bind values</li>
    -							</ol>
    -
    -							<p>In code, this looks like the following snippet:</p>
    -</html><java><![CDATA[// 1. several queries
    -// ------------------
    -Statement stmt = connection.createStatement();
    -stmt.addBatch("INSERT INTO author VALUES (1, 'Erich Gamma')");
    -stmt.addBatch("INSERT INTO author VALUES (2, 'Richard Helm')");
    -stmt.addBatch("INSERT INTO author VALUES (3, 'Ralph Johnson')");
    -stmt.addBatch("INSERT INTO author VALUES (4, 'John Vlissides')");
    -int[] result = stmt.executeBatch();
    -
    -// 2. a single query
    -// -----------------
    -PreparedStatement stmt = connection.prepareStatement("INSERT INTO autho VALUES (?, ?)");
    -stmt.setInt(1, 1);
    -stmt.setString(2, "Erich Gamma");
    -stmt.addBatch();
    -
    -stmt.setInt(1, 2);
    -stmt.setString(2, "Richard Helm");
    -stmt.addBatch();
    -
    -stmt.setInt(1, 3);
    -stmt.setString(2, "Ralph Johnson");
    -stmt.addBatch();
    -
    -stmt.setInt(1, 4);
    -stmt.setString(2, "John Vlissides");
    -stmt.addBatch();
    -
    -int[] result = stmt.executeBatch();]]></java><html>
    -
    -
    -							<h3>This will also be supported by jOOQ</h3>
    -							<p>jOOQ supports executing queries in batch
    -								mode as follows:</p>
    -</html><java><![CDATA[// 1. several queries
    -// ------------------
    -create.batch(
    -	create.insertInto(AUTHOR, ID, NAME).values(1, "Erich Gamma"),
    -	create.insertInto(AUTHOR, ID, NAME).values(2, "Richard Helm"),
    -	create.insertInto(AUTHOR, ID, NAME).values(3, "Ralph Johnson"),
    -	create.insertInto(AUTHOR, ID, NAME).values(4, "John Vlissides"))
    -.execute();
    -
    -// 2. a single query
    -// -----------------
    -create.batch(create.insertInto(AUTHOR, ID, NAME).values("?", "?"))
    -	  .bind(1, "Erich Gamma")
    -	  .bind(2, "Richard Helm")
    -	  .bind(3, "Ralph Johnson")
    -	  .bind(4, "John Vlissides")
    -	  .execute();]]></java></content>
    -					</section>
    -				</sections>
    -			</section>
    -		</sections>
    -	</section>
    -</manual>
    diff --git a/jOOQ-website/src/main/resources/opensans.xml b/jOOQ-website/src/main/resources/opensans.xml
    deleted file mode 100644
    index d36f352cd8..0000000000
    --- a/jOOQ-website/src/main/resources/opensans.xml
    +++ /dev/null
    @@ -1 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>OpenSans-Light</font-name><full-name>Open Sans Light</full-name><family-name>Open Sans</family-name><embed/><cap-height>713</cap-height><x-height>530</x-height><ascender>759</ascender><descender>-240</descender><bbox><left>-520</left><bottom>-269</bottom><right>1140</right><top>1047</top></bbox><flags>33</flags><stemv>0</stemv><italicangle>0</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="3" ue="72" us="32"/><bf gi="918" ue="73" us="73"/><bf gi="45" ue="126" us="74"/><bf gi="98" ue="203" us="160"/><bf gi="919" ue="207" us="204"/><bf gi="146" ue="295" us="208"/><bf gi="923" ue="296" us="296"/><bf gi="235" ue="297" us="297"/><bf gi="924" ue="298" us="298"/><bf gi="237" ue="299" us="299"/><bf gi="925" ue="300" us="300"/><bf gi="239" ue="301" us="301"/><bf gi="926" ue="302" us="302"/><bf gi="241" ue="303" us="303"/><bf gi="927" ue="304" us="304"/><bf gi="243" ue="305" us="305"/><bf gi="928" ue="306" us="306"/><bf gi="245" ue="353" us="307"/><bf gi="911" ue="355" us="354"/><bf gi="294" ue="383" us="356"/><bf gi="322" ue="402" us="402"/><bf gi="607" ue="417" us="416"/><bf gi="609" ue="432" us="431"/><bf gi="593" ue="496" us="496"/><bf gi="323" ue="511" us="506"/><bf gi="329" ue="537" us="536"/><bf gi="292" ue="539" us="538"/><bf gi="567" ue="567" us="567"/><bf gi="594" ue="700" us="700"/><bf gi="331" ue="711" us="710"/><bf gi="333" ue="713" us="713"/><bf gi="334" ue="733" us="728"/><bf gi="603" ue="755" us="755"/><bf gi="611" ue="769" us="768"/><bf gi="613" ue="771" us="771"/><bf gi="614" ue="777" us="777"/><bf gi="886" ue="783" us="783"/><bf gi="615" ue="803" us="803"/><bf gi="340" ue="905" us="900"/><bf gi="929" ue="906" us="906"/><bf gi="347" ue="908" us="908"/><bf gi="348" ue="920" us="910"/><bf gi="930" ue="921" us="921"/><bf gi="360" ue="929" us="922"/><bf gi="368" ue="937" us="931"/><bf gi="931" ue="938" us="938"/><bf gi="376" ue="974" us="939"/><bf gi="595" ue="978" us="977"/><bf gi="597" ue="982" us="982"/><bf gi="616" ue="1024" us="1024"/><bf gi="412" ue="1029" us="1025"/><bf gi="932" ue="1031" us="1030"/><bf gi="419" ue="1036" us="1032"/><bf gi="617" ue="1037" us="1037"/><bf gi="424" ue="1103" us="1038"/><bf gi="618" ue="1104" us="1104"/><bf gi="490" ue="1116" us="1105"/><bf gi="619" ue="1117" us="1117"/><bf gi="502" ue="1119" us="1118"/><bf gi="620" ue="1158" us="1120"/><bf gi="659" ue="1167" us="1160"/><bf gi="504" ue="1169" us="1168"/><bf gi="667" ue="1215" us="1170"/><bf gi="934" ue="1216" us="1216"/><bf gi="714" ue="1230" us="1217"/><bf gi="935" ue="1231" us="1231"/><bf gi="729" ue="1299" us="1232"/><bf gi="600" ue="7681" us="7680"/><bf gi="598" ue="7743" us="7742"/><bf gi="506" ue="7813" us="7808"/><bf gi="797" ue="7879" us="7840"/><bf gi="936" ue="7880" us="7880"/><bf gi="838" ue="7881" us="7881"/><bf gi="937" ue="7882" us="7882"/><bf gi="840" ue="7921" us="7883"/><bf gi="512" ue="7923" us="7922"/><bf gi="879" ue="7929" us="7924"/><bf gi="602" ue="8013" us="8013"/><bf gi="578" ue="8203" us="8192"/><bf gi="514" ue="8213" us="8211"/><bf gi="517" ue="8222" us="8215"/><bf gi="525" ue="8226" us="8224"/><bf gi="528" ue="8230" us="8230"/><bf gi="529" ue="8240" us="8240"/><bf gi="530" ue="8243" us="8242"/><bf gi="532" ue="8250" us="8249"/><bf gi="534" ue="8252" us="8252"/><bf gi="535" ue="8260" us="8260"/><bf gi="571" ue="8304" us="8304"/><bf gi="572" ue="8313" us="8308"/><bf gi="536" ue="8319" us="8319"/><bf gi="537" ue="8356" us="8355"/><bf gi="539" ue="8359" us="8359"/><bf gi="885" ue="8363" us="8363"/><bf gi="540" ue="8364" us="8364"/><bf gi="541" ue="8453" us="8453"/><bf gi="542" ue="8467" us="8467"/><bf gi="543" ue="8470" us="8470"/><bf gi="910" ue="8480" us="8480"/><bf gi="544" ue="8482" us="8482"/><bf gi="545" ue="8486" us="8486"/><bf gi="546" ue="8494" us="8494"/><bf gi="547" ue="8542" us="8539"/><bf gi="551" ue="8706" us="8706"/><bf gi="552" ue="8710" us="8710"/><bf gi="553" ue="8719" us="8719"/><bf gi="554" ue="8722" us="8721"/><bf gi="556" ue="8730" us="8730"/><bf gi="557" ue="8734" us="8734"/><bf gi="558" ue="8747" us="8747"/><bf gi="559" ue="8776" us="8776"/><bf gi="560" ue="8800" us="8800"/><bf gi="561" ue="8805" us="8804"/><bf gi="563" ue="9674" us="9674"/><bf gi="909" ue="64256" us="64256"/><bf gi="564" ue="64258" us="64257"/><bf gi="605" ue="64260" us="64259"/><bf gi="590" ue="65279" us="65279"/><bf gi="591" ue="65533" us="65532"/><bf gi="0" ue="65535" us="65535"/></bfranges><cid-widths start-index="0"><wx w="600"/><wx w="0"/><wx w="509"/><wx w="259"/><wx w="240"/><wx w="353"/><wx w="645"/><wx w="570"/><wx w="807"/><wx w="712"/><wx w="191"/><wx w="271"/><wx w="271"/><wx w="550"/><wx w="570"/><wx w="214"/><wx w="321"/><wx w="237"/><wx w="340"/><wx w="570"/><wx w="570"/><wx w="570"/><wx w="570"/><wx w="570"/><wx w="570"/><wx w="570"/><wx w="570"/><wx w="570"/><wx w="570"/><wx w="237"/><wx w="237"/><wx w="570"/><wx w="570"/><wx w="570"/><wx w="420"/><wx w="886"/><wx w="600"/><wx w="626"/><wx w="621"/><wx w="706"/><wx w="551"/><wx w="501"/><wx w="723"/><wx w="719"/><wx w="304"/><wx w="247"/><wx w="581"/><wx w="513"/><wx w="862"/><wx w="721"/><wx w="764"/><wx w="584"/><wx w="764"/><wx w="594"/><wx w="544"/><wx w="523"/><wx w="719"/><wx w="577"/><wx w="892"/><wx w="538"/><wx w="527"/><wx w="576"/><wx w="318"/><wx w="340"/><wx w="318"/><wx w="570"/><wx w="411"/><wx w="577"/><wx w="529"/><wx w="595"/><wx w="475"/><wx w="595"/><wx w="548"/><wx w="299"/><wx w="522"/><wx w="589"/><wx w="226"/><wx w="226"/><wx w="483"/><wx w="226"/><wx w="882"/><wx w="589"/><wx w="585"/><wx w="595"/><wx w="595"/><wx w="389"/><wx w="465"/><wx w="334"/><wx w="589"/><wx w="458"/><wx w="723"/><wx w="498"/><wx w="458"/><wx w="460"/><wx w="353"/><wx w="541"/><wx w="353"/><wx w="570"/><wx w="259"/><wx w="240"/><wx w="570"/><wx w="570"/><wx w="570"/><wx w="570"/><wx w="541"/><wx w="516"/><wx w="577"/><wx w="832"/><wx w="334"/><wx w="432"/><wx w="570"/><wx w="321"/><wx w="832"/><wx w="500"/><wx w="428"/><wx w="570"/><wx w="335"/><wx w="335"/><wx w="577"/><wx w="596"/><wx w="654"/><wx w="237"/><wx w="205"/><wx w="335"/><wx w="360"/><wx w="432"/><wx w="740"/><wx w="740"/><wx w="740"/><wx w="420"/><wx w="600"/><wx w="600"/><wx w="600"/><wx w="600"/><wx w="600"/><wx w="600"/><wx w="807"/><wx w="621"/><wx w="551"/><wx w="551"/><wx w="551"/><wx w="551"/><wx w="304"/><wx w="304"/><wx w="304"/><wx w="304"/><wx w="715"/><wx w="721"/><wx w="764"/><wx w="764"/><wx w="764"/><wx w="764"/><wx w="764"/><wx w="570"/><wx w="764"/><wx w="719"/><wx w="719"/><wx w="719"/><wx w="719"/><wx w="527"/><wx w="584"/><wx w="583"/><wx w="529"/><wx w="529"/><wx w="529"/><wx w="529"/><wx w="529"/><wx w="529"/><wx w="845"/><wx w="475"/><wx w="548"/><wx w="548"/><wx w="548"/><wx w="548"/><wx w="226"/><wx w="226"/><wx w="226"/><wx w="226"/><wx w="573"/><wx w="589"/><wx w="585"/><wx w="585"/><wx w="585"/><wx w="585"/><wx w="585"/><wx w="570"/><wx w="585"/><wx w="589"/><wx w="589"/><wx w="589"/><wx w="589"/><wx w="458"/><wx w="595"/><wx w="458"/><wx w="600"/><wx w="529"/><wx w="600"/><wx w="529"/><wx w="600"/><wx w="529"/><wx w="621"/><wx w="475"/><wx w="621"/><wx w="475"/><wx w="621"/><wx w="475"/><wx w="621"/><wx w="475"/><wx w="706"/><wx w="595"/><wx w="715"/><wx w="595"/><wx w="551"/><wx w="548"/><wx w="551"/><wx w="548"/><wx w="551"/><wx w="548"/><wx w="551"/><wx w="548"/><wx w="551"/><wx w="548"/><wx w="723"/><wx w="522"/><wx w="723"/><wx w="522"/><wx w="723"/><wx w="522"/><wx w="723"/><wx w="522"/><wx w="719"/><wx w="589"/><wx w="719"/><wx w="589"/><wx w="304"/><wx w="226"/><wx w="304"/><wx w="226"/><wx w="304"/><wx w="226"/><wx w="304"/><wx w="226"/><wx w="304"/><wx w="226"/><wx w="550"/><wx w="452"/><wx w="247"/><wx w="226"/><wx w="581"/><wx w="483"/><wx w="483"/><wx w="513"/><wx w="226"/><wx w="513"/><wx w="226"/><wx w="513"/><wx w="226"/><wx w="513"/><wx w="232"/><wx w="513"/><wx w="226"/><wx w="721"/><wx w="589"/><wx w="721"/><wx w="589"/><wx w="721"/><wx w="589"/><wx w="626"/><wx w="721"/><wx w="589"/><wx w="764"/><wx w="585"/><wx w="764"/><wx w="585"/><wx w="764"/><wx w="585"/><wx w="897"/><wx w="948"/><wx w="594"/><wx w="389"/><wx w="594"/><wx w="389"/><wx w="594"/><wx w="389"/><wx w="544"/><wx w="465"/><wx w="544"/><wx w="465"/><wx w="544"/><wx w="465"/><wx w="544"/><wx w="465"/><wx w="523"/><wx w="334"/><wx w="523"/><wx w="334"/><wx w="523"/><wx w="334"/><wx w="719"/><wx w="589"/><wx w="719"/><wx w="589"/><wx w="719"/><wx w="589"/><wx w="719"/><wx w="589"/><wx w="719"/><wx w="589"/><wx w="719"/><wx w="589"/><wx w="892"/><wx w="723"/><wx w="527"/><wx w="458"/><wx w="527"/><wx w="576"/><wx w="460"/><wx w="576"/><wx w="460"/><wx w="576"/><wx w="460"/><wx w="306"/><wx w="570"/><wx w="600"/><wx w="529"/><wx w="807"/><wx w="845"/><wx w="764"/><wx w="585"/><wx w="544"/><wx w="465"/><wx w="577"/><wx w="577"/><wx w="557"/><wx w="577"/><wx w="235"/><wx w="577"/><wx w="173"/><wx w="577"/><wx w="577"/><wx w="577"/><wx w="577"/><wx w="600"/><wx w="237"/><wx w="596"/><wx w="763"/><wx w="391"/><wx w="770"/><wx w="645"/><wx w="785"/><wx w="307"/><wx w="600"/><wx w="626"/><wx w="501"/><wx w="570"/><wx w="551"/><wx w="576"/><wx w="719"/><wx w="764"/><wx w="304"/><wx w="581"/><wx w="600"/><wx w="862"/><wx w="721"/><wx w="530"/><wx w="764"/><wx w="713"/><wx w="584"/><wx w="550"/><wx w="523"/><wx w="527"/><wx w="762"/><wx w="538"/><wx w="764"/><wx w="774"/><wx w="304"/><wx w="527"/><wx w="589"/><wx w="453"/><wx w="589"/><wx w="307"/><wx w="595"/><wx w="589"/><wx w="607"/><wx w="479"/><wx w="581"/><wx w="453"/><wx w="466"/><wx w="589"/><wx w="569"/><wx w="307"/><wx w="483"/><wx w="502"/><wx w="596"/><wx w="513"/><wx w="458"/><wx w="585"/><wx w="611"/><wx w="583"/><wx w="475"/><wx w="586"/><wx w="445"/><wx w="595"/><wx w="678"/><wx w="514"/><wx w="721"/><wx w="733"/><wx w="307"/><wx w="595"/><wx w="585"/><wx w="595"/><wx w="733"/><wx w="551"/><wx w="695"/><wx w="501"/><wx w="621"/><wx w="544"/><wx w="304"/><wx w="304"/><wx w="247"/><wx w="915"/><wx w="946"/><wx w="698"/><wx w="571"/><wx w="587"/><wx w="713"/><wx w="600"/><wx w="595"/><wx w="626"/><wx w="501"/><wx w="652"/><wx w="551"/><wx w="779"/><wx w="559"/><wx w="721"/><wx w="721"/><wx w="571"/><wx w="681"/><wx w="862"/><wx w="719"/><wx w="764"/><wx w="713"/><wx w="584"/><wx w="621"/><wx w="523"/><wx w="587"/><wx w="762"/><wx w="538"/><wx w="719"/><wx w="669"/><wx w="1005"/><wx w="1011"/><wx w="658"/><wx w="814"/><wx w="595"/><wx w="618"/><wx w="1027"/><wx w="586"/><wx w="529"/><wx w="574"/><wx w="565"/><wx w="420"/><wx w="545"/><wx w="548"/><wx w="665"/><wx w="452"/><wx w="600"/><wx w="600"/><wx w="458"/><wx w="544"/><wx w="674"/><wx w="610"/><wx w="585"/><wx w="601"/><wx w="595"/><wx w="475"/><wx w="445"/><wx w="458"/><wx w="669"/><wx w="498"/><wx w="597"/><wx w="580"/><wx w="852"/><wx w="857"/><wx w="645"/><wx w="723"/><wx w="568"/><wx w="491"/><wx w="797"/><wx w="528"/><wx w="548"/><wx w="589"/><wx w="420"/><wx w="484"/><wx w="465"/><wx w="226"/><wx w="226"/><wx w="226"/><wx w="808"/><wx w="858"/><wx w="589"/><wx w="458"/><wx w="458"/><wx w="601"/><wx w="501"/><wx w="420"/><wx w="892"/><wx w="723"/><wx w="892"/><wx w="723"/><wx w="892"/><wx w="723"/><wx w="527"/><wx w="458"/><wx w="500"/><wx w="1000"/><wx w="1000"/><wx w="411"/><wx w="145"/><wx w="145"/><wx w="220"/><wx w="145"/><wx w="299"/><wx w="299"/><wx w="375"/><wx w="491"/><wx w="491"/><wx w="375"/><wx w="715"/><wx w="1138"/><wx w="191"/><wx w="353"/><wx w="255"/><wx w="255"/><wx w="448"/><wx w="120"/><wx w="374"/><wx w="570"/><wx w="570"/><wx w="732"/><wx w="570"/><wx w="803"/><wx w="500"/><wx w="1012"/><wx w="725"/><wx w="774"/><wx w="619"/><wx w="740"/><wx w="740"/><wx w="740"/><wx w="740"/><wx w="570"/><wx w="570"/><wx w="732"/><wx w="621"/><wx w="570"/><wx w="548"/><wx w="700"/><wx w="363"/><wx w="570"/><wx w="570"/><wx w="570"/><wx w="570"/><wx w="580"/><wx w="525"/><wx w="525"/><wx w="577"/><wx w="226"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="335"/><wx w="335"/><wx w="335"/><wx w="335"/><wx w="335"/><wx w="335"/><wx w="335"/><wx w="500"/><wx w="1000"/><wx w="500"/><wx w="1000"/><wx w="333"/><wx w="250"/><wx w="166"/><wx w="559"/><wx w="258"/><wx w="200"/><wx w="100"/><wx w="0"/><wx w="0"/><wx w="1000"/><wx w="1000"/><wx w="226"/><wx w="145"/><wx w="589"/><wx w="539"/><wx w="774"/><wx w="862"/><wx w="882"/><wx w="600"/><wx w="529"/><wx w="796"/><wx w="333"/><wx w="399"/><wx w="826"/><wx w="826"/><wx w="764"/><wx w="585"/><wx w="730"/><wx w="616"/><wx w="0"/><wx w="0"/><wx w="0"/><wx w="0"/><wx w="0"/><wx w="551"/><wx w="721"/><wx w="548"/><wx w="600"/><wx w="970"/><wx w="755"/><wx w="672"/><wx w="605"/><wx w="911"/><wx w="726"/><wx w="627"/><wx w="499"/><wx w="860"/><wx w="681"/><wx w="692"/><wx w="605"/><wx w="941"/><wx w="798"/><wx w="559"/><wx w="452"/><wx w="764"/><wx w="721"/><wx w="764"/><wx w="585"/><wx w="590"/><wx w="475"/><wx w="590"/><wx w="475"/><wx w="1140"/><wx w="1021"/><wx w="793"/><wx w="605"/><wx w="970"/><wx w="766"/><wx w="970"/><wx w="755"/><wx w="621"/><wx w="475"/><wx w="604"/><wx w="557"/><wx w="577"/><wx w="577"/><wx w="577"/><wx w="988"/><wx w="956"/><wx w="721"/><wx w="600"/><wx w="595"/><wx w="568"/><wx w="584"/><wx w="595"/><wx w="501"/><wx w="420"/><wx w="630"/><wx w="512"/><wx w="801"/><wx w="688"/><wx w="559"/><wx w="452"/><wx w="624"/><wx w="482"/><wx w="581"/><wx w="458"/><wx w="581"/><wx w="483"/><wx w="644"/><wx w="545"/><wx w="724"/><wx w="610"/><wx w="782"/><wx w="698"/><wx w="1047"/><wx w="848"/><wx w="764"/><wx w="604"/><wx w="621"/><wx w="475"/><wx w="523"/><wx w="445"/><wx w="527"/><wx w="458"/><wx w="527"/><wx w="458"/><wx w="571"/><wx w="505"/><wx w="839"/><wx w="688"/><wx w="669"/><wx w="580"/><wx w="669"/><wx w="580"/><wx w="660"/><wx w="569"/><wx w="798"/><wx w="636"/><wx w="798"/><wx w="636"/><wx w="304"/><wx w="779"/><wx w="665"/><wx w="654"/><wx w="530"/><wx w="681"/><wx w="544"/><wx w="719"/><wx w="610"/><wx w="719"/><wx w="610"/><wx w="669"/><wx w="580"/><wx w="862"/><wx w="674"/><wx w="304"/><wx w="600"/><wx w="529"/><wx w="600"/><wx w="529"/><wx w="807"/><wx w="845"/><wx w="551"/><wx w="548"/><wx w="704"/><wx w="548"/><wx w="704"/><wx w="548"/><wx w="779"/><wx w="665"/><wx w="559"/><wx w="452"/><wx w="562"/><wx w="459"/><wx w="721"/><wx w="600"/><wx w="721"/><wx w="600"/><wx w="764"/><wx w="585"/><wx w="764"/><wx w="585"/><wx w="764"/><wx w="585"/><wx w="618"/><wx w="491"/><wx w="587"/><wx w="458"/><wx w="587"/><wx w="458"/><wx w="587"/><wx w="458"/><wx w="669"/><wx w="580"/><wx w="501"/><wx w="420"/><wx w="814"/><wx w="723"/><wx w="501"/><wx w="420"/><wx w="582"/><wx w="505"/><wx w="538"/><wx w="498"/><wx w="595"/><wx w="595"/><wx w="858"/><wx w="863"/><wx w="866"/><wx w="754"/><wx w="578"/><wx w="479"/><wx w="931"/><wx w="813"/><wx w="987"/><wx w="879"/><wx w="733"/><wx w="613"/><wx w="676"/><wx w="617"/><wx w="565"/><wx w="453"/><wx w="681"/><wx w="544"/><wx w="600"/><wx w="529"/><wx w="600"/><wx w="529"/><wx w="600"/><wx w="529"/><wx w="600"/><wx w="529"/><wx w="600"/><wx w="529"/><wx w="600"/><wx w="529"/><wx w="600"/><wx w="529"/><wx w="600"/><wx w="529"/><wx w="600"/><wx w="529"/><wx w="600"/><wx w="529"/><wx w="600"/><wx w="529"/><wx w="600"/><wx w="529"/><wx w="551"/><wx w="548"/><wx w="551"/><wx w="548"/><wx w="551"/><wx w="548"/><wx w="551"/><wx w="548"/><wx w="551"/><wx w="548"/><wx w="551"/><wx w="548"/><wx w="551"/><wx w="548"/><wx w="551"/><wx w="548"/><wx w="304"/><wx w="226"/><wx w="304"/><wx w="226"/><wx w="764"/><wx w="585"/><wx w="764"/><wx w="585"/><wx w="764"/><wx w="585"/><wx w="764"/><wx w="585"/><wx w="764"/><wx w="585"/><wx w="764"/><wx w="585"/><wx w="764"/><wx w="585"/><wx w="764"/><wx w="585"/><wx w="764"/><wx w="585"/><wx w="764"/><wx w="585"/><wx w="764"/><wx w="585"/><wx w="764"/><wx w="585"/><wx w="719"/><wx w="589"/><wx w="719"/><wx w="589"/><wx w="730"/><wx w="616"/><wx w="730"/><wx w="616"/><wx w="730"/><wx w="616"/><wx w="730"/><wx w="616"/><wx w="730"/><wx w="616"/><wx w="527"/><wx w="458"/><wx w="527"/><wx w="458"/><wx w="527"/><wx w="458"/><wx w="595"/><wx w="0"/><wx w="0"/><wx w="0"/><wx w="0"/><wx w="0"/><wx w="0"/><wx w="0"/><wx w="0"/><wx w="0"/><wx w="204"/><wx w="205"/><wx w="205"/><wx w="363"/><wx w="570"/><wx w="350"/><wx w="497"/><wx w="514"/><wx w="566"/><wx w="548"/><wx w="570"/><wx w="521"/><wx w="570"/><wx w="570"/><wx w="600"/><wx w="757"/><wx w="523"/><wx w="334"/><wx w="595"/><wx w="595"/><wx w="595"/><wx w="595"/><wx w="595"/><wx w="251"/><wx w="251"/><wx w="251"/><wx w="251"/><wx w="251"/><wx w="251"/><wx w="251"/><wx w="251"/><wx w="251"/><wx w="251"/><wx w="499"/><wx w="293"/><wx w="251"/><wx w="251"/><wx w="251"/><wx w="251"/><wx w="251"/><wx w="251"/><wx w="251"/><wx w="251"/></cid-widths></multibyte-extras><kerning kpx1="1100"><pair kern="-49" kpx2="1098"/><pair kern="-20" kpx2="1218"/><pair kern="-40" kpx2="1228"/><pair kern="-20" kpx2="1093"/><pair kern="-40" kpx2="1095"/><pair kern="-49" kpx2="1090"/><pair kern="-29" kpx2="1091"/><pair kern="-29" kpx2="1118"/><pair kern="-49" kpx2="1295"/><pair kern="-20" kpx2="1175"/><pair kern="-20" kpx2="1245"/><pair kern="-60" kpx2="8217"/><pair kern="-49" kpx2="1287"/><pair kern="-60" kpx2="8221"/><pair kern="-49" kpx2="1285"/><pair kern="-60" kpx2="34"/><pair kern="-49" kpx2="1185"/><pair kern="-60" kpx2="39"/><pair kern="-20" kpx2="1249"/><pair kern="-29" kpx2="1263"/><pair kern="-29" kpx2="1199"/><pair kern="-49" kpx2="1197"/><pair kern="-20" kpx2="1121"/><pair kern="-20" kpx2="1151"/><pair kern="-20" kpx2="1203"/><pair kern="-40" kpx2="1269"/><pair kern="-29" kpx2="1201"/><pair kern="-29" kpx2="1267"/><pair kern="-40" kpx2="1207"/><pair kern="-29" kpx2="1265"/><pair kern="-49" kpx2="1205"/><pair kern="-20" kpx2="1143"/><pair kern="-20" kpx2="1279"/><pair kern="-20" kpx2="1141"/><pair kern="-20" kpx2="1277"/><pair kern="-40" kpx2="1209"/><pair kern="-20" kpx2="1215"/><pair kern="-20" kpx2="1078"/><pair kern="-20" kpx2="1213"/></kerning><kerning kpx1="1101"><pair kern="-9" kpx2="1098"/><pair kern="-20" kpx2="1218"/><pair kern="-20" kpx2="1093"/><pair kern="-9" kpx2="1228"/><pair kern="-9" kpx2="1095"/><pair kern="-9" kpx2="1090"/><pair kern="-9" kpx2="1091"/><pair kern="-9" kpx2="1118"/><pair kern="-9" kpx2="1295"/><pair kern="-20" kpx2="1175"/><pair kern="-20" kpx2="1245"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="1287"/><pair kern="-9" kpx2="8221"/><pair kern="-9" kpx2="1285"/><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="1185"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="1263"/><pair kern="-9" kpx2="1197"/><pair kern="-20" kpx2="1203"/><pair kern="-9" kpx2="1269"/><pair kern="-9" kpx2="1207"/><pair kern="-9" kpx2="1267"/><pair kern="-9" kpx2="1205"/><pair kern="-9" kpx2="1265"/><pair kern="-20" kpx2="1279"/><pair kern="-20" kpx2="1277"/><pair kern="-9" kpx2="1209"/><pair kern="-20" kpx2="1078"/></kerning><kerning kpx1="1102"><pair kern="-9" kpx2="1098"/><pair kern="-20" kpx2="1218"/><pair kern="-20" kpx2="1093"/><pair kern="-9" kpx2="1228"/><pair kern="-9" kpx2="1095"/><pair kern="-9" kpx2="1090"/><pair kern="-9" kpx2="1091"/><pair kern="-9" kpx2="1118"/><pair kern="-9" kpx2="1295"/><pair kern="-20" kpx2="1175"/><pair kern="-20" kpx2="1245"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="1287"/><pair kern="-9" kpx2="8221"/><pair kern="-9" kpx2="1285"/><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="1185"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="1263"/><pair kern="-9" kpx2="1197"/><pair kern="-20" kpx2="1203"/><pair kern="-9" kpx2="1269"/><pair kern="-9" kpx2="1207"/><pair kern="-9" kpx2="1267"/><pair kern="-9" kpx2="1205"/><pair kern="-9" kpx2="1265"/><pair kern="-20" kpx2="1279"/><pair kern="-20" kpx2="1277"/><pair kern="-9" kpx2="1209"/><pair kern="-20" kpx2="1078"/></kerning><kerning kpx1="1097"><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="8221"/></kerning><kerning kpx1="1098"><pair kern="-49" kpx2="1098"/><pair kern="-20" kpx2="1218"/><pair kern="-40" kpx2="1228"/><pair kern="-20" kpx2="1093"/><pair kern="-40" kpx2="1095"/><pair kern="-49" kpx2="1090"/><pair kern="-29" kpx2="1091"/><pair kern="-29" kpx2="1118"/><pair kern="-49" kpx2="1295"/><pair kern="-20" kpx2="1175"/><pair kern="-20" kpx2="1245"/><pair kern="-60" kpx2="8217"/><pair kern="-49" kpx2="1287"/><pair kern="-60" kpx2="8221"/><pair kern="-49" kpx2="1285"/><pair kern="-60" kpx2="34"/><pair kern="-49" kpx2="1185"/><pair kern="-60" kpx2="39"/><pair kern="-20" kpx2="1249"/><pair kern="-29" kpx2="1263"/><pair kern="-29" kpx2="1199"/><pair kern="-49" kpx2="1197"/><pair kern="-20" kpx2="1121"/><pair kern="-20" kpx2="1151"/><pair kern="-20" kpx2="1203"/><pair kern="-40" kpx2="1269"/><pair kern="-29" kpx2="1201"/><pair kern="-29" kpx2="1267"/><pair kern="-40" kpx2="1207"/><pair kern="-29" kpx2="1265"/><pair kern="-49" kpx2="1205"/><pair kern="-20" kpx2="1143"/><pair kern="-20" kpx2="1279"/><pair kern="-20" kpx2="1141"/><pair kern="-20" kpx2="1277"/><pair kern="-40" kpx2="1209"/><pair kern="-20" kpx2="1215"/><pair kern="-20" kpx2="1078"/><pair kern="-20" kpx2="1213"/></kerning><kerning kpx1="1092"><pair kern="-9" kpx2="1098"/><pair kern="-20" kpx2="1218"/><pair kern="-20" kpx2="1093"/><pair kern="-9" kpx2="1228"/><pair kern="-9" kpx2="1095"/><pair kern="-9" kpx2="1090"/><pair kern="-9" kpx2="1091"/><pair kern="-9" kpx2="1118"/><pair kern="-9" kpx2="1295"/><pair kern="-20" kpx2="1175"/><pair kern="-20" kpx2="1245"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="1287"/><pair kern="-9" kpx2="8221"/><pair kern="-9" kpx2="1285"/><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="1185"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="1263"/><pair kern="-9" kpx2="1197"/><pair kern="-20" kpx2="1203"/><pair kern="-9" kpx2="1269"/><pair kern="-9" kpx2="1207"/><pair kern="-9" kpx2="1267"/><pair kern="-9" kpx2="1205"/><pair kern="-9" kpx2="1265"/><pair kern="-20" kpx2="1279"/><pair kern="-20" kpx2="1277"/><pair kern="-9" kpx2="1209"/><pair kern="-20" kpx2="1078"/></kerning><kerning kpx1="1093"><pair kern="-20" kpx2="1153"/><pair kern="-20" kpx2="1092"/><pair kern="-20" kpx2="1228"/><pair kern="-20" kpx2="1297"/><pair kern="-20" kpx2="1095"/><pair kern="-20" kpx2="1089"/><pair kern="-20" kpx2="1239"/><pair kern="-20" kpx2="1293"/><pair kern="-20" kpx2="1283"/><pair kern="-20" kpx2="1108"/><pair kern="-20" kpx2="1281"/><pair kern="-20" kpx2="1105"/><pair kern="-20" kpx2="1104"/><pair kern="-20" kpx2="1255"/><pair kern="-20" kpx2="1195"/><pair kern="-20" kpx2="1193"/><pair kern="-20" kpx2="1259"/><pair kern="-20" kpx2="1257"/><pair kern="-20" kpx2="1149"/><pair kern="-20" kpx2="1269"/><pair kern="-20" kpx2="1147"/><pair kern="-20" kpx2="1086"/><pair kern="-20" kpx2="1207"/><pair kern="-20" kpx2="1145"/><pair kern="-20" kpx2="1209"/><pair kern="-20" kpx2="1139"/><pair kern="-20" kpx2="1215"/><pair kern="-20" kpx2="1077"/><pair kern="-20" kpx2="1213"/></kerning><kerning kpx1="1094"><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="8221"/></kerning><kerning kpx1="1088"><pair kern="-9" kpx2="1098"/><pair kern="-20" kpx2="1218"/><pair kern="-20" kpx2="1093"/><pair kern="-9" kpx2="1228"/><pair kern="-9" kpx2="1095"/><pair kern="-9" kpx2="1090"/><pair kern="-9" kpx2="1091"/><pair kern="-9" kpx2="1118"/><pair kern="-9" kpx2="1295"/><pair kern="-20" kpx2="1175"/><pair kern="-20" kpx2="1245"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="1287"/><pair kern="-9" kpx2="8221"/><pair kern="-9" kpx2="1285"/><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="1185"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="1263"/><pair kern="-9" kpx2="1197"/><pair kern="-20" kpx2="1203"/><pair kern="-9" kpx2="1269"/><pair kern="-9" kpx2="1207"/><pair kern="-9" kpx2="1267"/><pair kern="-9" kpx2="1205"/><pair kern="-9" kpx2="1265"/><pair kern="-20" kpx2="1279"/><pair kern="-20" kpx2="1277"/><pair kern="-9" kpx2="1209"/><pair kern="-20" kpx2="1078"/></kerning><kerning kpx1="1090"><pair kern="-9" kpx2="1153"/><pair kern="-29" kpx2="1222"/><pair kern="-29" kpx2="1299"/><pair kern="-9" kpx2="1092"/><pair kern="-9" kpx2="1297"/><pair kern="-9" kpx2="1089"/><pair kern="-20" kpx2="8211"/><pair kern="-29" kpx2="1289"/><pair kern="-9" kpx2="1239"/><pair kern="-29" kpx2="1113"/><pair kern="-20" kpx2="8213"/><pair kern="-9" kpx2="1293"/><pair kern="-20" kpx2="8212"/><pair kern="-9" kpx2="1283"/><pair kern="-9" kpx2="1108"/><pair kern="-49" kpx2="8218"/><pair kern="-9" kpx2="1281"/><pair kern="-9" kpx2="1105"/><pair kern="-49" kpx2="8222"/><pair kern="-9" kpx2="1104"/><pair kern="-9" kpx2="1255"/><pair kern="-9" kpx2="1195"/><pair kern="-29" kpx2="1127"/><pair kern="-9" kpx2="1193"/><pair kern="-9" kpx2="1259"/><pair kern="-49" kpx2="46"/><pair kern="-9" kpx2="1257"/><pair kern="-49" kpx2="44"/><pair kern="-20" kpx2="45"/><pair kern="-29" kpx2="1083"/><pair kern="-9" kpx2="1149"/><pair kern="-9" kpx2="1147"/><pair kern="-9" kpx2="1086"/><pair kern="-9" kpx2="1145"/><pair kern="-9" kpx2="1139"/><pair kern="-9" kpx2="1077"/><pair kern="-29" kpx2="1076"/></kerning><kerning kpx1="1091"><pair kern="-20" kpx2="1083"/><pair kern="-20" kpx2="1289"/><pair kern="-20" kpx2="1222"/><pair kern="-20" kpx2="1113"/><pair kern="-20" kpx2="1299"/><pair kern="-20" kpx2="1127"/><pair kern="-40" kpx2="8218"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="8222"/><pair kern="-40" kpx2="44"/><pair kern="-20" kpx2="1076"/></kerning><kerning kpx1="1116"><pair kern="-20" kpx2="1153"/><pair kern="-20" kpx2="1092"/><pair kern="-20" kpx2="1228"/><pair kern="-20" kpx2="1297"/><pair kern="-20" kpx2="1095"/><pair kern="-20" kpx2="1089"/><pair kern="-20" kpx2="1239"/><pair kern="-20" kpx2="1293"/><pair kern="-20" kpx2="1283"/><pair kern="-20" kpx2="1108"/><pair kern="-20" kpx2="1281"/><pair kern="-20" kpx2="1105"/><pair kern="-20" kpx2="1104"/><pair kern="-20" kpx2="1255"/><pair kern="-20" kpx2="1195"/><pair kern="-20" kpx2="1193"/><pair kern="-20" kpx2="1259"/><pair kern="-20" kpx2="1257"/><pair kern="-20" kpx2="1149"/><pair kern="-20" kpx2="1269"/><pair kern="-20" kpx2="1147"/><pair kern="-20" kpx2="1086"/><pair kern="-20" kpx2="1207"/><pair kern="-20" kpx2="1145"/><pair kern="-20" kpx2="1209"/><pair kern="-20" kpx2="1139"/><pair kern="-20" kpx2="1215"/><pair kern="-20" kpx2="1077"/><pair kern="-20" kpx2="1213"/></kerning><kerning kpx1="1118"><pair kern="-20" kpx2="1083"/><pair kern="-20" kpx2="1289"/><pair kern="-20" kpx2="1222"/><pair kern="-20" kpx2="1113"/><pair kern="-20" kpx2="1299"/><pair kern="-20" kpx2="1127"/><pair kern="-40" kpx2="8218"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="8222"/><pair kern="-40" kpx2="44"/><pair kern="-20" kpx2="1076"/></kerning><kerning kpx1="1113"><pair kern="-49" kpx2="1098"/><pair kern="-20" kpx2="1218"/><pair kern="-40" kpx2="1228"/><pair kern="-20" kpx2="1093"/><pair kern="-40" kpx2="1095"/><pair kern="-49" kpx2="1090"/><pair kern="-29" kpx2="1091"/><pair kern="-29" kpx2="1118"/><pair kern="-49" kpx2="1295"/><pair kern="-20" kpx2="1175"/><pair kern="-20" kpx2="1245"/><pair kern="-60" kpx2="8217"/><pair kern="-49" kpx2="1287"/><pair kern="-60" kpx2="8221"/><pair kern="-49" kpx2="1285"/><pair kern="-60" kpx2="34"/><pair kern="-49" kpx2="1185"/><pair kern="-60" kpx2="39"/><pair kern="-20" kpx2="1249"/><pair kern="-29" kpx2="1263"/><pair kern="-29" kpx2="1199"/><pair kern="-49" kpx2="1197"/><pair kern="-20" kpx2="1121"/><pair kern="-20" kpx2="1151"/><pair kern="-20" kpx2="1203"/><pair kern="-40" kpx2="1269"/><pair kern="-29" kpx2="1201"/><pair kern="-29" kpx2="1267"/><pair kern="-40" kpx2="1207"/><pair kern="-29" kpx2="1265"/><pair kern="-49" kpx2="1205"/><pair kern="-20" kpx2="1143"/><pair kern="-20" kpx2="1279"/><pair kern="-20" kpx2="1141"/><pair kern="-20" kpx2="1277"/><pair kern="-40" kpx2="1209"/><pair kern="-20" kpx2="1215"/><pair kern="-20" kpx2="1078"/><pair kern="-20" kpx2="1213"/></kerning><kerning kpx1="1115"><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-20" kpx2="1287"/><pair kern="-9" kpx2="8221"/><pair kern="-20" kpx2="1285"/></kerning><kerning kpx1="1114"><pair kern="-49" kpx2="1098"/><pair kern="-20" kpx2="1218"/><pair kern="-40" kpx2="1228"/><pair kern="-20" kpx2="1093"/><pair kern="-40" kpx2="1095"/><pair kern="-49" kpx2="1090"/><pair kern="-29" kpx2="1091"/><pair kern="-29" kpx2="1118"/><pair kern="-49" kpx2="1295"/><pair kern="-20" kpx2="1175"/><pair kern="-20" kpx2="1245"/><pair kern="-60" kpx2="8217"/><pair kern="-49" kpx2="1287"/><pair kern="-60" kpx2="8221"/><pair kern="-49" kpx2="1285"/><pair kern="-60" kpx2="34"/><pair kern="-49" kpx2="1185"/><pair kern="-60" kpx2="39"/><pair kern="-20" kpx2="1249"/><pair kern="-29" kpx2="1263"/><pair kern="-29" kpx2="1199"/><pair kern="-49" kpx2="1197"/><pair kern="-20" kpx2="1121"/><pair kern="-20" kpx2="1151"/><pair kern="-20" kpx2="1203"/><pair kern="-40" kpx2="1269"/><pair kern="-29" kpx2="1201"/><pair kern="-29" kpx2="1267"/><pair kern="-40" kpx2="1207"/><pair kern="-29" kpx2="1265"/><pair kern="-49" kpx2="1205"/><pair kern="-20" kpx2="1143"/><pair kern="-20" kpx2="1279"/><pair kern="-20" kpx2="1141"/><pair kern="-20" kpx2="1277"/><pair kern="-40" kpx2="1209"/><pair kern="-20" kpx2="1215"/><pair kern="-20" kpx2="1078"/><pair kern="-20" kpx2="1213"/></kerning><kerning kpx1="1105"><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="8221"/></kerning><kerning kpx1="1104"><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="8221"/></kerning><kerning kpx1="1107"><pair kern="-9" kpx2="1153"/><pair kern="-29" kpx2="1222"/><pair kern="-29" kpx2="1299"/><pair kern="-9" kpx2="1092"/><pair kern="-9" kpx2="1297"/><pair kern="-9" kpx2="1089"/><pair kern="-20" kpx2="8211"/><pair kern="-29" kpx2="1289"/><pair kern="-9" kpx2="1239"/><pair kern="-29" kpx2="1113"/><pair kern="-20" kpx2="8213"/><pair kern="-9" kpx2="1293"/><pair kern="-20" kpx2="8212"/><pair kern="-9" kpx2="1283"/><pair kern="-9" kpx2="1108"/><pair kern="-49" kpx2="8218"/><pair kern="-9" kpx2="1281"/><pair kern="-9" kpx2="1105"/><pair kern="-49" kpx2="8222"/><pair kern="-9" kpx2="1104"/><pair kern="-9" kpx2="1255"/><pair kern="-9" kpx2="1195"/><pair kern="-29" kpx2="1127"/><pair kern="-9" kpx2="1193"/><pair kern="-9" kpx2="1259"/><pair kern="-49" kpx2="46"/><pair kern="-9" kpx2="1257"/><pair kern="-49" kpx2="44"/><pair kern="-20" kpx2="45"/><pair kern="-29" kpx2="1083"/><pair kern="-9" kpx2="1149"/><pair kern="-9" kpx2="1147"/><pair kern="-9" kpx2="1086"/><pair kern="-9" kpx2="1145"/><pair kern="-9" kpx2="1139"/><pair kern="-9" kpx2="1077"/><pair kern="-29" kpx2="1076"/></kerning><kerning kpx1="1106"><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-20" kpx2="1287"/><pair kern="-9" kpx2="8221"/><pair kern="-20" kpx2="1285"/></kerning><kerning kpx1="34"><pair kern="-60" kpx2="1092"/><pair kern="-60" kpx2="1089"/><pair kern="-69" kpx2="1113"/><pair kern="-29" kpx2="1109"/><pair kern="-60" kpx2="1108"/><pair kern="-60" kpx2="1105"/><pair kern="-60" kpx2="1104"/><pair kern="-69" kpx2="1126"/><pair kern="-69" kpx2="1127"/><pair kern="-60" kpx2="1149"/><pair kern="-60" kpx2="1147"/><pair kern="-60" kpx2="1145"/><pair kern="-29" kpx2="537"/><pair kern="-60" kpx2="1139"/><pair kern="-9" kpx2="1137"/><pair kern="20" kpx2="538"/><pair kern="-60" kpx2="1033"/><pair kern="-69" kpx2="65"/><pair kern="20" kpx2="84"/><pair kern="20" kpx2="87"/><pair kern="-60" kpx2="1051"/><pair kern="20" kpx2="86"/><pair kern="-69" kpx2="1040"/><pair kern="9" kpx2="89"/><pair kern="-60" kpx2="1044"/><pair kern="-29" kpx2="103"/><pair kern="-60" kpx2="100"/><pair kern="-60" kpx2="101"/><pair kern="-60" kpx2="99"/><pair kern="-40" kpx2="97"/><pair kern="-29" kpx2="110"/><pair kern="-60" kpx2="111"/><pair kern="-29" kpx2="109"/><pair kern="-69" kpx2="1083"/><pair kern="-29" kpx2="117"/><pair kern="-29" kpx2="115"/><pair kern="-29" kpx2="114"/><pair kern="-60" kpx2="1086"/><pair kern="-60" kpx2="113"/><pair kern="-29" kpx2="112"/><pair kern="-20" kpx2="1072"/><pair kern="-60" kpx2="1077"/><pair kern="-69" kpx2="1076"/><pair kern="-60" kpx2="1221"/><pair kern="-69" kpx2="1222"/><pair kern="-69" kpx2="1236"/><pair kern="-20" kpx2="1237"/><pair kern="-60" kpx2="1239"/><pair kern="-69" kpx2="1232"/><pair kern="-20" kpx2="1233"/><pair kern="-69" kpx2="1234"/><pair kern="-20" kpx2="1235"/><pair kern="-20" kpx2="1241"/><pair kern="-20" kpx2="1243"/><pair kern="-60" kpx2="1255"/><pair kern="-60" kpx2="1259"/><pair kern="-60" kpx2="1257"/><pair kern="-60" kpx2="1153"/><pair kern="-69" kpx2="197"/><pair kern="-69" kpx2="196"/><pair kern="-69" kpx2="193"/><pair kern="-69" kpx2="192"/><pair kern="-69" kpx2="195"/><pair kern="-69" kpx2="194"/><pair kern="9" kpx2="221"/><pair kern="-60" kpx2="235"/><pair kern="-60" kpx2="234"/><pair kern="-60" kpx2="233"/><pair kern="-60" kpx2="232"/><pair kern="-60" kpx2="231"/><pair kern="-60" kpx2="1195"/><pair kern="-40" kpx2="230"/><pair kern="-40" kpx2="229"/><pair kern="-60" kpx2="1193"/><pair kern="-40" kpx2="228"/><pair kern="-40" kpx2="227"/><pair kern="-40" kpx2="226"/><pair kern="-40" kpx2="225"/><pair kern="-60" kpx2="224"/><pair kern="-29" kpx2="252"/><pair kern="-29" kpx2="250"/><pair kern="-29" kpx2="251"/><pair kern="-60" kpx2="248"/><pair kern="-29" kpx2="249"/><pair kern="-60" kpx2="246"/><pair kern="-60" kpx2="244"/><pair kern="-60" kpx2="245"/><pair kern="-60" kpx2="242"/><pair kern="-60" kpx2="243"/><pair kern="-60" kpx2="7889"/><pair kern="-60" kpx2="275"/><pair kern="-60" kpx2="273"/><pair kern="-60" kpx2="7893"/><pair kern="-60" kpx2="279"/><pair kern="-60" kpx2="7895"/><pair kern="-60" kpx2="277"/><pair kern="-60" kpx2="7897"/><pair kern="-60" kpx2="283"/><pair kern="-60" kpx2="7899"/><pair kern="-60" kpx2="281"/><pair kern="-60" kpx2="7901"/><pair kern="-29" kpx2="287"/><pair kern="-60" kpx2="7903"/><pair kern="-29" kpx2="285"/><pair kern="-69" kpx2="258"/><pair kern="-40" kpx2="259"/><pair kern="-69" kpx2="256"/><pair kern="-60" kpx2="7875"/><pair kern="-40" kpx2="257"/><pair kern="-60" kpx2="7877"/><pair kern="-60" kpx2="263"/><pair kern="-69" kpx2="260"/><pair kern="-60" kpx2="7879"/><pair kern="-40" kpx2="261"/><pair kern="-60" kpx2="267"/><pair kern="-60" kpx2="265"/><pair kern="-60" kpx2="7885"/><pair kern="-60" kpx2="271"/><pair kern="-60" kpx2="7887"/><pair kern="-60" kpx2="269"/><pair kern="9" kpx2="7922"/><pair kern="-29" kpx2="7921"/><pair kern="9" kpx2="7926"/><pair kern="9" kpx2="7924"/><pair kern="-29" kpx2="312"/><pair kern="9" kpx2="7928"/><pair kern="-60" kpx2="7907"/><pair kern="-29" kpx2="289"/><pair kern="-60" kpx2="7905"/><pair kern="-29" kpx2="291"/><pair kern="-29" kpx2="7911"/><pair kern="-29" kpx2="7909"/><pair kern="-29" kpx2="7915"/><pair kern="-29" kpx2="7913"/><pair kern="-29" kpx2="7919"/><pair kern="-29" kpx2="7917"/><pair kern="-29" kpx2="343"/><pair kern="-29" kpx2="341"/><pair kern="-60" kpx2="339"/><pair kern="-60" kpx2="337"/><pair kern="-29" kpx2="351"/><pair kern="-69" kpx2="1299"/><pair kern="-60" kpx2="1298"/><pair kern="-60" kpx2="1297"/><pair kern="-29" kpx2="347"/><pair kern="-29" kpx2="326"/><pair kern="20" kpx2="7812"/><pair kern="-29" kpx2="324"/><pair kern="-60" kpx2="1288"/><pair kern="-69" kpx2="1289"/><pair kern="20" kpx2="7808"/><pair kern="20" kpx2="7810"/><pair kern="-60" kpx2="1293"/><pair kern="-69" kpx2="1282"/><pair kern="-60" kpx2="335"/><pair kern="-60" kpx2="1283"/><pair kern="-69" kpx2="1280"/><pair kern="-60" kpx2="333"/><pair kern="-60" kpx2="1281"/><pair kern="-29" kpx2="331"/><pair kern="-40" kpx2="7863"/><pair kern="-69" kpx2="7862"/><pair kern="20" kpx2="372"/><pair kern="-40" kpx2="7861"/><pair kern="-69" kpx2="7860"/><pair kern="9" kpx2="374"/><pair kern="-40" kpx2="7859"/><pair kern="-29" kpx2="369"/><pair kern="-69" kpx2="7858"/><pair kern="-29" kpx2="371"/><pair kern="-40" kpx2="7857"/><pair kern="-69" kpx2="7856"/><pair kern="-60" kpx2="7871"/><pair kern="-60" kpx2="7869"/><pair kern="-60" kpx2="7867"/><pair kern="9" kpx2="376"/><pair kern="-60" kpx2="7865"/><pair kern="20" kpx2="356"/><pair kern="-69" kpx2="7846"/><pair kern="-69" kpx2="7844"/><pair kern="-40" kpx2="7845"/><pair kern="-69" kpx2="7842"/><pair kern="-40" kpx2="7843"/><pair kern="20" kpx2="354"/><pair kern="-69" kpx2="7840"/><pair kern="-40" kpx2="7841"/><pair kern="-69" kpx2="7854"/><pair kern="-29" kpx2="365"/><pair kern="-40" kpx2="7855"/><pair kern="-69" kpx2="7852"/><pair kern="-29" kpx2="367"/><pair kern="-40" kpx2="7853"/><pair kern="-69" kpx2="7850"/><pair kern="-29" kpx2="361"/><pair kern="-40" kpx2="7851"/><pair kern="-69" kpx2="7848"/><pair kern="-29" kpx2="363"/><pair kern="-40" kpx2="7849"/><pair kern="-20" kpx2="956"/><pair kern="-40" kpx2="959"/><pair kern="-20" kpx2="954"/><pair kern="-29" kpx2="948"/><pair kern="-20" kpx2="949"/><pair kern="-20" kpx2="950"/><pair kern="-20" kpx2="951"/><pair kern="-40" kpx2="945"/><pair kern="-20" kpx2="941"/><pair kern="-40" kpx2="940"/><pair kern="-20" kpx2="942"/><pair kern="-69" kpx2="923"/><pair kern="-29" kpx2="432"/><pair kern="-69" kpx2="916"/><pair kern="-69" kpx2="913"/><pair kern="-60" kpx2="417"/><pair kern="-69" kpx2="902"/><pair kern="-40" kpx2="7681"/><pair kern="-69" kpx2="7680"/><pair kern="-40" kpx2="509"/><pair kern="-29" kpx2="7743"/><pair kern="-60" kpx2="511"/><pair kern="-69" kpx2="506"/><pair kern="-40" kpx2="507"/><pair kern="-40" kpx2="972"/><pair kern="-40" kpx2="963"/><pair kern="-40" kpx2="962"/><pair kern="-29" kpx2="961"/><pair kern="-40" kpx2="966"/></kerning><kerning kpx1="1134"><pair kern="-9" kpx2="1200"/><pair kern="-9" kpx2="1142"/><pair kern="-40" kpx2="8218"/><pair kern="-9" kpx2="1140"/><pair kern="-20" kpx2="1286"/><pair kern="-40" kpx2="46"/><pair kern="-9" kpx2="1198"/><pair kern="-40" kpx2="8222"/><pair kern="-20" kpx2="1284"/><pair kern="-40" kpx2="44"/></kerning><kerning kpx1="1132"><pair kern="-9" kpx2="1286"/><pair kern="-9" kpx2="1284"/></kerning><kerning kpx1="1130"><pair kern="-9" kpx2="1286"/><pair kern="-9" kpx2="1284"/></kerning><kerning kpx1="39"><pair kern="-60" kpx2="1092"/><pair kern="-60" kpx2="1089"/><pair kern="-69" kpx2="1113"/><pair kern="-29" kpx2="1109"/><pair kern="-60" kpx2="1108"/><pair kern="-60" kpx2="1105"/><pair kern="-60" kpx2="1104"/><pair kern="-69" kpx2="1126"/><pair kern="-69" kpx2="1127"/><pair kern="-60" kpx2="1149"/><pair kern="-60" kpx2="1147"/><pair kern="-60" kpx2="1145"/><pair kern="-29" kpx2="537"/><pair kern="-60" kpx2="1139"/><pair kern="-9" kpx2="1137"/><pair kern="20" kpx2="538"/><pair kern="-60" kpx2="1033"/><pair kern="-69" kpx2="65"/><pair kern="20" kpx2="84"/><pair kern="20" kpx2="87"/><pair kern="-60" kpx2="1051"/><pair kern="20" kpx2="86"/><pair kern="-69" kpx2="1040"/><pair kern="9" kpx2="89"/><pair kern="-60" kpx2="1044"/><pair kern="-29" kpx2="103"/><pair kern="-60" kpx2="100"/><pair kern="-60" kpx2="101"/><pair kern="-60" kpx2="99"/><pair kern="-40" kpx2="97"/><pair kern="-29" kpx2="110"/><pair kern="-60" kpx2="111"/><pair kern="-29" kpx2="109"/><pair kern="-69" kpx2="1083"/><pair kern="-29" kpx2="117"/><pair kern="-29" kpx2="115"/><pair kern="-29" kpx2="114"/><pair kern="-60" kpx2="1086"/><pair kern="-60" kpx2="113"/><pair kern="-29" kpx2="112"/><pair kern="-20" kpx2="1072"/><pair kern="-60" kpx2="1077"/><pair kern="-69" kpx2="1076"/><pair kern="-60" kpx2="1221"/><pair kern="-69" kpx2="1222"/><pair kern="-69" kpx2="1236"/><pair kern="-20" kpx2="1237"/><pair kern="-60" kpx2="1239"/><pair kern="-69" kpx2="1232"/><pair kern="-20" kpx2="1233"/><pair kern="-69" kpx2="1234"/><pair kern="-20" kpx2="1235"/><pair kern="-20" kpx2="1241"/><pair kern="-20" kpx2="1243"/><pair kern="-60" kpx2="1255"/><pair kern="-60" kpx2="1259"/><pair kern="-60" kpx2="1257"/><pair kern="-60" kpx2="1153"/><pair kern="-69" kpx2="197"/><pair kern="-69" kpx2="196"/><pair kern="-69" kpx2="193"/><pair kern="-69" kpx2="192"/><pair kern="-69" kpx2="195"/><pair kern="-69" kpx2="194"/><pair kern="9" kpx2="221"/><pair kern="-60" kpx2="235"/><pair kern="-60" kpx2="234"/><pair kern="-60" kpx2="233"/><pair kern="-60" kpx2="232"/><pair kern="-60" kpx2="231"/><pair kern="-60" kpx2="1195"/><pair kern="-40" kpx2="230"/><pair kern="-40" kpx2="229"/><pair kern="-60" kpx2="1193"/><pair kern="-40" kpx2="228"/><pair kern="-40" kpx2="227"/><pair kern="-40" kpx2="226"/><pair kern="-40" kpx2="225"/><pair kern="-60" kpx2="224"/><pair kern="-29" kpx2="252"/><pair kern="-29" kpx2="250"/><pair kern="-29" kpx2="251"/><pair kern="-60" kpx2="248"/><pair kern="-29" kpx2="249"/><pair kern="-60" kpx2="246"/><pair kern="-60" kpx2="244"/><pair kern="-60" kpx2="245"/><pair kern="-60" kpx2="242"/><pair kern="-60" kpx2="243"/><pair kern="-60" kpx2="7889"/><pair kern="-60" kpx2="275"/><pair kern="-60" kpx2="273"/><pair kern="-60" kpx2="7893"/><pair kern="-60" kpx2="279"/><pair kern="-60" kpx2="7895"/><pair kern="-60" kpx2="277"/><pair kern="-60" kpx2="7897"/><pair kern="-60" kpx2="283"/><pair kern="-60" kpx2="7899"/><pair kern="-60" kpx2="281"/><pair kern="-60" kpx2="7901"/><pair kern="-29" kpx2="287"/><pair kern="-60" kpx2="7903"/><pair kern="-29" kpx2="285"/><pair kern="-69" kpx2="258"/><pair kern="-40" kpx2="259"/><pair kern="-69" kpx2="256"/><pair kern="-60" kpx2="7875"/><pair kern="-40" kpx2="257"/><pair kern="-60" kpx2="7877"/><pair kern="-60" kpx2="263"/><pair kern="-69" kpx2="260"/><pair kern="-60" kpx2="7879"/><pair kern="-40" kpx2="261"/><pair kern="-60" kpx2="267"/><pair kern="-60" kpx2="265"/><pair kern="-60" kpx2="7885"/><pair kern="-60" kpx2="271"/><pair kern="-60" kpx2="7887"/><pair kern="-60" kpx2="269"/><pair kern="9" kpx2="7922"/><pair kern="-29" kpx2="7921"/><pair kern="9" kpx2="7926"/><pair kern="9" kpx2="7924"/><pair kern="-29" kpx2="312"/><pair kern="9" kpx2="7928"/><pair kern="-60" kpx2="7907"/><pair kern="-29" kpx2="289"/><pair kern="-60" kpx2="7905"/><pair kern="-29" kpx2="291"/><pair kern="-29" kpx2="7911"/><pair kern="-29" kpx2="7909"/><pair kern="-29" kpx2="7915"/><pair kern="-29" kpx2="7913"/><pair kern="-29" kpx2="7919"/><pair kern="-29" kpx2="7917"/><pair kern="-29" kpx2="343"/><pair kern="-29" kpx2="341"/><pair kern="-60" kpx2="339"/><pair kern="-60" kpx2="337"/><pair kern="-29" kpx2="351"/><pair kern="-69" kpx2="1299"/><pair kern="-60" kpx2="1298"/><pair kern="-60" kpx2="1297"/><pair kern="-29" kpx2="347"/><pair kern="-29" kpx2="326"/><pair kern="20" kpx2="7812"/><pair kern="-29" kpx2="324"/><pair kern="-60" kpx2="1288"/><pair kern="-69" kpx2="1289"/><pair kern="20" kpx2="7808"/><pair kern="20" kpx2="7810"/><pair kern="-60" kpx2="1293"/><pair kern="-69" kpx2="1282"/><pair kern="-60" kpx2="335"/><pair kern="-60" kpx2="1283"/><pair kern="-69" kpx2="1280"/><pair kern="-60" kpx2="333"/><pair kern="-60" kpx2="1281"/><pair kern="-29" kpx2="331"/><pair kern="-40" kpx2="7863"/><pair kern="-69" kpx2="7862"/><pair kern="20" kpx2="372"/><pair kern="-40" kpx2="7861"/><pair kern="-69" kpx2="7860"/><pair kern="9" kpx2="374"/><pair kern="-40" kpx2="7859"/><pair kern="-29" kpx2="369"/><pair kern="-69" kpx2="7858"/><pair kern="-29" kpx2="371"/><pair kern="-40" kpx2="7857"/><pair kern="-69" kpx2="7856"/><pair kern="-60" kpx2="7871"/><pair kern="-60" kpx2="7869"/><pair kern="-60" kpx2="7867"/><pair kern="9" kpx2="376"/><pair kern="-60" kpx2="7865"/><pair kern="20" kpx2="356"/><pair kern="-69" kpx2="7846"/><pair kern="-69" kpx2="7844"/><pair kern="-40" kpx2="7845"/><pair kern="-69" kpx2="7842"/><pair kern="-40" kpx2="7843"/><pair kern="20" kpx2="354"/><pair kern="-69" kpx2="7840"/><pair kern="-40" kpx2="7841"/><pair kern="-69" kpx2="7854"/><pair kern="-29" kpx2="365"/><pair kern="-40" kpx2="7855"/><pair kern="-69" kpx2="7852"/><pair kern="-29" kpx2="367"/><pair kern="-40" kpx2="7853"/><pair kern="-69" kpx2="7850"/><pair kern="-29" kpx2="361"/><pair kern="-40" kpx2="7851"/><pair kern="-69" kpx2="7848"/><pair kern="-29" kpx2="363"/><pair kern="-40" kpx2="7849"/><pair kern="-20" kpx2="956"/><pair kern="-40" kpx2="959"/><pair kern="-20" kpx2="954"/><pair kern="-29" kpx2="948"/><pair kern="-20" kpx2="949"/><pair kern="-20" kpx2="950"/><pair kern="-20" kpx2="951"/><pair kern="-40" kpx2="945"/><pair kern="-20" kpx2="941"/><pair kern="-40" kpx2="940"/><pair kern="-20" kpx2="942"/><pair kern="-69" kpx2="923"/><pair kern="-29" kpx2="432"/><pair kern="-69" kpx2="916"/><pair kern="-69" kpx2="913"/><pair kern="-60" kpx2="417"/><pair kern="-69" kpx2="902"/><pair kern="-40" kpx2="7681"/><pair kern="-69" kpx2="7680"/><pair kern="-40" kpx2="509"/><pair kern="-29" kpx2="7743"/><pair kern="-60" kpx2="511"/><pair kern="-69" kpx2="506"/><pair kern="-40" kpx2="507"/><pair kern="-40" kpx2="972"/><pair kern="-40" kpx2="963"/><pair kern="-40" kpx2="962"/><pair kern="-29" kpx2="961"/><pair kern="-40" kpx2="966"/></kerning><kerning kpx1="1128"><pair kern="-49" kpx2="1035"/><pair kern="-20" kpx2="1098"/><pair kern="-20" kpx2="1228"/><pair kern="-49" kpx2="1026"/><pair kern="-20" kpx2="1095"/><pair kern="-20" kpx2="1164"/><pair kern="-49" kpx2="1227"/><pair kern="-20" kpx2="1090"/><pair kern="-20" kpx2="1170"/><pair kern="-49" kpx2="1294"/><pair kern="-20" kpx2="1295"/><pair kern="-69" kpx2="8217"/><pair kern="-69" kpx2="1286"/><pair kern="-20" kpx2="1240"/><pair kern="-20" kpx2="1287"/><pair kern="-69" kpx2="1284"/><pair kern="-20" kpx2="1242"/><pair kern="-69" kpx2="8221"/><pair kern="-20" kpx2="1182"/><pair kern="-20" kpx2="1285"/><pair kern="-49" kpx2="1066"/><pair kern="-69" kpx2="34"/><pair kern="-20" kpx2="1185"/><pair kern="-49" kpx2="1184"/><pair kern="-69" kpx2="39"/><pair kern="-69" kpx2="1058"/><pair kern="-20" kpx2="1122"/><pair kern="-60" kpx2="1198"/><pair kern="-49" kpx2="1063"/><pair kern="-20" kpx2="1060"/><pair kern="-20" kpx2="1197"/><pair kern="-69" kpx2="1196"/><pair kern="-49" kpx2="1268"/><pair kern="-60" kpx2="1200"/><pair kern="-20" kpx2="1269"/><pair kern="-49" kpx2="1206"/><pair kern="-20" kpx2="1207"/><pair kern="-49" kpx2="1204"/><pair kern="-20" kpx2="1205"/><pair kern="-40" kpx2="1142"/><pair kern="-49" kpx2="1208"/><pair kern="-20" kpx2="1209"/><pair kern="-40" kpx2="1140"/><pair kern="-20" kpx2="1274"/><pair kern="-49" kpx2="1214"/><pair kern="-49" kpx2="1212"/><pair kern="-49" kpx2="1136"/></kerning><kerning kpx1="1129"><pair kern="-49" kpx2="1098"/><pair kern="-20" kpx2="1092"/><pair kern="-29" kpx2="1228"/><pair kern="-29" kpx2="1095"/><pair kern="-20" kpx2="1089"/><pair kern="-49" kpx2="1090"/><pair kern="-29" kpx2="1091"/><pair kern="-29" kpx2="1118"/><pair kern="-20" kpx2="1239"/><pair kern="-20" kpx2="1108"/><pair kern="-20" kpx2="1105"/><pair kern="-20" kpx2="1104"/><pair kern="-69" kpx2="34"/><pair kern="-20" kpx2="1255"/><pair kern="-69" kpx2="39"/><pair kern="-29" kpx2="1263"/><pair kern="-20" kpx2="1259"/><pair kern="-20" kpx2="1257"/><pair kern="-20" kpx2="1121"/><pair kern="-20" kpx2="1151"/><pair kern="-20" kpx2="1149"/><pair kern="-29" kpx2="1269"/><pair kern="-20" kpx2="1147"/><pair kern="-29" kpx2="1267"/><pair kern="-20" kpx2="1145"/><pair kern="-29" kpx2="1265"/><pair kern="-20" kpx2="1143"/><pair kern="-20" kpx2="1141"/><pair kern="-20" kpx2="1139"/><pair kern="-9" kpx2="1137"/><pair kern="-20" kpx2="1153"/><pair kern="-20" kpx2="1297"/><pair kern="-49" kpx2="1295"/><pair kern="-20" kpx2="1293"/><pair kern="-20" kpx2="1283"/><pair kern="-69" kpx2="8217"/><pair kern="-20" kpx2="1281"/><pair kern="-60" kpx2="1287"/><pair kern="-69" kpx2="8221"/><pair kern="-60" kpx2="1285"/><pair kern="-49" kpx2="1185"/><pair kern="-20" kpx2="1195"/><pair kern="-20" kpx2="1193"/><pair kern="-20" kpx2="1199"/><pair kern="-49" kpx2="1197"/><pair kern="-20" kpx2="1201"/><pair kern="-20" kpx2="1086"/><pair kern="-29" kpx2="1207"/><pair kern="-49" kpx2="1205"/><pair kern="-29" kpx2="1209"/><pair kern="-20" kpx2="1215"/><pair kern="-20" kpx2="1077"/><pair kern="-20" kpx2="1213"/></kerning><kerning kpx1="1126"><pair kern="-49" kpx2="1035"/><pair kern="-20" kpx2="1098"/><pair kern="-20" kpx2="1228"/><pair kern="-49" kpx2="1026"/><pair kern="-20" kpx2="1095"/><pair kern="-20" kpx2="1164"/><pair kern="-49" kpx2="1227"/><pair kern="-20" kpx2="1090"/><pair kern="-20" kpx2="1170"/><pair kern="-49" kpx2="1294"/><pair kern="-20" kpx2="1295"/><pair kern="-69" kpx2="8217"/><pair kern="-69" kpx2="1286"/><pair kern="-20" kpx2="1240"/><pair kern="-20" kpx2="1287"/><pair kern="-69" kpx2="1284"/><pair kern="-20" kpx2="1242"/><pair kern="-69" kpx2="8221"/><pair kern="-20" kpx2="1182"/><pair kern="-20" kpx2="1285"/><pair kern="-49" kpx2="1066"/><pair kern="-69" kpx2="34"/><pair kern="-20" kpx2="1185"/><pair kern="-49" kpx2="1184"/><pair kern="-69" kpx2="39"/><pair kern="-69" kpx2="1058"/><pair kern="-20" kpx2="1122"/><pair kern="-60" kpx2="1198"/><pair kern="-49" kpx2="1063"/><pair kern="-20" kpx2="1060"/><pair kern="-20" kpx2="1197"/><pair kern="-69" kpx2="1196"/><pair kern="-49" kpx2="1268"/><pair kern="-60" kpx2="1200"/><pair kern="-20" kpx2="1269"/><pair kern="-49" kpx2="1206"/><pair kern="-20" kpx2="1207"/><pair kern="-49" kpx2="1204"/><pair kern="-20" kpx2="1205"/><pair kern="-40" kpx2="1142"/><pair kern="-49" kpx2="1208"/><pair kern="-20" kpx2="1209"/><pair kern="-40" kpx2="1140"/><pair kern="-20" kpx2="1274"/><pair kern="-49" kpx2="1214"/><pair kern="-49" kpx2="1212"/><pair kern="-49" kpx2="1136"/></kerning><kerning kpx1="1127"><pair kern="-49" kpx2="1098"/><pair kern="-20" kpx2="1092"/><pair kern="-29" kpx2="1228"/><pair kern="-29" kpx2="1095"/><pair kern="-20" kpx2="1089"/><pair kern="-49" kpx2="1090"/><pair kern="-29" kpx2="1091"/><pair kern="-29" kpx2="1118"/><pair kern="-20" kpx2="1239"/><pair kern="-20" kpx2="1108"/><pair kern="-20" kpx2="1105"/><pair kern="-20" kpx2="1104"/><pair kern="-69" kpx2="34"/><pair kern="-20" kpx2="1255"/><pair kern="-69" kpx2="39"/><pair kern="-29" kpx2="1263"/><pair kern="-20" kpx2="1259"/><pair kern="-20" kpx2="1257"/><pair kern="-20" kpx2="1121"/><pair kern="-20" kpx2="1151"/><pair kern="-20" kpx2="1149"/><pair kern="-29" kpx2="1269"/><pair kern="-20" kpx2="1147"/><pair kern="-29" kpx2="1267"/><pair kern="-20" kpx2="1145"/><pair kern="-29" kpx2="1265"/><pair kern="-20" kpx2="1143"/><pair kern="-20" kpx2="1141"/><pair kern="-20" kpx2="1139"/><pair kern="-9" kpx2="1137"/><pair kern="-20" kpx2="1153"/><pair kern="-20" kpx2="1297"/><pair kern="-49" kpx2="1295"/><pair kern="-20" kpx2="1293"/><pair kern="-20" kpx2="1283"/><pair kern="-69" kpx2="8217"/><pair kern="-20" kpx2="1281"/><pair kern="-60" kpx2="1287"/><pair kern="-69" kpx2="8221"/><pair kern="-60" kpx2="1285"/><pair kern="-49" kpx2="1185"/><pair kern="-20" kpx2="1195"/><pair kern="-20" kpx2="1193"/><pair kern="-20" kpx2="1199"/><pair kern="-49" kpx2="1197"/><pair kern="-20" kpx2="1201"/><pair kern="-20" kpx2="1086"/><pair kern="-29" kpx2="1207"/><pair kern="-49" kpx2="1205"/><pair kern="-29" kpx2="1209"/><pair kern="-20" kpx2="1215"/><pair kern="-20" kpx2="1077"/><pair kern="-20" kpx2="1213"/></kerning><kerning kpx1="40"><pair kern="89" kpx2="74"/></kerning><kerning kpx1="1124"><pair kern="-20" kpx2="1152"/><pair kern="-20" kpx2="1228"/><pair kern="-20" kpx2="1095"/><pair kern="-20" kpx2="1028"/><pair kern="-20" kpx2="1292"/><pair kern="-20" kpx2="1054"/><pair kern="-20" kpx2="1282"/><pair kern="-20" kpx2="1280"/><pair kern="-20" kpx2="1287"/><pair kern="-20" kpx2="1285"/><pair kern="-20" kpx2="1254"/><pair kern="-20" kpx2="1194"/><pair kern="-20" kpx2="1057"/><pair kern="-20" kpx2="1192"/><pair kern="-20" kpx2="1258"/><pair kern="-20" kpx2="1120"/><pair kern="-20" kpx2="1060"/><pair kern="-20" kpx2="1256"/><pair kern="-20" kpx2="1150"/><pair kern="-20" kpx2="1148"/><pair kern="-20" kpx2="1269"/><pair kern="-20" kpx2="1146"/><pair kern="-20" kpx2="1207"/><pair kern="-20" kpx2="1144"/><pair kern="-20" kpx2="1209"/><pair kern="-20" kpx2="1214"/><pair kern="-20" kpx2="1138"/><pair kern="-20" kpx2="1212"/></kerning><kerning kpx1="46"><pair kern="-49" kpx2="7888"/><pair kern="-49" kpx2="7890"/><pair kern="-49" kpx2="7892"/><pair kern="-49" kpx2="1098"/><pair kern="-49" kpx2="7894"/><pair kern="-49" kpx2="7896"/><pair kern="-49" kpx2="7898"/><pair kern="-60" kpx2="1095"/><pair kern="-49" kpx2="7900"/><pair kern="-49" kpx2="286"/><pair kern="-49" kpx2="1090"/><pair kern="-49" kpx2="7902"/><pair kern="-49" kpx2="284"/><pair kern="-49" kpx2="262"/><pair kern="-49" kpx2="266"/><pair kern="-49" kpx2="264"/><pair kern="-49" kpx2="7884"/><pair kern="-49" kpx2="7886"/><pair kern="-49" kpx2="268"/><pair kern="-60" kpx2="7922"/><pair kern="-20" kpx2="7920"/><pair kern="-60" kpx2="7926"/><pair kern="-60" kpx2="7924"/><pair kern="-60" kpx2="7928"/><pair kern="-49" kpx2="1120"/><pair kern="-49" kpx2="7906"/><pair kern="-49" kpx2="288"/><pair kern="-49" kpx2="1150"/><pair kern="-49" kpx2="7904"/><pair kern="-49" kpx2="290"/><pair kern="-49" kpx2="1148"/><pair kern="-20" kpx2="7910"/><pair kern="-49" kpx2="1146"/><pair kern="-20" kpx2="7908"/><pair kern="-49" kpx2="1144"/><pair kern="-20" kpx2="7914"/><pair kern="-60" kpx2="1142"/><pair kern="-20" kpx2="7912"/><pair kern="-60" kpx2="1140"/><pair kern="-20" kpx2="7918"/><pair kern="-49" kpx2="1138"/><pair kern="-20" kpx2="7916"/><pair kern="-69" kpx2="538"/><pair kern="-80" kpx2="1136"/><pair kern="-49" kpx2="71"/><pair kern="-69" kpx2="1035"/><pair kern="-49" kpx2="338"/><pair kern="-49" kpx2="336"/><pair kern="-49" kpx2="67"/><pair kern="-69" kpx2="1026"/><pair kern="-49" kpx2="79"/><pair kern="-49" kpx2="1028"/><pair kern="-20" kpx2="85"/><pair kern="-60" kpx2="7812"/><pair kern="-69" kpx2="84"/><pair kern="-60" kpx2="87"/><pair kern="-60" kpx2="86"/><pair kern="-69" kpx2="1294"/><pair kern="-49" kpx2="81"/><pair kern="-60" kpx2="7808"/><pair kern="-49" kpx2="1295"/><pair kern="-49" kpx2="1292"/><pair kern="-60" kpx2="7810"/><pair kern="-49" kpx2="1054"/><pair kern="-49" kpx2="334"/><pair kern="-49" kpx2="332"/><pair kern="-60" kpx2="1286"/><pair kern="-60" kpx2="89"/><pair kern="-49" kpx2="1287"/><pair kern="-60" kpx2="1284"/><pair kern="-49" kpx2="1285"/><pair kern="-69" kpx2="1066"/><pair kern="-60" kpx2="372"/><pair kern="-60" kpx2="374"/><pair kern="-20" kpx2="368"/><pair kern="-20" kpx2="370"/><pair kern="-69" kpx2="1058"/><pair kern="-49" kpx2="1057"/><pair kern="-60" kpx2="376"/><pair kern="-80" kpx2="1063"/><pair kern="-40" kpx2="1060"/><pair kern="-69" kpx2="356"/><pair kern="-69" kpx2="354"/><pair kern="-20" kpx2="364"/><pair kern="-20" kpx2="366"/><pair kern="-20" kpx2="360"/><pair kern="-20" kpx2="362"/><pair kern="-20" kpx2="952"/><pair kern="-60" kpx2="1228"/><pair kern="-80" kpx2="1227"/><pair kern="-60" kpx2="936"/><pair kern="-60" kpx2="939"/><pair kern="-60" kpx2="933"/><pair kern="-69" kpx2="932"/><pair kern="-49" kpx2="934"/><pair kern="-49" kpx2="1254"/><pair kern="-40" kpx2="927"/><pair kern="-40" kpx2="920"/><pair kern="-49" kpx2="1258"/><pair kern="-49" kpx2="1256"/><pair kern="-80" kpx2="1268"/><pair kern="-60" kpx2="1269"/><pair kern="-20" kpx2="431"/><pair kern="-49" kpx2="416"/><pair kern="-49" kpx2="1152"/><pair kern="-49" kpx2="199"/><pair kern="-20" kpx2="220"/><pair kern="-60" kpx2="221"/><pair kern="-49" kpx2="216"/><pair kern="-20" kpx2="217"/><pair kern="-20" kpx2="218"/><pair kern="-20" kpx2="219"/><pair kern="-49" kpx2="212"/><pair kern="-49" kpx2="213"/><pair kern="-49" kpx2="214"/><pair kern="-49" kpx2="210"/><pair kern="-49" kpx2="211"/><pair kern="-49" kpx2="510"/><pair kern="-49" kpx2="1185"/><pair kern="-69" kpx2="1184"/><pair kern="-60" kpx2="978"/><pair kern="-49" kpx2="1194"/><pair kern="-49" kpx2="1192"/><pair kern="-60" kpx2="1198"/><pair kern="-49" kpx2="1197"/><pair kern="-69" kpx2="1196"/><pair kern="-60" kpx2="1200"/><pair kern="-80" kpx2="1206"/><pair kern="-60" kpx2="1207"/><pair kern="-69" kpx2="1204"/><pair kern="-49" kpx2="1205"/><pair kern="-80" kpx2="1208"/><pair kern="-60" kpx2="1209"/><pair kern="-60" kpx2="1214"/><pair kern="-60" kpx2="1212"/></kerning><kerning kpx1="1122"><pair kern="-20" kpx2="1035"/><pair kern="-20" kpx2="1098"/><pair kern="-20" kpx2="1026"/><pair kern="-40" kpx2="1227"/><pair kern="-20" kpx2="1090"/><pair kern="-20" kpx2="1294"/><pair kern="-20" kpx2="1295"/><pair kern="-40" kpx2="8217"/><pair kern="-49" kpx2="1286"/><pair kern="-49" kpx2="1284"/><pair kern="-40" kpx2="8221"/><pair kern="-20" kpx2="1066"/><pair kern="-40" kpx2="34"/><pair kern="-20" kpx2="1185"/><pair kern="-20" kpx2="1184"/><pair kern="-40" kpx2="39"/><pair kern="-40" kpx2="1058"/><pair kern="-40" kpx2="1063"/><pair kern="-29" kpx2="1198"/><pair kern="-20" kpx2="1197"/><pair kern="-40" kpx2="1196"/><pair kern="-40" kpx2="1268"/><pair kern="-29" kpx2="1200"/><pair kern="-40" kpx2="1206"/><pair kern="-20" kpx2="1204"/><pair kern="-20" kpx2="1205"/><pair kern="-29" kpx2="1142"/><pair kern="-40" kpx2="1208"/><pair kern="-29" kpx2="1140"/><pair kern="-40" kpx2="1136"/></kerning><kerning kpx1="1123"><pair kern="-49" kpx2="1098"/><pair kern="-20" kpx2="1218"/><pair kern="-40" kpx2="1228"/><pair kern="-20" kpx2="1093"/><pair kern="-40" kpx2="1095"/><pair kern="-49" kpx2="1090"/><pair kern="-29" kpx2="1091"/><pair kern="-29" kpx2="1118"/><pair kern="-49" kpx2="1295"/><pair kern="-20" kpx2="1175"/><pair kern="-20" kpx2="1245"/><pair kern="-60" kpx2="8217"/><pair kern="-49" kpx2="1287"/><pair kern="-60" kpx2="8221"/><pair kern="-49" kpx2="1285"/><pair kern="-60" kpx2="34"/><pair kern="-49" kpx2="1185"/><pair kern="-60" kpx2="39"/><pair kern="-20" kpx2="1249"/><pair kern="-29" kpx2="1263"/><pair kern="-29" kpx2="1199"/><pair kern="-49" kpx2="1197"/><pair kern="-20" kpx2="1121"/><pair kern="-20" kpx2="1151"/><pair kern="-20" kpx2="1203"/><pair kern="-40" kpx2="1269"/><pair kern="-29" kpx2="1201"/><pair kern="-29" kpx2="1267"/><pair kern="-40" kpx2="1207"/><pair kern="-29" kpx2="1265"/><pair kern="-49" kpx2="1205"/><pair kern="-20" kpx2="1143"/><pair kern="-20" kpx2="1279"/><pair kern="-20" kpx2="1141"/><pair kern="-20" kpx2="1277"/><pair kern="-40" kpx2="1209"/><pair kern="-20" kpx2="1215"/><pair kern="-20" kpx2="1078"/><pair kern="-20" kpx2="1213"/></kerning><kerning kpx1="44"><pair kern="-49" kpx2="7888"/><pair kern="-49" kpx2="7890"/><pair kern="-49" kpx2="7892"/><pair kern="-49" kpx2="1098"/><pair kern="-49" kpx2="7894"/><pair kern="-49" kpx2="7896"/><pair kern="-49" kpx2="7898"/><pair kern="-60" kpx2="1095"/><pair kern="-49" kpx2="7900"/><pair kern="-49" kpx2="286"/><pair kern="-49" kpx2="1090"/><pair kern="-49" kpx2="7902"/><pair kern="-49" kpx2="284"/><pair kern="-49" kpx2="262"/><pair kern="-49" kpx2="266"/><pair kern="-49" kpx2="264"/><pair kern="-49" kpx2="7884"/><pair kern="-49" kpx2="7886"/><pair kern="-49" kpx2="268"/><pair kern="-60" kpx2="7922"/><pair kern="-20" kpx2="7920"/><pair kern="-60" kpx2="7926"/><pair kern="-60" kpx2="7924"/><pair kern="-60" kpx2="7928"/><pair kern="-49" kpx2="1120"/><pair kern="-49" kpx2="7906"/><pair kern="-49" kpx2="288"/><pair kern="-49" kpx2="1150"/><pair kern="-49" kpx2="7904"/><pair kern="-49" kpx2="290"/><pair kern="-49" kpx2="1148"/><pair kern="-20" kpx2="7910"/><pair kern="-49" kpx2="1146"/><pair kern="-20" kpx2="7908"/><pair kern="-49" kpx2="1144"/><pair kern="-20" kpx2="7914"/><pair kern="-60" kpx2="1142"/><pair kern="-20" kpx2="7912"/><pair kern="-60" kpx2="1140"/><pair kern="-20" kpx2="7918"/><pair kern="-49" kpx2="1138"/><pair kern="-20" kpx2="7916"/><pair kern="-69" kpx2="538"/><pair kern="-80" kpx2="1136"/><pair kern="-49" kpx2="71"/><pair kern="-69" kpx2="1035"/><pair kern="-49" kpx2="338"/><pair kern="-49" kpx2="336"/><pair kern="-49" kpx2="67"/><pair kern="-69" kpx2="1026"/><pair kern="-49" kpx2="79"/><pair kern="-49" kpx2="1028"/><pair kern="-20" kpx2="85"/><pair kern="-60" kpx2="7812"/><pair kern="-69" kpx2="84"/><pair kern="-60" kpx2="87"/><pair kern="-60" kpx2="86"/><pair kern="-69" kpx2="1294"/><pair kern="-49" kpx2="81"/><pair kern="-60" kpx2="7808"/><pair kern="-49" kpx2="1295"/><pair kern="-49" kpx2="1292"/><pair kern="-60" kpx2="7810"/><pair kern="-49" kpx2="1054"/><pair kern="-49" kpx2="334"/><pair kern="-49" kpx2="332"/><pair kern="-60" kpx2="1286"/><pair kern="-60" kpx2="89"/><pair kern="-49" kpx2="1287"/><pair kern="-60" kpx2="1284"/><pair kern="-49" kpx2="1285"/><pair kern="-69" kpx2="1066"/><pair kern="-60" kpx2="372"/><pair kern="-60" kpx2="374"/><pair kern="-20" kpx2="368"/><pair kern="-20" kpx2="370"/><pair kern="-69" kpx2="1058"/><pair kern="-49" kpx2="1057"/><pair kern="-60" kpx2="376"/><pair kern="-80" kpx2="1063"/><pair kern="-40" kpx2="1060"/><pair kern="-69" kpx2="356"/><pair kern="-69" kpx2="354"/><pair kern="-20" kpx2="364"/><pair kern="-20" kpx2="366"/><pair kern="-20" kpx2="360"/><pair kern="-20" kpx2="362"/><pair kern="-20" kpx2="952"/><pair kern="-60" kpx2="1228"/><pair kern="-80" kpx2="1227"/><pair kern="-60" kpx2="936"/><pair kern="-60" kpx2="939"/><pair kern="-60" kpx2="933"/><pair kern="-69" kpx2="932"/><pair kern="-49" kpx2="934"/><pair kern="-49" kpx2="1254"/><pair kern="-40" kpx2="927"/><pair kern="-40" kpx2="920"/><pair kern="-49" kpx2="1258"/><pair kern="-49" kpx2="1256"/><pair kern="-80" kpx2="1268"/><pair kern="-60" kpx2="1269"/><pair kern="-20" kpx2="431"/><pair kern="-49" kpx2="416"/><pair kern="-49" kpx2="1152"/><pair kern="-49" kpx2="199"/><pair kern="-20" kpx2="220"/><pair kern="-60" kpx2="221"/><pair kern="-49" kpx2="216"/><pair kern="-20" kpx2="217"/><pair kern="-20" kpx2="218"/><pair kern="-20" kpx2="219"/><pair kern="-49" kpx2="212"/><pair kern="-49" kpx2="213"/><pair kern="-49" kpx2="214"/><pair kern="-49" kpx2="210"/><pair kern="-49" kpx2="211"/><pair kern="-49" kpx2="510"/><pair kern="-49" kpx2="1185"/><pair kern="-69" kpx2="1184"/><pair kern="-60" kpx2="978"/><pair kern="-49" kpx2="1194"/><pair kern="-49" kpx2="1192"/><pair kern="-60" kpx2="1198"/><pair kern="-49" kpx2="1197"/><pair kern="-69" kpx2="1196"/><pair kern="-60" kpx2="1200"/><pair kern="-80" kpx2="1206"/><pair kern="-60" kpx2="1207"/><pair kern="-69" kpx2="1204"/><pair kern="-49" kpx2="1205"/><pair kern="-80" kpx2="1208"/><pair kern="-60" kpx2="1209"/><pair kern="-60" kpx2="1214"/><pair kern="-60" kpx2="1212"/></kerning><kerning kpx1="1120"><pair kern="-20" kpx2="1221"/><pair kern="-9" kpx2="1222"/><pair kern="-20" kpx2="1217"/><pair kern="-20" kpx2="1227"/><pair kern="-20" kpx2="1236"/><pair kern="-9" kpx2="1113"/><pair kern="-20" kpx2="1232"/><pair kern="-20" kpx2="1234"/><pair kern="-20" kpx2="1244"/><pair kern="-9" kpx2="1246"/><pair kern="-9" kpx2="1134"/><pair kern="-20" kpx2="1126"/><pair kern="-20" kpx2="1262"/><pair kern="-9" kpx2="1127"/><pair kern="-9" kpx2="1260"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="44"/><pair kern="-20" kpx2="1268"/><pair kern="-20" kpx2="1266"/><pair kern="-20" kpx2="1264"/><pair kern="-20" kpx2="1278"/><pair kern="-9" kpx2="1142"/><pair kern="-20" kpx2="1276"/><pair kern="-9" kpx2="1140"/><pair kern="-20" kpx2="1136"/><pair kern="-20" kpx2="1033"/><pair kern="-9" kpx2="1035"/><pair kern="-20" kpx2="1038"/><pair kern="-9" kpx2="1299"/><pair kern="-20" kpx2="1298"/><pair kern="-9" kpx2="1026"/><pair kern="-20" kpx2="1288"/><pair kern="-20" kpx2="1051"/><pair kern="-9" kpx2="1289"/><pair kern="-9" kpx2="1294"/><pair kern="-20" kpx2="1174"/><pair kern="-9" kpx2="1176"/><pair kern="-40" kpx2="8218"/><pair kern="-20" kpx2="1040"/><pair kern="-20" kpx2="1286"/><pair kern="-40" kpx2="8222"/><pair kern="-20" kpx2="1044"/><pair kern="-20" kpx2="1284"/><pair kern="-9" kpx2="1047"/><pair kern="-20" kpx2="1046"/><pair kern="-9" kpx2="1066"/><pair kern="-9" kpx2="1184"/><pair kern="-9" kpx2="1069"/><pair kern="-29" kpx2="1058"/><pair kern="-20" kpx2="1059"/><pair kern="-20" kpx2="1063"/><pair kern="-9" kpx2="1198"/><pair kern="-20" kpx2="1061"/><pair kern="-29" kpx2="1196"/><pair kern="-9" kpx2="1083"/><pair kern="-20" kpx2="1202"/><pair kern="-9" kpx2="1200"/><pair kern="-20" kpx2="1206"/><pair kern="-9" kpx2="1204"/><pair kern="-20" kpx2="1208"/><pair kern="-9" kpx2="1076"/></kerning><kerning kpx1="45"><pair kern="-40" kpx2="1066"/><pair kern="-20" kpx2="1185"/><pair kern="-40" kpx2="1035"/><pair kern="-40" kpx2="1184"/><pair kern="-20" kpx2="1098"/><pair kern="-40" kpx2="1058"/><pair kern="-40" kpx2="1026"/><pair kern="-20" kpx2="1197"/><pair kern="-20" kpx2="1090"/><pair kern="-40" kpx2="1196"/><pair kern="-40" kpx2="356"/><pair kern="-40" kpx2="84"/><pair kern="-40" kpx2="1294"/><pair kern="-20" kpx2="1295"/><pair kern="-40" kpx2="354"/><pair kern="-40" kpx2="1204"/><pair kern="-20" kpx2="1205"/><pair kern="-40" kpx2="932"/><pair kern="-40" kpx2="538"/></kerning><kerning kpx1="1121"><pair kern="-20" kpx2="1083"/><pair kern="-20" kpx2="1289"/><pair kern="-20" kpx2="1222"/><pair kern="-20" kpx2="1113"/><pair kern="-20" kpx2="1299"/><pair kern="-20" kpx2="1127"/><pair kern="-40" kpx2="8218"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="8222"/><pair kern="-40" kpx2="44"/><pair kern="-20" kpx2="1076"/></kerning><kerning kpx1="1151"><pair kern="-20" kpx2="1083"/><pair kern="-20" kpx2="1289"/><pair kern="-20" kpx2="1222"/><pair kern="-20" kpx2="1113"/><pair kern="-20" kpx2="1299"/><pair kern="-20" kpx2="1127"/><pair kern="-40" kpx2="8218"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="8222"/><pair kern="-40" kpx2="44"/><pair kern="-20" kpx2="1076"/></kerning><kerning kpx1="1150"><pair kern="-20" kpx2="1221"/><pair kern="-9" kpx2="1222"/><pair kern="-20" kpx2="1217"/><pair kern="-20" kpx2="1227"/><pair kern="-20" kpx2="1236"/><pair kern="-9" kpx2="1113"/><pair kern="-20" kpx2="1232"/><pair kern="-20" kpx2="1234"/><pair kern="-20" kpx2="1244"/><pair kern="-9" kpx2="1246"/><pair kern="-9" kpx2="1134"/><pair kern="-20" kpx2="1126"/><pair kern="-20" kpx2="1262"/><pair kern="-9" kpx2="1127"/><pair kern="-9" kpx2="1260"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="44"/><pair kern="-20" kpx2="1268"/><pair kern="-20" kpx2="1266"/><pair kern="-20" kpx2="1264"/><pair kern="-20" kpx2="1278"/><pair kern="-9" kpx2="1142"/><pair kern="-20" kpx2="1276"/><pair kern="-9" kpx2="1140"/><pair kern="-20" kpx2="1136"/><pair kern="-20" kpx2="1033"/><pair kern="-9" kpx2="1035"/><pair kern="-20" kpx2="1038"/><pair kern="-9" kpx2="1299"/><pair kern="-20" kpx2="1298"/><pair kern="-9" kpx2="1026"/><pair kern="-20" kpx2="1288"/><pair kern="-20" kpx2="1051"/><pair kern="-9" kpx2="1289"/><pair kern="-9" kpx2="1294"/><pair kern="-20" kpx2="1174"/><pair kern="-9" kpx2="1176"/><pair kern="-40" kpx2="8218"/><pair kern="-20" kpx2="1040"/><pair kern="-20" kpx2="1286"/><pair kern="-40" kpx2="8222"/><pair kern="-20" kpx2="1044"/><pair kern="-20" kpx2="1284"/><pair kern="-9" kpx2="1047"/><pair kern="-20" kpx2="1046"/><pair kern="-9" kpx2="1066"/><pair kern="-9" kpx2="1184"/><pair kern="-9" kpx2="1069"/><pair kern="-29" kpx2="1058"/><pair kern="-20" kpx2="1059"/><pair kern="-20" kpx2="1063"/><pair kern="-9" kpx2="1198"/><pair kern="-20" kpx2="1061"/><pair kern="-29" kpx2="1196"/><pair kern="-9" kpx2="1083"/><pair kern="-20" kpx2="1202"/><pair kern="-9" kpx2="1200"/><pair kern="-20" kpx2="1206"/><pair kern="-9" kpx2="1204"/><pair kern="-20" kpx2="1208"/><pair kern="-9" kpx2="1076"/></kerning><kerning kpx1="1149"><pair kern="-9" kpx2="1098"/><pair kern="-20" kpx2="1218"/><pair kern="-20" kpx2="1093"/><pair kern="-9" kpx2="1228"/><pair kern="-9" kpx2="1095"/><pair kern="-9" kpx2="1090"/><pair kern="-9" kpx2="1091"/><pair kern="-9" kpx2="1118"/><pair kern="-9" kpx2="1295"/><pair kern="-20" kpx2="1175"/><pair kern="-20" kpx2="1245"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="1287"/><pair kern="-9" kpx2="8221"/><pair kern="-9" kpx2="1285"/><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="1185"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="1263"/><pair kern="-9" kpx2="1197"/><pair kern="-20" kpx2="1203"/><pair kern="-9" kpx2="1269"/><pair kern="-9" kpx2="1207"/><pair kern="-9" kpx2="1267"/><pair kern="-9" kpx2="1205"/><pair kern="-9" kpx2="1265"/><pair kern="-20" kpx2="1279"/><pair kern="-20" kpx2="1277"/><pair kern="-9" kpx2="1209"/><pair kern="-20" kpx2="1078"/></kerning><kerning kpx1="1148"><pair kern="-20" kpx2="1221"/><pair kern="-9" kpx2="1222"/><pair kern="-20" kpx2="1217"/><pair kern="-20" kpx2="1227"/><pair kern="-20" kpx2="1236"/><pair kern="-9" kpx2="1113"/><pair kern="-20" kpx2="1232"/><pair kern="-20" kpx2="1234"/><pair kern="-20" kpx2="1244"/><pair kern="-9" kpx2="1246"/><pair kern="-9" kpx2="1134"/><pair kern="-20" kpx2="1126"/><pair kern="-20" kpx2="1262"/><pair kern="-9" kpx2="1127"/><pair kern="-9" kpx2="1260"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="44"/><pair kern="-20" kpx2="1268"/><pair kern="-20" kpx2="1266"/><pair kern="-20" kpx2="1264"/><pair kern="-20" kpx2="1278"/><pair kern="-9" kpx2="1142"/><pair kern="-20" kpx2="1276"/><pair kern="-9" kpx2="1140"/><pair kern="-20" kpx2="1136"/><pair kern="-20" kpx2="1033"/><pair kern="-9" kpx2="1035"/><pair kern="-20" kpx2="1038"/><pair kern="-9" kpx2="1299"/><pair kern="-20" kpx2="1298"/><pair kern="-9" kpx2="1026"/><pair kern="-20" kpx2="1288"/><pair kern="-20" kpx2="1051"/><pair kern="-9" kpx2="1289"/><pair kern="-9" kpx2="1294"/><pair kern="-20" kpx2="1174"/><pair kern="-9" kpx2="1176"/><pair kern="-40" kpx2="8218"/><pair kern="-20" kpx2="1040"/><pair kern="-20" kpx2="1286"/><pair kern="-40" kpx2="8222"/><pair kern="-20" kpx2="1044"/><pair kern="-20" kpx2="1284"/><pair kern="-9" kpx2="1047"/><pair kern="-20" kpx2="1046"/><pair kern="-9" kpx2="1066"/><pair kern="-9" kpx2="1184"/><pair kern="-9" kpx2="1069"/><pair kern="-29" kpx2="1058"/><pair kern="-20" kpx2="1059"/><pair kern="-20" kpx2="1063"/><pair kern="-9" kpx2="1198"/><pair kern="-20" kpx2="1061"/><pair kern="-29" kpx2="1196"/><pair kern="-9" kpx2="1083"/><pair kern="-20" kpx2="1202"/><pair kern="-9" kpx2="1200"/><pair kern="-20" kpx2="1206"/><pair kern="-9" kpx2="1204"/><pair kern="-20" kpx2="1208"/><pair kern="-9" kpx2="1076"/></kerning><kerning kpx1="1147"><pair kern="-9" kpx2="1098"/><pair kern="-20" kpx2="1218"/><pair kern="-20" kpx2="1093"/><pair kern="-9" kpx2="1228"/><pair kern="-9" kpx2="1095"/><pair kern="-9" kpx2="1090"/><pair kern="-9" kpx2="1091"/><pair kern="-9" kpx2="1118"/><pair kern="-9" kpx2="1295"/><pair kern="-20" kpx2="1175"/><pair kern="-20" kpx2="1245"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="1287"/><pair kern="-9" kpx2="8221"/><pair kern="-9" kpx2="1285"/><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="1185"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="1263"/><pair kern="-9" kpx2="1197"/><pair kern="-20" kpx2="1203"/><pair kern="-9" kpx2="1269"/><pair kern="-9" kpx2="1207"/><pair kern="-9" kpx2="1267"/><pair kern="-9" kpx2="1205"/><pair kern="-9" kpx2="1265"/><pair kern="-20" kpx2="1279"/><pair kern="-20" kpx2="1277"/><pair kern="-9" kpx2="1209"/><pair kern="-20" kpx2="1078"/></kerning><kerning kpx1="1146"><pair kern="-20" kpx2="1221"/><pair kern="-9" kpx2="1222"/><pair kern="-20" kpx2="1217"/><pair kern="-20" kpx2="1227"/><pair kern="-20" kpx2="1236"/><pair kern="-9" kpx2="1113"/><pair kern="-20" kpx2="1232"/><pair kern="-20" kpx2="1234"/><pair kern="-20" kpx2="1244"/><pair kern="-9" kpx2="1246"/><pair kern="-9" kpx2="1134"/><pair kern="-20" kpx2="1126"/><pair kern="-20" kpx2="1262"/><pair kern="-9" kpx2="1127"/><pair kern="-9" kpx2="1260"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="44"/><pair kern="-20" kpx2="1268"/><pair kern="-20" kpx2="1266"/><pair kern="-20" kpx2="1264"/><pair kern="-20" kpx2="1278"/><pair kern="-9" kpx2="1142"/><pair kern="-20" kpx2="1276"/><pair kern="-9" kpx2="1140"/><pair kern="-20" kpx2="1136"/><pair kern="-20" kpx2="1033"/><pair kern="-9" kpx2="1035"/><pair kern="-20" kpx2="1038"/><pair kern="-9" kpx2="1299"/><pair kern="-20" kpx2="1298"/><pair kern="-9" kpx2="1026"/><pair kern="-20" kpx2="1288"/><pair kern="-20" kpx2="1051"/><pair kern="-9" kpx2="1289"/><pair kern="-9" kpx2="1294"/><pair kern="-20" kpx2="1174"/><pair kern="-9" kpx2="1176"/><pair kern="-40" kpx2="8218"/><pair kern="-20" kpx2="1040"/><pair kern="-20" kpx2="1286"/><pair kern="-40" kpx2="8222"/><pair kern="-20" kpx2="1044"/><pair kern="-20" kpx2="1284"/><pair kern="-9" kpx2="1047"/><pair kern="-20" kpx2="1046"/><pair kern="-9" kpx2="1066"/><pair kern="-9" kpx2="1184"/><pair kern="-9" kpx2="1069"/><pair kern="-29" kpx2="1058"/><pair kern="-20" kpx2="1059"/><pair kern="-20" kpx2="1063"/><pair kern="-9" kpx2="1198"/><pair kern="-20" kpx2="1061"/><pair kern="-29" kpx2="1196"/><pair kern="-9" kpx2="1083"/><pair kern="-20" kpx2="1202"/><pair kern="-9" kpx2="1200"/><pair kern="-20" kpx2="1206"/><pair kern="-9" kpx2="1204"/><pair kern="-20" kpx2="1208"/><pair kern="-9" kpx2="1076"/></kerning><kerning kpx1="1145"><pair kern="-20" kpx2="1083"/><pair kern="-20" kpx2="1289"/><pair kern="-20" kpx2="1222"/><pair kern="-20" kpx2="1113"/><pair kern="-20" kpx2="1299"/><pair kern="-20" kpx2="1127"/><pair kern="-40" kpx2="8218"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="8222"/><pair kern="-40" kpx2="44"/><pair kern="-20" kpx2="1076"/></kerning><kerning kpx1="1144"><pair kern="-20" kpx2="1083"/><pair kern="-20" kpx2="1289"/><pair kern="-20" kpx2="1222"/><pair kern="-20" kpx2="1113"/><pair kern="-20" kpx2="1299"/><pair kern="-20" kpx2="1127"/><pair kern="-40" kpx2="8218"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="8222"/><pair kern="-40" kpx2="44"/><pair kern="-20" kpx2="1076"/></kerning><kerning kpx1="1143"><pair kern="-20" kpx2="1083"/><pair kern="-20" kpx2="1289"/><pair kern="-20" kpx2="1222"/><pair kern="-20" kpx2="1113"/><pair kern="-20" kpx2="1299"/><pair kern="-20" kpx2="1127"/><pair kern="-40" kpx2="8218"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="8222"/><pair kern="-40" kpx2="44"/><pair kern="-20" kpx2="1076"/></kerning><kerning kpx1="1142"><pair kern="-49" kpx2="1221"/><pair kern="-40" kpx2="1222"/><pair kern="-20" kpx2="1092"/><pair kern="-20" kpx2="1228"/><pair kern="-20" kpx2="1095"/><pair kern="-20" kpx2="1089"/><pair kern="-69" kpx2="1236"/><pair kern="-20" kpx2="1239"/><pair kern="-69" kpx2="1232"/><pair kern="-40" kpx2="1113"/><pair kern="-69" kpx2="1234"/><pair kern="49" kpx2="1115"/><pair kern="-9" kpx2="1109"/><pair kern="-20" kpx2="1108"/><pair kern="-20" kpx2="1105"/><pair kern="-20" kpx2="1104"/><pair kern="49" kpx2="1106"/><pair kern="-20" kpx2="1255"/><pair kern="-9" kpx2="1254"/><pair kern="-69" kpx2="1126"/><pair kern="-40" kpx2="1127"/><pair kern="-20" kpx2="1259"/><pair kern="-60" kpx2="46"/><pair kern="-9" kpx2="1258"/><pair kern="-20" kpx2="1257"/><pair kern="-60" kpx2="44"/><pair kern="-9" kpx2="1120"/><pair kern="-9" kpx2="1256"/><pair kern="-9" kpx2="1150"/><pair kern="-20" kpx2="1149"/><pair kern="-20" kpx2="1269"/><pair kern="-9" kpx2="1148"/><pair kern="-20" kpx2="1147"/><pair kern="-9" kpx2="1146"/><pair kern="-20" kpx2="1145"/><pair kern="-9" kpx2="1144"/><pair kern="-20" kpx2="1139"/><pair kern="-9" kpx2="1138"/><pair kern="-20" kpx2="1153"/><pair kern="-49" kpx2="1033"/><pair kern="-9" kpx2="1152"/><pair kern="-40" kpx2="1299"/><pair kern="-49" kpx2="1298"/><pair kern="-20" kpx2="1297"/><pair kern="-9" kpx2="1028"/><pair kern="49" kpx2="1165"/><pair kern="-49" kpx2="1288"/><pair kern="-49" kpx2="1051"/><pair kern="-40" kpx2="1289"/><pair kern="-9" kpx2="1292"/><pair kern="-20" kpx2="1293"/><pair kern="-9" kpx2="1054"/><pair kern="-69" kpx2="1282"/><pair kern="-20" kpx2="1283"/><pair kern="-69" kpx2="1040"/><pair kern="-60" kpx2="8218"/><pair kern="-69" kpx2="1280"/><pair kern="-20" kpx2="1281"/><pair kern="-49" kpx2="1044"/><pair kern="-60" kpx2="8222"/><pair kern="49" kpx2="1183"/><pair kern="-9" kpx2="1071"/><pair kern="-20" kpx2="1195"/><pair kern="-9" kpx2="1194"/><pair kern="-20" kpx2="1193"/><pair kern="-9" kpx2="1057"/><pair kern="-9" kpx2="1192"/><pair kern="-29" kpx2="1060"/><pair kern="-40" kpx2="1083"/><pair kern="-20" kpx2="1086"/><pair kern="-20" kpx2="1207"/><pair kern="-20" kpx2="1209"/><pair kern="-20" kpx2="1214"/><pair kern="-29" kpx2="1215"/><pair kern="-20" kpx2="1212"/><pair kern="-20" kpx2="1077"/><pair kern="-29" kpx2="1213"/><pair kern="-40" kpx2="1076"/></kerning><kerning kpx1="1141"><pair kern="-20" kpx2="1083"/><pair kern="-20" kpx2="1289"/><pair kern="-20" kpx2="1222"/><pair kern="-20" kpx2="1113"/><pair kern="-20" kpx2="1299"/><pair kern="-20" kpx2="1127"/><pair kern="-40" kpx2="8218"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="8222"/><pair kern="-40" kpx2="44"/><pair kern="-20" kpx2="1076"/></kerning><kerning kpx1="1140"><pair kern="-49" kpx2="1221"/><pair kern="-40" kpx2="1222"/><pair kern="-20" kpx2="1092"/><pair kern="-20" kpx2="1228"/><pair kern="-20" kpx2="1095"/><pair kern="-20" kpx2="1089"/><pair kern="-69" kpx2="1236"/><pair kern="-20" kpx2="1239"/><pair kern="-69" kpx2="1232"/><pair kern="-40" kpx2="1113"/><pair kern="-69" kpx2="1234"/><pair kern="49" kpx2="1115"/><pair kern="-9" kpx2="1109"/><pair kern="-20" kpx2="1108"/><pair kern="-20" kpx2="1105"/><pair kern="-20" kpx2="1104"/><pair kern="49" kpx2="1106"/><pair kern="-20" kpx2="1255"/><pair kern="-9" kpx2="1254"/><pair kern="-69" kpx2="1126"/><pair kern="-40" kpx2="1127"/><pair kern="-20" kpx2="1259"/><pair kern="-60" kpx2="46"/><pair kern="-9" kpx2="1258"/><pair kern="-20" kpx2="1257"/><pair kern="-60" kpx2="44"/><pair kern="-9" kpx2="1120"/><pair kern="-9" kpx2="1256"/><pair kern="-9" kpx2="1150"/><pair kern="-20" kpx2="1149"/><pair kern="-20" kpx2="1269"/><pair kern="-9" kpx2="1148"/><pair kern="-20" kpx2="1147"/><pair kern="-9" kpx2="1146"/><pair kern="-20" kpx2="1145"/><pair kern="-9" kpx2="1144"/><pair kern="-20" kpx2="1139"/><pair kern="-9" kpx2="1138"/><pair kern="-20" kpx2="1153"/><pair kern="-49" kpx2="1033"/><pair kern="-9" kpx2="1152"/><pair kern="-40" kpx2="1299"/><pair kern="-49" kpx2="1298"/><pair kern="-20" kpx2="1297"/><pair kern="-9" kpx2="1028"/><pair kern="49" kpx2="1165"/><pair kern="-49" kpx2="1288"/><pair kern="-49" kpx2="1051"/><pair kern="-40" kpx2="1289"/><pair kern="-9" kpx2="1292"/><pair kern="-20" kpx2="1293"/><pair kern="-9" kpx2="1054"/><pair kern="-69" kpx2="1282"/><pair kern="-20" kpx2="1283"/><pair kern="-69" kpx2="1040"/><pair kern="-60" kpx2="8218"/><pair kern="-69" kpx2="1280"/><pair kern="-20" kpx2="1281"/><pair kern="-49" kpx2="1044"/><pair kern="-60" kpx2="8222"/><pair kern="49" kpx2="1183"/><pair kern="-9" kpx2="1071"/><pair kern="-20" kpx2="1195"/><pair kern="-9" kpx2="1194"/><pair kern="-20" kpx2="1193"/><pair kern="-9" kpx2="1057"/><pair kern="-9" kpx2="1192"/><pair kern="-29" kpx2="1060"/><pair kern="-40" kpx2="1083"/><pair kern="-20" kpx2="1086"/><pair kern="-20" kpx2="1207"/><pair kern="-20" kpx2="1209"/><pair kern="-20" kpx2="1214"/><pair kern="-29" kpx2="1215"/><pair kern="-20" kpx2="1212"/><pair kern="-20" kpx2="1077"/><pair kern="-29" kpx2="1213"/><pair kern="-40" kpx2="1076"/></kerning><kerning kpx1="1139"><pair kern="-9" kpx2="1098"/><pair kern="-20" kpx2="1218"/><pair kern="-20" kpx2="1093"/><pair kern="-9" kpx2="1228"/><pair kern="-9" kpx2="1095"/><pair kern="-9" kpx2="1090"/><pair kern="-9" kpx2="1091"/><pair kern="-9" kpx2="1118"/><pair kern="-9" kpx2="1295"/><pair kern="-20" kpx2="1175"/><pair kern="-20" kpx2="1245"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="1287"/><pair kern="-9" kpx2="8221"/><pair kern="-9" kpx2="1285"/><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="1185"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="1263"/><pair kern="-9" kpx2="1197"/><pair kern="-20" kpx2="1203"/><pair kern="-9" kpx2="1269"/><pair kern="-9" kpx2="1207"/><pair kern="-9" kpx2="1267"/><pair kern="-9" kpx2="1205"/><pair kern="-9" kpx2="1265"/><pair kern="-20" kpx2="1279"/><pair kern="-20" kpx2="1277"/><pair kern="-9" kpx2="1209"/><pair kern="-20" kpx2="1078"/></kerning><kerning kpx1="1138"><pair kern="-20" kpx2="1221"/><pair kern="-9" kpx2="1222"/><pair kern="-20" kpx2="1217"/><pair kern="-20" kpx2="1227"/><pair kern="-20" kpx2="1236"/><pair kern="-9" kpx2="1113"/><pair kern="-20" kpx2="1232"/><pair kern="-20" kpx2="1234"/><pair kern="-20" kpx2="1244"/><pair kern="-9" kpx2="1246"/><pair kern="-9" kpx2="1134"/><pair kern="-20" kpx2="1126"/><pair kern="-20" kpx2="1262"/><pair kern="-9" kpx2="1127"/><pair kern="-9" kpx2="1260"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="44"/><pair kern="-20" kpx2="1268"/><pair kern="-20" kpx2="1266"/><pair kern="-20" kpx2="1264"/><pair kern="-20" kpx2="1278"/><pair kern="-9" kpx2="1142"/><pair kern="-20" kpx2="1276"/><pair kern="-9" kpx2="1140"/><pair kern="-20" kpx2="1136"/><pair kern="-20" kpx2="1033"/><pair kern="-9" kpx2="1035"/><pair kern="-20" kpx2="1038"/><pair kern="-9" kpx2="1299"/><pair kern="-20" kpx2="1298"/><pair kern="-9" kpx2="1026"/><pair kern="-20" kpx2="1288"/><pair kern="-20" kpx2="1051"/><pair kern="-9" kpx2="1289"/><pair kern="-9" kpx2="1294"/><pair kern="-20" kpx2="1174"/><pair kern="-9" kpx2="1176"/><pair kern="-40" kpx2="8218"/><pair kern="-20" kpx2="1040"/><pair kern="-20" kpx2="1286"/><pair kern="-40" kpx2="8222"/><pair kern="-20" kpx2="1044"/><pair kern="-20" kpx2="1284"/><pair kern="-9" kpx2="1047"/><pair kern="-20" kpx2="1046"/><pair kern="-9" kpx2="1066"/><pair kern="-9" kpx2="1184"/><pair kern="-9" kpx2="1069"/><pair kern="-29" kpx2="1058"/><pair kern="-20" kpx2="1059"/><pair kern="-20" kpx2="1063"/><pair kern="-9" kpx2="1198"/><pair kern="-20" kpx2="1061"/><pair kern="-29" kpx2="1196"/><pair kern="-9" kpx2="1083"/><pair kern="-20" kpx2="1202"/><pair kern="-9" kpx2="1200"/><pair kern="-20" kpx2="1206"/><pair kern="-9" kpx2="1204"/><pair kern="-20" kpx2="1208"/><pair kern="-9" kpx2="1076"/></kerning><kerning kpx1="1137"><pair kern="-9" kpx2="1098"/><pair kern="-20" kpx2="1218"/><pair kern="-20" kpx2="1093"/><pair kern="-9" kpx2="1228"/><pair kern="-9" kpx2="1095"/><pair kern="-9" kpx2="1090"/><pair kern="-9" kpx2="1091"/><pair kern="-9" kpx2="1118"/><pair kern="-9" kpx2="1295"/><pair kern="-20" kpx2="1175"/><pair kern="-20" kpx2="1245"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="1287"/><pair kern="-9" kpx2="8221"/><pair kern="-9" kpx2="1285"/><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="1185"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="1263"/><pair kern="-9" kpx2="1197"/><pair kern="-20" kpx2="1203"/><pair kern="-9" kpx2="1269"/><pair kern="-9" kpx2="1207"/><pair kern="-9" kpx2="1267"/><pair kern="-9" kpx2="1205"/><pair kern="-9" kpx2="1265"/><pair kern="-20" kpx2="1279"/><pair kern="-20" kpx2="1277"/><pair kern="-9" kpx2="1209"/><pair kern="-20" kpx2="1078"/></kerning><kerning kpx1="1136"><pair kern="-29" kpx2="1221"/><pair kern="-29" kpx2="1033"/><pair kern="-20" kpx2="1222"/><pair kern="-20" kpx2="1299"/><pair kern="-40" kpx2="1126"/><pair kern="-29" kpx2="1298"/><pair kern="-20" kpx2="1127"/><pair kern="-69" kpx2="46"/><pair kern="-69" kpx2="44"/><pair kern="-40" kpx2="1236"/><pair kern="-20" kpx2="1083"/><pair kern="-29" kpx2="1288"/><pair kern="-29" kpx2="1051"/><pair kern="-20" kpx2="1289"/><pair kern="-40" kpx2="1232"/><pair kern="-20" kpx2="1113"/><pair kern="-40" kpx2="1234"/><pair kern="-40" kpx2="1282"/><pair kern="-40" kpx2="1040"/><pair kern="-69" kpx2="8218"/><pair kern="-40" kpx2="1280"/><pair kern="-29" kpx2="1044"/><pair kern="-69" kpx2="8222"/><pair kern="-20" kpx2="1076"/></kerning><kerning kpx1="68"><pair kern="-20" kpx2="258"/><pair kern="-20" kpx2="256"/><pair kern="-20" kpx2="260"/><pair kern="-9" kpx2="7922"/><pair kern="-9" kpx2="7926"/><pair kern="-9" kpx2="7924"/><pair kern="-9" kpx2="7928"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="44"/><pair kern="-29" kpx2="538"/><pair kern="-20" kpx2="65"/><pair kern="-20" kpx2="197"/><pair kern="-20" kpx2="196"/><pair kern="-20" kpx2="193"/><pair kern="-20" kpx2="192"/><pair kern="-9" kpx2="1029"/><pair kern="-20" kpx2="195"/><pair kern="-20" kpx2="194"/><pair kern="-9" kpx2="7812"/><pair kern="-9" kpx2="221"/><pair kern="-29" kpx2="84"/><pair kern="-9" kpx2="87"/><pair kern="-9" kpx2="86"/><pair kern="-9" kpx2="7808"/><pair kern="-9" kpx2="7810"/><pair kern="-40" kpx2="8218"/><pair kern="-9" kpx2="89"/><pair kern="-20" kpx2="88"/><pair kern="-40" kpx2="8222"/><pair kern="-20" kpx2="7680"/><pair kern="-9" kpx2="90"/><pair kern="-9" kpx2="372"/><pair kern="-20" kpx2="7862"/><pair kern="-9" kpx2="374"/><pair kern="-20" kpx2="7860"/><pair kern="-20" kpx2="7858"/><pair kern="-20" kpx2="506"/><pair kern="-20" kpx2="7856"/><pair kern="-9" kpx2="381"/><pair kern="-9" kpx2="377"/><pair kern="-9" kpx2="376"/><pair kern="-9" kpx2="379"/><pair kern="-29" kpx2="356"/><pair kern="-20" kpx2="7846"/><pair kern="-20" kpx2="7844"/><pair kern="-20" kpx2="7842"/><pair kern="-29" kpx2="354"/><pair kern="-20" kpx2="7840"/><pair kern="-20" kpx2="7854"/><pair kern="-20" kpx2="7852"/><pair kern="-20" kpx2="7850"/><pair kern="-20" kpx2="7848"/></kerning><kerning kpx1="69"><pair kern="60" kpx2="74"/></kerning><kerning kpx1="1033"><pair kern="-20" kpx2="1098"/><pair kern="-20" kpx2="1228"/><pair kern="-20" kpx2="1095"/><pair kern="-20" kpx2="1090"/><pair kern="-49" kpx2="1227"/><pair kern="-20" kpx2="1091"/><pair kern="-20" kpx2="1118"/><pair kern="-40" kpx2="34"/><pair kern="-40" kpx2="39"/><pair kern="-20" kpx2="1263"/><pair kern="-20" kpx2="1262"/><pair kern="-40" kpx2="1122"/><pair kern="-49" kpx2="1268"/><pair kern="-20" kpx2="1269"/><pair kern="-20" kpx2="1266"/><pair kern="-20" kpx2="1267"/><pair kern="-20" kpx2="1264"/><pair kern="-20" kpx2="1265"/><pair kern="-40" kpx2="1142"/><pair kern="-40" kpx2="1140"/><pair kern="-40" kpx2="1274"/><pair kern="-49" kpx2="1136"/><pair kern="-60" kpx2="1035"/><pair kern="-20" kpx2="1038"/><pair kern="-60" kpx2="1026"/><pair kern="-40" kpx2="1164"/><pair kern="-40" kpx2="1170"/><pair kern="-60" kpx2="1294"/><pair kern="-20" kpx2="1295"/><pair kern="-40" kpx2="8217"/><pair kern="-49" kpx2="1286"/><pair kern="-29" kpx2="1287"/><pair kern="-49" kpx2="1284"/><pair kern="-40" kpx2="1182"/><pair kern="-40" kpx2="8221"/><pair kern="-29" kpx2="1285"/><pair kern="-60" kpx2="1066"/><pair kern="-20" kpx2="1185"/><pair kern="-60" kpx2="1184"/><pair kern="-49" kpx2="1058"/><pair kern="-20" kpx2="1059"/><pair kern="-20" kpx2="1199"/><pair kern="-49" kpx2="1063"/><pair kern="-49" kpx2="1198"/><pair kern="-20" kpx2="1197"/><pair kern="-49" kpx2="1196"/><pair kern="-49" kpx2="1200"/><pair kern="-20" kpx2="1201"/><pair kern="-49" kpx2="1206"/><pair kern="-20" kpx2="1207"/><pair kern="-60" kpx2="1204"/><pair kern="-20" kpx2="1205"/><pair kern="-49" kpx2="1208"/><pair kern="-20" kpx2="1209"/></kerning><kerning kpx1="70"><pair kern="-20" kpx2="65"/><pair kern="-20" kpx2="197"/><pair kern="-20" kpx2="196"/><pair kern="-20" kpx2="193"/><pair kern="-20" kpx2="192"/><pair kern="-20" kpx2="195"/><pair kern="-20" kpx2="194"/><pair kern="-20" kpx2="258"/><pair kern="-20" kpx2="256"/><pair kern="-20" kpx2="260"/><pair kern="-60" kpx2="8218"/><pair kern="-60" kpx2="8222"/><pair kern="-20" kpx2="7680"/><pair kern="-20" kpx2="7862"/><pair kern="-20" kpx2="7860"/><pair kern="-20" kpx2="7858"/><pair kern="-20" kpx2="506"/><pair kern="-20" kpx2="7856"/><pair kern="-60" kpx2="46"/><pair kern="-60" kpx2="44"/><pair kern="-20" kpx2="7846"/><pair kern="-20" kpx2="7844"/><pair kern="-20" kpx2="7842"/><pair kern="-20" kpx2="7840"/><pair kern="-20" kpx2="7854"/><pair kern="-20" kpx2="7852"/><pair kern="20" kpx2="63"/><pair kern="-20" kpx2="7850"/><pair kern="-20" kpx2="7848"/></kerning><kerning kpx1="1034"><pair kern="-20" kpx2="1098"/><pair kern="-20" kpx2="1228"/><pair kern="-20" kpx2="1095"/><pair kern="-20" kpx2="1090"/><pair kern="-49" kpx2="1227"/><pair kern="-20" kpx2="1091"/><pair kern="-20" kpx2="1118"/><pair kern="-40" kpx2="34"/><pair kern="-40" kpx2="39"/><pair kern="-20" kpx2="1263"/><pair kern="-20" kpx2="1262"/><pair kern="-40" kpx2="1122"/><pair kern="-49" kpx2="1268"/><pair kern="-20" kpx2="1269"/><pair kern="-20" kpx2="1266"/><pair kern="-20" kpx2="1267"/><pair kern="-20" kpx2="1264"/><pair kern="-20" kpx2="1265"/><pair kern="-40" kpx2="1142"/><pair kern="-40" kpx2="1140"/><pair kern="-40" kpx2="1274"/><pair kern="-49" kpx2="1136"/><pair kern="-60" kpx2="1035"/><pair kern="-20" kpx2="1038"/><pair kern="-60" kpx2="1026"/><pair kern="-40" kpx2="1164"/><pair kern="-40" kpx2="1170"/><pair kern="-60" kpx2="1294"/><pair kern="-20" kpx2="1295"/><pair kern="-40" kpx2="8217"/><pair kern="-49" kpx2="1286"/><pair kern="-29" kpx2="1287"/><pair kern="-49" kpx2="1284"/><pair kern="-40" kpx2="1182"/><pair kern="-40" kpx2="8221"/><pair kern="-29" kpx2="1285"/><pair kern="-60" kpx2="1066"/><pair kern="-20" kpx2="1185"/><pair kern="-60" kpx2="1184"/><pair kern="-49" kpx2="1058"/><pair kern="-20" kpx2="1059"/><pair kern="-20" kpx2="1199"/><pair kern="-49" kpx2="1063"/><pair kern="-49" kpx2="1198"/><pair kern="-20" kpx2="1197"/><pair kern="-49" kpx2="1196"/><pair kern="-49" kpx2="1200"/><pair kern="-20" kpx2="1201"/><pair kern="-49" kpx2="1206"/><pair kern="-20" kpx2="1207"/><pair kern="-60" kpx2="1204"/><pair kern="-20" kpx2="1205"/><pair kern="-49" kpx2="1208"/><pair kern="-20" kpx2="1209"/></kerning><kerning kpx1="1035"><pair kern="-20" kpx2="1098"/><pair kern="-20" kpx2="1228"/><pair kern="-20" kpx2="1095"/><pair kern="-20" kpx2="1090"/><pair kern="-49" kpx2="1227"/><pair kern="-20" kpx2="1091"/><pair kern="-20" kpx2="1118"/><pair kern="-40" kpx2="34"/><pair kern="-40" kpx2="39"/><pair kern="-20" kpx2="1263"/><pair kern="-20" kpx2="1262"/><pair kern="-40" kpx2="1122"/><pair kern="-49" kpx2="1268"/><pair kern="-20" kpx2="1269"/><pair kern="-20" kpx2="1266"/><pair kern="-20" kpx2="1267"/><pair kern="-20" kpx2="1264"/><pair kern="-20" kpx2="1265"/><pair kern="-40" kpx2="1142"/><pair kern="-40" kpx2="1140"/><pair kern="-40" kpx2="1274"/><pair kern="-49" kpx2="1136"/><pair kern="-60" kpx2="1035"/><pair kern="-20" kpx2="1038"/><pair kern="-60" kpx2="1026"/><pair kern="-40" kpx2="1164"/><pair kern="-40" kpx2="1170"/><pair kern="-60" kpx2="1294"/><pair kern="-20" kpx2="1295"/><pair kern="-40" kpx2="8217"/><pair kern="-49" kpx2="1286"/><pair kern="-29" kpx2="1287"/><pair kern="-49" kpx2="1284"/><pair kern="-40" kpx2="1182"/><pair kern="-40" kpx2="8221"/><pair kern="-29" kpx2="1285"/><pair kern="-60" kpx2="1066"/><pair kern="-20" kpx2="1185"/><pair kern="-60" kpx2="1184"/><pair kern="-49" kpx2="1058"/><pair kern="-20" kpx2="1059"/><pair kern="-20" kpx2="1199"/><pair kern="-49" kpx2="1063"/><pair kern="-49" kpx2="1198"/><pair kern="-20" kpx2="1197"/><pair kern="-49" kpx2="1196"/><pair kern="-49" kpx2="1200"/><pair kern="-20" kpx2="1201"/><pair kern="-49" kpx2="1206"/><pair kern="-20" kpx2="1207"/><pair kern="-60" kpx2="1204"/><pair kern="-20" kpx2="1205"/><pair kern="-49" kpx2="1208"/><pair kern="-20" kpx2="1209"/></kerning><kerning kpx1="1036"><pair kern="-20" kpx2="1152"/><pair kern="-20" kpx2="1228"/><pair kern="-9" kpx2="1296"/><pair kern="-20" kpx2="1095"/><pair kern="-20" kpx2="1028"/><pair kern="-20" kpx2="1227"/><pair kern="-20" kpx2="1292"/><pair kern="-20" kpx2="1054"/><pair kern="-20" kpx2="1282"/><pair kern="-20" kpx2="1280"/><pair kern="-20" kpx2="1287"/><pair kern="-20" kpx2="1285"/><pair kern="-20" kpx2="1254"/><pair kern="-20" kpx2="1194"/><pair kern="-20" kpx2="1057"/><pair kern="-20" kpx2="1192"/><pair kern="-20" kpx2="1258"/><pair kern="-20" kpx2="1063"/><pair kern="-20" kpx2="1120"/><pair kern="-20" kpx2="1060"/><pair kern="-20" kpx2="1256"/><pair kern="-20" kpx2="1150"/><pair kern="-20" kpx2="1268"/><pair kern="-20" kpx2="1269"/><pair kern="-20" kpx2="1148"/><pair kern="-20" kpx2="1206"/><pair kern="-20" kpx2="1146"/><pair kern="-20" kpx2="1207"/><pair kern="-20" kpx2="1144"/><pair kern="-20" kpx2="1208"/><pair kern="-20" kpx2="1209"/><pair kern="-49" kpx2="1214"/><pair kern="-20" kpx2="1138"/><pair kern="-49" kpx2="1212"/><pair kern="-20" kpx2="1136"/></kerning><kerning kpx1="65"><pair kern="-20" kpx2="7888"/><pair kern="-20" kpx2="7890"/><pair kern="-20" kpx2="7892"/><pair kern="-20" kpx2="7894"/><pair kern="-20" kpx2="7896"/><pair kern="-20" kpx2="7898"/><pair kern="-20" kpx2="7900"/><pair kern="-20" kpx2="286"/><pair kern="-20" kpx2="7902"/><pair kern="-20" kpx2="284"/><pair kern="-20" kpx2="262"/><pair kern="-20" kpx2="266"/><pair kern="-20" kpx2="264"/><pair kern="-20" kpx2="7884"/><pair kern="-20" kpx2="268"/><pair kern="-20" kpx2="7886"/><pair kern="-69" kpx2="34"/><pair kern="-60" kpx2="7922"/><pair kern="-60" kpx2="7926"/><pair kern="-69" kpx2="39"/><pair kern="-60" kpx2="7924"/><pair kern="-60" kpx2="7928"/><pair kern="-20" kpx2="7906"/><pair kern="-20" kpx2="288"/><pair kern="-20" kpx2="7904"/><pair kern="-20" kpx2="290"/><pair kern="-20" kpx2="416"/><pair kern="-69" kpx2="538"/><pair kern="-20" kpx2="71"/><pair kern="-20" kpx2="338"/><pair kern="-20" kpx2="67"/><pair kern="-20" kpx2="336"/><pair kern="-20" kpx2="199"/><pair kern="-20" kpx2="79"/><pair kern="129" kpx2="74"/><pair kern="-40" kpx2="7812"/><pair kern="-60" kpx2="221"/><pair kern="-69" kpx2="84"/><pair kern="-40" kpx2="87"/><pair kern="-40" kpx2="86"/><pair kern="-20" kpx2="216"/><pair kern="-20" kpx2="81"/><pair kern="-40" kpx2="7808"/><pair kern="-40" kpx2="7810"/><pair kern="-20" kpx2="212"/><pair kern="-20" kpx2="334"/><pair kern="-20" kpx2="213"/><pair kern="-20" kpx2="214"/><pair kern="-20" kpx2="332"/><pair kern="-69" kpx2="8217"/><pair kern="-60" kpx2="89"/><pair kern="-20" kpx2="210"/><pair kern="-69" kpx2="8221"/><pair kern="-20" kpx2="211"/><pair kern="-40" kpx2="372"/><pair kern="-20" kpx2="510"/><pair kern="-60" kpx2="374"/><pair kern="-60" kpx2="376"/><pair kern="-69" kpx2="356"/><pair kern="-69" kpx2="354"/></kerning><kerning kpx1="66"><pair kern="-20" kpx2="258"/><pair kern="-20" kpx2="256"/><pair kern="-20" kpx2="260"/><pair kern="-9" kpx2="7922"/><pair kern="-9" kpx2="7926"/><pair kern="-9" kpx2="7924"/><pair kern="-9" kpx2="7928"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="44"/><pair kern="-29" kpx2="538"/><pair kern="-20" kpx2="65"/><pair kern="-20" kpx2="197"/><pair kern="-20" kpx2="196"/><pair kern="-20" kpx2="193"/><pair kern="-20" kpx2="192"/><pair kern="-9" kpx2="1029"/><pair kern="-20" kpx2="195"/><pair kern="-20" kpx2="194"/><pair kern="-9" kpx2="7812"/><pair kern="-9" kpx2="221"/><pair kern="-29" kpx2="84"/><pair kern="-9" kpx2="87"/><pair kern="-9" kpx2="86"/><pair kern="-9" kpx2="7808"/><pair kern="-9" kpx2="7810"/><pair kern="-40" kpx2="8218"/><pair kern="-9" kpx2="89"/><pair kern="-20" kpx2="88"/><pair kern="-40" kpx2="8222"/><pair kern="-20" kpx2="7680"/><pair kern="-9" kpx2="90"/><pair kern="-9" kpx2="372"/><pair kern="-20" kpx2="7862"/><pair kern="-9" kpx2="374"/><pair kern="-20" kpx2="7860"/><pair kern="-20" kpx2="7858"/><pair kern="-20" kpx2="506"/><pair kern="-20" kpx2="7856"/><pair kern="-9" kpx2="381"/><pair kern="-9" kpx2="377"/><pair kern="-9" kpx2="376"/><pair kern="-9" kpx2="379"/><pair kern="-29" kpx2="356"/><pair kern="-20" kpx2="7846"/><pair kern="-20" kpx2="7844"/><pair kern="-20" kpx2="7842"/><pair kern="-29" kpx2="354"/><pair kern="-20" kpx2="7840"/><pair kern="-20" kpx2="7854"/><pair kern="-20" kpx2="7852"/><pair kern="-20" kpx2="7850"/><pair kern="-20" kpx2="7848"/></kerning><kerning kpx1="1038"><pair kern="-49" kpx2="1221"/><pair kern="-40" kpx2="1222"/><pair kern="-20" kpx2="1092"/><pair kern="-20" kpx2="1228"/><pair kern="-20" kpx2="1095"/><pair kern="-20" kpx2="1089"/><pair kern="-69" kpx2="1236"/><pair kern="-20" kpx2="1239"/><pair kern="-69" kpx2="1232"/><pair kern="-40" kpx2="1113"/><pair kern="-69" kpx2="1234"/><pair kern="49" kpx2="1115"/><pair kern="-9" kpx2="1109"/><pair kern="-20" kpx2="1108"/><pair kern="-20" kpx2="1105"/><pair kern="-20" kpx2="1104"/><pair kern="49" kpx2="1106"/><pair kern="-20" kpx2="1255"/><pair kern="-9" kpx2="1254"/><pair kern="-69" kpx2="1126"/><pair kern="-40" kpx2="1127"/><pair kern="-20" kpx2="1259"/><pair kern="-60" kpx2="46"/><pair kern="-9" kpx2="1258"/><pair kern="-20" kpx2="1257"/><pair kern="-60" kpx2="44"/><pair kern="-9" kpx2="1120"/><pair kern="-9" kpx2="1256"/><pair kern="-9" kpx2="1150"/><pair kern="-20" kpx2="1149"/><pair kern="-20" kpx2="1269"/><pair kern="-9" kpx2="1148"/><pair kern="-20" kpx2="1147"/><pair kern="-9" kpx2="1146"/><pair kern="-20" kpx2="1145"/><pair kern="-9" kpx2="1144"/><pair kern="-20" kpx2="1139"/><pair kern="-9" kpx2="1138"/><pair kern="-20" kpx2="1153"/><pair kern="-49" kpx2="1033"/><pair kern="-9" kpx2="1152"/><pair kern="-40" kpx2="1299"/><pair kern="-49" kpx2="1298"/><pair kern="-20" kpx2="1297"/><pair kern="-9" kpx2="1028"/><pair kern="49" kpx2="1165"/><pair kern="-49" kpx2="1288"/><pair kern="-49" kpx2="1051"/><pair kern="-40" kpx2="1289"/><pair kern="-9" kpx2="1292"/><pair kern="-20" kpx2="1293"/><pair kern="-9" kpx2="1054"/><pair kern="-69" kpx2="1282"/><pair kern="-20" kpx2="1283"/><pair kern="-69" kpx2="1040"/><pair kern="-60" kpx2="8218"/><pair kern="-69" kpx2="1280"/><pair kern="-20" kpx2="1281"/><pair kern="-49" kpx2="1044"/><pair kern="-60" kpx2="8222"/><pair kern="49" kpx2="1183"/><pair kern="-9" kpx2="1071"/><pair kern="-20" kpx2="1195"/><pair kern="-9" kpx2="1194"/><pair kern="-20" kpx2="1193"/><pair kern="-9" kpx2="1057"/><pair kern="-9" kpx2="1192"/><pair kern="-29" kpx2="1060"/><pair kern="-40" kpx2="1083"/><pair kern="-20" kpx2="1086"/><pair kern="-20" kpx2="1207"/><pair kern="-20" kpx2="1209"/><pair kern="-20" kpx2="1214"/><pair kern="-29" kpx2="1215"/><pair kern="-20" kpx2="1212"/><pair kern="-20" kpx2="1077"/><pair kern="-29" kpx2="1213"/><pair kern="-40" kpx2="1076"/></kerning><kerning kpx1="67"><pair kern="-20" kpx2="7888"/><pair kern="-20" kpx2="7890"/><pair kern="-20" kpx2="71"/><pair kern="-20" kpx2="7892"/><pair kern="-20" kpx2="338"/><pair kern="-20" kpx2="7894"/><pair kern="-20" kpx2="67"/><pair kern="-20" kpx2="336"/><pair kern="-20" kpx2="7896"/><pair kern="-20" kpx2="199"/><pair kern="-20" kpx2="7898"/><pair kern="-20" kpx2="79"/><pair kern="-20" kpx2="7900"/><pair kern="-20" kpx2="286"/><pair kern="-20" kpx2="7902"/><pair kern="-20" kpx2="284"/><pair kern="-20" kpx2="262"/><pair kern="-20" kpx2="216"/><pair kern="-20" kpx2="81"/><pair kern="-20" kpx2="212"/><pair kern="-20" kpx2="266"/><pair kern="-20" kpx2="334"/><pair kern="-20" kpx2="213"/><pair kern="-20" kpx2="214"/><pair kern="-20" kpx2="264"/><pair kern="-20" kpx2="332"/><pair kern="-20" kpx2="7884"/><pair kern="-20" kpx2="7886"/><pair kern="-20" kpx2="210"/><pair kern="-20" kpx2="268"/><pair kern="-20" kpx2="211"/><pair kern="-20" kpx2="510"/><pair kern="-20" kpx2="7906"/><pair kern="-20" kpx2="288"/><pair kern="-20" kpx2="7904"/><pair kern="-20" kpx2="290"/><pair kern="-20" kpx2="416"/></kerning><kerning kpx1="76"><pair kern="-20" kpx2="7888"/><pair kern="-20" kpx2="7890"/><pair kern="-20" kpx2="7892"/><pair kern="-20" kpx2="7894"/><pair kern="-20" kpx2="7896"/><pair kern="-20" kpx2="7898"/><pair kern="-20" kpx2="7900"/><pair kern="-20" kpx2="286"/><pair kern="-20" kpx2="7902"/><pair kern="-20" kpx2="284"/><pair kern="-20" kpx2="262"/><pair kern="-20" kpx2="266"/><pair kern="-20" kpx2="264"/><pair kern="-20" kpx2="7884"/><pair kern="-20" kpx2="7886"/><pair kern="-20" kpx2="268"/><pair kern="-80" kpx2="34"/><pair kern="-29" kpx2="7922"/><pair kern="-9" kpx2="7920"/><pair kern="-29" kpx2="7926"/><pair kern="-80" kpx2="39"/><pair kern="-29" kpx2="7924"/><pair kern="-29" kpx2="7928"/><pair kern="-20" kpx2="7906"/><pair kern="-20" kpx2="288"/><pair kern="-20" kpx2="7904"/><pair kern="-20" kpx2="290"/><pair kern="-9" kpx2="7910"/><pair kern="-9" kpx2="7908"/><pair kern="-9" kpx2="431"/><pair kern="-9" kpx2="7914"/><pair kern="-20" kpx2="416"/><pair kern="-9" kpx2="7912"/><pair kern="-9" kpx2="7918"/><pair kern="-9" kpx2="7916"/><pair kern="-20" kpx2="538"/><pair kern="-20" kpx2="71"/><pair kern="-20" kpx2="338"/><pair kern="-20" kpx2="67"/><pair kern="-20" kpx2="336"/><pair kern="-20" kpx2="199"/><pair kern="-20" kpx2="79"/><pair kern="-20" kpx2="7812"/><pair kern="-9" kpx2="220"/><pair kern="-9" kpx2="85"/><pair kern="-29" kpx2="221"/><pair kern="-20" kpx2="84"/><pair kern="-20" kpx2="87"/><pair kern="-20" kpx2="86"/><pair kern="-20" kpx2="216"/><pair kern="-20" kpx2="81"/><pair kern="-20" kpx2="7808"/><pair kern="-9" kpx2="217"/><pair kern="-20" kpx2="7810"/><pair kern="-9" kpx2="218"/><pair kern="-9" kpx2="219"/><pair kern="-20" kpx2="212"/><pair kern="-20" kpx2="334"/><pair kern="-20" kpx2="213"/><pair kern="-80" kpx2="8217"/><pair kern="-20" kpx2="214"/><pair kern="-20" kpx2="332"/><pair kern="-29" kpx2="89"/><pair kern="-80" kpx2="8221"/><pair kern="-20" kpx2="210"/><pair kern="-20" kpx2="211"/><pair kern="-20" kpx2="372"/><pair kern="-20" kpx2="510"/><pair kern="-29" kpx2="374"/><pair kern="-9" kpx2="368"/><pair kern="-9" kpx2="370"/><pair kern="-29" kpx2="376"/><pair kern="-20" kpx2="356"/><pair kern="-20" kpx2="354"/><pair kern="-9" kpx2="364"/><pair kern="-9" kpx2="366"/><pair kern="-9" kpx2="360"/><pair kern="-9" kpx2="362"/></kerning><kerning kpx1="1026"><pair kern="-20" kpx2="1098"/><pair kern="-20" kpx2="1228"/><pair kern="-20" kpx2="1095"/><pair kern="-20" kpx2="1090"/><pair kern="-49" kpx2="1227"/><pair kern="-20" kpx2="1091"/><pair kern="-20" kpx2="1118"/><pair kern="-40" kpx2="34"/><pair kern="-40" kpx2="39"/><pair kern="-20" kpx2="1263"/><pair kern="-20" kpx2="1262"/><pair kern="-40" kpx2="1122"/><pair kern="-49" kpx2="1268"/><pair kern="-20" kpx2="1269"/><pair kern="-20" kpx2="1266"/><pair kern="-20" kpx2="1267"/><pair kern="-20" kpx2="1264"/><pair kern="-20" kpx2="1265"/><pair kern="-40" kpx2="1142"/><pair kern="-40" kpx2="1140"/><pair kern="-40" kpx2="1274"/><pair kern="-49" kpx2="1136"/><pair kern="-60" kpx2="1035"/><pair kern="-20" kpx2="1038"/><pair kern="-60" kpx2="1026"/><pair kern="-40" kpx2="1164"/><pair kern="-40" kpx2="1170"/><pair kern="-60" kpx2="1294"/><pair kern="-20" kpx2="1295"/><pair kern="-40" kpx2="8217"/><pair kern="-49" kpx2="1286"/><pair kern="-29" kpx2="1287"/><pair kern="-49" kpx2="1284"/><pair kern="-40" kpx2="1182"/><pair kern="-40" kpx2="8221"/><pair kern="-29" kpx2="1285"/><pair kern="-60" kpx2="1066"/><pair kern="-20" kpx2="1185"/><pair kern="-60" kpx2="1184"/><pair kern="-49" kpx2="1058"/><pair kern="-20" kpx2="1059"/><pair kern="-20" kpx2="1199"/><pair kern="-49" kpx2="1063"/><pair kern="-49" kpx2="1198"/><pair kern="-20" kpx2="1197"/><pair kern="-49" kpx2="1196"/><pair kern="-49" kpx2="1200"/><pair kern="-20" kpx2="1201"/><pair kern="-49" kpx2="1206"/><pair kern="-20" kpx2="1207"/><pair kern="-60" kpx2="1204"/><pair kern="-20" kpx2="1205"/><pair kern="-49" kpx2="1208"/><pair kern="-20" kpx2="1209"/></kerning><kerning kpx1="79"><pair kern="-20" kpx2="258"/><pair kern="-20" kpx2="256"/><pair kern="-20" kpx2="260"/><pair kern="-9" kpx2="7922"/><pair kern="-9" kpx2="7926"/><pair kern="-9" kpx2="7924"/><pair kern="-9" kpx2="7928"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="44"/><pair kern="-29" kpx2="538"/><pair kern="-20" kpx2="65"/><pair kern="-20" kpx2="197"/><pair kern="-20" kpx2="196"/><pair kern="-20" kpx2="193"/><pair kern="-20" kpx2="192"/><pair kern="-9" kpx2="1029"/><pair kern="-20" kpx2="195"/><pair kern="-20" kpx2="194"/><pair kern="-9" kpx2="7812"/><pair kern="-9" kpx2="221"/><pair kern="-29" kpx2="84"/><pair kern="-9" kpx2="87"/><pair kern="-9" kpx2="86"/><pair kern="-9" kpx2="7808"/><pair kern="-9" kpx2="7810"/><pair kern="-40" kpx2="8218"/><pair kern="-9" kpx2="89"/><pair kern="-20" kpx2="88"/><pair kern="-40" kpx2="8222"/><pair kern="-20" kpx2="7680"/><pair kern="-9" kpx2="90"/><pair kern="-9" kpx2="372"/><pair kern="-20" kpx2="7862"/><pair kern="-9" kpx2="374"/><pair kern="-20" kpx2="7860"/><pair kern="-20" kpx2="7858"/><pair kern="-20" kpx2="506"/><pair kern="-20" kpx2="7856"/><pair kern="-9" kpx2="381"/><pair kern="-9" kpx2="377"/><pair kern="-9" kpx2="376"/><pair kern="-9" kpx2="379"/><pair kern="-29" kpx2="356"/><pair kern="-20" kpx2="7846"/><pair kern="-20" kpx2="7844"/><pair kern="-20" kpx2="7842"/><pair kern="-29" kpx2="354"/><pair kern="-20" kpx2="7840"/><pair kern="-20" kpx2="7854"/><pair kern="-20" kpx2="7852"/><pair kern="-20" kpx2="7850"/><pair kern="-20" kpx2="7848"/></kerning><kerning kpx1="1027"><pair kern="-49" kpx2="1100"/><pair kern="-20" kpx2="1101"/><pair kern="-49" kpx2="1102"/><pair kern="-29" kpx2="1103"/><pair kern="-49" kpx2="1096"/><pair kern="-49" kpx2="1097"/><pair kern="-40" kpx2="1098"/><pair kern="-49" kpx2="1099"/><pair kern="-69" kpx2="1092"/><pair kern="-20" kpx2="1093"/><pair kern="-49" kpx2="1094"/><pair kern="-49" kpx2="1095"/><pair kern="-49" kpx2="1088"/><pair kern="-69" kpx2="1089"/><pair kern="-40" kpx2="1090"/><pair kern="-40" kpx2="1091"/><pair kern="-49" kpx2="1117"/><pair kern="-49" kpx2="1116"/><pair kern="-49" kpx2="1119"/><pair kern="-40" kpx2="1118"/><pair kern="-60" kpx2="1113"/><pair kern="-49" kpx2="1114"/><pair kern="-60" kpx2="1109"/><pair kern="-69" kpx2="1108"/><pair kern="-69" kpx2="1105"/><pair kern="-69" kpx2="1104"/><pair kern="-49" kpx2="1107"/><pair kern="-49" kpx2="1133"/><pair kern="-49" kpx2="1131"/><pair kern="-49" kpx2="1129"/><pair kern="-69" kpx2="1126"/><pair kern="-60" kpx2="1127"/><pair kern="-49" kpx2="1125"/><pair kern="-60" kpx2="46"/><pair kern="-60" kpx2="44"/><pair kern="-20" kpx2="1120"/><pair kern="-40" kpx2="45"/><pair kern="-20" kpx2="1121"/><pair kern="-20" kpx2="1151"/><pair kern="-20" kpx2="1150"/><pair kern="-69" kpx2="1149"/><pair kern="-20" kpx2="1148"/><pair kern="-69" kpx2="1147"/><pair kern="-20" kpx2="1146"/><pair kern="-69" kpx2="1145"/><pair kern="-20" kpx2="1144"/><pair kern="-20" kpx2="1143"/><pair kern="-20" kpx2="1141"/><pair kern="-69" kpx2="1139"/><pair kern="-20" kpx2="1138"/><pair kern="-49" kpx2="1137"/><pair kern="-49" kpx2="1033"/><pair kern="-60" kpx2="1299"/><pair kern="-49" kpx2="1298"/><pair kern="-69" kpx2="1297"/><pair kern="-20" kpx2="1028"/><pair kern="-40" kpx2="8211"/><pair kern="-49" kpx2="1291"/><pair kern="-49" kpx2="1288"/><pair kern="-49" kpx2="1051"/><pair kern="-60" kpx2="1289"/><pair kern="-40" kpx2="1295"/><pair kern="-20" kpx2="1292"/><pair kern="-40" kpx2="8213"/><pair kern="-69" kpx2="1293"/><pair kern="-20" kpx2="1054"/><pair kern="-40" kpx2="8212"/><pair kern="-69" kpx2="1282"/><pair kern="-69" kpx2="1283"/><pair kern="-69" kpx2="1040"/><pair kern="-60" kpx2="8218"/><pair kern="-69" kpx2="1280"/><pair kern="-69" kpx2="1281"/><pair kern="-49" kpx2="1287"/><pair kern="-49" kpx2="1044"/><pair kern="-60" kpx2="8222"/><pair kern="-49" kpx2="1285"/><pair kern="20" kpx2="1058"/><pair kern="-20" kpx2="1057"/><pair kern="-40" kpx2="1060"/><pair kern="-60" kpx2="1083"/><pair kern="-49" kpx2="1082"/><pair kern="-49" kpx2="1081"/><pair kern="-49" kpx2="1080"/><pair kern="-49" kpx2="1087"/><pair kern="-69" kpx2="1086"/><pair kern="-49" kpx2="1085"/><pair kern="-49" kpx2="1084"/><pair kern="-49" kpx2="1075"/><pair kern="-49" kpx2="1074"/><pair kern="-20" kpx2="1079"/><pair kern="-20" kpx2="1078"/><pair kern="-69" kpx2="1077"/><pair kern="-60" kpx2="1076"/><pair kern="-49" kpx2="1221"/><pair kern="-49" kpx2="1220"/><pair kern="-60" kpx2="1222"/><pair kern="-20" kpx2="1218"/><pair kern="-49" kpx2="1228"/><pair kern="-49" kpx2="1230"/><pair kern="-49" kpx2="1224"/><pair kern="-49" kpx2="1226"/><pair kern="-69" kpx2="1236"/><pair kern="-69" kpx2="1239"/><pair kern="-69" kpx2="1232"/><pair kern="-69" kpx2="1234"/><pair kern="-20" kpx2="1245"/><pair kern="-20" kpx2="1247"/><pair kern="-69" kpx2="1255"/><pair kern="-20" kpx2="1254"/><pair kern="-49" kpx2="1253"/><pair kern="-49" kpx2="1251"/><pair kern="-29" kpx2="1249"/><pair kern="-40" kpx2="1263"/><pair kern="-20" kpx2="1261"/><pair kern="-69" kpx2="1259"/><pair kern="-20" kpx2="1258"/><pair kern="-69" kpx2="1257"/><pair kern="-20" kpx2="1256"/><pair kern="-49" kpx2="1271"/><pair kern="-49" kpx2="1269"/><pair kern="-40" kpx2="1267"/><pair kern="-40" kpx2="1265"/><pair kern="-20" kpx2="1279"/><pair kern="-20" kpx2="1277"/><pair kern="-49" kpx2="1273"/><pair kern="-69" kpx2="1153"/><pair kern="-20" kpx2="1152"/><pair kern="-49" kpx2="1163"/><pair kern="-49" kpx2="1167"/><pair kern="-49" kpx2="1169"/><pair kern="-49" kpx2="1173"/><pair kern="-20" kpx2="1175"/><pair kern="-20" kpx2="1177"/><pair kern="-49" kpx2="1179"/><pair kern="-49" kpx2="1181"/><pair kern="-49" kpx2="1187"/><pair kern="-40" kpx2="1185"/><pair kern="-49" kpx2="1191"/><pair kern="-49" kpx2="1189"/><pair kern="-69" kpx2="1195"/><pair kern="-20" kpx2="1194"/><pair kern="-69" kpx2="1193"/><pair kern="-20" kpx2="1192"/><pair kern="-40" kpx2="1199"/><pair kern="-40" kpx2="1197"/><pair kern="20" kpx2="1196"/><pair kern="-20" kpx2="1203"/><pair kern="-40" kpx2="1201"/><pair kern="-49" kpx2="1207"/><pair kern="-40" kpx2="1205"/><pair kern="-49" kpx2="1211"/><pair kern="-49" kpx2="1209"/><pair kern="-49" kpx2="1214"/><pair kern="-69" kpx2="1215"/><pair kern="-49" kpx2="1212"/><pair kern="-69" kpx2="1213"/></kerning><kerning kpx1="1028"><pair kern="-20" kpx2="1152"/><pair kern="-20" kpx2="1228"/><pair kern="-20" kpx2="1095"/><pair kern="-20" kpx2="1028"/><pair kern="-20" kpx2="1292"/><pair kern="-20" kpx2="1054"/><pair kern="-20" kpx2="1282"/><pair kern="-20" kpx2="1280"/><pair kern="-20" kpx2="1287"/><pair kern="-20" kpx2="1285"/><pair kern="-20" kpx2="1254"/><pair kern="-20" kpx2="1194"/><pair kern="-20" kpx2="1057"/><pair kern="-20" kpx2="1192"/><pair kern="-20" kpx2="1258"/><pair kern="-20" kpx2="1120"/><pair kern="-20" kpx2="1060"/><pair kern="-20" kpx2="1256"/><pair kern="-20" kpx2="1150"/><pair kern="-20" kpx2="1148"/><pair kern="-20" kpx2="1269"/><pair kern="-20" kpx2="1146"/><pair kern="-20" kpx2="1207"/><pair kern="-20" kpx2="1144"/><pair kern="-20" kpx2="1209"/><pair kern="-20" kpx2="1214"/><pair kern="-20" kpx2="1138"/><pair kern="-20" kpx2="1212"/></kerning><kerning kpx1="1029"><pair kern="-20" kpx2="1287"/><pair kern="-20" kpx2="1285"/></kerning><kerning kpx1="75"><pair kern="-20" kpx2="7888"/><pair kern="-20" kpx2="7890"/><pair kern="-20" kpx2="71"/><pair kern="-20" kpx2="7892"/><pair kern="-20" kpx2="338"/><pair kern="-20" kpx2="7894"/><pair kern="-20" kpx2="67"/><pair kern="-20" kpx2="336"/><pair kern="-20" kpx2="7896"/><pair kern="-20" kpx2="199"/><pair kern="-20" kpx2="7898"/><pair kern="-20" kpx2="79"/><pair kern="-20" kpx2="7900"/><pair kern="-20" kpx2="286"/><pair kern="-20" kpx2="7902"/><pair kern="-20" kpx2="284"/><pair kern="-20" kpx2="262"/><pair kern="-20" kpx2="216"/><pair kern="-20" kpx2="81"/><pair kern="-20" kpx2="212"/><pair kern="-20" kpx2="266"/><pair kern="-20" kpx2="334"/><pair kern="-20" kpx2="213"/><pair kern="-20" kpx2="214"/><pair kern="-20" kpx2="264"/><pair kern="-20" kpx2="332"/><pair kern="-20" kpx2="7884"/><pair kern="-20" kpx2="7886"/><pair kern="-20" kpx2="210"/><pair kern="-20" kpx2="268"/><pair kern="-20" kpx2="211"/><pair kern="-20" kpx2="510"/><pair kern="-20" kpx2="7906"/><pair kern="-20" kpx2="288"/><pair kern="-20" kpx2="7904"/><pair kern="-20" kpx2="290"/><pair kern="-20" kpx2="416"/></kerning><kerning kpx1="85"><pair kern="-9" kpx2="65"/><pair kern="-9" kpx2="197"/><pair kern="-9" kpx2="196"/><pair kern="-9" kpx2="193"/><pair kern="-9" kpx2="192"/><pair kern="-9" kpx2="195"/><pair kern="-9" kpx2="194"/><pair kern="-9" kpx2="258"/><pair kern="-9" kpx2="256"/><pair kern="-9" kpx2="260"/><pair kern="-20" kpx2="8218"/><pair kern="-20" kpx2="8222"/><pair kern="-9" kpx2="7680"/><pair kern="-9" kpx2="7862"/><pair kern="-9" kpx2="7860"/><pair kern="-9" kpx2="7858"/><pair kern="-9" kpx2="506"/><pair kern="-9" kpx2="7856"/><pair kern="-20" kpx2="46"/><pair kern="-20" kpx2="44"/><pair kern="-9" kpx2="7846"/><pair kern="-9" kpx2="7844"/><pair kern="-9" kpx2="7842"/><pair kern="-9" kpx2="7840"/><pair kern="-9" kpx2="7854"/><pair kern="-9" kpx2="7852"/><pair kern="-9" kpx2="7850"/><pair kern="-9" kpx2="7848"/></kerning><kerning kpx1="84"><pair kern="-60" kpx2="46"/><pair kern="-60" kpx2="44"/><pair kern="-40" kpx2="45"/><pair kern="20" kpx2="63"/><pair kern="-60" kpx2="537"/><pair kern="20" kpx2="538"/><pair kern="-20" kpx2="71"/><pair kern="-69" kpx2="65"/><pair kern="-20" kpx2="67"/><pair kern="-20" kpx2="79"/><pair kern="-40" kpx2="8211"/><pair kern="20" kpx2="84"/><pair kern="-20" kpx2="81"/><pair kern="-40" kpx2="8213"/><pair kern="-40" kpx2="8212"/><pair kern="-60" kpx2="8218"/><pair kern="-60" kpx2="8222"/><pair kern="-69" kpx2="103"/><pair kern="-69" kpx2="100"/><pair kern="-69" kpx2="101"/><pair kern="-69" kpx2="99"/><pair kern="-80" kpx2="97"/><pair kern="-49" kpx2="110"/><pair kern="-69" kpx2="111"/><pair kern="-49" kpx2="109"/><pair kern="-20" kpx2="119"/><pair kern="-20" kpx2="118"/><pair kern="-49" kpx2="117"/><pair kern="-60" kpx2="115"/><pair kern="-49" kpx2="114"/><pair kern="-69" kpx2="113"/><pair kern="-49" kpx2="112"/><pair kern="-40" kpx2="122"/><pair kern="-20" kpx2="121"/><pair kern="-20" kpx2="120"/><pair kern="-69" kpx2="197"/><pair kern="-69" kpx2="196"/><pair kern="-20" kpx2="199"/><pair kern="-69" kpx2="193"/><pair kern="-69" kpx2="192"/><pair kern="-69" kpx2="195"/><pair kern="-69" kpx2="194"/><pair kern="-20" kpx2="216"/><pair kern="-20" kpx2="212"/><pair kern="-20" kpx2="213"/><pair kern="-20" kpx2="214"/><pair kern="-20" kpx2="210"/><pair kern="-20" kpx2="211"/><pair kern="-69" kpx2="235"/><pair kern="-69" kpx2="234"/><pair kern="-69" kpx2="233"/><pair kern="-69" kpx2="232"/><pair kern="-69" kpx2="231"/><pair kern="-80" kpx2="230"/><pair kern="-80" kpx2="229"/><pair kern="-80" kpx2="228"/><pair kern="-80" kpx2="227"/><pair kern="-80" kpx2="226"/><pair kern="-80" kpx2="225"/><pair kern="-69" kpx2="224"/><pair kern="-49" kpx2="252"/><pair kern="-20" kpx2="253"/><pair kern="-49" kpx2="250"/><pair kern="-49" kpx2="251"/><pair kern="-69" kpx2="248"/><pair kern="-49" kpx2="249"/><pair kern="-69" kpx2="246"/><pair kern="-69" kpx2="244"/><pair kern="-69" kpx2="245"/><pair kern="-69" kpx2="242"/><pair kern="-69" kpx2="243"/><pair kern="-69" kpx2="275"/><pair kern="-69" kpx2="7889"/><pair kern="-20" kpx2="7888"/><pair kern="-69" kpx2="273"/><pair kern="-20" kpx2="7890"/><pair kern="-69" kpx2="279"/><pair kern="-69" kpx2="7893"/><pair kern="-20" kpx2="7892"/><pair kern="-69" kpx2="277"/><pair kern="-69" kpx2="7895"/><pair kern="-20" kpx2="7894"/><pair kern="-69" kpx2="283"/><pair kern="-69" kpx2="7897"/><pair kern="-20" kpx2="7896"/><pair kern="-69" kpx2="281"/><pair kern="-69" kpx2="7899"/><pair kern="-20" kpx2="7898"/><pair kern="-69" kpx2="287"/><pair kern="-69" kpx2="7901"/><pair kern="-20" kpx2="286"/><pair kern="-20" kpx2="7900"/><pair kern="-69" kpx2="285"/><pair kern="-69" kpx2="7903"/><pair kern="-20" kpx2="284"/><pair kern="-20" kpx2="7902"/><pair kern="-69" kpx2="258"/><pair kern="-80" kpx2="259"/><pair kern="-69" kpx2="256"/><pair kern="-80" kpx2="257"/><pair kern="-69" kpx2="7875"/><pair kern="-20" kpx2="262"/><pair kern="-69" kpx2="263"/><pair kern="-69" kpx2="7877"/><pair kern="-69" kpx2="260"/><pair kern="-80" kpx2="261"/><pair kern="-69" kpx2="7879"/><pair kern="-20" kpx2="266"/><pair kern="-69" kpx2="267"/><pair kern="-20" kpx2="264"/><pair kern="-69" kpx2="265"/><pair kern="-20" kpx2="7884"/><pair kern="-69" kpx2="271"/><pair kern="-69" kpx2="7885"/><pair kern="-20" kpx2="268"/><pair kern="-20" kpx2="7886"/><pair kern="-69" kpx2="269"/><pair kern="-69" kpx2="7887"/><pair kern="-49" kpx2="7921"/><pair kern="-20" kpx2="7925"/><pair kern="-49" kpx2="312"/><pair kern="-20" kpx2="288"/><pair kern="-20" kpx2="7906"/><pair kern="-69" kpx2="7907"/><pair kern="-69" kpx2="289"/><pair kern="-20" kpx2="290"/><pair kern="-20" kpx2="7904"/><pair kern="-69" kpx2="291"/><pair kern="-69" kpx2="7905"/><pair kern="-49" kpx2="7911"/><pair kern="-49" kpx2="7909"/><pair kern="-49" kpx2="7915"/><pair kern="-49" kpx2="7913"/><pair kern="-49" kpx2="7919"/><pair kern="-49" kpx2="7917"/><pair kern="-49" kpx2="343"/><pair kern="-49" kpx2="341"/><pair kern="-69" kpx2="339"/><pair kern="-20" kpx2="338"/><pair kern="-69" kpx2="337"/><pair kern="-20" kpx2="336"/><pair kern="-60" kpx2="351"/><pair kern="-60" kpx2="347"/><pair kern="-49" kpx2="326"/><pair kern="-49" kpx2="324"/><pair kern="-20" kpx2="7809"/><pair kern="-20" kpx2="7811"/><pair kern="-20" kpx2="334"/><pair kern="-69" kpx2="335"/><pair kern="-20" kpx2="332"/><pair kern="-69" kpx2="333"/><pair kern="-49" kpx2="331"/><pair kern="-20" kpx2="373"/><pair kern="-80" kpx2="7863"/><pair kern="-69" kpx2="7862"/><pair kern="-80" kpx2="7861"/><pair kern="-69" kpx2="7860"/><pair kern="-49" kpx2="369"/><pair kern="-80" kpx2="7859"/><pair kern="-69" kpx2="7858"/><pair kern="-49" kpx2="371"/><pair kern="-80" kpx2="7857"/><pair kern="-69" kpx2="7856"/><pair kern="-69" kpx2="7871"/><pair kern="-40" kpx2="380"/><pair kern="-69" kpx2="7869"/><pair kern="-40" kpx2="382"/><pair kern="-69" kpx2="7867"/><pair kern="-69" kpx2="7865"/><pair kern="-40" kpx2="378"/><pair kern="20" kpx2="356"/><pair kern="-69" kpx2="7846"/><pair kern="-69" kpx2="7844"/><pair kern="-80" kpx2="7845"/><pair kern="-69" kpx2="7842"/><pair kern="-80" kpx2="7843"/><pair kern="20" kpx2="354"/><pair kern="-69" kpx2="7840"/><pair kern="-80" kpx2="7841"/><pair kern="-69" kpx2="7854"/><pair kern="-49" kpx2="365"/><pair kern="-80" kpx2="7855"/><pair kern="-69" kpx2="7852"/><pair kern="-49" kpx2="367"/><pair kern="-80" kpx2="7853"/><pair kern="-69" kpx2="7850"/><pair kern="-49" kpx2="361"/><pair kern="-80" kpx2="7851"/><pair kern="-69" kpx2="7848"/><pair kern="-49" kpx2="363"/><pair kern="-80" kpx2="7849"/><pair kern="-49" kpx2="432"/><pair kern="-69" kpx2="417"/><pair kern="-20" kpx2="416"/><pair kern="-80" kpx2="7681"/><pair kern="-69" kpx2="7680"/><pair kern="-80" kpx2="509"/><pair kern="-49" kpx2="7743"/><pair kern="-20" kpx2="510"/><pair kern="-69" kpx2="511"/><pair kern="-69" kpx2="506"/><pair kern="-80" kpx2="507"/></kerning><kerning kpx1="87"><pair kern="-20" kpx2="7889"/><pair kern="-20" kpx2="275"/><pair kern="-9" kpx2="7888"/><pair kern="-20" kpx2="273"/><pair kern="-9" kpx2="7890"/><pair kern="-20" kpx2="7893"/><pair kern="-20" kpx2="279"/><pair kern="-9" kpx2="7892"/><pair kern="-20" kpx2="7895"/><pair kern="-20" kpx2="277"/><pair kern="-9" kpx2="7894"/><pair kern="-20" kpx2="7897"/><pair kern="-20" kpx2="283"/><pair kern="-9" kpx2="7896"/><pair kern="-20" kpx2="7899"/><pair kern="-20" kpx2="281"/><pair kern="-9" kpx2="7898"/><pair kern="-20" kpx2="7901"/><pair kern="-9" kpx2="287"/><pair kern="-9" kpx2="7900"/><pair kern="-9" kpx2="286"/><pair kern="-20" kpx2="7903"/><pair kern="-9" kpx2="285"/><pair kern="-9" kpx2="7902"/><pair kern="-9" kpx2="284"/><pair kern="-40" kpx2="258"/><pair kern="-20" kpx2="259"/><pair kern="-40" kpx2="256"/><pair kern="-20" kpx2="7875"/><pair kern="-20" kpx2="257"/><pair kern="-9" kpx2="262"/><pair kern="-20" kpx2="7877"/><pair kern="-20" kpx2="263"/><pair kern="-40" kpx2="260"/><pair kern="-20" kpx2="7879"/><pair kern="-20" kpx2="261"/><pair kern="-9" kpx2="266"/><pair kern="-20" kpx2="267"/><pair kern="-9" kpx2="264"/><pair kern="-20" kpx2="265"/><pair kern="-9" kpx2="7884"/><pair kern="-20" kpx2="7885"/><pair kern="-20" kpx2="271"/><pair kern="-9" kpx2="7886"/><pair kern="-9" kpx2="268"/><pair kern="-20" kpx2="7887"/><pair kern="-20" kpx2="269"/><pair kern="-9" kpx2="7921"/><pair kern="-9" kpx2="312"/><pair kern="-49" kpx2="46"/><pair kern="-49" kpx2="44"/><pair kern="-9" kpx2="7906"/><pair kern="-9" kpx2="288"/><pair kern="-20" kpx2="7907"/><pair kern="-9" kpx2="289"/><pair kern="-9" kpx2="7904"/><pair kern="-9" kpx2="290"/><pair kern="-20" kpx2="7905"/><pair kern="-9" kpx2="291"/><pair kern="-9" kpx2="7911"/><pair kern="-9" kpx2="7909"/><pair kern="-9" kpx2="7915"/><pair kern="-9" kpx2="7913"/><pair kern="-9" kpx2="537"/><pair kern="20" kpx2="63"/><pair kern="-9" kpx2="7919"/><pair kern="-9" kpx2="7917"/><pair kern="-9" kpx2="343"/><pair kern="-9" kpx2="341"/><pair kern="-9" kpx2="71"/><pair kern="-20" kpx2="339"/><pair kern="-40" kpx2="65"/><pair kern="-9" kpx2="338"/><pair kern="-20" kpx2="337"/><pair kern="-9" kpx2="67"/><pair kern="-9" kpx2="336"/><pair kern="-9" kpx2="351"/><pair kern="-9" kpx2="79"/><pair kern="-9" kpx2="347"/><pair kern="-9" kpx2="326"/><pair kern="-9" kpx2="324"/><pair kern="-9" kpx2="81"/><pair kern="-9" kpx2="334"/><pair kern="-49" kpx2="8218"/><pair kern="-20" kpx2="335"/><pair kern="-9" kpx2="332"/><pair kern="-20" kpx2="333"/><pair kern="-49" kpx2="8222"/><pair kern="-9" kpx2="331"/><pair kern="-20" kpx2="7863"/><pair kern="-40" kpx2="7862"/><pair kern="-9" kpx2="103"/><pair kern="-20" kpx2="7861"/><pair kern="-20" kpx2="100"/><pair kern="-40" kpx2="7860"/><pair kern="-20" kpx2="101"/><pair kern="-20" kpx2="7859"/><pair kern="-9" kpx2="369"/><pair kern="-40" kpx2="7858"/><pair kern="-20" kpx2="99"/><pair kern="-20" kpx2="7857"/><pair kern="-9" kpx2="371"/><pair kern="-40" kpx2="7856"/><pair kern="-20" kpx2="97"/><pair kern="-20" kpx2="7871"/><pair kern="-9" kpx2="110"/><pair kern="-20" kpx2="111"/><pair kern="-20" kpx2="7869"/><pair kern="-9" kpx2="109"/><pair kern="-20" kpx2="7867"/><pair kern="-20" kpx2="7865"/><pair kern="-40" kpx2="7846"/><pair kern="-40" kpx2="7844"/><pair kern="-9" kpx2="117"/><pair kern="-20" kpx2="7845"/><pair kern="-40" kpx2="7842"/><pair kern="-9" kpx2="115"/><pair kern="-20" kpx2="7843"/><pair kern="-9" kpx2="114"/><pair kern="-40" kpx2="7840"/><pair kern="-20" kpx2="113"/><pair kern="-20" kpx2="7841"/><pair kern="-9" kpx2="112"/><pair kern="-40" kpx2="7854"/><pair kern="-20" kpx2="7855"/><pair kern="-9" kpx2="365"/><pair kern="-40" kpx2="7852"/><pair kern="-20" kpx2="7853"/><pair kern="-9" kpx2="367"/><pair kern="-40" kpx2="7850"/><pair kern="-20" kpx2="7851"/><pair kern="-9" kpx2="361"/><pair kern="-40" kpx2="7848"/><pair kern="-20" kpx2="7849"/><pair kern="-9" kpx2="363"/><pair kern="-9" kpx2="432"/><pair kern="-20" kpx2="417"/><pair kern="-9" kpx2="416"/><pair kern="-40" kpx2="197"/><pair kern="-40" kpx2="196"/><pair kern="-9" kpx2="199"/><pair kern="-40" kpx2="193"/><pair kern="-40" kpx2="192"/><pair kern="-40" kpx2="195"/><pair kern="-40" kpx2="194"/><pair kern="-9" kpx2="216"/><pair kern="-9" kpx2="212"/><pair kern="-9" kpx2="213"/><pair kern="-9" kpx2="214"/><pair kern="-20" kpx2="7681"/><pair kern="-40" kpx2="7680"/><pair kern="-9" kpx2="210"/><pair kern="-9" kpx2="211"/><pair kern="-9" kpx2="7743"/><pair kern="-20" kpx2="509"/><pair kern="-9" kpx2="510"/><pair kern="-20" kpx2="511"/><pair kern="-20" kpx2="235"/><pair kern="-20" kpx2="234"/><pair kern="-40" kpx2="506"/><pair kern="-20" kpx2="233"/><pair kern="-20" kpx2="507"/><pair kern="-20" kpx2="232"/><pair kern="-20" kpx2="231"/><pair kern="-20" kpx2="230"/><pair kern="-20" kpx2="229"/><pair kern="-20" kpx2="228"/><pair kern="-20" kpx2="227"/><pair kern="-20" kpx2="226"/><pair kern="-20" kpx2="225"/><pair kern="-20" kpx2="224"/><pair kern="-9" kpx2="252"/><pair kern="-9" kpx2="250"/><pair kern="-9" kpx2="251"/><pair kern="-20" kpx2="248"/><pair kern="-9" kpx2="249"/><pair kern="-20" kpx2="246"/><pair kern="-20" kpx2="244"/><pair kern="-20" kpx2="245"/><pair kern="-20" kpx2="242"/><pair kern="-20" kpx2="243"/></kerning><kerning kpx1="86"><pair kern="-20" kpx2="7889"/><pair kern="-20" kpx2="275"/><pair kern="-9" kpx2="7888"/><pair kern="-20" kpx2="273"/><pair kern="-9" kpx2="7890"/><pair kern="-20" kpx2="7893"/><pair kern="-20" kpx2="279"/><pair kern="-9" kpx2="7892"/><pair kern="-20" kpx2="7895"/><pair kern="-20" kpx2="277"/><pair kern="-9" kpx2="7894"/><pair kern="-20" kpx2="7897"/><pair kern="-20" kpx2="283"/><pair kern="-9" kpx2="7896"/><pair kern="-20" kpx2="7899"/><pair kern="-20" kpx2="281"/><pair kern="-9" kpx2="7898"/><pair kern="-20" kpx2="7901"/><pair kern="-9" kpx2="287"/><pair kern="-9" kpx2="7900"/><pair kern="-9" kpx2="286"/><pair kern="-20" kpx2="7903"/><pair kern="-9" kpx2="285"/><pair kern="-9" kpx2="7902"/><pair kern="-9" kpx2="284"/><pair kern="-40" kpx2="258"/><pair kern="-20" kpx2="259"/><pair kern="-40" kpx2="256"/><pair kern="-20" kpx2="7875"/><pair kern="-20" kpx2="257"/><pair kern="-9" kpx2="262"/><pair kern="-20" kpx2="7877"/><pair kern="-20" kpx2="263"/><pair kern="-40" kpx2="260"/><pair kern="-20" kpx2="7879"/><pair kern="-20" kpx2="261"/><pair kern="-9" kpx2="266"/><pair kern="-20" kpx2="267"/><pair kern="-9" kpx2="264"/><pair kern="-20" kpx2="265"/><pair kern="-9" kpx2="7884"/><pair kern="-20" kpx2="7885"/><pair kern="-20" kpx2="271"/><pair kern="-9" kpx2="7886"/><pair kern="-9" kpx2="268"/><pair kern="-20" kpx2="7887"/><pair kern="-20" kpx2="269"/><pair kern="-9" kpx2="7921"/><pair kern="-9" kpx2="312"/><pair kern="-49" kpx2="46"/><pair kern="-49" kpx2="44"/><pair kern="-9" kpx2="7906"/><pair kern="-9" kpx2="288"/><pair kern="-20" kpx2="7907"/><pair kern="-9" kpx2="289"/><pair kern="-9" kpx2="7904"/><pair kern="-9" kpx2="290"/><pair kern="-20" kpx2="7905"/><pair kern="-9" kpx2="291"/><pair kern="-9" kpx2="7911"/><pair kern="-9" kpx2="7909"/><pair kern="-9" kpx2="7915"/><pair kern="-9" kpx2="7913"/><pair kern="-9" kpx2="537"/><pair kern="20" kpx2="63"/><pair kern="-9" kpx2="7919"/><pair kern="-9" kpx2="7917"/><pair kern="-9" kpx2="343"/><pair kern="-9" kpx2="341"/><pair kern="-9" kpx2="71"/><pair kern="-20" kpx2="339"/><pair kern="-40" kpx2="65"/><pair kern="-9" kpx2="338"/><pair kern="-20" kpx2="337"/><pair kern="-9" kpx2="67"/><pair kern="-9" kpx2="336"/><pair kern="-9" kpx2="351"/><pair kern="-9" kpx2="79"/><pair kern="-9" kpx2="347"/><pair kern="-9" kpx2="326"/><pair kern="-9" kpx2="324"/><pair kern="-9" kpx2="81"/><pair kern="-9" kpx2="334"/><pair kern="-49" kpx2="8218"/><pair kern="-20" kpx2="335"/><pair kern="-9" kpx2="332"/><pair kern="-20" kpx2="333"/><pair kern="-49" kpx2="8222"/><pair kern="-9" kpx2="331"/><pair kern="-20" kpx2="7863"/><pair kern="-40" kpx2="7862"/><pair kern="-9" kpx2="103"/><pair kern="-20" kpx2="7861"/><pair kern="-20" kpx2="100"/><pair kern="-40" kpx2="7860"/><pair kern="-20" kpx2="101"/><pair kern="-20" kpx2="7859"/><pair kern="-9" kpx2="369"/><pair kern="-40" kpx2="7858"/><pair kern="-20" kpx2="99"/><pair kern="-20" kpx2="7857"/><pair kern="-9" kpx2="371"/><pair kern="-40" kpx2="7856"/><pair kern="-20" kpx2="97"/><pair kern="-20" kpx2="7871"/><pair kern="-9" kpx2="110"/><pair kern="-20" kpx2="111"/><pair kern="-20" kpx2="7869"/><pair kern="-9" kpx2="109"/><pair kern="-20" kpx2="7867"/><pair kern="-20" kpx2="7865"/><pair kern="-40" kpx2="7846"/><pair kern="-40" kpx2="7844"/><pair kern="-9" kpx2="117"/><pair kern="-20" kpx2="7845"/><pair kern="-40" kpx2="7842"/><pair kern="-9" kpx2="115"/><pair kern="-20" kpx2="7843"/><pair kern="-9" kpx2="114"/><pair kern="-40" kpx2="7840"/><pair kern="-20" kpx2="113"/><pair kern="-20" kpx2="7841"/><pair kern="-9" kpx2="112"/><pair kern="-40" kpx2="7854"/><pair kern="-20" kpx2="7855"/><pair kern="-9" kpx2="365"/><pair kern="-40" kpx2="7852"/><pair kern="-20" kpx2="7853"/><pair kern="-9" kpx2="367"/><pair kern="-40" kpx2="7850"/><pair kern="-20" kpx2="7851"/><pair kern="-9" kpx2="361"/><pair kern="-40" kpx2="7848"/><pair kern="-20" kpx2="7849"/><pair kern="-9" kpx2="363"/><pair kern="-9" kpx2="432"/><pair kern="-20" kpx2="417"/><pair kern="-9" kpx2="416"/><pair kern="-40" kpx2="197"/><pair kern="-40" kpx2="196"/><pair kern="-9" kpx2="199"/><pair kern="-40" kpx2="193"/><pair kern="-40" kpx2="192"/><pair kern="-40" kpx2="195"/><pair kern="-40" kpx2="194"/><pair kern="-9" kpx2="216"/><pair kern="-9" kpx2="212"/><pair kern="-9" kpx2="213"/><pair kern="-9" kpx2="214"/><pair kern="-20" kpx2="7681"/><pair kern="-40" kpx2="7680"/><pair kern="-9" kpx2="210"/><pair kern="-9" kpx2="211"/><pair kern="-9" kpx2="7743"/><pair kern="-20" kpx2="509"/><pair kern="-9" kpx2="510"/><pair kern="-20" kpx2="511"/><pair kern="-20" kpx2="235"/><pair kern="-20" kpx2="234"/><pair kern="-40" kpx2="506"/><pair kern="-20" kpx2="233"/><pair kern="-20" kpx2="507"/><pair kern="-20" kpx2="232"/><pair kern="-20" kpx2="231"/><pair kern="-20" kpx2="230"/><pair kern="-20" kpx2="229"/><pair kern="-20" kpx2="228"/><pair kern="-20" kpx2="227"/><pair kern="-20" kpx2="226"/><pair kern="-20" kpx2="225"/><pair kern="-20" kpx2="224"/><pair kern="-9" kpx2="252"/><pair kern="-9" kpx2="250"/><pair kern="-9" kpx2="251"/><pair kern="-20" kpx2="248"/><pair kern="-9" kpx2="249"/><pair kern="-20" kpx2="246"/><pair kern="-20" kpx2="244"/><pair kern="-20" kpx2="245"/><pair kern="-20" kpx2="242"/><pair kern="-20" kpx2="243"/></kerning><kerning kpx1="1050"><pair kern="-20" kpx2="1152"/><pair kern="-20" kpx2="1228"/><pair kern="-9" kpx2="1296"/><pair kern="-20" kpx2="1095"/><pair kern="-20" kpx2="1028"/><pair kern="-20" kpx2="1227"/><pair kern="-20" kpx2="1292"/><pair kern="-20" kpx2="1054"/><pair kern="-20" kpx2="1282"/><pair kern="-20" kpx2="1280"/><pair kern="-20" kpx2="1287"/><pair kern="-20" kpx2="1285"/><pair kern="-20" kpx2="1254"/><pair kern="-20" kpx2="1194"/><pair kern="-20" kpx2="1057"/><pair kern="-20" kpx2="1192"/><pair kern="-20" kpx2="1258"/><pair kern="-20" kpx2="1063"/><pair kern="-20" kpx2="1120"/><pair kern="-20" kpx2="1060"/><pair kern="-20" kpx2="1256"/><pair kern="-20" kpx2="1150"/><pair kern="-20" kpx2="1268"/><pair kern="-20" kpx2="1269"/><pair kern="-20" kpx2="1148"/><pair kern="-20" kpx2="1206"/><pair kern="-20" kpx2="1146"/><pair kern="-20" kpx2="1207"/><pair kern="-20" kpx2="1144"/><pair kern="-20" kpx2="1208"/><pair kern="-20" kpx2="1209"/><pair kern="-49" kpx2="1214"/><pair kern="-20" kpx2="1138"/><pair kern="-49" kpx2="1212"/><pair kern="-20" kpx2="1136"/></kerning><kerning kpx1="81"><pair kern="-20" kpx2="258"/><pair kern="-20" kpx2="256"/><pair kern="-20" kpx2="260"/><pair kern="-9" kpx2="7922"/><pair kern="-9" kpx2="7926"/><pair kern="-9" kpx2="7924"/><pair kern="-9" kpx2="7928"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="44"/><pair kern="-29" kpx2="538"/><pair kern="-20" kpx2="65"/><pair kern="-20" kpx2="197"/><pair kern="-20" kpx2="196"/><pair kern="-20" kpx2="193"/><pair kern="-20" kpx2="192"/><pair kern="-9" kpx2="1029"/><pair kern="-20" kpx2="195"/><pair kern="-20" kpx2="194"/><pair kern="-9" kpx2="7812"/><pair kern="-9" kpx2="221"/><pair kern="-29" kpx2="84"/><pair kern="-9" kpx2="87"/><pair kern="-9" kpx2="86"/><pair kern="-9" kpx2="7808"/><pair kern="-9" kpx2="7810"/><pair kern="-40" kpx2="8218"/><pair kern="-9" kpx2="89"/><pair kern="-20" kpx2="88"/><pair kern="-40" kpx2="8222"/><pair kern="-20" kpx2="7680"/><pair kern="-9" kpx2="90"/><pair kern="-9" kpx2="372"/><pair kern="-20" kpx2="7862"/><pair kern="-9" kpx2="374"/><pair kern="-20" kpx2="7860"/><pair kern="-20" kpx2="7858"/><pair kern="-20" kpx2="506"/><pair kern="-20" kpx2="7856"/><pair kern="-9" kpx2="381"/><pair kern="-9" kpx2="377"/><pair kern="-9" kpx2="376"/><pair kern="-9" kpx2="379"/><pair kern="-29" kpx2="356"/><pair kern="-20" kpx2="7846"/><pair kern="-20" kpx2="7844"/><pair kern="-20" kpx2="7842"/><pair kern="-29" kpx2="354"/><pair kern="-20" kpx2="7840"/><pair kern="-20" kpx2="7854"/><pair kern="-20" kpx2="7852"/><pair kern="-20" kpx2="7850"/><pair kern="-20" kpx2="7848"/></kerning><kerning kpx1="80"><pair kern="-49" kpx2="65"/><pair kern="-49" kpx2="197"/><pair kern="-49" kpx2="196"/><pair kern="-49" kpx2="193"/><pair kern="-49" kpx2="192"/><pair kern="-49" kpx2="195"/><pair kern="-49" kpx2="194"/><pair kern="-49" kpx2="258"/><pair kern="-49" kpx2="256"/><pair kern="-49" kpx2="260"/><pair kern="-129" kpx2="8218"/><pair kern="-20" kpx2="88"/><pair kern="-129" kpx2="8222"/><pair kern="-49" kpx2="7680"/><pair kern="-9" kpx2="90"/><pair kern="-49" kpx2="7862"/><pair kern="-49" kpx2="7860"/><pair kern="-49" kpx2="7858"/><pair kern="-49" kpx2="506"/><pair kern="-49" kpx2="7856"/><pair kern="-9" kpx2="381"/><pair kern="-129" kpx2="46"/><pair kern="-9" kpx2="377"/><pair kern="-129" kpx2="44"/><pair kern="-9" kpx2="379"/><pair kern="-49" kpx2="7846"/><pair kern="-49" kpx2="7844"/><pair kern="-49" kpx2="7842"/><pair kern="-49" kpx2="7840"/><pair kern="-49" kpx2="7854"/><pair kern="-49" kpx2="7852"/><pair kern="-49" kpx2="7850"/><pair kern="-49" kpx2="7848"/></kerning><kerning kpx1="1054"><pair kern="-20" kpx2="1221"/><pair kern="-9" kpx2="1222"/><pair kern="-20" kpx2="1217"/><pair kern="-20" kpx2="1227"/><pair kern="-20" kpx2="1236"/><pair kern="-9" kpx2="1113"/><pair kern="-20" kpx2="1232"/><pair kern="-20" kpx2="1234"/><pair kern="-20" kpx2="1244"/><pair kern="-9" kpx2="1246"/><pair kern="-9" kpx2="1134"/><pair kern="-20" kpx2="1126"/><pair kern="-20" kpx2="1262"/><pair kern="-9" kpx2="1127"/><pair kern="-9" kpx2="1260"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="44"/><pair kern="-20" kpx2="1268"/><pair kern="-20" kpx2="1266"/><pair kern="-20" kpx2="1264"/><pair kern="-20" kpx2="1278"/><pair kern="-9" kpx2="1142"/><pair kern="-20" kpx2="1276"/><pair kern="-9" kpx2="1140"/><pair kern="-20" kpx2="1136"/><pair kern="-20" kpx2="1033"/><pair kern="-9" kpx2="1035"/><pair kern="-20" kpx2="1038"/><pair kern="-9" kpx2="1299"/><pair kern="-20" kpx2="1298"/><pair kern="-9" kpx2="1026"/><pair kern="-20" kpx2="1288"/><pair kern="-20" kpx2="1051"/><pair kern="-9" kpx2="1289"/><pair kern="-9" kpx2="1294"/><pair kern="-20" kpx2="1174"/><pair kern="-9" kpx2="1176"/><pair kern="-40" kpx2="8218"/><pair kern="-20" kpx2="1040"/><pair kern="-20" kpx2="1286"/><pair kern="-40" kpx2="8222"/><pair kern="-20" kpx2="1044"/><pair kern="-20" kpx2="1284"/><pair kern="-9" kpx2="1047"/><pair kern="-20" kpx2="1046"/><pair kern="-9" kpx2="1066"/><pair kern="-9" kpx2="1184"/><pair kern="-9" kpx2="1069"/><pair kern="-29" kpx2="1058"/><pair kern="-20" kpx2="1059"/><pair kern="-20" kpx2="1063"/><pair kern="-9" kpx2="1198"/><pair kern="-20" kpx2="1061"/><pair kern="-29" kpx2="1196"/><pair kern="-9" kpx2="1083"/><pair kern="-20" kpx2="1202"/><pair kern="-9" kpx2="1200"/><pair kern="-20" kpx2="1206"/><pair kern="-9" kpx2="1204"/><pair kern="-20" kpx2="1208"/><pair kern="-9" kpx2="1076"/></kerning><kerning kpx1="1041"><pair kern="-20" kpx2="34"/><pair kern="-20" kpx2="39"/><pair kern="-9" kpx2="1126"/><pair kern="-20" kpx2="1063"/><pair kern="-20" kpx2="1227"/><pair kern="-9" kpx2="1236"/><pair kern="-20" kpx2="1268"/><pair kern="-9" kpx2="1232"/><pair kern="-20" kpx2="1206"/><pair kern="-9" kpx2="1234"/><pair kern="-9" kpx2="1040"/><pair kern="-20" kpx2="8217"/><pair kern="-20" kpx2="1208"/><pair kern="-20" kpx2="1214"/><pair kern="-20" kpx2="8221"/><pair kern="-20" kpx2="1212"/><pair kern="-20" kpx2="1136"/></kerning><kerning kpx1="1040"><pair kern="-49" kpx2="1035"/><pair kern="-20" kpx2="1098"/><pair kern="-20" kpx2="1228"/><pair kern="-49" kpx2="1026"/><pair kern="-20" kpx2="1095"/><pair kern="-20" kpx2="1164"/><pair kern="-49" kpx2="1227"/><pair kern="-20" kpx2="1090"/><pair kern="-20" kpx2="1170"/><pair kern="-49" kpx2="1294"/><pair kern="-20" kpx2="1295"/><pair kern="-69" kpx2="8217"/><pair kern="-69" kpx2="1286"/><pair kern="-20" kpx2="1240"/><pair kern="-20" kpx2="1287"/><pair kern="-69" kpx2="1284"/><pair kern="-20" kpx2="1242"/><pair kern="-69" kpx2="8221"/><pair kern="-20" kpx2="1182"/><pair kern="-20" kpx2="1285"/><pair kern="-49" kpx2="1066"/><pair kern="-69" kpx2="34"/><pair kern="-20" kpx2="1185"/><pair kern="-49" kpx2="1184"/><pair kern="-69" kpx2="39"/><pair kern="-69" kpx2="1058"/><pair kern="-20" kpx2="1122"/><pair kern="-60" kpx2="1198"/><pair kern="-49" kpx2="1063"/><pair kern="-20" kpx2="1060"/><pair kern="-20" kpx2="1197"/><pair kern="-69" kpx2="1196"/><pair kern="-49" kpx2="1268"/><pair kern="-60" kpx2="1200"/><pair kern="-20" kpx2="1269"/><pair kern="-49" kpx2="1206"/><pair kern="-20" kpx2="1207"/><pair kern="-49" kpx2="1204"/><pair kern="-20" kpx2="1205"/><pair kern="-40" kpx2="1142"/><pair kern="-49" kpx2="1208"/><pair kern="-20" kpx2="1209"/><pair kern="-40" kpx2="1140"/><pair kern="-20" kpx2="1274"/><pair kern="-49" kpx2="1214"/><pair kern="-49" kpx2="1212"/><pair kern="-49" kpx2="1136"/></kerning><kerning kpx1="1043"><pair kern="-49" kpx2="1100"/><pair kern="-20" kpx2="1101"/><pair kern="-49" kpx2="1102"/><pair kern="-29" kpx2="1103"/><pair kern="-49" kpx2="1096"/><pair kern="-49" kpx2="1097"/><pair kern="-40" kpx2="1098"/><pair kern="-49" kpx2="1099"/><pair kern="-69" kpx2="1092"/><pair kern="-20" kpx2="1093"/><pair kern="-49" kpx2="1094"/><pair kern="-49" kpx2="1095"/><pair kern="-49" kpx2="1088"/><pair kern="-69" kpx2="1089"/><pair kern="-40" kpx2="1090"/><pair kern="-40" kpx2="1091"/><pair kern="-49" kpx2="1117"/><pair kern="-49" kpx2="1116"/><pair kern="-49" kpx2="1119"/><pair kern="-40" kpx2="1118"/><pair kern="-60" kpx2="1113"/><pair kern="-49" kpx2="1114"/><pair kern="-60" kpx2="1109"/><pair kern="-69" kpx2="1108"/><pair kern="-69" kpx2="1105"/><pair kern="-69" kpx2="1104"/><pair kern="-49" kpx2="1107"/><pair kern="-49" kpx2="1133"/><pair kern="-49" kpx2="1131"/><pair kern="-49" kpx2="1129"/><pair kern="-69" kpx2="1126"/><pair kern="-60" kpx2="1127"/><pair kern="-49" kpx2="1125"/><pair kern="-60" kpx2="46"/><pair kern="-60" kpx2="44"/><pair kern="-20" kpx2="1120"/><pair kern="-40" kpx2="45"/><pair kern="-20" kpx2="1121"/><pair kern="-20" kpx2="1151"/><pair kern="-20" kpx2="1150"/><pair kern="-69" kpx2="1149"/><pair kern="-20" kpx2="1148"/><pair kern="-69" kpx2="1147"/><pair kern="-20" kpx2="1146"/><pair kern="-69" kpx2="1145"/><pair kern="-20" kpx2="1144"/><pair kern="-20" kpx2="1143"/><pair kern="-20" kpx2="1141"/><pair kern="-69" kpx2="1139"/><pair kern="-20" kpx2="1138"/><pair kern="-49" kpx2="1137"/><pair kern="-49" kpx2="1033"/><pair kern="-60" kpx2="1299"/><pair kern="-49" kpx2="1298"/><pair kern="-69" kpx2="1297"/><pair kern="-20" kpx2="1028"/><pair kern="-40" kpx2="8211"/><pair kern="-49" kpx2="1291"/><pair kern="-49" kpx2="1288"/><pair kern="-49" kpx2="1051"/><pair kern="-60" kpx2="1289"/><pair kern="-40" kpx2="1295"/><pair kern="-20" kpx2="1292"/><pair kern="-40" kpx2="8213"/><pair kern="-69" kpx2="1293"/><pair kern="-20" kpx2="1054"/><pair kern="-40" kpx2="8212"/><pair kern="-69" kpx2="1282"/><pair kern="-69" kpx2="1283"/><pair kern="-69" kpx2="1040"/><pair kern="-60" kpx2="8218"/><pair kern="-69" kpx2="1280"/><pair kern="-69" kpx2="1281"/><pair kern="-49" kpx2="1287"/><pair kern="-49" kpx2="1044"/><pair kern="-60" kpx2="8222"/><pair kern="-49" kpx2="1285"/><pair kern="20" kpx2="1058"/><pair kern="-20" kpx2="1057"/><pair kern="-40" kpx2="1060"/><pair kern="-60" kpx2="1083"/><pair kern="-49" kpx2="1082"/><pair kern="-49" kpx2="1081"/><pair kern="-49" kpx2="1080"/><pair kern="-49" kpx2="1087"/><pair kern="-69" kpx2="1086"/><pair kern="-49" kpx2="1085"/><pair kern="-49" kpx2="1084"/><pair kern="-49" kpx2="1075"/><pair kern="-49" kpx2="1074"/><pair kern="-20" kpx2="1079"/><pair kern="-20" kpx2="1078"/><pair kern="-69" kpx2="1077"/><pair kern="-60" kpx2="1076"/><pair kern="-49" kpx2="1221"/><pair kern="-49" kpx2="1220"/><pair kern="-60" kpx2="1222"/><pair kern="-20" kpx2="1218"/><pair kern="-49" kpx2="1228"/><pair kern="-49" kpx2="1230"/><pair kern="-49" kpx2="1224"/><pair kern="-49" kpx2="1226"/><pair kern="-69" kpx2="1236"/><pair kern="-69" kpx2="1239"/><pair kern="-69" kpx2="1232"/><pair kern="-69" kpx2="1234"/><pair kern="-20" kpx2="1245"/><pair kern="-20" kpx2="1247"/><pair kern="-69" kpx2="1255"/><pair kern="-20" kpx2="1254"/><pair kern="-49" kpx2="1253"/><pair kern="-49" kpx2="1251"/><pair kern="-29" kpx2="1249"/><pair kern="-40" kpx2="1263"/><pair kern="-20" kpx2="1261"/><pair kern="-69" kpx2="1259"/><pair kern="-20" kpx2="1258"/><pair kern="-69" kpx2="1257"/><pair kern="-20" kpx2="1256"/><pair kern="-49" kpx2="1271"/><pair kern="-49" kpx2="1269"/><pair kern="-40" kpx2="1267"/><pair kern="-40" kpx2="1265"/><pair kern="-20" kpx2="1279"/><pair kern="-20" kpx2="1277"/><pair kern="-49" kpx2="1273"/><pair kern="-69" kpx2="1153"/><pair kern="-20" kpx2="1152"/><pair kern="-49" kpx2="1163"/><pair kern="-49" kpx2="1167"/><pair kern="-49" kpx2="1169"/><pair kern="-49" kpx2="1173"/><pair kern="-20" kpx2="1175"/><pair kern="-20" kpx2="1177"/><pair kern="-49" kpx2="1179"/><pair kern="-49" kpx2="1181"/><pair kern="-49" kpx2="1187"/><pair kern="-40" kpx2="1185"/><pair kern="-49" kpx2="1191"/><pair kern="-49" kpx2="1189"/><pair kern="-69" kpx2="1195"/><pair kern="-20" kpx2="1194"/><pair kern="-69" kpx2="1193"/><pair kern="-20" kpx2="1192"/><pair kern="-40" kpx2="1199"/><pair kern="-40" kpx2="1197"/><pair kern="20" kpx2="1196"/><pair kern="-20" kpx2="1203"/><pair kern="-40" kpx2="1201"/><pair kern="-49" kpx2="1207"/><pair kern="-40" kpx2="1205"/><pair kern="-49" kpx2="1211"/><pair kern="-49" kpx2="1209"/><pair kern="-49" kpx2="1214"/><pair kern="-69" kpx2="1215"/><pair kern="-49" kpx2="1212"/><pair kern="-69" kpx2="1213"/></kerning><kerning kpx1="1042"><pair kern="-9" kpx2="1200"/><pair kern="-9" kpx2="1142"/><pair kern="-40" kpx2="8218"/><pair kern="-9" kpx2="1140"/><pair kern="-20" kpx2="1286"/><pair kern="-40" kpx2="46"/><pair kern="-9" kpx2="1198"/><pair kern="-40" kpx2="8222"/><pair kern="-20" kpx2="1284"/><pair kern="-40" kpx2="44"/></kerning><kerning kpx1="89"><pair kern="-49" kpx2="7889"/><pair kern="-49" kpx2="275"/><pair kern="-20" kpx2="7888"/><pair kern="-49" kpx2="273"/><pair kern="-20" kpx2="7890"/><pair kern="-49" kpx2="7893"/><pair kern="-49" kpx2="279"/><pair kern="-20" kpx2="7892"/><pair kern="-49" kpx2="7895"/><pair kern="-49" kpx2="277"/><pair kern="-20" kpx2="7894"/><pair kern="-49" kpx2="7897"/><pair kern="-49" kpx2="283"/><pair kern="-20" kpx2="7896"/><pair kern="-49" kpx2="7899"/><pair kern="-49" kpx2="281"/><pair kern="-20" kpx2="7898"/><pair kern="-49" kpx2="7901"/><pair kern="-20" kpx2="287"/><pair kern="-20" kpx2="7900"/><pair kern="-20" kpx2="286"/><pair kern="-49" kpx2="7903"/><pair kern="-20" kpx2="285"/><pair kern="-20" kpx2="7902"/><pair kern="-20" kpx2="284"/><pair kern="-60" kpx2="258"/><pair kern="-49" kpx2="259"/><pair kern="-60" kpx2="256"/><pair kern="-49" kpx2="7875"/><pair kern="-49" kpx2="257"/><pair kern="-20" kpx2="262"/><pair kern="-49" kpx2="7877"/><pair kern="-49" kpx2="263"/><pair kern="-60" kpx2="260"/><pair kern="-49" kpx2="7879"/><pair kern="-49" kpx2="261"/><pair kern="-20" kpx2="266"/><pair kern="-49" kpx2="267"/><pair kern="-20" kpx2="264"/><pair kern="-49" kpx2="265"/><pair kern="-20" kpx2="7884"/><pair kern="-49" kpx2="7885"/><pair kern="-49" kpx2="271"/><pair kern="-20" kpx2="7886"/><pair kern="-20" kpx2="268"/><pair kern="-49" kpx2="7887"/><pair kern="-49" kpx2="269"/><pair kern="-29" kpx2="7921"/><pair kern="-29" kpx2="312"/><pair kern="-60" kpx2="46"/><pair kern="-60" kpx2="44"/><pair kern="-20" kpx2="7906"/><pair kern="-20" kpx2="288"/><pair kern="-49" kpx2="7907"/><pair kern="-20" kpx2="289"/><pair kern="-20" kpx2="7904"/><pair kern="-20" kpx2="290"/><pair kern="-49" kpx2="7905"/><pair kern="-20" kpx2="291"/><pair kern="-29" kpx2="7911"/><pair kern="-29" kpx2="7909"/><pair kern="-29" kpx2="7915"/><pair kern="-29" kpx2="7913"/><pair kern="-40" kpx2="537"/><pair kern="20" kpx2="63"/><pair kern="-29" kpx2="7919"/><pair kern="-29" kpx2="7917"/><pair kern="-29" kpx2="343"/><pair kern="-29" kpx2="341"/><pair kern="-20" kpx2="71"/><pair kern="-49" kpx2="339"/><pair kern="-20" kpx2="338"/><pair kern="-60" kpx2="65"/><pair kern="-49" kpx2="337"/><pair kern="-20" kpx2="67"/><pair kern="-20" kpx2="336"/><pair kern="-40" kpx2="351"/><pair kern="-20" kpx2="79"/><pair kern="-40" kpx2="347"/><pair kern="-29" kpx2="326"/><pair kern="-29" kpx2="324"/><pair kern="-20" kpx2="81"/><pair kern="-20" kpx2="334"/><pair kern="-60" kpx2="8218"/><pair kern="-49" kpx2="335"/><pair kern="-20" kpx2="332"/><pair kern="-49" kpx2="333"/><pair kern="-60" kpx2="8222"/><pair kern="-29" kpx2="331"/><pair kern="-49" kpx2="7863"/><pair kern="-60" kpx2="7862"/><pair kern="-20" kpx2="103"/><pair kern="-49" kpx2="7861"/><pair kern="-49" kpx2="100"/><pair kern="-60" kpx2="7860"/><pair kern="-49" kpx2="101"/><pair kern="-49" kpx2="7859"/><pair kern="-29" kpx2="369"/><pair kern="-60" kpx2="7858"/><pair kern="-49" kpx2="99"/><pair kern="-49" kpx2="7857"/><pair kern="-29" kpx2="371"/><pair kern="-60" kpx2="7856"/><pair kern="-49" kpx2="97"/><pair kern="-49" kpx2="7871"/><pair kern="-29" kpx2="110"/><pair kern="-20" kpx2="380"/><pair kern="-49" kpx2="111"/><pair kern="-49" kpx2="7869"/><pair kern="-20" kpx2="382"/><pair kern="-29" kpx2="109"/><pair kern="-49" kpx2="7867"/><pair kern="-49" kpx2="7865"/><pair kern="-20" kpx2="378"/><pair kern="-60" kpx2="7846"/><pair kern="-60" kpx2="7844"/><pair kern="-29" kpx2="117"/><pair kern="-49" kpx2="7845"/><pair kern="-60" kpx2="7842"/><pair kern="-40" kpx2="115"/><pair kern="-49" kpx2="7843"/><pair kern="-29" kpx2="114"/><pair kern="-60" kpx2="7840"/><pair kern="-49" kpx2="113"/><pair kern="-49" kpx2="7841"/><pair kern="-29" kpx2="112"/><pair kern="-60" kpx2="7854"/><pair kern="-49" kpx2="7855"/><pair kern="-29" kpx2="365"/><pair kern="-60" kpx2="7852"/><pair kern="-49" kpx2="7853"/><pair kern="-29" kpx2="367"/><pair kern="-60" kpx2="7850"/><pair kern="-49" kpx2="7851"/><pair kern="-29" kpx2="361"/><pair kern="-20" kpx2="122"/><pair kern="-60" kpx2="7848"/><pair kern="-49" kpx2="7849"/><pair kern="-29" kpx2="363"/><pair kern="-29" kpx2="432"/><pair kern="-49" kpx2="417"/><pair kern="-20" kpx2="416"/><pair kern="-60" kpx2="197"/><pair kern="-60" kpx2="196"/><pair kern="-20" kpx2="199"/><pair kern="-60" kpx2="193"/><pair kern="-60" kpx2="192"/><pair kern="-60" kpx2="195"/><pair kern="-60" kpx2="194"/><pair kern="-20" kpx2="216"/><pair kern="-20" kpx2="212"/><pair kern="-20" kpx2="213"/><pair kern="-20" kpx2="214"/><pair kern="-49" kpx2="7681"/><pair kern="-60" kpx2="7680"/><pair kern="-20" kpx2="210"/><pair kern="-20" kpx2="211"/><pair kern="-29" kpx2="7743"/><pair kern="-49" kpx2="509"/><pair kern="-20" kpx2="510"/><pair kern="-49" kpx2="511"/><pair kern="-49" kpx2="235"/><pair kern="-49" kpx2="234"/><pair kern="-60" kpx2="506"/><pair kern="-49" kpx2="233"/><pair kern="-49" kpx2="507"/><pair kern="-49" kpx2="232"/><pair kern="-49" kpx2="231"/><pair kern="-49" kpx2="230"/><pair kern="-49" kpx2="229"/><pair kern="-49" kpx2="228"/><pair kern="-49" kpx2="227"/><pair kern="-49" kpx2="226"/><pair kern="-49" kpx2="225"/><pair kern="-49" kpx2="224"/><pair kern="-29" kpx2="252"/><pair kern="-29" kpx2="250"/><pair kern="-29" kpx2="251"/><pair kern="-49" kpx2="248"/><pair kern="-29" kpx2="249"/><pair kern="-49" kpx2="246"/><pair kern="-49" kpx2="244"/><pair kern="-49" kpx2="245"/><pair kern="-49" kpx2="242"/><pair kern="-49" kpx2="243"/></kerning><kerning kpx1="88"><pair kern="-20" kpx2="7888"/><pair kern="-20" kpx2="7890"/><pair kern="-20" kpx2="71"/><pair kern="-20" kpx2="7892"/><pair kern="-20" kpx2="338"/><pair kern="-20" kpx2="7894"/><pair kern="-20" kpx2="67"/><pair kern="-20" kpx2="336"/><pair kern="-20" kpx2="7896"/><pair kern="-20" kpx2="199"/><pair kern="-20" kpx2="7898"/><pair kern="-20" kpx2="79"/><pair kern="-20" kpx2="7900"/><pair kern="-20" kpx2="286"/><pair kern="-20" kpx2="7902"/><pair kern="-20" kpx2="284"/><pair kern="-20" kpx2="262"/><pair kern="-20" kpx2="216"/><pair kern="-20" kpx2="81"/><pair kern="-20" kpx2="212"/><pair kern="-20" kpx2="266"/><pair kern="-20" kpx2="334"/><pair kern="-20" kpx2="213"/><pair kern="-20" kpx2="214"/><pair kern="-20" kpx2="264"/><pair kern="-20" kpx2="332"/><pair kern="-20" kpx2="7884"/><pair kern="-20" kpx2="7886"/><pair kern="-20" kpx2="210"/><pair kern="-20" kpx2="268"/><pair kern="-20" kpx2="211"/><pair kern="-20" kpx2="510"/><pair kern="-20" kpx2="7906"/><pair kern="-20" kpx2="288"/><pair kern="-20" kpx2="7904"/><pair kern="-20" kpx2="290"/><pair kern="-20" kpx2="416"/></kerning><kerning kpx1="1044"><pair kern="109" kpx2="1032"/><pair kern="20" kpx2="1249"/><pair kern="-20" kpx2="1287"/><pair kern="-20" kpx2="1285"/></kerning><kerning kpx1="91"><pair kern="89" kpx2="74"/></kerning><kerning kpx1="1047"><pair kern="-9" kpx2="1200"/><pair kern="-9" kpx2="1142"/><pair kern="-40" kpx2="8218"/><pair kern="-9" kpx2="1140"/><pair kern="-20" kpx2="1286"/><pair kern="-40" kpx2="46"/><pair kern="-9" kpx2="1198"/><pair kern="-40" kpx2="8222"/><pair kern="-20" kpx2="1284"/><pair kern="-40" kpx2="44"/></kerning><kerning kpx1="90"><pair kern="-9" kpx2="7888"/><pair kern="-9" kpx2="7890"/><pair kern="-9" kpx2="71"/><pair kern="-9" kpx2="7892"/><pair kern="-9" kpx2="338"/><pair kern="-9" kpx2="7894"/><pair kern="-9" kpx2="67"/><pair kern="-9" kpx2="336"/><pair kern="-9" kpx2="7896"/><pair kern="-9" kpx2="199"/><pair kern="-9" kpx2="7898"/><pair kern="-9" kpx2="79"/><pair kern="-9" kpx2="7900"/><pair kern="-9" kpx2="286"/><pair kern="-9" kpx2="7902"/><pair kern="-9" kpx2="284"/><pair kern="-9" kpx2="262"/><pair kern="-9" kpx2="216"/><pair kern="-9" kpx2="81"/><pair kern="-9" kpx2="212"/><pair kern="-9" kpx2="266"/><pair kern="-9" kpx2="334"/><pair kern="-9" kpx2="213"/><pair kern="-9" kpx2="214"/><pair kern="-9" kpx2="264"/><pair kern="-9" kpx2="332"/><pair kern="-9" kpx2="7884"/><pair kern="-9" kpx2="7886"/><pair kern="-9" kpx2="210"/><pair kern="-9" kpx2="268"/><pair kern="-9" kpx2="211"/><pair kern="-9" kpx2="510"/><pair kern="-9" kpx2="7906"/><pair kern="-9" kpx2="288"/><pair kern="-9" kpx2="7904"/><pair kern="-9" kpx2="290"/><pair kern="-9" kpx2="416"/></kerning><kerning kpx1="1046"><pair kern="-20" kpx2="1152"/><pair kern="-20" kpx2="1228"/><pair kern="-9" kpx2="1296"/><pair kern="-20" kpx2="1095"/><pair kern="-20" kpx2="1028"/><pair kern="-20" kpx2="1227"/><pair kern="-20" kpx2="1292"/><pair kern="-20" kpx2="1054"/><pair kern="-20" kpx2="1282"/><pair kern="-20" kpx2="1280"/><pair kern="-20" kpx2="1287"/><pair kern="-20" kpx2="1285"/><pair kern="-20" kpx2="1254"/><pair kern="-20" kpx2="1194"/><pair kern="-20" kpx2="1057"/><pair kern="-20" kpx2="1192"/><pair kern="-20" kpx2="1258"/><pair kern="-20" kpx2="1063"/><pair kern="-20" kpx2="1120"/><pair kern="-20" kpx2="1060"/><pair kern="-20" kpx2="1256"/><pair kern="-20" kpx2="1150"/><pair kern="-20" kpx2="1268"/><pair kern="-20" kpx2="1269"/><pair kern="-20" kpx2="1148"/><pair kern="-20" kpx2="1206"/><pair kern="-20" kpx2="1146"/><pair kern="-20" kpx2="1207"/><pair kern="-20" kpx2="1144"/><pair kern="-20" kpx2="1208"/><pair kern="-20" kpx2="1209"/><pair kern="-49" kpx2="1214"/><pair kern="-20" kpx2="1138"/><pair kern="-49" kpx2="1212"/><pair kern="-20" kpx2="1136"/></kerning><kerning kpx1="102"><pair kern="60" kpx2="34"/><pair kern="60" kpx2="39"/><pair kern="60" kpx2="8217"/><pair kern="60" kpx2="8221"/></kerning><kerning kpx1="1066"><pair kern="-20" kpx2="1098"/><pair kern="-20" kpx2="1228"/><pair kern="-20" kpx2="1095"/><pair kern="-20" kpx2="1090"/><pair kern="-49" kpx2="1227"/><pair kern="-20" kpx2="1091"/><pair kern="-20" kpx2="1118"/><pair kern="-40" kpx2="34"/><pair kern="-40" kpx2="39"/><pair kern="-20" kpx2="1263"/><pair kern="-20" kpx2="1262"/><pair kern="-40" kpx2="1122"/><pair kern="-49" kpx2="1268"/><pair kern="-20" kpx2="1269"/><pair kern="-20" kpx2="1266"/><pair kern="-20" kpx2="1267"/><pair kern="-20" kpx2="1264"/><pair kern="-20" kpx2="1265"/><pair kern="-40" kpx2="1142"/><pair kern="-40" kpx2="1140"/><pair kern="-40" kpx2="1274"/><pair kern="-49" kpx2="1136"/><pair kern="-60" kpx2="1035"/><pair kern="-20" kpx2="1038"/><pair kern="-60" kpx2="1026"/><pair kern="-40" kpx2="1164"/><pair kern="-40" kpx2="1170"/><pair kern="-60" kpx2="1294"/><pair kern="-20" kpx2="1295"/><pair kern="-40" kpx2="8217"/><pair kern="-49" kpx2="1286"/><pair kern="-29" kpx2="1287"/><pair kern="-49" kpx2="1284"/><pair kern="-40" kpx2="1182"/><pair kern="-40" kpx2="8221"/><pair kern="-29" kpx2="1285"/><pair kern="-60" kpx2="1066"/><pair kern="-20" kpx2="1185"/><pair kern="-60" kpx2="1184"/><pair kern="-49" kpx2="1058"/><pair kern="-20" kpx2="1059"/><pair kern="-20" kpx2="1199"/><pair kern="-49" kpx2="1063"/><pair kern="-49" kpx2="1198"/><pair kern="-20" kpx2="1197"/><pair kern="-49" kpx2="1196"/><pair kern="-49" kpx2="1200"/><pair kern="-20" kpx2="1201"/><pair kern="-49" kpx2="1206"/><pair kern="-20" kpx2="1207"/><pair kern="-60" kpx2="1204"/><pair kern="-20" kpx2="1205"/><pair kern="-49" kpx2="1208"/><pair kern="-20" kpx2="1209"/></kerning><kerning kpx1="101"><pair kern="-9" kpx2="34"/><pair kern="-20" kpx2="373"/><pair kern="-9" kpx2="39"/><pair kern="-20" kpx2="7925"/><pair kern="-9" kpx2="380"/><pair kern="-9" kpx2="382"/><pair kern="-9" kpx2="378"/><pair kern="-20" kpx2="119"/><pair kern="-20" kpx2="118"/><pair kern="-20" kpx2="253"/><pair kern="-20" kpx2="7809"/><pair kern="-20" kpx2="7811"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="122"/><pair kern="-9" kpx2="8221"/><pair kern="-20" kpx2="121"/><pair kern="-20" kpx2="120"/></kerning><kerning kpx1="1065"><pair kern="109" kpx2="1032"/><pair kern="20" kpx2="1249"/><pair kern="-20" kpx2="1287"/><pair kern="-20" kpx2="1285"/></kerning><kerning kpx1="98"><pair kern="-9" kpx2="34"/><pair kern="-20" kpx2="373"/><pair kern="-9" kpx2="39"/><pair kern="-20" kpx2="7925"/><pair kern="-9" kpx2="380"/><pair kern="-9" kpx2="382"/><pair kern="-9" kpx2="378"/><pair kern="-20" kpx2="119"/><pair kern="-20" kpx2="118"/><pair kern="-20" kpx2="253"/><pair kern="-20" kpx2="7809"/><pair kern="-20" kpx2="7811"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="122"/><pair kern="-9" kpx2="8221"/><pair kern="-20" kpx2="121"/><pair kern="-20" kpx2="120"/></kerning><kerning kpx1="1070"><pair kern="-20" kpx2="1221"/><pair kern="-9" kpx2="1222"/><pair kern="-20" kpx2="1217"/><pair kern="-20" kpx2="1227"/><pair kern="-20" kpx2="1236"/><pair kern="-9" kpx2="1113"/><pair kern="-20" kpx2="1232"/><pair kern="-20" kpx2="1234"/><pair kern="-20" kpx2="1244"/><pair kern="-9" kpx2="1246"/><pair kern="-9" kpx2="1134"/><pair kern="-20" kpx2="1126"/><pair kern="-20" kpx2="1262"/><pair kern="-9" kpx2="1127"/><pair kern="-9" kpx2="1260"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="44"/><pair kern="-20" kpx2="1268"/><pair kern="-20" kpx2="1266"/><pair kern="-20" kpx2="1264"/><pair kern="-20" kpx2="1278"/><pair kern="-9" kpx2="1142"/><pair kern="-20" kpx2="1276"/><pair kern="-9" kpx2="1140"/><pair kern="-20" kpx2="1136"/><pair kern="-20" kpx2="1033"/><pair kern="-9" kpx2="1035"/><pair kern="-20" kpx2="1038"/><pair kern="-9" kpx2="1299"/><pair kern="-20" kpx2="1298"/><pair kern="-9" kpx2="1026"/><pair kern="-20" kpx2="1288"/><pair kern="-20" kpx2="1051"/><pair kern="-9" kpx2="1289"/><pair kern="-9" kpx2="1294"/><pair kern="-20" kpx2="1174"/><pair kern="-9" kpx2="1176"/><pair kern="-40" kpx2="8218"/><pair kern="-20" kpx2="1040"/><pair kern="-20" kpx2="1286"/><pair kern="-40" kpx2="8222"/><pair kern="-20" kpx2="1044"/><pair kern="-20" kpx2="1284"/><pair kern="-9" kpx2="1047"/><pair kern="-20" kpx2="1046"/><pair kern="-9" kpx2="1066"/><pair kern="-9" kpx2="1184"/><pair kern="-9" kpx2="1069"/><pair kern="-29" kpx2="1058"/><pair kern="-20" kpx2="1059"/><pair kern="-20" kpx2="1063"/><pair kern="-9" kpx2="1198"/><pair kern="-20" kpx2="1061"/><pair kern="-29" kpx2="1196"/><pair kern="-9" kpx2="1083"/><pair kern="-20" kpx2="1202"/><pair kern="-9" kpx2="1200"/><pair kern="-20" kpx2="1206"/><pair kern="-9" kpx2="1204"/><pair kern="-20" kpx2="1208"/><pair kern="-9" kpx2="1076"/></kerning><kerning kpx1="99"><pair kern="20" kpx2="34"/><pair kern="20" kpx2="39"/><pair kern="20" kpx2="8217"/><pair kern="20" kpx2="8221"/></kerning><kerning kpx1="1068"><pair kern="-20" kpx2="1098"/><pair kern="-20" kpx2="1228"/><pair kern="-20" kpx2="1095"/><pair kern="-20" kpx2="1090"/><pair kern="-49" kpx2="1227"/><pair kern="-20" kpx2="1091"/><pair kern="-20" kpx2="1118"/><pair kern="-40" kpx2="34"/><pair kern="-40" kpx2="39"/><pair kern="-20" kpx2="1263"/><pair kern="-20" kpx2="1262"/><pair kern="-40" kpx2="1122"/><pair kern="-49" kpx2="1268"/><pair kern="-20" kpx2="1269"/><pair kern="-20" kpx2="1266"/><pair kern="-20" kpx2="1267"/><pair kern="-20" kpx2="1264"/><pair kern="-20" kpx2="1265"/><pair kern="-40" kpx2="1142"/><pair kern="-40" kpx2="1140"/><pair kern="-40" kpx2="1274"/><pair kern="-49" kpx2="1136"/><pair kern="-60" kpx2="1035"/><pair kern="-20" kpx2="1038"/><pair kern="-60" kpx2="1026"/><pair kern="-40" kpx2="1164"/><pair kern="-40" kpx2="1170"/><pair kern="-60" kpx2="1294"/><pair kern="-20" kpx2="1295"/><pair kern="-40" kpx2="8217"/><pair kern="-49" kpx2="1286"/><pair kern="-29" kpx2="1287"/><pair kern="-49" kpx2="1284"/><pair kern="-40" kpx2="1182"/><pair kern="-40" kpx2="8221"/><pair kern="-29" kpx2="1285"/><pair kern="-60" kpx2="1066"/><pair kern="-20" kpx2="1185"/><pair kern="-60" kpx2="1184"/><pair kern="-49" kpx2="1058"/><pair kern="-20" kpx2="1059"/><pair kern="-20" kpx2="1199"/><pair kern="-49" kpx2="1063"/><pair kern="-49" kpx2="1198"/><pair kern="-20" kpx2="1197"/><pair kern="-49" kpx2="1196"/><pair kern="-49" kpx2="1200"/><pair kern="-20" kpx2="1201"/><pair kern="-49" kpx2="1206"/><pair kern="-20" kpx2="1207"/><pair kern="-60" kpx2="1204"/><pair kern="-20" kpx2="1205"/><pair kern="-49" kpx2="1208"/><pair kern="-20" kpx2="1209"/></kerning><kerning kpx1="97"><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="8221"/></kerning><kerning kpx1="1069"><pair kern="-20" kpx2="1221"/><pair kern="-9" kpx2="1222"/><pair kern="-20" kpx2="1217"/><pair kern="-20" kpx2="1227"/><pair kern="-20" kpx2="1236"/><pair kern="-9" kpx2="1113"/><pair kern="-20" kpx2="1232"/><pair kern="-20" kpx2="1234"/><pair kern="-20" kpx2="1244"/><pair kern="-9" kpx2="1246"/><pair kern="-9" kpx2="1134"/><pair kern="-20" kpx2="1126"/><pair kern="-20" kpx2="1262"/><pair kern="-9" kpx2="1127"/><pair kern="-9" kpx2="1260"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="44"/><pair kern="-20" kpx2="1268"/><pair kern="-20" kpx2="1266"/><pair kern="-20" kpx2="1264"/><pair kern="-20" kpx2="1278"/><pair kern="-9" kpx2="1142"/><pair kern="-20" kpx2="1276"/><pair kern="-9" kpx2="1140"/><pair kern="-20" kpx2="1136"/><pair kern="-20" kpx2="1033"/><pair kern="-9" kpx2="1035"/><pair kern="-20" kpx2="1038"/><pair kern="-9" kpx2="1299"/><pair kern="-20" kpx2="1298"/><pair kern="-9" kpx2="1026"/><pair kern="-20" kpx2="1288"/><pair kern="-20" kpx2="1051"/><pair kern="-9" kpx2="1289"/><pair kern="-9" kpx2="1294"/><pair kern="-20" kpx2="1174"/><pair kern="-9" kpx2="1176"/><pair kern="-40" kpx2="8218"/><pair kern="-20" kpx2="1040"/><pair kern="-20" kpx2="1286"/><pair kern="-40" kpx2="8222"/><pair kern="-20" kpx2="1044"/><pair kern="-20" kpx2="1284"/><pair kern="-9" kpx2="1047"/><pair kern="-20" kpx2="1046"/><pair kern="-9" kpx2="1066"/><pair kern="-9" kpx2="1184"/><pair kern="-9" kpx2="1069"/><pair kern="-29" kpx2="1058"/><pair kern="-20" kpx2="1059"/><pair kern="-20" kpx2="1063"/><pair kern="-9" kpx2="1198"/><pair kern="-20" kpx2="1061"/><pair kern="-29" kpx2="1196"/><pair kern="-9" kpx2="1083"/><pair kern="-20" kpx2="1202"/><pair kern="-9" kpx2="1200"/><pair kern="-20" kpx2="1206"/><pair kern="-9" kpx2="1204"/><pair kern="-20" kpx2="1208"/><pair kern="-9" kpx2="1076"/></kerning><kerning kpx1="110"><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="8221"/></kerning><kerning kpx1="1058"><pair kern="-49" kpx2="1100"/><pair kern="-20" kpx2="1101"/><pair kern="-49" kpx2="1102"/><pair kern="-29" kpx2="1103"/><pair kern="-49" kpx2="1096"/><pair kern="-49" kpx2="1097"/><pair kern="-40" kpx2="1098"/><pair kern="-49" kpx2="1099"/><pair kern="-69" kpx2="1092"/><pair kern="-20" kpx2="1093"/><pair kern="-49" kpx2="1094"/><pair kern="-49" kpx2="1095"/><pair kern="-49" kpx2="1088"/><pair kern="-69" kpx2="1089"/><pair kern="-40" kpx2="1090"/><pair kern="-40" kpx2="1091"/><pair kern="-49" kpx2="1117"/><pair kern="-49" kpx2="1116"/><pair kern="-49" kpx2="1119"/><pair kern="-40" kpx2="1118"/><pair kern="-60" kpx2="1113"/><pair kern="-49" kpx2="1114"/><pair kern="-60" kpx2="1109"/><pair kern="-69" kpx2="1108"/><pair kern="-69" kpx2="1105"/><pair kern="-69" kpx2="1104"/><pair kern="-49" kpx2="1107"/><pair kern="-49" kpx2="1133"/><pair kern="-49" kpx2="1131"/><pair kern="-49" kpx2="1129"/><pair kern="-69" kpx2="1126"/><pair kern="-60" kpx2="1127"/><pair kern="-49" kpx2="1125"/><pair kern="-60" kpx2="46"/><pair kern="-60" kpx2="44"/><pair kern="-20" kpx2="1120"/><pair kern="-40" kpx2="45"/><pair kern="-20" kpx2="1121"/><pair kern="-20" kpx2="1151"/><pair kern="-20" kpx2="1150"/><pair kern="-69" kpx2="1149"/><pair kern="-20" kpx2="1148"/><pair kern="-69" kpx2="1147"/><pair kern="-20" kpx2="1146"/><pair kern="-69" kpx2="1145"/><pair kern="-20" kpx2="1144"/><pair kern="-20" kpx2="1143"/><pair kern="-20" kpx2="1141"/><pair kern="-69" kpx2="1139"/><pair kern="-20" kpx2="1138"/><pair kern="-49" kpx2="1137"/><pair kern="-49" kpx2="1033"/><pair kern="-60" kpx2="1299"/><pair kern="-49" kpx2="1298"/><pair kern="-69" kpx2="1297"/><pair kern="-20" kpx2="1028"/><pair kern="-40" kpx2="8211"/><pair kern="-49" kpx2="1291"/><pair kern="-49" kpx2="1288"/><pair kern="-49" kpx2="1051"/><pair kern="-60" kpx2="1289"/><pair kern="-40" kpx2="1295"/><pair kern="-20" kpx2="1292"/><pair kern="-40" kpx2="8213"/><pair kern="-69" kpx2="1293"/><pair kern="-20" kpx2="1054"/><pair kern="-40" kpx2="8212"/><pair kern="-69" kpx2="1282"/><pair kern="-69" kpx2="1283"/><pair kern="-69" kpx2="1040"/><pair kern="-60" kpx2="8218"/><pair kern="-69" kpx2="1280"/><pair kern="-69" kpx2="1281"/><pair kern="-49" kpx2="1287"/><pair kern="-49" kpx2="1044"/><pair kern="-60" kpx2="8222"/><pair kern="-49" kpx2="1285"/><pair kern="20" kpx2="1058"/><pair kern="-20" kpx2="1057"/><pair kern="-40" kpx2="1060"/><pair kern="-60" kpx2="1083"/><pair kern="-49" kpx2="1082"/><pair kern="-49" kpx2="1081"/><pair kern="-49" kpx2="1080"/><pair kern="-49" kpx2="1087"/><pair kern="-69" kpx2="1086"/><pair kern="-49" kpx2="1085"/><pair kern="-49" kpx2="1084"/><pair kern="-49" kpx2="1075"/><pair kern="-49" kpx2="1074"/><pair kern="-20" kpx2="1079"/><pair kern="-20" kpx2="1078"/><pair kern="-69" kpx2="1077"/><pair kern="-60" kpx2="1076"/><pair kern="-49" kpx2="1221"/><pair kern="-49" kpx2="1220"/><pair kern="-60" kpx2="1222"/><pair kern="-20" kpx2="1218"/><pair kern="-49" kpx2="1228"/><pair kern="-49" kpx2="1230"/><pair kern="-49" kpx2="1224"/><pair kern="-49" kpx2="1226"/><pair kern="-69" kpx2="1236"/><pair kern="-69" kpx2="1239"/><pair kern="-69" kpx2="1232"/><pair kern="-69" kpx2="1234"/><pair kern="-20" kpx2="1245"/><pair kern="-20" kpx2="1247"/><pair kern="-69" kpx2="1255"/><pair kern="-20" kpx2="1254"/><pair kern="-49" kpx2="1253"/><pair kern="-49" kpx2="1251"/><pair kern="-29" kpx2="1249"/><pair kern="-40" kpx2="1263"/><pair kern="-20" kpx2="1261"/><pair kern="-69" kpx2="1259"/><pair kern="-20" kpx2="1258"/><pair kern="-69" kpx2="1257"/><pair kern="-20" kpx2="1256"/><pair kern="-49" kpx2="1271"/><pair kern="-49" kpx2="1269"/><pair kern="-40" kpx2="1267"/><pair kern="-40" kpx2="1265"/><pair kern="-20" kpx2="1279"/><pair kern="-20" kpx2="1277"/><pair kern="-49" kpx2="1273"/><pair kern="-69" kpx2="1153"/><pair kern="-20" kpx2="1152"/><pair kern="-49" kpx2="1163"/><pair kern="-49" kpx2="1167"/><pair kern="-49" kpx2="1169"/><pair kern="-49" kpx2="1173"/><pair kern="-20" kpx2="1175"/><pair kern="-20" kpx2="1177"/><pair kern="-49" kpx2="1179"/><pair kern="-49" kpx2="1181"/><pair kern="-49" kpx2="1187"/><pair kern="-40" kpx2="1185"/><pair kern="-49" kpx2="1191"/><pair kern="-49" kpx2="1189"/><pair kern="-69" kpx2="1195"/><pair kern="-20" kpx2="1194"/><pair kern="-69" kpx2="1193"/><pair kern="-20" kpx2="1192"/><pair kern="-40" kpx2="1199"/><pair kern="-40" kpx2="1197"/><pair kern="20" kpx2="1196"/><pair kern="-20" kpx2="1203"/><pair kern="-40" kpx2="1201"/><pair kern="-49" kpx2="1207"/><pair kern="-40" kpx2="1205"/><pair kern="-49" kpx2="1211"/><pair kern="-49" kpx2="1209"/><pair kern="-49" kpx2="1214"/><pair kern="-69" kpx2="1215"/><pair kern="-49" kpx2="1212"/><pair kern="-69" kpx2="1213"/></kerning><kerning kpx1="111"><pair kern="-9" kpx2="34"/><pair kern="-20" kpx2="373"/><pair kern="-9" kpx2="39"/><pair kern="-20" kpx2="7925"/><pair kern="-9" kpx2="380"/><pair kern="-9" kpx2="382"/><pair kern="-9" kpx2="378"/><pair kern="-20" kpx2="119"/><pair kern="-20" kpx2="118"/><pair kern="-20" kpx2="253"/><pair kern="-20" kpx2="7809"/><pair kern="-20" kpx2="7811"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="122"/><pair kern="-9" kpx2="8221"/><pair kern="-20" kpx2="121"/><pair kern="-20" kpx2="120"/></kerning><kerning kpx1="1059"><pair kern="-49" kpx2="1221"/><pair kern="-40" kpx2="1222"/><pair kern="-20" kpx2="1092"/><pair kern="-20" kpx2="1228"/><pair kern="-20" kpx2="1095"/><pair kern="-20" kpx2="1089"/><pair kern="-69" kpx2="1236"/><pair kern="-20" kpx2="1239"/><pair kern="-69" kpx2="1232"/><pair kern="-40" kpx2="1113"/><pair kern="-69" kpx2="1234"/><pair kern="49" kpx2="1115"/><pair kern="-9" kpx2="1109"/><pair kern="-20" kpx2="1108"/><pair kern="-20" kpx2="1105"/><pair kern="-20" kpx2="1104"/><pair kern="49" kpx2="1106"/><pair kern="-20" kpx2="1255"/><pair kern="-9" kpx2="1254"/><pair kern="-69" kpx2="1126"/><pair kern="-40" kpx2="1127"/><pair kern="-20" kpx2="1259"/><pair kern="-60" kpx2="46"/><pair kern="-9" kpx2="1258"/><pair kern="-20" kpx2="1257"/><pair kern="-60" kpx2="44"/><pair kern="-9" kpx2="1120"/><pair kern="-9" kpx2="1256"/><pair kern="-9" kpx2="1150"/><pair kern="-20" kpx2="1149"/><pair kern="-20" kpx2="1269"/><pair kern="-9" kpx2="1148"/><pair kern="-20" kpx2="1147"/><pair kern="-9" kpx2="1146"/><pair kern="-20" kpx2="1145"/><pair kern="-9" kpx2="1144"/><pair kern="-20" kpx2="1139"/><pair kern="-9" kpx2="1138"/><pair kern="-20" kpx2="1153"/><pair kern="-49" kpx2="1033"/><pair kern="-9" kpx2="1152"/><pair kern="-40" kpx2="1299"/><pair kern="-49" kpx2="1298"/><pair kern="-20" kpx2="1297"/><pair kern="-9" kpx2="1028"/><pair kern="49" kpx2="1165"/><pair kern="-49" kpx2="1288"/><pair kern="-49" kpx2="1051"/><pair kern="-40" kpx2="1289"/><pair kern="-9" kpx2="1292"/><pair kern="-20" kpx2="1293"/><pair kern="-9" kpx2="1054"/><pair kern="-69" kpx2="1282"/><pair kern="-20" kpx2="1283"/><pair kern="-69" kpx2="1040"/><pair kern="-60" kpx2="8218"/><pair kern="-69" kpx2="1280"/><pair kern="-20" kpx2="1281"/><pair kern="-49" kpx2="1044"/><pair kern="-60" kpx2="8222"/><pair kern="49" kpx2="1183"/><pair kern="-9" kpx2="1071"/><pair kern="-20" kpx2="1195"/><pair kern="-9" kpx2="1194"/><pair kern="-20" kpx2="1193"/><pair kern="-9" kpx2="1057"/><pair kern="-9" kpx2="1192"/><pair kern="-29" kpx2="1060"/><pair kern="-40" kpx2="1083"/><pair kern="-20" kpx2="1086"/><pair kern="-20" kpx2="1207"/><pair kern="-20" kpx2="1209"/><pair kern="-20" kpx2="1214"/><pair kern="-29" kpx2="1215"/><pair kern="-20" kpx2="1212"/><pair kern="-20" kpx2="1077"/><pair kern="-29" kpx2="1213"/><pair kern="-40" kpx2="1076"/></kerning><kerning kpx1="1056"><pair kern="-60" kpx2="1221"/><pair kern="-60" kpx2="1033"/><pair kern="-49" kpx2="1222"/><pair kern="-20" kpx2="1217"/><pair kern="-49" kpx2="1299"/><pair kern="-60" kpx2="1298"/><pair kern="-49" kpx2="1236"/><pair kern="-60" kpx2="1288"/><pair kern="-60" kpx2="1051"/><pair kern="-49" kpx2="1289"/><pair kern="-49" kpx2="1113"/><pair kern="-49" kpx2="1232"/><pair kern="-20" kpx2="1174"/><pair kern="-49" kpx2="1234"/><pair kern="-40" kpx2="1282"/><pair kern="-20" kpx2="1244"/><pair kern="-129" kpx2="8218"/><pair kern="-49" kpx2="1040"/><pair kern="-40" kpx2="1280"/><pair kern="-60" kpx2="1044"/><pair kern="-129" kpx2="8222"/><pair kern="-20" kpx2="1046"/><pair kern="-9" kpx2="1130"/><pair kern="-49" kpx2="1126"/><pair kern="-49" kpx2="1127"/><pair kern="-129" kpx2="46"/><pair kern="-129" kpx2="44"/><pair kern="-20" kpx2="1061"/><pair kern="-49" kpx2="1083"/><pair kern="-20" kpx2="1202"/><pair kern="-20" kpx2="1278"/><pair kern="-20" kpx2="1276"/><pair kern="-49" kpx2="1076"/></kerning><kerning kpx1="109"><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="8221"/></kerning><kerning kpx1="1057"><pair kern="-20" kpx2="1152"/><pair kern="-20" kpx2="1228"/><pair kern="-20" kpx2="1095"/><pair kern="-20" kpx2="1028"/><pair kern="-20" kpx2="1292"/><pair kern="-20" kpx2="1054"/><pair kern="-20" kpx2="1282"/><pair kern="-20" kpx2="1280"/><pair kern="-20" kpx2="1287"/><pair kern="-20" kpx2="1285"/><pair kern="-20" kpx2="1254"/><pair kern="-20" kpx2="1194"/><pair kern="-20" kpx2="1057"/><pair kern="-20" kpx2="1192"/><pair kern="-20" kpx2="1258"/><pair kern="-20" kpx2="1120"/><pair kern="-20" kpx2="1060"/><pair kern="-20" kpx2="1256"/><pair kern="-20" kpx2="1150"/><pair kern="-20" kpx2="1148"/><pair kern="-20" kpx2="1269"/><pair kern="-20" kpx2="1146"/><pair kern="-20" kpx2="1207"/><pair kern="-20" kpx2="1144"/><pair kern="-20" kpx2="1209"/><pair kern="-20" kpx2="1214"/><pair kern="-20" kpx2="1138"/><pair kern="-20" kpx2="1212"/></kerning><kerning kpx1="1062"><pair kern="109" kpx2="1032"/><pair kern="20" kpx2="1249"/><pair kern="-20" kpx2="1287"/><pair kern="-20" kpx2="1285"/></kerning><kerning kpx1="107"><pair kern="-20" kpx2="7889"/><pair kern="-20" kpx2="275"/><pair kern="-20" kpx2="273"/><pair kern="-20" kpx2="7893"/><pair kern="-20" kpx2="339"/><pair kern="-20" kpx2="279"/><pair kern="-20" kpx2="7895"/><pair kern="-20" kpx2="337"/><pair kern="-20" kpx2="277"/><pair kern="-20" kpx2="7897"/><pair kern="-20" kpx2="283"/><pair kern="-20" kpx2="7899"/><pair kern="-20" kpx2="281"/><pair kern="-20" kpx2="7901"/><pair kern="-20" kpx2="7903"/><pair kern="-20" kpx2="7875"/><pair kern="-20" kpx2="7877"/><pair kern="-20" kpx2="263"/><pair kern="-20" kpx2="7879"/><pair kern="-20" kpx2="335"/><pair kern="-20" kpx2="267"/><pair kern="-20" kpx2="333"/><pair kern="-20" kpx2="265"/><pair kern="-20" kpx2="7885"/><pair kern="-20" kpx2="271"/><pair kern="-20" kpx2="7887"/><pair kern="-20" kpx2="269"/><pair kern="-20" kpx2="100"/><pair kern="-20" kpx2="511"/><pair kern="-20" kpx2="101"/><pair kern="-20" kpx2="235"/><pair kern="-20" kpx2="234"/><pair kern="-20" kpx2="99"/><pair kern="-20" kpx2="233"/><pair kern="-20" kpx2="232"/><pair kern="-20" kpx2="7871"/><pair kern="-20" kpx2="231"/><pair kern="-20" kpx2="111"/><pair kern="-20" kpx2="7869"/><pair kern="-20" kpx2="7867"/><pair kern="-20" kpx2="7865"/><pair kern="-20" kpx2="224"/><pair kern="-20" kpx2="7907"/><pair kern="-20" kpx2="7905"/><pair kern="-20" kpx2="113"/><pair kern="-20" kpx2="248"/><pair kern="-20" kpx2="417"/><pair kern="-20" kpx2="246"/><pair kern="-20" kpx2="244"/><pair kern="-20" kpx2="245"/><pair kern="-20" kpx2="242"/><pair kern="-20" kpx2="243"/></kerning><kerning kpx1="104"><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="8221"/></kerning><kerning kpx1="1060"><pair kern="-20" kpx2="1221"/><pair kern="-9" kpx2="1222"/><pair kern="-20" kpx2="1217"/><pair kern="-20" kpx2="1236"/><pair kern="-9" kpx2="1113"/><pair kern="-20" kpx2="1232"/><pair kern="-20" kpx2="1234"/><pair kern="-20" kpx2="1244"/><pair kern="-20" kpx2="1246"/><pair kern="-20" kpx2="1134"/><pair kern="-20" kpx2="1126"/><pair kern="-9" kpx2="1127"/><pair kern="-29" kpx2="1262"/><pair kern="-20" kpx2="1260"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="44"/><pair kern="-29" kpx2="1266"/><pair kern="-29" kpx2="1264"/><pair kern="-20" kpx2="1278"/><pair kern="-9" kpx2="1142"/><pair kern="-20" kpx2="1276"/><pair kern="-9" kpx2="1140"/><pair kern="-20" kpx2="1033"/><pair kern="-20" kpx2="1035"/><pair kern="-29" kpx2="1038"/><pair kern="-9" kpx2="1299"/><pair kern="-20" kpx2="1298"/><pair kern="-20" kpx2="1026"/><pair kern="-20" kpx2="1288"/><pair kern="-20" kpx2="1051"/><pair kern="-9" kpx2="1289"/><pair kern="-20" kpx2="1294"/><pair kern="-20" kpx2="1174"/><pair kern="-20" kpx2="1176"/><pair kern="-40" kpx2="8218"/><pair kern="-20" kpx2="1040"/><pair kern="-20" kpx2="1286"/><pair kern="-40" kpx2="8222"/><pair kern="-20" kpx2="1044"/><pair kern="-20" kpx2="1284"/><pair kern="-20" kpx2="1047"/><pair kern="-20" kpx2="1046"/><pair kern="-20" kpx2="1066"/><pair kern="-20" kpx2="1184"/><pair kern="-20" kpx2="1069"/><pair kern="-29" kpx2="1058"/><pair kern="-29" kpx2="1059"/><pair kern="-29" kpx2="1198"/><pair kern="-20" kpx2="1061"/><pair kern="-29" kpx2="1196"/><pair kern="-9" kpx2="1083"/><pair kern="-20" kpx2="1202"/><pair kern="-29" kpx2="1200"/><pair kern="-20" kpx2="1204"/><pair kern="-9" kpx2="1076"/></kerning><kerning kpx1="1061"><pair kern="-20" kpx2="1152"/><pair kern="-20" kpx2="1228"/><pair kern="-9" kpx2="1296"/><pair kern="-20" kpx2="1095"/><pair kern="-20" kpx2="1028"/><pair kern="-20" kpx2="1227"/><pair kern="-20" kpx2="1292"/><pair kern="-20" kpx2="1054"/><pair kern="-20" kpx2="1282"/><pair kern="-20" kpx2="1280"/><pair kern="-20" kpx2="1287"/><pair kern="-20" kpx2="1285"/><pair kern="-20" kpx2="1254"/><pair kern="-20" kpx2="1194"/><pair kern="-20" kpx2="1057"/><pair kern="-20" kpx2="1192"/><pair kern="-20" kpx2="1258"/><pair kern="-20" kpx2="1063"/><pair kern="-20" kpx2="1120"/><pair kern="-20" kpx2="1060"/><pair kern="-20" kpx2="1256"/><pair kern="-20" kpx2="1150"/><pair kern="-20" kpx2="1268"/><pair kern="-20" kpx2="1269"/><pair kern="-20" kpx2="1148"/><pair kern="-20" kpx2="1206"/><pair kern="-20" kpx2="1146"/><pair kern="-20" kpx2="1207"/><pair kern="-20" kpx2="1144"/><pair kern="-20" kpx2="1208"/><pair kern="-20" kpx2="1209"/><pair kern="-49" kpx2="1214"/><pair kern="-20" kpx2="1138"/><pair kern="-49" kpx2="1212"/><pair kern="-20" kpx2="1136"/></kerning><kerning kpx1="119"><pair kern="40" kpx2="34"/><pair kern="40" kpx2="39"/><pair kern="-40" kpx2="8218"/><pair kern="40" kpx2="8217"/><pair kern="20" kpx2="63"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="8222"/><pair kern="40" kpx2="8221"/><pair kern="-40" kpx2="44"/></kerning><kerning kpx1="118"><pair kern="40" kpx2="34"/><pair kern="40" kpx2="39"/><pair kern="-40" kpx2="8218"/><pair kern="40" kpx2="8217"/><pair kern="20" kpx2="63"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="8222"/><pair kern="40" kpx2="8221"/><pair kern="-40" kpx2="44"/></kerning><kerning kpx1="1082"><pair kern="-20" kpx2="1153"/><pair kern="-20" kpx2="1092"/><pair kern="-20" kpx2="1228"/><pair kern="-20" kpx2="1297"/><pair kern="-20" kpx2="1095"/><pair kern="-20" kpx2="1089"/><pair kern="-20" kpx2="1239"/><pair kern="-20" kpx2="1293"/><pair kern="-20" kpx2="1283"/><pair kern="-20" kpx2="1108"/><pair kern="-20" kpx2="1281"/><pair kern="-20" kpx2="1105"/><pair kern="-20" kpx2="1104"/><pair kern="-20" kpx2="1255"/><pair kern="-20" kpx2="1195"/><pair kern="-20" kpx2="1193"/><pair kern="-20" kpx2="1259"/><pair kern="-20" kpx2="1257"/><pair kern="-20" kpx2="1149"/><pair kern="-20" kpx2="1269"/><pair kern="-20" kpx2="1147"/><pair kern="-20" kpx2="1086"/><pair kern="-20" kpx2="1207"/><pair kern="-20" kpx2="1145"/><pair kern="-20" kpx2="1209"/><pair kern="-20" kpx2="1139"/><pair kern="-20" kpx2="1215"/><pair kern="-20" kpx2="1077"/><pair kern="-20" kpx2="1213"/></kerning><kerning kpx1="116"><pair kern="20" kpx2="34"/><pair kern="20" kpx2="39"/><pair kern="20" kpx2="8217"/><pair kern="20" kpx2="8221"/></kerning><kerning kpx1="114"><pair kern="-20" kpx2="7889"/><pair kern="-20" kpx2="275"/><pair kern="-20" kpx2="273"/><pair kern="-20" kpx2="7893"/><pair kern="-20" kpx2="279"/><pair kern="-20" kpx2="7895"/><pair kern="-20" kpx2="277"/><pair kern="-20" kpx2="7897"/><pair kern="-20" kpx2="283"/><pair kern="-20" kpx2="7899"/><pair kern="-20" kpx2="281"/><pair kern="-20" kpx2="7901"/><pair kern="-9" kpx2="287"/><pair kern="-20" kpx2="7903"/><pair kern="-9" kpx2="285"/><pair kern="-20" kpx2="259"/><pair kern="-20" kpx2="7875"/><pair kern="-20" kpx2="257"/><pair kern="-20" kpx2="7877"/><pair kern="-20" kpx2="263"/><pair kern="-20" kpx2="7879"/><pair kern="-20" kpx2="261"/><pair kern="-20" kpx2="267"/><pair kern="-20" kpx2="265"/><pair kern="-20" kpx2="7885"/><pair kern="-20" kpx2="271"/><pair kern="-20" kpx2="7887"/><pair kern="-20" kpx2="269"/><pair kern="40" kpx2="34"/><pair kern="40" kpx2="39"/><pair kern="-20" kpx2="7907"/><pair kern="-9" kpx2="289"/><pair kern="-20" kpx2="7905"/><pair kern="-9" kpx2="291"/><pair kern="-20" kpx2="417"/><pair kern="-20" kpx2="339"/><pair kern="-20" kpx2="337"/><pair kern="-20" kpx2="335"/><pair kern="40" kpx2="8217"/><pair kern="-20" kpx2="333"/><pair kern="-20" kpx2="7681"/><pair kern="40" kpx2="8221"/><pair kern="-20" kpx2="7863"/><pair kern="-20" kpx2="509"/><pair kern="-9" kpx2="103"/><pair kern="-20" kpx2="7861"/><pair kern="-20" kpx2="100"/><pair kern="-20" kpx2="511"/><pair kern="-20" kpx2="101"/><pair kern="-20" kpx2="7859"/><pair kern="-20" kpx2="235"/><pair kern="-20" kpx2="234"/><pair kern="-20" kpx2="99"/><pair kern="-20" kpx2="7857"/><pair kern="-20" kpx2="233"/><pair kern="-20" kpx2="507"/><pair kern="-20" kpx2="232"/><pair kern="-20" kpx2="97"/><pair kern="-20" kpx2="7871"/><pair kern="-20" kpx2="231"/><pair kern="-20" kpx2="230"/><pair kern="-20" kpx2="111"/><pair kern="-20" kpx2="7869"/><pair kern="-20" kpx2="229"/><pair kern="-20" kpx2="228"/><pair kern="-20" kpx2="7867"/><pair kern="-20" kpx2="227"/><pair kern="-20" kpx2="226"/><pair kern="-20" kpx2="7865"/><pair kern="-20" kpx2="225"/><pair kern="-20" kpx2="224"/><pair kern="-20" kpx2="7845"/><pair kern="-20" kpx2="7843"/><pair kern="-20" kpx2="113"/><pair kern="-20" kpx2="248"/><pair kern="-20" kpx2="7841"/><pair kern="-20" kpx2="246"/><pair kern="-20" kpx2="7855"/><pair kern="-20" kpx2="244"/><pair kern="-20" kpx2="7853"/><pair kern="-20" kpx2="245"/><pair kern="-20" kpx2="242"/><pair kern="-20" kpx2="7851"/><pair kern="-20" kpx2="243"/><pair kern="-20" kpx2="7849"/></kerning><kerning kpx1="1086"><pair kern="-9" kpx2="1098"/><pair kern="-20" kpx2="1218"/><pair kern="-20" kpx2="1093"/><pair kern="-9" kpx2="1228"/><pair kern="-9" kpx2="1095"/><pair kern="-9" kpx2="1090"/><pair kern="-9" kpx2="1091"/><pair kern="-9" kpx2="1118"/><pair kern="-9" kpx2="1295"/><pair kern="-20" kpx2="1175"/><pair kern="-20" kpx2="1245"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="1287"/><pair kern="-9" kpx2="8221"/><pair kern="-9" kpx2="1285"/><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="1185"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="1263"/><pair kern="-9" kpx2="1197"/><pair kern="-20" kpx2="1203"/><pair kern="-9" kpx2="1269"/><pair kern="-9" kpx2="1207"/><pair kern="-9" kpx2="1267"/><pair kern="-9" kpx2="1205"/><pair kern="-9" kpx2="1265"/><pair kern="-20" kpx2="1279"/><pair kern="-20" kpx2="1277"/><pair kern="-9" kpx2="1209"/><pair kern="-20" kpx2="1078"/></kerning><kerning kpx1="112"><pair kern="-9" kpx2="34"/><pair kern="-20" kpx2="373"/><pair kern="-9" kpx2="39"/><pair kern="-20" kpx2="7925"/><pair kern="-9" kpx2="380"/><pair kern="-9" kpx2="382"/><pair kern="-9" kpx2="378"/><pair kern="-20" kpx2="119"/><pair kern="-20" kpx2="118"/><pair kern="-20" kpx2="253"/><pair kern="-20" kpx2="7809"/><pair kern="-20" kpx2="7811"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="122"/><pair kern="-9" kpx2="8221"/><pair kern="-20" kpx2="121"/><pair kern="-20" kpx2="120"/></kerning><kerning kpx1="1075"><pair kern="-9" kpx2="1153"/><pair kern="-29" kpx2="1222"/><pair kern="-29" kpx2="1299"/><pair kern="-9" kpx2="1092"/><pair kern="-9" kpx2="1297"/><pair kern="-9" kpx2="1089"/><pair kern="-20" kpx2="8211"/><pair kern="-29" kpx2="1289"/><pair kern="-9" kpx2="1239"/><pair kern="-29" kpx2="1113"/><pair kern="-20" kpx2="8213"/><pair kern="-9" kpx2="1293"/><pair kern="-20" kpx2="8212"/><pair kern="-9" kpx2="1283"/><pair kern="-9" kpx2="1108"/><pair kern="-49" kpx2="8218"/><pair kern="-9" kpx2="1281"/><pair kern="-9" kpx2="1105"/><pair kern="-49" kpx2="8222"/><pair kern="-9" kpx2="1104"/><pair kern="-9" kpx2="1255"/><pair kern="-9" kpx2="1195"/><pair kern="-29" kpx2="1127"/><pair kern="-9" kpx2="1193"/><pair kern="-9" kpx2="1259"/><pair kern="-49" kpx2="46"/><pair kern="-9" kpx2="1257"/><pair kern="-49" kpx2="44"/><pair kern="-20" kpx2="45"/><pair kern="-29" kpx2="1083"/><pair kern="-9" kpx2="1149"/><pair kern="-9" kpx2="1147"/><pair kern="-9" kpx2="1086"/><pair kern="-9" kpx2="1145"/><pair kern="-9" kpx2="1139"/><pair kern="-9" kpx2="1077"/><pair kern="-29" kpx2="1076"/></kerning><kerning kpx1="1074"><pair kern="20" kpx2="1103"/></kerning><kerning kpx1="1072"><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="8221"/></kerning><kerning kpx1="123"><pair kern="89" kpx2="74"/></kerning><kerning kpx1="1079"><pair kern="20" kpx2="1103"/></kerning><kerning kpx1="1078"><pair kern="-20" kpx2="1153"/><pair kern="-20" kpx2="1092"/><pair kern="-20" kpx2="1228"/><pair kern="-20" kpx2="1297"/><pair kern="-20" kpx2="1095"/><pair kern="-20" kpx2="1089"/><pair kern="-20" kpx2="1239"/><pair kern="-20" kpx2="1293"/><pair kern="-20" kpx2="1283"/><pair kern="-20" kpx2="1108"/><pair kern="-20" kpx2="1281"/><pair kern="-20" kpx2="1105"/><pair kern="-20" kpx2="1104"/><pair kern="-20" kpx2="1255"/><pair kern="-20" kpx2="1195"/><pair kern="-20" kpx2="1193"/><pair kern="-20" kpx2="1259"/><pair kern="-20" kpx2="1257"/><pair kern="-20" kpx2="1149"/><pair kern="-20" kpx2="1269"/><pair kern="-20" kpx2="1147"/><pair kern="-20" kpx2="1086"/><pair kern="-20" kpx2="1207"/><pair kern="-20" kpx2="1145"/><pair kern="-20" kpx2="1209"/><pair kern="-20" kpx2="1139"/><pair kern="-20" kpx2="1215"/><pair kern="-20" kpx2="1077"/><pair kern="-20" kpx2="1213"/></kerning><kerning kpx1="121"><pair kern="40" kpx2="34"/><pair kern="40" kpx2="39"/><pair kern="-40" kpx2="8218"/><pair kern="40" kpx2="8217"/><pair kern="20" kpx2="63"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="8222"/><pair kern="40" kpx2="8221"/><pair kern="-40" kpx2="44"/></kerning><kerning kpx1="1077"><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="8221"/></kerning><kerning kpx1="120"><pair kern="-20" kpx2="7889"/><pair kern="-20" kpx2="275"/><pair kern="-20" kpx2="273"/><pair kern="-20" kpx2="7893"/><pair kern="-20" kpx2="339"/><pair kern="-20" kpx2="279"/><pair kern="-20" kpx2="7895"/><pair kern="-20" kpx2="337"/><pair kern="-20" kpx2="277"/><pair kern="-20" kpx2="7897"/><pair kern="-20" kpx2="283"/><pair kern="-20" kpx2="7899"/><pair kern="-20" kpx2="281"/><pair kern="-20" kpx2="7901"/><pair kern="-20" kpx2="7903"/><pair kern="-20" kpx2="7875"/><pair kern="-20" kpx2="7877"/><pair kern="-20" kpx2="263"/><pair kern="-20" kpx2="7879"/><pair kern="-20" kpx2="335"/><pair kern="-20" kpx2="267"/><pair kern="-20" kpx2="333"/><pair kern="-20" kpx2="265"/><pair kern="-20" kpx2="7885"/><pair kern="-20" kpx2="271"/><pair kern="-20" kpx2="7887"/><pair kern="-20" kpx2="269"/><pair kern="-20" kpx2="100"/><pair kern="-20" kpx2="511"/><pair kern="-20" kpx2="101"/><pair kern="-20" kpx2="235"/><pair kern="-20" kpx2="234"/><pair kern="-20" kpx2="99"/><pair kern="-20" kpx2="233"/><pair kern="-20" kpx2="232"/><pair kern="-20" kpx2="7871"/><pair kern="-20" kpx2="231"/><pair kern="-20" kpx2="111"/><pair kern="-20" kpx2="7869"/><pair kern="-20" kpx2="7867"/><pair kern="-20" kpx2="7865"/><pair kern="-20" kpx2="224"/><pair kern="-20" kpx2="7907"/><pair kern="-20" kpx2="7905"/><pair kern="-20" kpx2="113"/><pair kern="-20" kpx2="248"/><pair kern="-20" kpx2="417"/><pair kern="-20" kpx2="246"/><pair kern="-20" kpx2="244"/><pair kern="-20" kpx2="245"/><pair kern="-20" kpx2="242"/><pair kern="-20" kpx2="243"/></kerning><kerning kpx1="1076"><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="8221"/></kerning><kerning kpx1="1221"><pair kern="109" kpx2="1032"/><pair kern="20" kpx2="1249"/><pair kern="-20" kpx2="1287"/><pair kern="-20" kpx2="1285"/></kerning><kerning kpx1="1220"><pair kern="-20" kpx2="1269"/><pair kern="-20" kpx2="1207"/><pair kern="-20" kpx2="1228"/><pair kern="-20" kpx2="1209"/><pair kern="-20" kpx2="1095"/></kerning><kerning kpx1="1222"><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="8221"/></kerning><kerning kpx1="1217"><pair kern="-20" kpx2="1152"/><pair kern="-20" kpx2="1228"/><pair kern="-9" kpx2="1296"/><pair kern="-20" kpx2="1095"/><pair kern="-20" kpx2="1028"/><pair kern="-20" kpx2="1227"/><pair kern="-20" kpx2="1292"/><pair kern="-20" kpx2="1054"/><pair kern="-20" kpx2="1282"/><pair kern="-20" kpx2="1280"/><pair kern="-20" kpx2="1287"/><pair kern="-20" kpx2="1285"/><pair kern="-20" kpx2="1254"/><pair kern="-20" kpx2="1194"/><pair kern="-20" kpx2="1057"/><pair kern="-20" kpx2="1192"/><pair kern="-20" kpx2="1258"/><pair kern="-20" kpx2="1063"/><pair kern="-20" kpx2="1120"/><pair kern="-20" kpx2="1060"/><pair kern="-20" kpx2="1256"/><pair kern="-20" kpx2="1150"/><pair kern="-20" kpx2="1268"/><pair kern="-20" kpx2="1269"/><pair kern="-20" kpx2="1148"/><pair kern="-20" kpx2="1206"/><pair kern="-20" kpx2="1146"/><pair kern="-20" kpx2="1207"/><pair kern="-20" kpx2="1144"/><pair kern="-20" kpx2="1208"/><pair kern="-20" kpx2="1209"/><pair kern="-49" kpx2="1214"/><pair kern="-20" kpx2="1138"/><pair kern="-49" kpx2="1212"/><pair kern="-20" kpx2="1136"/></kerning><kerning kpx1="1219"><pair kern="49" kpx2="1032"/><pair kern="-29" kpx2="1098"/><pair kern="-20" kpx2="1228"/><pair kern="-20" kpx2="1095"/><pair kern="-40" kpx2="1227"/><pair kern="-29" kpx2="1090"/><pair kern="-29" kpx2="1295"/><pair kern="-29" kpx2="8217"/><pair kern="-20" kpx2="1286"/><pair kern="-29" kpx2="1287"/><pair kern="-20" kpx2="1284"/><pair kern="-29" kpx2="8221"/><pair kern="-29" kpx2="1285"/><pair kern="-29" kpx2="34"/><pair kern="-29" kpx2="1185"/><pair kern="-29" kpx2="39"/><pair kern="-20" kpx2="1058"/><pair kern="-9" kpx2="1199"/><pair kern="-40" kpx2="1063"/><pair kern="-20" kpx2="1198"/><pair kern="-20" kpx2="1060"/><pair kern="-29" kpx2="1197"/><pair kern="-9" kpx2="1121"/><pair kern="-20" kpx2="1196"/><pair kern="-9" kpx2="1151"/><pair kern="-40" kpx2="1268"/><pair kern="-20" kpx2="1200"/><pair kern="-20" kpx2="1269"/><pair kern="-9" kpx2="1201"/><pair kern="-40" kpx2="1206"/><pair kern="-20" kpx2="1207"/><pair kern="-29" kpx2="1205"/><pair kern="-9" kpx2="1143"/><pair kern="-20" kpx2="1142"/><pair kern="-40" kpx2="1208"/><pair kern="-9" kpx2="1141"/><pair kern="-20" kpx2="1209"/><pair kern="-20" kpx2="1140"/><pair kern="-29" kpx2="1214"/><pair kern="-20" kpx2="1215"/><pair kern="-29" kpx2="1212"/><pair kern="-20" kpx2="1213"/><pair kern="-40" kpx2="1136"/></kerning><kerning kpx1="1218"><pair kern="-20" kpx2="1153"/><pair kern="-20" kpx2="1092"/><pair kern="-20" kpx2="1228"/><pair kern="-20" kpx2="1297"/><pair kern="-20" kpx2="1095"/><pair kern="-20" kpx2="1089"/><pair kern="-20" kpx2="1239"/><pair kern="-20" kpx2="1293"/><pair kern="-20" kpx2="1283"/><pair kern="-20" kpx2="1108"/><pair kern="-20" kpx2="1281"/><pair kern="-20" kpx2="1105"/><pair kern="-20" kpx2="1104"/><pair kern="-20" kpx2="1255"/><pair kern="-20" kpx2="1195"/><pair kern="-20" kpx2="1193"/><pair kern="-20" kpx2="1259"/><pair kern="-20" kpx2="1257"/><pair kern="-20" kpx2="1149"/><pair kern="-20" kpx2="1269"/><pair kern="-20" kpx2="1147"/><pair kern="-20" kpx2="1086"/><pair kern="-20" kpx2="1207"/><pair kern="-20" kpx2="1145"/><pair kern="-20" kpx2="1209"/><pair kern="-20" kpx2="1139"/><pair kern="-20" kpx2="1215"/><pair kern="-20" kpx2="1077"/><pair kern="-20" kpx2="1213"/></kerning><kerning kpx1="1229"><pair kern="109" kpx2="1032"/><pair kern="20" kpx2="1249"/><pair kern="-20" kpx2="1287"/><pair kern="-20" kpx2="1285"/></kerning><kerning kpx1="1230"><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="8221"/></kerning><kerning kpx1="1225"><pair kern="109" kpx2="1032"/><pair kern="20" kpx2="1249"/><pair kern="-20" kpx2="1287"/><pair kern="-20" kpx2="1285"/></kerning><kerning kpx1="1226"><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="8221"/></kerning><kerning kpx1="1237"><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="8221"/></kerning><kerning kpx1="1239"><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="8221"/></kerning><kerning kpx1="1232"><pair kern="-49" kpx2="1035"/><pair kern="-20" kpx2="1098"/><pair kern="-20" kpx2="1228"/><pair kern="-49" kpx2="1026"/><pair kern="-20" kpx2="1095"/><pair kern="-20" kpx2="1164"/><pair kern="-49" kpx2="1227"/><pair kern="-20" kpx2="1090"/><pair kern="-20" kpx2="1170"/><pair kern="-49" kpx2="1294"/><pair kern="-20" kpx2="1295"/><pair kern="-69" kpx2="8217"/><pair kern="-69" kpx2="1286"/><pair kern="-20" kpx2="1240"/><pair kern="-20" kpx2="1287"/><pair kern="-69" kpx2="1284"/><pair kern="-20" kpx2="1242"/><pair kern="-69" kpx2="8221"/><pair kern="-20" kpx2="1182"/><pair kern="-20" kpx2="1285"/><pair kern="-49" kpx2="1066"/><pair kern="-69" kpx2="34"/><pair kern="-20" kpx2="1185"/><pair kern="-49" kpx2="1184"/><pair kern="-69" kpx2="39"/><pair kern="-69" kpx2="1058"/><pair kern="-20" kpx2="1122"/><pair kern="-60" kpx2="1198"/><pair kern="-49" kpx2="1063"/><pair kern="-20" kpx2="1060"/><pair kern="-20" kpx2="1197"/><pair kern="-69" kpx2="1196"/><pair kern="-49" kpx2="1268"/><pair kern="-60" kpx2="1200"/><pair kern="-20" kpx2="1269"/><pair kern="-49" kpx2="1206"/><pair kern="-20" kpx2="1207"/><pair kern="-49" kpx2="1204"/><pair kern="-20" kpx2="1205"/><pair kern="-40" kpx2="1142"/><pair kern="-49" kpx2="1208"/><pair kern="-20" kpx2="1209"/><pair kern="-40" kpx2="1140"/><pair kern="-20" kpx2="1274"/><pair kern="-49" kpx2="1214"/><pair kern="-49" kpx2="1212"/><pair kern="-49" kpx2="1136"/></kerning><kerning kpx1="1233"><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="8221"/></kerning><kerning kpx1="1234"><pair kern="-49" kpx2="1035"/><pair kern="-20" kpx2="1098"/><pair kern="-20" kpx2="1228"/><pair kern="-49" kpx2="1026"/><pair kern="-20" kpx2="1095"/><pair kern="-20" kpx2="1164"/><pair kern="-49" kpx2="1227"/><pair kern="-20" kpx2="1090"/><pair kern="-20" kpx2="1170"/><pair kern="-49" kpx2="1294"/><pair kern="-20" kpx2="1295"/><pair kern="-69" kpx2="8217"/><pair kern="-69" kpx2="1286"/><pair kern="-20" kpx2="1240"/><pair kern="-20" kpx2="1287"/><pair kern="-69" kpx2="1284"/><pair kern="-20" kpx2="1242"/><pair kern="-69" kpx2="8221"/><pair kern="-20" kpx2="1182"/><pair kern="-20" kpx2="1285"/><pair kern="-49" kpx2="1066"/><pair kern="-69" kpx2="34"/><pair kern="-20" kpx2="1185"/><pair kern="-49" kpx2="1184"/><pair kern="-69" kpx2="39"/><pair kern="-69" kpx2="1058"/><pair kern="-20" kpx2="1122"/><pair kern="-60" kpx2="1198"/><pair kern="-49" kpx2="1063"/><pair kern="-20" kpx2="1060"/><pair kern="-20" kpx2="1197"/><pair kern="-69" kpx2="1196"/><pair kern="-49" kpx2="1268"/><pair kern="-60" kpx2="1200"/><pair kern="-20" kpx2="1269"/><pair kern="-49" kpx2="1206"/><pair kern="-20" kpx2="1207"/><pair kern="-49" kpx2="1204"/><pair kern="-20" kpx2="1205"/><pair kern="-40" kpx2="1142"/><pair kern="-49" kpx2="1208"/><pair kern="-20" kpx2="1209"/><pair kern="-40" kpx2="1140"/><pair kern="-20" kpx2="1274"/><pair kern="-49" kpx2="1214"/><pair kern="-49" kpx2="1212"/><pair kern="-49" kpx2="1136"/></kerning><kerning kpx1="1235"><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="8221"/></kerning><kerning kpx1="1244"><pair kern="-20" kpx2="1152"/><pair kern="-20" kpx2="1228"/><pair kern="-9" kpx2="1296"/><pair kern="-20" kpx2="1095"/><pair kern="-20" kpx2="1028"/><pair kern="-20" kpx2="1227"/><pair kern="-20" kpx2="1292"/><pair kern="-20" kpx2="1054"/><pair kern="-20" kpx2="1282"/><pair kern="-20" kpx2="1280"/><pair kern="-20" kpx2="1287"/><pair kern="-20" kpx2="1285"/><pair kern="-20" kpx2="1254"/><pair kern="-20" kpx2="1194"/><pair kern="-20" kpx2="1057"/><pair kern="-20" kpx2="1192"/><pair kern="-20" kpx2="1258"/><pair kern="-20" kpx2="1063"/><pair kern="-20" kpx2="1120"/><pair kern="-20" kpx2="1060"/><pair kern="-20" kpx2="1256"/><pair kern="-20" kpx2="1150"/><pair kern="-20" kpx2="1268"/><pair kern="-20" kpx2="1269"/><pair kern="-20" kpx2="1148"/><pair kern="-20" kpx2="1206"/><pair kern="-20" kpx2="1146"/><pair kern="-20" kpx2="1207"/><pair kern="-20" kpx2="1144"/><pair kern="-20" kpx2="1208"/><pair kern="-20" kpx2="1209"/><pair kern="-49" kpx2="1214"/><pair kern="-20" kpx2="1138"/><pair kern="-49" kpx2="1212"/><pair kern="-20" kpx2="1136"/></kerning><kerning kpx1="1245"><pair kern="-20" kpx2="1153"/><pair kern="-20" kpx2="1092"/><pair kern="-20" kpx2="1228"/><pair kern="-20" kpx2="1297"/><pair kern="-20" kpx2="1095"/><pair kern="-20" kpx2="1089"/><pair kern="-20" kpx2="1239"/><pair kern="-20" kpx2="1293"/><pair kern="-20" kpx2="1283"/><pair kern="-20" kpx2="1108"/><pair kern="-20" kpx2="1281"/><pair kern="-20" kpx2="1105"/><pair kern="-20" kpx2="1104"/><pair kern="-20" kpx2="1255"/><pair kern="-20" kpx2="1195"/><pair kern="-20" kpx2="1193"/><pair kern="-20" kpx2="1259"/><pair kern="-20" kpx2="1257"/><pair kern="-20" kpx2="1149"/><pair kern="-20" kpx2="1269"/><pair kern="-20" kpx2="1147"/><pair kern="-20" kpx2="1086"/><pair kern="-20" kpx2="1207"/><pair kern="-20" kpx2="1145"/><pair kern="-20" kpx2="1209"/><pair kern="-20" kpx2="1139"/><pair kern="-20" kpx2="1215"/><pair kern="-20" kpx2="1077"/><pair kern="-20" kpx2="1213"/></kerning><kerning kpx1="1246"><pair kern="-9" kpx2="1200"/><pair kern="-9" kpx2="1142"/><pair kern="-40" kpx2="8218"/><pair kern="-9" kpx2="1140"/><pair kern="-20" kpx2="1286"/><pair kern="-40" kpx2="46"/><pair kern="-9" kpx2="1198"/><pair kern="-40" kpx2="8222"/><pair kern="-20" kpx2="1284"/><pair kern="-40" kpx2="44"/></kerning><kerning kpx1="1247"><pair kern="20" kpx2="1103"/></kerning><kerning kpx1="1240"><pair kern="-20" kpx2="1221"/><pair kern="-9" kpx2="1222"/><pair kern="-20" kpx2="1217"/><pair kern="-20" kpx2="1227"/><pair kern="-20" kpx2="1236"/><pair kern="-9" kpx2="1113"/><pair kern="-20" kpx2="1232"/><pair kern="-20" kpx2="1234"/><pair kern="-20" kpx2="1244"/><pair kern="-9" kpx2="1246"/><pair kern="-9" kpx2="1134"/><pair kern="-20" kpx2="1126"/><pair kern="-20" kpx2="1262"/><pair kern="-9" kpx2="1127"/><pair kern="-9" kpx2="1260"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="44"/><pair kern="-20" kpx2="1268"/><pair kern="-20" kpx2="1266"/><pair kern="-20" kpx2="1264"/><pair kern="-20" kpx2="1278"/><pair kern="-9" kpx2="1142"/><pair kern="-20" kpx2="1276"/><pair kern="-9" kpx2="1140"/><pair kern="-20" kpx2="1136"/><pair kern="-20" kpx2="1033"/><pair kern="-9" kpx2="1035"/><pair kern="-20" kpx2="1038"/><pair kern="-9" kpx2="1299"/><pair kern="-20" kpx2="1298"/><pair kern="-9" kpx2="1026"/><pair kern="-20" kpx2="1288"/><pair kern="-20" kpx2="1051"/><pair kern="-9" kpx2="1289"/><pair kern="-9" kpx2="1294"/><pair kern="-20" kpx2="1174"/><pair kern="-9" kpx2="1176"/><pair kern="-40" kpx2="8218"/><pair kern="-20" kpx2="1040"/><pair kern="-20" kpx2="1286"/><pair kern="-40" kpx2="8222"/><pair kern="-20" kpx2="1044"/><pair kern="-20" kpx2="1284"/><pair kern="-9" kpx2="1047"/><pair kern="-20" kpx2="1046"/><pair kern="-9" kpx2="1066"/><pair kern="-9" kpx2="1184"/><pair kern="-9" kpx2="1069"/><pair kern="-29" kpx2="1058"/><pair kern="-20" kpx2="1059"/><pair kern="-20" kpx2="1063"/><pair kern="-9" kpx2="1198"/><pair kern="-20" kpx2="1061"/><pair kern="-29" kpx2="1196"/><pair kern="-9" kpx2="1083"/><pair kern="-20" kpx2="1202"/><pair kern="-9" kpx2="1200"/><pair kern="-20" kpx2="1206"/><pair kern="-9" kpx2="1204"/><pair kern="-20" kpx2="1208"/><pair kern="-9" kpx2="1076"/></kerning><kerning kpx1="1241"><pair kern="-9" kpx2="1098"/><pair kern="-20" kpx2="1218"/><pair kern="-20" kpx2="1093"/><pair kern="-9" kpx2="1228"/><pair kern="-9" kpx2="1095"/><pair kern="-9" kpx2="1090"/><pair kern="-9" kpx2="1091"/><pair kern="-9" kpx2="1118"/><pair kern="-9" kpx2="1295"/><pair kern="-20" kpx2="1175"/><pair kern="-20" kpx2="1245"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="1287"/><pair kern="-9" kpx2="8221"/><pair kern="-9" kpx2="1285"/><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="1185"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="1263"/><pair kern="-9" kpx2="1197"/><pair kern="-20" kpx2="1203"/><pair kern="-9" kpx2="1269"/><pair kern="-9" kpx2="1207"/><pair kern="-9" kpx2="1267"/><pair kern="-9" kpx2="1205"/><pair kern="-9" kpx2="1265"/><pair kern="-20" kpx2="1279"/><pair kern="-20" kpx2="1277"/><pair kern="-9" kpx2="1209"/><pair kern="-20" kpx2="1078"/></kerning><kerning kpx1="1242"><pair kern="-20" kpx2="1221"/><pair kern="-9" kpx2="1222"/><pair kern="-20" kpx2="1217"/><pair kern="-20" kpx2="1227"/><pair kern="-20" kpx2="1236"/><pair kern="-9" kpx2="1113"/><pair kern="-20" kpx2="1232"/><pair kern="-20" kpx2="1234"/><pair kern="-20" kpx2="1244"/><pair kern="-9" kpx2="1246"/><pair kern="-9" kpx2="1134"/><pair kern="-20" kpx2="1126"/><pair kern="-20" kpx2="1262"/><pair kern="-9" kpx2="1127"/><pair kern="-9" kpx2="1260"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="44"/><pair kern="-20" kpx2="1268"/><pair kern="-20" kpx2="1266"/><pair kern="-20" kpx2="1264"/><pair kern="-20" kpx2="1278"/><pair kern="-9" kpx2="1142"/><pair kern="-20" kpx2="1276"/><pair kern="-9" kpx2="1140"/><pair kern="-20" kpx2="1136"/><pair kern="-20" kpx2="1033"/><pair kern="-9" kpx2="1035"/><pair kern="-20" kpx2="1038"/><pair kern="-9" kpx2="1299"/><pair kern="-20" kpx2="1298"/><pair kern="-9" kpx2="1026"/><pair kern="-20" kpx2="1288"/><pair kern="-20" kpx2="1051"/><pair kern="-9" kpx2="1289"/><pair kern="-9" kpx2="1294"/><pair kern="-20" kpx2="1174"/><pair kern="-9" kpx2="1176"/><pair kern="-40" kpx2="8218"/><pair kern="-20" kpx2="1040"/><pair kern="-20" kpx2="1286"/><pair kern="-40" kpx2="8222"/><pair kern="-20" kpx2="1044"/><pair kern="-20" kpx2="1284"/><pair kern="-9" kpx2="1047"/><pair kern="-20" kpx2="1046"/><pair kern="-9" kpx2="1066"/><pair kern="-9" kpx2="1184"/><pair kern="-9" kpx2="1069"/><pair kern="-29" kpx2="1058"/><pair kern="-20" kpx2="1059"/><pair kern="-20" kpx2="1063"/><pair kern="-9" kpx2="1198"/><pair kern="-20" kpx2="1061"/><pair kern="-29" kpx2="1196"/><pair kern="-9" kpx2="1083"/><pair kern="-20" kpx2="1202"/><pair kern="-9" kpx2="1200"/><pair kern="-20" kpx2="1206"/><pair kern="-9" kpx2="1204"/><pair kern="-20" kpx2="1208"/><pair kern="-9" kpx2="1076"/></kerning><kerning kpx1="1243"><pair kern="-9" kpx2="1098"/><pair kern="-20" kpx2="1218"/><pair kern="-20" kpx2="1093"/><pair kern="-9" kpx2="1228"/><pair kern="-9" kpx2="1095"/><pair kern="-9" kpx2="1090"/><pair kern="-9" kpx2="1091"/><pair kern="-9" kpx2="1118"/><pair kern="-9" kpx2="1295"/><pair kern="-20" kpx2="1175"/><pair kern="-20" kpx2="1245"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="1287"/><pair kern="-9" kpx2="8221"/><pair kern="-9" kpx2="1285"/><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="1185"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="1263"/><pair kern="-9" kpx2="1197"/><pair kern="-20" kpx2="1203"/><pair kern="-9" kpx2="1269"/><pair kern="-9" kpx2="1207"/><pair kern="-9" kpx2="1267"/><pair kern="-9" kpx2="1205"/><pair kern="-9" kpx2="1265"/><pair kern="-20" kpx2="1279"/><pair kern="-20" kpx2="1277"/><pair kern="-9" kpx2="1209"/><pair kern="-20" kpx2="1078"/></kerning><kerning kpx1="1255"><pair kern="-9" kpx2="1098"/><pair kern="-20" kpx2="1218"/><pair kern="-20" kpx2="1093"/><pair kern="-9" kpx2="1228"/><pair kern="-9" kpx2="1095"/><pair kern="-9" kpx2="1090"/><pair kern="-9" kpx2="1091"/><pair kern="-9" kpx2="1118"/><pair kern="-9" kpx2="1295"/><pair kern="-20" kpx2="1175"/><pair kern="-20" kpx2="1245"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="1287"/><pair kern="-9" kpx2="8221"/><pair kern="-9" kpx2="1285"/><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="1185"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="1263"/><pair kern="-9" kpx2="1197"/><pair kern="-20" kpx2="1203"/><pair kern="-9" kpx2="1269"/><pair kern="-9" kpx2="1207"/><pair kern="-9" kpx2="1267"/><pair kern="-9" kpx2="1205"/><pair kern="-9" kpx2="1265"/><pair kern="-20" kpx2="1279"/><pair kern="-20" kpx2="1277"/><pair kern="-9" kpx2="1209"/><pair kern="-20" kpx2="1078"/></kerning><kerning kpx1="1254"><pair kern="-20" kpx2="1221"/><pair kern="-9" kpx2="1222"/><pair kern="-20" kpx2="1217"/><pair kern="-20" kpx2="1227"/><pair kern="-20" kpx2="1236"/><pair kern="-9" kpx2="1113"/><pair kern="-20" kpx2="1232"/><pair kern="-20" kpx2="1234"/><pair kern="-20" kpx2="1244"/><pair kern="-9" kpx2="1246"/><pair kern="-9" kpx2="1134"/><pair kern="-20" kpx2="1126"/><pair kern="-20" kpx2="1262"/><pair kern="-9" kpx2="1127"/><pair kern="-9" kpx2="1260"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="44"/><pair kern="-20" kpx2="1268"/><pair kern="-20" kpx2="1266"/><pair kern="-20" kpx2="1264"/><pair kern="-20" kpx2="1278"/><pair kern="-9" kpx2="1142"/><pair kern="-20" kpx2="1276"/><pair kern="-9" kpx2="1140"/><pair kern="-20" kpx2="1136"/><pair kern="-20" kpx2="1033"/><pair kern="-9" kpx2="1035"/><pair kern="-20" kpx2="1038"/><pair kern="-9" kpx2="1299"/><pair kern="-20" kpx2="1298"/><pair kern="-9" kpx2="1026"/><pair kern="-20" kpx2="1288"/><pair kern="-20" kpx2="1051"/><pair kern="-9" kpx2="1289"/><pair kern="-9" kpx2="1294"/><pair kern="-20" kpx2="1174"/><pair kern="-9" kpx2="1176"/><pair kern="-40" kpx2="8218"/><pair kern="-20" kpx2="1040"/><pair kern="-20" kpx2="1286"/><pair kern="-40" kpx2="8222"/><pair kern="-20" kpx2="1044"/><pair kern="-20" kpx2="1284"/><pair kern="-9" kpx2="1047"/><pair kern="-20" kpx2="1046"/><pair kern="-9" kpx2="1066"/><pair kern="-9" kpx2="1184"/><pair kern="-9" kpx2="1069"/><pair kern="-29" kpx2="1058"/><pair kern="-20" kpx2="1059"/><pair kern="-20" kpx2="1063"/><pair kern="-9" kpx2="1198"/><pair kern="-20" kpx2="1061"/><pair kern="-29" kpx2="1196"/><pair kern="-9" kpx2="1083"/><pair kern="-20" kpx2="1202"/><pair kern="-9" kpx2="1200"/><pair kern="-20" kpx2="1206"/><pair kern="-9" kpx2="1204"/><pair kern="-20" kpx2="1208"/><pair kern="-9" kpx2="1076"/></kerning><kerning kpx1="1248"><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-20" kpx2="1287"/><pair kern="-9" kpx2="8221"/><pair kern="-20" kpx2="1285"/></kerning><kerning kpx1="1263"><pair kern="-20" kpx2="1083"/><pair kern="-20" kpx2="1289"/><pair kern="-20" kpx2="1222"/><pair kern="-20" kpx2="1113"/><pair kern="-20" kpx2="1299"/><pair kern="-20" kpx2="1127"/><pair kern="-40" kpx2="8218"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="8222"/><pair kern="-40" kpx2="44"/><pair kern="-20" kpx2="1076"/></kerning><kerning kpx1="1262"><pair kern="-49" kpx2="1221"/><pair kern="-40" kpx2="1222"/><pair kern="-20" kpx2="1092"/><pair kern="-20" kpx2="1228"/><pair kern="-20" kpx2="1095"/><pair kern="-20" kpx2="1089"/><pair kern="-69" kpx2="1236"/><pair kern="-20" kpx2="1239"/><pair kern="-69" kpx2="1232"/><pair kern="-40" kpx2="1113"/><pair kern="-69" kpx2="1234"/><pair kern="49" kpx2="1115"/><pair kern="-9" kpx2="1109"/><pair kern="-20" kpx2="1108"/><pair kern="-20" kpx2="1105"/><pair kern="-20" kpx2="1104"/><pair kern="49" kpx2="1106"/><pair kern="-20" kpx2="1255"/><pair kern="-9" kpx2="1254"/><pair kern="-69" kpx2="1126"/><pair kern="-40" kpx2="1127"/><pair kern="-20" kpx2="1259"/><pair kern="-60" kpx2="46"/><pair kern="-9" kpx2="1258"/><pair kern="-20" kpx2="1257"/><pair kern="-60" kpx2="44"/><pair kern="-9" kpx2="1120"/><pair kern="-9" kpx2="1256"/><pair kern="-9" kpx2="1150"/><pair kern="-20" kpx2="1149"/><pair kern="-20" kpx2="1269"/><pair kern="-9" kpx2="1148"/><pair kern="-20" kpx2="1147"/><pair kern="-9" kpx2="1146"/><pair kern="-20" kpx2="1145"/><pair kern="-9" kpx2="1144"/><pair kern="-20" kpx2="1139"/><pair kern="-9" kpx2="1138"/><pair kern="-20" kpx2="1153"/><pair kern="-49" kpx2="1033"/><pair kern="-9" kpx2="1152"/><pair kern="-40" kpx2="1299"/><pair kern="-49" kpx2="1298"/><pair kern="-20" kpx2="1297"/><pair kern="-9" kpx2="1028"/><pair kern="49" kpx2="1165"/><pair kern="-49" kpx2="1288"/><pair kern="-49" kpx2="1051"/><pair kern="-40" kpx2="1289"/><pair kern="-9" kpx2="1292"/><pair kern="-20" kpx2="1293"/><pair kern="-9" kpx2="1054"/><pair kern="-69" kpx2="1282"/><pair kern="-20" kpx2="1283"/><pair kern="-69" kpx2="1040"/><pair kern="-60" kpx2="8218"/><pair kern="-69" kpx2="1280"/><pair kern="-20" kpx2="1281"/><pair kern="-49" kpx2="1044"/><pair kern="-60" kpx2="8222"/><pair kern="49" kpx2="1183"/><pair kern="-9" kpx2="1071"/><pair kern="-20" kpx2="1195"/><pair kern="-9" kpx2="1194"/><pair kern="-20" kpx2="1193"/><pair kern="-9" kpx2="1057"/><pair kern="-9" kpx2="1192"/><pair kern="-29" kpx2="1060"/><pair kern="-40" kpx2="1083"/><pair kern="-20" kpx2="1086"/><pair kern="-20" kpx2="1207"/><pair kern="-20" kpx2="1209"/><pair kern="-20" kpx2="1214"/><pair kern="-29" kpx2="1215"/><pair kern="-20" kpx2="1212"/><pair kern="-20" kpx2="1077"/><pair kern="-29" kpx2="1213"/><pair kern="-40" kpx2="1076"/></kerning><kerning kpx1="1261"><pair kern="-9" kpx2="1098"/><pair kern="-20" kpx2="1218"/><pair kern="-20" kpx2="1093"/><pair kern="-9" kpx2="1228"/><pair kern="-9" kpx2="1095"/><pair kern="-9" kpx2="1090"/><pair kern="-9" kpx2="1091"/><pair kern="-9" kpx2="1118"/><pair kern="-9" kpx2="1295"/><pair kern="-20" kpx2="1175"/><pair kern="-20" kpx2="1245"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="1287"/><pair kern="-9" kpx2="8221"/><pair kern="-9" kpx2="1285"/><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="1185"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="1263"/><pair kern="-9" kpx2="1197"/><pair kern="-20" kpx2="1203"/><pair kern="-9" kpx2="1269"/><pair kern="-9" kpx2="1207"/><pair kern="-9" kpx2="1267"/><pair kern="-9" kpx2="1205"/><pair kern="-9" kpx2="1265"/><pair kern="-20" kpx2="1279"/><pair kern="-20" kpx2="1277"/><pair kern="-9" kpx2="1209"/><pair kern="-20" kpx2="1078"/></kerning><kerning kpx1="1260"><pair kern="-20" kpx2="1221"/><pair kern="-9" kpx2="1222"/><pair kern="-20" kpx2="1217"/><pair kern="-20" kpx2="1227"/><pair kern="-20" kpx2="1236"/><pair kern="-9" kpx2="1113"/><pair kern="-20" kpx2="1232"/><pair kern="-20" kpx2="1234"/><pair kern="-20" kpx2="1244"/><pair kern="-9" kpx2="1246"/><pair kern="-9" kpx2="1134"/><pair kern="-20" kpx2="1126"/><pair kern="-20" kpx2="1262"/><pair kern="-9" kpx2="1127"/><pair kern="-9" kpx2="1260"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="44"/><pair kern="-20" kpx2="1268"/><pair kern="-20" kpx2="1266"/><pair kern="-20" kpx2="1264"/><pair kern="-20" kpx2="1278"/><pair kern="-9" kpx2="1142"/><pair kern="-20" kpx2="1276"/><pair kern="-9" kpx2="1140"/><pair kern="-20" kpx2="1136"/><pair kern="-20" kpx2="1033"/><pair kern="-9" kpx2="1035"/><pair kern="-20" kpx2="1038"/><pair kern="-9" kpx2="1299"/><pair kern="-20" kpx2="1298"/><pair kern="-9" kpx2="1026"/><pair kern="-20" kpx2="1288"/><pair kern="-20" kpx2="1051"/><pair kern="-9" kpx2="1289"/><pair kern="-9" kpx2="1294"/><pair kern="-20" kpx2="1174"/><pair kern="-9" kpx2="1176"/><pair kern="-40" kpx2="8218"/><pair kern="-20" kpx2="1040"/><pair kern="-20" kpx2="1286"/><pair kern="-40" kpx2="8222"/><pair kern="-20" kpx2="1044"/><pair kern="-20" kpx2="1284"/><pair kern="-9" kpx2="1047"/><pair kern="-20" kpx2="1046"/><pair kern="-9" kpx2="1066"/><pair kern="-9" kpx2="1184"/><pair kern="-9" kpx2="1069"/><pair kern="-29" kpx2="1058"/><pair kern="-20" kpx2="1059"/><pair kern="-20" kpx2="1063"/><pair kern="-9" kpx2="1198"/><pair kern="-20" kpx2="1061"/><pair kern="-29" kpx2="1196"/><pair kern="-9" kpx2="1083"/><pair kern="-20" kpx2="1202"/><pair kern="-9" kpx2="1200"/><pair kern="-20" kpx2="1206"/><pair kern="-9" kpx2="1204"/><pair kern="-20" kpx2="1208"/><pair kern="-9" kpx2="1076"/></kerning><kerning kpx1="1259"><pair kern="-9" kpx2="1098"/><pair kern="-20" kpx2="1218"/><pair kern="-20" kpx2="1093"/><pair kern="-9" kpx2="1228"/><pair kern="-9" kpx2="1095"/><pair kern="-9" kpx2="1090"/><pair kern="-9" kpx2="1091"/><pair kern="-9" kpx2="1118"/><pair kern="-9" kpx2="1295"/><pair kern="-20" kpx2="1175"/><pair kern="-20" kpx2="1245"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="1287"/><pair kern="-9" kpx2="8221"/><pair kern="-9" kpx2="1285"/><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="1185"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="1263"/><pair kern="-9" kpx2="1197"/><pair kern="-20" kpx2="1203"/><pair kern="-9" kpx2="1269"/><pair kern="-9" kpx2="1207"/><pair kern="-9" kpx2="1267"/><pair kern="-9" kpx2="1205"/><pair kern="-9" kpx2="1265"/><pair kern="-20" kpx2="1279"/><pair kern="-20" kpx2="1277"/><pair kern="-9" kpx2="1209"/><pair kern="-20" kpx2="1078"/></kerning><kerning kpx1="1258"><pair kern="-20" kpx2="1221"/><pair kern="-9" kpx2="1222"/><pair kern="-20" kpx2="1217"/><pair kern="-20" kpx2="1227"/><pair kern="-20" kpx2="1236"/><pair kern="-9" kpx2="1113"/><pair kern="-20" kpx2="1232"/><pair kern="-20" kpx2="1234"/><pair kern="-20" kpx2="1244"/><pair kern="-9" kpx2="1246"/><pair kern="-9" kpx2="1134"/><pair kern="-20" kpx2="1126"/><pair kern="-20" kpx2="1262"/><pair kern="-9" kpx2="1127"/><pair kern="-9" kpx2="1260"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="44"/><pair kern="-20" kpx2="1268"/><pair kern="-20" kpx2="1266"/><pair kern="-20" kpx2="1264"/><pair kern="-20" kpx2="1278"/><pair kern="-9" kpx2="1142"/><pair kern="-20" kpx2="1276"/><pair kern="-9" kpx2="1140"/><pair kern="-20" kpx2="1136"/><pair kern="-20" kpx2="1033"/><pair kern="-9" kpx2="1035"/><pair kern="-20" kpx2="1038"/><pair kern="-9" kpx2="1299"/><pair kern="-20" kpx2="1298"/><pair kern="-9" kpx2="1026"/><pair kern="-20" kpx2="1288"/><pair kern="-20" kpx2="1051"/><pair kern="-9" kpx2="1289"/><pair kern="-9" kpx2="1294"/><pair kern="-20" kpx2="1174"/><pair kern="-9" kpx2="1176"/><pair kern="-40" kpx2="8218"/><pair kern="-20" kpx2="1040"/><pair kern="-20" kpx2="1286"/><pair kern="-40" kpx2="8222"/><pair kern="-20" kpx2="1044"/><pair kern="-20" kpx2="1284"/><pair kern="-9" kpx2="1047"/><pair kern="-20" kpx2="1046"/><pair kern="-9" kpx2="1066"/><pair kern="-9" kpx2="1184"/><pair kern="-9" kpx2="1069"/><pair kern="-29" kpx2="1058"/><pair kern="-20" kpx2="1059"/><pair kern="-20" kpx2="1063"/><pair kern="-9" kpx2="1198"/><pair kern="-20" kpx2="1061"/><pair kern="-29" kpx2="1196"/><pair kern="-9" kpx2="1083"/><pair kern="-20" kpx2="1202"/><pair kern="-9" kpx2="1200"/><pair kern="-20" kpx2="1206"/><pair kern="-9" kpx2="1204"/><pair kern="-20" kpx2="1208"/><pair kern="-9" kpx2="1076"/></kerning><kerning kpx1="1257"><pair kern="-9" kpx2="1098"/><pair kern="-20" kpx2="1218"/><pair kern="-20" kpx2="1093"/><pair kern="-9" kpx2="1228"/><pair kern="-9" kpx2="1095"/><pair kern="-9" kpx2="1090"/><pair kern="-9" kpx2="1091"/><pair kern="-9" kpx2="1118"/><pair kern="-9" kpx2="1295"/><pair kern="-20" kpx2="1175"/><pair kern="-20" kpx2="1245"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="1287"/><pair kern="-9" kpx2="8221"/><pair kern="-9" kpx2="1285"/><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="1185"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="1263"/><pair kern="-9" kpx2="1197"/><pair kern="-20" kpx2="1203"/><pair kern="-9" kpx2="1269"/><pair kern="-9" kpx2="1207"/><pair kern="-9" kpx2="1267"/><pair kern="-9" kpx2="1205"/><pair kern="-9" kpx2="1265"/><pair kern="-20" kpx2="1279"/><pair kern="-20" kpx2="1277"/><pair kern="-9" kpx2="1209"/><pair kern="-20" kpx2="1078"/></kerning><kerning kpx1="1256"><pair kern="-20" kpx2="1221"/><pair kern="-9" kpx2="1222"/><pair kern="-20" kpx2="1217"/><pair kern="-20" kpx2="1227"/><pair kern="-20" kpx2="1236"/><pair kern="-9" kpx2="1113"/><pair kern="-20" kpx2="1232"/><pair kern="-20" kpx2="1234"/><pair kern="-20" kpx2="1244"/><pair kern="-9" kpx2="1246"/><pair kern="-9" kpx2="1134"/><pair kern="-20" kpx2="1126"/><pair kern="-20" kpx2="1262"/><pair kern="-9" kpx2="1127"/><pair kern="-9" kpx2="1260"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="44"/><pair kern="-20" kpx2="1268"/><pair kern="-20" kpx2="1266"/><pair kern="-20" kpx2="1264"/><pair kern="-20" kpx2="1278"/><pair kern="-9" kpx2="1142"/><pair kern="-20" kpx2="1276"/><pair kern="-9" kpx2="1140"/><pair kern="-20" kpx2="1136"/><pair kern="-20" kpx2="1033"/><pair kern="-9" kpx2="1035"/><pair kern="-20" kpx2="1038"/><pair kern="-9" kpx2="1299"/><pair kern="-20" kpx2="1298"/><pair kern="-9" kpx2="1026"/><pair kern="-20" kpx2="1288"/><pair kern="-20" kpx2="1051"/><pair kern="-9" kpx2="1289"/><pair kern="-9" kpx2="1294"/><pair kern="-20" kpx2="1174"/><pair kern="-9" kpx2="1176"/><pair kern="-40" kpx2="8218"/><pair kern="-20" kpx2="1040"/><pair kern="-20" kpx2="1286"/><pair kern="-40" kpx2="8222"/><pair kern="-20" kpx2="1044"/><pair kern="-20" kpx2="1284"/><pair kern="-9" kpx2="1047"/><pair kern="-20" kpx2="1046"/><pair kern="-9" kpx2="1066"/><pair kern="-9" kpx2="1184"/><pair kern="-9" kpx2="1069"/><pair kern="-29" kpx2="1058"/><pair kern="-20" kpx2="1059"/><pair kern="-20" kpx2="1063"/><pair kern="-9" kpx2="1198"/><pair kern="-20" kpx2="1061"/><pair kern="-29" kpx2="1196"/><pair kern="-9" kpx2="1083"/><pair kern="-20" kpx2="1202"/><pair kern="-9" kpx2="1200"/><pair kern="-20" kpx2="1206"/><pair kern="-9" kpx2="1204"/><pair kern="-20" kpx2="1208"/><pair kern="-9" kpx2="1076"/></kerning><kerning kpx1="1270"><pair kern="-49" kpx2="1100"/><pair kern="-20" kpx2="1101"/><pair kern="-49" kpx2="1102"/><pair kern="-29" kpx2="1103"/><pair kern="-49" kpx2="1096"/><pair kern="-49" kpx2="1097"/><pair kern="-40" kpx2="1098"/><pair kern="-49" kpx2="1099"/><pair kern="-69" kpx2="1092"/><pair kern="-20" kpx2="1093"/><pair kern="-49" kpx2="1094"/><pair kern="-49" kpx2="1095"/><pair kern="-49" kpx2="1088"/><pair kern="-69" kpx2="1089"/><pair kern="-40" kpx2="1090"/><pair kern="-40" kpx2="1091"/><pair kern="-49" kpx2="1117"/><pair kern="-49" kpx2="1116"/><pair kern="-49" kpx2="1119"/><pair kern="-40" kpx2="1118"/><pair kern="-60" kpx2="1113"/><pair kern="-49" kpx2="1114"/><pair kern="-60" kpx2="1109"/><pair kern="-69" kpx2="1108"/><pair kern="-69" kpx2="1105"/><pair kern="-69" kpx2="1104"/><pair kern="-49" kpx2="1107"/><pair kern="-49" kpx2="1133"/><pair kern="-49" kpx2="1131"/><pair kern="-49" kpx2="1129"/><pair kern="-69" kpx2="1126"/><pair kern="-60" kpx2="1127"/><pair kern="-49" kpx2="1125"/><pair kern="-60" kpx2="46"/><pair kern="-60" kpx2="44"/><pair kern="-20" kpx2="1120"/><pair kern="-40" kpx2="45"/><pair kern="-20" kpx2="1121"/><pair kern="-20" kpx2="1151"/><pair kern="-20" kpx2="1150"/><pair kern="-69" kpx2="1149"/><pair kern="-20" kpx2="1148"/><pair kern="-69" kpx2="1147"/><pair kern="-20" kpx2="1146"/><pair kern="-69" kpx2="1145"/><pair kern="-20" kpx2="1144"/><pair kern="-20" kpx2="1143"/><pair kern="-20" kpx2="1141"/><pair kern="-69" kpx2="1139"/><pair kern="-20" kpx2="1138"/><pair kern="-49" kpx2="1137"/><pair kern="-49" kpx2="1033"/><pair kern="-60" kpx2="1299"/><pair kern="-49" kpx2="1298"/><pair kern="-69" kpx2="1297"/><pair kern="-20" kpx2="1028"/><pair kern="-40" kpx2="8211"/><pair kern="-49" kpx2="1291"/><pair kern="-49" kpx2="1288"/><pair kern="-49" kpx2="1051"/><pair kern="-60" kpx2="1289"/><pair kern="-40" kpx2="1295"/><pair kern="-20" kpx2="1292"/><pair kern="-40" kpx2="8213"/><pair kern="-69" kpx2="1293"/><pair kern="-20" kpx2="1054"/><pair kern="-40" kpx2="8212"/><pair kern="-69" kpx2="1282"/><pair kern="-69" kpx2="1283"/><pair kern="-69" kpx2="1040"/><pair kern="-60" kpx2="8218"/><pair kern="-69" kpx2="1280"/><pair kern="-69" kpx2="1281"/><pair kern="-49" kpx2="1287"/><pair kern="-49" kpx2="1044"/><pair kern="-60" kpx2="8222"/><pair kern="-49" kpx2="1285"/><pair kern="20" kpx2="1058"/><pair kern="-20" kpx2="1057"/><pair kern="-40" kpx2="1060"/><pair kern="-60" kpx2="1083"/><pair kern="-49" kpx2="1082"/><pair kern="-49" kpx2="1081"/><pair kern="-49" kpx2="1080"/><pair kern="-49" kpx2="1087"/><pair kern="-69" kpx2="1086"/><pair kern="-49" kpx2="1085"/><pair kern="-49" kpx2="1084"/><pair kern="-49" kpx2="1075"/><pair kern="-49" kpx2="1074"/><pair kern="-20" kpx2="1079"/><pair kern="-20" kpx2="1078"/><pair kern="-69" kpx2="1077"/><pair kern="-60" kpx2="1076"/><pair kern="-49" kpx2="1221"/><pair kern="-49" kpx2="1220"/><pair kern="-60" kpx2="1222"/><pair kern="-20" kpx2="1218"/><pair kern="-49" kpx2="1228"/><pair kern="-49" kpx2="1230"/><pair kern="-49" kpx2="1224"/><pair kern="-49" kpx2="1226"/><pair kern="-69" kpx2="1236"/><pair kern="-69" kpx2="1239"/><pair kern="-69" kpx2="1232"/><pair kern="-69" kpx2="1234"/><pair kern="-20" kpx2="1245"/><pair kern="-20" kpx2="1247"/><pair kern="-69" kpx2="1255"/><pair kern="-20" kpx2="1254"/><pair kern="-49" kpx2="1253"/><pair kern="-49" kpx2="1251"/><pair kern="-29" kpx2="1249"/><pair kern="-40" kpx2="1263"/><pair kern="-20" kpx2="1261"/><pair kern="-69" kpx2="1259"/><pair kern="-20" kpx2="1258"/><pair kern="-69" kpx2="1257"/><pair kern="-20" kpx2="1256"/><pair kern="-49" kpx2="1271"/><pair kern="-49" kpx2="1269"/><pair kern="-40" kpx2="1267"/><pair kern="-40" kpx2="1265"/><pair kern="-20" kpx2="1279"/><pair kern="-20" kpx2="1277"/><pair kern="-49" kpx2="1273"/><pair kern="-69" kpx2="1153"/><pair kern="-20" kpx2="1152"/><pair kern="-49" kpx2="1163"/><pair kern="-49" kpx2="1167"/><pair kern="-49" kpx2="1169"/><pair kern="-49" kpx2="1173"/><pair kern="-20" kpx2="1175"/><pair kern="-20" kpx2="1177"/><pair kern="-49" kpx2="1179"/><pair kern="-49" kpx2="1181"/><pair kern="-49" kpx2="1187"/><pair kern="-40" kpx2="1185"/><pair kern="-49" kpx2="1191"/><pair kern="-49" kpx2="1189"/><pair kern="-69" kpx2="1195"/><pair kern="-20" kpx2="1194"/><pair kern="-69" kpx2="1193"/><pair kern="-20" kpx2="1192"/><pair kern="-40" kpx2="1199"/><pair kern="-40" kpx2="1197"/><pair kern="20" kpx2="1196"/><pair kern="-20" kpx2="1203"/><pair kern="-40" kpx2="1201"/><pair kern="-49" kpx2="1207"/><pair kern="-40" kpx2="1205"/><pair kern="-49" kpx2="1211"/><pair kern="-49" kpx2="1209"/><pair kern="-49" kpx2="1214"/><pair kern="-69" kpx2="1215"/><pair kern="-49" kpx2="1212"/><pair kern="-69" kpx2="1213"/></kerning><kerning kpx1="1271"><pair kern="-9" kpx2="1153"/><pair kern="-29" kpx2="1222"/><pair kern="-29" kpx2="1299"/><pair kern="-9" kpx2="1092"/><pair kern="-9" kpx2="1297"/><pair kern="-9" kpx2="1089"/><pair kern="-20" kpx2="8211"/><pair kern="-29" kpx2="1289"/><pair kern="-9" kpx2="1239"/><pair kern="-29" kpx2="1113"/><pair kern="-20" kpx2="8213"/><pair kern="-9" kpx2="1293"/><pair kern="-20" kpx2="8212"/><pair kern="-9" kpx2="1283"/><pair kern="-9" kpx2="1108"/><pair kern="-49" kpx2="8218"/><pair kern="-9" kpx2="1281"/><pair kern="-9" kpx2="1105"/><pair kern="-49" kpx2="8222"/><pair kern="-9" kpx2="1104"/><pair kern="-9" kpx2="1255"/><pair kern="-9" kpx2="1195"/><pair kern="-29" kpx2="1127"/><pair kern="-9" kpx2="1193"/><pair kern="-9" kpx2="1259"/><pair kern="-49" kpx2="46"/><pair kern="-9" kpx2="1257"/><pair kern="-49" kpx2="44"/><pair kern="-20" kpx2="45"/><pair kern="-29" kpx2="1083"/><pair kern="-9" kpx2="1149"/><pair kern="-9" kpx2="1147"/><pair kern="-9" kpx2="1086"/><pair kern="-9" kpx2="1145"/><pair kern="-9" kpx2="1139"/><pair kern="-9" kpx2="1077"/><pair kern="-29" kpx2="1076"/></kerning><kerning kpx1="1266"><pair kern="-49" kpx2="1221"/><pair kern="-40" kpx2="1222"/><pair kern="-20" kpx2="1092"/><pair kern="-20" kpx2="1228"/><pair kern="-20" kpx2="1095"/><pair kern="-20" kpx2="1089"/><pair kern="-69" kpx2="1236"/><pair kern="-20" kpx2="1239"/><pair kern="-69" kpx2="1232"/><pair kern="-40" kpx2="1113"/><pair kern="-69" kpx2="1234"/><pair kern="49" kpx2="1115"/><pair kern="-9" kpx2="1109"/><pair kern="-20" kpx2="1108"/><pair kern="-20" kpx2="1105"/><pair kern="-20" kpx2="1104"/><pair kern="49" kpx2="1106"/><pair kern="-20" kpx2="1255"/><pair kern="-9" kpx2="1254"/><pair kern="-69" kpx2="1126"/><pair kern="-40" kpx2="1127"/><pair kern="-20" kpx2="1259"/><pair kern="-60" kpx2="46"/><pair kern="-9" kpx2="1258"/><pair kern="-20" kpx2="1257"/><pair kern="-60" kpx2="44"/><pair kern="-9" kpx2="1120"/><pair kern="-9" kpx2="1256"/><pair kern="-9" kpx2="1150"/><pair kern="-20" kpx2="1149"/><pair kern="-20" kpx2="1269"/><pair kern="-9" kpx2="1148"/><pair kern="-20" kpx2="1147"/><pair kern="-9" kpx2="1146"/><pair kern="-20" kpx2="1145"/><pair kern="-9" kpx2="1144"/><pair kern="-20" kpx2="1139"/><pair kern="-9" kpx2="1138"/><pair kern="-20" kpx2="1153"/><pair kern="-49" kpx2="1033"/><pair kern="-9" kpx2="1152"/><pair kern="-40" kpx2="1299"/><pair kern="-49" kpx2="1298"/><pair kern="-20" kpx2="1297"/><pair kern="-9" kpx2="1028"/><pair kern="49" kpx2="1165"/><pair kern="-49" kpx2="1288"/><pair kern="-49" kpx2="1051"/><pair kern="-40" kpx2="1289"/><pair kern="-9" kpx2="1292"/><pair kern="-20" kpx2="1293"/><pair kern="-9" kpx2="1054"/><pair kern="-69" kpx2="1282"/><pair kern="-20" kpx2="1283"/><pair kern="-69" kpx2="1040"/><pair kern="-60" kpx2="8218"/><pair kern="-69" kpx2="1280"/><pair kern="-20" kpx2="1281"/><pair kern="-49" kpx2="1044"/><pair kern="-60" kpx2="8222"/><pair kern="49" kpx2="1183"/><pair kern="-9" kpx2="1071"/><pair kern="-20" kpx2="1195"/><pair kern="-9" kpx2="1194"/><pair kern="-20" kpx2="1193"/><pair kern="-9" kpx2="1057"/><pair kern="-9" kpx2="1192"/><pair kern="-29" kpx2="1060"/><pair kern="-40" kpx2="1083"/><pair kern="-20" kpx2="1086"/><pair kern="-20" kpx2="1207"/><pair kern="-20" kpx2="1209"/><pair kern="-20" kpx2="1214"/><pair kern="-29" kpx2="1215"/><pair kern="-20" kpx2="1212"/><pair kern="-20" kpx2="1077"/><pair kern="-29" kpx2="1213"/><pair kern="-40" kpx2="1076"/></kerning><kerning kpx1="1267"><pair kern="-20" kpx2="1083"/><pair kern="-20" kpx2="1289"/><pair kern="-20" kpx2="1222"/><pair kern="-20" kpx2="1113"/><pair kern="-20" kpx2="1299"/><pair kern="-20" kpx2="1127"/><pair kern="-40" kpx2="8218"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="8222"/><pair kern="-40" kpx2="44"/><pair kern="-20" kpx2="1076"/></kerning><kerning kpx1="1264"><pair kern="-49" kpx2="1221"/><pair kern="-40" kpx2="1222"/><pair kern="-20" kpx2="1092"/><pair kern="-20" kpx2="1228"/><pair kern="-20" kpx2="1095"/><pair kern="-20" kpx2="1089"/><pair kern="-69" kpx2="1236"/><pair kern="-20" kpx2="1239"/><pair kern="-69" kpx2="1232"/><pair kern="-40" kpx2="1113"/><pair kern="-69" kpx2="1234"/><pair kern="49" kpx2="1115"/><pair kern="-9" kpx2="1109"/><pair kern="-20" kpx2="1108"/><pair kern="-20" kpx2="1105"/><pair kern="-20" kpx2="1104"/><pair kern="49" kpx2="1106"/><pair kern="-20" kpx2="1255"/><pair kern="-9" kpx2="1254"/><pair kern="-69" kpx2="1126"/><pair kern="-40" kpx2="1127"/><pair kern="-20" kpx2="1259"/><pair kern="-60" kpx2="46"/><pair kern="-9" kpx2="1258"/><pair kern="-20" kpx2="1257"/><pair kern="-60" kpx2="44"/><pair kern="-9" kpx2="1120"/><pair kern="-9" kpx2="1256"/><pair kern="-9" kpx2="1150"/><pair kern="-20" kpx2="1149"/><pair kern="-20" kpx2="1269"/><pair kern="-9" kpx2="1148"/><pair kern="-20" kpx2="1147"/><pair kern="-9" kpx2="1146"/><pair kern="-20" kpx2="1145"/><pair kern="-9" kpx2="1144"/><pair kern="-20" kpx2="1139"/><pair kern="-9" kpx2="1138"/><pair kern="-20" kpx2="1153"/><pair kern="-49" kpx2="1033"/><pair kern="-9" kpx2="1152"/><pair kern="-40" kpx2="1299"/><pair kern="-49" kpx2="1298"/><pair kern="-20" kpx2="1297"/><pair kern="-9" kpx2="1028"/><pair kern="49" kpx2="1165"/><pair kern="-49" kpx2="1288"/><pair kern="-49" kpx2="1051"/><pair kern="-40" kpx2="1289"/><pair kern="-9" kpx2="1292"/><pair kern="-20" kpx2="1293"/><pair kern="-9" kpx2="1054"/><pair kern="-69" kpx2="1282"/><pair kern="-20" kpx2="1283"/><pair kern="-69" kpx2="1040"/><pair kern="-60" kpx2="8218"/><pair kern="-69" kpx2="1280"/><pair kern="-20" kpx2="1281"/><pair kern="-49" kpx2="1044"/><pair kern="-60" kpx2="8222"/><pair kern="49" kpx2="1183"/><pair kern="-9" kpx2="1071"/><pair kern="-20" kpx2="1195"/><pair kern="-9" kpx2="1194"/><pair kern="-20" kpx2="1193"/><pair kern="-9" kpx2="1057"/><pair kern="-9" kpx2="1192"/><pair kern="-29" kpx2="1060"/><pair kern="-40" kpx2="1083"/><pair kern="-20" kpx2="1086"/><pair kern="-20" kpx2="1207"/><pair kern="-20" kpx2="1209"/><pair kern="-20" kpx2="1214"/><pair kern="-29" kpx2="1215"/><pair kern="-20" kpx2="1212"/><pair kern="-20" kpx2="1077"/><pair kern="-29" kpx2="1213"/><pair kern="-40" kpx2="1076"/></kerning><kerning kpx1="1265"><pair kern="-20" kpx2="1083"/><pair kern="-20" kpx2="1289"/><pair kern="-20" kpx2="1222"/><pair kern="-20" kpx2="1113"/><pair kern="-20" kpx2="1299"/><pair kern="-20" kpx2="1127"/><pair kern="-40" kpx2="8218"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="8222"/><pair kern="-40" kpx2="44"/><pair kern="-20" kpx2="1076"/></kerning><kerning kpx1="1278"><pair kern="-20" kpx2="1152"/><pair kern="-20" kpx2="1228"/><pair kern="-9" kpx2="1296"/><pair kern="-20" kpx2="1095"/><pair kern="-20" kpx2="1028"/><pair kern="-20" kpx2="1227"/><pair kern="-20" kpx2="1292"/><pair kern="-20" kpx2="1054"/><pair kern="-20" kpx2="1282"/><pair kern="-20" kpx2="1280"/><pair kern="-20" kpx2="1287"/><pair kern="-20" kpx2="1285"/><pair kern="-20" kpx2="1254"/><pair kern="-20" kpx2="1194"/><pair kern="-20" kpx2="1057"/><pair kern="-20" kpx2="1192"/><pair kern="-20" kpx2="1258"/><pair kern="-20" kpx2="1063"/><pair kern="-20" kpx2="1120"/><pair kern="-20" kpx2="1060"/><pair kern="-20" kpx2="1256"/><pair kern="-20" kpx2="1150"/><pair kern="-20" kpx2="1268"/><pair kern="-20" kpx2="1269"/><pair kern="-20" kpx2="1148"/><pair kern="-20" kpx2="1206"/><pair kern="-20" kpx2="1146"/><pair kern="-20" kpx2="1207"/><pair kern="-20" kpx2="1144"/><pair kern="-20" kpx2="1208"/><pair kern="-20" kpx2="1209"/><pair kern="-49" kpx2="1214"/><pair kern="-20" kpx2="1138"/><pair kern="-49" kpx2="1212"/><pair kern="-20" kpx2="1136"/></kerning><kerning kpx1="1279"><pair kern="-9" kpx2="1153"/><pair kern="-9" kpx2="1092"/><pair kern="-9" kpx2="1228"/><pair kern="-9" kpx2="1297"/><pair kern="-9" kpx2="1095"/><pair kern="-9" kpx2="1089"/><pair kern="-9" kpx2="1239"/><pair kern="-9" kpx2="1293"/><pair kern="-9" kpx2="1283"/><pair kern="-9" kpx2="1108"/><pair kern="-9" kpx2="1281"/><pair kern="-9" kpx2="1105"/><pair kern="-20" kpx2="1287"/><pair kern="-9" kpx2="1104"/><pair kern="-20" kpx2="1285"/><pair kern="-9" kpx2="1255"/><pair kern="-9" kpx2="1195"/><pair kern="-9" kpx2="1193"/><pair kern="-9" kpx2="1259"/><pair kern="-9" kpx2="1257"/><pair kern="-9" kpx2="1149"/><pair kern="-9" kpx2="1269"/><pair kern="-9" kpx2="1147"/><pair kern="-9" kpx2="1086"/><pair kern="-9" kpx2="1207"/><pair kern="-9" kpx2="1145"/><pair kern="-9" kpx2="1209"/><pair kern="-9" kpx2="1139"/><pair kern="-9" kpx2="1077"/></kerning><kerning kpx1="1276"><pair kern="109" kpx2="1032"/><pair kern="-20" kpx2="1152"/><pair kern="-20" kpx2="1098"/><pair kern="-40" kpx2="1228"/><pair kern="-40" kpx2="1095"/><pair kern="-20" kpx2="1028"/><pair kern="-20" kpx2="1090"/><pair kern="-20" kpx2="1295"/><pair kern="-20" kpx2="1292"/><pair kern="-20" kpx2="1054"/><pair kern="-20" kpx2="1287"/><pair kern="-20" kpx2="1285"/><pair kern="-20" kpx2="1254"/><pair kern="29" kpx2="1135"/><pair kern="-20" kpx2="1185"/><pair kern="-20" kpx2="1194"/><pair kern="-20" kpx2="1057"/><pair kern="-20" kpx2="1192"/><pair kern="-20" kpx2="1258"/><pair kern="-20" kpx2="1120"/><pair kern="-29" kpx2="1060"/><pair kern="-20" kpx2="1197"/><pair kern="-20" kpx2="1256"/><pair kern="-20" kpx2="1150"/><pair kern="-40" kpx2="1269"/><pair kern="-20" kpx2="1148"/><pair kern="-20" kpx2="1146"/><pair kern="-40" kpx2="1207"/><pair kern="-20" kpx2="1144"/><pair kern="-20" kpx2="1205"/><pair kern="-40" kpx2="1209"/><pair kern="-29" kpx2="1214"/><pair kern="-20" kpx2="1215"/><pair kern="-20" kpx2="1138"/><pair kern="-29" kpx2="1212"/><pair kern="-9" kpx2="1137"/><pair kern="-20" kpx2="1213"/></kerning><kerning kpx1="1277"><pair kern="-9" kpx2="1153"/><pair kern="-9" kpx2="1092"/><pair kern="-9" kpx2="1228"/><pair kern="-9" kpx2="1297"/><pair kern="-9" kpx2="1095"/><pair kern="-9" kpx2="1089"/><pair kern="-9" kpx2="1239"/><pair kern="-9" kpx2="1293"/><pair kern="-9" kpx2="1283"/><pair kern="-9" kpx2="1108"/><pair kern="-9" kpx2="1281"/><pair kern="-9" kpx2="1105"/><pair kern="-20" kpx2="1287"/><pair kern="-9" kpx2="1104"/><pair kern="-20" kpx2="1285"/><pair kern="-9" kpx2="1255"/><pair kern="-9" kpx2="1195"/><pair kern="-9" kpx2="1193"/><pair kern="-9" kpx2="1259"/><pair kern="-9" kpx2="1257"/><pair kern="-9" kpx2="1149"/><pair kern="-9" kpx2="1269"/><pair kern="-9" kpx2="1147"/><pair kern="-9" kpx2="1086"/><pair kern="-9" kpx2="1207"/><pair kern="-9" kpx2="1145"/><pair kern="-9" kpx2="1209"/><pair kern="-9" kpx2="1139"/><pair kern="-9" kpx2="1077"/></kerning><kerning kpx1="1274"><pair kern="-29" kpx2="1100"/><pair kern="-20" kpx2="1101"/><pair kern="-29" kpx2="1102"/><pair kern="-29" kpx2="1096"/><pair kern="-29" kpx2="1097"/><pair kern="-29" kpx2="1099"/><pair kern="-40" kpx2="1092"/><pair kern="-20" kpx2="1093"/><pair kern="-29" kpx2="1094"/><pair kern="-49" kpx2="1095"/><pair kern="-29" kpx2="1088"/><pair kern="-40" kpx2="1089"/><pair kern="-29" kpx2="1117"/><pair kern="-29" kpx2="1116"/><pair kern="-29" kpx2="1119"/><pair kern="-49" kpx2="1113"/><pair kern="20" kpx2="1115"/><pair kern="-29" kpx2="1114"/><pair kern="-29" kpx2="1109"/><pair kern="-40" kpx2="1108"/><pair kern="-40" kpx2="1105"/><pair kern="-40" kpx2="1104"/><pair kern="-29" kpx2="1107"/><pair kern="20" kpx2="1106"/><pair kern="-29" kpx2="1133"/><pair kern="-20" kpx2="1131"/><pair kern="-29" kpx2="1129"/><pair kern="-60" kpx2="1126"/><pair kern="-49" kpx2="1127"/><pair kern="-29" kpx2="1125"/><pair kern="-49" kpx2="46"/><pair kern="-49" kpx2="44"/><pair kern="-20" kpx2="1120"/><pair kern="-20" kpx2="45"/><pair kern="-20" kpx2="1150"/><pair kern="-40" kpx2="1149"/><pair kern="-20" kpx2="1148"/><pair kern="-40" kpx2="1147"/><pair kern="-20" kpx2="1146"/><pair kern="-40" kpx2="1145"/><pair kern="-20" kpx2="1144"/><pair kern="-40" kpx2="1139"/><pair kern="-20" kpx2="1138"/><pair kern="-29" kpx2="1137"/><pair kern="-40" kpx2="1033"/><pair kern="20" kpx2="1035"/><pair kern="-49" kpx2="1299"/><pair kern="-40" kpx2="1298"/><pair kern="-40" kpx2="1297"/><pair kern="20" kpx2="1026"/><pair kern="-20" kpx2="1028"/><pair kern="-20" kpx2="8211"/><pair kern="-29" kpx2="1291"/><pair kern="-40" kpx2="1288"/><pair kern="-40" kpx2="1051"/><pair kern="-49" kpx2="1289"/><pair kern="20" kpx2="1294"/><pair kern="-20" kpx2="1292"/><pair kern="-20" kpx2="8213"/><pair kern="-40" kpx2="1293"/><pair kern="-20" kpx2="1054"/><pair kern="-20" kpx2="8212"/><pair kern="-49" kpx2="1282"/><pair kern="-40" kpx2="1283"/><pair kern="-60" kpx2="1040"/><pair kern="-49" kpx2="8218"/><pair kern="-49" kpx2="1280"/><pair kern="-40" kpx2="1281"/><pair kern="-20" kpx2="1287"/><pair kern="-40" kpx2="1044"/><pair kern="-49" kpx2="8222"/><pair kern="-20" kpx2="1285"/><pair kern="20" kpx2="1066"/><pair kern="20" kpx2="1058"/><pair kern="-20" kpx2="1057"/><pair kern="-29" kpx2="1060"/><pair kern="-49" kpx2="1083"/><pair kern="-29" kpx2="1082"/><pair kern="-29" kpx2="1081"/><pair kern="-29" kpx2="1080"/><pair kern="-29" kpx2="1087"/><pair kern="-40" kpx2="1086"/><pair kern="-29" kpx2="1085"/><pair kern="-29" kpx2="1084"/><pair kern="-29" kpx2="1075"/><pair kern="-29" kpx2="1074"/><pair kern="-20" kpx2="1079"/><pair kern="-20" kpx2="1078"/><pair kern="-40" kpx2="1077"/><pair kern="-49" kpx2="1076"/><pair kern="-40" kpx2="1221"/><pair kern="-29" kpx2="1220"/><pair kern="-49" kpx2="1222"/><pair kern="-20" kpx2="1218"/><pair kern="-49" kpx2="1228"/><pair kern="-29" kpx2="1230"/><pair kern="-29" kpx2="1224"/><pair kern="-29" kpx2="1226"/><pair kern="-60" kpx2="1236"/><pair kern="-40" kpx2="1239"/><pair kern="-60" kpx2="1232"/><pair kern="-60" kpx2="1234"/><pair kern="-20" kpx2="1245"/><pair kern="-20" kpx2="1247"/><pair kern="-40" kpx2="1255"/><pair kern="-20" kpx2="1254"/><pair kern="-29" kpx2="1253"/><pair kern="-29" kpx2="1251"/><pair kern="-20" kpx2="1261"/><pair kern="-40" kpx2="1259"/><pair kern="-20" kpx2="1258"/><pair kern="-40" kpx2="1257"/><pair kern="-20" kpx2="1256"/><pair kern="-29" kpx2="1271"/><pair kern="-49" kpx2="1269"/><pair kern="-20" kpx2="1279"/><pair kern="-20" kpx2="1277"/><pair kern="-29" kpx2="1273"/><pair kern="-40" kpx2="1153"/><pair kern="-20" kpx2="1152"/><pair kern="-29" kpx2="1163"/><pair kern="20" kpx2="1165"/><pair kern="-29" kpx2="1167"/><pair kern="-29" kpx2="1169"/><pair kern="-29" kpx2="1173"/><pair kern="-20" kpx2="1175"/><pair kern="-20" kpx2="1177"/><pair kern="-29" kpx2="1179"/><pair kern="-29" kpx2="1181"/><pair kern="20" kpx2="1183"/><pair kern="-29" kpx2="1187"/><pair kern="20" kpx2="1184"/><pair kern="-29" kpx2="1191"/><pair kern="-29" kpx2="1189"/><pair kern="-40" kpx2="1195"/><pair kern="-20" kpx2="1194"/><pair kern="-40" kpx2="1193"/><pair kern="-20" kpx2="1192"/><pair kern="20" kpx2="1196"/><pair kern="-20" kpx2="1203"/><pair kern="-49" kpx2="1207"/><pair kern="20" kpx2="1204"/><pair kern="-29" kpx2="1211"/><pair kern="-49" kpx2="1209"/><pair kern="-20" kpx2="1214"/><pair kern="-29" kpx2="1215"/><pair kern="-20" kpx2="1212"/><pair kern="-29" kpx2="1213"/></kerning><kerning kpx1="1275"><pair kern="-20" kpx2="1153"/><pair kern="-29" kpx2="1222"/><pair kern="-29" kpx2="1299"/><pair kern="-20" kpx2="1092"/><pair kern="-20" kpx2="1297"/><pair kern="-20" kpx2="1089"/><pair kern="-29" kpx2="1289"/><pair kern="-20" kpx2="1239"/><pair kern="-29" kpx2="1113"/><pair kern="-20" kpx2="1293"/><pair kern="-20" kpx2="1283"/><pair kern="-29" kpx2="8218"/><pair kern="-20" kpx2="1108"/><pair kern="-20" kpx2="1281"/><pair kern="-20" kpx2="1105"/><pair kern="-29" kpx2="8222"/><pair kern="-20" kpx2="1104"/><pair kern="-20" kpx2="1255"/><pair kern="-20" kpx2="1195"/><pair kern="-29" kpx2="1127"/><pair kern="-20" kpx2="1193"/><pair kern="-20" kpx2="1259"/><pair kern="-29" kpx2="46"/><pair kern="-20" kpx2="1257"/><pair kern="-29" kpx2="44"/><pair kern="-29" kpx2="1083"/><pair kern="-20" kpx2="1149"/><pair kern="-20" kpx2="1147"/><pair kern="-20" kpx2="1086"/><pair kern="-20" kpx2="1145"/><pair kern="-20" kpx2="1139"/><pair kern="-20" kpx2="1077"/><pair kern="-29" kpx2="1076"/></kerning><kerning kpx1="1152"><pair kern="-20" kpx2="1152"/><pair kern="-20" kpx2="1228"/><pair kern="-20" kpx2="1095"/><pair kern="-20" kpx2="1028"/><pair kern="-20" kpx2="1292"/><pair kern="-20" kpx2="1054"/><pair kern="-20" kpx2="1282"/><pair kern="-20" kpx2="1280"/><pair kern="-20" kpx2="1287"/><pair kern="-20" kpx2="1285"/><pair kern="-20" kpx2="1254"/><pair kern="-20" kpx2="1194"/><pair kern="-20" kpx2="1057"/><pair kern="-20" kpx2="1192"/><pair kern="-20" kpx2="1258"/><pair kern="-20" kpx2="1120"/><pair kern="-20" kpx2="1060"/><pair kern="-20" kpx2="1256"/><pair kern="-20" kpx2="1150"/><pair kern="-20" kpx2="1148"/><pair kern="-20" kpx2="1269"/><pair kern="-20" kpx2="1146"/><pair kern="-20" kpx2="1207"/><pair kern="-20" kpx2="1144"/><pair kern="-20" kpx2="1209"/><pair kern="-20" kpx2="1214"/><pair kern="-20" kpx2="1138"/><pair kern="-20" kpx2="1212"/></kerning><kerning kpx1="201"><pair kern="60" kpx2="74"/></kerning><kerning kpx1="200"><pair kern="60" kpx2="74"/></kerning><kerning kpx1="203"><pair kern="60" kpx2="74"/></kerning><kerning kpx1="202"><pair kern="60" kpx2="74"/></kerning><kerning kpx1="197"><pair kern="-20" kpx2="7888"/><pair kern="-20" kpx2="7890"/><pair kern="-20" kpx2="7892"/><pair kern="-20" kpx2="7894"/><pair kern="-20" kpx2="7896"/><pair kern="-20" kpx2="7898"/><pair kern="-20" kpx2="7900"/><pair kern="-20" kpx2="286"/><pair kern="-20" kpx2="7902"/><pair kern="-20" kpx2="284"/><pair kern="-20" kpx2="262"/><pair kern="-20" kpx2="266"/><pair kern="-20" kpx2="264"/><pair kern="-20" kpx2="7884"/><pair kern="-20" kpx2="268"/><pair kern="-20" kpx2="7886"/><pair kern="-69" kpx2="34"/><pair kern="-60" kpx2="7922"/><pair kern="-60" kpx2="7926"/><pair kern="-69" kpx2="39"/><pair kern="-60" kpx2="7924"/><pair kern="-60" kpx2="7928"/><pair kern="-20" kpx2="7906"/><pair kern="-20" kpx2="288"/><pair kern="-20" kpx2="7904"/><pair kern="-20" kpx2="290"/><pair kern="-20" kpx2="416"/><pair kern="-69" kpx2="538"/><pair kern="-20" kpx2="71"/><pair kern="-20" kpx2="338"/><pair kern="-20" kpx2="67"/><pair kern="-20" kpx2="336"/><pair kern="-20" kpx2="199"/><pair kern="-20" kpx2="79"/><pair kern="129" kpx2="74"/><pair kern="-40" kpx2="7812"/><pair kern="-60" kpx2="221"/><pair kern="-69" kpx2="84"/><pair kern="-40" kpx2="87"/><pair kern="-40" kpx2="86"/><pair kern="-20" kpx2="216"/><pair kern="-20" kpx2="81"/><pair kern="-40" kpx2="7808"/><pair kern="-40" kpx2="7810"/><pair kern="-20" kpx2="212"/><pair kern="-20" kpx2="334"/><pair kern="-20" kpx2="213"/><pair kern="-20" kpx2="214"/><pair kern="-20" kpx2="332"/><pair kern="-69" kpx2="8217"/><pair kern="-60" kpx2="89"/><pair kern="-20" kpx2="210"/><pair kern="-69" kpx2="8221"/><pair kern="-20" kpx2="211"/><pair kern="-40" kpx2="372"/><pair kern="-20" kpx2="510"/><pair kern="-60" kpx2="374"/><pair kern="-60" kpx2="376"/><pair kern="-69" kpx2="356"/><pair kern="-69" kpx2="354"/></kerning><kerning kpx1="196"><pair kern="-20" kpx2="7888"/><pair kern="-20" kpx2="7890"/><pair kern="-20" kpx2="7892"/><pair kern="-20" kpx2="7894"/><pair kern="-20" kpx2="7896"/><pair kern="-20" kpx2="7898"/><pair kern="-20" kpx2="7900"/><pair kern="-20" kpx2="286"/><pair kern="-20" kpx2="7902"/><pair kern="-20" kpx2="284"/><pair kern="-20" kpx2="262"/><pair kern="-20" kpx2="266"/><pair kern="-20" kpx2="264"/><pair kern="-20" kpx2="7884"/><pair kern="-20" kpx2="268"/><pair kern="-20" kpx2="7886"/><pair kern="-69" kpx2="34"/><pair kern="-60" kpx2="7922"/><pair kern="-60" kpx2="7926"/><pair kern="-69" kpx2="39"/><pair kern="-60" kpx2="7924"/><pair kern="-60" kpx2="7928"/><pair kern="-20" kpx2="7906"/><pair kern="-20" kpx2="288"/><pair kern="-20" kpx2="7904"/><pair kern="-20" kpx2="290"/><pair kern="-20" kpx2="416"/><pair kern="-69" kpx2="538"/><pair kern="-20" kpx2="71"/><pair kern="-20" kpx2="338"/><pair kern="-20" kpx2="67"/><pair kern="-20" kpx2="336"/><pair kern="-20" kpx2="199"/><pair kern="-20" kpx2="79"/><pair kern="129" kpx2="74"/><pair kern="-40" kpx2="7812"/><pair kern="-60" kpx2="221"/><pair kern="-69" kpx2="84"/><pair kern="-40" kpx2="87"/><pair kern="-40" kpx2="86"/><pair kern="-20" kpx2="216"/><pair kern="-20" kpx2="81"/><pair kern="-40" kpx2="7808"/><pair kern="-40" kpx2="7810"/><pair kern="-20" kpx2="212"/><pair kern="-20" kpx2="334"/><pair kern="-20" kpx2="213"/><pair kern="-20" kpx2="214"/><pair kern="-20" kpx2="332"/><pair kern="-69" kpx2="8217"/><pair kern="-60" kpx2="89"/><pair kern="-20" kpx2="210"/><pair kern="-69" kpx2="8221"/><pair kern="-20" kpx2="211"/><pair kern="-40" kpx2="372"/><pair kern="-20" kpx2="510"/><pair kern="-60" kpx2="374"/><pair kern="-60" kpx2="376"/><pair kern="-69" kpx2="356"/><pair kern="-69" kpx2="354"/></kerning><kerning kpx1="199"><pair kern="-20" kpx2="7888"/><pair kern="-20" kpx2="7890"/><pair kern="-20" kpx2="71"/><pair kern="-20" kpx2="7892"/><pair kern="-20" kpx2="338"/><pair kern="-20" kpx2="7894"/><pair kern="-20" kpx2="67"/><pair kern="-20" kpx2="336"/><pair kern="-20" kpx2="7896"/><pair kern="-20" kpx2="199"/><pair kern="-20" kpx2="7898"/><pair kern="-20" kpx2="79"/><pair kern="-20" kpx2="7900"/><pair kern="-20" kpx2="286"/><pair kern="-20" kpx2="7902"/><pair kern="-20" kpx2="284"/><pair kern="-20" kpx2="262"/><pair kern="-20" kpx2="216"/><pair kern="-20" kpx2="81"/><pair kern="-20" kpx2="212"/><pair kern="-20" kpx2="266"/><pair kern="-20" kpx2="334"/><pair kern="-20" kpx2="213"/><pair kern="-20" kpx2="214"/><pair kern="-20" kpx2="264"/><pair kern="-20" kpx2="332"/><pair kern="-20" kpx2="7884"/><pair kern="-20" kpx2="7886"/><pair kern="-20" kpx2="210"/><pair kern="-20" kpx2="268"/><pair kern="-20" kpx2="211"/><pair kern="-20" kpx2="510"/><pair kern="-20" kpx2="7906"/><pair kern="-20" kpx2="288"/><pair kern="-20" kpx2="7904"/><pair kern="-20" kpx2="290"/><pair kern="-20" kpx2="416"/></kerning><kerning kpx1="1163"><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="8221"/></kerning><kerning kpx1="198"><pair kern="60" kpx2="74"/></kerning><kerning kpx1="1162"><pair kern="109" kpx2="1032"/><pair kern="20" kpx2="1249"/><pair kern="-20" kpx2="1287"/><pair kern="-20" kpx2="1285"/></kerning><kerning kpx1="193"><pair kern="-20" kpx2="7888"/><pair kern="-20" kpx2="7890"/><pair kern="-20" kpx2="7892"/><pair kern="-20" kpx2="7894"/><pair kern="-20" kpx2="7896"/><pair kern="-20" kpx2="7898"/><pair kern="-20" kpx2="7900"/><pair kern="-20" kpx2="286"/><pair kern="-20" kpx2="7902"/><pair kern="-20" kpx2="284"/><pair kern="-20" kpx2="262"/><pair kern="-20" kpx2="266"/><pair kern="-20" kpx2="264"/><pair kern="-20" kpx2="7884"/><pair kern="-20" kpx2="268"/><pair kern="-20" kpx2="7886"/><pair kern="-69" kpx2="34"/><pair kern="-60" kpx2="7922"/><pair kern="-60" kpx2="7926"/><pair kern="-69" kpx2="39"/><pair kern="-60" kpx2="7924"/><pair kern="-60" kpx2="7928"/><pair kern="-20" kpx2="7906"/><pair kern="-20" kpx2="288"/><pair kern="-20" kpx2="7904"/><pair kern="-20" kpx2="290"/><pair kern="-20" kpx2="416"/><pair kern="-69" kpx2="538"/><pair kern="-20" kpx2="71"/><pair kern="-20" kpx2="338"/><pair kern="-20" kpx2="67"/><pair kern="-20" kpx2="336"/><pair kern="-20" kpx2="199"/><pair kern="-20" kpx2="79"/><pair kern="129" kpx2="74"/><pair kern="-40" kpx2="7812"/><pair kern="-60" kpx2="221"/><pair kern="-69" kpx2="84"/><pair kern="-40" kpx2="87"/><pair kern="-40" kpx2="86"/><pair kern="-20" kpx2="216"/><pair kern="-20" kpx2="81"/><pair kern="-40" kpx2="7808"/><pair kern="-40" kpx2="7810"/><pair kern="-20" kpx2="212"/><pair kern="-20" kpx2="334"/><pair kern="-20" kpx2="213"/><pair kern="-20" kpx2="214"/><pair kern="-20" kpx2="332"/><pair kern="-69" kpx2="8217"/><pair kern="-60" kpx2="89"/><pair kern="-20" kpx2="210"/><pair kern="-69" kpx2="8221"/><pair kern="-20" kpx2="211"/><pair kern="-40" kpx2="372"/><pair kern="-20" kpx2="510"/><pair kern="-60" kpx2="374"/><pair kern="-60" kpx2="376"/><pair kern="-69" kpx2="356"/><pair kern="-69" kpx2="354"/></kerning><kerning kpx1="1165"><pair kern="-49" kpx2="1098"/><pair kern="-20" kpx2="1218"/><pair kern="-40" kpx2="1228"/><pair kern="-20" kpx2="1093"/><pair kern="-40" kpx2="1095"/><pair kern="-49" kpx2="1090"/><pair kern="-29" kpx2="1091"/><pair kern="-29" kpx2="1118"/><pair kern="-49" kpx2="1295"/><pair kern="-20" kpx2="1175"/><pair kern="-20" kpx2="1245"/><pair kern="-60" kpx2="8217"/><pair kern="-49" kpx2="1287"/><pair kern="-60" kpx2="8221"/><pair kern="-49" kpx2="1285"/><pair kern="-60" kpx2="34"/><pair kern="-49" kpx2="1185"/><pair kern="-60" kpx2="39"/><pair kern="-20" kpx2="1249"/><pair kern="-29" kpx2="1263"/><pair kern="-29" kpx2="1199"/><pair kern="-49" kpx2="1197"/><pair kern="-20" kpx2="1121"/><pair kern="-20" kpx2="1151"/><pair kern="-20" kpx2="1203"/><pair kern="-40" kpx2="1269"/><pair kern="-29" kpx2="1201"/><pair kern="-29" kpx2="1267"/><pair kern="-40" kpx2="1207"/><pair kern="-29" kpx2="1265"/><pair kern="-49" kpx2="1205"/><pair kern="-20" kpx2="1143"/><pair kern="-20" kpx2="1279"/><pair kern="-20" kpx2="1141"/><pair kern="-20" kpx2="1277"/><pair kern="-40" kpx2="1209"/><pair kern="-20" kpx2="1215"/><pair kern="-20" kpx2="1078"/><pair kern="-20" kpx2="1213"/></kerning><kerning kpx1="192"><pair kern="-20" kpx2="7888"/><pair kern="-20" kpx2="7890"/><pair kern="-20" kpx2="7892"/><pair kern="-20" kpx2="7894"/><pair kern="-20" kpx2="7896"/><pair kern="-20" kpx2="7898"/><pair kern="-20" kpx2="7900"/><pair kern="-20" kpx2="286"/><pair kern="-20" kpx2="7902"/><pair kern="-20" kpx2="284"/><pair kern="-20" kpx2="262"/><pair kern="-20" kpx2="266"/><pair kern="-20" kpx2="264"/><pair kern="-20" kpx2="7884"/><pair kern="-20" kpx2="268"/><pair kern="-20" kpx2="7886"/><pair kern="-69" kpx2="34"/><pair kern="-60" kpx2="7922"/><pair kern="-60" kpx2="7926"/><pair kern="-69" kpx2="39"/><pair kern="-60" kpx2="7924"/><pair kern="-60" kpx2="7928"/><pair kern="-20" kpx2="7906"/><pair kern="-20" kpx2="288"/><pair kern="-20" kpx2="7904"/><pair kern="-20" kpx2="290"/><pair kern="-20" kpx2="416"/><pair kern="-69" kpx2="538"/><pair kern="-20" kpx2="71"/><pair kern="-20" kpx2="338"/><pair kern="-20" kpx2="67"/><pair kern="-20" kpx2="336"/><pair kern="-20" kpx2="199"/><pair kern="-20" kpx2="79"/><pair kern="129" kpx2="74"/><pair kern="-40" kpx2="7812"/><pair kern="-60" kpx2="221"/><pair kern="-69" kpx2="84"/><pair kern="-40" kpx2="87"/><pair kern="-40" kpx2="86"/><pair kern="-20" kpx2="216"/><pair kern="-20" kpx2="81"/><pair kern="-40" kpx2="7808"/><pair kern="-40" kpx2="7810"/><pair kern="-20" kpx2="212"/><pair kern="-20" kpx2="334"/><pair kern="-20" kpx2="213"/><pair kern="-20" kpx2="214"/><pair kern="-20" kpx2="332"/><pair kern="-69" kpx2="8217"/><pair kern="-60" kpx2="89"/><pair kern="-20" kpx2="210"/><pair kern="-69" kpx2="8221"/><pair kern="-20" kpx2="211"/><pair kern="-40" kpx2="372"/><pair kern="-20" kpx2="510"/><pair kern="-60" kpx2="374"/><pair kern="-60" kpx2="376"/><pair kern="-69" kpx2="356"/><pair kern="-69" kpx2="354"/></kerning><kerning kpx1="1164"><pair kern="-20" kpx2="1035"/><pair kern="-20" kpx2="1098"/><pair kern="-20" kpx2="1026"/><pair kern="-40" kpx2="1227"/><pair kern="-20" kpx2="1090"/><pair kern="-20" kpx2="1294"/><pair kern="-20" kpx2="1295"/><pair kern="-40" kpx2="8217"/><pair kern="-49" kpx2="1286"/><pair kern="-49" kpx2="1284"/><pair kern="-40" kpx2="8221"/><pair kern="-20" kpx2="1066"/><pair kern="-40" kpx2="34"/><pair kern="-20" kpx2="1185"/><pair kern="-20" kpx2="1184"/><pair kern="-40" kpx2="39"/><pair kern="-40" kpx2="1058"/><pair kern="-40" kpx2="1063"/><pair kern="-29" kpx2="1198"/><pair kern="-20" kpx2="1197"/><pair kern="-40" kpx2="1196"/><pair kern="-40" kpx2="1268"/><pair kern="-29" kpx2="1200"/><pair kern="-40" kpx2="1206"/><pair kern="-20" kpx2="1204"/><pair kern="-20" kpx2="1205"/><pair kern="-29" kpx2="1142"/><pair kern="-40" kpx2="1208"/><pair kern="-29" kpx2="1140"/><pair kern="-40" kpx2="1136"/></kerning><kerning kpx1="195"><pair kern="-20" kpx2="7888"/><pair kern="-20" kpx2="7890"/><pair kern="-20" kpx2="7892"/><pair kern="-20" kpx2="7894"/><pair kern="-20" kpx2="7896"/><pair kern="-20" kpx2="7898"/><pair kern="-20" kpx2="7900"/><pair kern="-20" kpx2="286"/><pair kern="-20" kpx2="7902"/><pair kern="-20" kpx2="284"/><pair kern="-20" kpx2="262"/><pair kern="-20" kpx2="266"/><pair kern="-20" kpx2="264"/><pair kern="-20" kpx2="7884"/><pair kern="-20" kpx2="268"/><pair kern="-20" kpx2="7886"/><pair kern="-69" kpx2="34"/><pair kern="-60" kpx2="7922"/><pair kern="-60" kpx2="7926"/><pair kern="-69" kpx2="39"/><pair kern="-60" kpx2="7924"/><pair kern="-60" kpx2="7928"/><pair kern="-20" kpx2="7906"/><pair kern="-20" kpx2="288"/><pair kern="-20" kpx2="7904"/><pair kern="-20" kpx2="290"/><pair kern="-20" kpx2="416"/><pair kern="-69" kpx2="538"/><pair kern="-20" kpx2="71"/><pair kern="-20" kpx2="338"/><pair kern="-20" kpx2="67"/><pair kern="-20" kpx2="336"/><pair kern="-20" kpx2="199"/><pair kern="-20" kpx2="79"/><pair kern="129" kpx2="74"/><pair kern="-40" kpx2="7812"/><pair kern="-60" kpx2="221"/><pair kern="-69" kpx2="84"/><pair kern="-40" kpx2="87"/><pair kern="-40" kpx2="86"/><pair kern="-20" kpx2="216"/><pair kern="-20" kpx2="81"/><pair kern="-40" kpx2="7808"/><pair kern="-40" kpx2="7810"/><pair kern="-20" kpx2="212"/><pair kern="-20" kpx2="334"/><pair kern="-20" kpx2="213"/><pair kern="-20" kpx2="214"/><pair kern="-20" kpx2="332"/><pair kern="-69" kpx2="8217"/><pair kern="-60" kpx2="89"/><pair kern="-20" kpx2="210"/><pair kern="-69" kpx2="8221"/><pair kern="-20" kpx2="211"/><pair kern="-40" kpx2="372"/><pair kern="-20" kpx2="510"/><pair kern="-60" kpx2="374"/><pair kern="-60" kpx2="376"/><pair kern="-69" kpx2="356"/><pair kern="-69" kpx2="354"/></kerning><kerning kpx1="1167"><pair kern="-9" kpx2="1098"/><pair kern="-20" kpx2="1218"/><pair kern="-20" kpx2="1093"/><pair kern="-9" kpx2="1228"/><pair kern="-9" kpx2="1095"/><pair kern="-9" kpx2="1090"/><pair kern="-9" kpx2="1091"/><pair kern="-9" kpx2="1118"/><pair kern="-9" kpx2="1295"/><pair kern="-20" kpx2="1175"/><pair kern="-20" kpx2="1245"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="1287"/><pair kern="-9" kpx2="8221"/><pair kern="-9" kpx2="1285"/><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="1185"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="1263"/><pair kern="-9" kpx2="1197"/><pair kern="-20" kpx2="1203"/><pair kern="-9" kpx2="1269"/><pair kern="-9" kpx2="1207"/><pair kern="-9" kpx2="1267"/><pair kern="-9" kpx2="1205"/><pair kern="-9" kpx2="1265"/><pair kern="-20" kpx2="1279"/><pair kern="-20" kpx2="1277"/><pair kern="-9" kpx2="1209"/><pair kern="-20" kpx2="1078"/></kerning><kerning kpx1="194"><pair kern="-20" kpx2="7888"/><pair kern="-20" kpx2="7890"/><pair kern="-20" kpx2="7892"/><pair kern="-20" kpx2="7894"/><pair kern="-20" kpx2="7896"/><pair kern="-20" kpx2="7898"/><pair kern="-20" kpx2="7900"/><pair kern="-20" kpx2="286"/><pair kern="-20" kpx2="7902"/><pair kern="-20" kpx2="284"/><pair kern="-20" kpx2="262"/><pair kern="-20" kpx2="266"/><pair kern="-20" kpx2="264"/><pair kern="-20" kpx2="7884"/><pair kern="-20" kpx2="268"/><pair kern="-20" kpx2="7886"/><pair kern="-69" kpx2="34"/><pair kern="-60" kpx2="7922"/><pair kern="-60" kpx2="7926"/><pair kern="-69" kpx2="39"/><pair kern="-60" kpx2="7924"/><pair kern="-60" kpx2="7928"/><pair kern="-20" kpx2="7906"/><pair kern="-20" kpx2="288"/><pair kern="-20" kpx2="7904"/><pair kern="-20" kpx2="290"/><pair kern="-20" kpx2="416"/><pair kern="-69" kpx2="538"/><pair kern="-20" kpx2="71"/><pair kern="-20" kpx2="338"/><pair kern="-20" kpx2="67"/><pair kern="-20" kpx2="336"/><pair kern="-20" kpx2="199"/><pair kern="-20" kpx2="79"/><pair kern="129" kpx2="74"/><pair kern="-40" kpx2="7812"/><pair kern="-60" kpx2="221"/><pair kern="-69" kpx2="84"/><pair kern="-40" kpx2="87"/><pair kern="-40" kpx2="86"/><pair kern="-20" kpx2="216"/><pair kern="-20" kpx2="81"/><pair kern="-40" kpx2="7808"/><pair kern="-40" kpx2="7810"/><pair kern="-20" kpx2="212"/><pair kern="-20" kpx2="334"/><pair kern="-20" kpx2="213"/><pair kern="-20" kpx2="214"/><pair kern="-20" kpx2="332"/><pair kern="-69" kpx2="8217"/><pair kern="-60" kpx2="89"/><pair kern="-20" kpx2="210"/><pair kern="-69" kpx2="8221"/><pair kern="-20" kpx2="211"/><pair kern="-40" kpx2="372"/><pair kern="-20" kpx2="510"/><pair kern="-60" kpx2="374"/><pair kern="-60" kpx2="376"/><pair kern="-69" kpx2="356"/><pair kern="-69" kpx2="354"/></kerning><kerning kpx1="1166"><pair kern="-60" kpx2="1221"/><pair kern="-60" kpx2="1033"/><pair kern="-49" kpx2="1222"/><pair kern="-20" kpx2="1217"/><pair kern="-49" kpx2="1299"/><pair kern="-60" kpx2="1298"/><pair kern="-49" kpx2="1236"/><pair kern="-60" kpx2="1288"/><pair kern="-60" kpx2="1051"/><pair kern="-49" kpx2="1289"/><pair kern="-49" kpx2="1113"/><pair kern="-49" kpx2="1232"/><pair kern="-20" kpx2="1174"/><pair kern="-49" kpx2="1234"/><pair kern="-40" kpx2="1282"/><pair kern="-20" kpx2="1244"/><pair kern="-129" kpx2="8218"/><pair kern="-49" kpx2="1040"/><pair kern="-40" kpx2="1280"/><pair kern="-60" kpx2="1044"/><pair kern="-129" kpx2="8222"/><pair kern="-20" kpx2="1046"/><pair kern="-9" kpx2="1130"/><pair kern="-49" kpx2="1126"/><pair kern="-49" kpx2="1127"/><pair kern="-129" kpx2="46"/><pair kern="-129" kpx2="44"/><pair kern="-20" kpx2="1061"/><pair kern="-49" kpx2="1083"/><pair kern="-20" kpx2="1202"/><pair kern="-20" kpx2="1278"/><pair kern="-20" kpx2="1276"/><pair kern="-49" kpx2="1076"/></kerning><kerning kpx1="220"><pair kern="-9" kpx2="65"/><pair kern="-9" kpx2="197"/><pair kern="-9" kpx2="196"/><pair kern="-9" kpx2="193"/><pair kern="-9" kpx2="192"/><pair kern="-9" kpx2="195"/><pair kern="-9" kpx2="194"/><pair kern="-9" kpx2="258"/><pair kern="-9" kpx2="256"/><pair kern="-9" kpx2="260"/><pair kern="-20" kpx2="8218"/><pair kern="-20" kpx2="8222"/><pair kern="-9" kpx2="7680"/><pair kern="-9" kpx2="7862"/><pair kern="-9" kpx2="7860"/><pair kern="-9" kpx2="7858"/><pair kern="-9" kpx2="506"/><pair kern="-9" kpx2="7856"/><pair kern="-20" kpx2="46"/><pair kern="-20" kpx2="44"/><pair kern="-9" kpx2="7846"/><pair kern="-9" kpx2="7844"/><pair kern="-9" kpx2="7842"/><pair kern="-9" kpx2="7840"/><pair kern="-9" kpx2="7854"/><pair kern="-9" kpx2="7852"/><pair kern="-9" kpx2="7850"/><pair kern="-9" kpx2="7848"/></kerning><kerning kpx1="1168"><pair kern="-49" kpx2="1100"/><pair kern="-20" kpx2="1101"/><pair kern="-49" kpx2="1102"/><pair kern="-29" kpx2="1103"/><pair kern="-49" kpx2="1096"/><pair kern="-49" kpx2="1097"/><pair kern="-40" kpx2="1098"/><pair kern="-49" kpx2="1099"/><pair kern="-69" kpx2="1092"/><pair kern="-20" kpx2="1093"/><pair kern="-49" kpx2="1094"/><pair kern="-49" kpx2="1095"/><pair kern="-49" kpx2="1088"/><pair kern="-69" kpx2="1089"/><pair kern="-40" kpx2="1090"/><pair kern="-40" kpx2="1091"/><pair kern="-49" kpx2="1117"/><pair kern="-49" kpx2="1116"/><pair kern="-49" kpx2="1119"/><pair kern="-40" kpx2="1118"/><pair kern="-60" kpx2="1113"/><pair kern="-49" kpx2="1114"/><pair kern="-60" kpx2="1109"/><pair kern="-69" kpx2="1108"/><pair kern="-69" kpx2="1105"/><pair kern="-69" kpx2="1104"/><pair kern="-49" kpx2="1107"/><pair kern="-49" kpx2="1133"/><pair kern="-49" kpx2="1131"/><pair kern="-49" kpx2="1129"/><pair kern="-69" kpx2="1126"/><pair kern="-60" kpx2="1127"/><pair kern="-49" kpx2="1125"/><pair kern="-60" kpx2="46"/><pair kern="-60" kpx2="44"/><pair kern="-20" kpx2="1120"/><pair kern="-40" kpx2="45"/><pair kern="-20" kpx2="1121"/><pair kern="-20" kpx2="1151"/><pair kern="-20" kpx2="1150"/><pair kern="-69" kpx2="1149"/><pair kern="-20" kpx2="1148"/><pair kern="-69" kpx2="1147"/><pair kern="-20" kpx2="1146"/><pair kern="-69" kpx2="1145"/><pair kern="-20" kpx2="1144"/><pair kern="-20" kpx2="1143"/><pair kern="-20" kpx2="1141"/><pair kern="-69" kpx2="1139"/><pair kern="-20" kpx2="1138"/><pair kern="-49" kpx2="1137"/><pair kern="-49" kpx2="1033"/><pair kern="-60" kpx2="1299"/><pair kern="-49" kpx2="1298"/><pair kern="-69" kpx2="1297"/><pair kern="-20" kpx2="1028"/><pair kern="-40" kpx2="8211"/><pair kern="-49" kpx2="1291"/><pair kern="-49" kpx2="1288"/><pair kern="-49" kpx2="1051"/><pair kern="-60" kpx2="1289"/><pair kern="-40" kpx2="1295"/><pair kern="-20" kpx2="1292"/><pair kern="-40" kpx2="8213"/><pair kern="-69" kpx2="1293"/><pair kern="-20" kpx2="1054"/><pair kern="-40" kpx2="8212"/><pair kern="-69" kpx2="1282"/><pair kern="-69" kpx2="1283"/><pair kern="-69" kpx2="1040"/><pair kern="-60" kpx2="8218"/><pair kern="-69" kpx2="1280"/><pair kern="-69" kpx2="1281"/><pair kern="-49" kpx2="1287"/><pair kern="-49" kpx2="1044"/><pair kern="-60" kpx2="8222"/><pair kern="-49" kpx2="1285"/><pair kern="20" kpx2="1058"/><pair kern="-20" kpx2="1057"/><pair kern="-40" kpx2="1060"/><pair kern="-60" kpx2="1083"/><pair kern="-49" kpx2="1082"/><pair kern="-49" kpx2="1081"/><pair kern="-49" kpx2="1080"/><pair kern="-49" kpx2="1087"/><pair kern="-69" kpx2="1086"/><pair kern="-49" kpx2="1085"/><pair kern="-49" kpx2="1084"/><pair kern="-49" kpx2="1075"/><pair kern="-49" kpx2="1074"/><pair kern="-20" kpx2="1079"/><pair kern="-20" kpx2="1078"/><pair kern="-69" kpx2="1077"/><pair kern="-60" kpx2="1076"/><pair kern="-49" kpx2="1221"/><pair kern="-49" kpx2="1220"/><pair kern="-60" kpx2="1222"/><pair kern="-20" kpx2="1218"/><pair kern="-49" kpx2="1228"/><pair kern="-49" kpx2="1230"/><pair kern="-49" kpx2="1224"/><pair kern="-49" kpx2="1226"/><pair kern="-69" kpx2="1236"/><pair kern="-69" kpx2="1239"/><pair kern="-69" kpx2="1232"/><pair kern="-69" kpx2="1234"/><pair kern="-20" kpx2="1245"/><pair kern="-20" kpx2="1247"/><pair kern="-69" kpx2="1255"/><pair kern="-20" kpx2="1254"/><pair kern="-49" kpx2="1253"/><pair kern="-49" kpx2="1251"/><pair kern="-29" kpx2="1249"/><pair kern="-40" kpx2="1263"/><pair kern="-20" kpx2="1261"/><pair kern="-69" kpx2="1259"/><pair kern="-20" kpx2="1258"/><pair kern="-69" kpx2="1257"/><pair kern="-20" kpx2="1256"/><pair kern="-49" kpx2="1271"/><pair kern="-49" kpx2="1269"/><pair kern="-40" kpx2="1267"/><pair kern="-40" kpx2="1265"/><pair kern="-20" kpx2="1279"/><pair kern="-20" kpx2="1277"/><pair kern="-49" kpx2="1273"/><pair kern="-69" kpx2="1153"/><pair kern="-20" kpx2="1152"/><pair kern="-49" kpx2="1163"/><pair kern="-49" kpx2="1167"/><pair kern="-49" kpx2="1169"/><pair kern="-49" kpx2="1173"/><pair kern="-20" kpx2="1175"/><pair kern="-20" kpx2="1177"/><pair kern="-49" kpx2="1179"/><pair kern="-49" kpx2="1181"/><pair kern="-49" kpx2="1187"/><pair kern="-40" kpx2="1185"/><pair kern="-49" kpx2="1191"/><pair kern="-49" kpx2="1189"/><pair kern="-69" kpx2="1195"/><pair kern="-20" kpx2="1194"/><pair kern="-69" kpx2="1193"/><pair kern="-20" kpx2="1192"/><pair kern="-40" kpx2="1199"/><pair kern="-40" kpx2="1197"/><pair kern="20" kpx2="1196"/><pair kern="-20" kpx2="1203"/><pair kern="-40" kpx2="1201"/><pair kern="-49" kpx2="1207"/><pair kern="-40" kpx2="1205"/><pair kern="-49" kpx2="1211"/><pair kern="-49" kpx2="1209"/><pair kern="-49" kpx2="1214"/><pair kern="-69" kpx2="1215"/><pair kern="-49" kpx2="1212"/><pair kern="-69" kpx2="1213"/></kerning><kerning kpx1="221"><pair kern="-49" kpx2="7889"/><pair kern="-49" kpx2="275"/><pair kern="-20" kpx2="7888"/><pair kern="-49" kpx2="273"/><pair kern="-20" kpx2="7890"/><pair kern="-49" kpx2="7893"/><pair kern="-49" kpx2="279"/><pair kern="-20" kpx2="7892"/><pair kern="-49" kpx2="7895"/><pair kern="-49" kpx2="277"/><pair kern="-20" kpx2="7894"/><pair kern="-49" kpx2="7897"/><pair kern="-49" kpx2="283"/><pair kern="-20" kpx2="7896"/><pair kern="-49" kpx2="7899"/><pair kern="-49" kpx2="281"/><pair kern="-20" kpx2="7898"/><pair kern="-49" kpx2="7901"/><pair kern="-20" kpx2="287"/><pair kern="-20" kpx2="7900"/><pair kern="-20" kpx2="286"/><pair kern="-49" kpx2="7903"/><pair kern="-20" kpx2="285"/><pair kern="-20" kpx2="7902"/><pair kern="-20" kpx2="284"/><pair kern="-60" kpx2="258"/><pair kern="-49" kpx2="259"/><pair kern="-60" kpx2="256"/><pair kern="-49" kpx2="7875"/><pair kern="-49" kpx2="257"/><pair kern="-20" kpx2="262"/><pair kern="-49" kpx2="7877"/><pair kern="-49" kpx2="263"/><pair kern="-60" kpx2="260"/><pair kern="-49" kpx2="7879"/><pair kern="-49" kpx2="261"/><pair kern="-20" kpx2="266"/><pair kern="-49" kpx2="267"/><pair kern="-20" kpx2="264"/><pair kern="-49" kpx2="265"/><pair kern="-20" kpx2="7884"/><pair kern="-49" kpx2="7885"/><pair kern="-49" kpx2="271"/><pair kern="-20" kpx2="7886"/><pair kern="-20" kpx2="268"/><pair kern="-49" kpx2="7887"/><pair kern="-49" kpx2="269"/><pair kern="-29" kpx2="7921"/><pair kern="-29" kpx2="312"/><pair kern="-60" kpx2="46"/><pair kern="-60" kpx2="44"/><pair kern="-20" kpx2="7906"/><pair kern="-20" kpx2="288"/><pair kern="-49" kpx2="7907"/><pair kern="-20" kpx2="289"/><pair kern="-20" kpx2="7904"/><pair kern="-20" kpx2="290"/><pair kern="-49" kpx2="7905"/><pair kern="-20" kpx2="291"/><pair kern="-29" kpx2="7911"/><pair kern="-29" kpx2="7909"/><pair kern="-29" kpx2="7915"/><pair kern="-29" kpx2="7913"/><pair kern="-40" kpx2="537"/><pair kern="20" kpx2="63"/><pair kern="-29" kpx2="7919"/><pair kern="-29" kpx2="7917"/><pair kern="-29" kpx2="343"/><pair kern="-29" kpx2="341"/><pair kern="-20" kpx2="71"/><pair kern="-49" kpx2="339"/><pair kern="-20" kpx2="338"/><pair kern="-60" kpx2="65"/><pair kern="-49" kpx2="337"/><pair kern="-20" kpx2="67"/><pair kern="-20" kpx2="336"/><pair kern="-40" kpx2="351"/><pair kern="-20" kpx2="79"/><pair kern="-40" kpx2="347"/><pair kern="-29" kpx2="326"/><pair kern="-29" kpx2="324"/><pair kern="-20" kpx2="81"/><pair kern="-20" kpx2="334"/><pair kern="-60" kpx2="8218"/><pair kern="-49" kpx2="335"/><pair kern="-20" kpx2="332"/><pair kern="-49" kpx2="333"/><pair kern="-60" kpx2="8222"/><pair kern="-29" kpx2="331"/><pair kern="-49" kpx2="7863"/><pair kern="-60" kpx2="7862"/><pair kern="-20" kpx2="103"/><pair kern="-49" kpx2="7861"/><pair kern="-49" kpx2="100"/><pair kern="-60" kpx2="7860"/><pair kern="-49" kpx2="101"/><pair kern="-49" kpx2="7859"/><pair kern="-29" kpx2="369"/><pair kern="-60" kpx2="7858"/><pair kern="-49" kpx2="99"/><pair kern="-49" kpx2="7857"/><pair kern="-29" kpx2="371"/><pair kern="-60" kpx2="7856"/><pair kern="-49" kpx2="97"/><pair kern="-49" kpx2="7871"/><pair kern="-29" kpx2="110"/><pair kern="-20" kpx2="380"/><pair kern="-49" kpx2="111"/><pair kern="-49" kpx2="7869"/><pair kern="-20" kpx2="382"/><pair kern="-29" kpx2="109"/><pair kern="-49" kpx2="7867"/><pair kern="-49" kpx2="7865"/><pair kern="-20" kpx2="378"/><pair kern="-60" kpx2="7846"/><pair kern="-60" kpx2="7844"/><pair kern="-29" kpx2="117"/><pair kern="-49" kpx2="7845"/><pair kern="-60" kpx2="7842"/><pair kern="-40" kpx2="115"/><pair kern="-49" kpx2="7843"/><pair kern="-29" kpx2="114"/><pair kern="-60" kpx2="7840"/><pair kern="-49" kpx2="113"/><pair kern="-49" kpx2="7841"/><pair kern="-29" kpx2="112"/><pair kern="-60" kpx2="7854"/><pair kern="-49" kpx2="7855"/><pair kern="-29" kpx2="365"/><pair kern="-60" kpx2="7852"/><pair kern="-49" kpx2="7853"/><pair kern="-29" kpx2="367"/><pair kern="-60" kpx2="7850"/><pair kern="-49" kpx2="7851"/><pair kern="-29" kpx2="361"/><pair kern="-20" kpx2="122"/><pair kern="-60" kpx2="7848"/><pair kern="-49" kpx2="7849"/><pair kern="-29" kpx2="363"/><pair kern="-29" kpx2="432"/><pair kern="-49" kpx2="417"/><pair kern="-20" kpx2="416"/><pair kern="-60" kpx2="197"/><pair kern="-60" kpx2="196"/><pair kern="-20" kpx2="199"/><pair kern="-60" kpx2="193"/><pair kern="-60" kpx2="192"/><pair kern="-60" kpx2="195"/><pair kern="-60" kpx2="194"/><pair kern="-20" kpx2="216"/><pair kern="-20" kpx2="212"/><pair kern="-20" kpx2="213"/><pair kern="-20" kpx2="214"/><pair kern="-49" kpx2="7681"/><pair kern="-60" kpx2="7680"/><pair kern="-20" kpx2="210"/><pair kern="-20" kpx2="211"/><pair kern="-29" kpx2="7743"/><pair kern="-49" kpx2="509"/><pair kern="-20" kpx2="510"/><pair kern="-49" kpx2="511"/><pair kern="-49" kpx2="235"/><pair kern="-49" kpx2="234"/><pair kern="-60" kpx2="506"/><pair kern="-49" kpx2="233"/><pair kern="-49" kpx2="507"/><pair kern="-49" kpx2="232"/><pair kern="-49" kpx2="231"/><pair kern="-49" kpx2="230"/><pair kern="-49" kpx2="229"/><pair kern="-49" kpx2="228"/><pair kern="-49" kpx2="227"/><pair kern="-49" kpx2="226"/><pair kern="-49" kpx2="225"/><pair kern="-49" kpx2="224"/><pair kern="-29" kpx2="252"/><pair kern="-29" kpx2="250"/><pair kern="-29" kpx2="251"/><pair kern="-49" kpx2="248"/><pair kern="-29" kpx2="249"/><pair kern="-49" kpx2="246"/><pair kern="-49" kpx2="244"/><pair kern="-49" kpx2="245"/><pair kern="-49" kpx2="242"/><pair kern="-49" kpx2="243"/></kerning><kerning kpx1="1169"><pair kern="-9" kpx2="1153"/><pair kern="-29" kpx2="1222"/><pair kern="-29" kpx2="1299"/><pair kern="-9" kpx2="1092"/><pair kern="-9" kpx2="1297"/><pair kern="-9" kpx2="1089"/><pair kern="-20" kpx2="8211"/><pair kern="-29" kpx2="1289"/><pair kern="-9" kpx2="1239"/><pair kern="-29" kpx2="1113"/><pair kern="-20" kpx2="8213"/><pair kern="-9" kpx2="1293"/><pair kern="-20" kpx2="8212"/><pair kern="-9" kpx2="1283"/><pair kern="-9" kpx2="1108"/><pair kern="-49" kpx2="8218"/><pair kern="-9" kpx2="1281"/><pair kern="-9" kpx2="1105"/><pair kern="-49" kpx2="8222"/><pair kern="-9" kpx2="1104"/><pair kern="-9" kpx2="1255"/><pair kern="-9" kpx2="1195"/><pair kern="-29" kpx2="1127"/><pair kern="-9" kpx2="1193"/><pair kern="-9" kpx2="1259"/><pair kern="-49" kpx2="46"/><pair kern="-9" kpx2="1257"/><pair kern="-49" kpx2="44"/><pair kern="-20" kpx2="45"/><pair kern="-29" kpx2="1083"/><pair kern="-9" kpx2="1149"/><pair kern="-9" kpx2="1147"/><pair kern="-9" kpx2="1086"/><pair kern="-9" kpx2="1145"/><pair kern="-9" kpx2="1139"/><pair kern="-9" kpx2="1077"/><pair kern="-29" kpx2="1076"/></kerning><kerning kpx1="222"><pair kern="-49" kpx2="65"/><pair kern="-49" kpx2="197"/><pair kern="-49" kpx2="196"/><pair kern="-49" kpx2="193"/><pair kern="-49" kpx2="192"/><pair kern="-49" kpx2="195"/><pair kern="-49" kpx2="194"/><pair kern="-49" kpx2="258"/><pair kern="-49" kpx2="256"/><pair kern="-49" kpx2="260"/><pair kern="-129" kpx2="8218"/><pair kern="-20" kpx2="88"/><pair kern="-129" kpx2="8222"/><pair kern="-49" kpx2="7680"/><pair kern="-9" kpx2="90"/><pair kern="-49" kpx2="7862"/><pair kern="-49" kpx2="7860"/><pair kern="-49" kpx2="7858"/><pair kern="-49" kpx2="506"/><pair kern="-49" kpx2="7856"/><pair kern="-9" kpx2="381"/><pair kern="-129" kpx2="46"/><pair kern="-9" kpx2="377"/><pair kern="-129" kpx2="44"/><pair kern="-9" kpx2="379"/><pair kern="-49" kpx2="7846"/><pair kern="-49" kpx2="7844"/><pair kern="-49" kpx2="7842"/><pair kern="-49" kpx2="7840"/><pair kern="-49" kpx2="7854"/><pair kern="-49" kpx2="7852"/><pair kern="-49" kpx2="7850"/><pair kern="-49" kpx2="7848"/></kerning><kerning kpx1="1170"><pair kern="-29" kpx2="1100"/><pair kern="-20" kpx2="1101"/><pair kern="-29" kpx2="1102"/><pair kern="-29" kpx2="1096"/><pair kern="-29" kpx2="1097"/><pair kern="-29" kpx2="1099"/><pair kern="-40" kpx2="1092"/><pair kern="-20" kpx2="1093"/><pair kern="-29" kpx2="1094"/><pair kern="-49" kpx2="1095"/><pair kern="-29" kpx2="1088"/><pair kern="-40" kpx2="1089"/><pair kern="-29" kpx2="1117"/><pair kern="-29" kpx2="1116"/><pair kern="-29" kpx2="1119"/><pair kern="-49" kpx2="1113"/><pair kern="20" kpx2="1115"/><pair kern="-29" kpx2="1114"/><pair kern="-29" kpx2="1109"/><pair kern="-40" kpx2="1108"/><pair kern="-40" kpx2="1105"/><pair kern="-40" kpx2="1104"/><pair kern="-29" kpx2="1107"/><pair kern="20" kpx2="1106"/><pair kern="-29" kpx2="1133"/><pair kern="-20" kpx2="1131"/><pair kern="-29" kpx2="1129"/><pair kern="-60" kpx2="1126"/><pair kern="-49" kpx2="1127"/><pair kern="-29" kpx2="1125"/><pair kern="-49" kpx2="46"/><pair kern="-49" kpx2="44"/><pair kern="-20" kpx2="1120"/><pair kern="-20" kpx2="45"/><pair kern="-20" kpx2="1150"/><pair kern="-40" kpx2="1149"/><pair kern="-20" kpx2="1148"/><pair kern="-40" kpx2="1147"/><pair kern="-20" kpx2="1146"/><pair kern="-40" kpx2="1145"/><pair kern="-20" kpx2="1144"/><pair kern="-40" kpx2="1139"/><pair kern="-20" kpx2="1138"/><pair kern="-29" kpx2="1137"/><pair kern="-40" kpx2="1033"/><pair kern="20" kpx2="1035"/><pair kern="-49" kpx2="1299"/><pair kern="-40" kpx2="1298"/><pair kern="-40" kpx2="1297"/><pair kern="20" kpx2="1026"/><pair kern="-20" kpx2="1028"/><pair kern="-20" kpx2="8211"/><pair kern="-29" kpx2="1291"/><pair kern="-40" kpx2="1288"/><pair kern="-40" kpx2="1051"/><pair kern="-49" kpx2="1289"/><pair kern="20" kpx2="1294"/><pair kern="-20" kpx2="1292"/><pair kern="-20" kpx2="8213"/><pair kern="-40" kpx2="1293"/><pair kern="-20" kpx2="1054"/><pair kern="-20" kpx2="8212"/><pair kern="-49" kpx2="1282"/><pair kern="-40" kpx2="1283"/><pair kern="-60" kpx2="1040"/><pair kern="-49" kpx2="8218"/><pair kern="-49" kpx2="1280"/><pair kern="-40" kpx2="1281"/><pair kern="-20" kpx2="1287"/><pair kern="-40" kpx2="1044"/><pair kern="-49" kpx2="8222"/><pair kern="-20" kpx2="1285"/><pair kern="20" kpx2="1066"/><pair kern="20" kpx2="1058"/><pair kern="-20" kpx2="1057"/><pair kern="-29" kpx2="1060"/><pair kern="-49" kpx2="1083"/><pair kern="-29" kpx2="1082"/><pair kern="-29" kpx2="1081"/><pair kern="-29" kpx2="1080"/><pair kern="-29" kpx2="1087"/><pair kern="-40" kpx2="1086"/><pair kern="-29" kpx2="1085"/><pair kern="-29" kpx2="1084"/><pair kern="-29" kpx2="1075"/><pair kern="-29" kpx2="1074"/><pair kern="-20" kpx2="1079"/><pair kern="-20" kpx2="1078"/><pair kern="-40" kpx2="1077"/><pair kern="-49" kpx2="1076"/><pair kern="-40" kpx2="1221"/><pair kern="-29" kpx2="1220"/><pair kern="-49" kpx2="1222"/><pair kern="-20" kpx2="1218"/><pair kern="-49" kpx2="1228"/><pair kern="-29" kpx2="1230"/><pair kern="-29" kpx2="1224"/><pair kern="-29" kpx2="1226"/><pair kern="-60" kpx2="1236"/><pair kern="-40" kpx2="1239"/><pair kern="-60" kpx2="1232"/><pair kern="-60" kpx2="1234"/><pair kern="-20" kpx2="1245"/><pair kern="-20" kpx2="1247"/><pair kern="-40" kpx2="1255"/><pair kern="-20" kpx2="1254"/><pair kern="-29" kpx2="1253"/><pair kern="-29" kpx2="1251"/><pair kern="-20" kpx2="1261"/><pair kern="-40" kpx2="1259"/><pair kern="-20" kpx2="1258"/><pair kern="-40" kpx2="1257"/><pair kern="-20" kpx2="1256"/><pair kern="-29" kpx2="1271"/><pair kern="-49" kpx2="1269"/><pair kern="-20" kpx2="1279"/><pair kern="-20" kpx2="1277"/><pair kern="-29" kpx2="1273"/><pair kern="-40" kpx2="1153"/><pair kern="-20" kpx2="1152"/><pair kern="-29" kpx2="1163"/><pair kern="20" kpx2="1165"/><pair kern="-29" kpx2="1167"/><pair kern="-29" kpx2="1169"/><pair kern="-29" kpx2="1173"/><pair kern="-20" kpx2="1175"/><pair kern="-20" kpx2="1177"/><pair kern="-29" kpx2="1179"/><pair kern="-29" kpx2="1181"/><pair kern="20" kpx2="1183"/><pair kern="-29" kpx2="1187"/><pair kern="20" kpx2="1184"/><pair kern="-29" kpx2="1191"/><pair kern="-29" kpx2="1189"/><pair kern="-40" kpx2="1195"/><pair kern="-20" kpx2="1194"/><pair kern="-40" kpx2="1193"/><pair kern="-20" kpx2="1192"/><pair kern="20" kpx2="1196"/><pair kern="-20" kpx2="1203"/><pair kern="-49" kpx2="1207"/><pair kern="20" kpx2="1204"/><pair kern="-29" kpx2="1211"/><pair kern="-49" kpx2="1209"/><pair kern="-20" kpx2="1214"/><pair kern="-29" kpx2="1215"/><pair kern="-20" kpx2="1212"/><pair kern="-29" kpx2="1213"/></kerning><kerning kpx1="1171"><pair kern="-20" kpx2="1153"/><pair kern="-29" kpx2="1222"/><pair kern="-29" kpx2="1299"/><pair kern="-20" kpx2="1092"/><pair kern="-20" kpx2="1297"/><pair kern="-20" kpx2="1089"/><pair kern="-29" kpx2="1289"/><pair kern="-20" kpx2="1239"/><pair kern="-29" kpx2="1113"/><pair kern="-20" kpx2="1293"/><pair kern="-20" kpx2="1283"/><pair kern="-29" kpx2="8218"/><pair kern="-20" kpx2="1108"/><pair kern="-20" kpx2="1281"/><pair kern="-20" kpx2="1105"/><pair kern="-29" kpx2="8222"/><pair kern="-20" kpx2="1104"/><pair kern="-20" kpx2="1255"/><pair kern="-20" kpx2="1195"/><pair kern="-29" kpx2="1127"/><pair kern="-20" kpx2="1193"/><pair kern="-20" kpx2="1259"/><pair kern="-29" kpx2="46"/><pair kern="-20" kpx2="1257"/><pair kern="-29" kpx2="44"/><pair kern="-29" kpx2="1083"/><pair kern="-20" kpx2="1149"/><pair kern="-20" kpx2="1147"/><pair kern="-20" kpx2="1086"/><pair kern="-20" kpx2="1145"/><pair kern="-20" kpx2="1139"/><pair kern="-20" kpx2="1077"/><pair kern="-29" kpx2="1076"/></kerning><kerning kpx1="216"><pair kern="-20" kpx2="258"/><pair kern="-20" kpx2="256"/><pair kern="-20" kpx2="260"/><pair kern="-9" kpx2="7922"/><pair kern="-9" kpx2="7926"/><pair kern="-9" kpx2="7924"/><pair kern="-9" kpx2="7928"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="44"/><pair kern="-29" kpx2="538"/><pair kern="-20" kpx2="65"/><pair kern="-20" kpx2="197"/><pair kern="-20" kpx2="196"/><pair kern="-20" kpx2="193"/><pair kern="-20" kpx2="192"/><pair kern="-9" kpx2="1029"/><pair kern="-20" kpx2="195"/><pair kern="-20" kpx2="194"/><pair kern="-9" kpx2="7812"/><pair kern="-9" kpx2="221"/><pair kern="-29" kpx2="84"/><pair kern="-9" kpx2="87"/><pair kern="-9" kpx2="86"/><pair kern="-9" kpx2="7808"/><pair kern="-9" kpx2="7810"/><pair kern="-40" kpx2="8218"/><pair kern="-9" kpx2="89"/><pair kern="-20" kpx2="88"/><pair kern="-40" kpx2="8222"/><pair kern="-20" kpx2="7680"/><pair kern="-9" kpx2="90"/><pair kern="-9" kpx2="372"/><pair kern="-20" kpx2="7862"/><pair kern="-9" kpx2="374"/><pair kern="-20" kpx2="7860"/><pair kern="-20" kpx2="7858"/><pair kern="-20" kpx2="506"/><pair kern="-20" kpx2="7856"/><pair kern="-9" kpx2="381"/><pair kern="-9" kpx2="377"/><pair kern="-9" kpx2="376"/><pair kern="-9" kpx2="379"/><pair kern="-29" kpx2="356"/><pair kern="-20" kpx2="7846"/><pair kern="-20" kpx2="7844"/><pair kern="-20" kpx2="7842"/><pair kern="-29" kpx2="354"/><pair kern="-20" kpx2="7840"/><pair kern="-20" kpx2="7854"/><pair kern="-20" kpx2="7852"/><pair kern="-20" kpx2="7850"/><pair kern="-20" kpx2="7848"/></kerning><kerning kpx1="1172"><pair kern="49" kpx2="1032"/><pair kern="-29" kpx2="1035"/><pair kern="-20" kpx2="1098"/><pair kern="-20" kpx2="1228"/><pair kern="-29" kpx2="1026"/><pair kern="-20" kpx2="1095"/><pair kern="-40" kpx2="1227"/><pair kern="-20" kpx2="1090"/><pair kern="-29" kpx2="1294"/><pair kern="-20" kpx2="1295"/><pair kern="-29" kpx2="8217"/><pair kern="-20" kpx2="1286"/><pair kern="-29" kpx2="1287"/><pair kern="-20" kpx2="1284"/><pair kern="-29" kpx2="8221"/><pair kern="-29" kpx2="1285"/><pair kern="-29" kpx2="1066"/><pair kern="-29" kpx2="34"/><pair kern="-20" kpx2="1185"/><pair kern="-29" kpx2="1184"/><pair kern="-29" kpx2="39"/><pair kern="-29" kpx2="1058"/><pair kern="-40" kpx2="1063"/><pair kern="-20" kpx2="1198"/><pair kern="-20" kpx2="1197"/><pair kern="-29" kpx2="1196"/><pair kern="-40" kpx2="1268"/><pair kern="-20" kpx2="1200"/><pair kern="-20" kpx2="1269"/><pair kern="-40" kpx2="1206"/><pair kern="-20" kpx2="1207"/><pair kern="-29" kpx2="1204"/><pair kern="-20" kpx2="1205"/><pair kern="-29" kpx2="1142"/><pair kern="-40" kpx2="1208"/><pair kern="-20" kpx2="1209"/><pair kern="-29" kpx2="1140"/><pair kern="-40" kpx2="1136"/></kerning><kerning kpx1="217"><pair kern="-9" kpx2="65"/><pair kern="-9" kpx2="197"/><pair kern="-9" kpx2="196"/><pair kern="-9" kpx2="193"/><pair kern="-9" kpx2="192"/><pair kern="-9" kpx2="195"/><pair kern="-9" kpx2="194"/><pair kern="-9" kpx2="258"/><pair kern="-9" kpx2="256"/><pair kern="-9" kpx2="260"/><pair kern="-20" kpx2="8218"/><pair kern="-20" kpx2="8222"/><pair kern="-9" kpx2="7680"/><pair kern="-9" kpx2="7862"/><pair kern="-9" kpx2="7860"/><pair kern="-9" kpx2="7858"/><pair kern="-9" kpx2="506"/><pair kern="-9" kpx2="7856"/><pair kern="-20" kpx2="46"/><pair kern="-20" kpx2="44"/><pair kern="-9" kpx2="7846"/><pair kern="-9" kpx2="7844"/><pair kern="-9" kpx2="7842"/><pair kern="-9" kpx2="7840"/><pair kern="-9" kpx2="7854"/><pair kern="-9" kpx2="7852"/><pair kern="-9" kpx2="7850"/><pair kern="-9" kpx2="7848"/></kerning><kerning kpx1="1173"><pair kern="-29" kpx2="34"/><pair kern="-29" kpx2="39"/><pair kern="-29" kpx2="8217"/><pair kern="-20" kpx2="1287"/><pair kern="-29" kpx2="8221"/><pair kern="-20" kpx2="1285"/></kerning><kerning kpx1="218"><pair kern="-9" kpx2="65"/><pair kern="-9" kpx2="197"/><pair kern="-9" kpx2="196"/><pair kern="-9" kpx2="193"/><pair kern="-9" kpx2="192"/><pair kern="-9" kpx2="195"/><pair kern="-9" kpx2="194"/><pair kern="-9" kpx2="258"/><pair kern="-9" kpx2="256"/><pair kern="-9" kpx2="260"/><pair kern="-20" kpx2="8218"/><pair kern="-20" kpx2="8222"/><pair kern="-9" kpx2="7680"/><pair kern="-9" kpx2="7862"/><pair kern="-9" kpx2="7860"/><pair kern="-9" kpx2="7858"/><pair kern="-9" kpx2="506"/><pair kern="-9" kpx2="7856"/><pair kern="-20" kpx2="46"/><pair kern="-20" kpx2="44"/><pair kern="-9" kpx2="7846"/><pair kern="-9" kpx2="7844"/><pair kern="-9" kpx2="7842"/><pair kern="-9" kpx2="7840"/><pair kern="-9" kpx2="7854"/><pair kern="-9" kpx2="7852"/><pair kern="-9" kpx2="7850"/><pair kern="-9" kpx2="7848"/></kerning><kerning kpx1="1174"><pair kern="109" kpx2="1032"/><pair kern="-20" kpx2="1152"/><pair kern="-20" kpx2="1098"/><pair kern="-40" kpx2="1228"/><pair kern="-40" kpx2="1095"/><pair kern="-20" kpx2="1028"/><pair kern="-20" kpx2="1090"/><pair kern="-20" kpx2="1295"/><pair kern="-20" kpx2="1292"/><pair kern="-20" kpx2="1054"/><pair kern="-20" kpx2="1287"/><pair kern="-20" kpx2="1285"/><pair kern="-20" kpx2="1254"/><pair kern="29" kpx2="1135"/><pair kern="-20" kpx2="1185"/><pair kern="-20" kpx2="1194"/><pair kern="-20" kpx2="1057"/><pair kern="-20" kpx2="1192"/><pair kern="-20" kpx2="1258"/><pair kern="-20" kpx2="1120"/><pair kern="-29" kpx2="1060"/><pair kern="-20" kpx2="1197"/><pair kern="-20" kpx2="1256"/><pair kern="-20" kpx2="1150"/><pair kern="-40" kpx2="1269"/><pair kern="-20" kpx2="1148"/><pair kern="-20" kpx2="1146"/><pair kern="-40" kpx2="1207"/><pair kern="-20" kpx2="1144"/><pair kern="-20" kpx2="1205"/><pair kern="-40" kpx2="1209"/><pair kern="-29" kpx2="1214"/><pair kern="-20" kpx2="1215"/><pair kern="-20" kpx2="1138"/><pair kern="-29" kpx2="1212"/><pair kern="-9" kpx2="1137"/><pair kern="-20" kpx2="1213"/></kerning><kerning kpx1="219"><pair kern="-9" kpx2="65"/><pair kern="-9" kpx2="197"/><pair kern="-9" kpx2="196"/><pair kern="-9" kpx2="193"/><pair kern="-9" kpx2="192"/><pair kern="-9" kpx2="195"/><pair kern="-9" kpx2="194"/><pair kern="-9" kpx2="258"/><pair kern="-9" kpx2="256"/><pair kern="-9" kpx2="260"/><pair kern="-20" kpx2="8218"/><pair kern="-20" kpx2="8222"/><pair kern="-9" kpx2="7680"/><pair kern="-9" kpx2="7862"/><pair kern="-9" kpx2="7860"/><pair kern="-9" kpx2="7858"/><pair kern="-9" kpx2="506"/><pair kern="-9" kpx2="7856"/><pair kern="-20" kpx2="46"/><pair kern="-20" kpx2="44"/><pair kern="-9" kpx2="7846"/><pair kern="-9" kpx2="7844"/><pair kern="-9" kpx2="7842"/><pair kern="-9" kpx2="7840"/><pair kern="-9" kpx2="7854"/><pair kern="-9" kpx2="7852"/><pair kern="-9" kpx2="7850"/><pair kern="-9" kpx2="7848"/></kerning><kerning kpx1="1175"><pair kern="-9" kpx2="1153"/><pair kern="-9" kpx2="1092"/><pair kern="-9" kpx2="1228"/><pair kern="-9" kpx2="1297"/><pair kern="-9" kpx2="1095"/><pair kern="-9" kpx2="1089"/><pair kern="-9" kpx2="1239"/><pair kern="-9" kpx2="1293"/><pair kern="-9" kpx2="1283"/><pair kern="-9" kpx2="1108"/><pair kern="-9" kpx2="1281"/><pair kern="-9" kpx2="1105"/><pair kern="-20" kpx2="1287"/><pair kern="-9" kpx2="1104"/><pair kern="-20" kpx2="1285"/><pair kern="-9" kpx2="1255"/><pair kern="-9" kpx2="1195"/><pair kern="-9" kpx2="1193"/><pair kern="-9" kpx2="1259"/><pair kern="-9" kpx2="1257"/><pair kern="-9" kpx2="1149"/><pair kern="-9" kpx2="1269"/><pair kern="-9" kpx2="1147"/><pair kern="-9" kpx2="1086"/><pair kern="-9" kpx2="1207"/><pair kern="-9" kpx2="1145"/><pair kern="-9" kpx2="1209"/><pair kern="-9" kpx2="1139"/><pair kern="-9" kpx2="1077"/></kerning><kerning kpx1="212"><pair kern="-20" kpx2="258"/><pair kern="-20" kpx2="256"/><pair kern="-20" kpx2="260"/><pair kern="-9" kpx2="7922"/><pair kern="-9" kpx2="7926"/><pair kern="-9" kpx2="7924"/><pair kern="-9" kpx2="7928"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="44"/><pair kern="-29" kpx2="538"/><pair kern="-20" kpx2="65"/><pair kern="-20" kpx2="197"/><pair kern="-20" kpx2="196"/><pair kern="-20" kpx2="193"/><pair kern="-20" kpx2="192"/><pair kern="-9" kpx2="1029"/><pair kern="-20" kpx2="195"/><pair kern="-20" kpx2="194"/><pair kern="-9" kpx2="7812"/><pair kern="-9" kpx2="221"/><pair kern="-29" kpx2="84"/><pair kern="-9" kpx2="87"/><pair kern="-9" kpx2="86"/><pair kern="-9" kpx2="7808"/><pair kern="-9" kpx2="7810"/><pair kern="-40" kpx2="8218"/><pair kern="-9" kpx2="89"/><pair kern="-20" kpx2="88"/><pair kern="-40" kpx2="8222"/><pair kern="-20" kpx2="7680"/><pair kern="-9" kpx2="90"/><pair kern="-9" kpx2="372"/><pair kern="-20" kpx2="7862"/><pair kern="-9" kpx2="374"/><pair kern="-20" kpx2="7860"/><pair kern="-20" kpx2="7858"/><pair kern="-20" kpx2="506"/><pair kern="-20" kpx2="7856"/><pair kern="-9" kpx2="381"/><pair kern="-9" kpx2="377"/><pair kern="-9" kpx2="376"/><pair kern="-9" kpx2="379"/><pair kern="-29" kpx2="356"/><pair kern="-20" kpx2="7846"/><pair kern="-20" kpx2="7844"/><pair kern="-20" kpx2="7842"/><pair kern="-29" kpx2="354"/><pair kern="-20" kpx2="7840"/><pair kern="-20" kpx2="7854"/><pair kern="-20" kpx2="7852"/><pair kern="-20" kpx2="7850"/><pair kern="-20" kpx2="7848"/></kerning><kerning kpx1="1176"><pair kern="-9" kpx2="1200"/><pair kern="-9" kpx2="1142"/><pair kern="-40" kpx2="8218"/><pair kern="-9" kpx2="1140"/><pair kern="-20" kpx2="1286"/><pair kern="-40" kpx2="46"/><pair kern="-9" kpx2="1198"/><pair kern="-40" kpx2="8222"/><pair kern="-20" kpx2="1284"/><pair kern="-40" kpx2="44"/></kerning><kerning kpx1="213"><pair kern="-20" kpx2="258"/><pair kern="-20" kpx2="256"/><pair kern="-20" kpx2="260"/><pair kern="-9" kpx2="7922"/><pair kern="-9" kpx2="7926"/><pair kern="-9" kpx2="7924"/><pair kern="-9" kpx2="7928"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="44"/><pair kern="-29" kpx2="538"/><pair kern="-20" kpx2="65"/><pair kern="-20" kpx2="197"/><pair kern="-20" kpx2="196"/><pair kern="-20" kpx2="193"/><pair kern="-20" kpx2="192"/><pair kern="-9" kpx2="1029"/><pair kern="-20" kpx2="195"/><pair kern="-20" kpx2="194"/><pair kern="-9" kpx2="7812"/><pair kern="-9" kpx2="221"/><pair kern="-29" kpx2="84"/><pair kern="-9" kpx2="87"/><pair kern="-9" kpx2="86"/><pair kern="-9" kpx2="7808"/><pair kern="-9" kpx2="7810"/><pair kern="-40" kpx2="8218"/><pair kern="-9" kpx2="89"/><pair kern="-20" kpx2="88"/><pair kern="-40" kpx2="8222"/><pair kern="-20" kpx2="7680"/><pair kern="-9" kpx2="90"/><pair kern="-9" kpx2="372"/><pair kern="-20" kpx2="7862"/><pair kern="-9" kpx2="374"/><pair kern="-20" kpx2="7860"/><pair kern="-20" kpx2="7858"/><pair kern="-20" kpx2="506"/><pair kern="-20" kpx2="7856"/><pair kern="-9" kpx2="381"/><pair kern="-9" kpx2="377"/><pair kern="-9" kpx2="376"/><pair kern="-9" kpx2="379"/><pair kern="-29" kpx2="356"/><pair kern="-20" kpx2="7846"/><pair kern="-20" kpx2="7844"/><pair kern="-20" kpx2="7842"/><pair kern="-29" kpx2="354"/><pair kern="-20" kpx2="7840"/><pair kern="-20" kpx2="7854"/><pair kern="-20" kpx2="7852"/><pair kern="-20" kpx2="7850"/><pair kern="-20" kpx2="7848"/></kerning><kerning kpx1="1177"><pair kern="20" kpx2="1103"/></kerning><kerning kpx1="214"><pair kern="-20" kpx2="258"/><pair kern="-20" kpx2="256"/><pair kern="-20" kpx2="260"/><pair kern="-9" kpx2="7922"/><pair kern="-9" kpx2="7926"/><pair kern="-9" kpx2="7924"/><pair kern="-9" kpx2="7928"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="44"/><pair kern="-29" kpx2="538"/><pair kern="-20" kpx2="65"/><pair kern="-20" kpx2="197"/><pair kern="-20" kpx2="196"/><pair kern="-20" kpx2="193"/><pair kern="-20" kpx2="192"/><pair kern="-9" kpx2="1029"/><pair kern="-20" kpx2="195"/><pair kern="-20" kpx2="194"/><pair kern="-9" kpx2="7812"/><pair kern="-9" kpx2="221"/><pair kern="-29" kpx2="84"/><pair kern="-9" kpx2="87"/><pair kern="-9" kpx2="86"/><pair kern="-9" kpx2="7808"/><pair kern="-9" kpx2="7810"/><pair kern="-40" kpx2="8218"/><pair kern="-9" kpx2="89"/><pair kern="-20" kpx2="88"/><pair kern="-40" kpx2="8222"/><pair kern="-20" kpx2="7680"/><pair kern="-9" kpx2="90"/><pair kern="-9" kpx2="372"/><pair kern="-20" kpx2="7862"/><pair kern="-9" kpx2="374"/><pair kern="-20" kpx2="7860"/><pair kern="-20" kpx2="7858"/><pair kern="-20" kpx2="506"/><pair kern="-20" kpx2="7856"/><pair kern="-9" kpx2="381"/><pair kern="-9" kpx2="377"/><pair kern="-9" kpx2="376"/><pair kern="-9" kpx2="379"/><pair kern="-29" kpx2="356"/><pair kern="-20" kpx2="7846"/><pair kern="-20" kpx2="7844"/><pair kern="-20" kpx2="7842"/><pair kern="-29" kpx2="354"/><pair kern="-20" kpx2="7840"/><pair kern="-20" kpx2="7854"/><pair kern="-20" kpx2="7852"/><pair kern="-20" kpx2="7850"/><pair kern="-20" kpx2="7848"/></kerning><kerning kpx1="1178"><pair kern="109" kpx2="1032"/><pair kern="-20" kpx2="1152"/><pair kern="-20" kpx2="1098"/><pair kern="-40" kpx2="1228"/><pair kern="-40" kpx2="1095"/><pair kern="-20" kpx2="1028"/><pair kern="-20" kpx2="1090"/><pair kern="-20" kpx2="1295"/><pair kern="-20" kpx2="1292"/><pair kern="-20" kpx2="1054"/><pair kern="-20" kpx2="1287"/><pair kern="-20" kpx2="1285"/><pair kern="-20" kpx2="1254"/><pair kern="29" kpx2="1135"/><pair kern="-20" kpx2="1185"/><pair kern="-20" kpx2="1194"/><pair kern="-20" kpx2="1057"/><pair kern="-20" kpx2="1192"/><pair kern="-20" kpx2="1258"/><pair kern="-20" kpx2="1120"/><pair kern="-29" kpx2="1060"/><pair kern="-20" kpx2="1197"/><pair kern="-20" kpx2="1256"/><pair kern="-20" kpx2="1150"/><pair kern="-40" kpx2="1269"/><pair kern="-20" kpx2="1148"/><pair kern="-20" kpx2="1146"/><pair kern="-40" kpx2="1207"/><pair kern="-20" kpx2="1144"/><pair kern="-20" kpx2="1205"/><pair kern="-40" kpx2="1209"/><pair kern="-29" kpx2="1214"/><pair kern="-20" kpx2="1215"/><pair kern="-20" kpx2="1138"/><pair kern="-29" kpx2="1212"/><pair kern="-9" kpx2="1137"/><pair kern="-20" kpx2="1213"/></kerning><kerning kpx1="1179"><pair kern="-9" kpx2="1153"/><pair kern="-9" kpx2="1092"/><pair kern="-9" kpx2="1228"/><pair kern="-9" kpx2="1297"/><pair kern="-9" kpx2="1095"/><pair kern="-9" kpx2="1089"/><pair kern="-9" kpx2="1239"/><pair kern="-9" kpx2="1293"/><pair kern="-9" kpx2="1283"/><pair kern="-9" kpx2="1108"/><pair kern="-9" kpx2="1281"/><pair kern="-9" kpx2="1105"/><pair kern="-20" kpx2="1287"/><pair kern="-9" kpx2="1104"/><pair kern="-20" kpx2="1285"/><pair kern="-9" kpx2="1255"/><pair kern="-9" kpx2="1195"/><pair kern="-9" kpx2="1193"/><pair kern="-9" kpx2="1259"/><pair kern="-9" kpx2="1257"/><pair kern="-9" kpx2="1149"/><pair kern="-9" kpx2="1269"/><pair kern="-9" kpx2="1147"/><pair kern="-9" kpx2="1086"/><pair kern="-9" kpx2="1207"/><pair kern="-9" kpx2="1145"/><pair kern="-9" kpx2="1209"/><pair kern="-9" kpx2="1139"/><pair kern="-9" kpx2="1077"/></kerning><kerning kpx1="208"><pair kern="-20" kpx2="258"/><pair kern="-20" kpx2="256"/><pair kern="-20" kpx2="260"/><pair kern="-9" kpx2="7922"/><pair kern="-9" kpx2="7926"/><pair kern="-9" kpx2="7924"/><pair kern="-9" kpx2="7928"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="44"/><pair kern="-29" kpx2="538"/><pair kern="-20" kpx2="65"/><pair kern="-20" kpx2="197"/><pair kern="-20" kpx2="196"/><pair kern="-20" kpx2="193"/><pair kern="-20" kpx2="192"/><pair kern="-9" kpx2="1029"/><pair kern="-20" kpx2="195"/><pair kern="-20" kpx2="194"/><pair kern="-9" kpx2="7812"/><pair kern="-9" kpx2="221"/><pair kern="-29" kpx2="84"/><pair kern="-9" kpx2="87"/><pair kern="-9" kpx2="86"/><pair kern="-9" kpx2="7808"/><pair kern="-9" kpx2="7810"/><pair kern="-40" kpx2="8218"/><pair kern="-9" kpx2="89"/><pair kern="-20" kpx2="88"/><pair kern="-40" kpx2="8222"/><pair kern="-20" kpx2="7680"/><pair kern="-9" kpx2="90"/><pair kern="-9" kpx2="372"/><pair kern="-20" kpx2="7862"/><pair kern="-9" kpx2="374"/><pair kern="-20" kpx2="7860"/><pair kern="-20" kpx2="7858"/><pair kern="-20" kpx2="506"/><pair kern="-20" kpx2="7856"/><pair kern="-9" kpx2="381"/><pair kern="-9" kpx2="377"/><pair kern="-9" kpx2="376"/><pair kern="-9" kpx2="379"/><pair kern="-29" kpx2="356"/><pair kern="-20" kpx2="7846"/><pair kern="-20" kpx2="7844"/><pair kern="-20" kpx2="7842"/><pair kern="-29" kpx2="354"/><pair kern="-20" kpx2="7840"/><pair kern="-20" kpx2="7854"/><pair kern="-20" kpx2="7852"/><pair kern="-20" kpx2="7850"/><pair kern="-20" kpx2="7848"/></kerning><kerning kpx1="1180"><pair kern="-20" kpx2="1152"/><pair kern="-20" kpx2="1228"/><pair kern="-9" kpx2="1296"/><pair kern="-20" kpx2="1095"/><pair kern="-20" kpx2="1028"/><pair kern="-20" kpx2="1227"/><pair kern="-20" kpx2="1292"/><pair kern="-20" kpx2="1054"/><pair kern="-20" kpx2="1282"/><pair kern="-20" kpx2="1280"/><pair kern="-20" kpx2="1287"/><pair kern="-20" kpx2="1285"/><pair kern="-20" kpx2="1254"/><pair kern="-20" kpx2="1194"/><pair kern="-20" kpx2="1057"/><pair kern="-20" kpx2="1192"/><pair kern="-20" kpx2="1258"/><pair kern="-20" kpx2="1063"/><pair kern="-20" kpx2="1120"/><pair kern="-20" kpx2="1060"/><pair kern="-20" kpx2="1256"/><pair kern="-20" kpx2="1150"/><pair kern="-20" kpx2="1268"/><pair kern="-20" kpx2="1269"/><pair kern="-20" kpx2="1148"/><pair kern="-20" kpx2="1206"/><pair kern="-20" kpx2="1146"/><pair kern="-20" kpx2="1207"/><pair kern="-20" kpx2="1144"/><pair kern="-20" kpx2="1208"/><pair kern="-20" kpx2="1209"/><pair kern="-49" kpx2="1214"/><pair kern="-20" kpx2="1138"/><pair kern="-49" kpx2="1212"/><pair kern="-20" kpx2="1136"/></kerning><kerning kpx1="1181"><pair kern="-20" kpx2="1153"/><pair kern="-20" kpx2="1092"/><pair kern="-20" kpx2="1228"/><pair kern="-20" kpx2="1297"/><pair kern="-20" kpx2="1095"/><pair kern="-20" kpx2="1089"/><pair kern="-20" kpx2="1239"/><pair kern="-20" kpx2="1293"/><pair kern="-20" kpx2="1283"/><pair kern="-20" kpx2="1108"/><pair kern="-20" kpx2="1281"/><pair kern="-20" kpx2="1105"/><pair kern="-20" kpx2="1104"/><pair kern="-20" kpx2="1255"/><pair kern="-20" kpx2="1195"/><pair kern="-20" kpx2="1193"/><pair kern="-20" kpx2="1259"/><pair kern="-20" kpx2="1257"/><pair kern="-20" kpx2="1149"/><pair kern="-20" kpx2="1269"/><pair kern="-20" kpx2="1147"/><pair kern="-20" kpx2="1086"/><pair kern="-20" kpx2="1207"/><pair kern="-20" kpx2="1145"/><pair kern="-20" kpx2="1209"/><pair kern="-20" kpx2="1139"/><pair kern="-20" kpx2="1215"/><pair kern="-20" kpx2="1077"/><pair kern="-20" kpx2="1213"/></kerning><kerning kpx1="210"><pair kern="-20" kpx2="258"/><pair kern="-20" kpx2="256"/><pair kern="-20" kpx2="260"/><pair kern="-9" kpx2="7922"/><pair kern="-9" kpx2="7926"/><pair kern="-9" kpx2="7924"/><pair kern="-9" kpx2="7928"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="44"/><pair kern="-29" kpx2="538"/><pair kern="-20" kpx2="65"/><pair kern="-20" kpx2="197"/><pair kern="-20" kpx2="196"/><pair kern="-20" kpx2="193"/><pair kern="-20" kpx2="192"/><pair kern="-9" kpx2="1029"/><pair kern="-20" kpx2="195"/><pair kern="-20" kpx2="194"/><pair kern="-9" kpx2="7812"/><pair kern="-9" kpx2="221"/><pair kern="-29" kpx2="84"/><pair kern="-9" kpx2="87"/><pair kern="-9" kpx2="86"/><pair kern="-9" kpx2="7808"/><pair kern="-9" kpx2="7810"/><pair kern="-40" kpx2="8218"/><pair kern="-9" kpx2="89"/><pair kern="-20" kpx2="88"/><pair kern="-40" kpx2="8222"/><pair kern="-20" kpx2="7680"/><pair kern="-9" kpx2="90"/><pair kern="-9" kpx2="372"/><pair kern="-20" kpx2="7862"/><pair kern="-9" kpx2="374"/><pair kern="-20" kpx2="7860"/><pair kern="-20" kpx2="7858"/><pair kern="-20" kpx2="506"/><pair kern="-20" kpx2="7856"/><pair kern="-9" kpx2="381"/><pair kern="-9" kpx2="377"/><pair kern="-9" kpx2="376"/><pair kern="-9" kpx2="379"/><pair kern="-29" kpx2="356"/><pair kern="-20" kpx2="7846"/><pair kern="-20" kpx2="7844"/><pair kern="-20" kpx2="7842"/><pair kern="-29" kpx2="354"/><pair kern="-20" kpx2="7840"/><pair kern="-20" kpx2="7854"/><pair kern="-20" kpx2="7852"/><pair kern="-20" kpx2="7850"/><pair kern="-20" kpx2="7848"/></kerning><kerning kpx1="1182"><pair kern="-20" kpx2="1152"/><pair kern="-20" kpx2="1228"/><pair kern="-9" kpx2="1296"/><pair kern="-20" kpx2="1095"/><pair kern="-20" kpx2="1028"/><pair kern="-20" kpx2="1227"/><pair kern="-20" kpx2="1292"/><pair kern="-20" kpx2="1054"/><pair kern="-20" kpx2="1282"/><pair kern="-20" kpx2="1280"/><pair kern="-20" kpx2="1287"/><pair kern="-20" kpx2="1285"/><pair kern="-20" kpx2="1254"/><pair kern="-20" kpx2="1194"/><pair kern="-20" kpx2="1057"/><pair kern="-20" kpx2="1192"/><pair kern="-20" kpx2="1258"/><pair kern="-20" kpx2="1063"/><pair kern="-20" kpx2="1120"/><pair kern="-20" kpx2="1060"/><pair kern="-20" kpx2="1256"/><pair kern="-20" kpx2="1150"/><pair kern="-20" kpx2="1268"/><pair kern="-20" kpx2="1269"/><pair kern="-20" kpx2="1148"/><pair kern="-20" kpx2="1206"/><pair kern="-20" kpx2="1146"/><pair kern="-20" kpx2="1207"/><pair kern="-20" kpx2="1144"/><pair kern="-20" kpx2="1208"/><pair kern="-20" kpx2="1209"/><pair kern="-49" kpx2="1214"/><pair kern="-20" kpx2="1138"/><pair kern="-49" kpx2="1212"/><pair kern="-20" kpx2="1136"/></kerning><kerning kpx1="211"><pair kern="-20" kpx2="258"/><pair kern="-20" kpx2="256"/><pair kern="-20" kpx2="260"/><pair kern="-9" kpx2="7922"/><pair kern="-9" kpx2="7926"/><pair kern="-9" kpx2="7924"/><pair kern="-9" kpx2="7928"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="44"/><pair kern="-29" kpx2="538"/><pair kern="-20" kpx2="65"/><pair kern="-20" kpx2="197"/><pair kern="-20" kpx2="196"/><pair kern="-20" kpx2="193"/><pair kern="-20" kpx2="192"/><pair kern="-9" kpx2="1029"/><pair kern="-20" kpx2="195"/><pair kern="-20" kpx2="194"/><pair kern="-9" kpx2="7812"/><pair kern="-9" kpx2="221"/><pair kern="-29" kpx2="84"/><pair kern="-9" kpx2="87"/><pair kern="-9" kpx2="86"/><pair kern="-9" kpx2="7808"/><pair kern="-9" kpx2="7810"/><pair kern="-40" kpx2="8218"/><pair kern="-9" kpx2="89"/><pair kern="-20" kpx2="88"/><pair kern="-40" kpx2="8222"/><pair kern="-20" kpx2="7680"/><pair kern="-9" kpx2="90"/><pair kern="-9" kpx2="372"/><pair kern="-20" kpx2="7862"/><pair kern="-9" kpx2="374"/><pair kern="-20" kpx2="7860"/><pair kern="-20" kpx2="7858"/><pair kern="-20" kpx2="506"/><pair kern="-20" kpx2="7856"/><pair kern="-9" kpx2="381"/><pair kern="-9" kpx2="377"/><pair kern="-9" kpx2="376"/><pair kern="-9" kpx2="379"/><pair kern="-29" kpx2="356"/><pair kern="-20" kpx2="7846"/><pair kern="-20" kpx2="7844"/><pair kern="-20" kpx2="7842"/><pair kern="-29" kpx2="354"/><pair kern="-20" kpx2="7840"/><pair kern="-20" kpx2="7854"/><pair kern="-20" kpx2="7852"/><pair kern="-20" kpx2="7850"/><pair kern="-20" kpx2="7848"/></kerning><kerning kpx1="1183"><pair kern="-20" kpx2="1153"/><pair kern="-20" kpx2="1092"/><pair kern="-20" kpx2="1228"/><pair kern="-20" kpx2="1297"/><pair kern="-20" kpx2="1095"/><pair kern="-20" kpx2="1089"/><pair kern="-20" kpx2="1239"/><pair kern="-20" kpx2="1293"/><pair kern="-20" kpx2="1283"/><pair kern="-20" kpx2="1108"/><pair kern="-20" kpx2="1281"/><pair kern="-20" kpx2="1105"/><pair kern="-20" kpx2="1104"/><pair kern="-20" kpx2="1255"/><pair kern="-20" kpx2="1195"/><pair kern="-20" kpx2="1193"/><pair kern="-20" kpx2="1259"/><pair kern="-20" kpx2="1257"/><pair kern="-20" kpx2="1149"/><pair kern="-20" kpx2="1269"/><pair kern="-20" kpx2="1147"/><pair kern="-20" kpx2="1086"/><pair kern="-20" kpx2="1207"/><pair kern="-20" kpx2="1145"/><pair kern="-20" kpx2="1209"/><pair kern="-20" kpx2="1139"/><pair kern="-20" kpx2="1215"/><pair kern="-20" kpx2="1077"/><pair kern="-20" kpx2="1213"/></kerning><kerning kpx1="1187"><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="8221"/></kerning><kerning kpx1="1186"><pair kern="109" kpx2="1032"/><pair kern="20" kpx2="1249"/><pair kern="-20" kpx2="1287"/><pair kern="-20" kpx2="1285"/></kerning><kerning kpx1="1185"><pair kern="-20" kpx2="1153"/><pair kern="-20" kpx2="1092"/><pair kern="-20" kpx2="1228"/><pair kern="-20" kpx2="1297"/><pair kern="-20" kpx2="1095"/><pair kern="-20" kpx2="1089"/><pair kern="-20" kpx2="1239"/><pair kern="-20" kpx2="1293"/><pair kern="-20" kpx2="1283"/><pair kern="-20" kpx2="1108"/><pair kern="-20" kpx2="1281"/><pair kern="-20" kpx2="1105"/><pair kern="-20" kpx2="1104"/><pair kern="-20" kpx2="1255"/><pair kern="-20" kpx2="1195"/><pair kern="-20" kpx2="1193"/><pair kern="-20" kpx2="1259"/><pair kern="-20" kpx2="1257"/><pair kern="-20" kpx2="1149"/><pair kern="-20" kpx2="1269"/><pair kern="-20" kpx2="1147"/><pair kern="-20" kpx2="1086"/><pair kern="-20" kpx2="1207"/><pair kern="-20" kpx2="1145"/><pair kern="-20" kpx2="1209"/><pair kern="-20" kpx2="1139"/><pair kern="-20" kpx2="1215"/><pair kern="-20" kpx2="1077"/><pair kern="-20" kpx2="1213"/></kerning><kerning kpx1="1184"><pair kern="-20" kpx2="1152"/><pair kern="-20" kpx2="1228"/><pair kern="-9" kpx2="1296"/><pair kern="-20" kpx2="1095"/><pair kern="-20" kpx2="1028"/><pair kern="-20" kpx2="1227"/><pair kern="-20" kpx2="1292"/><pair kern="-20" kpx2="1054"/><pair kern="-20" kpx2="1282"/><pair kern="-20" kpx2="1280"/><pair kern="-20" kpx2="1287"/><pair kern="-20" kpx2="1285"/><pair kern="-20" kpx2="1254"/><pair kern="-20" kpx2="1194"/><pair kern="-20" kpx2="1057"/><pair kern="-20" kpx2="1192"/><pair kern="-20" kpx2="1258"/><pair kern="-20" kpx2="1063"/><pair kern="-20" kpx2="1120"/><pair kern="-20" kpx2="1060"/><pair kern="-20" kpx2="1256"/><pair kern="-20" kpx2="1150"/><pair kern="-20" kpx2="1268"/><pair kern="-20" kpx2="1269"/><pair kern="-20" kpx2="1148"/><pair kern="-20" kpx2="1206"/><pair kern="-20" kpx2="1146"/><pair kern="-20" kpx2="1207"/><pair kern="-20" kpx2="1144"/><pair kern="-20" kpx2="1208"/><pair kern="-20" kpx2="1209"/><pair kern="-49" kpx2="1214"/><pair kern="-20" kpx2="1138"/><pair kern="-49" kpx2="1212"/><pair kern="-20" kpx2="1136"/></kerning><kerning kpx1="235"><pair kern="-9" kpx2="34"/><pair kern="-20" kpx2="373"/><pair kern="-9" kpx2="39"/><pair kern="-20" kpx2="7925"/><pair kern="-9" kpx2="380"/><pair kern="-9" kpx2="382"/><pair kern="-9" kpx2="378"/><pair kern="-20" kpx2="119"/><pair kern="-20" kpx2="118"/><pair kern="-20" kpx2="253"/><pair kern="-20" kpx2="7809"/><pair kern="-20" kpx2="7811"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="122"/><pair kern="-9" kpx2="8221"/><pair kern="-20" kpx2="121"/><pair kern="-20" kpx2="120"/></kerning><kerning kpx1="1191"><pair kern="-49" kpx2="1098"/><pair kern="-20" kpx2="1228"/><pair kern="-20" kpx2="1095"/><pair kern="-49" kpx2="1090"/><pair kern="-49" kpx2="1295"/><pair kern="-69" kpx2="8217"/><pair kern="-69" kpx2="1287"/><pair kern="-69" kpx2="8221"/><pair kern="-69" kpx2="1285"/><pair kern="-69" kpx2="34"/><pair kern="-49" kpx2="1185"/><pair kern="-69" kpx2="39"/><pair kern="-20" kpx2="1199"/><pair kern="-49" kpx2="1197"/><pair kern="-20" kpx2="1121"/><pair kern="-20" kpx2="1151"/><pair kern="-20" kpx2="1201"/><pair kern="-20" kpx2="1269"/><pair kern="-20" kpx2="1207"/><pair kern="-49" kpx2="1205"/><pair kern="-20" kpx2="1143"/><pair kern="-20" kpx2="1141"/><pair kern="-20" kpx2="1209"/><pair kern="-20" kpx2="1215"/><pair kern="-20" kpx2="1213"/></kerning><kerning kpx1="234"><pair kern="-9" kpx2="34"/><pair kern="-20" kpx2="373"/><pair kern="-9" kpx2="39"/><pair kern="-20" kpx2="7925"/><pair kern="-9" kpx2="380"/><pair kern="-9" kpx2="382"/><pair kern="-9" kpx2="378"/><pair kern="-20" kpx2="119"/><pair kern="-20" kpx2="118"/><pair kern="-20" kpx2="253"/><pair kern="-20" kpx2="7809"/><pair kern="-20" kpx2="7811"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="122"/><pair kern="-9" kpx2="8221"/><pair kern="-20" kpx2="121"/><pair kern="-20" kpx2="120"/></kerning><kerning kpx1="1190"><pair kern="49" kpx2="1032"/><pair kern="-49" kpx2="1035"/><pair kern="-40" kpx2="1098"/><pair kern="-20" kpx2="1228"/><pair kern="-49" kpx2="1026"/><pair kern="-20" kpx2="1095"/><pair kern="-60" kpx2="1227"/><pair kern="-40" kpx2="1090"/><pair kern="-49" kpx2="1294"/><pair kern="-40" kpx2="1295"/><pair kern="-80" kpx2="8217"/><pair kern="-89" kpx2="1286"/><pair kern="-40" kpx2="1287"/><pair kern="-89" kpx2="1284"/><pair kern="-80" kpx2="8221"/><pair kern="-40" kpx2="1285"/><pair kern="-49" kpx2="1066"/><pair kern="-80" kpx2="34"/><pair kern="-40" kpx2="1185"/><pair kern="-49" kpx2="1184"/><pair kern="-80" kpx2="39"/><pair kern="-89" kpx2="1058"/><pair kern="-60" kpx2="1063"/><pair kern="-49" kpx2="1198"/><pair kern="-40" kpx2="1197"/><pair kern="-89" kpx2="1196"/><pair kern="-60" kpx2="1268"/><pair kern="-49" kpx2="1200"/><pair kern="-20" kpx2="1269"/><pair kern="-60" kpx2="1206"/><pair kern="-20" kpx2="1207"/><pair kern="-49" kpx2="1204"/><pair kern="-40" kpx2="1205"/><pair kern="-69" kpx2="1142"/><pair kern="-60" kpx2="1208"/><pair kern="-20" kpx2="1209"/><pair kern="-69" kpx2="1140"/><pair kern="-29" kpx2="1214"/><pair kern="-20" kpx2="1215"/><pair kern="-29" kpx2="1212"/><pair kern="-20" kpx2="1213"/><pair kern="-60" kpx2="1136"/></kerning><kerning kpx1="233"><pair kern="-9" kpx2="34"/><pair kern="-20" kpx2="373"/><pair kern="-9" kpx2="39"/><pair kern="-20" kpx2="7925"/><pair kern="-9" kpx2="380"/><pair kern="-9" kpx2="382"/><pair kern="-9" kpx2="378"/><pair kern="-20" kpx2="119"/><pair kern="-20" kpx2="118"/><pair kern="-20" kpx2="253"/><pair kern="-20" kpx2="7809"/><pair kern="-20" kpx2="7811"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="122"/><pair kern="-9" kpx2="8221"/><pair kern="-20" kpx2="121"/><pair kern="-20" kpx2="120"/></kerning><kerning kpx1="1189"><pair kern="-9" kpx2="1153"/><pair kern="-29" kpx2="1222"/><pair kern="-29" kpx2="1299"/><pair kern="-9" kpx2="1092"/><pair kern="-9" kpx2="1297"/><pair kern="-9" kpx2="1089"/><pair kern="-20" kpx2="8211"/><pair kern="-29" kpx2="1289"/><pair kern="-9" kpx2="1239"/><pair kern="-29" kpx2="1113"/><pair kern="-20" kpx2="8213"/><pair kern="-9" kpx2="1293"/><pair kern="-20" kpx2="8212"/><pair kern="-9" kpx2="1283"/><pair kern="-9" kpx2="1108"/><pair kern="-49" kpx2="8218"/><pair kern="-9" kpx2="1281"/><pair kern="-9" kpx2="1105"/><pair kern="-49" kpx2="8222"/><pair kern="-9" kpx2="1104"/><pair kern="-9" kpx2="1255"/><pair kern="-9" kpx2="1195"/><pair kern="-29" kpx2="1127"/><pair kern="-9" kpx2="1193"/><pair kern="-9" kpx2="1259"/><pair kern="-49" kpx2="46"/><pair kern="-9" kpx2="1257"/><pair kern="-49" kpx2="44"/><pair kern="-20" kpx2="45"/><pair kern="-29" kpx2="1083"/><pair kern="-9" kpx2="1149"/><pair kern="-9" kpx2="1147"/><pair kern="-9" kpx2="1086"/><pair kern="-9" kpx2="1145"/><pair kern="-9" kpx2="1139"/><pair kern="-9" kpx2="1077"/><pair kern="-29" kpx2="1076"/></kerning><kerning kpx1="232"><pair kern="-9" kpx2="34"/><pair kern="-20" kpx2="373"/><pair kern="-9" kpx2="39"/><pair kern="-20" kpx2="7925"/><pair kern="-9" kpx2="380"/><pair kern="-9" kpx2="382"/><pair kern="-9" kpx2="378"/><pair kern="-20" kpx2="119"/><pair kern="-20" kpx2="118"/><pair kern="-20" kpx2="253"/><pair kern="-20" kpx2="7809"/><pair kern="-20" kpx2="7811"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="122"/><pair kern="-9" kpx2="8221"/><pair kern="-20" kpx2="121"/><pair kern="-20" kpx2="120"/></kerning><kerning kpx1="1188"><pair kern="-29" kpx2="1100"/><pair kern="-20" kpx2="1101"/><pair kern="-29" kpx2="1102"/><pair kern="-29" kpx2="1096"/><pair kern="-29" kpx2="1097"/><pair kern="-29" kpx2="1099"/><pair kern="-40" kpx2="1092"/><pair kern="-20" kpx2="1093"/><pair kern="-29" kpx2="1094"/><pair kern="-49" kpx2="1095"/><pair kern="-29" kpx2="1088"/><pair kern="-40" kpx2="1089"/><pair kern="-29" kpx2="1117"/><pair kern="-29" kpx2="1116"/><pair kern="-29" kpx2="1119"/><pair kern="-49" kpx2="1113"/><pair kern="20" kpx2="1115"/><pair kern="-29" kpx2="1114"/><pair kern="-29" kpx2="1109"/><pair kern="-40" kpx2="1108"/><pair kern="-40" kpx2="1105"/><pair kern="-40" kpx2="1104"/><pair kern="-29" kpx2="1107"/><pair kern="20" kpx2="1106"/><pair kern="-29" kpx2="1133"/><pair kern="-20" kpx2="1131"/><pair kern="-29" kpx2="1129"/><pair kern="-60" kpx2="1126"/><pair kern="-49" kpx2="1127"/><pair kern="-29" kpx2="1125"/><pair kern="-49" kpx2="46"/><pair kern="-49" kpx2="44"/><pair kern="-20" kpx2="1120"/><pair kern="-20" kpx2="45"/><pair kern="-20" kpx2="1150"/><pair kern="-40" kpx2="1149"/><pair kern="-20" kpx2="1148"/><pair kern="-40" kpx2="1147"/><pair kern="-20" kpx2="1146"/><pair kern="-40" kpx2="1145"/><pair kern="-20" kpx2="1144"/><pair kern="-40" kpx2="1139"/><pair kern="-20" kpx2="1138"/><pair kern="-29" kpx2="1137"/><pair kern="-40" kpx2="1033"/><pair kern="20" kpx2="1035"/><pair kern="-49" kpx2="1299"/><pair kern="-40" kpx2="1298"/><pair kern="-40" kpx2="1297"/><pair kern="20" kpx2="1026"/><pair kern="-20" kpx2="1028"/><pair kern="-20" kpx2="8211"/><pair kern="-29" kpx2="1291"/><pair kern="-40" kpx2="1288"/><pair kern="-40" kpx2="1051"/><pair kern="-49" kpx2="1289"/><pair kern="20" kpx2="1294"/><pair kern="-20" kpx2="1292"/><pair kern="-20" kpx2="8213"/><pair kern="-40" kpx2="1293"/><pair kern="-20" kpx2="1054"/><pair kern="-20" kpx2="8212"/><pair kern="-49" kpx2="1282"/><pair kern="-40" kpx2="1283"/><pair kern="-60" kpx2="1040"/><pair kern="-49" kpx2="8218"/><pair kern="-49" kpx2="1280"/><pair kern="-40" kpx2="1281"/><pair kern="-20" kpx2="1287"/><pair kern="-40" kpx2="1044"/><pair kern="-49" kpx2="8222"/><pair kern="-20" kpx2="1285"/><pair kern="20" kpx2="1066"/><pair kern="20" kpx2="1058"/><pair kern="-20" kpx2="1057"/><pair kern="-29" kpx2="1060"/><pair kern="-49" kpx2="1083"/><pair kern="-29" kpx2="1082"/><pair kern="-29" kpx2="1081"/><pair kern="-29" kpx2="1080"/><pair kern="-29" kpx2="1087"/><pair kern="-40" kpx2="1086"/><pair kern="-29" kpx2="1085"/><pair kern="-29" kpx2="1084"/><pair kern="-29" kpx2="1075"/><pair kern="-29" kpx2="1074"/><pair kern="-20" kpx2="1079"/><pair kern="-20" kpx2="1078"/><pair kern="-40" kpx2="1077"/><pair kern="-49" kpx2="1076"/><pair kern="-40" kpx2="1221"/><pair kern="-29" kpx2="1220"/><pair kern="-49" kpx2="1222"/><pair kern="-20" kpx2="1218"/><pair kern="-49" kpx2="1228"/><pair kern="-29" kpx2="1230"/><pair kern="-29" kpx2="1224"/><pair kern="-29" kpx2="1226"/><pair kern="-60" kpx2="1236"/><pair kern="-40" kpx2="1239"/><pair kern="-60" kpx2="1232"/><pair kern="-60" kpx2="1234"/><pair kern="-20" kpx2="1245"/><pair kern="-20" kpx2="1247"/><pair kern="-40" kpx2="1255"/><pair kern="-20" kpx2="1254"/><pair kern="-29" kpx2="1253"/><pair kern="-29" kpx2="1251"/><pair kern="-20" kpx2="1261"/><pair kern="-40" kpx2="1259"/><pair kern="-20" kpx2="1258"/><pair kern="-40" kpx2="1257"/><pair kern="-20" kpx2="1256"/><pair kern="-29" kpx2="1271"/><pair kern="-49" kpx2="1269"/><pair kern="-20" kpx2="1279"/><pair kern="-20" kpx2="1277"/><pair kern="-29" kpx2="1273"/><pair kern="-40" kpx2="1153"/><pair kern="-20" kpx2="1152"/><pair kern="-29" kpx2="1163"/><pair kern="20" kpx2="1165"/><pair kern="-29" kpx2="1167"/><pair kern="-29" kpx2="1169"/><pair kern="-29" kpx2="1173"/><pair kern="-20" kpx2="1175"/><pair kern="-20" kpx2="1177"/><pair kern="-29" kpx2="1179"/><pair kern="-29" kpx2="1181"/><pair kern="20" kpx2="1183"/><pair kern="-29" kpx2="1187"/><pair kern="20" kpx2="1184"/><pair kern="-29" kpx2="1191"/><pair kern="-29" kpx2="1189"/><pair kern="-40" kpx2="1195"/><pair kern="-20" kpx2="1194"/><pair kern="-40" kpx2="1193"/><pair kern="-20" kpx2="1192"/><pair kern="20" kpx2="1196"/><pair kern="-20" kpx2="1203"/><pair kern="-49" kpx2="1207"/><pair kern="20" kpx2="1204"/><pair kern="-29" kpx2="1211"/><pair kern="-49" kpx2="1209"/><pair kern="-20" kpx2="1214"/><pair kern="-29" kpx2="1215"/><pair kern="-20" kpx2="1212"/><pair kern="-29" kpx2="1213"/></kerning><kerning kpx1="1194"><pair kern="-20" kpx2="1152"/><pair kern="-20" kpx2="1228"/><pair kern="-20" kpx2="1095"/><pair kern="-20" kpx2="1028"/><pair kern="-20" kpx2="1292"/><pair kern="-20" kpx2="1054"/><pair kern="-20" kpx2="1282"/><pair kern="-20" kpx2="1280"/><pair kern="-20" kpx2="1287"/><pair kern="-20" kpx2="1285"/><pair kern="-20" kpx2="1254"/><pair kern="-20" kpx2="1194"/><pair kern="-20" kpx2="1057"/><pair kern="-20" kpx2="1192"/><pair kern="-20" kpx2="1258"/><pair kern="-20" kpx2="1120"/><pair kern="-20" kpx2="1060"/><pair kern="-20" kpx2="1256"/><pair kern="-20" kpx2="1150"/><pair kern="-20" kpx2="1148"/><pair kern="-20" kpx2="1269"/><pair kern="-20" kpx2="1146"/><pair kern="-20" kpx2="1207"/><pair kern="-20" kpx2="1144"/><pair kern="-20" kpx2="1209"/><pair kern="-20" kpx2="1214"/><pair kern="-20" kpx2="1138"/><pair kern="-20" kpx2="1212"/></kerning><kerning kpx1="229"><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="8221"/></kerning><kerning kpx1="1193"><pair kern="-9" kpx2="1098"/><pair kern="-20" kpx2="1218"/><pair kern="-20" kpx2="1093"/><pair kern="-9" kpx2="1228"/><pair kern="-9" kpx2="1095"/><pair kern="-9" kpx2="1090"/><pair kern="-9" kpx2="1091"/><pair kern="-9" kpx2="1118"/><pair kern="-9" kpx2="1295"/><pair kern="-20" kpx2="1175"/><pair kern="-20" kpx2="1245"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="1287"/><pair kern="-9" kpx2="8221"/><pair kern="-9" kpx2="1285"/><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="1185"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="1263"/><pair kern="-9" kpx2="1197"/><pair kern="-20" kpx2="1203"/><pair kern="-9" kpx2="1269"/><pair kern="-9" kpx2="1207"/><pair kern="-9" kpx2="1267"/><pair kern="-9" kpx2="1205"/><pair kern="-9" kpx2="1265"/><pair kern="-20" kpx2="1279"/><pair kern="-20" kpx2="1277"/><pair kern="-9" kpx2="1209"/><pair kern="-20" kpx2="1078"/></kerning><kerning kpx1="228"><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="8221"/></kerning><kerning kpx1="1192"><pair kern="-20" kpx2="1066"/><pair kern="-9" kpx2="1200"/><pair kern="-20" kpx2="1184"/><pair kern="-20" kpx2="1035"/><pair kern="-20" kpx2="1294"/><pair kern="-20" kpx2="1204"/><pair kern="-29" kpx2="1058"/><pair kern="-9" kpx2="1142"/><pair kern="-20" kpx2="1026"/><pair kern="-9" kpx2="1140"/><pair kern="-20" kpx2="1286"/><pair kern="-9" kpx2="1198"/><pair kern="-20" kpx2="1284"/><pair kern="-29" kpx2="1196"/></kerning><kerning kpx1="227"><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="8221"/></kerning><kerning kpx1="1199"><pair kern="-9" kpx2="1083"/><pair kern="-9" kpx2="1289"/><pair kern="-9" kpx2="1222"/><pair kern="-9" kpx2="1113"/><pair kern="-9" kpx2="1299"/><pair kern="-9" kpx2="1127"/><pair kern="-40" kpx2="8218"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="8222"/><pair kern="-40" kpx2="44"/><pair kern="-9" kpx2="1076"/></kerning><kerning kpx1="226"><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="8221"/></kerning><kerning kpx1="1198"><pair kern="-29" kpx2="1100"/><pair kern="-29" kpx2="1102"/><pair kern="-20" kpx2="1103"/><pair kern="-29" kpx2="1096"/><pair kern="-29" kpx2="1097"/><pair kern="-29" kpx2="1099"/><pair kern="-49" kpx2="1092"/><pair kern="-29" kpx2="1094"/><pair kern="-40" kpx2="1095"/><pair kern="-29" kpx2="1088"/><pair kern="-49" kpx2="1089"/><pair kern="-29" kpx2="1117"/><pair kern="-29" kpx2="1116"/><pair kern="-29" kpx2="1119"/><pair kern="-49" kpx2="1113"/><pair kern="20" kpx2="1115"/><pair kern="-29" kpx2="1114"/><pair kern="-40" kpx2="1109"/><pair kern="-49" kpx2="1108"/><pair kern="-49" kpx2="1105"/><pair kern="-49" kpx2="1104"/><pair kern="-29" kpx2="1107"/><pair kern="20" kpx2="1106"/><pair kern="-29" kpx2="1133"/><pair kern="-20" kpx2="1131"/><pair kern="-29" kpx2="1129"/><pair kern="-60" kpx2="1126"/><pair kern="-49" kpx2="1127"/><pair kern="-29" kpx2="1125"/><pair kern="-60" kpx2="46"/><pair kern="-60" kpx2="44"/><pair kern="-20" kpx2="1120"/><pair kern="-20" kpx2="1150"/><pair kern="-49" kpx2="1149"/><pair kern="-20" kpx2="1148"/><pair kern="-49" kpx2="1147"/><pair kern="-20" kpx2="1146"/><pair kern="-49" kpx2="1145"/><pair kern="-20" kpx2="1144"/><pair kern="-49" kpx2="1139"/><pair kern="-20" kpx2="1138"/><pair kern="-20" kpx2="1137"/><pair kern="-40" kpx2="1033"/><pair kern="-49" kpx2="1299"/><pair kern="-40" kpx2="1298"/><pair kern="-49" kpx2="1297"/><pair kern="-9" kpx2="1296"/><pair kern="-20" kpx2="1028"/><pair kern="-29" kpx2="1291"/><pair kern="-40" kpx2="1288"/><pair kern="-40" kpx2="1051"/><pair kern="-49" kpx2="1289"/><pair kern="-20" kpx2="1292"/><pair kern="-49" kpx2="1293"/><pair kern="-20" kpx2="1054"/><pair kern="-40" kpx2="1282"/><pair kern="-49" kpx2="1283"/><pair kern="-60" kpx2="8218"/><pair kern="-60" kpx2="1040"/><pair kern="-40" kpx2="1280"/><pair kern="-49" kpx2="1281"/><pair kern="-20" kpx2="1287"/><pair kern="-60" kpx2="8222"/><pair kern="-40" kpx2="1044"/><pair kern="-20" kpx2="1285"/><pair kern="-20" kpx2="1057"/><pair kern="-29" kpx2="1060"/><pair kern="-49" kpx2="1083"/><pair kern="-29" kpx2="1082"/><pair kern="-29" kpx2="1081"/><pair kern="-29" kpx2="1080"/><pair kern="-29" kpx2="1087"/><pair kern="-49" kpx2="1086"/><pair kern="-29" kpx2="1085"/><pair kern="-29" kpx2="1084"/><pair kern="-29" kpx2="1075"/><pair kern="-29" kpx2="1074"/><pair kern="-40" kpx2="1072"/><pair kern="-49" kpx2="1077"/><pair kern="-49" kpx2="1076"/><pair kern="-40" kpx2="1221"/><pair kern="-29" kpx2="1220"/><pair kern="-49" kpx2="1222"/><pair kern="-40" kpx2="1228"/><pair kern="-29" kpx2="1230"/><pair kern="-29" kpx2="1224"/><pair kern="-29" kpx2="1226"/><pair kern="-60" kpx2="1236"/><pair kern="-40" kpx2="1237"/><pair kern="-49" kpx2="1239"/><pair kern="-60" kpx2="1232"/><pair kern="-40" kpx2="1233"/><pair kern="-60" kpx2="1234"/><pair kern="-40" kpx2="1235"/><pair kern="-9" kpx2="1240"/><pair kern="-40" kpx2="1241"/><pair kern="-9" kpx2="1242"/><pair kern="-40" kpx2="1243"/><pair kern="-49" kpx2="1255"/><pair kern="-20" kpx2="1254"/><pair kern="-29" kpx2="1253"/><pair kern="-29" kpx2="1251"/><pair kern="-49" kpx2="1259"/><pair kern="-20" kpx2="1258"/><pair kern="-49" kpx2="1257"/><pair kern="-20" kpx2="1256"/><pair kern="-29" kpx2="1271"/><pair kern="-40" kpx2="1269"/><pair kern="-29" kpx2="1273"/><pair kern="-49" kpx2="1153"/><pair kern="-20" kpx2="1152"/><pair kern="-29" kpx2="1163"/><pair kern="20" kpx2="1165"/><pair kern="-29" kpx2="1167"/><pair kern="-29" kpx2="1169"/><pair kern="-29" kpx2="1173"/><pair kern="-29" kpx2="1179"/><pair kern="-29" kpx2="1181"/><pair kern="20" kpx2="1183"/><pair kern="-29" kpx2="1187"/><pair kern="-29" kpx2="1191"/><pair kern="-29" kpx2="1189"/><pair kern="-49" kpx2="1195"/><pair kern="-20" kpx2="1194"/><pair kern="-49" kpx2="1193"/><pair kern="-20" kpx2="1192"/><pair kern="-40" kpx2="1207"/><pair kern="-29" kpx2="1211"/><pair kern="-40" kpx2="1209"/><pair kern="-40" kpx2="1215"/><pair kern="-40" kpx2="1213"/></kerning><kerning kpx1="225"><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="8221"/></kerning><kerning kpx1="1197"><pair kern="-9" kpx2="1153"/><pair kern="-29" kpx2="1222"/><pair kern="-29" kpx2="1299"/><pair kern="-9" kpx2="1092"/><pair kern="-9" kpx2="1297"/><pair kern="-9" kpx2="1089"/><pair kern="-20" kpx2="8211"/><pair kern="-29" kpx2="1289"/><pair kern="-9" kpx2="1239"/><pair kern="-29" kpx2="1113"/><pair kern="-20" kpx2="8213"/><pair kern="-9" kpx2="1293"/><pair kern="-20" kpx2="8212"/><pair kern="-9" kpx2="1283"/><pair kern="-9" kpx2="1108"/><pair kern="-49" kpx2="8218"/><pair kern="-9" kpx2="1281"/><pair kern="-9" kpx2="1105"/><pair kern="-49" kpx2="8222"/><pair kern="-9" kpx2="1104"/><pair kern="-9" kpx2="1255"/><pair kern="-9" kpx2="1195"/><pair kern="-29" kpx2="1127"/><pair kern="-9" kpx2="1193"/><pair kern="-9" kpx2="1259"/><pair kern="-49" kpx2="46"/><pair kern="-9" kpx2="1257"/><pair kern="-49" kpx2="44"/><pair kern="-20" kpx2="45"/><pair kern="-29" kpx2="1083"/><pair kern="-9" kpx2="1149"/><pair kern="-9" kpx2="1147"/><pair kern="-9" kpx2="1086"/><pair kern="-9" kpx2="1145"/><pair kern="-9" kpx2="1139"/><pair kern="-9" kpx2="1077"/><pair kern="-29" kpx2="1076"/></kerning><kerning kpx1="224"><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="8221"/></kerning><kerning kpx1="1196"><pair kern="-49" kpx2="1100"/><pair kern="-20" kpx2="1101"/><pair kern="-49" kpx2="1102"/><pair kern="-29" kpx2="1103"/><pair kern="-49" kpx2="1096"/><pair kern="-49" kpx2="1097"/><pair kern="-40" kpx2="1098"/><pair kern="-49" kpx2="1099"/><pair kern="-69" kpx2="1092"/><pair kern="-20" kpx2="1093"/><pair kern="-49" kpx2="1094"/><pair kern="-49" kpx2="1095"/><pair kern="-49" kpx2="1088"/><pair kern="-69" kpx2="1089"/><pair kern="-40" kpx2="1090"/><pair kern="-40" kpx2="1091"/><pair kern="-49" kpx2="1117"/><pair kern="-49" kpx2="1116"/><pair kern="-49" kpx2="1119"/><pair kern="-40" kpx2="1118"/><pair kern="-60" kpx2="1113"/><pair kern="-49" kpx2="1114"/><pair kern="-60" kpx2="1109"/><pair kern="-69" kpx2="1108"/><pair kern="-69" kpx2="1105"/><pair kern="-69" kpx2="1104"/><pair kern="-49" kpx2="1107"/><pair kern="-49" kpx2="1133"/><pair kern="-49" kpx2="1131"/><pair kern="-49" kpx2="1129"/><pair kern="-69" kpx2="1126"/><pair kern="-60" kpx2="1127"/><pair kern="-49" kpx2="1125"/><pair kern="-60" kpx2="46"/><pair kern="-60" kpx2="44"/><pair kern="-20" kpx2="1120"/><pair kern="-40" kpx2="45"/><pair kern="-20" kpx2="1121"/><pair kern="-20" kpx2="1151"/><pair kern="-20" kpx2="1150"/><pair kern="-69" kpx2="1149"/><pair kern="-20" kpx2="1148"/><pair kern="-69" kpx2="1147"/><pair kern="-20" kpx2="1146"/><pair kern="-69" kpx2="1145"/><pair kern="-20" kpx2="1144"/><pair kern="-20" kpx2="1143"/><pair kern="-20" kpx2="1141"/><pair kern="-69" kpx2="1139"/><pair kern="-20" kpx2="1138"/><pair kern="-49" kpx2="1137"/><pair kern="-49" kpx2="1033"/><pair kern="-60" kpx2="1299"/><pair kern="-49" kpx2="1298"/><pair kern="-69" kpx2="1297"/><pair kern="-20" kpx2="1028"/><pair kern="-40" kpx2="8211"/><pair kern="-49" kpx2="1291"/><pair kern="-49" kpx2="1288"/><pair kern="-49" kpx2="1051"/><pair kern="-60" kpx2="1289"/><pair kern="-40" kpx2="1295"/><pair kern="-20" kpx2="1292"/><pair kern="-40" kpx2="8213"/><pair kern="-69" kpx2="1293"/><pair kern="-20" kpx2="1054"/><pair kern="-40" kpx2="8212"/><pair kern="-69" kpx2="1282"/><pair kern="-69" kpx2="1283"/><pair kern="-69" kpx2="1040"/><pair kern="-60" kpx2="8218"/><pair kern="-69" kpx2="1280"/><pair kern="-69" kpx2="1281"/><pair kern="-49" kpx2="1287"/><pair kern="-49" kpx2="1044"/><pair kern="-60" kpx2="8222"/><pair kern="-49" kpx2="1285"/><pair kern="20" kpx2="1058"/><pair kern="-20" kpx2="1057"/><pair kern="-40" kpx2="1060"/><pair kern="-60" kpx2="1083"/><pair kern="-49" kpx2="1082"/><pair kern="-49" kpx2="1081"/><pair kern="-49" kpx2="1080"/><pair kern="-49" kpx2="1087"/><pair kern="-69" kpx2="1086"/><pair kern="-49" kpx2="1085"/><pair kern="-49" kpx2="1084"/><pair kern="-49" kpx2="1075"/><pair kern="-49" kpx2="1074"/><pair kern="-20" kpx2="1079"/><pair kern="-20" kpx2="1078"/><pair kern="-69" kpx2="1077"/><pair kern="-60" kpx2="1076"/><pair kern="-49" kpx2="1221"/><pair kern="-49" kpx2="1220"/><pair kern="-60" kpx2="1222"/><pair kern="-20" kpx2="1218"/><pair kern="-49" kpx2="1228"/><pair kern="-49" kpx2="1230"/><pair kern="-49" kpx2="1224"/><pair kern="-49" kpx2="1226"/><pair kern="-69" kpx2="1236"/><pair kern="-69" kpx2="1239"/><pair kern="-69" kpx2="1232"/><pair kern="-69" kpx2="1234"/><pair kern="-20" kpx2="1245"/><pair kern="-20" kpx2="1247"/><pair kern="-69" kpx2="1255"/><pair kern="-20" kpx2="1254"/><pair kern="-49" kpx2="1253"/><pair kern="-49" kpx2="1251"/><pair kern="-29" kpx2="1249"/><pair kern="-40" kpx2="1263"/><pair kern="-20" kpx2="1261"/><pair kern="-69" kpx2="1259"/><pair kern="-20" kpx2="1258"/><pair kern="-69" kpx2="1257"/><pair kern="-20" kpx2="1256"/><pair kern="-49" kpx2="1271"/><pair kern="-49" kpx2="1269"/><pair kern="-40" kpx2="1267"/><pair kern="-40" kpx2="1265"/><pair kern="-20" kpx2="1279"/><pair kern="-20" kpx2="1277"/><pair kern="-49" kpx2="1273"/><pair kern="-69" kpx2="1153"/><pair kern="-20" kpx2="1152"/><pair kern="-49" kpx2="1163"/><pair kern="-49" kpx2="1167"/><pair kern="-49" kpx2="1169"/><pair kern="-49" kpx2="1173"/><pair kern="-20" kpx2="1175"/><pair kern="-20" kpx2="1177"/><pair kern="-49" kpx2="1179"/><pair kern="-49" kpx2="1181"/><pair kern="-49" kpx2="1187"/><pair kern="-40" kpx2="1185"/><pair kern="-49" kpx2="1191"/><pair kern="-49" kpx2="1189"/><pair kern="-69" kpx2="1195"/><pair kern="-20" kpx2="1194"/><pair kern="-69" kpx2="1193"/><pair kern="-20" kpx2="1192"/><pair kern="-40" kpx2="1199"/><pair kern="-40" kpx2="1197"/><pair kern="20" kpx2="1196"/><pair kern="-20" kpx2="1203"/><pair kern="-40" kpx2="1201"/><pair kern="-49" kpx2="1207"/><pair kern="-40" kpx2="1205"/><pair kern="-49" kpx2="1211"/><pair kern="-49" kpx2="1209"/><pair kern="-49" kpx2="1214"/><pair kern="-69" kpx2="1215"/><pair kern="-49" kpx2="1212"/><pair kern="-69" kpx2="1213"/></kerning><kerning kpx1="254"><pair kern="-9" kpx2="34"/><pair kern="-20" kpx2="373"/><pair kern="-9" kpx2="39"/><pair kern="-20" kpx2="7925"/><pair kern="-9" kpx2="380"/><pair kern="-9" kpx2="382"/><pair kern="-9" kpx2="378"/><pair kern="-20" kpx2="119"/><pair kern="-20" kpx2="118"/><pair kern="-20" kpx2="253"/><pair kern="-20" kpx2="7809"/><pair kern="-20" kpx2="7811"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="122"/><pair kern="-9" kpx2="8221"/><pair kern="-20" kpx2="121"/><pair kern="-20" kpx2="120"/></kerning><kerning kpx1="1202"><pair kern="109" kpx2="1032"/><pair kern="-20" kpx2="1152"/><pair kern="-20" kpx2="1098"/><pair kern="-40" kpx2="1228"/><pair kern="-40" kpx2="1095"/><pair kern="-20" kpx2="1028"/><pair kern="-20" kpx2="1090"/><pair kern="-20" kpx2="1295"/><pair kern="-20" kpx2="1292"/><pair kern="-20" kpx2="1054"/><pair kern="-20" kpx2="1287"/><pair kern="-20" kpx2="1285"/><pair kern="-20" kpx2="1254"/><pair kern="29" kpx2="1135"/><pair kern="-20" kpx2="1185"/><pair kern="-20" kpx2="1194"/><pair kern="-20" kpx2="1057"/><pair kern="-20" kpx2="1192"/><pair kern="-20" kpx2="1258"/><pair kern="-20" kpx2="1120"/><pair kern="-29" kpx2="1060"/><pair kern="-20" kpx2="1197"/><pair kern="-20" kpx2="1256"/><pair kern="-20" kpx2="1150"/><pair kern="-40" kpx2="1269"/><pair kern="-20" kpx2="1148"/><pair kern="-20" kpx2="1146"/><pair kern="-40" kpx2="1207"/><pair kern="-20" kpx2="1144"/><pair kern="-20" kpx2="1205"/><pair kern="-40" kpx2="1209"/><pair kern="-29" kpx2="1214"/><pair kern="-20" kpx2="1215"/><pair kern="-20" kpx2="1138"/><pair kern="-29" kpx2="1212"/><pair kern="-9" kpx2="1137"/><pair kern="-20" kpx2="1213"/></kerning><kerning kpx1="255"><pair kern="40" kpx2="34"/><pair kern="40" kpx2="39"/><pair kern="-40" kpx2="8218"/><pair kern="40" kpx2="8217"/><pair kern="20" kpx2="63"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="8222"/><pair kern="40" kpx2="8221"/><pair kern="-40" kpx2="44"/></kerning><kerning kpx1="1203"><pair kern="-9" kpx2="1153"/><pair kern="-9" kpx2="1092"/><pair kern="-9" kpx2="1228"/><pair kern="-9" kpx2="1297"/><pair kern="-9" kpx2="1095"/><pair kern="-9" kpx2="1089"/><pair kern="-9" kpx2="1239"/><pair kern="-9" kpx2="1293"/><pair kern="-9" kpx2="1283"/><pair kern="-9" kpx2="1108"/><pair kern="-9" kpx2="1281"/><pair kern="-9" kpx2="1105"/><pair kern="-20" kpx2="1287"/><pair kern="-9" kpx2="1104"/><pair kern="-20" kpx2="1285"/><pair kern="-9" kpx2="1255"/><pair kern="-9" kpx2="1195"/><pair kern="-9" kpx2="1193"/><pair kern="-9" kpx2="1259"/><pair kern="-9" kpx2="1257"/><pair kern="-9" kpx2="1149"/><pair kern="-9" kpx2="1269"/><pair kern="-9" kpx2="1147"/><pair kern="-9" kpx2="1086"/><pair kern="-9" kpx2="1207"/><pair kern="-9" kpx2="1145"/><pair kern="-9" kpx2="1209"/><pair kern="-9" kpx2="1139"/><pair kern="-9" kpx2="1077"/></kerning><kerning kpx1="1200"><pair kern="-29" kpx2="1100"/><pair kern="-29" kpx2="1102"/><pair kern="-20" kpx2="1103"/><pair kern="-29" kpx2="1096"/><pair kern="-29" kpx2="1097"/><pair kern="-29" kpx2="1099"/><pair kern="-49" kpx2="1092"/><pair kern="-29" kpx2="1094"/><pair kern="-40" kpx2="1095"/><pair kern="-29" kpx2="1088"/><pair kern="-49" kpx2="1089"/><pair kern="-29" kpx2="1117"/><pair kern="-29" kpx2="1116"/><pair kern="-29" kpx2="1119"/><pair kern="-49" kpx2="1113"/><pair kern="20" kpx2="1115"/><pair kern="-29" kpx2="1114"/><pair kern="-40" kpx2="1109"/><pair kern="-49" kpx2="1108"/><pair kern="-49" kpx2="1105"/><pair kern="-49" kpx2="1104"/><pair kern="-29" kpx2="1107"/><pair kern="20" kpx2="1106"/><pair kern="-29" kpx2="1133"/><pair kern="-20" kpx2="1131"/><pair kern="-29" kpx2="1129"/><pair kern="-60" kpx2="1126"/><pair kern="-49" kpx2="1127"/><pair kern="-29" kpx2="1125"/><pair kern="-60" kpx2="46"/><pair kern="-60" kpx2="44"/><pair kern="-20" kpx2="1120"/><pair kern="-20" kpx2="1150"/><pair kern="-49" kpx2="1149"/><pair kern="-20" kpx2="1148"/><pair kern="-49" kpx2="1147"/><pair kern="-20" kpx2="1146"/><pair kern="-49" kpx2="1145"/><pair kern="-20" kpx2="1144"/><pair kern="-49" kpx2="1139"/><pair kern="-20" kpx2="1138"/><pair kern="-20" kpx2="1137"/><pair kern="-40" kpx2="1033"/><pair kern="-49" kpx2="1299"/><pair kern="-40" kpx2="1298"/><pair kern="-49" kpx2="1297"/><pair kern="-9" kpx2="1296"/><pair kern="-20" kpx2="1028"/><pair kern="-29" kpx2="1291"/><pair kern="-40" kpx2="1288"/><pair kern="-40" kpx2="1051"/><pair kern="-49" kpx2="1289"/><pair kern="-20" kpx2="1292"/><pair kern="-49" kpx2="1293"/><pair kern="-20" kpx2="1054"/><pair kern="-40" kpx2="1282"/><pair kern="-49" kpx2="1283"/><pair kern="-60" kpx2="8218"/><pair kern="-60" kpx2="1040"/><pair kern="-40" kpx2="1280"/><pair kern="-49" kpx2="1281"/><pair kern="-20" kpx2="1287"/><pair kern="-60" kpx2="8222"/><pair kern="-40" kpx2="1044"/><pair kern="-20" kpx2="1285"/><pair kern="-20" kpx2="1057"/><pair kern="-29" kpx2="1060"/><pair kern="-49" kpx2="1083"/><pair kern="-29" kpx2="1082"/><pair kern="-29" kpx2="1081"/><pair kern="-29" kpx2="1080"/><pair kern="-29" kpx2="1087"/><pair kern="-49" kpx2="1086"/><pair kern="-29" kpx2="1085"/><pair kern="-29" kpx2="1084"/><pair kern="-29" kpx2="1075"/><pair kern="-29" kpx2="1074"/><pair kern="-40" kpx2="1072"/><pair kern="-49" kpx2="1077"/><pair kern="-49" kpx2="1076"/><pair kern="-40" kpx2="1221"/><pair kern="-29" kpx2="1220"/><pair kern="-49" kpx2="1222"/><pair kern="-40" kpx2="1228"/><pair kern="-29" kpx2="1230"/><pair kern="-29" kpx2="1224"/><pair kern="-29" kpx2="1226"/><pair kern="-60" kpx2="1236"/><pair kern="-40" kpx2="1237"/><pair kern="-49" kpx2="1239"/><pair kern="-60" kpx2="1232"/><pair kern="-40" kpx2="1233"/><pair kern="-60" kpx2="1234"/><pair kern="-40" kpx2="1235"/><pair kern="-9" kpx2="1240"/><pair kern="-40" kpx2="1241"/><pair kern="-9" kpx2="1242"/><pair kern="-40" kpx2="1243"/><pair kern="-49" kpx2="1255"/><pair kern="-20" kpx2="1254"/><pair kern="-29" kpx2="1253"/><pair kern="-29" kpx2="1251"/><pair kern="-49" kpx2="1259"/><pair kern="-20" kpx2="1258"/><pair kern="-49" kpx2="1257"/><pair kern="-20" kpx2="1256"/><pair kern="-29" kpx2="1271"/><pair kern="-40" kpx2="1269"/><pair kern="-29" kpx2="1273"/><pair kern="-49" kpx2="1153"/><pair kern="-20" kpx2="1152"/><pair kern="-29" kpx2="1163"/><pair kern="20" kpx2="1165"/><pair kern="-29" kpx2="1167"/><pair kern="-29" kpx2="1169"/><pair kern="-29" kpx2="1173"/><pair kern="-29" kpx2="1179"/><pair kern="-29" kpx2="1181"/><pair kern="20" kpx2="1183"/><pair kern="-29" kpx2="1187"/><pair kern="-29" kpx2="1191"/><pair kern="-29" kpx2="1189"/><pair kern="-49" kpx2="1195"/><pair kern="-20" kpx2="1194"/><pair kern="-49" kpx2="1193"/><pair kern="-20" kpx2="1192"/><pair kern="-40" kpx2="1207"/><pair kern="-29" kpx2="1211"/><pair kern="-40" kpx2="1209"/><pair kern="-40" kpx2="1215"/><pair kern="-40" kpx2="1213"/></kerning><kerning kpx1="253"><pair kern="40" kpx2="34"/><pair kern="40" kpx2="39"/><pair kern="-40" kpx2="8218"/><pair kern="40" kpx2="8217"/><pair kern="20" kpx2="63"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="8222"/><pair kern="40" kpx2="8221"/><pair kern="-40" kpx2="44"/></kerning><kerning kpx1="1201"><pair kern="-9" kpx2="1083"/><pair kern="-9" kpx2="1289"/><pair kern="-9" kpx2="1222"/><pair kern="-9" kpx2="1113"/><pair kern="-9" kpx2="1299"/><pair kern="-9" kpx2="1127"/><pair kern="-40" kpx2="8218"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="8222"/><pair kern="-40" kpx2="44"/><pair kern="-9" kpx2="1076"/></kerning><kerning kpx1="1206"><pair kern="109" kpx2="1032"/><pair kern="20" kpx2="1249"/><pair kern="-20" kpx2="1287"/><pair kern="-20" kpx2="1285"/></kerning><kerning kpx1="1207"><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="8221"/></kerning><kerning kpx1="248"><pair kern="-9" kpx2="34"/><pair kern="-20" kpx2="373"/><pair kern="-9" kpx2="39"/><pair kern="-20" kpx2="7925"/><pair kern="-9" kpx2="380"/><pair kern="-9" kpx2="382"/><pair kern="-9" kpx2="378"/><pair kern="-20" kpx2="119"/><pair kern="-20" kpx2="118"/><pair kern="-20" kpx2="253"/><pair kern="-20" kpx2="7809"/><pair kern="-20" kpx2="7811"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="122"/><pair kern="-9" kpx2="8221"/><pair kern="-20" kpx2="121"/><pair kern="-20" kpx2="120"/></kerning><kerning kpx1="1204"><pair kern="109" kpx2="1032"/><pair kern="20" kpx2="1249"/><pair kern="-20" kpx2="1287"/><pair kern="-20" kpx2="1285"/></kerning><kerning kpx1="1205"><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="8221"/></kerning><kerning kpx1="246"><pair kern="-20" kpx2="34"/><pair kern="-20" kpx2="39"/><pair kern="-20" kpx2="8217"/><pair kern="-20" kpx2="8221"/></kerning><kerning kpx1="1210"><pair kern="-20" kpx2="1035"/><pair kern="-20" kpx2="1098"/><pair kern="-9" kpx2="1228"/><pair kern="-20" kpx2="1026"/><pair kern="-9" kpx2="1095"/><pair kern="-40" kpx2="1227"/><pair kern="-20" kpx2="1090"/><pair kern="-9" kpx2="1091"/><pair kern="-9" kpx2="1118"/><pair kern="-20" kpx2="1294"/><pair kern="-20" kpx2="1295"/><pair kern="-29" kpx2="8217"/><pair kern="-40" kpx2="1286"/><pair kern="-20" kpx2="1287"/><pair kern="-40" kpx2="1284"/><pair kern="-29" kpx2="8221"/><pair kern="-20" kpx2="1285"/><pair kern="-20" kpx2="1066"/><pair kern="-29" kpx2="34"/><pair kern="-20" kpx2="1185"/><pair kern="-20" kpx2="1184"/><pair kern="-29" kpx2="39"/><pair kern="-9" kpx2="1263"/><pair kern="-60" kpx2="1058"/><pair kern="-40" kpx2="1063"/><pair kern="-49" kpx2="1198"/><pair kern="-20" kpx2="1197"/><pair kern="-60" kpx2="1196"/><pair kern="-40" kpx2="1268"/><pair kern="-49" kpx2="1200"/><pair kern="-9" kpx2="1269"/><pair kern="-40" kpx2="1206"/><pair kern="-9" kpx2="1267"/><pair kern="-9" kpx2="1207"/><pair kern="-20" kpx2="1204"/><pair kern="-9" kpx2="1265"/><pair kern="-20" kpx2="1205"/><pair kern="-29" kpx2="1142"/><pair kern="-40" kpx2="1208"/><pair kern="-9" kpx2="1209"/><pair kern="-29" kpx2="1140"/><pair kern="-40" kpx2="1136"/></kerning><kerning kpx1="1211"><pair kern="-49" kpx2="34"/><pair kern="-20" kpx2="1185"/><pair kern="-49" kpx2="39"/><pair kern="-20" kpx2="1098"/><pair kern="-20" kpx2="1263"/><pair kern="-20" kpx2="1199"/><pair kern="-20" kpx2="1090"/><pair kern="-20" kpx2="1197"/><pair kern="-20" kpx2="1091"/><pair kern="-20" kpx2="1118"/><pair kern="-20" kpx2="1201"/><pair kern="-20" kpx2="1295"/><pair kern="-20" kpx2="1267"/><pair kern="-20" kpx2="1265"/><pair kern="-20" kpx2="1205"/><pair kern="-49" kpx2="8217"/><pair kern="-40" kpx2="1287"/><pair kern="-49" kpx2="8221"/><pair kern="-40" kpx2="1285"/></kerning><kerning kpx1="244"><pair kern="-9" kpx2="34"/><pair kern="-20" kpx2="373"/><pair kern="-9" kpx2="39"/><pair kern="-20" kpx2="7925"/><pair kern="-9" kpx2="380"/><pair kern="-9" kpx2="382"/><pair kern="-9" kpx2="378"/><pair kern="-20" kpx2="119"/><pair kern="-20" kpx2="118"/><pair kern="-20" kpx2="253"/><pair kern="-20" kpx2="7809"/><pair kern="-20" kpx2="7811"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="122"/><pair kern="-9" kpx2="8221"/><pair kern="-20" kpx2="121"/><pair kern="-20" kpx2="120"/></kerning><kerning kpx1="242"><pair kern="-9" kpx2="34"/><pair kern="-20" kpx2="373"/><pair kern="-9" kpx2="39"/><pair kern="-20" kpx2="7925"/><pair kern="-9" kpx2="380"/><pair kern="-9" kpx2="382"/><pair kern="-9" kpx2="378"/><pair kern="-20" kpx2="119"/><pair kern="-20" kpx2="118"/><pair kern="-20" kpx2="253"/><pair kern="-20" kpx2="7809"/><pair kern="-20" kpx2="7811"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="122"/><pair kern="-9" kpx2="8221"/><pair kern="-20" kpx2="121"/><pair kern="-20" kpx2="120"/></kerning><kerning kpx1="1214"><pair kern="-9" kpx2="1200"/><pair kern="-20" kpx2="1058"/><pair kern="-9" kpx2="1142"/><pair kern="-9" kpx2="1140"/><pair kern="-9" kpx2="1286"/><pair kern="-9" kpx2="1198"/><pair kern="-9" kpx2="1284"/><pair kern="-20" kpx2="1196"/></kerning><kerning kpx1="243"><pair kern="-9" kpx2="34"/><pair kern="-20" kpx2="373"/><pair kern="-9" kpx2="39"/><pair kern="-20" kpx2="7925"/><pair kern="-9" kpx2="380"/><pair kern="-9" kpx2="382"/><pair kern="-9" kpx2="378"/><pair kern="-20" kpx2="119"/><pair kern="-20" kpx2="118"/><pair kern="-20" kpx2="253"/><pair kern="-20" kpx2="7809"/><pair kern="-20" kpx2="7811"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="122"/><pair kern="-9" kpx2="8221"/><pair kern="-20" kpx2="121"/><pair kern="-20" kpx2="120"/></kerning><kerning kpx1="1215"><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="8221"/></kerning><kerning kpx1="240"><pair kern="-9" kpx2="34"/><pair kern="-20" kpx2="373"/><pair kern="-9" kpx2="39"/><pair kern="-20" kpx2="7925"/><pair kern="-9" kpx2="380"/><pair kern="-9" kpx2="382"/><pair kern="-9" kpx2="378"/><pair kern="-20" kpx2="119"/><pair kern="-20" kpx2="118"/><pair kern="-20" kpx2="253"/><pair kern="-20" kpx2="7809"/><pair kern="-20" kpx2="7811"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="122"/><pair kern="-9" kpx2="8221"/><pair kern="-20" kpx2="121"/><pair kern="-20" kpx2="120"/></kerning><kerning kpx1="1212"><pair kern="-9" kpx2="1200"/><pair kern="-20" kpx2="1058"/><pair kern="-9" kpx2="1142"/><pair kern="-9" kpx2="1140"/><pair kern="-9" kpx2="1286"/><pair kern="-9" kpx2="1198"/><pair kern="-9" kpx2="1284"/><pair kern="-20" kpx2="1196"/></kerning><kerning kpx1="1213"><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="8221"/></kerning><kerning kpx1="275"><pair kern="-9" kpx2="34"/><pair kern="-20" kpx2="373"/><pair kern="-9" kpx2="39"/><pair kern="-20" kpx2="7925"/><pair kern="-9" kpx2="380"/><pair kern="-9" kpx2="382"/><pair kern="-9" kpx2="378"/><pair kern="-20" kpx2="119"/><pair kern="-20" kpx2="118"/><pair kern="-20" kpx2="253"/><pair kern="-20" kpx2="7809"/><pair kern="-20" kpx2="7811"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="122"/><pair kern="-9" kpx2="8221"/><pair kern="-20" kpx2="121"/><pair kern="-20" kpx2="120"/></kerning><kerning kpx1="274"><pair kern="60" kpx2="74"/></kerning><kerning kpx1="272"><pair kern="-20" kpx2="258"/><pair kern="-20" kpx2="256"/><pair kern="-20" kpx2="260"/><pair kern="-9" kpx2="7922"/><pair kern="-9" kpx2="7926"/><pair kern="-9" kpx2="7924"/><pair kern="-9" kpx2="7928"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="44"/><pair kern="-29" kpx2="538"/><pair kern="-20" kpx2="65"/><pair kern="-20" kpx2="197"/><pair kern="-20" kpx2="196"/><pair kern="-20" kpx2="193"/><pair kern="-20" kpx2="192"/><pair kern="-9" kpx2="1029"/><pair kern="-20" kpx2="195"/><pair kern="-20" kpx2="194"/><pair kern="-9" kpx2="7812"/><pair kern="-9" kpx2="221"/><pair kern="-29" kpx2="84"/><pair kern="-9" kpx2="87"/><pair kern="-9" kpx2="86"/><pair kern="-9" kpx2="7808"/><pair kern="-9" kpx2="7810"/><pair kern="-40" kpx2="8218"/><pair kern="-9" kpx2="89"/><pair kern="-20" kpx2="88"/><pair kern="-40" kpx2="8222"/><pair kern="-20" kpx2="7680"/><pair kern="-9" kpx2="90"/><pair kern="-9" kpx2="372"/><pair kern="-20" kpx2="7862"/><pair kern="-9" kpx2="374"/><pair kern="-20" kpx2="7860"/><pair kern="-20" kpx2="7858"/><pair kern="-20" kpx2="506"/><pair kern="-20" kpx2="7856"/><pair kern="-9" kpx2="381"/><pair kern="-9" kpx2="377"/><pair kern="-9" kpx2="376"/><pair kern="-9" kpx2="379"/><pair kern="-29" kpx2="356"/><pair kern="-20" kpx2="7846"/><pair kern="-20" kpx2="7844"/><pair kern="-20" kpx2="7842"/><pair kern="-29" kpx2="354"/><pair kern="-20" kpx2="7840"/><pair kern="-20" kpx2="7854"/><pair kern="-20" kpx2="7852"/><pair kern="-20" kpx2="7850"/><pair kern="-20" kpx2="7848"/></kerning><kerning kpx1="279"><pair kern="-9" kpx2="34"/><pair kern="-20" kpx2="373"/><pair kern="-9" kpx2="39"/><pair kern="-20" kpx2="7925"/><pair kern="-9" kpx2="380"/><pair kern="-9" kpx2="382"/><pair kern="-9" kpx2="378"/><pair kern="-20" kpx2="119"/><pair kern="-20" kpx2="118"/><pair kern="-20" kpx2="253"/><pair kern="-20" kpx2="7809"/><pair kern="-20" kpx2="7811"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="122"/><pair kern="-9" kpx2="8221"/><pair kern="-20" kpx2="121"/><pair kern="-20" kpx2="120"/></kerning><kerning kpx1="278"><pair kern="60" kpx2="74"/></kerning><kerning kpx1="277"><pair kern="-9" kpx2="34"/><pair kern="-20" kpx2="373"/><pair kern="-9" kpx2="39"/><pair kern="-20" kpx2="7925"/><pair kern="-9" kpx2="380"/><pair kern="-9" kpx2="382"/><pair kern="-9" kpx2="378"/><pair kern="-20" kpx2="119"/><pair kern="-20" kpx2="118"/><pair kern="-20" kpx2="253"/><pair kern="-20" kpx2="7809"/><pair kern="-20" kpx2="7811"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="122"/><pair kern="-9" kpx2="8221"/><pair kern="-20" kpx2="121"/><pair kern="-20" kpx2="120"/></kerning><kerning kpx1="276"><pair kern="60" kpx2="74"/></kerning><kerning kpx1="283"><pair kern="-9" kpx2="34"/><pair kern="-20" kpx2="373"/><pair kern="-9" kpx2="39"/><pair kern="-20" kpx2="7925"/><pair kern="-9" kpx2="380"/><pair kern="-9" kpx2="382"/><pair kern="-9" kpx2="378"/><pair kern="-20" kpx2="119"/><pair kern="-20" kpx2="118"/><pair kern="-20" kpx2="253"/><pair kern="-20" kpx2="7809"/><pair kern="-20" kpx2="7811"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="122"/><pair kern="-9" kpx2="8221"/><pair kern="-20" kpx2="121"/><pair kern="-20" kpx2="120"/></kerning><kerning kpx1="282"><pair kern="60" kpx2="74"/></kerning><kerning kpx1="281"><pair kern="-9" kpx2="34"/><pair kern="-20" kpx2="373"/><pair kern="-9" kpx2="39"/><pair kern="-20" kpx2="7925"/><pair kern="-9" kpx2="380"/><pair kern="-9" kpx2="382"/><pair kern="-9" kpx2="378"/><pair kern="-20" kpx2="119"/><pair kern="-20" kpx2="118"/><pair kern="-20" kpx2="253"/><pair kern="-20" kpx2="7809"/><pair kern="-20" kpx2="7811"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="122"/><pair kern="-9" kpx2="8221"/><pair kern="-20" kpx2="121"/><pair kern="-20" kpx2="120"/></kerning><kerning kpx1="280"><pair kern="60" kpx2="74"/></kerning><kerning kpx1="258"><pair kern="-20" kpx2="7888"/><pair kern="-20" kpx2="7890"/><pair kern="-20" kpx2="7892"/><pair kern="-20" kpx2="7894"/><pair kern="-20" kpx2="7896"/><pair kern="-20" kpx2="7898"/><pair kern="-20" kpx2="7900"/><pair kern="-20" kpx2="286"/><pair kern="-20" kpx2="7902"/><pair kern="-20" kpx2="284"/><pair kern="-20" kpx2="262"/><pair kern="-20" kpx2="266"/><pair kern="-20" kpx2="264"/><pair kern="-20" kpx2="7884"/><pair kern="-20" kpx2="268"/><pair kern="-20" kpx2="7886"/><pair kern="-69" kpx2="34"/><pair kern="-60" kpx2="7922"/><pair kern="-60" kpx2="7926"/><pair kern="-69" kpx2="39"/><pair kern="-60" kpx2="7924"/><pair kern="-60" kpx2="7928"/><pair kern="-20" kpx2="7906"/><pair kern="-20" kpx2="288"/><pair kern="-20" kpx2="7904"/><pair kern="-20" kpx2="290"/><pair kern="-20" kpx2="416"/><pair kern="-69" kpx2="538"/><pair kern="-20" kpx2="71"/><pair kern="-20" kpx2="338"/><pair kern="-20" kpx2="67"/><pair kern="-20" kpx2="336"/><pair kern="-20" kpx2="199"/><pair kern="-20" kpx2="79"/><pair kern="129" kpx2="74"/><pair kern="-40" kpx2="7812"/><pair kern="-60" kpx2="221"/><pair kern="-69" kpx2="84"/><pair kern="-40" kpx2="87"/><pair kern="-40" kpx2="86"/><pair kern="-20" kpx2="216"/><pair kern="-20" kpx2="81"/><pair kern="-40" kpx2="7808"/><pair kern="-40" kpx2="7810"/><pair kern="-20" kpx2="212"/><pair kern="-20" kpx2="334"/><pair kern="-20" kpx2="213"/><pair kern="-20" kpx2="214"/><pair kern="-20" kpx2="332"/><pair kern="-69" kpx2="8217"/><pair kern="-60" kpx2="89"/><pair kern="-20" kpx2="210"/><pair kern="-69" kpx2="8221"/><pair kern="-20" kpx2="211"/><pair kern="-40" kpx2="372"/><pair kern="-20" kpx2="510"/><pair kern="-60" kpx2="374"/><pair kern="-60" kpx2="376"/><pair kern="-69" kpx2="356"/><pair kern="-69" kpx2="354"/></kerning><kerning kpx1="259"><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="8221"/></kerning><kerning kpx1="256"><pair kern="-20" kpx2="7888"/><pair kern="-20" kpx2="7890"/><pair kern="-20" kpx2="7892"/><pair kern="-20" kpx2="7894"/><pair kern="-20" kpx2="7896"/><pair kern="-20" kpx2="7898"/><pair kern="-20" kpx2="7900"/><pair kern="-20" kpx2="286"/><pair kern="-20" kpx2="7902"/><pair kern="-20" kpx2="284"/><pair kern="-20" kpx2="262"/><pair kern="-20" kpx2="266"/><pair kern="-20" kpx2="264"/><pair kern="-20" kpx2="7884"/><pair kern="-20" kpx2="268"/><pair kern="-20" kpx2="7886"/><pair kern="-69" kpx2="34"/><pair kern="-60" kpx2="7922"/><pair kern="-60" kpx2="7926"/><pair kern="-69" kpx2="39"/><pair kern="-60" kpx2="7924"/><pair kern="-60" kpx2="7928"/><pair kern="-20" kpx2="7906"/><pair kern="-20" kpx2="288"/><pair kern="-20" kpx2="7904"/><pair kern="-20" kpx2="290"/><pair kern="-20" kpx2="416"/><pair kern="-69" kpx2="538"/><pair kern="-20" kpx2="71"/><pair kern="-20" kpx2="338"/><pair kern="-20" kpx2="67"/><pair kern="-20" kpx2="336"/><pair kern="-20" kpx2="199"/><pair kern="-20" kpx2="79"/><pair kern="129" kpx2="74"/><pair kern="-40" kpx2="7812"/><pair kern="-60" kpx2="221"/><pair kern="-69" kpx2="84"/><pair kern="-40" kpx2="87"/><pair kern="-40" kpx2="86"/><pair kern="-20" kpx2="216"/><pair kern="-20" kpx2="81"/><pair kern="-40" kpx2="7808"/><pair kern="-40" kpx2="7810"/><pair kern="-20" kpx2="212"/><pair kern="-20" kpx2="334"/><pair kern="-20" kpx2="213"/><pair kern="-20" kpx2="214"/><pair kern="-20" kpx2="332"/><pair kern="-69" kpx2="8217"/><pair kern="-60" kpx2="89"/><pair kern="-20" kpx2="210"/><pair kern="-69" kpx2="8221"/><pair kern="-20" kpx2="211"/><pair kern="-40" kpx2="372"/><pair kern="-20" kpx2="510"/><pair kern="-60" kpx2="374"/><pair kern="-60" kpx2="376"/><pair kern="-69" kpx2="356"/><pair kern="-69" kpx2="354"/></kerning><kerning kpx1="257"><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="8221"/></kerning><kerning kpx1="262"><pair kern="-20" kpx2="7888"/><pair kern="-20" kpx2="7890"/><pair kern="-20" kpx2="71"/><pair kern="-20" kpx2="7892"/><pair kern="-20" kpx2="338"/><pair kern="-20" kpx2="7894"/><pair kern="-20" kpx2="67"/><pair kern="-20" kpx2="336"/><pair kern="-20" kpx2="7896"/><pair kern="-20" kpx2="199"/><pair kern="-20" kpx2="7898"/><pair kern="-20" kpx2="79"/><pair kern="-20" kpx2="7900"/><pair kern="-20" kpx2="286"/><pair kern="-20" kpx2="7902"/><pair kern="-20" kpx2="284"/><pair kern="-20" kpx2="262"/><pair kern="-20" kpx2="216"/><pair kern="-20" kpx2="81"/><pair kern="-20" kpx2="212"/><pair kern="-20" kpx2="266"/><pair kern="-20" kpx2="334"/><pair kern="-20" kpx2="213"/><pair kern="-20" kpx2="214"/><pair kern="-20" kpx2="264"/><pair kern="-20" kpx2="332"/><pair kern="-20" kpx2="7884"/><pair kern="-20" kpx2="7886"/><pair kern="-20" kpx2="210"/><pair kern="-20" kpx2="268"/><pair kern="-20" kpx2="211"/><pair kern="-20" kpx2="510"/><pair kern="-20" kpx2="7906"/><pair kern="-20" kpx2="288"/><pair kern="-20" kpx2="7904"/><pair kern="-20" kpx2="290"/><pair kern="-20" kpx2="416"/></kerning><kerning kpx1="260"><pair kern="-20" kpx2="7888"/><pair kern="-20" kpx2="7890"/><pair kern="-20" kpx2="7892"/><pair kern="-20" kpx2="7894"/><pair kern="-20" kpx2="7896"/><pair kern="-20" kpx2="7898"/><pair kern="-20" kpx2="7900"/><pair kern="-20" kpx2="286"/><pair kern="-20" kpx2="7902"/><pair kern="-20" kpx2="284"/><pair kern="-20" kpx2="262"/><pair kern="-20" kpx2="266"/><pair kern="-20" kpx2="264"/><pair kern="-20" kpx2="7884"/><pair kern="-20" kpx2="268"/><pair kern="-20" kpx2="7886"/><pair kern="-69" kpx2="34"/><pair kern="-60" kpx2="7922"/><pair kern="-60" kpx2="7926"/><pair kern="-69" kpx2="39"/><pair kern="-60" kpx2="7924"/><pair kern="-60" kpx2="7928"/><pair kern="-20" kpx2="7906"/><pair kern="-20" kpx2="288"/><pair kern="-20" kpx2="7904"/><pair kern="-20" kpx2="290"/><pair kern="-20" kpx2="416"/><pair kern="-69" kpx2="538"/><pair kern="-20" kpx2="71"/><pair kern="-20" kpx2="338"/><pair kern="-20" kpx2="67"/><pair kern="-20" kpx2="336"/><pair kern="-20" kpx2="199"/><pair kern="-20" kpx2="79"/><pair kern="129" kpx2="74"/><pair kern="-40" kpx2="7812"/><pair kern="-60" kpx2="221"/><pair kern="-69" kpx2="84"/><pair kern="-40" kpx2="87"/><pair kern="-40" kpx2="86"/><pair kern="-20" kpx2="216"/><pair kern="-20" kpx2="81"/><pair kern="-40" kpx2="7808"/><pair kern="-40" kpx2="7810"/><pair kern="-20" kpx2="212"/><pair kern="-20" kpx2="334"/><pair kern="-20" kpx2="213"/><pair kern="-20" kpx2="214"/><pair kern="-20" kpx2="332"/><pair kern="-69" kpx2="8217"/><pair kern="-60" kpx2="89"/><pair kern="-20" kpx2="210"/><pair kern="-69" kpx2="8221"/><pair kern="-20" kpx2="211"/><pair kern="-40" kpx2="372"/><pair kern="-20" kpx2="510"/><pair kern="-60" kpx2="374"/><pair kern="-60" kpx2="376"/><pair kern="-69" kpx2="356"/><pair kern="-69" kpx2="354"/></kerning><kerning kpx1="261"><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="8221"/></kerning><kerning kpx1="266"><pair kern="-20" kpx2="7888"/><pair kern="-20" kpx2="7890"/><pair kern="-20" kpx2="71"/><pair kern="-20" kpx2="7892"/><pair kern="-20" kpx2="338"/><pair kern="-20" kpx2="7894"/><pair kern="-20" kpx2="67"/><pair kern="-20" kpx2="336"/><pair kern="-20" kpx2="7896"/><pair kern="-20" kpx2="199"/><pair kern="-20" kpx2="7898"/><pair kern="-20" kpx2="79"/><pair kern="-20" kpx2="7900"/><pair kern="-20" kpx2="286"/><pair kern="-20" kpx2="7902"/><pair kern="-20" kpx2="284"/><pair kern="-20" kpx2="262"/><pair kern="-20" kpx2="216"/><pair kern="-20" kpx2="81"/><pair kern="-20" kpx2="212"/><pair kern="-20" kpx2="266"/><pair kern="-20" kpx2="334"/><pair kern="-20" kpx2="213"/><pair kern="-20" kpx2="214"/><pair kern="-20" kpx2="264"/><pair kern="-20" kpx2="332"/><pair kern="-20" kpx2="7884"/><pair kern="-20" kpx2="7886"/><pair kern="-20" kpx2="210"/><pair kern="-20" kpx2="268"/><pair kern="-20" kpx2="211"/><pair kern="-20" kpx2="510"/><pair kern="-20" kpx2="7906"/><pair kern="-20" kpx2="288"/><pair kern="-20" kpx2="7904"/><pair kern="-20" kpx2="290"/><pair kern="-20" kpx2="416"/></kerning><kerning kpx1="264"><pair kern="-20" kpx2="7888"/><pair kern="-20" kpx2="7890"/><pair kern="-20" kpx2="71"/><pair kern="-20" kpx2="7892"/><pair kern="-20" kpx2="338"/><pair kern="-20" kpx2="7894"/><pair kern="-20" kpx2="67"/><pair kern="-20" kpx2="336"/><pair kern="-20" kpx2="7896"/><pair kern="-20" kpx2="199"/><pair kern="-20" kpx2="7898"/><pair kern="-20" kpx2="79"/><pair kern="-20" kpx2="7900"/><pair kern="-20" kpx2="286"/><pair kern="-20" kpx2="7902"/><pair kern="-20" kpx2="284"/><pair kern="-20" kpx2="262"/><pair kern="-20" kpx2="216"/><pair kern="-20" kpx2="81"/><pair kern="-20" kpx2="212"/><pair kern="-20" kpx2="266"/><pair kern="-20" kpx2="334"/><pair kern="-20" kpx2="213"/><pair kern="-20" kpx2="214"/><pair kern="-20" kpx2="264"/><pair kern="-20" kpx2="332"/><pair kern="-20" kpx2="7884"/><pair kern="-20" kpx2="7886"/><pair kern="-20" kpx2="210"/><pair kern="-20" kpx2="268"/><pair kern="-20" kpx2="211"/><pair kern="-20" kpx2="510"/><pair kern="-20" kpx2="7906"/><pair kern="-20" kpx2="288"/><pair kern="-20" kpx2="7904"/><pair kern="-20" kpx2="290"/><pair kern="-20" kpx2="416"/></kerning><kerning kpx1="270"><pair kern="-20" kpx2="258"/><pair kern="-20" kpx2="256"/><pair kern="-20" kpx2="260"/><pair kern="-9" kpx2="7922"/><pair kern="-9" kpx2="7926"/><pair kern="-9" kpx2="7924"/><pair kern="-9" kpx2="7928"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="44"/><pair kern="-29" kpx2="538"/><pair kern="-20" kpx2="65"/><pair kern="-20" kpx2="197"/><pair kern="-20" kpx2="196"/><pair kern="-20" kpx2="193"/><pair kern="-20" kpx2="192"/><pair kern="-9" kpx2="1029"/><pair kern="-20" kpx2="195"/><pair kern="-20" kpx2="194"/><pair kern="-9" kpx2="7812"/><pair kern="-9" kpx2="221"/><pair kern="-29" kpx2="84"/><pair kern="-9" kpx2="87"/><pair kern="-9" kpx2="86"/><pair kern="-9" kpx2="7808"/><pair kern="-9" kpx2="7810"/><pair kern="-40" kpx2="8218"/><pair kern="-9" kpx2="89"/><pair kern="-20" kpx2="88"/><pair kern="-40" kpx2="8222"/><pair kern="-20" kpx2="7680"/><pair kern="-9" kpx2="90"/><pair kern="-9" kpx2="372"/><pair kern="-20" kpx2="7862"/><pair kern="-9" kpx2="374"/><pair kern="-20" kpx2="7860"/><pair kern="-20" kpx2="7858"/><pair kern="-20" kpx2="506"/><pair kern="-20" kpx2="7856"/><pair kern="-9" kpx2="381"/><pair kern="-9" kpx2="377"/><pair kern="-9" kpx2="376"/><pair kern="-9" kpx2="379"/><pair kern="-29" kpx2="356"/><pair kern="-20" kpx2="7846"/><pair kern="-20" kpx2="7844"/><pair kern="-20" kpx2="7842"/><pair kern="-29" kpx2="354"/><pair kern="-20" kpx2="7840"/><pair kern="-20" kpx2="7854"/><pair kern="-20" kpx2="7852"/><pair kern="-20" kpx2="7850"/><pair kern="-20" kpx2="7848"/></kerning><kerning kpx1="271"><pair kern="40" kpx2="34"/><pair kern="29" kpx2="98"/><pair kern="40" kpx2="39"/><pair kern="29" kpx2="108"/><pair kern="69" kpx2="41"/><pair kern="29" kpx2="107"/><pair kern="29" kpx2="104"/><pair kern="29" kpx2="293"/><pair kern="60" kpx2="295"/><pair kern="69" kpx2="93"/><pair kern="40" kpx2="8217"/><pair kern="69" kpx2="125"/><pair kern="80" kpx2="63"/><pair kern="40" kpx2="8221"/></kerning><kerning kpx1="268"><pair kern="-20" kpx2="7888"/><pair kern="-20" kpx2="7890"/><pair kern="-20" kpx2="71"/><pair kern="-20" kpx2="7892"/><pair kern="-20" kpx2="338"/><pair kern="-20" kpx2="7894"/><pair kern="-20" kpx2="67"/><pair kern="-20" kpx2="336"/><pair kern="-20" kpx2="7896"/><pair kern="-20" kpx2="199"/><pair kern="-20" kpx2="7898"/><pair kern="-20" kpx2="79"/><pair kern="-20" kpx2="7900"/><pair kern="-20" kpx2="286"/><pair kern="-20" kpx2="7902"/><pair kern="-20" kpx2="284"/><pair kern="-20" kpx2="262"/><pair kern="-20" kpx2="216"/><pair kern="-20" kpx2="81"/><pair kern="-20" kpx2="212"/><pair kern="-20" kpx2="266"/><pair kern="-20" kpx2="334"/><pair kern="-20" kpx2="213"/><pair kern="-20" kpx2="214"/><pair kern="-20" kpx2="264"/><pair kern="-20" kpx2="332"/><pair kern="-20" kpx2="7884"/><pair kern="-20" kpx2="7886"/><pair kern="-20" kpx2="210"/><pair kern="-20" kpx2="268"/><pair kern="-20" kpx2="211"/><pair kern="-20" kpx2="510"/><pair kern="-20" kpx2="7906"/><pair kern="-20" kpx2="288"/><pair kern="-20" kpx2="7904"/><pair kern="-20" kpx2="290"/><pair kern="-20" kpx2="416"/></kerning><kerning kpx1="311"><pair kern="-20" kpx2="7889"/><pair kern="-20" kpx2="275"/><pair kern="-20" kpx2="273"/><pair kern="-20" kpx2="7893"/><pair kern="-20" kpx2="339"/><pair kern="-20" kpx2="279"/><pair kern="-20" kpx2="7895"/><pair kern="-20" kpx2="337"/><pair kern="-20" kpx2="277"/><pair kern="-20" kpx2="7897"/><pair kern="-20" kpx2="283"/><pair kern="-20" kpx2="7899"/><pair kern="-20" kpx2="281"/><pair kern="-20" kpx2="7901"/><pair kern="-20" kpx2="7903"/><pair kern="-20" kpx2="7875"/><pair kern="-20" kpx2="7877"/><pair kern="-20" kpx2="263"/><pair kern="-20" kpx2="7879"/><pair kern="-20" kpx2="335"/><pair kern="-20" kpx2="267"/><pair kern="-20" kpx2="333"/><pair kern="-20" kpx2="265"/><pair kern="-20" kpx2="7885"/><pair kern="-20" kpx2="271"/><pair kern="-20" kpx2="7887"/><pair kern="-20" kpx2="269"/><pair kern="-20" kpx2="100"/><pair kern="-20" kpx2="511"/><pair kern="-20" kpx2="101"/><pair kern="-20" kpx2="235"/><pair kern="-20" kpx2="234"/><pair kern="-20" kpx2="99"/><pair kern="-20" kpx2="233"/><pair kern="-20" kpx2="232"/><pair kern="-20" kpx2="7871"/><pair kern="-20" kpx2="231"/><pair kern="-20" kpx2="111"/><pair kern="-20" kpx2="7869"/><pair kern="-20" kpx2="7867"/><pair kern="-20" kpx2="7865"/><pair kern="-20" kpx2="224"/><pair kern="-20" kpx2="7907"/><pair kern="-20" kpx2="7905"/><pair kern="-20" kpx2="113"/><pair kern="-20" kpx2="248"/><pair kern="-20" kpx2="417"/><pair kern="-20" kpx2="246"/><pair kern="-20" kpx2="244"/><pair kern="-20" kpx2="245"/><pair kern="-20" kpx2="242"/><pair kern="-20" kpx2="243"/></kerning><kerning kpx1="310"><pair kern="-20" kpx2="7888"/><pair kern="-20" kpx2="7890"/><pair kern="-20" kpx2="71"/><pair kern="-20" kpx2="7892"/><pair kern="-20" kpx2="338"/><pair kern="-20" kpx2="7894"/><pair kern="-20" kpx2="67"/><pair kern="-20" kpx2="336"/><pair kern="-20" kpx2="7896"/><pair kern="-20" kpx2="199"/><pair kern="-20" kpx2="7898"/><pair kern="-20" kpx2="79"/><pair kern="-20" kpx2="7900"/><pair kern="-20" kpx2="286"/><pair kern="-20" kpx2="7902"/><pair kern="-20" kpx2="284"/><pair kern="-20" kpx2="262"/><pair kern="-20" kpx2="216"/><pair kern="-20" kpx2="81"/><pair kern="-20" kpx2="212"/><pair kern="-20" kpx2="266"/><pair kern="-20" kpx2="334"/><pair kern="-20" kpx2="213"/><pair kern="-20" kpx2="214"/><pair kern="-20" kpx2="264"/><pair kern="-20" kpx2="332"/><pair kern="-20" kpx2="7884"/><pair kern="-20" kpx2="7886"/><pair kern="-20" kpx2="210"/><pair kern="-20" kpx2="268"/><pair kern="-20" kpx2="211"/><pair kern="-20" kpx2="510"/><pair kern="-20" kpx2="7906"/><pair kern="-20" kpx2="288"/><pair kern="-20" kpx2="7904"/><pair kern="-20" kpx2="290"/><pair kern="-20" kpx2="416"/></kerning><kerning kpx1="313"><pair kern="-20" kpx2="7888"/><pair kern="-20" kpx2="7890"/><pair kern="-20" kpx2="7892"/><pair kern="-20" kpx2="7894"/><pair kern="-20" kpx2="7896"/><pair kern="-20" kpx2="7898"/><pair kern="-20" kpx2="7900"/><pair kern="-20" kpx2="286"/><pair kern="-20" kpx2="7902"/><pair kern="-20" kpx2="284"/><pair kern="-20" kpx2="262"/><pair kern="-20" kpx2="266"/><pair kern="-20" kpx2="264"/><pair kern="-20" kpx2="7884"/><pair kern="-20" kpx2="7886"/><pair kern="-20" kpx2="268"/><pair kern="-80" kpx2="34"/><pair kern="-29" kpx2="7922"/><pair kern="-9" kpx2="7920"/><pair kern="-29" kpx2="7926"/><pair kern="-80" kpx2="39"/><pair kern="-29" kpx2="7924"/><pair kern="-29" kpx2="7928"/><pair kern="-20" kpx2="7906"/><pair kern="-20" kpx2="288"/><pair kern="-20" kpx2="7904"/><pair kern="-20" kpx2="290"/><pair kern="-9" kpx2="7910"/><pair kern="-9" kpx2="7908"/><pair kern="-9" kpx2="431"/><pair kern="-9" kpx2="7914"/><pair kern="-20" kpx2="416"/><pair kern="-9" kpx2="7912"/><pair kern="-9" kpx2="7918"/><pair kern="-9" kpx2="7916"/><pair kern="-20" kpx2="538"/><pair kern="-20" kpx2="71"/><pair kern="-20" kpx2="338"/><pair kern="-20" kpx2="67"/><pair kern="-20" kpx2="336"/><pair kern="-20" kpx2="199"/><pair kern="-20" kpx2="79"/><pair kern="-20" kpx2="7812"/><pair kern="-9" kpx2="220"/><pair kern="-9" kpx2="85"/><pair kern="-29" kpx2="221"/><pair kern="-20" kpx2="84"/><pair kern="-20" kpx2="87"/><pair kern="-20" kpx2="86"/><pair kern="-20" kpx2="216"/><pair kern="-20" kpx2="81"/><pair kern="-20" kpx2="7808"/><pair kern="-9" kpx2="217"/><pair kern="-20" kpx2="7810"/><pair kern="-9" kpx2="218"/><pair kern="-9" kpx2="219"/><pair kern="-20" kpx2="212"/><pair kern="-20" kpx2="334"/><pair kern="-20" kpx2="213"/><pair kern="-80" kpx2="8217"/><pair kern="-20" kpx2="214"/><pair kern="-20" kpx2="332"/><pair kern="-29" kpx2="89"/><pair kern="-80" kpx2="8221"/><pair kern="-20" kpx2="210"/><pair kern="-20" kpx2="211"/><pair kern="-20" kpx2="372"/><pair kern="-20" kpx2="510"/><pair kern="-29" kpx2="374"/><pair kern="-9" kpx2="368"/><pair kern="-9" kpx2="370"/><pair kern="-29" kpx2="376"/><pair kern="-20" kpx2="356"/><pair kern="-20" kpx2="354"/><pair kern="-9" kpx2="364"/><pair kern="-9" kpx2="366"/><pair kern="-9" kpx2="360"/><pair kern="-9" kpx2="362"/></kerning><kerning kpx1="312"><pair kern="-20" kpx2="7889"/><pair kern="-20" kpx2="275"/><pair kern="-20" kpx2="273"/><pair kern="-20" kpx2="7893"/><pair kern="-20" kpx2="339"/><pair kern="-20" kpx2="279"/><pair kern="-20" kpx2="7895"/><pair kern="-20" kpx2="337"/><pair kern="-20" kpx2="277"/><pair kern="-20" kpx2="7897"/><pair kern="-20" kpx2="283"/><pair kern="-20" kpx2="7899"/><pair kern="-20" kpx2="281"/><pair kern="-20" kpx2="7901"/><pair kern="-20" kpx2="7903"/><pair kern="-20" kpx2="7875"/><pair kern="-20" kpx2="7877"/><pair kern="-20" kpx2="263"/><pair kern="-20" kpx2="7879"/><pair kern="-20" kpx2="335"/><pair kern="-20" kpx2="267"/><pair kern="-20" kpx2="333"/><pair kern="-20" kpx2="265"/><pair kern="-20" kpx2="7885"/><pair kern="-20" kpx2="271"/><pair kern="-20" kpx2="7887"/><pair kern="-20" kpx2="269"/><pair kern="-20" kpx2="100"/><pair kern="-20" kpx2="511"/><pair kern="-20" kpx2="101"/><pair kern="-20" kpx2="235"/><pair kern="-20" kpx2="234"/><pair kern="-20" kpx2="99"/><pair kern="-20" kpx2="233"/><pair kern="-20" kpx2="232"/><pair kern="-20" kpx2="7871"/><pair kern="-20" kpx2="231"/><pair kern="-20" kpx2="111"/><pair kern="-20" kpx2="7869"/><pair kern="-20" kpx2="7867"/><pair kern="-20" kpx2="7865"/><pair kern="-20" kpx2="224"/><pair kern="-20" kpx2="7907"/><pair kern="-20" kpx2="7905"/><pair kern="-20" kpx2="113"/><pair kern="-20" kpx2="248"/><pair kern="-20" kpx2="417"/><pair kern="-20" kpx2="246"/><pair kern="-20" kpx2="244"/><pair kern="-20" kpx2="245"/><pair kern="-20" kpx2="242"/><pair kern="-20" kpx2="243"/></kerning><kerning kpx1="315"><pair kern="-20" kpx2="7888"/><pair kern="-20" kpx2="7890"/><pair kern="-20" kpx2="7892"/><pair kern="-20" kpx2="7894"/><pair kern="-20" kpx2="7896"/><pair kern="-20" kpx2="7898"/><pair kern="-20" kpx2="7900"/><pair kern="-20" kpx2="286"/><pair kern="-20" kpx2="7902"/><pair kern="-20" kpx2="284"/><pair kern="-20" kpx2="262"/><pair kern="-20" kpx2="266"/><pair kern="-20" kpx2="264"/><pair kern="-20" kpx2="7884"/><pair kern="-20" kpx2="7886"/><pair kern="-20" kpx2="268"/><pair kern="-80" kpx2="34"/><pair kern="-29" kpx2="7922"/><pair kern="-9" kpx2="7920"/><pair kern="-29" kpx2="7926"/><pair kern="-80" kpx2="39"/><pair kern="-29" kpx2="7924"/><pair kern="-29" kpx2="7928"/><pair kern="-20" kpx2="7906"/><pair kern="-20" kpx2="288"/><pair kern="-20" kpx2="7904"/><pair kern="-20" kpx2="290"/><pair kern="-9" kpx2="7910"/><pair kern="-9" kpx2="7908"/><pair kern="-9" kpx2="431"/><pair kern="-9" kpx2="7914"/><pair kern="-20" kpx2="416"/><pair kern="-9" kpx2="7912"/><pair kern="-9" kpx2="7918"/><pair kern="-9" kpx2="7916"/><pair kern="-20" kpx2="538"/><pair kern="-20" kpx2="71"/><pair kern="-20" kpx2="338"/><pair kern="-20" kpx2="67"/><pair kern="-20" kpx2="336"/><pair kern="-20" kpx2="199"/><pair kern="-20" kpx2="79"/><pair kern="-20" kpx2="7812"/><pair kern="-9" kpx2="220"/><pair kern="-9" kpx2="85"/><pair kern="-29" kpx2="221"/><pair kern="-20" kpx2="84"/><pair kern="-20" kpx2="87"/><pair kern="-20" kpx2="86"/><pair kern="-20" kpx2="216"/><pair kern="-20" kpx2="81"/><pair kern="-20" kpx2="7808"/><pair kern="-9" kpx2="217"/><pair kern="-20" kpx2="7810"/><pair kern="-9" kpx2="218"/><pair kern="-9" kpx2="219"/><pair kern="-20" kpx2="212"/><pair kern="-20" kpx2="334"/><pair kern="-20" kpx2="213"/><pair kern="-80" kpx2="8217"/><pair kern="-20" kpx2="214"/><pair kern="-20" kpx2="332"/><pair kern="-29" kpx2="89"/><pair kern="-80" kpx2="8221"/><pair kern="-20" kpx2="210"/><pair kern="-20" kpx2="211"/><pair kern="-20" kpx2="372"/><pair kern="-20" kpx2="510"/><pair kern="-29" kpx2="374"/><pair kern="-9" kpx2="368"/><pair kern="-9" kpx2="370"/><pair kern="-29" kpx2="376"/><pair kern="-20" kpx2="356"/><pair kern="-20" kpx2="354"/><pair kern="-9" kpx2="364"/><pair kern="-9" kpx2="366"/><pair kern="-9" kpx2="360"/><pair kern="-9" kpx2="362"/></kerning><kerning kpx1="317"><pair kern="-20" kpx2="7888"/><pair kern="-20" kpx2="7890"/><pair kern="-20" kpx2="7892"/><pair kern="-20" kpx2="7894"/><pair kern="-20" kpx2="7896"/><pair kern="-20" kpx2="7898"/><pair kern="-20" kpx2="7900"/><pair kern="-20" kpx2="286"/><pair kern="-20" kpx2="7902"/><pair kern="-20" kpx2="284"/><pair kern="-20" kpx2="262"/><pair kern="-20" kpx2="266"/><pair kern="-20" kpx2="264"/><pair kern="-20" kpx2="7884"/><pair kern="-20" kpx2="7886"/><pair kern="-20" kpx2="268"/><pair kern="-80" kpx2="34"/><pair kern="-29" kpx2="7922"/><pair kern="-9" kpx2="7920"/><pair kern="-29" kpx2="7926"/><pair kern="-80" kpx2="39"/><pair kern="-29" kpx2="7924"/><pair kern="-29" kpx2="7928"/><pair kern="-20" kpx2="7906"/><pair kern="-20" kpx2="288"/><pair kern="-20" kpx2="7904"/><pair kern="-20" kpx2="290"/><pair kern="-9" kpx2="7910"/><pair kern="-9" kpx2="7908"/><pair kern="-9" kpx2="431"/><pair kern="-9" kpx2="7914"/><pair kern="-20" kpx2="416"/><pair kern="-9" kpx2="7912"/><pair kern="-9" kpx2="7918"/><pair kern="-9" kpx2="7916"/><pair kern="-20" kpx2="538"/><pair kern="-20" kpx2="71"/><pair kern="-20" kpx2="338"/><pair kern="-20" kpx2="67"/><pair kern="-20" kpx2="336"/><pair kern="-20" kpx2="199"/><pair kern="-20" kpx2="79"/><pair kern="-20" kpx2="7812"/><pair kern="-9" kpx2="220"/><pair kern="-9" kpx2="85"/><pair kern="-29" kpx2="221"/><pair kern="-20" kpx2="84"/><pair kern="-20" kpx2="87"/><pair kern="-20" kpx2="86"/><pair kern="-20" kpx2="216"/><pair kern="-20" kpx2="81"/><pair kern="-20" kpx2="7808"/><pair kern="-9" kpx2="217"/><pair kern="-20" kpx2="7810"/><pair kern="-9" kpx2="218"/><pair kern="-9" kpx2="219"/><pair kern="-20" kpx2="212"/><pair kern="-20" kpx2="334"/><pair kern="-20" kpx2="213"/><pair kern="-80" kpx2="8217"/><pair kern="-20" kpx2="214"/><pair kern="-20" kpx2="332"/><pair kern="-29" kpx2="89"/><pair kern="-80" kpx2="8221"/><pair kern="-20" kpx2="210"/><pair kern="-20" kpx2="211"/><pair kern="-20" kpx2="372"/><pair kern="-20" kpx2="510"/><pair kern="-29" kpx2="374"/><pair kern="-9" kpx2="368"/><pair kern="-9" kpx2="370"/><pair kern="-29" kpx2="376"/><pair kern="-20" kpx2="356"/><pair kern="-20" kpx2="354"/><pair kern="-9" kpx2="364"/><pair kern="-9" kpx2="366"/><pair kern="-9" kpx2="360"/><pair kern="-9" kpx2="362"/></kerning><kerning kpx1="319"><pair kern="-20" kpx2="7888"/><pair kern="-20" kpx2="7890"/><pair kern="-20" kpx2="7892"/><pair kern="-20" kpx2="7894"/><pair kern="-20" kpx2="7896"/><pair kern="-20" kpx2="7898"/><pair kern="-20" kpx2="7900"/><pair kern="-20" kpx2="286"/><pair kern="-20" kpx2="7902"/><pair kern="-20" kpx2="284"/><pair kern="-20" kpx2="262"/><pair kern="-20" kpx2="266"/><pair kern="-20" kpx2="264"/><pair kern="-20" kpx2="7884"/><pair kern="-20" kpx2="7886"/><pair kern="-20" kpx2="268"/><pair kern="-80" kpx2="34"/><pair kern="-29" kpx2="7922"/><pair kern="-9" kpx2="7920"/><pair kern="-29" kpx2="7926"/><pair kern="-80" kpx2="39"/><pair kern="-29" kpx2="7924"/><pair kern="-29" kpx2="7928"/><pair kern="-20" kpx2="7906"/><pair kern="-20" kpx2="288"/><pair kern="-20" kpx2="7904"/><pair kern="-20" kpx2="290"/><pair kern="-9" kpx2="7910"/><pair kern="-9" kpx2="7908"/><pair kern="-9" kpx2="431"/><pair kern="-9" kpx2="7914"/><pair kern="-20" kpx2="416"/><pair kern="-9" kpx2="7912"/><pair kern="-9" kpx2="7918"/><pair kern="-9" kpx2="7916"/><pair kern="-20" kpx2="538"/><pair kern="-20" kpx2="71"/><pair kern="-20" kpx2="338"/><pair kern="-20" kpx2="67"/><pair kern="-20" kpx2="336"/><pair kern="-20" kpx2="199"/><pair kern="-20" kpx2="79"/><pair kern="-20" kpx2="7812"/><pair kern="-9" kpx2="220"/><pair kern="-9" kpx2="85"/><pair kern="-29" kpx2="221"/><pair kern="-20" kpx2="84"/><pair kern="-20" kpx2="87"/><pair kern="-20" kpx2="86"/><pair kern="-20" kpx2="216"/><pair kern="-20" kpx2="81"/><pair kern="-20" kpx2="7808"/><pair kern="-9" kpx2="217"/><pair kern="-20" kpx2="7810"/><pair kern="-9" kpx2="218"/><pair kern="-9" kpx2="219"/><pair kern="-20" kpx2="212"/><pair kern="-20" kpx2="334"/><pair kern="-20" kpx2="213"/><pair kern="-80" kpx2="8217"/><pair kern="-20" kpx2="214"/><pair kern="-20" kpx2="332"/><pair kern="-29" kpx2="89"/><pair kern="-80" kpx2="8221"/><pair kern="-20" kpx2="210"/><pair kern="-20" kpx2="211"/><pair kern="-20" kpx2="372"/><pair kern="-20" kpx2="510"/><pair kern="-29" kpx2="374"/><pair kern="-9" kpx2="368"/><pair kern="-9" kpx2="370"/><pair kern="-29" kpx2="376"/><pair kern="-20" kpx2="356"/><pair kern="-20" kpx2="354"/><pair kern="-9" kpx2="364"/><pair kern="-9" kpx2="366"/><pair kern="-9" kpx2="360"/><pair kern="-9" kpx2="362"/></kerning><kerning kpx1="318"><pair kern="40" kpx2="34"/><pair kern="29" kpx2="98"/><pair kern="40" kpx2="39"/><pair kern="29" kpx2="108"/><pair kern="69" kpx2="41"/><pair kern="29" kpx2="107"/><pair kern="29" kpx2="104"/><pair kern="29" kpx2="293"/><pair kern="69" kpx2="295"/><pair kern="69" kpx2="93"/><pair kern="40" kpx2="8217"/><pair kern="69" kpx2="125"/><pair kern="69" kpx2="63"/><pair kern="40" kpx2="8221"/></kerning><kerning kpx1="293"><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="8221"/></kerning><kerning kpx1="343"><pair kern="-20" kpx2="7889"/><pair kern="-20" kpx2="275"/><pair kern="-20" kpx2="273"/><pair kern="-20" kpx2="7893"/><pair kern="-20" kpx2="279"/><pair kern="-20" kpx2="7895"/><pair kern="-20" kpx2="277"/><pair kern="-20" kpx2="7897"/><pair kern="-20" kpx2="283"/><pair kern="-20" kpx2="7899"/><pair kern="-20" kpx2="281"/><pair kern="-20" kpx2="7901"/><pair kern="-9" kpx2="287"/><pair kern="-20" kpx2="7903"/><pair kern="-9" kpx2="285"/><pair kern="-20" kpx2="259"/><pair kern="-20" kpx2="7875"/><pair kern="-20" kpx2="257"/><pair kern="-20" kpx2="7877"/><pair kern="-20" kpx2="263"/><pair kern="-20" kpx2="7879"/><pair kern="-20" kpx2="261"/><pair kern="-20" kpx2="267"/><pair kern="-20" kpx2="265"/><pair kern="-20" kpx2="7885"/><pair kern="-20" kpx2="271"/><pair kern="-20" kpx2="7887"/><pair kern="-20" kpx2="269"/><pair kern="40" kpx2="34"/><pair kern="40" kpx2="39"/><pair kern="-20" kpx2="7907"/><pair kern="-9" kpx2="289"/><pair kern="-20" kpx2="7905"/><pair kern="-9" kpx2="291"/><pair kern="-20" kpx2="417"/><pair kern="-20" kpx2="339"/><pair kern="-20" kpx2="337"/><pair kern="-20" kpx2="335"/><pair kern="40" kpx2="8217"/><pair kern="-20" kpx2="333"/><pair kern="-20" kpx2="7681"/><pair kern="40" kpx2="8221"/><pair kern="-20" kpx2="7863"/><pair kern="-20" kpx2="509"/><pair kern="-9" kpx2="103"/><pair kern="-20" kpx2="7861"/><pair kern="-20" kpx2="100"/><pair kern="-20" kpx2="511"/><pair kern="-20" kpx2="101"/><pair kern="-20" kpx2="7859"/><pair kern="-20" kpx2="235"/><pair kern="-20" kpx2="234"/><pair kern="-20" kpx2="99"/><pair kern="-20" kpx2="7857"/><pair kern="-20" kpx2="233"/><pair kern="-20" kpx2="507"/><pair kern="-20" kpx2="232"/><pair kern="-20" kpx2="97"/><pair kern="-20" kpx2="7871"/><pair kern="-20" kpx2="231"/><pair kern="-20" kpx2="230"/><pair kern="-20" kpx2="111"/><pair kern="-20" kpx2="7869"/><pair kern="-20" kpx2="229"/><pair kern="-20" kpx2="228"/><pair kern="-20" kpx2="7867"/><pair kern="-20" kpx2="227"/><pair kern="-20" kpx2="226"/><pair kern="-20" kpx2="7865"/><pair kern="-20" kpx2="225"/><pair kern="-20" kpx2="224"/><pair kern="-20" kpx2="7845"/><pair kern="-20" kpx2="7843"/><pair kern="-20" kpx2="113"/><pair kern="-20" kpx2="248"/><pair kern="-20" kpx2="7841"/><pair kern="-20" kpx2="246"/><pair kern="-20" kpx2="7855"/><pair kern="-20" kpx2="244"/><pair kern="-20" kpx2="7853"/><pair kern="-20" kpx2="245"/><pair kern="-20" kpx2="242"/><pair kern="-20" kpx2="7851"/><pair kern="-20" kpx2="243"/><pair kern="-20" kpx2="7849"/></kerning><kerning kpx1="341"><pair kern="-20" kpx2="7889"/><pair kern="-20" kpx2="275"/><pair kern="-20" kpx2="273"/><pair kern="-20" kpx2="7893"/><pair kern="-20" kpx2="279"/><pair kern="-20" kpx2="7895"/><pair kern="-20" kpx2="277"/><pair kern="-20" kpx2="7897"/><pair kern="-20" kpx2="283"/><pair kern="-20" kpx2="7899"/><pair kern="-20" kpx2="281"/><pair kern="-20" kpx2="7901"/><pair kern="-9" kpx2="287"/><pair kern="-20" kpx2="7903"/><pair kern="-9" kpx2="285"/><pair kern="-20" kpx2="259"/><pair kern="-20" kpx2="7875"/><pair kern="-20" kpx2="257"/><pair kern="-20" kpx2="7877"/><pair kern="-20" kpx2="263"/><pair kern="-20" kpx2="7879"/><pair kern="-20" kpx2="261"/><pair kern="-20" kpx2="267"/><pair kern="-20" kpx2="265"/><pair kern="-20" kpx2="7885"/><pair kern="-20" kpx2="271"/><pair kern="-20" kpx2="7887"/><pair kern="-20" kpx2="269"/><pair kern="40" kpx2="34"/><pair kern="40" kpx2="39"/><pair kern="-20" kpx2="7907"/><pair kern="-9" kpx2="289"/><pair kern="-20" kpx2="7905"/><pair kern="-9" kpx2="291"/><pair kern="-20" kpx2="417"/><pair kern="-20" kpx2="339"/><pair kern="-20" kpx2="337"/><pair kern="-20" kpx2="335"/><pair kern="40" kpx2="8217"/><pair kern="-20" kpx2="333"/><pair kern="-20" kpx2="7681"/><pair kern="40" kpx2="8221"/><pair kern="-20" kpx2="7863"/><pair kern="-20" kpx2="509"/><pair kern="-9" kpx2="103"/><pair kern="-20" kpx2="7861"/><pair kern="-20" kpx2="100"/><pair kern="-20" kpx2="511"/><pair kern="-20" kpx2="101"/><pair kern="-20" kpx2="7859"/><pair kern="-20" kpx2="235"/><pair kern="-20" kpx2="234"/><pair kern="-20" kpx2="99"/><pair kern="-20" kpx2="7857"/><pair kern="-20" kpx2="233"/><pair kern="-20" kpx2="507"/><pair kern="-20" kpx2="232"/><pair kern="-20" kpx2="97"/><pair kern="-20" kpx2="7871"/><pair kern="-20" kpx2="231"/><pair kern="-20" kpx2="230"/><pair kern="-20" kpx2="111"/><pair kern="-20" kpx2="7869"/><pair kern="-20" kpx2="229"/><pair kern="-20" kpx2="228"/><pair kern="-20" kpx2="7867"/><pair kern="-20" kpx2="227"/><pair kern="-20" kpx2="226"/><pair kern="-20" kpx2="7865"/><pair kern="-20" kpx2="225"/><pair kern="-20" kpx2="224"/><pair kern="-20" kpx2="7845"/><pair kern="-20" kpx2="7843"/><pair kern="-20" kpx2="113"/><pair kern="-20" kpx2="248"/><pair kern="-20" kpx2="7841"/><pair kern="-20" kpx2="246"/><pair kern="-20" kpx2="7855"/><pair kern="-20" kpx2="244"/><pair kern="-20" kpx2="7853"/><pair kern="-20" kpx2="245"/><pair kern="-20" kpx2="242"/><pair kern="-20" kpx2="7851"/><pair kern="-20" kpx2="243"/><pair kern="-20" kpx2="7849"/></kerning><kerning kpx1="338"><pair kern="60" kpx2="74"/></kerning><kerning kpx1="336"><pair kern="-20" kpx2="258"/><pair kern="-20" kpx2="256"/><pair kern="-20" kpx2="260"/><pair kern="-9" kpx2="7922"/><pair kern="-9" kpx2="7926"/><pair kern="-9" kpx2="7924"/><pair kern="-9" kpx2="7928"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="44"/><pair kern="-29" kpx2="538"/><pair kern="-20" kpx2="65"/><pair kern="-20" kpx2="197"/><pair kern="-20" kpx2="196"/><pair kern="-20" kpx2="193"/><pair kern="-20" kpx2="192"/><pair kern="-9" kpx2="1029"/><pair kern="-20" kpx2="195"/><pair kern="-20" kpx2="194"/><pair kern="-9" kpx2="7812"/><pair kern="-9" kpx2="221"/><pair kern="-29" kpx2="84"/><pair kern="-9" kpx2="87"/><pair kern="-9" kpx2="86"/><pair kern="-9" kpx2="7808"/><pair kern="-9" kpx2="7810"/><pair kern="-40" kpx2="8218"/><pair kern="-9" kpx2="89"/><pair kern="-20" kpx2="88"/><pair kern="-40" kpx2="8222"/><pair kern="-20" kpx2="7680"/><pair kern="-9" kpx2="90"/><pair kern="-9" kpx2="372"/><pair kern="-20" kpx2="7862"/><pair kern="-9" kpx2="374"/><pair kern="-20" kpx2="7860"/><pair kern="-20" kpx2="7858"/><pair kern="-20" kpx2="506"/><pair kern="-20" kpx2="7856"/><pair kern="-9" kpx2="381"/><pair kern="-9" kpx2="377"/><pair kern="-9" kpx2="376"/><pair kern="-9" kpx2="379"/><pair kern="-29" kpx2="356"/><pair kern="-20" kpx2="7846"/><pair kern="-20" kpx2="7844"/><pair kern="-20" kpx2="7842"/><pair kern="-29" kpx2="354"/><pair kern="-20" kpx2="7840"/><pair kern="-20" kpx2="7854"/><pair kern="-20" kpx2="7852"/><pair kern="-20" kpx2="7850"/><pair kern="-20" kpx2="7848"/></kerning><kerning kpx1="1299"><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="8221"/></kerning><kerning kpx1="64256"><pair kern="60" kpx2="34"/><pair kern="60" kpx2="39"/><pair kern="60" kpx2="8217"/><pair kern="60" kpx2="8221"/></kerning><kerning kpx1="1298"><pair kern="109" kpx2="1032"/><pair kern="20" kpx2="1249"/><pair kern="-20" kpx2="1287"/><pair kern="-20" kpx2="1285"/></kerning><kerning kpx1="1296"><pair kern="-20" kpx2="1269"/><pair kern="-20" kpx2="1207"/><pair kern="-20" kpx2="1228"/><pair kern="-20" kpx2="1209"/><pair kern="-20" kpx2="1095"/></kerning><kerning kpx1="345"><pair kern="-20" kpx2="7889"/><pair kern="-20" kpx2="275"/><pair kern="-20" kpx2="273"/><pair kern="-20" kpx2="7893"/><pair kern="-20" kpx2="279"/><pair kern="-20" kpx2="7895"/><pair kern="-20" kpx2="277"/><pair kern="-20" kpx2="7897"/><pair kern="-20" kpx2="283"/><pair kern="-20" kpx2="7899"/><pair kern="-20" kpx2="281"/><pair kern="-20" kpx2="7901"/><pair kern="-9" kpx2="287"/><pair kern="-20" kpx2="7903"/><pair kern="-9" kpx2="285"/><pair kern="-20" kpx2="259"/><pair kern="-20" kpx2="7875"/><pair kern="-20" kpx2="257"/><pair kern="-20" kpx2="7877"/><pair kern="-20" kpx2="263"/><pair kern="-20" kpx2="7879"/><pair kern="-20" kpx2="261"/><pair kern="-20" kpx2="267"/><pair kern="-20" kpx2="265"/><pair kern="-20" kpx2="7885"/><pair kern="-20" kpx2="271"/><pair kern="-20" kpx2="7887"/><pair kern="-20" kpx2="269"/><pair kern="40" kpx2="34"/><pair kern="40" kpx2="39"/><pair kern="-20" kpx2="7907"/><pair kern="-9" kpx2="289"/><pair kern="-20" kpx2="7905"/><pair kern="-9" kpx2="291"/><pair kern="-20" kpx2="417"/><pair kern="-20" kpx2="339"/><pair kern="-20" kpx2="337"/><pair kern="-20" kpx2="335"/><pair kern="40" kpx2="8217"/><pair kern="-20" kpx2="333"/><pair kern="-20" kpx2="7681"/><pair kern="40" kpx2="8221"/><pair kern="-20" kpx2="7863"/><pair kern="-20" kpx2="509"/><pair kern="-9" kpx2="103"/><pair kern="-20" kpx2="7861"/><pair kern="-20" kpx2="100"/><pair kern="-20" kpx2="511"/><pair kern="-20" kpx2="101"/><pair kern="-20" kpx2="7859"/><pair kern="-20" kpx2="235"/><pair kern="-20" kpx2="234"/><pair kern="-20" kpx2="99"/><pair kern="-20" kpx2="7857"/><pair kern="-20" kpx2="233"/><pair kern="-20" kpx2="507"/><pair kern="-20" kpx2="232"/><pair kern="-20" kpx2="97"/><pair kern="-20" kpx2="7871"/><pair kern="-20" kpx2="231"/><pair kern="-20" kpx2="230"/><pair kern="-20" kpx2="111"/><pair kern="-20" kpx2="7869"/><pair kern="-20" kpx2="229"/><pair kern="-20" kpx2="228"/><pair kern="-20" kpx2="7867"/><pair kern="-20" kpx2="227"/><pair kern="-20" kpx2="226"/><pair kern="-20" kpx2="7865"/><pair kern="-20" kpx2="225"/><pair kern="-20" kpx2="224"/><pair kern="-20" kpx2="7845"/><pair kern="-20" kpx2="7843"/><pair kern="-20" kpx2="113"/><pair kern="-20" kpx2="248"/><pair kern="-20" kpx2="7841"/><pair kern="-20" kpx2="246"/><pair kern="-20" kpx2="7855"/><pair kern="-20" kpx2="244"/><pair kern="-20" kpx2="7853"/><pair kern="-20" kpx2="245"/><pair kern="-20" kpx2="242"/><pair kern="-20" kpx2="7851"/><pair kern="-20" kpx2="243"/><pair kern="-20" kpx2="7849"/></kerning><kerning kpx1="1290"><pair kern="-29" kpx2="1217"/><pair kern="-29" kpx2="1098"/><pair kern="-20" kpx2="1218"/><pair kern="-20" kpx2="1093"/><pair kern="-20" kpx2="1228"/><pair kern="-20" kpx2="1095"/><pair kern="-29" kpx2="1090"/><pair kern="-29" kpx2="1227"/><pair kern="-29" kpx2="1236"/><pair kern="-29" kpx2="1232"/><pair kern="-29" kpx2="1234"/><pair kern="-29" kpx2="1244"/><pair kern="-20" kpx2="1245"/><pair kern="-49" kpx2="34"/><pair kern="-20" kpx2="1130"/><pair kern="-49" kpx2="39"/><pair kern="-29" kpx2="1126"/><pair kern="-29" kpx2="1262"/><pair kern="-29" kpx2="1268"/><pair kern="-20" kpx2="1269"/><pair kern="-29" kpx2="1266"/><pair kern="-29" kpx2="1264"/><pair kern="-29" kpx2="1278"/><pair kern="-20" kpx2="1279"/><pair kern="-29" kpx2="1142"/><pair kern="-29" kpx2="1276"/><pair kern="-20" kpx2="1277"/><pair kern="-29" kpx2="1140"/><pair kern="-29" kpx2="1136"/><pair kern="-40" kpx2="1035"/><pair kern="-29" kpx2="1038"/><pair kern="-40" kpx2="1026"/><pair kern="-40" kpx2="1294"/><pair kern="-29" kpx2="1295"/><pair kern="-29" kpx2="1174"/><pair kern="-20" kpx2="1175"/><pair kern="-29" kpx2="1040"/><pair kern="-49" kpx2="8217"/><pair kern="-20" kpx2="1286"/><pair kern="-20" kpx2="1287"/><pair kern="-20" kpx2="1284"/><pair kern="-49" kpx2="8221"/><pair kern="-20" kpx2="1285"/><pair kern="-29" kpx2="1046"/><pair kern="-40" kpx2="1066"/><pair kern="-29" kpx2="1185"/><pair kern="-40" kpx2="1184"/><pair kern="-69" kpx2="1058"/><pair kern="-29" kpx2="1059"/><pair kern="-29" kpx2="1063"/><pair kern="-29" kpx2="1198"/><pair kern="-29" kpx2="1197"/><pair kern="-29" kpx2="1061"/><pair kern="-69" kpx2="1196"/><pair kern="-29" kpx2="1202"/><pair kern="-20" kpx2="1203"/><pair kern="-29" kpx2="1200"/><pair kern="-29" kpx2="1206"/><pair kern="-20" kpx2="1207"/><pair kern="-40" kpx2="1204"/><pair kern="-29" kpx2="1205"/><pair kern="-29" kpx2="1208"/><pair kern="-20" kpx2="1209"/><pair kern="-20" kpx2="1078"/></kerning><kerning kpx1="326"><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="8221"/></kerning><kerning kpx1="1291"><pair kern="-29" kpx2="1098"/><pair kern="-20" kpx2="1218"/><pair kern="-20" kpx2="1093"/><pair kern="-20" kpx2="1228"/><pair kern="-20" kpx2="1095"/><pair kern="-29" kpx2="1090"/><pair kern="-20" kpx2="1091"/><pair kern="-20" kpx2="1118"/><pair kern="-29" kpx2="1295"/><pair kern="-20" kpx2="1175"/><pair kern="-20" kpx2="1245"/><pair kern="-49" kpx2="8217"/><pair kern="-49" kpx2="1287"/><pair kern="-49" kpx2="8221"/><pair kern="-49" kpx2="1285"/><pair kern="-49" kpx2="34"/><pair kern="-29" kpx2="1185"/><pair kern="-49" kpx2="39"/><pair kern="-20" kpx2="1263"/><pair kern="-29" kpx2="1197"/><pair kern="-20" kpx2="1203"/><pair kern="-20" kpx2="1269"/><pair kern="-20" kpx2="1207"/><pair kern="-20" kpx2="1267"/><pair kern="-29" kpx2="1205"/><pair kern="-20" kpx2="1265"/><pair kern="-20" kpx2="1279"/><pair kern="-20" kpx2="1277"/><pair kern="-20" kpx2="1209"/><pair kern="-20" kpx2="1078"/></kerning><kerning kpx1="1288"><pair kern="-29" kpx2="1217"/><pair kern="-29" kpx2="1098"/><pair kern="-20" kpx2="1218"/><pair kern="-20" kpx2="1093"/><pair kern="-20" kpx2="1228"/><pair kern="-20" kpx2="1095"/><pair kern="-29" kpx2="1090"/><pair kern="-29" kpx2="1227"/><pair kern="-29" kpx2="1236"/><pair kern="-29" kpx2="1232"/><pair kern="-29" kpx2="1234"/><pair kern="-29" kpx2="1244"/><pair kern="-20" kpx2="1245"/><pair kern="-49" kpx2="34"/><pair kern="-20" kpx2="1130"/><pair kern="-49" kpx2="39"/><pair kern="-29" kpx2="1126"/><pair kern="-29" kpx2="1262"/><pair kern="-29" kpx2="1268"/><pair kern="-20" kpx2="1269"/><pair kern="-29" kpx2="1266"/><pair kern="-29" kpx2="1264"/><pair kern="-29" kpx2="1278"/><pair kern="-20" kpx2="1279"/><pair kern="-29" kpx2="1142"/><pair kern="-29" kpx2="1276"/><pair kern="-20" kpx2="1277"/><pair kern="-29" kpx2="1140"/><pair kern="-29" kpx2="1136"/><pair kern="-40" kpx2="1035"/><pair kern="-29" kpx2="1038"/><pair kern="-40" kpx2="1026"/><pair kern="-40" kpx2="1294"/><pair kern="-29" kpx2="1295"/><pair kern="-29" kpx2="1174"/><pair kern="-20" kpx2="1175"/><pair kern="-29" kpx2="1040"/><pair kern="-49" kpx2="8217"/><pair kern="-20" kpx2="1286"/><pair kern="-20" kpx2="1287"/><pair kern="-20" kpx2="1284"/><pair kern="-49" kpx2="8221"/><pair kern="-20" kpx2="1285"/><pair kern="-29" kpx2="1046"/><pair kern="-40" kpx2="1066"/><pair kern="-29" kpx2="1185"/><pair kern="-40" kpx2="1184"/><pair kern="-69" kpx2="1058"/><pair kern="-29" kpx2="1059"/><pair kern="-29" kpx2="1063"/><pair kern="-29" kpx2="1198"/><pair kern="-29" kpx2="1197"/><pair kern="-29" kpx2="1061"/><pair kern="-69" kpx2="1196"/><pair kern="-29" kpx2="1202"/><pair kern="-20" kpx2="1203"/><pair kern="-29" kpx2="1200"/><pair kern="-29" kpx2="1206"/><pair kern="-20" kpx2="1207"/><pair kern="-40" kpx2="1204"/><pair kern="-29" kpx2="1205"/><pair kern="-29" kpx2="1208"/><pair kern="-20" kpx2="1209"/><pair kern="-20" kpx2="1078"/></kerning><kerning kpx1="1289"><pair kern="-29" kpx2="1098"/><pair kern="-20" kpx2="1218"/><pair kern="-20" kpx2="1093"/><pair kern="-20" kpx2="1228"/><pair kern="-20" kpx2="1095"/><pair kern="-29" kpx2="1090"/><pair kern="-20" kpx2="1091"/><pair kern="-20" kpx2="1118"/><pair kern="-29" kpx2="1295"/><pair kern="-20" kpx2="1175"/><pair kern="-20" kpx2="1245"/><pair kern="-49" kpx2="8217"/><pair kern="-49" kpx2="1287"/><pair kern="-49" kpx2="8221"/><pair kern="-49" kpx2="1285"/><pair kern="-49" kpx2="34"/><pair kern="-29" kpx2="1185"/><pair kern="-49" kpx2="39"/><pair kern="-20" kpx2="1263"/><pair kern="-29" kpx2="1197"/><pair kern="-20" kpx2="1203"/><pair kern="-20" kpx2="1269"/><pair kern="-20" kpx2="1207"/><pair kern="-20" kpx2="1267"/><pair kern="-29" kpx2="1205"/><pair kern="-20" kpx2="1265"/><pair kern="-20" kpx2="1279"/><pair kern="-20" kpx2="1277"/><pair kern="-20" kpx2="1209"/><pair kern="-20" kpx2="1078"/></kerning><kerning kpx1="1294"><pair kern="-29" kpx2="1035"/><pair kern="-20" kpx2="1217"/><pair kern="-20" kpx2="1098"/><pair kern="-29" kpx2="1026"/><pair kern="-20" kpx2="1227"/><pair kern="-20" kpx2="1090"/><pair kern="-20" kpx2="1236"/><pair kern="-29" kpx2="1294"/><pair kern="-20" kpx2="1232"/><pair kern="-20" kpx2="1295"/><pair kern="-20" kpx2="1234"/><pair kern="-20" kpx2="1174"/><pair kern="-20" kpx2="1244"/><pair kern="-20" kpx2="1040"/><pair kern="-40" kpx2="8217"/><pair kern="-20" kpx2="1286"/><pair kern="-20" kpx2="1284"/><pair kern="-40" kpx2="8221"/><pair kern="-20" kpx2="1046"/><pair kern="-29" kpx2="1066"/><pair kern="-40" kpx2="34"/><pair kern="-20" kpx2="1185"/><pair kern="-29" kpx2="1184"/><pair kern="-40" kpx2="39"/><pair kern="-29" kpx2="1058"/><pair kern="-20" kpx2="1126"/><pair kern="-20" kpx2="1063"/><pair kern="-20" kpx2="1198"/><pair kern="-20" kpx2="1197"/><pair kern="-20" kpx2="1061"/><pair kern="-29" kpx2="1196"/><pair kern="-20" kpx2="1202"/><pair kern="-20" kpx2="1268"/><pair kern="-20" kpx2="1200"/><pair kern="-20" kpx2="1206"/><pair kern="-29" kpx2="1204"/><pair kern="-20" kpx2="1205"/><pair kern="-20" kpx2="1278"/><pair kern="-20" kpx2="1142"/><pair kern="-20" kpx2="1276"/><pair kern="-20" kpx2="1208"/><pair kern="-20" kpx2="1140"/><pair kern="-20" kpx2="1136"/></kerning><kerning kpx1="1295"><pair kern="-29" kpx2="1098"/><pair kern="-20" kpx2="1218"/><pair kern="-20" kpx2="1093"/><pair kern="-20" kpx2="1228"/><pair kern="-20" kpx2="1095"/><pair kern="-29" kpx2="1090"/><pair kern="-20" kpx2="1091"/><pair kern="-20" kpx2="1118"/><pair kern="-29" kpx2="1295"/><pair kern="-20" kpx2="1175"/><pair kern="-20" kpx2="1245"/><pair kern="-49" kpx2="8217"/><pair kern="-49" kpx2="1287"/><pair kern="-49" kpx2="8221"/><pair kern="-49" kpx2="1285"/><pair kern="-49" kpx2="34"/><pair kern="-29" kpx2="1185"/><pair kern="-49" kpx2="39"/><pair kern="-20" kpx2="1263"/><pair kern="-29" kpx2="1197"/><pair kern="-20" kpx2="1203"/><pair kern="-20" kpx2="1269"/><pair kern="-20" kpx2="1207"/><pair kern="-20" kpx2="1267"/><pair kern="-29" kpx2="1205"/><pair kern="-20" kpx2="1265"/><pair kern="-20" kpx2="1279"/><pair kern="-20" kpx2="1277"/><pair kern="-20" kpx2="1209"/><pair kern="-20" kpx2="1078"/></kerning><kerning kpx1="1292"><pair kern="-20" kpx2="1217"/><pair kern="-20" kpx2="1058"/><pair kern="-9" kpx2="1126"/><pair kern="-40" kpx2="46"/><pair kern="-9" kpx2="1198"/><pair kern="-40" kpx2="44"/><pair kern="-20" kpx2="1196"/><pair kern="-20" kpx2="1061"/><pair kern="-9" kpx2="1236"/><pair kern="-20" kpx2="1202"/><pair kern="-9" kpx2="1200"/><pair kern="-9" kpx2="1232"/><pair kern="-9" kpx2="1234"/><pair kern="-20" kpx2="1174"/><pair kern="-20" kpx2="1278"/><pair kern="-20" kpx2="1244"/><pair kern="-9" kpx2="1040"/><pair kern="-40" kpx2="8218"/><pair kern="-9" kpx2="1142"/><pair kern="-20" kpx2="1276"/><pair kern="-9" kpx2="1140"/><pair kern="-40" kpx2="8222"/><pair kern="-20" kpx2="1046"/></kerning><kerning kpx1="1293"><pair kern="-20" kpx2="34"/><pair kern="-20" kpx2="39"/><pair kern="-9" kpx2="1218"/><pair kern="-9" kpx2="1263"/><pair kern="-9" kpx2="1093"/><pair kern="-9" kpx2="1091"/><pair kern="-9" kpx2="1203"/><pair kern="-9" kpx2="1118"/><pair kern="-9" kpx2="1267"/><pair kern="-9" kpx2="1265"/><pair kern="-9" kpx2="1175"/><pair kern="-9" kpx2="1279"/><pair kern="-9" kpx2="1245"/><pair kern="-20" kpx2="8217"/><pair kern="-9" kpx2="1277"/><pair kern="-20" kpx2="1287"/><pair kern="-9" kpx2="1078"/><pair kern="-20" kpx2="8221"/><pair kern="-20" kpx2="1285"/></kerning><kerning kpx1="321"><pair kern="-20" kpx2="7888"/><pair kern="-20" kpx2="7890"/><pair kern="-20" kpx2="7892"/><pair kern="-20" kpx2="7894"/><pair kern="-20" kpx2="7896"/><pair kern="-20" kpx2="7898"/><pair kern="-20" kpx2="7900"/><pair kern="-20" kpx2="286"/><pair kern="-20" kpx2="7902"/><pair kern="-20" kpx2="284"/><pair kern="-20" kpx2="262"/><pair kern="-20" kpx2="266"/><pair kern="-20" kpx2="264"/><pair kern="-20" kpx2="7884"/><pair kern="-20" kpx2="7886"/><pair kern="-20" kpx2="268"/><pair kern="-80" kpx2="34"/><pair kern="-29" kpx2="7922"/><pair kern="-9" kpx2="7920"/><pair kern="-29" kpx2="7926"/><pair kern="-80" kpx2="39"/><pair kern="-29" kpx2="7924"/><pair kern="-29" kpx2="7928"/><pair kern="-20" kpx2="7906"/><pair kern="-20" kpx2="288"/><pair kern="-20" kpx2="7904"/><pair kern="-20" kpx2="290"/><pair kern="-9" kpx2="7910"/><pair kern="-9" kpx2="7908"/><pair kern="-9" kpx2="431"/><pair kern="-9" kpx2="7914"/><pair kern="-20" kpx2="416"/><pair kern="-9" kpx2="7912"/><pair kern="-9" kpx2="7918"/><pair kern="-9" kpx2="7916"/><pair kern="-20" kpx2="538"/><pair kern="-20" kpx2="71"/><pair kern="-20" kpx2="338"/><pair kern="-20" kpx2="67"/><pair kern="-20" kpx2="336"/><pair kern="-20" kpx2="199"/><pair kern="-20" kpx2="79"/><pair kern="-20" kpx2="7812"/><pair kern="-9" kpx2="220"/><pair kern="-9" kpx2="85"/><pair kern="-29" kpx2="221"/><pair kern="-20" kpx2="84"/><pair kern="-20" kpx2="87"/><pair kern="-20" kpx2="86"/><pair kern="-20" kpx2="216"/><pair kern="-20" kpx2="81"/><pair kern="-20" kpx2="7808"/><pair kern="-9" kpx2="217"/><pair kern="-20" kpx2="7810"/><pair kern="-9" kpx2="218"/><pair kern="-9" kpx2="219"/><pair kern="-20" kpx2="212"/><pair kern="-20" kpx2="334"/><pair kern="-20" kpx2="213"/><pair kern="-80" kpx2="8217"/><pair kern="-20" kpx2="214"/><pair kern="-20" kpx2="332"/><pair kern="-29" kpx2="89"/><pair kern="-80" kpx2="8221"/><pair kern="-20" kpx2="210"/><pair kern="-20" kpx2="211"/><pair kern="-20" kpx2="372"/><pair kern="-20" kpx2="510"/><pair kern="-29" kpx2="374"/><pair kern="-9" kpx2="368"/><pair kern="-9" kpx2="370"/><pair kern="-29" kpx2="376"/><pair kern="-20" kpx2="356"/><pair kern="-20" kpx2="354"/><pair kern="-9" kpx2="364"/><pair kern="-9" kpx2="366"/><pair kern="-9" kpx2="360"/><pair kern="-9" kpx2="362"/></kerning><kerning kpx1="1282"><pair kern="-29" kpx2="1217"/><pair kern="-29" kpx2="1098"/><pair kern="-20" kpx2="1218"/><pair kern="-20" kpx2="1093"/><pair kern="-20" kpx2="1228"/><pair kern="-20" kpx2="1095"/><pair kern="-29" kpx2="1090"/><pair kern="-29" kpx2="1227"/><pair kern="-29" kpx2="1236"/><pair kern="-29" kpx2="1232"/><pair kern="-29" kpx2="1234"/><pair kern="-29" kpx2="1244"/><pair kern="-20" kpx2="1245"/><pair kern="-49" kpx2="34"/><pair kern="-20" kpx2="1130"/><pair kern="-49" kpx2="39"/><pair kern="-29" kpx2="1126"/><pair kern="-29" kpx2="1262"/><pair kern="-29" kpx2="1268"/><pair kern="-20" kpx2="1269"/><pair kern="-29" kpx2="1266"/><pair kern="-29" kpx2="1264"/><pair kern="-29" kpx2="1278"/><pair kern="-20" kpx2="1279"/><pair kern="-29" kpx2="1142"/><pair kern="-29" kpx2="1276"/><pair kern="-20" kpx2="1277"/><pair kern="-29" kpx2="1140"/><pair kern="-29" kpx2="1136"/><pair kern="-40" kpx2="1035"/><pair kern="-29" kpx2="1038"/><pair kern="-40" kpx2="1026"/><pair kern="-40" kpx2="1294"/><pair kern="-29" kpx2="1295"/><pair kern="-29" kpx2="1174"/><pair kern="-20" kpx2="1175"/><pair kern="-29" kpx2="1040"/><pair kern="-49" kpx2="8217"/><pair kern="-20" kpx2="1286"/><pair kern="-20" kpx2="1287"/><pair kern="-20" kpx2="1284"/><pair kern="-49" kpx2="8221"/><pair kern="-20" kpx2="1285"/><pair kern="-29" kpx2="1046"/><pair kern="-40" kpx2="1066"/><pair kern="-29" kpx2="1185"/><pair kern="-40" kpx2="1184"/><pair kern="-69" kpx2="1058"/><pair kern="-29" kpx2="1059"/><pair kern="-29" kpx2="1063"/><pair kern="-29" kpx2="1198"/><pair kern="-29" kpx2="1197"/><pair kern="-29" kpx2="1061"/><pair kern="-69" kpx2="1196"/><pair kern="-29" kpx2="1202"/><pair kern="-20" kpx2="1203"/><pair kern="-29" kpx2="1200"/><pair kern="-29" kpx2="1206"/><pair kern="-20" kpx2="1207"/><pair kern="-40" kpx2="1204"/><pair kern="-29" kpx2="1205"/><pair kern="-29" kpx2="1208"/><pair kern="-20" kpx2="1209"/><pair kern="-20" kpx2="1078"/></kerning><kerning kpx1="334"><pair kern="-20" kpx2="258"/><pair kern="-20" kpx2="256"/><pair kern="-20" kpx2="260"/><pair kern="-9" kpx2="7922"/><pair kern="-9" kpx2="7926"/><pair kern="-9" kpx2="7924"/><pair kern="-9" kpx2="7928"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="44"/><pair kern="-29" kpx2="538"/><pair kern="-20" kpx2="65"/><pair kern="-20" kpx2="197"/><pair kern="-20" kpx2="196"/><pair kern="-20" kpx2="193"/><pair kern="-20" kpx2="192"/><pair kern="-9" kpx2="1029"/><pair kern="-20" kpx2="195"/><pair kern="-20" kpx2="194"/><pair kern="-9" kpx2="7812"/><pair kern="-9" kpx2="221"/><pair kern="-29" kpx2="84"/><pair kern="-9" kpx2="87"/><pair kern="-9" kpx2="86"/><pair kern="-9" kpx2="7808"/><pair kern="-9" kpx2="7810"/><pair kern="-40" kpx2="8218"/><pair kern="-9" kpx2="89"/><pair kern="-20" kpx2="88"/><pair kern="-40" kpx2="8222"/><pair kern="-20" kpx2="7680"/><pair kern="-9" kpx2="90"/><pair kern="-9" kpx2="372"/><pair kern="-20" kpx2="7862"/><pair kern="-9" kpx2="374"/><pair kern="-20" kpx2="7860"/><pair kern="-20" kpx2="7858"/><pair kern="-20" kpx2="506"/><pair kern="-20" kpx2="7856"/><pair kern="-9" kpx2="381"/><pair kern="-9" kpx2="377"/><pair kern="-9" kpx2="376"/><pair kern="-9" kpx2="379"/><pair kern="-29" kpx2="356"/><pair kern="-20" kpx2="7846"/><pair kern="-20" kpx2="7844"/><pair kern="-20" kpx2="7842"/><pair kern="-29" kpx2="354"/><pair kern="-20" kpx2="7840"/><pair kern="-20" kpx2="7854"/><pair kern="-20" kpx2="7852"/><pair kern="-20" kpx2="7850"/><pair kern="-20" kpx2="7848"/></kerning><kerning kpx1="1283"><pair kern="-29" kpx2="1098"/><pair kern="-20" kpx2="1218"/><pair kern="-20" kpx2="1093"/><pair kern="-20" kpx2="1228"/><pair kern="-20" kpx2="1095"/><pair kern="-29" kpx2="1090"/><pair kern="-20" kpx2="1091"/><pair kern="-20" kpx2="1118"/><pair kern="-29" kpx2="1295"/><pair kern="-20" kpx2="1175"/><pair kern="-20" kpx2="1245"/><pair kern="-49" kpx2="8217"/><pair kern="-49" kpx2="1287"/><pair kern="-49" kpx2="8221"/><pair kern="-49" kpx2="1285"/><pair kern="-49" kpx2="34"/><pair kern="-29" kpx2="1185"/><pair kern="-49" kpx2="39"/><pair kern="-20" kpx2="1263"/><pair kern="-29" kpx2="1197"/><pair kern="-20" kpx2="1203"/><pair kern="-20" kpx2="1269"/><pair kern="-20" kpx2="1207"/><pair kern="-20" kpx2="1267"/><pair kern="-29" kpx2="1205"/><pair kern="-20" kpx2="1265"/><pair kern="-20" kpx2="1279"/><pair kern="-20" kpx2="1277"/><pair kern="-20" kpx2="1209"/><pair kern="-20" kpx2="1078"/></kerning><kerning kpx1="332"><pair kern="-20" kpx2="258"/><pair kern="-20" kpx2="256"/><pair kern="-20" kpx2="260"/><pair kern="-9" kpx2="7922"/><pair kern="-9" kpx2="7926"/><pair kern="-9" kpx2="7924"/><pair kern="-9" kpx2="7928"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="44"/><pair kern="-29" kpx2="538"/><pair kern="-20" kpx2="65"/><pair kern="-20" kpx2="197"/><pair kern="-20" kpx2="196"/><pair kern="-20" kpx2="193"/><pair kern="-20" kpx2="192"/><pair kern="-9" kpx2="1029"/><pair kern="-20" kpx2="195"/><pair kern="-20" kpx2="194"/><pair kern="-9" kpx2="7812"/><pair kern="-9" kpx2="221"/><pair kern="-29" kpx2="84"/><pair kern="-9" kpx2="87"/><pair kern="-9" kpx2="86"/><pair kern="-9" kpx2="7808"/><pair kern="-9" kpx2="7810"/><pair kern="-40" kpx2="8218"/><pair kern="-9" kpx2="89"/><pair kern="-20" kpx2="88"/><pair kern="-40" kpx2="8222"/><pair kern="-20" kpx2="7680"/><pair kern="-9" kpx2="90"/><pair kern="-9" kpx2="372"/><pair kern="-20" kpx2="7862"/><pair kern="-9" kpx2="374"/><pair kern="-20" kpx2="7860"/><pair kern="-20" kpx2="7858"/><pair kern="-20" kpx2="506"/><pair kern="-20" kpx2="7856"/><pair kern="-9" kpx2="381"/><pair kern="-9" kpx2="377"/><pair kern="-9" kpx2="376"/><pair kern="-9" kpx2="379"/><pair kern="-29" kpx2="356"/><pair kern="-20" kpx2="7846"/><pair kern="-20" kpx2="7844"/><pair kern="-20" kpx2="7842"/><pair kern="-29" kpx2="354"/><pair kern="-20" kpx2="7840"/><pair kern="-20" kpx2="7854"/><pair kern="-20" kpx2="7852"/><pair kern="-20" kpx2="7850"/><pair kern="-20" kpx2="7848"/></kerning><kerning kpx1="1286"><pair kern="109" kpx2="1032"/><pair kern="20" kpx2="1249"/><pair kern="-20" kpx2="1287"/><pair kern="-20" kpx2="1285"/></kerning><kerning kpx1="1287"><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="8221"/></kerning><kerning kpx1="1284"><pair kern="-29" kpx2="1217"/><pair kern="-29" kpx2="1098"/><pair kern="-20" kpx2="1218"/><pair kern="-20" kpx2="1093"/><pair kern="-20" kpx2="1228"/><pair kern="-20" kpx2="1095"/><pair kern="-29" kpx2="1090"/><pair kern="-29" kpx2="1227"/><pair kern="-29" kpx2="1236"/><pair kern="-29" kpx2="1232"/><pair kern="-29" kpx2="1234"/><pair kern="-29" kpx2="1244"/><pair kern="-20" kpx2="1245"/><pair kern="-49" kpx2="34"/><pair kern="-20" kpx2="1130"/><pair kern="-49" kpx2="39"/><pair kern="-29" kpx2="1126"/><pair kern="-29" kpx2="1262"/><pair kern="-29" kpx2="1268"/><pair kern="-20" kpx2="1269"/><pair kern="-29" kpx2="1266"/><pair kern="-29" kpx2="1264"/><pair kern="-29" kpx2="1278"/><pair kern="-20" kpx2="1279"/><pair kern="-29" kpx2="1142"/><pair kern="-29" kpx2="1276"/><pair kern="-20" kpx2="1277"/><pair kern="-29" kpx2="1140"/><pair kern="-29" kpx2="1136"/><pair kern="-40" kpx2="1035"/><pair kern="-29" kpx2="1038"/><pair kern="-40" kpx2="1026"/><pair kern="-40" kpx2="1294"/><pair kern="-29" kpx2="1295"/><pair kern="-29" kpx2="1174"/><pair kern="-20" kpx2="1175"/><pair kern="-29" kpx2="1040"/><pair kern="-49" kpx2="8217"/><pair kern="-20" kpx2="1286"/><pair kern="-20" kpx2="1287"/><pair kern="-20" kpx2="1284"/><pair kern="-49" kpx2="8221"/><pair kern="-20" kpx2="1285"/><pair kern="-29" kpx2="1046"/><pair kern="-40" kpx2="1066"/><pair kern="-29" kpx2="1185"/><pair kern="-40" kpx2="1184"/><pair kern="-69" kpx2="1058"/><pair kern="-29" kpx2="1059"/><pair kern="-29" kpx2="1063"/><pair kern="-29" kpx2="1198"/><pair kern="-29" kpx2="1197"/><pair kern="-29" kpx2="1061"/><pair kern="-69" kpx2="1196"/><pair kern="-29" kpx2="1202"/><pair kern="-20" kpx2="1203"/><pair kern="-29" kpx2="1200"/><pair kern="-29" kpx2="1206"/><pair kern="-20" kpx2="1207"/><pair kern="-40" kpx2="1204"/><pair kern="-29" kpx2="1205"/><pair kern="-29" kpx2="1208"/><pair kern="-20" kpx2="1209"/><pair kern="-20" kpx2="1078"/></kerning><kerning kpx1="1285"><pair kern="-29" kpx2="1098"/><pair kern="-20" kpx2="1218"/><pair kern="-20" kpx2="1093"/><pair kern="-20" kpx2="1228"/><pair kern="-20" kpx2="1095"/><pair kern="-29" kpx2="1090"/><pair kern="-20" kpx2="1091"/><pair kern="-20" kpx2="1118"/><pair kern="-29" kpx2="1295"/><pair kern="-20" kpx2="1175"/><pair kern="-20" kpx2="1245"/><pair kern="-49" kpx2="8217"/><pair kern="-49" kpx2="1287"/><pair kern="-49" kpx2="8221"/><pair kern="-49" kpx2="1285"/><pair kern="-49" kpx2="34"/><pair kern="-29" kpx2="1185"/><pair kern="-49" kpx2="39"/><pair kern="-20" kpx2="1263"/><pair kern="-29" kpx2="1197"/><pair kern="-20" kpx2="1203"/><pair kern="-20" kpx2="1269"/><pair kern="-20" kpx2="1207"/><pair kern="-20" kpx2="1267"/><pair kern="-29" kpx2="1205"/><pair kern="-20" kpx2="1265"/><pair kern="-20" kpx2="1279"/><pair kern="-20" kpx2="1277"/><pair kern="-20" kpx2="1209"/><pair kern="-20" kpx2="1078"/></kerning><kerning kpx1="373"><pair kern="40" kpx2="34"/><pair kern="40" kpx2="39"/><pair kern="-40" kpx2="8218"/><pair kern="40" kpx2="8217"/><pair kern="20" kpx2="63"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="8222"/><pair kern="40" kpx2="8221"/><pair kern="-40" kpx2="44"/></kerning><kerning kpx1="372"><pair kern="-20" kpx2="7889"/><pair kern="-20" kpx2="275"/><pair kern="-9" kpx2="7888"/><pair kern="-20" kpx2="273"/><pair kern="-9" kpx2="7890"/><pair kern="-20" kpx2="7893"/><pair kern="-20" kpx2="279"/><pair kern="-9" kpx2="7892"/><pair kern="-20" kpx2="7895"/><pair kern="-20" kpx2="277"/><pair kern="-9" kpx2="7894"/><pair kern="-20" kpx2="7897"/><pair kern="-20" kpx2="283"/><pair kern="-9" kpx2="7896"/><pair kern="-20" kpx2="7899"/><pair kern="-20" kpx2="281"/><pair kern="-9" kpx2="7898"/><pair kern="-20" kpx2="7901"/><pair kern="-9" kpx2="287"/><pair kern="-9" kpx2="7900"/><pair kern="-9" kpx2="286"/><pair kern="-20" kpx2="7903"/><pair kern="-9" kpx2="285"/><pair kern="-9" kpx2="7902"/><pair kern="-9" kpx2="284"/><pair kern="-40" kpx2="258"/><pair kern="-20" kpx2="259"/><pair kern="-40" kpx2="256"/><pair kern="-20" kpx2="7875"/><pair kern="-20" kpx2="257"/><pair kern="-9" kpx2="262"/><pair kern="-20" kpx2="7877"/><pair kern="-20" kpx2="263"/><pair kern="-40" kpx2="260"/><pair kern="-20" kpx2="7879"/><pair kern="-20" kpx2="261"/><pair kern="-9" kpx2="266"/><pair kern="-20" kpx2="267"/><pair kern="-9" kpx2="264"/><pair kern="-20" kpx2="265"/><pair kern="-9" kpx2="7884"/><pair kern="-20" kpx2="7885"/><pair kern="-20" kpx2="271"/><pair kern="-9" kpx2="7886"/><pair kern="-9" kpx2="268"/><pair kern="-20" kpx2="7887"/><pair kern="-20" kpx2="269"/><pair kern="-9" kpx2="7921"/><pair kern="-9" kpx2="312"/><pair kern="-49" kpx2="46"/><pair kern="-49" kpx2="44"/><pair kern="-9" kpx2="7906"/><pair kern="-9" kpx2="288"/><pair kern="-20" kpx2="7907"/><pair kern="-9" kpx2="289"/><pair kern="-9" kpx2="7904"/><pair kern="-9" kpx2="290"/><pair kern="-20" kpx2="7905"/><pair kern="-9" kpx2="291"/><pair kern="-9" kpx2="7911"/><pair kern="-9" kpx2="7909"/><pair kern="-9" kpx2="7915"/><pair kern="-9" kpx2="7913"/><pair kern="-9" kpx2="537"/><pair kern="20" kpx2="63"/><pair kern="-9" kpx2="7919"/><pair kern="-9" kpx2="7917"/><pair kern="-9" kpx2="343"/><pair kern="-9" kpx2="341"/><pair kern="-9" kpx2="71"/><pair kern="-20" kpx2="339"/><pair kern="-40" kpx2="65"/><pair kern="-9" kpx2="338"/><pair kern="-20" kpx2="337"/><pair kern="-9" kpx2="67"/><pair kern="-9" kpx2="336"/><pair kern="-9" kpx2="351"/><pair kern="-9" kpx2="79"/><pair kern="-9" kpx2="347"/><pair kern="-9" kpx2="326"/><pair kern="-9" kpx2="324"/><pair kern="-9" kpx2="81"/><pair kern="-9" kpx2="334"/><pair kern="-49" kpx2="8218"/><pair kern="-20" kpx2="335"/><pair kern="-9" kpx2="332"/><pair kern="-20" kpx2="333"/><pair kern="-49" kpx2="8222"/><pair kern="-9" kpx2="331"/><pair kern="-20" kpx2="7863"/><pair kern="-40" kpx2="7862"/><pair kern="-9" kpx2="103"/><pair kern="-20" kpx2="7861"/><pair kern="-20" kpx2="100"/><pair kern="-40" kpx2="7860"/><pair kern="-20" kpx2="101"/><pair kern="-20" kpx2="7859"/><pair kern="-9" kpx2="369"/><pair kern="-40" kpx2="7858"/><pair kern="-20" kpx2="99"/><pair kern="-20" kpx2="7857"/><pair kern="-9" kpx2="371"/><pair kern="-40" kpx2="7856"/><pair kern="-20" kpx2="97"/><pair kern="-20" kpx2="7871"/><pair kern="-9" kpx2="110"/><pair kern="-20" kpx2="111"/><pair kern="-20" kpx2="7869"/><pair kern="-9" kpx2="109"/><pair kern="-20" kpx2="7867"/><pair kern="-20" kpx2="7865"/><pair kern="-40" kpx2="7846"/><pair kern="-40" kpx2="7844"/><pair kern="-9" kpx2="117"/><pair kern="-20" kpx2="7845"/><pair kern="-40" kpx2="7842"/><pair kern="-9" kpx2="115"/><pair kern="-20" kpx2="7843"/><pair kern="-9" kpx2="114"/><pair kern="-40" kpx2="7840"/><pair kern="-20" kpx2="113"/><pair kern="-20" kpx2="7841"/><pair kern="-9" kpx2="112"/><pair kern="-40" kpx2="7854"/><pair kern="-20" kpx2="7855"/><pair kern="-9" kpx2="365"/><pair kern="-40" kpx2="7852"/><pair kern="-20" kpx2="7853"/><pair kern="-9" kpx2="367"/><pair kern="-40" kpx2="7850"/><pair kern="-20" kpx2="7851"/><pair kern="-9" kpx2="361"/><pair kern="-40" kpx2="7848"/><pair kern="-20" kpx2="7849"/><pair kern="-9" kpx2="363"/><pair kern="-9" kpx2="432"/><pair kern="-20" kpx2="417"/><pair kern="-9" kpx2="416"/><pair kern="-40" kpx2="197"/><pair kern="-40" kpx2="196"/><pair kern="-9" kpx2="199"/><pair kern="-40" kpx2="193"/><pair kern="-40" kpx2="192"/><pair kern="-40" kpx2="195"/><pair kern="-40" kpx2="194"/><pair kern="-9" kpx2="216"/><pair kern="-9" kpx2="212"/><pair kern="-9" kpx2="213"/><pair kern="-9" kpx2="214"/><pair kern="-20" kpx2="7681"/><pair kern="-40" kpx2="7680"/><pair kern="-9" kpx2="210"/><pair kern="-9" kpx2="211"/><pair kern="-9" kpx2="7743"/><pair kern="-20" kpx2="509"/><pair kern="-9" kpx2="510"/><pair kern="-20" kpx2="511"/><pair kern="-20" kpx2="235"/><pair kern="-20" kpx2="234"/><pair kern="-40" kpx2="506"/><pair kern="-20" kpx2="233"/><pair kern="-20" kpx2="507"/><pair kern="-20" kpx2="232"/><pair kern="-20" kpx2="231"/><pair kern="-20" kpx2="230"/><pair kern="-20" kpx2="229"/><pair kern="-20" kpx2="228"/><pair kern="-20" kpx2="227"/><pair kern="-20" kpx2="226"/><pair kern="-20" kpx2="225"/><pair kern="-20" kpx2="224"/><pair kern="-9" kpx2="252"/><pair kern="-9" kpx2="250"/><pair kern="-9" kpx2="251"/><pair kern="-20" kpx2="248"/><pair kern="-9" kpx2="249"/><pair kern="-20" kpx2="246"/><pair kern="-20" kpx2="244"/><pair kern="-20" kpx2="245"/><pair kern="-20" kpx2="242"/><pair kern="-20" kpx2="243"/></kerning><kerning kpx1="375"><pair kern="40" kpx2="34"/><pair kern="40" kpx2="39"/><pair kern="-40" kpx2="8218"/><pair kern="40" kpx2="8217"/><pair kern="20" kpx2="63"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="8222"/><pair kern="40" kpx2="8221"/><pair kern="-40" kpx2="44"/></kerning><kerning kpx1="374"><pair kern="-49" kpx2="7889"/><pair kern="-49" kpx2="275"/><pair kern="-20" kpx2="7888"/><pair kern="-49" kpx2="273"/><pair kern="-20" kpx2="7890"/><pair kern="-49" kpx2="7893"/><pair kern="-49" kpx2="279"/><pair kern="-20" kpx2="7892"/><pair kern="-49" kpx2="7895"/><pair kern="-49" kpx2="277"/><pair kern="-20" kpx2="7894"/><pair kern="-49" kpx2="7897"/><pair kern="-49" kpx2="283"/><pair kern="-20" kpx2="7896"/><pair kern="-49" kpx2="7899"/><pair kern="-49" kpx2="281"/><pair kern="-20" kpx2="7898"/><pair kern="-49" kpx2="7901"/><pair kern="-20" kpx2="287"/><pair kern="-20" kpx2="7900"/><pair kern="-20" kpx2="286"/><pair kern="-49" kpx2="7903"/><pair kern="-20" kpx2="285"/><pair kern="-20" kpx2="7902"/><pair kern="-20" kpx2="284"/><pair kern="-60" kpx2="258"/><pair kern="-49" kpx2="259"/><pair kern="-60" kpx2="256"/><pair kern="-49" kpx2="7875"/><pair kern="-49" kpx2="257"/><pair kern="-20" kpx2="262"/><pair kern="-49" kpx2="7877"/><pair kern="-49" kpx2="263"/><pair kern="-60" kpx2="260"/><pair kern="-49" kpx2="7879"/><pair kern="-49" kpx2="261"/><pair kern="-20" kpx2="266"/><pair kern="-49" kpx2="267"/><pair kern="-20" kpx2="264"/><pair kern="-49" kpx2="265"/><pair kern="-20" kpx2="7884"/><pair kern="-49" kpx2="7885"/><pair kern="-49" kpx2="271"/><pair kern="-20" kpx2="7886"/><pair kern="-20" kpx2="268"/><pair kern="-49" kpx2="7887"/><pair kern="-49" kpx2="269"/><pair kern="-29" kpx2="7921"/><pair kern="-29" kpx2="312"/><pair kern="-60" kpx2="46"/><pair kern="-60" kpx2="44"/><pair kern="-20" kpx2="7906"/><pair kern="-20" kpx2="288"/><pair kern="-49" kpx2="7907"/><pair kern="-20" kpx2="289"/><pair kern="-20" kpx2="7904"/><pair kern="-20" kpx2="290"/><pair kern="-49" kpx2="7905"/><pair kern="-20" kpx2="291"/><pair kern="-29" kpx2="7911"/><pair kern="-29" kpx2="7909"/><pair kern="-29" kpx2="7915"/><pair kern="-29" kpx2="7913"/><pair kern="-40" kpx2="537"/><pair kern="20" kpx2="63"/><pair kern="-29" kpx2="7919"/><pair kern="-29" kpx2="7917"/><pair kern="-29" kpx2="343"/><pair kern="-29" kpx2="341"/><pair kern="-20" kpx2="71"/><pair kern="-49" kpx2="339"/><pair kern="-20" kpx2="338"/><pair kern="-60" kpx2="65"/><pair kern="-49" kpx2="337"/><pair kern="-20" kpx2="67"/><pair kern="-20" kpx2="336"/><pair kern="-40" kpx2="351"/><pair kern="-20" kpx2="79"/><pair kern="-40" kpx2="347"/><pair kern="-29" kpx2="326"/><pair kern="-29" kpx2="324"/><pair kern="-20" kpx2="81"/><pair kern="-20" kpx2="334"/><pair kern="-60" kpx2="8218"/><pair kern="-49" kpx2="335"/><pair kern="-20" kpx2="332"/><pair kern="-49" kpx2="333"/><pair kern="-60" kpx2="8222"/><pair kern="-29" kpx2="331"/><pair kern="-49" kpx2="7863"/><pair kern="-60" kpx2="7862"/><pair kern="-20" kpx2="103"/><pair kern="-49" kpx2="7861"/><pair kern="-49" kpx2="100"/><pair kern="-60" kpx2="7860"/><pair kern="-49" kpx2="101"/><pair kern="-49" kpx2="7859"/><pair kern="-29" kpx2="369"/><pair kern="-60" kpx2="7858"/><pair kern="-49" kpx2="99"/><pair kern="-49" kpx2="7857"/><pair kern="-29" kpx2="371"/><pair kern="-60" kpx2="7856"/><pair kern="-49" kpx2="97"/><pair kern="-49" kpx2="7871"/><pair kern="-29" kpx2="110"/><pair kern="-20" kpx2="380"/><pair kern="-49" kpx2="111"/><pair kern="-49" kpx2="7869"/><pair kern="-20" kpx2="382"/><pair kern="-29" kpx2="109"/><pair kern="-49" kpx2="7867"/><pair kern="-49" kpx2="7865"/><pair kern="-20" kpx2="378"/><pair kern="-60" kpx2="7846"/><pair kern="-60" kpx2="7844"/><pair kern="-29" kpx2="117"/><pair kern="-49" kpx2="7845"/><pair kern="-60" kpx2="7842"/><pair kern="-40" kpx2="115"/><pair kern="-49" kpx2="7843"/><pair kern="-29" kpx2="114"/><pair kern="-60" kpx2="7840"/><pair kern="-49" kpx2="113"/><pair kern="-49" kpx2="7841"/><pair kern="-29" kpx2="112"/><pair kern="-60" kpx2="7854"/><pair kern="-49" kpx2="7855"/><pair kern="-29" kpx2="365"/><pair kern="-60" kpx2="7852"/><pair kern="-49" kpx2="7853"/><pair kern="-29" kpx2="367"/><pair kern="-60" kpx2="7850"/><pair kern="-49" kpx2="7851"/><pair kern="-29" kpx2="361"/><pair kern="-20" kpx2="122"/><pair kern="-60" kpx2="7848"/><pair kern="-49" kpx2="7849"/><pair kern="-29" kpx2="363"/><pair kern="-29" kpx2="432"/><pair kern="-49" kpx2="417"/><pair kern="-20" kpx2="416"/><pair kern="-60" kpx2="197"/><pair kern="-60" kpx2="196"/><pair kern="-20" kpx2="199"/><pair kern="-60" kpx2="193"/><pair kern="-60" kpx2="192"/><pair kern="-60" kpx2="195"/><pair kern="-60" kpx2="194"/><pair kern="-20" kpx2="216"/><pair kern="-20" kpx2="212"/><pair kern="-20" kpx2="213"/><pair kern="-20" kpx2="214"/><pair kern="-49" kpx2="7681"/><pair kern="-60" kpx2="7680"/><pair kern="-20" kpx2="210"/><pair kern="-20" kpx2="211"/><pair kern="-29" kpx2="7743"/><pair kern="-49" kpx2="509"/><pair kern="-20" kpx2="510"/><pair kern="-49" kpx2="511"/><pair kern="-49" kpx2="235"/><pair kern="-49" kpx2="234"/><pair kern="-60" kpx2="506"/><pair kern="-49" kpx2="233"/><pair kern="-49" kpx2="507"/><pair kern="-49" kpx2="232"/><pair kern="-49" kpx2="231"/><pair kern="-49" kpx2="230"/><pair kern="-49" kpx2="229"/><pair kern="-49" kpx2="228"/><pair kern="-49" kpx2="227"/><pair kern="-49" kpx2="226"/><pair kern="-49" kpx2="225"/><pair kern="-49" kpx2="224"/><pair kern="-29" kpx2="252"/><pair kern="-29" kpx2="250"/><pair kern="-29" kpx2="251"/><pair kern="-49" kpx2="248"/><pair kern="-29" kpx2="249"/><pair kern="-49" kpx2="246"/><pair kern="-49" kpx2="244"/><pair kern="-49" kpx2="245"/><pair kern="-49" kpx2="242"/><pair kern="-49" kpx2="243"/></kerning><kerning kpx1="368"><pair kern="-9" kpx2="65"/><pair kern="-9" kpx2="197"/><pair kern="-9" kpx2="196"/><pair kern="-9" kpx2="193"/><pair kern="-9" kpx2="192"/><pair kern="-9" kpx2="195"/><pair kern="-9" kpx2="194"/><pair kern="-9" kpx2="258"/><pair kern="-9" kpx2="256"/><pair kern="-9" kpx2="260"/><pair kern="-20" kpx2="8218"/><pair kern="-20" kpx2="8222"/><pair kern="-9" kpx2="7680"/><pair kern="-9" kpx2="7862"/><pair kern="-9" kpx2="7860"/><pair kern="-9" kpx2="7858"/><pair kern="-9" kpx2="506"/><pair kern="-9" kpx2="7856"/><pair kern="-20" kpx2="46"/><pair kern="-20" kpx2="44"/><pair kern="-9" kpx2="7846"/><pair kern="-9" kpx2="7844"/><pair kern="-9" kpx2="7842"/><pair kern="-9" kpx2="7840"/><pair kern="-9" kpx2="7854"/><pair kern="-9" kpx2="7852"/><pair kern="-9" kpx2="7850"/><pair kern="-9" kpx2="7848"/></kerning><kerning kpx1="370"><pair kern="-9" kpx2="65"/><pair kern="-9" kpx2="197"/><pair kern="-9" kpx2="196"/><pair kern="-9" kpx2="193"/><pair kern="-9" kpx2="192"/><pair kern="-9" kpx2="195"/><pair kern="-9" kpx2="194"/><pair kern="-9" kpx2="258"/><pair kern="-9" kpx2="256"/><pair kern="-9" kpx2="260"/><pair kern="-20" kpx2="8218"/><pair kern="-20" kpx2="8222"/><pair kern="-9" kpx2="7680"/><pair kern="-9" kpx2="7862"/><pair kern="-9" kpx2="7860"/><pair kern="-9" kpx2="7858"/><pair kern="-9" kpx2="506"/><pair kern="-9" kpx2="7856"/><pair kern="-20" kpx2="46"/><pair kern="-20" kpx2="44"/><pair kern="-9" kpx2="7846"/><pair kern="-9" kpx2="7844"/><pair kern="-9" kpx2="7842"/><pair kern="-9" kpx2="7840"/><pair kern="-9" kpx2="7854"/><pair kern="-9" kpx2="7852"/><pair kern="-9" kpx2="7850"/><pair kern="-9" kpx2="7848"/></kerning><kerning kpx1="381"><pair kern="-9" kpx2="7888"/><pair kern="-9" kpx2="7890"/><pair kern="-9" kpx2="71"/><pair kern="-9" kpx2="7892"/><pair kern="-9" kpx2="338"/><pair kern="-9" kpx2="7894"/><pair kern="-9" kpx2="67"/><pair kern="-9" kpx2="336"/><pair kern="-9" kpx2="7896"/><pair kern="-9" kpx2="199"/><pair kern="-9" kpx2="7898"/><pair kern="-9" kpx2="79"/><pair kern="-9" kpx2="7900"/><pair kern="-9" kpx2="286"/><pair kern="-9" kpx2="7902"/><pair kern="-9" kpx2="284"/><pair kern="-9" kpx2="262"/><pair kern="-9" kpx2="216"/><pair kern="-9" kpx2="81"/><pair kern="-9" kpx2="212"/><pair kern="-9" kpx2="266"/><pair kern="-9" kpx2="334"/><pair kern="-9" kpx2="213"/><pair kern="-9" kpx2="214"/><pair kern="-9" kpx2="264"/><pair kern="-9" kpx2="332"/><pair kern="-9" kpx2="7884"/><pair kern="-9" kpx2="7886"/><pair kern="-9" kpx2="210"/><pair kern="-9" kpx2="268"/><pair kern="-9" kpx2="211"/><pair kern="-9" kpx2="510"/><pair kern="-9" kpx2="7906"/><pair kern="-9" kpx2="288"/><pair kern="-9" kpx2="7904"/><pair kern="-9" kpx2="290"/><pair kern="-9" kpx2="416"/></kerning><kerning kpx1="377"><pair kern="-9" kpx2="7888"/><pair kern="-9" kpx2="7890"/><pair kern="-9" kpx2="71"/><pair kern="-9" kpx2="7892"/><pair kern="-9" kpx2="338"/><pair kern="-9" kpx2="7894"/><pair kern="-9" kpx2="67"/><pair kern="-9" kpx2="336"/><pair kern="-9" kpx2="7896"/><pair kern="-9" kpx2="199"/><pair kern="-9" kpx2="7898"/><pair kern="-9" kpx2="79"/><pair kern="-9" kpx2="7900"/><pair kern="-9" kpx2="286"/><pair kern="-9" kpx2="7902"/><pair kern="-9" kpx2="284"/><pair kern="-9" kpx2="262"/><pair kern="-9" kpx2="216"/><pair kern="-9" kpx2="81"/><pair kern="-9" kpx2="212"/><pair kern="-9" kpx2="266"/><pair kern="-9" kpx2="334"/><pair kern="-9" kpx2="213"/><pair kern="-9" kpx2="214"/><pair kern="-9" kpx2="264"/><pair kern="-9" kpx2="332"/><pair kern="-9" kpx2="7884"/><pair kern="-9" kpx2="7886"/><pair kern="-9" kpx2="210"/><pair kern="-9" kpx2="268"/><pair kern="-9" kpx2="211"/><pair kern="-9" kpx2="510"/><pair kern="-9" kpx2="7906"/><pair kern="-9" kpx2="288"/><pair kern="-9" kpx2="7904"/><pair kern="-9" kpx2="290"/><pair kern="-9" kpx2="416"/></kerning><kerning kpx1="376"><pair kern="-49" kpx2="7889"/><pair kern="-49" kpx2="275"/><pair kern="-20" kpx2="7888"/><pair kern="-49" kpx2="273"/><pair kern="-20" kpx2="7890"/><pair kern="-49" kpx2="7893"/><pair kern="-49" kpx2="279"/><pair kern="-20" kpx2="7892"/><pair kern="-49" kpx2="7895"/><pair kern="-49" kpx2="277"/><pair kern="-20" kpx2="7894"/><pair kern="-49" kpx2="7897"/><pair kern="-49" kpx2="283"/><pair kern="-20" kpx2="7896"/><pair kern="-49" kpx2="7899"/><pair kern="-49" kpx2="281"/><pair kern="-20" kpx2="7898"/><pair kern="-49" kpx2="7901"/><pair kern="-20" kpx2="287"/><pair kern="-20" kpx2="7900"/><pair kern="-20" kpx2="286"/><pair kern="-49" kpx2="7903"/><pair kern="-20" kpx2="285"/><pair kern="-20" kpx2="7902"/><pair kern="-20" kpx2="284"/><pair kern="-60" kpx2="258"/><pair kern="-49" kpx2="259"/><pair kern="-60" kpx2="256"/><pair kern="-49" kpx2="7875"/><pair kern="-49" kpx2="257"/><pair kern="-20" kpx2="262"/><pair kern="-49" kpx2="7877"/><pair kern="-49" kpx2="263"/><pair kern="-60" kpx2="260"/><pair kern="-49" kpx2="7879"/><pair kern="-49" kpx2="261"/><pair kern="-20" kpx2="266"/><pair kern="-49" kpx2="267"/><pair kern="-20" kpx2="264"/><pair kern="-49" kpx2="265"/><pair kern="-20" kpx2="7884"/><pair kern="-49" kpx2="7885"/><pair kern="-49" kpx2="271"/><pair kern="-20" kpx2="7886"/><pair kern="-20" kpx2="268"/><pair kern="-49" kpx2="7887"/><pair kern="-49" kpx2="269"/><pair kern="-29" kpx2="7921"/><pair kern="-29" kpx2="312"/><pair kern="-60" kpx2="46"/><pair kern="-60" kpx2="44"/><pair kern="-20" kpx2="7906"/><pair kern="-20" kpx2="288"/><pair kern="-49" kpx2="7907"/><pair kern="-20" kpx2="289"/><pair kern="-20" kpx2="7904"/><pair kern="-20" kpx2="290"/><pair kern="-49" kpx2="7905"/><pair kern="-20" kpx2="291"/><pair kern="-29" kpx2="7911"/><pair kern="-29" kpx2="7909"/><pair kern="-29" kpx2="7915"/><pair kern="-29" kpx2="7913"/><pair kern="-40" kpx2="537"/><pair kern="20" kpx2="63"/><pair kern="-29" kpx2="7919"/><pair kern="-29" kpx2="7917"/><pair kern="-29" kpx2="343"/><pair kern="-29" kpx2="341"/><pair kern="-20" kpx2="71"/><pair kern="-49" kpx2="339"/><pair kern="-20" kpx2="338"/><pair kern="-60" kpx2="65"/><pair kern="-49" kpx2="337"/><pair kern="-20" kpx2="67"/><pair kern="-20" kpx2="336"/><pair kern="-40" kpx2="351"/><pair kern="-20" kpx2="79"/><pair kern="-40" kpx2="347"/><pair kern="-29" kpx2="326"/><pair kern="-29" kpx2="324"/><pair kern="-20" kpx2="81"/><pair kern="-20" kpx2="334"/><pair kern="-60" kpx2="8218"/><pair kern="-49" kpx2="335"/><pair kern="-20" kpx2="332"/><pair kern="-49" kpx2="333"/><pair kern="-60" kpx2="8222"/><pair kern="-29" kpx2="331"/><pair kern="-49" kpx2="7863"/><pair kern="-60" kpx2="7862"/><pair kern="-20" kpx2="103"/><pair kern="-49" kpx2="7861"/><pair kern="-49" kpx2="100"/><pair kern="-60" kpx2="7860"/><pair kern="-49" kpx2="101"/><pair kern="-49" kpx2="7859"/><pair kern="-29" kpx2="369"/><pair kern="-60" kpx2="7858"/><pair kern="-49" kpx2="99"/><pair kern="-49" kpx2="7857"/><pair kern="-29" kpx2="371"/><pair kern="-60" kpx2="7856"/><pair kern="-49" kpx2="97"/><pair kern="-49" kpx2="7871"/><pair kern="-29" kpx2="110"/><pair kern="-20" kpx2="380"/><pair kern="-49" kpx2="111"/><pair kern="-49" kpx2="7869"/><pair kern="-20" kpx2="382"/><pair kern="-29" kpx2="109"/><pair kern="-49" kpx2="7867"/><pair kern="-49" kpx2="7865"/><pair kern="-20" kpx2="378"/><pair kern="-60" kpx2="7846"/><pair kern="-60" kpx2="7844"/><pair kern="-29" kpx2="117"/><pair kern="-49" kpx2="7845"/><pair kern="-60" kpx2="7842"/><pair kern="-40" kpx2="115"/><pair kern="-49" kpx2="7843"/><pair kern="-29" kpx2="114"/><pair kern="-60" kpx2="7840"/><pair kern="-49" kpx2="113"/><pair kern="-49" kpx2="7841"/><pair kern="-29" kpx2="112"/><pair kern="-60" kpx2="7854"/><pair kern="-49" kpx2="7855"/><pair kern="-29" kpx2="365"/><pair kern="-60" kpx2="7852"/><pair kern="-49" kpx2="7853"/><pair kern="-29" kpx2="367"/><pair kern="-60" kpx2="7850"/><pair kern="-49" kpx2="7851"/><pair kern="-29" kpx2="361"/><pair kern="-20" kpx2="122"/><pair kern="-60" kpx2="7848"/><pair kern="-49" kpx2="7849"/><pair kern="-29" kpx2="363"/><pair kern="-29" kpx2="432"/><pair kern="-49" kpx2="417"/><pair kern="-20" kpx2="416"/><pair kern="-60" kpx2="197"/><pair kern="-60" kpx2="196"/><pair kern="-20" kpx2="199"/><pair kern="-60" kpx2="193"/><pair kern="-60" kpx2="192"/><pair kern="-60" kpx2="195"/><pair kern="-60" kpx2="194"/><pair kern="-20" kpx2="216"/><pair kern="-20" kpx2="212"/><pair kern="-20" kpx2="213"/><pair kern="-20" kpx2="214"/><pair kern="-49" kpx2="7681"/><pair kern="-60" kpx2="7680"/><pair kern="-20" kpx2="210"/><pair kern="-20" kpx2="211"/><pair kern="-29" kpx2="7743"/><pair kern="-49" kpx2="509"/><pair kern="-20" kpx2="510"/><pair kern="-49" kpx2="511"/><pair kern="-49" kpx2="235"/><pair kern="-49" kpx2="234"/><pair kern="-60" kpx2="506"/><pair kern="-49" kpx2="233"/><pair kern="-49" kpx2="507"/><pair kern="-49" kpx2="232"/><pair kern="-49" kpx2="231"/><pair kern="-49" kpx2="230"/><pair kern="-49" kpx2="229"/><pair kern="-49" kpx2="228"/><pair kern="-49" kpx2="227"/><pair kern="-49" kpx2="226"/><pair kern="-49" kpx2="225"/><pair kern="-49" kpx2="224"/><pair kern="-29" kpx2="252"/><pair kern="-29" kpx2="250"/><pair kern="-29" kpx2="251"/><pair kern="-49" kpx2="248"/><pair kern="-29" kpx2="249"/><pair kern="-49" kpx2="246"/><pair kern="-49" kpx2="244"/><pair kern="-49" kpx2="245"/><pair kern="-49" kpx2="242"/><pair kern="-49" kpx2="243"/></kerning><kerning kpx1="379"><pair kern="-9" kpx2="7888"/><pair kern="-9" kpx2="7890"/><pair kern="-9" kpx2="71"/><pair kern="-9" kpx2="7892"/><pair kern="-9" kpx2="338"/><pair kern="-9" kpx2="7894"/><pair kern="-9" kpx2="67"/><pair kern="-9" kpx2="336"/><pair kern="-9" kpx2="7896"/><pair kern="-9" kpx2="199"/><pair kern="-9" kpx2="7898"/><pair kern="-9" kpx2="79"/><pair kern="-9" kpx2="7900"/><pair kern="-9" kpx2="286"/><pair kern="-9" kpx2="7902"/><pair kern="-9" kpx2="284"/><pair kern="-9" kpx2="262"/><pair kern="-9" kpx2="216"/><pair kern="-9" kpx2="81"/><pair kern="-9" kpx2="212"/><pair kern="-9" kpx2="266"/><pair kern="-9" kpx2="334"/><pair kern="-9" kpx2="213"/><pair kern="-9" kpx2="214"/><pair kern="-9" kpx2="264"/><pair kern="-9" kpx2="332"/><pair kern="-9" kpx2="7884"/><pair kern="-9" kpx2="7886"/><pair kern="-9" kpx2="210"/><pair kern="-9" kpx2="268"/><pair kern="-9" kpx2="211"/><pair kern="-9" kpx2="510"/><pair kern="-9" kpx2="7906"/><pair kern="-9" kpx2="288"/><pair kern="-9" kpx2="7904"/><pair kern="-9" kpx2="290"/><pair kern="-9" kpx2="416"/></kerning><kerning kpx1="356"><pair kern="-60" kpx2="46"/><pair kern="-60" kpx2="44"/><pair kern="-40" kpx2="45"/><pair kern="20" kpx2="63"/><pair kern="-60" kpx2="537"/><pair kern="20" kpx2="538"/><pair kern="-20" kpx2="71"/><pair kern="-69" kpx2="65"/><pair kern="-20" kpx2="67"/><pair kern="-20" kpx2="79"/><pair kern="-40" kpx2="8211"/><pair kern="20" kpx2="84"/><pair kern="-20" kpx2="81"/><pair kern="-40" kpx2="8213"/><pair kern="-40" kpx2="8212"/><pair kern="-60" kpx2="8218"/><pair kern="-60" kpx2="8222"/><pair kern="-69" kpx2="103"/><pair kern="-69" kpx2="100"/><pair kern="-69" kpx2="101"/><pair kern="-69" kpx2="99"/><pair kern="-80" kpx2="97"/><pair kern="-49" kpx2="110"/><pair kern="-69" kpx2="111"/><pair kern="-49" kpx2="109"/><pair kern="-20" kpx2="119"/><pair kern="-20" kpx2="118"/><pair kern="-49" kpx2="117"/><pair kern="-60" kpx2="115"/><pair kern="-49" kpx2="114"/><pair kern="-69" kpx2="113"/><pair kern="-49" kpx2="112"/><pair kern="-40" kpx2="122"/><pair kern="-20" kpx2="121"/><pair kern="-20" kpx2="120"/><pair kern="-69" kpx2="197"/><pair kern="-69" kpx2="196"/><pair kern="-20" kpx2="199"/><pair kern="-69" kpx2="193"/><pair kern="-69" kpx2="192"/><pair kern="-69" kpx2="195"/><pair kern="-69" kpx2="194"/><pair kern="-20" kpx2="216"/><pair kern="-20" kpx2="212"/><pair kern="-20" kpx2="213"/><pair kern="-20" kpx2="214"/><pair kern="-20" kpx2="210"/><pair kern="-20" kpx2="211"/><pair kern="-69" kpx2="235"/><pair kern="-69" kpx2="234"/><pair kern="-69" kpx2="233"/><pair kern="-69" kpx2="232"/><pair kern="-69" kpx2="231"/><pair kern="-80" kpx2="230"/><pair kern="-80" kpx2="229"/><pair kern="-80" kpx2="228"/><pair kern="-80" kpx2="227"/><pair kern="-80" kpx2="226"/><pair kern="-80" kpx2="225"/><pair kern="-69" kpx2="224"/><pair kern="-49" kpx2="252"/><pair kern="-20" kpx2="253"/><pair kern="-49" kpx2="250"/><pair kern="-49" kpx2="251"/><pair kern="-69" kpx2="248"/><pair kern="-49" kpx2="249"/><pair kern="-69" kpx2="246"/><pair kern="-69" kpx2="244"/><pair kern="-69" kpx2="245"/><pair kern="-69" kpx2="242"/><pair kern="-69" kpx2="243"/><pair kern="-69" kpx2="275"/><pair kern="-69" kpx2="7889"/><pair kern="-20" kpx2="7888"/><pair kern="-69" kpx2="273"/><pair kern="-20" kpx2="7890"/><pair kern="-69" kpx2="279"/><pair kern="-69" kpx2="7893"/><pair kern="-20" kpx2="7892"/><pair kern="-69" kpx2="277"/><pair kern="-69" kpx2="7895"/><pair kern="-20" kpx2="7894"/><pair kern="-69" kpx2="283"/><pair kern="-69" kpx2="7897"/><pair kern="-20" kpx2="7896"/><pair kern="-69" kpx2="281"/><pair kern="-69" kpx2="7899"/><pair kern="-20" kpx2="7898"/><pair kern="-69" kpx2="287"/><pair kern="-69" kpx2="7901"/><pair kern="-20" kpx2="286"/><pair kern="-20" kpx2="7900"/><pair kern="-69" kpx2="285"/><pair kern="-69" kpx2="7903"/><pair kern="-20" kpx2="284"/><pair kern="-20" kpx2="7902"/><pair kern="-69" kpx2="258"/><pair kern="-80" kpx2="259"/><pair kern="-69" kpx2="256"/><pair kern="-80" kpx2="257"/><pair kern="-69" kpx2="7875"/><pair kern="-20" kpx2="262"/><pair kern="-69" kpx2="263"/><pair kern="-69" kpx2="7877"/><pair kern="-69" kpx2="260"/><pair kern="-80" kpx2="261"/><pair kern="-69" kpx2="7879"/><pair kern="-20" kpx2="266"/><pair kern="-69" kpx2="267"/><pair kern="-20" kpx2="264"/><pair kern="-69" kpx2="265"/><pair kern="-20" kpx2="7884"/><pair kern="-69" kpx2="271"/><pair kern="-69" kpx2="7885"/><pair kern="-20" kpx2="268"/><pair kern="-20" kpx2="7886"/><pair kern="-69" kpx2="269"/><pair kern="-69" kpx2="7887"/><pair kern="-49" kpx2="7921"/><pair kern="-20" kpx2="7925"/><pair kern="-49" kpx2="312"/><pair kern="-20" kpx2="288"/><pair kern="-20" kpx2="7906"/><pair kern="-69" kpx2="7907"/><pair kern="-69" kpx2="289"/><pair kern="-20" kpx2="290"/><pair kern="-20" kpx2="7904"/><pair kern="-69" kpx2="291"/><pair kern="-69" kpx2="7905"/><pair kern="-49" kpx2="7911"/><pair kern="-49" kpx2="7909"/><pair kern="-49" kpx2="7915"/><pair kern="-49" kpx2="7913"/><pair kern="-49" kpx2="7919"/><pair kern="-49" kpx2="7917"/><pair kern="-49" kpx2="343"/><pair kern="-49" kpx2="341"/><pair kern="-69" kpx2="339"/><pair kern="-20" kpx2="338"/><pair kern="-69" kpx2="337"/><pair kern="-20" kpx2="336"/><pair kern="-60" kpx2="351"/><pair kern="-60" kpx2="347"/><pair kern="-49" kpx2="326"/><pair kern="-49" kpx2="324"/><pair kern="-20" kpx2="7809"/><pair kern="-20" kpx2="7811"/><pair kern="-20" kpx2="334"/><pair kern="-69" kpx2="335"/><pair kern="-20" kpx2="332"/><pair kern="-69" kpx2="333"/><pair kern="-49" kpx2="331"/><pair kern="-20" kpx2="373"/><pair kern="-80" kpx2="7863"/><pair kern="-69" kpx2="7862"/><pair kern="-80" kpx2="7861"/><pair kern="-69" kpx2="7860"/><pair kern="-49" kpx2="369"/><pair kern="-80" kpx2="7859"/><pair kern="-69" kpx2="7858"/><pair kern="-49" kpx2="371"/><pair kern="-80" kpx2="7857"/><pair kern="-69" kpx2="7856"/><pair kern="-69" kpx2="7871"/><pair kern="-40" kpx2="380"/><pair kern="-69" kpx2="7869"/><pair kern="-40" kpx2="382"/><pair kern="-69" kpx2="7867"/><pair kern="-69" kpx2="7865"/><pair kern="-40" kpx2="378"/><pair kern="20" kpx2="356"/><pair kern="-69" kpx2="7846"/><pair kern="-69" kpx2="7844"/><pair kern="-80" kpx2="7845"/><pair kern="-69" kpx2="7842"/><pair kern="-80" kpx2="7843"/><pair kern="20" kpx2="354"/><pair kern="-69" kpx2="7840"/><pair kern="-80" kpx2="7841"/><pair kern="-69" kpx2="7854"/><pair kern="-49" kpx2="365"/><pair kern="-80" kpx2="7855"/><pair kern="-69" kpx2="7852"/><pair kern="-49" kpx2="367"/><pair kern="-80" kpx2="7853"/><pair kern="-69" kpx2="7850"/><pair kern="-49" kpx2="361"/><pair kern="-80" kpx2="7851"/><pair kern="-69" kpx2="7848"/><pair kern="-49" kpx2="363"/><pair kern="-80" kpx2="7849"/><pair kern="-49" kpx2="432"/><pair kern="-69" kpx2="417"/><pair kern="-20" kpx2="416"/><pair kern="-80" kpx2="7681"/><pair kern="-69" kpx2="7680"/><pair kern="-80" kpx2="509"/><pair kern="-49" kpx2="7743"/><pair kern="-20" kpx2="510"/><pair kern="-69" kpx2="511"/><pair kern="-69" kpx2="506"/><pair kern="-80" kpx2="507"/></kerning><kerning kpx1="357"><pair kern="20" kpx2="34"/><pair kern="20" kpx2="39"/><pair kern="20" kpx2="8217"/><pair kern="20" kpx2="8221"/></kerning><kerning kpx1="358"><pair kern="-60" kpx2="46"/><pair kern="-60" kpx2="44"/><pair kern="-40" kpx2="45"/><pair kern="20" kpx2="63"/><pair kern="-60" kpx2="537"/><pair kern="20" kpx2="538"/><pair kern="-20" kpx2="71"/><pair kern="-69" kpx2="65"/><pair kern="-20" kpx2="67"/><pair kern="-20" kpx2="79"/><pair kern="-40" kpx2="8211"/><pair kern="20" kpx2="84"/><pair kern="-20" kpx2="81"/><pair kern="-40" kpx2="8213"/><pair kern="-40" kpx2="8212"/><pair kern="-60" kpx2="8218"/><pair kern="-60" kpx2="8222"/><pair kern="-69" kpx2="103"/><pair kern="-69" kpx2="100"/><pair kern="-69" kpx2="101"/><pair kern="-69" kpx2="99"/><pair kern="-80" kpx2="97"/><pair kern="-49" kpx2="110"/><pair kern="-69" kpx2="111"/><pair kern="-49" kpx2="109"/><pair kern="-20" kpx2="119"/><pair kern="-20" kpx2="118"/><pair kern="-49" kpx2="117"/><pair kern="-60" kpx2="115"/><pair kern="-49" kpx2="114"/><pair kern="-69" kpx2="113"/><pair kern="-49" kpx2="112"/><pair kern="-40" kpx2="122"/><pair kern="-20" kpx2="121"/><pair kern="-20" kpx2="120"/><pair kern="-69" kpx2="197"/><pair kern="-69" kpx2="196"/><pair kern="-20" kpx2="199"/><pair kern="-69" kpx2="193"/><pair kern="-69" kpx2="192"/><pair kern="-69" kpx2="195"/><pair kern="-69" kpx2="194"/><pair kern="-20" kpx2="216"/><pair kern="-20" kpx2="212"/><pair kern="-20" kpx2="213"/><pair kern="-20" kpx2="214"/><pair kern="-20" kpx2="210"/><pair kern="-20" kpx2="211"/><pair kern="-69" kpx2="235"/><pair kern="-69" kpx2="234"/><pair kern="-69" kpx2="233"/><pair kern="-69" kpx2="232"/><pair kern="-69" kpx2="231"/><pair kern="-80" kpx2="230"/><pair kern="-80" kpx2="229"/><pair kern="-80" kpx2="228"/><pair kern="-80" kpx2="227"/><pair kern="-80" kpx2="226"/><pair kern="-80" kpx2="225"/><pair kern="-69" kpx2="224"/><pair kern="-49" kpx2="252"/><pair kern="-20" kpx2="253"/><pair kern="-49" kpx2="250"/><pair kern="-49" kpx2="251"/><pair kern="-69" kpx2="248"/><pair kern="-49" kpx2="249"/><pair kern="-69" kpx2="246"/><pair kern="-69" kpx2="244"/><pair kern="-69" kpx2="245"/><pair kern="-69" kpx2="242"/><pair kern="-69" kpx2="243"/><pair kern="-69" kpx2="275"/><pair kern="-69" kpx2="7889"/><pair kern="-20" kpx2="7888"/><pair kern="-69" kpx2="273"/><pair kern="-20" kpx2="7890"/><pair kern="-69" kpx2="279"/><pair kern="-69" kpx2="7893"/><pair kern="-20" kpx2="7892"/><pair kern="-69" kpx2="277"/><pair kern="-69" kpx2="7895"/><pair kern="-20" kpx2="7894"/><pair kern="-69" kpx2="283"/><pair kern="-69" kpx2="7897"/><pair kern="-20" kpx2="7896"/><pair kern="-69" kpx2="281"/><pair kern="-69" kpx2="7899"/><pair kern="-20" kpx2="7898"/><pair kern="-69" kpx2="287"/><pair kern="-69" kpx2="7901"/><pair kern="-20" kpx2="286"/><pair kern="-20" kpx2="7900"/><pair kern="-69" kpx2="285"/><pair kern="-69" kpx2="7903"/><pair kern="-20" kpx2="284"/><pair kern="-20" kpx2="7902"/><pair kern="-69" kpx2="258"/><pair kern="-80" kpx2="259"/><pair kern="-69" kpx2="256"/><pair kern="-80" kpx2="257"/><pair kern="-69" kpx2="7875"/><pair kern="-20" kpx2="262"/><pair kern="-69" kpx2="263"/><pair kern="-69" kpx2="7877"/><pair kern="-69" kpx2="260"/><pair kern="-80" kpx2="261"/><pair kern="-69" kpx2="7879"/><pair kern="-20" kpx2="266"/><pair kern="-69" kpx2="267"/><pair kern="-20" kpx2="264"/><pair kern="-69" kpx2="265"/><pair kern="-20" kpx2="7884"/><pair kern="-69" kpx2="271"/><pair kern="-69" kpx2="7885"/><pair kern="-20" kpx2="268"/><pair kern="-20" kpx2="7886"/><pair kern="-69" kpx2="269"/><pair kern="-69" kpx2="7887"/><pair kern="-49" kpx2="7921"/><pair kern="-20" kpx2="7925"/><pair kern="-49" kpx2="312"/><pair kern="-20" kpx2="288"/><pair kern="-20" kpx2="7906"/><pair kern="-69" kpx2="7907"/><pair kern="-69" kpx2="289"/><pair kern="-20" kpx2="290"/><pair kern="-20" kpx2="7904"/><pair kern="-69" kpx2="291"/><pair kern="-69" kpx2="7905"/><pair kern="-49" kpx2="7911"/><pair kern="-49" kpx2="7909"/><pair kern="-49" kpx2="7915"/><pair kern="-49" kpx2="7913"/><pair kern="-49" kpx2="7919"/><pair kern="-49" kpx2="7917"/><pair kern="-49" kpx2="343"/><pair kern="-49" kpx2="341"/><pair kern="-69" kpx2="339"/><pair kern="-20" kpx2="338"/><pair kern="-69" kpx2="337"/><pair kern="-20" kpx2="336"/><pair kern="-60" kpx2="351"/><pair kern="-60" kpx2="347"/><pair kern="-49" kpx2="326"/><pair kern="-49" kpx2="324"/><pair kern="-20" kpx2="7809"/><pair kern="-20" kpx2="7811"/><pair kern="-20" kpx2="334"/><pair kern="-69" kpx2="335"/><pair kern="-20" kpx2="332"/><pair kern="-69" kpx2="333"/><pair kern="-49" kpx2="331"/><pair kern="-20" kpx2="373"/><pair kern="-80" kpx2="7863"/><pair kern="-69" kpx2="7862"/><pair kern="-80" kpx2="7861"/><pair kern="-69" kpx2="7860"/><pair kern="-49" kpx2="369"/><pair kern="-80" kpx2="7859"/><pair kern="-69" kpx2="7858"/><pair kern="-49" kpx2="371"/><pair kern="-80" kpx2="7857"/><pair kern="-69" kpx2="7856"/><pair kern="-69" kpx2="7871"/><pair kern="-40" kpx2="380"/><pair kern="-69" kpx2="7869"/><pair kern="-40" kpx2="382"/><pair kern="-69" kpx2="7867"/><pair kern="-69" kpx2="7865"/><pair kern="-40" kpx2="378"/><pair kern="20" kpx2="356"/><pair kern="-69" kpx2="7846"/><pair kern="-69" kpx2="7844"/><pair kern="-80" kpx2="7845"/><pair kern="-69" kpx2="7842"/><pair kern="-80" kpx2="7843"/><pair kern="20" kpx2="354"/><pair kern="-69" kpx2="7840"/><pair kern="-80" kpx2="7841"/><pair kern="-69" kpx2="7854"/><pair kern="-49" kpx2="365"/><pair kern="-80" kpx2="7855"/><pair kern="-69" kpx2="7852"/><pair kern="-49" kpx2="367"/><pair kern="-80" kpx2="7853"/><pair kern="-69" kpx2="7850"/><pair kern="-49" kpx2="361"/><pair kern="-80" kpx2="7851"/><pair kern="-69" kpx2="7848"/><pair kern="-49" kpx2="363"/><pair kern="-80" kpx2="7849"/><pair kern="-49" kpx2="432"/><pair kern="-69" kpx2="417"/><pair kern="-20" kpx2="416"/><pair kern="-80" kpx2="7681"/><pair kern="-69" kpx2="7680"/><pair kern="-80" kpx2="509"/><pair kern="-49" kpx2="7743"/><pair kern="-20" kpx2="510"/><pair kern="-69" kpx2="511"/><pair kern="-69" kpx2="506"/><pair kern="-80" kpx2="507"/></kerning><kerning kpx1="354"><pair kern="-60" kpx2="46"/><pair kern="-60" kpx2="44"/><pair kern="-40" kpx2="45"/><pair kern="20" kpx2="63"/><pair kern="-60" kpx2="537"/><pair kern="20" kpx2="538"/><pair kern="-20" kpx2="71"/><pair kern="-69" kpx2="65"/><pair kern="-20" kpx2="67"/><pair kern="-20" kpx2="79"/><pair kern="-40" kpx2="8211"/><pair kern="20" kpx2="84"/><pair kern="-20" kpx2="81"/><pair kern="-40" kpx2="8213"/><pair kern="-40" kpx2="8212"/><pair kern="-60" kpx2="8218"/><pair kern="-60" kpx2="8222"/><pair kern="-69" kpx2="103"/><pair kern="-69" kpx2="100"/><pair kern="-69" kpx2="101"/><pair kern="-69" kpx2="99"/><pair kern="-80" kpx2="97"/><pair kern="-49" kpx2="110"/><pair kern="-69" kpx2="111"/><pair kern="-49" kpx2="109"/><pair kern="-20" kpx2="119"/><pair kern="-20" kpx2="118"/><pair kern="-49" kpx2="117"/><pair kern="-60" kpx2="115"/><pair kern="-49" kpx2="114"/><pair kern="-69" kpx2="113"/><pair kern="-49" kpx2="112"/><pair kern="-40" kpx2="122"/><pair kern="-20" kpx2="121"/><pair kern="-20" kpx2="120"/><pair kern="-69" kpx2="197"/><pair kern="-69" kpx2="196"/><pair kern="-20" kpx2="199"/><pair kern="-69" kpx2="193"/><pair kern="-69" kpx2="192"/><pair kern="-69" kpx2="195"/><pair kern="-69" kpx2="194"/><pair kern="-20" kpx2="216"/><pair kern="-20" kpx2="212"/><pair kern="-20" kpx2="213"/><pair kern="-20" kpx2="214"/><pair kern="-20" kpx2="210"/><pair kern="-20" kpx2="211"/><pair kern="-69" kpx2="235"/><pair kern="-69" kpx2="234"/><pair kern="-69" kpx2="233"/><pair kern="-69" kpx2="232"/><pair kern="-69" kpx2="231"/><pair kern="-80" kpx2="230"/><pair kern="-80" kpx2="229"/><pair kern="-80" kpx2="228"/><pair kern="-80" kpx2="227"/><pair kern="-80" kpx2="226"/><pair kern="-80" kpx2="225"/><pair kern="-69" kpx2="224"/><pair kern="-49" kpx2="252"/><pair kern="-20" kpx2="253"/><pair kern="-49" kpx2="250"/><pair kern="-49" kpx2="251"/><pair kern="-69" kpx2="248"/><pair kern="-49" kpx2="249"/><pair kern="-69" kpx2="246"/><pair kern="-69" kpx2="244"/><pair kern="-69" kpx2="245"/><pair kern="-69" kpx2="242"/><pair kern="-69" kpx2="243"/><pair kern="-69" kpx2="275"/><pair kern="-69" kpx2="7889"/><pair kern="-20" kpx2="7888"/><pair kern="-69" kpx2="273"/><pair kern="-20" kpx2="7890"/><pair kern="-69" kpx2="279"/><pair kern="-69" kpx2="7893"/><pair kern="-20" kpx2="7892"/><pair kern="-69" kpx2="277"/><pair kern="-69" kpx2="7895"/><pair kern="-20" kpx2="7894"/><pair kern="-69" kpx2="283"/><pair kern="-69" kpx2="7897"/><pair kern="-20" kpx2="7896"/><pair kern="-69" kpx2="281"/><pair kern="-69" kpx2="7899"/><pair kern="-20" kpx2="7898"/><pair kern="-69" kpx2="287"/><pair kern="-69" kpx2="7901"/><pair kern="-20" kpx2="286"/><pair kern="-20" kpx2="7900"/><pair kern="-69" kpx2="285"/><pair kern="-69" kpx2="7903"/><pair kern="-20" kpx2="284"/><pair kern="-20" kpx2="7902"/><pair kern="-69" kpx2="258"/><pair kern="-80" kpx2="259"/><pair kern="-69" kpx2="256"/><pair kern="-80" kpx2="257"/><pair kern="-69" kpx2="7875"/><pair kern="-20" kpx2="262"/><pair kern="-69" kpx2="263"/><pair kern="-69" kpx2="7877"/><pair kern="-69" kpx2="260"/><pair kern="-80" kpx2="261"/><pair kern="-69" kpx2="7879"/><pair kern="-20" kpx2="266"/><pair kern="-69" kpx2="267"/><pair kern="-20" kpx2="264"/><pair kern="-69" kpx2="265"/><pair kern="-20" kpx2="7884"/><pair kern="-69" kpx2="271"/><pair kern="-69" kpx2="7885"/><pair kern="-20" kpx2="268"/><pair kern="-20" kpx2="7886"/><pair kern="-69" kpx2="269"/><pair kern="-69" kpx2="7887"/><pair kern="-49" kpx2="7921"/><pair kern="-20" kpx2="7925"/><pair kern="-49" kpx2="312"/><pair kern="-20" kpx2="288"/><pair kern="-20" kpx2="7906"/><pair kern="-69" kpx2="7907"/><pair kern="-69" kpx2="289"/><pair kern="-20" kpx2="290"/><pair kern="-20" kpx2="7904"/><pair kern="-69" kpx2="291"/><pair kern="-69" kpx2="7905"/><pair kern="-49" kpx2="7911"/><pair kern="-49" kpx2="7909"/><pair kern="-49" kpx2="7915"/><pair kern="-49" kpx2="7913"/><pair kern="-49" kpx2="7919"/><pair kern="-49" kpx2="7917"/><pair kern="-49" kpx2="343"/><pair kern="-49" kpx2="341"/><pair kern="-69" kpx2="339"/><pair kern="-20" kpx2="338"/><pair kern="-69" kpx2="337"/><pair kern="-20" kpx2="336"/><pair kern="-60" kpx2="351"/><pair kern="-60" kpx2="347"/><pair kern="-49" kpx2="326"/><pair kern="-49" kpx2="324"/><pair kern="-20" kpx2="7809"/><pair kern="-20" kpx2="7811"/><pair kern="-20" kpx2="334"/><pair kern="-69" kpx2="335"/><pair kern="-20" kpx2="332"/><pair kern="-69" kpx2="333"/><pair kern="-49" kpx2="331"/><pair kern="-20" kpx2="373"/><pair kern="-80" kpx2="7863"/><pair kern="-69" kpx2="7862"/><pair kern="-80" kpx2="7861"/><pair kern="-69" kpx2="7860"/><pair kern="-49" kpx2="369"/><pair kern="-80" kpx2="7859"/><pair kern="-69" kpx2="7858"/><pair kern="-49" kpx2="371"/><pair kern="-80" kpx2="7857"/><pair kern="-69" kpx2="7856"/><pair kern="-69" kpx2="7871"/><pair kern="-40" kpx2="380"/><pair kern="-69" kpx2="7869"/><pair kern="-40" kpx2="382"/><pair kern="-69" kpx2="7867"/><pair kern="-69" kpx2="7865"/><pair kern="-40" kpx2="378"/><pair kern="20" kpx2="356"/><pair kern="-69" kpx2="7846"/><pair kern="-69" kpx2="7844"/><pair kern="-80" kpx2="7845"/><pair kern="-69" kpx2="7842"/><pair kern="-80" kpx2="7843"/><pair kern="20" kpx2="354"/><pair kern="-69" kpx2="7840"/><pair kern="-80" kpx2="7841"/><pair kern="-69" kpx2="7854"/><pair kern="-49" kpx2="365"/><pair kern="-80" kpx2="7855"/><pair kern="-69" kpx2="7852"/><pair kern="-49" kpx2="367"/><pair kern="-80" kpx2="7853"/><pair kern="-69" kpx2="7850"/><pair kern="-49" kpx2="361"/><pair kern="-80" kpx2="7851"/><pair kern="-69" kpx2="7848"/><pair kern="-49" kpx2="363"/><pair kern="-80" kpx2="7849"/><pair kern="-49" kpx2="432"/><pair kern="-69" kpx2="417"/><pair kern="-20" kpx2="416"/><pair kern="-80" kpx2="7681"/><pair kern="-69" kpx2="7680"/><pair kern="-80" kpx2="509"/><pair kern="-49" kpx2="7743"/><pair kern="-20" kpx2="510"/><pair kern="-69" kpx2="511"/><pair kern="-69" kpx2="506"/><pair kern="-80" kpx2="507"/></kerning><kerning kpx1="355"><pair kern="20" kpx2="34"/><pair kern="20" kpx2="39"/><pair kern="20" kpx2="8217"/><pair kern="20" kpx2="8221"/></kerning><kerning kpx1="364"><pair kern="-9" kpx2="65"/><pair kern="-9" kpx2="197"/><pair kern="-9" kpx2="196"/><pair kern="-9" kpx2="193"/><pair kern="-9" kpx2="192"/><pair kern="-9" kpx2="195"/><pair kern="-9" kpx2="194"/><pair kern="-9" kpx2="258"/><pair kern="-9" kpx2="256"/><pair kern="-9" kpx2="260"/><pair kern="-20" kpx2="8218"/><pair kern="-20" kpx2="8222"/><pair kern="-9" kpx2="7680"/><pair kern="-9" kpx2="7862"/><pair kern="-9" kpx2="7860"/><pair kern="-9" kpx2="7858"/><pair kern="-9" kpx2="506"/><pair kern="-9" kpx2="7856"/><pair kern="-20" kpx2="46"/><pair kern="-20" kpx2="44"/><pair kern="-9" kpx2="7846"/><pair kern="-9" kpx2="7844"/><pair kern="-9" kpx2="7842"/><pair kern="-9" kpx2="7840"/><pair kern="-9" kpx2="7854"/><pair kern="-9" kpx2="7852"/><pair kern="-9" kpx2="7850"/><pair kern="-9" kpx2="7848"/></kerning><kerning kpx1="366"><pair kern="-9" kpx2="65"/><pair kern="-9" kpx2="197"/><pair kern="-9" kpx2="196"/><pair kern="-9" kpx2="193"/><pair kern="-9" kpx2="192"/><pair kern="-9" kpx2="195"/><pair kern="-9" kpx2="194"/><pair kern="-9" kpx2="258"/><pair kern="-9" kpx2="256"/><pair kern="-9" kpx2="260"/><pair kern="-20" kpx2="8218"/><pair kern="-20" kpx2="8222"/><pair kern="-9" kpx2="7680"/><pair kern="-9" kpx2="7862"/><pair kern="-9" kpx2="7860"/><pair kern="-9" kpx2="7858"/><pair kern="-9" kpx2="506"/><pair kern="-9" kpx2="7856"/><pair kern="-20" kpx2="46"/><pair kern="-20" kpx2="44"/><pair kern="-9" kpx2="7846"/><pair kern="-9" kpx2="7844"/><pair kern="-9" kpx2="7842"/><pair kern="-9" kpx2="7840"/><pair kern="-9" kpx2="7854"/><pair kern="-9" kpx2="7852"/><pair kern="-9" kpx2="7850"/><pair kern="-9" kpx2="7848"/></kerning><kerning kpx1="360"><pair kern="-9" kpx2="65"/><pair kern="-9" kpx2="197"/><pair kern="-9" kpx2="196"/><pair kern="-9" kpx2="193"/><pair kern="-9" kpx2="192"/><pair kern="-9" kpx2="195"/><pair kern="-9" kpx2="194"/><pair kern="-9" kpx2="258"/><pair kern="-9" kpx2="256"/><pair kern="-9" kpx2="260"/><pair kern="-20" kpx2="8218"/><pair kern="-20" kpx2="8222"/><pair kern="-9" kpx2="7680"/><pair kern="-9" kpx2="7862"/><pair kern="-9" kpx2="7860"/><pair kern="-9" kpx2="7858"/><pair kern="-9" kpx2="506"/><pair kern="-9" kpx2="7856"/><pair kern="-20" kpx2="46"/><pair kern="-20" kpx2="44"/><pair kern="-9" kpx2="7846"/><pair kern="-9" kpx2="7844"/><pair kern="-9" kpx2="7842"/><pair kern="-9" kpx2="7840"/><pair kern="-9" kpx2="7854"/><pair kern="-9" kpx2="7852"/><pair kern="-9" kpx2="7850"/><pair kern="-9" kpx2="7848"/></kerning><kerning kpx1="362"><pair kern="-9" kpx2="65"/><pair kern="-9" kpx2="197"/><pair kern="-9" kpx2="196"/><pair kern="-9" kpx2="193"/><pair kern="-9" kpx2="192"/><pair kern="-9" kpx2="195"/><pair kern="-9" kpx2="194"/><pair kern="-9" kpx2="258"/><pair kern="-9" kpx2="256"/><pair kern="-9" kpx2="260"/><pair kern="-20" kpx2="8218"/><pair kern="-20" kpx2="8222"/><pair kern="-9" kpx2="7680"/><pair kern="-9" kpx2="7862"/><pair kern="-9" kpx2="7860"/><pair kern="-9" kpx2="7858"/><pair kern="-9" kpx2="506"/><pair kern="-9" kpx2="7856"/><pair kern="-20" kpx2="46"/><pair kern="-20" kpx2="44"/><pair kern="-9" kpx2="7846"/><pair kern="-9" kpx2="7844"/><pair kern="-9" kpx2="7842"/><pair kern="-9" kpx2="7840"/><pair kern="-9" kpx2="7854"/><pair kern="-9" kpx2="7852"/><pair kern="-9" kpx2="7850"/><pair kern="-9" kpx2="7848"/></kerning><kerning kpx1="432"><pair kern="49" kpx2="102"/><pair kern="49" kpx2="373"/><pair kern="49" kpx2="7925"/><pair kern="49" kpx2="64257"/><pair kern="49" kpx2="64256"/><pair kern="49" kpx2="64259"/><pair kern="49" kpx2="64258"/><pair kern="49" kpx2="64260"/><pair kern="49" kpx2="119"/><pair kern="49" kpx2="118"/><pair kern="49" kpx2="357"/><pair kern="49" kpx2="116"/><pair kern="49" kpx2="253"/><pair kern="49" kpx2="7809"/><pair kern="49" kpx2="355"/><pair kern="49" kpx2="7811"/><pair kern="49" kpx2="121"/><pair kern="49" kpx2="539"/><pair kern="49" kpx2="120"/></kerning><kerning kpx1="417"><pair kern="40" kpx2="102"/><pair kern="49" kpx2="373"/><pair kern="49" kpx2="7925"/><pair kern="40" kpx2="64257"/><pair kern="40" kpx2="64256"/><pair kern="40" kpx2="64259"/><pair kern="40" kpx2="64258"/><pair kern="40" kpx2="64260"/><pair kern="49" kpx2="119"/><pair kern="49" kpx2="118"/><pair kern="40" kpx2="357"/><pair kern="40" kpx2="116"/><pair kern="49" kpx2="253"/><pair kern="49" kpx2="7809"/><pair kern="40" kpx2="355"/><pair kern="49" kpx2="7811"/><pair kern="49" kpx2="121"/><pair kern="40" kpx2="539"/><pair kern="49" kpx2="120"/></kerning><kerning kpx1="508"><pair kern="60" kpx2="74"/></kerning><kerning kpx1="510"><pair kern="-20" kpx2="258"/><pair kern="-20" kpx2="256"/><pair kern="-20" kpx2="260"/><pair kern="-9" kpx2="7922"/><pair kern="-9" kpx2="7926"/><pair kern="-9" kpx2="7924"/><pair kern="-9" kpx2="7928"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="44"/><pair kern="-29" kpx2="538"/><pair kern="-20" kpx2="65"/><pair kern="-20" kpx2="197"/><pair kern="-20" kpx2="196"/><pair kern="-20" kpx2="193"/><pair kern="-20" kpx2="192"/><pair kern="-9" kpx2="1029"/><pair kern="-20" kpx2="195"/><pair kern="-20" kpx2="194"/><pair kern="-9" kpx2="7812"/><pair kern="-9" kpx2="221"/><pair kern="-29" kpx2="84"/><pair kern="-9" kpx2="87"/><pair kern="-9" kpx2="86"/><pair kern="-9" kpx2="7808"/><pair kern="-9" kpx2="7810"/><pair kern="-40" kpx2="8218"/><pair kern="-9" kpx2="89"/><pair kern="-20" kpx2="88"/><pair kern="-40" kpx2="8222"/><pair kern="-20" kpx2="7680"/><pair kern="-9" kpx2="90"/><pair kern="-9" kpx2="372"/><pair kern="-20" kpx2="7862"/><pair kern="-9" kpx2="374"/><pair kern="-20" kpx2="7860"/><pair kern="-20" kpx2="7858"/><pair kern="-20" kpx2="506"/><pair kern="-20" kpx2="7856"/><pair kern="-9" kpx2="381"/><pair kern="-9" kpx2="377"/><pair kern="-9" kpx2="376"/><pair kern="-9" kpx2="379"/><pair kern="-29" kpx2="356"/><pair kern="-20" kpx2="7846"/><pair kern="-20" kpx2="7844"/><pair kern="-20" kpx2="7842"/><pair kern="-29" kpx2="354"/><pair kern="-20" kpx2="7840"/><pair kern="-20" kpx2="7854"/><pair kern="-20" kpx2="7852"/><pair kern="-20" kpx2="7850"/><pair kern="-20" kpx2="7848"/></kerning><kerning kpx1="506"><pair kern="-20" kpx2="7888"/><pair kern="-20" kpx2="7890"/><pair kern="-20" kpx2="7892"/><pair kern="-20" kpx2="7894"/><pair kern="-20" kpx2="7896"/><pair kern="-20" kpx2="7898"/><pair kern="-20" kpx2="7900"/><pair kern="-20" kpx2="286"/><pair kern="-20" kpx2="7902"/><pair kern="-20" kpx2="284"/><pair kern="-20" kpx2="262"/><pair kern="-20" kpx2="266"/><pair kern="-20" kpx2="264"/><pair kern="-20" kpx2="7884"/><pair kern="-20" kpx2="268"/><pair kern="-20" kpx2="7886"/><pair kern="-69" kpx2="34"/><pair kern="-60" kpx2="7922"/><pair kern="-60" kpx2="7926"/><pair kern="-69" kpx2="39"/><pair kern="-60" kpx2="7924"/><pair kern="-60" kpx2="7928"/><pair kern="-20" kpx2="7906"/><pair kern="-20" kpx2="288"/><pair kern="-20" kpx2="7904"/><pair kern="-20" kpx2="290"/><pair kern="-20" kpx2="416"/><pair kern="-69" kpx2="538"/><pair kern="-20" kpx2="71"/><pair kern="-20" kpx2="338"/><pair kern="-20" kpx2="67"/><pair kern="-20" kpx2="336"/><pair kern="-20" kpx2="199"/><pair kern="-20" kpx2="79"/><pair kern="129" kpx2="74"/><pair kern="-40" kpx2="7812"/><pair kern="-60" kpx2="221"/><pair kern="-69" kpx2="84"/><pair kern="-40" kpx2="87"/><pair kern="-40" kpx2="86"/><pair kern="-20" kpx2="216"/><pair kern="-20" kpx2="81"/><pair kern="-40" kpx2="7808"/><pair kern="-40" kpx2="7810"/><pair kern="-20" kpx2="212"/><pair kern="-20" kpx2="334"/><pair kern="-20" kpx2="213"/><pair kern="-20" kpx2="214"/><pair kern="-20" kpx2="332"/><pair kern="-69" kpx2="8217"/><pair kern="-60" kpx2="89"/><pair kern="-20" kpx2="210"/><pair kern="-69" kpx2="8221"/><pair kern="-20" kpx2="211"/><pair kern="-40" kpx2="372"/><pair kern="-20" kpx2="510"/><pair kern="-60" kpx2="374"/><pair kern="-60" kpx2="376"/><pair kern="-69" kpx2="356"/><pair kern="-69" kpx2="354"/></kerning><kerning kpx1="507"><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="8221"/></kerning><kerning kpx1="539"><pair kern="20" kpx2="34"/><pair kern="20" kpx2="39"/><pair kern="20" kpx2="8217"/><pair kern="20" kpx2="8221"/></kerning><kerning kpx1="538"><pair kern="-60" kpx2="46"/><pair kern="-60" kpx2="44"/><pair kern="-40" kpx2="45"/><pair kern="20" kpx2="63"/><pair kern="-60" kpx2="537"/><pair kern="20" kpx2="538"/><pair kern="-20" kpx2="71"/><pair kern="-69" kpx2="65"/><pair kern="-20" kpx2="67"/><pair kern="-20" kpx2="79"/><pair kern="-40" kpx2="8211"/><pair kern="20" kpx2="84"/><pair kern="-20" kpx2="81"/><pair kern="-40" kpx2="8213"/><pair kern="-40" kpx2="8212"/><pair kern="-60" kpx2="8218"/><pair kern="-60" kpx2="8222"/><pair kern="-69" kpx2="103"/><pair kern="-69" kpx2="100"/><pair kern="-69" kpx2="101"/><pair kern="-69" kpx2="99"/><pair kern="-80" kpx2="97"/><pair kern="-49" kpx2="110"/><pair kern="-69" kpx2="111"/><pair kern="-49" kpx2="109"/><pair kern="-20" kpx2="119"/><pair kern="-20" kpx2="118"/><pair kern="-49" kpx2="117"/><pair kern="-60" kpx2="115"/><pair kern="-49" kpx2="114"/><pair kern="-69" kpx2="113"/><pair kern="-49" kpx2="112"/><pair kern="-40" kpx2="122"/><pair kern="-20" kpx2="121"/><pair kern="-20" kpx2="120"/><pair kern="-69" kpx2="197"/><pair kern="-69" kpx2="196"/><pair kern="-20" kpx2="199"/><pair kern="-69" kpx2="193"/><pair kern="-69" kpx2="192"/><pair kern="-69" kpx2="195"/><pair kern="-69" kpx2="194"/><pair kern="-20" kpx2="216"/><pair kern="-20" kpx2="212"/><pair kern="-20" kpx2="213"/><pair kern="-20" kpx2="214"/><pair kern="-20" kpx2="210"/><pair kern="-20" kpx2="211"/><pair kern="-69" kpx2="235"/><pair kern="-69" kpx2="234"/><pair kern="-69" kpx2="233"/><pair kern="-69" kpx2="232"/><pair kern="-69" kpx2="231"/><pair kern="-80" kpx2="230"/><pair kern="-80" kpx2="229"/><pair kern="-80" kpx2="228"/><pair kern="-80" kpx2="227"/><pair kern="-80" kpx2="226"/><pair kern="-80" kpx2="225"/><pair kern="-69" kpx2="224"/><pair kern="-49" kpx2="252"/><pair kern="-20" kpx2="253"/><pair kern="-49" kpx2="250"/><pair kern="-49" kpx2="251"/><pair kern="-69" kpx2="248"/><pair kern="-49" kpx2="249"/><pair kern="-69" kpx2="246"/><pair kern="-69" kpx2="244"/><pair kern="-69" kpx2="245"/><pair kern="-69" kpx2="242"/><pair kern="-69" kpx2="243"/><pair kern="-69" kpx2="275"/><pair kern="-69" kpx2="7889"/><pair kern="-20" kpx2="7888"/><pair kern="-69" kpx2="273"/><pair kern="-20" kpx2="7890"/><pair kern="-69" kpx2="279"/><pair kern="-69" kpx2="7893"/><pair kern="-20" kpx2="7892"/><pair kern="-69" kpx2="277"/><pair kern="-69" kpx2="7895"/><pair kern="-20" kpx2="7894"/><pair kern="-69" kpx2="283"/><pair kern="-69" kpx2="7897"/><pair kern="-20" kpx2="7896"/><pair kern="-69" kpx2="281"/><pair kern="-69" kpx2="7899"/><pair kern="-20" kpx2="7898"/><pair kern="-69" kpx2="287"/><pair kern="-69" kpx2="7901"/><pair kern="-20" kpx2="286"/><pair kern="-20" kpx2="7900"/><pair kern="-69" kpx2="285"/><pair kern="-69" kpx2="7903"/><pair kern="-20" kpx2="284"/><pair kern="-20" kpx2="7902"/><pair kern="-69" kpx2="258"/><pair kern="-80" kpx2="259"/><pair kern="-69" kpx2="256"/><pair kern="-80" kpx2="257"/><pair kern="-69" kpx2="7875"/><pair kern="-20" kpx2="262"/><pair kern="-69" kpx2="263"/><pair kern="-69" kpx2="7877"/><pair kern="-69" kpx2="260"/><pair kern="-80" kpx2="261"/><pair kern="-69" kpx2="7879"/><pair kern="-20" kpx2="266"/><pair kern="-69" kpx2="267"/><pair kern="-20" kpx2="264"/><pair kern="-69" kpx2="265"/><pair kern="-20" kpx2="7884"/><pair kern="-69" kpx2="271"/><pair kern="-69" kpx2="7885"/><pair kern="-20" kpx2="268"/><pair kern="-20" kpx2="7886"/><pair kern="-69" kpx2="269"/><pair kern="-69" kpx2="7887"/><pair kern="-49" kpx2="7921"/><pair kern="-20" kpx2="7925"/><pair kern="-49" kpx2="312"/><pair kern="-20" kpx2="288"/><pair kern="-20" kpx2="7906"/><pair kern="-69" kpx2="7907"/><pair kern="-69" kpx2="289"/><pair kern="-20" kpx2="290"/><pair kern="-20" kpx2="7904"/><pair kern="-69" kpx2="291"/><pair kern="-69" kpx2="7905"/><pair kern="-49" kpx2="7911"/><pair kern="-49" kpx2="7909"/><pair kern="-49" kpx2="7915"/><pair kern="-49" kpx2="7913"/><pair kern="-49" kpx2="7919"/><pair kern="-49" kpx2="7917"/><pair kern="-49" kpx2="343"/><pair kern="-49" kpx2="341"/><pair kern="-69" kpx2="339"/><pair kern="-20" kpx2="338"/><pair kern="-69" kpx2="337"/><pair kern="-20" kpx2="336"/><pair kern="-60" kpx2="351"/><pair kern="-60" kpx2="347"/><pair kern="-49" kpx2="326"/><pair kern="-49" kpx2="324"/><pair kern="-20" kpx2="7809"/><pair kern="-20" kpx2="7811"/><pair kern="-20" kpx2="334"/><pair kern="-69" kpx2="335"/><pair kern="-20" kpx2="332"/><pair kern="-69" kpx2="333"/><pair kern="-49" kpx2="331"/><pair kern="-20" kpx2="373"/><pair kern="-80" kpx2="7863"/><pair kern="-69" kpx2="7862"/><pair kern="-80" kpx2="7861"/><pair kern="-69" kpx2="7860"/><pair kern="-49" kpx2="369"/><pair kern="-80" kpx2="7859"/><pair kern="-69" kpx2="7858"/><pair kern="-49" kpx2="371"/><pair kern="-80" kpx2="7857"/><pair kern="-69" kpx2="7856"/><pair kern="-69" kpx2="7871"/><pair kern="-40" kpx2="380"/><pair kern="-69" kpx2="7869"/><pair kern="-40" kpx2="382"/><pair kern="-69" kpx2="7867"/><pair kern="-69" kpx2="7865"/><pair kern="-40" kpx2="378"/><pair kern="20" kpx2="356"/><pair kern="-69" kpx2="7846"/><pair kern="-69" kpx2="7844"/><pair kern="-80" kpx2="7845"/><pair kern="-69" kpx2="7842"/><pair kern="-80" kpx2="7843"/><pair kern="20" kpx2="354"/><pair kern="-69" kpx2="7840"/><pair kern="-80" kpx2="7841"/><pair kern="-69" kpx2="7854"/><pair kern="-49" kpx2="365"/><pair kern="-80" kpx2="7855"/><pair kern="-69" kpx2="7852"/><pair kern="-49" kpx2="367"/><pair kern="-80" kpx2="7853"/><pair kern="-69" kpx2="7850"/><pair kern="-49" kpx2="361"/><pair kern="-80" kpx2="7851"/><pair kern="-69" kpx2="7848"/><pair kern="-49" kpx2="363"/><pair kern="-80" kpx2="7849"/><pair kern="-49" kpx2="432"/><pair kern="-69" kpx2="417"/><pair kern="-20" kpx2="416"/><pair kern="-80" kpx2="7681"/><pair kern="-69" kpx2="7680"/><pair kern="-80" kpx2="509"/><pair kern="-49" kpx2="7743"/><pair kern="-20" kpx2="510"/><pair kern="-69" kpx2="511"/><pair kern="-69" kpx2="506"/><pair kern="-80" kpx2="507"/></kerning><kerning kpx1="8211"><pair kern="-40" kpx2="1066"/><pair kern="-20" kpx2="1185"/><pair kern="-40" kpx2="1035"/><pair kern="-40" kpx2="1184"/><pair kern="-20" kpx2="1098"/><pair kern="-40" kpx2="1058"/><pair kern="-40" kpx2="1026"/><pair kern="-20" kpx2="1197"/><pair kern="-20" kpx2="1090"/><pair kern="-40" kpx2="1196"/><pair kern="-40" kpx2="356"/><pair kern="-40" kpx2="84"/><pair kern="-40" kpx2="1294"/><pair kern="-20" kpx2="1295"/><pair kern="-40" kpx2="354"/><pair kern="-40" kpx2="1204"/><pair kern="-20" kpx2="1205"/><pair kern="-40" kpx2="932"/><pair kern="-40" kpx2="538"/></kerning><kerning kpx1="8213"><pair kern="-40" kpx2="1066"/><pair kern="-20" kpx2="1185"/><pair kern="-40" kpx2="1035"/><pair kern="-40" kpx2="1184"/><pair kern="-20" kpx2="1098"/><pair kern="-40" kpx2="1058"/><pair kern="-40" kpx2="1026"/><pair kern="-20" kpx2="1197"/><pair kern="-20" kpx2="1090"/><pair kern="-40" kpx2="1196"/><pair kern="-40" kpx2="356"/><pair kern="-40" kpx2="84"/><pair kern="-40" kpx2="1294"/><pair kern="-20" kpx2="1295"/><pair kern="-40" kpx2="354"/><pair kern="-40" kpx2="1204"/><pair kern="-20" kpx2="1205"/><pair kern="-40" kpx2="932"/><pair kern="-40" kpx2="538"/></kerning><kerning kpx1="8212"><pair kern="-40" kpx2="1066"/><pair kern="-20" kpx2="1185"/><pair kern="-40" kpx2="1035"/><pair kern="-40" kpx2="1184"/><pair kern="-20" kpx2="1098"/><pair kern="-40" kpx2="1058"/><pair kern="-40" kpx2="1026"/><pair kern="-20" kpx2="1197"/><pair kern="-20" kpx2="1090"/><pair kern="-40" kpx2="1196"/><pair kern="-40" kpx2="356"/><pair kern="-40" kpx2="84"/><pair kern="-40" kpx2="1294"/><pair kern="-20" kpx2="1295"/><pair kern="-40" kpx2="354"/><pair kern="-40" kpx2="1204"/><pair kern="-20" kpx2="1205"/><pair kern="-40" kpx2="932"/><pair kern="-40" kpx2="538"/></kerning><kerning kpx1="8218"><pair kern="-49" kpx2="7888"/><pair kern="-49" kpx2="7890"/><pair kern="-49" kpx2="7892"/><pair kern="-49" kpx2="1098"/><pair kern="-49" kpx2="7894"/><pair kern="-49" kpx2="7896"/><pair kern="-49" kpx2="7898"/><pair kern="-60" kpx2="1095"/><pair kern="-49" kpx2="7900"/><pair kern="-49" kpx2="286"/><pair kern="-49" kpx2="1090"/><pair kern="-49" kpx2="7902"/><pair kern="-49" kpx2="284"/><pair kern="-49" kpx2="262"/><pair kern="-49" kpx2="266"/><pair kern="-49" kpx2="264"/><pair kern="-49" kpx2="7884"/><pair kern="-49" kpx2="7886"/><pair kern="-49" kpx2="268"/><pair kern="-60" kpx2="7922"/><pair kern="-20" kpx2="7920"/><pair kern="-60" kpx2="7926"/><pair kern="-60" kpx2="7924"/><pair kern="-60" kpx2="7928"/><pair kern="-49" kpx2="1120"/><pair kern="-49" kpx2="7906"/><pair kern="-49" kpx2="288"/><pair kern="-49" kpx2="1150"/><pair kern="-49" kpx2="7904"/><pair kern="-49" kpx2="290"/><pair kern="-49" kpx2="1148"/><pair kern="-20" kpx2="7910"/><pair kern="-49" kpx2="1146"/><pair kern="-20" kpx2="7908"/><pair kern="-49" kpx2="1144"/><pair kern="-20" kpx2="7914"/><pair kern="-60" kpx2="1142"/><pair kern="-20" kpx2="7912"/><pair kern="-60" kpx2="1140"/><pair kern="-20" kpx2="7918"/><pair kern="-49" kpx2="1138"/><pair kern="-20" kpx2="7916"/><pair kern="-69" kpx2="538"/><pair kern="-80" kpx2="1136"/><pair kern="-49" kpx2="71"/><pair kern="-69" kpx2="1035"/><pair kern="-49" kpx2="338"/><pair kern="-49" kpx2="336"/><pair kern="-49" kpx2="67"/><pair kern="-69" kpx2="1026"/><pair kern="-49" kpx2="79"/><pair kern="-49" kpx2="1028"/><pair kern="-20" kpx2="85"/><pair kern="-60" kpx2="7812"/><pair kern="-69" kpx2="84"/><pair kern="-60" kpx2="87"/><pair kern="-60" kpx2="86"/><pair kern="-69" kpx2="1294"/><pair kern="-49" kpx2="81"/><pair kern="-60" kpx2="7808"/><pair kern="-49" kpx2="1295"/><pair kern="-49" kpx2="1292"/><pair kern="-60" kpx2="7810"/><pair kern="-49" kpx2="1054"/><pair kern="-49" kpx2="334"/><pair kern="-49" kpx2="332"/><pair kern="-60" kpx2="1286"/><pair kern="-60" kpx2="89"/><pair kern="-49" kpx2="1287"/><pair kern="-60" kpx2="1284"/><pair kern="-49" kpx2="1285"/><pair kern="-69" kpx2="1066"/><pair kern="-60" kpx2="372"/><pair kern="-60" kpx2="374"/><pair kern="-20" kpx2="368"/><pair kern="-20" kpx2="370"/><pair kern="-69" kpx2="1058"/><pair kern="-49" kpx2="1057"/><pair kern="-60" kpx2="376"/><pair kern="-80" kpx2="1063"/><pair kern="-40" kpx2="1060"/><pair kern="-69" kpx2="356"/><pair kern="-69" kpx2="354"/><pair kern="-20" kpx2="364"/><pair kern="-20" kpx2="366"/><pair kern="-20" kpx2="360"/><pair kern="-20" kpx2="362"/><pair kern="-20" kpx2="952"/><pair kern="-60" kpx2="1228"/><pair kern="-80" kpx2="1227"/><pair kern="-60" kpx2="936"/><pair kern="-60" kpx2="939"/><pair kern="-60" kpx2="933"/><pair kern="-69" kpx2="932"/><pair kern="-49" kpx2="934"/><pair kern="-49" kpx2="1254"/><pair kern="-40" kpx2="927"/><pair kern="-40" kpx2="920"/><pair kern="-49" kpx2="1258"/><pair kern="-49" kpx2="1256"/><pair kern="-80" kpx2="1268"/><pair kern="-60" kpx2="1269"/><pair kern="-20" kpx2="431"/><pair kern="-49" kpx2="416"/><pair kern="-49" kpx2="1152"/><pair kern="-49" kpx2="199"/><pair kern="-20" kpx2="220"/><pair kern="-60" kpx2="221"/><pair kern="-49" kpx2="216"/><pair kern="-20" kpx2="217"/><pair kern="-20" kpx2="218"/><pair kern="-20" kpx2="219"/><pair kern="-49" kpx2="212"/><pair kern="-49" kpx2="213"/><pair kern="-49" kpx2="214"/><pair kern="-49" kpx2="210"/><pair kern="-49" kpx2="211"/><pair kern="-49" kpx2="510"/><pair kern="-49" kpx2="1185"/><pair kern="-69" kpx2="1184"/><pair kern="-60" kpx2="978"/><pair kern="-49" kpx2="1194"/><pair kern="-49" kpx2="1192"/><pair kern="-60" kpx2="1198"/><pair kern="-49" kpx2="1197"/><pair kern="-69" kpx2="1196"/><pair kern="-60" kpx2="1200"/><pair kern="-80" kpx2="1206"/><pair kern="-60" kpx2="1207"/><pair kern="-69" kpx2="1204"/><pair kern="-49" kpx2="1205"/><pair kern="-80" kpx2="1208"/><pair kern="-60" kpx2="1209"/><pair kern="-60" kpx2="1214"/><pair kern="-60" kpx2="1212"/></kerning><kerning kpx1="8217"><pair kern="-60" kpx2="1092"/><pair kern="-60" kpx2="1089"/><pair kern="-69" kpx2="1113"/><pair kern="-29" kpx2="1109"/><pair kern="-60" kpx2="1108"/><pair kern="-60" kpx2="1105"/><pair kern="-60" kpx2="1104"/><pair kern="-69" kpx2="1126"/><pair kern="-69" kpx2="1127"/><pair kern="-60" kpx2="1149"/><pair kern="-60" kpx2="1147"/><pair kern="-60" kpx2="1145"/><pair kern="-29" kpx2="537"/><pair kern="-60" kpx2="1139"/><pair kern="-9" kpx2="1137"/><pair kern="20" kpx2="538"/><pair kern="-60" kpx2="1033"/><pair kern="-69" kpx2="65"/><pair kern="20" kpx2="84"/><pair kern="20" kpx2="87"/><pair kern="-60" kpx2="1051"/><pair kern="20" kpx2="86"/><pair kern="-69" kpx2="1040"/><pair kern="9" kpx2="89"/><pair kern="-60" kpx2="1044"/><pair kern="-29" kpx2="103"/><pair kern="-60" kpx2="100"/><pair kern="-60" kpx2="101"/><pair kern="-60" kpx2="99"/><pair kern="-40" kpx2="97"/><pair kern="-29" kpx2="110"/><pair kern="-60" kpx2="111"/><pair kern="-29" kpx2="109"/><pair kern="-69" kpx2="1083"/><pair kern="-29" kpx2="117"/><pair kern="-29" kpx2="115"/><pair kern="-29" kpx2="114"/><pair kern="-60" kpx2="1086"/><pair kern="-60" kpx2="113"/><pair kern="-29" kpx2="112"/><pair kern="-20" kpx2="1072"/><pair kern="-60" kpx2="1077"/><pair kern="-69" kpx2="1076"/><pair kern="-60" kpx2="1221"/><pair kern="-69" kpx2="1222"/><pair kern="-69" kpx2="1236"/><pair kern="-20" kpx2="1237"/><pair kern="-60" kpx2="1239"/><pair kern="-69" kpx2="1232"/><pair kern="-20" kpx2="1233"/><pair kern="-69" kpx2="1234"/><pair kern="-20" kpx2="1235"/><pair kern="-20" kpx2="1241"/><pair kern="-20" kpx2="1243"/><pair kern="-60" kpx2="1255"/><pair kern="-60" kpx2="1259"/><pair kern="-60" kpx2="1257"/><pair kern="-60" kpx2="1153"/><pair kern="-69" kpx2="197"/><pair kern="-69" kpx2="196"/><pair kern="-69" kpx2="193"/><pair kern="-69" kpx2="192"/><pair kern="-69" kpx2="195"/><pair kern="-69" kpx2="194"/><pair kern="9" kpx2="221"/><pair kern="-60" kpx2="235"/><pair kern="-60" kpx2="234"/><pair kern="-60" kpx2="233"/><pair kern="-60" kpx2="232"/><pair kern="-60" kpx2="231"/><pair kern="-60" kpx2="1195"/><pair kern="-40" kpx2="230"/><pair kern="-40" kpx2="229"/><pair kern="-60" kpx2="1193"/><pair kern="-40" kpx2="228"/><pair kern="-40" kpx2="227"/><pair kern="-40" kpx2="226"/><pair kern="-40" kpx2="225"/><pair kern="-60" kpx2="224"/><pair kern="-29" kpx2="252"/><pair kern="-29" kpx2="250"/><pair kern="-29" kpx2="251"/><pair kern="-60" kpx2="248"/><pair kern="-29" kpx2="249"/><pair kern="-60" kpx2="246"/><pair kern="-60" kpx2="244"/><pair kern="-60" kpx2="245"/><pair kern="-60" kpx2="242"/><pair kern="-60" kpx2="243"/><pair kern="-60" kpx2="7889"/><pair kern="-60" kpx2="275"/><pair kern="-60" kpx2="273"/><pair kern="-60" kpx2="7893"/><pair kern="-60" kpx2="279"/><pair kern="-60" kpx2="7895"/><pair kern="-60" kpx2="277"/><pair kern="-60" kpx2="7897"/><pair kern="-60" kpx2="283"/><pair kern="-60" kpx2="7899"/><pair kern="-60" kpx2="281"/><pair kern="-60" kpx2="7901"/><pair kern="-29" kpx2="287"/><pair kern="-60" kpx2="7903"/><pair kern="-29" kpx2="285"/><pair kern="-69" kpx2="258"/><pair kern="-40" kpx2="259"/><pair kern="-69" kpx2="256"/><pair kern="-60" kpx2="7875"/><pair kern="-40" kpx2="257"/><pair kern="-60" kpx2="7877"/><pair kern="-60" kpx2="263"/><pair kern="-69" kpx2="260"/><pair kern="-60" kpx2="7879"/><pair kern="-40" kpx2="261"/><pair kern="-60" kpx2="267"/><pair kern="-60" kpx2="265"/><pair kern="-60" kpx2="7885"/><pair kern="-60" kpx2="271"/><pair kern="-60" kpx2="7887"/><pair kern="-60" kpx2="269"/><pair kern="9" kpx2="7922"/><pair kern="-29" kpx2="7921"/><pair kern="9" kpx2="7926"/><pair kern="9" kpx2="7924"/><pair kern="-29" kpx2="312"/><pair kern="9" kpx2="7928"/><pair kern="-60" kpx2="7907"/><pair kern="-29" kpx2="289"/><pair kern="-60" kpx2="7905"/><pair kern="-29" kpx2="291"/><pair kern="-29" kpx2="7911"/><pair kern="-29" kpx2="7909"/><pair kern="-29" kpx2="7915"/><pair kern="-29" kpx2="7913"/><pair kern="-29" kpx2="7919"/><pair kern="-29" kpx2="7917"/><pair kern="-29" kpx2="343"/><pair kern="-29" kpx2="341"/><pair kern="-60" kpx2="339"/><pair kern="-60" kpx2="337"/><pair kern="-29" kpx2="351"/><pair kern="-69" kpx2="1299"/><pair kern="-60" kpx2="1298"/><pair kern="-60" kpx2="1297"/><pair kern="-29" kpx2="347"/><pair kern="-29" kpx2="326"/><pair kern="20" kpx2="7812"/><pair kern="-29" kpx2="324"/><pair kern="-60" kpx2="1288"/><pair kern="-69" kpx2="1289"/><pair kern="20" kpx2="7808"/><pair kern="20" kpx2="7810"/><pair kern="-60" kpx2="1293"/><pair kern="-69" kpx2="1282"/><pair kern="-60" kpx2="335"/><pair kern="-60" kpx2="1283"/><pair kern="-69" kpx2="1280"/><pair kern="-60" kpx2="333"/><pair kern="-60" kpx2="1281"/><pair kern="-29" kpx2="331"/><pair kern="-40" kpx2="7863"/><pair kern="-69" kpx2="7862"/><pair kern="20" kpx2="372"/><pair kern="-40" kpx2="7861"/><pair kern="-69" kpx2="7860"/><pair kern="9" kpx2="374"/><pair kern="-40" kpx2="7859"/><pair kern="-29" kpx2="369"/><pair kern="-69" kpx2="7858"/><pair kern="-29" kpx2="371"/><pair kern="-40" kpx2="7857"/><pair kern="-69" kpx2="7856"/><pair kern="-60" kpx2="7871"/><pair kern="-60" kpx2="7869"/><pair kern="-60" kpx2="7867"/><pair kern="9" kpx2="376"/><pair kern="-60" kpx2="7865"/><pair kern="20" kpx2="356"/><pair kern="-69" kpx2="7846"/><pair kern="-69" kpx2="7844"/><pair kern="-40" kpx2="7845"/><pair kern="-69" kpx2="7842"/><pair kern="-40" kpx2="7843"/><pair kern="20" kpx2="354"/><pair kern="-69" kpx2="7840"/><pair kern="-40" kpx2="7841"/><pair kern="-69" kpx2="7854"/><pair kern="-29" kpx2="365"/><pair kern="-40" kpx2="7855"/><pair kern="-69" kpx2="7852"/><pair kern="-29" kpx2="367"/><pair kern="-40" kpx2="7853"/><pair kern="-69" kpx2="7850"/><pair kern="-29" kpx2="361"/><pair kern="-40" kpx2="7851"/><pair kern="-69" kpx2="7848"/><pair kern="-29" kpx2="363"/><pair kern="-40" kpx2="7849"/><pair kern="-20" kpx2="956"/><pair kern="-40" kpx2="959"/><pair kern="-20" kpx2="954"/><pair kern="-29" kpx2="948"/><pair kern="-20" kpx2="949"/><pair kern="-20" kpx2="950"/><pair kern="-20" kpx2="951"/><pair kern="-40" kpx2="945"/><pair kern="-20" kpx2="941"/><pair kern="-40" kpx2="940"/><pair kern="-20" kpx2="942"/><pair kern="-69" kpx2="923"/><pair kern="-29" kpx2="432"/><pair kern="-69" kpx2="916"/><pair kern="-69" kpx2="913"/><pair kern="-60" kpx2="417"/><pair kern="-69" kpx2="902"/><pair kern="-40" kpx2="7681"/><pair kern="-69" kpx2="7680"/><pair kern="-40" kpx2="509"/><pair kern="-29" kpx2="7743"/><pair kern="-60" kpx2="511"/><pair kern="-69" kpx2="506"/><pair kern="-40" kpx2="507"/><pair kern="-40" kpx2="972"/><pair kern="-40" kpx2="963"/><pair kern="-40" kpx2="962"/><pair kern="-29" kpx2="961"/><pair kern="-40" kpx2="966"/></kerning><kerning kpx1="8216"><pair kern="-60" kpx2="1092"/><pair kern="-60" kpx2="1089"/><pair kern="-69" kpx2="1113"/><pair kern="-29" kpx2="1109"/><pair kern="-60" kpx2="1108"/><pair kern="-60" kpx2="1105"/><pair kern="-60" kpx2="1104"/><pair kern="-69" kpx2="1126"/><pair kern="-69" kpx2="1127"/><pair kern="-60" kpx2="1149"/><pair kern="-60" kpx2="1147"/><pair kern="-60" kpx2="1145"/><pair kern="-29" kpx2="537"/><pair kern="-60" kpx2="1139"/><pair kern="-9" kpx2="1137"/><pair kern="20" kpx2="538"/><pair kern="-60" kpx2="1033"/><pair kern="-69" kpx2="65"/><pair kern="20" kpx2="84"/><pair kern="20" kpx2="87"/><pair kern="-60" kpx2="1051"/><pair kern="20" kpx2="86"/><pair kern="-69" kpx2="1040"/><pair kern="9" kpx2="89"/><pair kern="-60" kpx2="1044"/><pair kern="-29" kpx2="103"/><pair kern="-60" kpx2="100"/><pair kern="-60" kpx2="101"/><pair kern="-60" kpx2="99"/><pair kern="-40" kpx2="97"/><pair kern="-29" kpx2="110"/><pair kern="-60" kpx2="111"/><pair kern="-29" kpx2="109"/><pair kern="-69" kpx2="1083"/><pair kern="-29" kpx2="117"/><pair kern="-29" kpx2="115"/><pair kern="-29" kpx2="114"/><pair kern="-60" kpx2="1086"/><pair kern="-60" kpx2="113"/><pair kern="-29" kpx2="112"/><pair kern="-20" kpx2="1072"/><pair kern="-60" kpx2="1077"/><pair kern="-69" kpx2="1076"/><pair kern="-60" kpx2="1221"/><pair kern="-69" kpx2="1222"/><pair kern="-69" kpx2="1236"/><pair kern="-20" kpx2="1237"/><pair kern="-60" kpx2="1239"/><pair kern="-69" kpx2="1232"/><pair kern="-20" kpx2="1233"/><pair kern="-69" kpx2="1234"/><pair kern="-20" kpx2="1235"/><pair kern="-20" kpx2="1241"/><pair kern="-20" kpx2="1243"/><pair kern="-60" kpx2="1255"/><pair kern="-60" kpx2="1259"/><pair kern="-60" kpx2="1257"/><pair kern="-60" kpx2="1153"/><pair kern="-69" kpx2="197"/><pair kern="-69" kpx2="196"/><pair kern="-69" kpx2="193"/><pair kern="-69" kpx2="192"/><pair kern="-69" kpx2="195"/><pair kern="-69" kpx2="194"/><pair kern="9" kpx2="221"/><pair kern="-60" kpx2="235"/><pair kern="-60" kpx2="234"/><pair kern="-60" kpx2="233"/><pair kern="-60" kpx2="232"/><pair kern="-60" kpx2="231"/><pair kern="-60" kpx2="1195"/><pair kern="-40" kpx2="230"/><pair kern="-40" kpx2="229"/><pair kern="-60" kpx2="1193"/><pair kern="-40" kpx2="228"/><pair kern="-40" kpx2="227"/><pair kern="-40" kpx2="226"/><pair kern="-40" kpx2="225"/><pair kern="-60" kpx2="224"/><pair kern="-29" kpx2="252"/><pair kern="-29" kpx2="250"/><pair kern="-29" kpx2="251"/><pair kern="-60" kpx2="248"/><pair kern="-29" kpx2="249"/><pair kern="-60" kpx2="246"/><pair kern="-60" kpx2="244"/><pair kern="-60" kpx2="245"/><pair kern="-60" kpx2="242"/><pair kern="-60" kpx2="243"/><pair kern="-60" kpx2="7889"/><pair kern="-60" kpx2="275"/><pair kern="-60" kpx2="273"/><pair kern="-60" kpx2="7893"/><pair kern="-60" kpx2="279"/><pair kern="-60" kpx2="7895"/><pair kern="-60" kpx2="277"/><pair kern="-60" kpx2="7897"/><pair kern="-60" kpx2="283"/><pair kern="-60" kpx2="7899"/><pair kern="-60" kpx2="281"/><pair kern="-60" kpx2="7901"/><pair kern="-29" kpx2="287"/><pair kern="-60" kpx2="7903"/><pair kern="-29" kpx2="285"/><pair kern="-69" kpx2="258"/><pair kern="-40" kpx2="259"/><pair kern="-69" kpx2="256"/><pair kern="-60" kpx2="7875"/><pair kern="-40" kpx2="257"/><pair kern="-60" kpx2="7877"/><pair kern="-60" kpx2="263"/><pair kern="-69" kpx2="260"/><pair kern="-60" kpx2="7879"/><pair kern="-40" kpx2="261"/><pair kern="-60" kpx2="267"/><pair kern="-60" kpx2="265"/><pair kern="-60" kpx2="7885"/><pair kern="-60" kpx2="271"/><pair kern="-60" kpx2="7887"/><pair kern="-60" kpx2="269"/><pair kern="9" kpx2="7922"/><pair kern="-29" kpx2="7921"/><pair kern="9" kpx2="7926"/><pair kern="9" kpx2="7924"/><pair kern="-29" kpx2="312"/><pair kern="9" kpx2="7928"/><pair kern="-60" kpx2="7907"/><pair kern="-29" kpx2="289"/><pair kern="-60" kpx2="7905"/><pair kern="-29" kpx2="291"/><pair kern="-29" kpx2="7911"/><pair kern="-29" kpx2="7909"/><pair kern="-29" kpx2="7915"/><pair kern="-29" kpx2="7913"/><pair kern="-29" kpx2="7919"/><pair kern="-29" kpx2="7917"/><pair kern="-29" kpx2="343"/><pair kern="-29" kpx2="341"/><pair kern="-60" kpx2="339"/><pair kern="-60" kpx2="337"/><pair kern="-29" kpx2="351"/><pair kern="-69" kpx2="1299"/><pair kern="-60" kpx2="1298"/><pair kern="-60" kpx2="1297"/><pair kern="-29" kpx2="347"/><pair kern="-29" kpx2="326"/><pair kern="20" kpx2="7812"/><pair kern="-29" kpx2="324"/><pair kern="-60" kpx2="1288"/><pair kern="-69" kpx2="1289"/><pair kern="20" kpx2="7808"/><pair kern="20" kpx2="7810"/><pair kern="-60" kpx2="1293"/><pair kern="-69" kpx2="1282"/><pair kern="-60" kpx2="335"/><pair kern="-60" kpx2="1283"/><pair kern="-69" kpx2="1280"/><pair kern="-60" kpx2="333"/><pair kern="-60" kpx2="1281"/><pair kern="-29" kpx2="331"/><pair kern="-40" kpx2="7863"/><pair kern="-69" kpx2="7862"/><pair kern="20" kpx2="372"/><pair kern="-40" kpx2="7861"/><pair kern="-69" kpx2="7860"/><pair kern="9" kpx2="374"/><pair kern="-40" kpx2="7859"/><pair kern="-29" kpx2="369"/><pair kern="-69" kpx2="7858"/><pair kern="-29" kpx2="371"/><pair kern="-40" kpx2="7857"/><pair kern="-69" kpx2="7856"/><pair kern="-60" kpx2="7871"/><pair kern="-60" kpx2="7869"/><pair kern="-60" kpx2="7867"/><pair kern="9" kpx2="376"/><pair kern="-60" kpx2="7865"/><pair kern="20" kpx2="356"/><pair kern="-69" kpx2="7846"/><pair kern="-69" kpx2="7844"/><pair kern="-40" kpx2="7845"/><pair kern="-69" kpx2="7842"/><pair kern="-40" kpx2="7843"/><pair kern="20" kpx2="354"/><pair kern="-69" kpx2="7840"/><pair kern="-40" kpx2="7841"/><pair kern="-69" kpx2="7854"/><pair kern="-29" kpx2="365"/><pair kern="-40" kpx2="7855"/><pair kern="-69" kpx2="7852"/><pair kern="-29" kpx2="367"/><pair kern="-40" kpx2="7853"/><pair kern="-69" kpx2="7850"/><pair kern="-29" kpx2="361"/><pair kern="-40" kpx2="7851"/><pair kern="-69" kpx2="7848"/><pair kern="-29" kpx2="363"/><pair kern="-40" kpx2="7849"/><pair kern="-20" kpx2="956"/><pair kern="-40" kpx2="959"/><pair kern="-20" kpx2="954"/><pair kern="-29" kpx2="948"/><pair kern="-20" kpx2="949"/><pair kern="-20" kpx2="950"/><pair kern="-20" kpx2="951"/><pair kern="-40" kpx2="945"/><pair kern="-20" kpx2="941"/><pair kern="-40" kpx2="940"/><pair kern="-20" kpx2="942"/><pair kern="-69" kpx2="923"/><pair kern="-29" kpx2="432"/><pair kern="-69" kpx2="916"/><pair kern="-69" kpx2="913"/><pair kern="-60" kpx2="417"/><pair kern="-69" kpx2="902"/><pair kern="-40" kpx2="7681"/><pair kern="-69" kpx2="7680"/><pair kern="-40" kpx2="509"/><pair kern="-29" kpx2="7743"/><pair kern="-60" kpx2="511"/><pair kern="-69" kpx2="506"/><pair kern="-40" kpx2="507"/><pair kern="-40" kpx2="972"/><pair kern="-40" kpx2="963"/><pair kern="-40" kpx2="962"/><pair kern="-29" kpx2="961"/><pair kern="-40" kpx2="966"/></kerning><kerning kpx1="8222"><pair kern="-49" kpx2="7888"/><pair kern="-49" kpx2="7890"/><pair kern="-49" kpx2="7892"/><pair kern="-49" kpx2="1098"/><pair kern="-49" kpx2="7894"/><pair kern="-49" kpx2="7896"/><pair kern="-49" kpx2="7898"/><pair kern="-60" kpx2="1095"/><pair kern="-49" kpx2="7900"/><pair kern="-49" kpx2="286"/><pair kern="-49" kpx2="1090"/><pair kern="-49" kpx2="7902"/><pair kern="-49" kpx2="284"/><pair kern="-49" kpx2="262"/><pair kern="-49" kpx2="266"/><pair kern="-49" kpx2="264"/><pair kern="-49" kpx2="7884"/><pair kern="-49" kpx2="7886"/><pair kern="-49" kpx2="268"/><pair kern="-60" kpx2="7922"/><pair kern="-20" kpx2="7920"/><pair kern="-60" kpx2="7926"/><pair kern="-60" kpx2="7924"/><pair kern="-60" kpx2="7928"/><pair kern="-49" kpx2="1120"/><pair kern="-49" kpx2="7906"/><pair kern="-49" kpx2="288"/><pair kern="-49" kpx2="1150"/><pair kern="-49" kpx2="7904"/><pair kern="-49" kpx2="290"/><pair kern="-49" kpx2="1148"/><pair kern="-20" kpx2="7910"/><pair kern="-49" kpx2="1146"/><pair kern="-20" kpx2="7908"/><pair kern="-49" kpx2="1144"/><pair kern="-20" kpx2="7914"/><pair kern="-60" kpx2="1142"/><pair kern="-20" kpx2="7912"/><pair kern="-60" kpx2="1140"/><pair kern="-20" kpx2="7918"/><pair kern="-49" kpx2="1138"/><pair kern="-20" kpx2="7916"/><pair kern="-69" kpx2="538"/><pair kern="-80" kpx2="1136"/><pair kern="-49" kpx2="71"/><pair kern="-69" kpx2="1035"/><pair kern="-49" kpx2="338"/><pair kern="-49" kpx2="336"/><pair kern="-49" kpx2="67"/><pair kern="-69" kpx2="1026"/><pair kern="-49" kpx2="79"/><pair kern="-49" kpx2="1028"/><pair kern="-20" kpx2="85"/><pair kern="-60" kpx2="7812"/><pair kern="-69" kpx2="84"/><pair kern="-60" kpx2="87"/><pair kern="-60" kpx2="86"/><pair kern="-69" kpx2="1294"/><pair kern="-49" kpx2="81"/><pair kern="-60" kpx2="7808"/><pair kern="-49" kpx2="1295"/><pair kern="-49" kpx2="1292"/><pair kern="-60" kpx2="7810"/><pair kern="-49" kpx2="1054"/><pair kern="-49" kpx2="334"/><pair kern="-49" kpx2="332"/><pair kern="-60" kpx2="1286"/><pair kern="-60" kpx2="89"/><pair kern="-49" kpx2="1287"/><pair kern="-60" kpx2="1284"/><pair kern="-49" kpx2="1285"/><pair kern="-69" kpx2="1066"/><pair kern="-60" kpx2="372"/><pair kern="-60" kpx2="374"/><pair kern="-20" kpx2="368"/><pair kern="-20" kpx2="370"/><pair kern="-69" kpx2="1058"/><pair kern="-49" kpx2="1057"/><pair kern="-60" kpx2="376"/><pair kern="-80" kpx2="1063"/><pair kern="-40" kpx2="1060"/><pair kern="-69" kpx2="356"/><pair kern="-69" kpx2="354"/><pair kern="-20" kpx2="364"/><pair kern="-20" kpx2="366"/><pair kern="-20" kpx2="360"/><pair kern="-20" kpx2="362"/><pair kern="-20" kpx2="952"/><pair kern="-60" kpx2="1228"/><pair kern="-80" kpx2="1227"/><pair kern="-60" kpx2="936"/><pair kern="-60" kpx2="939"/><pair kern="-60" kpx2="933"/><pair kern="-69" kpx2="932"/><pair kern="-49" kpx2="934"/><pair kern="-49" kpx2="1254"/><pair kern="-40" kpx2="927"/><pair kern="-40" kpx2="920"/><pair kern="-49" kpx2="1258"/><pair kern="-49" kpx2="1256"/><pair kern="-80" kpx2="1268"/><pair kern="-60" kpx2="1269"/><pair kern="-20" kpx2="431"/><pair kern="-49" kpx2="416"/><pair kern="-49" kpx2="1152"/><pair kern="-49" kpx2="199"/><pair kern="-20" kpx2="220"/><pair kern="-60" kpx2="221"/><pair kern="-49" kpx2="216"/><pair kern="-20" kpx2="217"/><pair kern="-20" kpx2="218"/><pair kern="-20" kpx2="219"/><pair kern="-49" kpx2="212"/><pair kern="-49" kpx2="213"/><pair kern="-49" kpx2="214"/><pair kern="-49" kpx2="210"/><pair kern="-49" kpx2="211"/><pair kern="-49" kpx2="510"/><pair kern="-49" kpx2="1185"/><pair kern="-69" kpx2="1184"/><pair kern="-60" kpx2="978"/><pair kern="-49" kpx2="1194"/><pair kern="-49" kpx2="1192"/><pair kern="-60" kpx2="1198"/><pair kern="-49" kpx2="1197"/><pair kern="-69" kpx2="1196"/><pair kern="-60" kpx2="1200"/><pair kern="-80" kpx2="1206"/><pair kern="-60" kpx2="1207"/><pair kern="-69" kpx2="1204"/><pair kern="-49" kpx2="1205"/><pair kern="-80" kpx2="1208"/><pair kern="-60" kpx2="1209"/><pair kern="-60" kpx2="1214"/><pair kern="-60" kpx2="1212"/></kerning><kerning kpx1="8220"><pair kern="-60" kpx2="1092"/><pair kern="-60" kpx2="1089"/><pair kern="-69" kpx2="1113"/><pair kern="-29" kpx2="1109"/><pair kern="-60" kpx2="1108"/><pair kern="-60" kpx2="1105"/><pair kern="-60" kpx2="1104"/><pair kern="-69" kpx2="1126"/><pair kern="-69" kpx2="1127"/><pair kern="-60" kpx2="1149"/><pair kern="-60" kpx2="1147"/><pair kern="-60" kpx2="1145"/><pair kern="-29" kpx2="537"/><pair kern="-60" kpx2="1139"/><pair kern="-9" kpx2="1137"/><pair kern="20" kpx2="538"/><pair kern="-60" kpx2="1033"/><pair kern="-69" kpx2="65"/><pair kern="20" kpx2="84"/><pair kern="20" kpx2="87"/><pair kern="-60" kpx2="1051"/><pair kern="20" kpx2="86"/><pair kern="-69" kpx2="1040"/><pair kern="9" kpx2="89"/><pair kern="-60" kpx2="1044"/><pair kern="-29" kpx2="103"/><pair kern="-60" kpx2="100"/><pair kern="-60" kpx2="101"/><pair kern="-60" kpx2="99"/><pair kern="-40" kpx2="97"/><pair kern="-29" kpx2="110"/><pair kern="-60" kpx2="111"/><pair kern="-29" kpx2="109"/><pair kern="-69" kpx2="1083"/><pair kern="-29" kpx2="117"/><pair kern="-29" kpx2="115"/><pair kern="-29" kpx2="114"/><pair kern="-60" kpx2="1086"/><pair kern="-60" kpx2="113"/><pair kern="-29" kpx2="112"/><pair kern="-20" kpx2="1072"/><pair kern="-60" kpx2="1077"/><pair kern="-69" kpx2="1076"/><pair kern="-60" kpx2="1221"/><pair kern="-69" kpx2="1222"/><pair kern="-69" kpx2="1236"/><pair kern="-20" kpx2="1237"/><pair kern="-60" kpx2="1239"/><pair kern="-69" kpx2="1232"/><pair kern="-20" kpx2="1233"/><pair kern="-69" kpx2="1234"/><pair kern="-20" kpx2="1235"/><pair kern="-20" kpx2="1241"/><pair kern="-20" kpx2="1243"/><pair kern="-60" kpx2="1255"/><pair kern="-60" kpx2="1259"/><pair kern="-60" kpx2="1257"/><pair kern="-60" kpx2="1153"/><pair kern="-69" kpx2="197"/><pair kern="-69" kpx2="196"/><pair kern="-69" kpx2="193"/><pair kern="-69" kpx2="192"/><pair kern="-69" kpx2="195"/><pair kern="-69" kpx2="194"/><pair kern="9" kpx2="221"/><pair kern="-60" kpx2="235"/><pair kern="-60" kpx2="234"/><pair kern="-60" kpx2="233"/><pair kern="-60" kpx2="232"/><pair kern="-60" kpx2="231"/><pair kern="-60" kpx2="1195"/><pair kern="-40" kpx2="230"/><pair kern="-40" kpx2="229"/><pair kern="-60" kpx2="1193"/><pair kern="-40" kpx2="228"/><pair kern="-40" kpx2="227"/><pair kern="-40" kpx2="226"/><pair kern="-40" kpx2="225"/><pair kern="-60" kpx2="224"/><pair kern="-29" kpx2="252"/><pair kern="-29" kpx2="250"/><pair kern="-29" kpx2="251"/><pair kern="-60" kpx2="248"/><pair kern="-29" kpx2="249"/><pair kern="-60" kpx2="246"/><pair kern="-60" kpx2="244"/><pair kern="-60" kpx2="245"/><pair kern="-60" kpx2="242"/><pair kern="-60" kpx2="243"/><pair kern="-60" kpx2="7889"/><pair kern="-60" kpx2="275"/><pair kern="-60" kpx2="273"/><pair kern="-60" kpx2="7893"/><pair kern="-60" kpx2="279"/><pair kern="-60" kpx2="7895"/><pair kern="-60" kpx2="277"/><pair kern="-60" kpx2="7897"/><pair kern="-60" kpx2="283"/><pair kern="-60" kpx2="7899"/><pair kern="-60" kpx2="281"/><pair kern="-60" kpx2="7901"/><pair kern="-29" kpx2="287"/><pair kern="-60" kpx2="7903"/><pair kern="-29" kpx2="285"/><pair kern="-69" kpx2="258"/><pair kern="-40" kpx2="259"/><pair kern="-69" kpx2="256"/><pair kern="-60" kpx2="7875"/><pair kern="-40" kpx2="257"/><pair kern="-60" kpx2="7877"/><pair kern="-60" kpx2="263"/><pair kern="-69" kpx2="260"/><pair kern="-60" kpx2="7879"/><pair kern="-40" kpx2="261"/><pair kern="-60" kpx2="267"/><pair kern="-60" kpx2="265"/><pair kern="-60" kpx2="7885"/><pair kern="-60" kpx2="271"/><pair kern="-60" kpx2="7887"/><pair kern="-60" kpx2="269"/><pair kern="9" kpx2="7922"/><pair kern="-29" kpx2="7921"/><pair kern="9" kpx2="7926"/><pair kern="9" kpx2="7924"/><pair kern="-29" kpx2="312"/><pair kern="9" kpx2="7928"/><pair kern="-60" kpx2="7907"/><pair kern="-29" kpx2="289"/><pair kern="-60" kpx2="7905"/><pair kern="-29" kpx2="291"/><pair kern="-29" kpx2="7911"/><pair kern="-29" kpx2="7909"/><pair kern="-29" kpx2="7915"/><pair kern="-29" kpx2="7913"/><pair kern="-29" kpx2="7919"/><pair kern="-29" kpx2="7917"/><pair kern="-29" kpx2="343"/><pair kern="-29" kpx2="341"/><pair kern="-60" kpx2="339"/><pair kern="-60" kpx2="337"/><pair kern="-29" kpx2="351"/><pair kern="-69" kpx2="1299"/><pair kern="-60" kpx2="1298"/><pair kern="-60" kpx2="1297"/><pair kern="-29" kpx2="347"/><pair kern="-29" kpx2="326"/><pair kern="20" kpx2="7812"/><pair kern="-29" kpx2="324"/><pair kern="-60" kpx2="1288"/><pair kern="-69" kpx2="1289"/><pair kern="20" kpx2="7808"/><pair kern="20" kpx2="7810"/><pair kern="-60" kpx2="1293"/><pair kern="-69" kpx2="1282"/><pair kern="-60" kpx2="335"/><pair kern="-60" kpx2="1283"/><pair kern="-69" kpx2="1280"/><pair kern="-60" kpx2="333"/><pair kern="-60" kpx2="1281"/><pair kern="-29" kpx2="331"/><pair kern="-40" kpx2="7863"/><pair kern="-69" kpx2="7862"/><pair kern="20" kpx2="372"/><pair kern="-40" kpx2="7861"/><pair kern="-69" kpx2="7860"/><pair kern="9" kpx2="374"/><pair kern="-40" kpx2="7859"/><pair kern="-29" kpx2="369"/><pair kern="-69" kpx2="7858"/><pair kern="-29" kpx2="371"/><pair kern="-40" kpx2="7857"/><pair kern="-69" kpx2="7856"/><pair kern="-60" kpx2="7871"/><pair kern="-60" kpx2="7869"/><pair kern="-60" kpx2="7867"/><pair kern="9" kpx2="376"/><pair kern="-60" kpx2="7865"/><pair kern="20" kpx2="356"/><pair kern="-69" kpx2="7846"/><pair kern="-69" kpx2="7844"/><pair kern="-40" kpx2="7845"/><pair kern="-69" kpx2="7842"/><pair kern="-40" kpx2="7843"/><pair kern="20" kpx2="354"/><pair kern="-69" kpx2="7840"/><pair kern="-40" kpx2="7841"/><pair kern="-69" kpx2="7854"/><pair kern="-29" kpx2="365"/><pair kern="-40" kpx2="7855"/><pair kern="-69" kpx2="7852"/><pair kern="-29" kpx2="367"/><pair kern="-40" kpx2="7853"/><pair kern="-69" kpx2="7850"/><pair kern="-29" kpx2="361"/><pair kern="-40" kpx2="7851"/><pair kern="-69" kpx2="7848"/><pair kern="-29" kpx2="363"/><pair kern="-40" kpx2="7849"/><pair kern="-20" kpx2="956"/><pair kern="-40" kpx2="959"/><pair kern="-20" kpx2="954"/><pair kern="-29" kpx2="948"/><pair kern="-20" kpx2="949"/><pair kern="-20" kpx2="950"/><pair kern="-20" kpx2="951"/><pair kern="-40" kpx2="945"/><pair kern="-20" kpx2="941"/><pair kern="-40" kpx2="940"/><pair kern="-20" kpx2="942"/><pair kern="-69" kpx2="923"/><pair kern="-29" kpx2="432"/><pair kern="-69" kpx2="916"/><pair kern="-69" kpx2="913"/><pair kern="-60" kpx2="417"/><pair kern="-69" kpx2="902"/><pair kern="-40" kpx2="7681"/><pair kern="-69" kpx2="7680"/><pair kern="-40" kpx2="509"/><pair kern="-29" kpx2="7743"/><pair kern="-60" kpx2="511"/><pair kern="-69" kpx2="506"/><pair kern="-40" kpx2="507"/><pair kern="-40" kpx2="972"/><pair kern="-40" kpx2="963"/><pair kern="-40" kpx2="962"/><pair kern="-29" kpx2="961"/><pair kern="-40" kpx2="966"/></kerning><kerning kpx1="8013"><pair kern="-20" kpx2="923"/><pair kern="-9" kpx2="955"/><pair kern="-9" kpx2="978"/><pair kern="-9" kpx2="918"/><pair kern="-20" kpx2="916"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="44"/><pair kern="-20" kpx2="913"/><pair kern="-9" kpx2="936"/><pair kern="-9" kpx2="939"/><pair kern="-9" kpx2="933"/><pair kern="-40" kpx2="8218"/><pair kern="-20" kpx2="902"/><pair kern="-29" kpx2="932"/><pair kern="-20" kpx2="935"/><pair kern="-40" kpx2="8222"/><pair kern="-9" kpx2="931"/></kerning><kerning kpx1="7888"><pair kern="-20" kpx2="258"/><pair kern="-20" kpx2="256"/><pair kern="-20" kpx2="260"/><pair kern="-9" kpx2="7922"/><pair kern="-9" kpx2="7926"/><pair kern="-9" kpx2="7924"/><pair kern="-9" kpx2="7928"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="44"/><pair kern="-29" kpx2="538"/><pair kern="-20" kpx2="65"/><pair kern="-20" kpx2="197"/><pair kern="-20" kpx2="196"/><pair kern="-20" kpx2="193"/><pair kern="-20" kpx2="192"/><pair kern="-9" kpx2="1029"/><pair kern="-20" kpx2="195"/><pair kern="-20" kpx2="194"/><pair kern="-9" kpx2="7812"/><pair kern="-9" kpx2="221"/><pair kern="-29" kpx2="84"/><pair kern="-9" kpx2="87"/><pair kern="-9" kpx2="86"/><pair kern="-9" kpx2="7808"/><pair kern="-9" kpx2="7810"/><pair kern="-40" kpx2="8218"/><pair kern="-9" kpx2="89"/><pair kern="-20" kpx2="88"/><pair kern="-40" kpx2="8222"/><pair kern="-20" kpx2="7680"/><pair kern="-9" kpx2="90"/><pair kern="-9" kpx2="372"/><pair kern="-20" kpx2="7862"/><pair kern="-9" kpx2="374"/><pair kern="-20" kpx2="7860"/><pair kern="-20" kpx2="7858"/><pair kern="-20" kpx2="506"/><pair kern="-20" kpx2="7856"/><pair kern="-9" kpx2="381"/><pair kern="-9" kpx2="377"/><pair kern="-9" kpx2="376"/><pair kern="-9" kpx2="379"/><pair kern="-29" kpx2="356"/><pair kern="-20" kpx2="7846"/><pair kern="-20" kpx2="7844"/><pair kern="-20" kpx2="7842"/><pair kern="-29" kpx2="354"/><pair kern="-20" kpx2="7840"/><pair kern="-20" kpx2="7854"/><pair kern="-20" kpx2="7852"/><pair kern="-20" kpx2="7850"/><pair kern="-20" kpx2="7848"/></kerning><kerning kpx1="7890"><pair kern="-20" kpx2="258"/><pair kern="-20" kpx2="256"/><pair kern="-20" kpx2="260"/><pair kern="-9" kpx2="7922"/><pair kern="-9" kpx2="7926"/><pair kern="-9" kpx2="7924"/><pair kern="-9" kpx2="7928"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="44"/><pair kern="-29" kpx2="538"/><pair kern="-20" kpx2="65"/><pair kern="-20" kpx2="197"/><pair kern="-20" kpx2="196"/><pair kern="-20" kpx2="193"/><pair kern="-20" kpx2="192"/><pair kern="-9" kpx2="1029"/><pair kern="-20" kpx2="195"/><pair kern="-20" kpx2="194"/><pair kern="-9" kpx2="7812"/><pair kern="-9" kpx2="221"/><pair kern="-29" kpx2="84"/><pair kern="-9" kpx2="87"/><pair kern="-9" kpx2="86"/><pair kern="-9" kpx2="7808"/><pair kern="-9" kpx2="7810"/><pair kern="-40" kpx2="8218"/><pair kern="-9" kpx2="89"/><pair kern="-20" kpx2="88"/><pair kern="-40" kpx2="8222"/><pair kern="-20" kpx2="7680"/><pair kern="-9" kpx2="90"/><pair kern="-9" kpx2="372"/><pair kern="-20" kpx2="7862"/><pair kern="-9" kpx2="374"/><pair kern="-20" kpx2="7860"/><pair kern="-20" kpx2="7858"/><pair kern="-20" kpx2="506"/><pair kern="-20" kpx2="7856"/><pair kern="-9" kpx2="381"/><pair kern="-9" kpx2="377"/><pair kern="-9" kpx2="376"/><pair kern="-9" kpx2="379"/><pair kern="-29" kpx2="356"/><pair kern="-20" kpx2="7846"/><pair kern="-20" kpx2="7844"/><pair kern="-20" kpx2="7842"/><pair kern="-29" kpx2="354"/><pair kern="-20" kpx2="7840"/><pair kern="-20" kpx2="7854"/><pair kern="-20" kpx2="7852"/><pair kern="-20" kpx2="7850"/><pair kern="-20" kpx2="7848"/></kerning><kerning kpx1="7892"><pair kern="-20" kpx2="258"/><pair kern="-20" kpx2="256"/><pair kern="-20" kpx2="260"/><pair kern="-9" kpx2="7922"/><pair kern="-9" kpx2="7926"/><pair kern="-9" kpx2="7924"/><pair kern="-9" kpx2="7928"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="44"/><pair kern="-29" kpx2="538"/><pair kern="-20" kpx2="65"/><pair kern="-20" kpx2="197"/><pair kern="-20" kpx2="196"/><pair kern="-20" kpx2="193"/><pair kern="-20" kpx2="192"/><pair kern="-9" kpx2="1029"/><pair kern="-20" kpx2="195"/><pair kern="-20" kpx2="194"/><pair kern="-9" kpx2="7812"/><pair kern="-9" kpx2="221"/><pair kern="-29" kpx2="84"/><pair kern="-9" kpx2="87"/><pair kern="-9" kpx2="86"/><pair kern="-9" kpx2="7808"/><pair kern="-9" kpx2="7810"/><pair kern="-40" kpx2="8218"/><pair kern="-9" kpx2="89"/><pair kern="-20" kpx2="88"/><pair kern="-40" kpx2="8222"/><pair kern="-20" kpx2="7680"/><pair kern="-9" kpx2="90"/><pair kern="-9" kpx2="372"/><pair kern="-20" kpx2="7862"/><pair kern="-9" kpx2="374"/><pair kern="-20" kpx2="7860"/><pair kern="-20" kpx2="7858"/><pair kern="-20" kpx2="506"/><pair kern="-20" kpx2="7856"/><pair kern="-9" kpx2="381"/><pair kern="-9" kpx2="377"/><pair kern="-9" kpx2="376"/><pair kern="-9" kpx2="379"/><pair kern="-29" kpx2="356"/><pair kern="-20" kpx2="7846"/><pair kern="-20" kpx2="7844"/><pair kern="-20" kpx2="7842"/><pair kern="-29" kpx2="354"/><pair kern="-20" kpx2="7840"/><pair kern="-20" kpx2="7854"/><pair kern="-20" kpx2="7852"/><pair kern="-20" kpx2="7850"/><pair kern="-20" kpx2="7848"/></kerning><kerning kpx1="7894"><pair kern="-20" kpx2="258"/><pair kern="-20" kpx2="256"/><pair kern="-20" kpx2="260"/><pair kern="-9" kpx2="7922"/><pair kern="-9" kpx2="7926"/><pair kern="-9" kpx2="7924"/><pair kern="-9" kpx2="7928"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="44"/><pair kern="-29" kpx2="538"/><pair kern="-20" kpx2="65"/><pair kern="-20" kpx2="197"/><pair kern="-20" kpx2="196"/><pair kern="-20" kpx2="193"/><pair kern="-20" kpx2="192"/><pair kern="-9" kpx2="1029"/><pair kern="-20" kpx2="195"/><pair kern="-20" kpx2="194"/><pair kern="-9" kpx2="7812"/><pair kern="-9" kpx2="221"/><pair kern="-29" kpx2="84"/><pair kern="-9" kpx2="87"/><pair kern="-9" kpx2="86"/><pair kern="-9" kpx2="7808"/><pair kern="-9" kpx2="7810"/><pair kern="-40" kpx2="8218"/><pair kern="-9" kpx2="89"/><pair kern="-20" kpx2="88"/><pair kern="-40" kpx2="8222"/><pair kern="-20" kpx2="7680"/><pair kern="-9" kpx2="90"/><pair kern="-9" kpx2="372"/><pair kern="-20" kpx2="7862"/><pair kern="-9" kpx2="374"/><pair kern="-20" kpx2="7860"/><pair kern="-20" kpx2="7858"/><pair kern="-20" kpx2="506"/><pair kern="-20" kpx2="7856"/><pair kern="-9" kpx2="381"/><pair kern="-9" kpx2="377"/><pair kern="-9" kpx2="376"/><pair kern="-9" kpx2="379"/><pair kern="-29" kpx2="356"/><pair kern="-20" kpx2="7846"/><pair kern="-20" kpx2="7844"/><pair kern="-20" kpx2="7842"/><pair kern="-29" kpx2="354"/><pair kern="-20" kpx2="7840"/><pair kern="-20" kpx2="7854"/><pair kern="-20" kpx2="7852"/><pair kern="-20" kpx2="7850"/><pair kern="-20" kpx2="7848"/></kerning><kerning kpx1="7896"><pair kern="-20" kpx2="258"/><pair kern="-20" kpx2="256"/><pair kern="-20" kpx2="260"/><pair kern="-9" kpx2="7922"/><pair kern="-9" kpx2="7926"/><pair kern="-9" kpx2="7924"/><pair kern="-9" kpx2="7928"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="44"/><pair kern="-29" kpx2="538"/><pair kern="-20" kpx2="65"/><pair kern="-20" kpx2="197"/><pair kern="-20" kpx2="196"/><pair kern="-20" kpx2="193"/><pair kern="-20" kpx2="192"/><pair kern="-9" kpx2="1029"/><pair kern="-20" kpx2="195"/><pair kern="-20" kpx2="194"/><pair kern="-9" kpx2="7812"/><pair kern="-9" kpx2="221"/><pair kern="-29" kpx2="84"/><pair kern="-9" kpx2="87"/><pair kern="-9" kpx2="86"/><pair kern="-9" kpx2="7808"/><pair kern="-9" kpx2="7810"/><pair kern="-40" kpx2="8218"/><pair kern="-9" kpx2="89"/><pair kern="-20" kpx2="88"/><pair kern="-40" kpx2="8222"/><pair kern="-20" kpx2="7680"/><pair kern="-9" kpx2="90"/><pair kern="-9" kpx2="372"/><pair kern="-20" kpx2="7862"/><pair kern="-9" kpx2="374"/><pair kern="-20" kpx2="7860"/><pair kern="-20" kpx2="7858"/><pair kern="-20" kpx2="506"/><pair kern="-20" kpx2="7856"/><pair kern="-9" kpx2="381"/><pair kern="-9" kpx2="377"/><pair kern="-9" kpx2="376"/><pair kern="-9" kpx2="379"/><pair kern="-29" kpx2="356"/><pair kern="-20" kpx2="7846"/><pair kern="-20" kpx2="7844"/><pair kern="-20" kpx2="7842"/><pair kern="-29" kpx2="354"/><pair kern="-20" kpx2="7840"/><pair kern="-20" kpx2="7854"/><pair kern="-20" kpx2="7852"/><pair kern="-20" kpx2="7850"/><pair kern="-20" kpx2="7848"/></kerning><kerning kpx1="7899"><pair kern="40" kpx2="102"/><pair kern="49" kpx2="373"/><pair kern="49" kpx2="7925"/><pair kern="40" kpx2="64257"/><pair kern="40" kpx2="64256"/><pair kern="40" kpx2="64259"/><pair kern="40" kpx2="64258"/><pair kern="40" kpx2="64260"/><pair kern="49" kpx2="119"/><pair kern="49" kpx2="118"/><pair kern="40" kpx2="357"/><pair kern="40" kpx2="116"/><pair kern="49" kpx2="253"/><pair kern="49" kpx2="7809"/><pair kern="40" kpx2="355"/><pair kern="49" kpx2="7811"/><pair kern="49" kpx2="121"/><pair kern="40" kpx2="539"/><pair kern="49" kpx2="120"/></kerning><kerning kpx1="7901"><pair kern="40" kpx2="102"/><pair kern="49" kpx2="373"/><pair kern="49" kpx2="7925"/><pair kern="40" kpx2="64257"/><pair kern="40" kpx2="64256"/><pair kern="40" kpx2="64259"/><pair kern="40" kpx2="64258"/><pair kern="40" kpx2="64260"/><pair kern="49" kpx2="119"/><pair kern="49" kpx2="118"/><pair kern="40" kpx2="357"/><pair kern="40" kpx2="116"/><pair kern="49" kpx2="253"/><pair kern="49" kpx2="7809"/><pair kern="40" kpx2="355"/><pair kern="49" kpx2="7811"/><pair kern="49" kpx2="121"/><pair kern="40" kpx2="539"/><pair kern="49" kpx2="120"/></kerning><kerning kpx1="7903"><pair kern="40" kpx2="102"/><pair kern="49" kpx2="373"/><pair kern="49" kpx2="7925"/><pair kern="40" kpx2="64257"/><pair kern="40" kpx2="64256"/><pair kern="40" kpx2="64259"/><pair kern="40" kpx2="64258"/><pair kern="40" kpx2="64260"/><pair kern="49" kpx2="119"/><pair kern="49" kpx2="118"/><pair kern="40" kpx2="357"/><pair kern="40" kpx2="116"/><pair kern="49" kpx2="253"/><pair kern="49" kpx2="7809"/><pair kern="40" kpx2="355"/><pair kern="49" kpx2="7811"/><pair kern="49" kpx2="121"/><pair kern="40" kpx2="539"/><pair kern="49" kpx2="120"/></kerning><kerning kpx1="7872"><pair kern="60" kpx2="74"/></kerning><kerning kpx1="7873"><pair kern="-9" kpx2="34"/><pair kern="-20" kpx2="373"/><pair kern="-9" kpx2="39"/><pair kern="-20" kpx2="7925"/><pair kern="-9" kpx2="380"/><pair kern="-9" kpx2="382"/><pair kern="-9" kpx2="378"/><pair kern="-20" kpx2="119"/><pair kern="-20" kpx2="118"/><pair kern="-20" kpx2="253"/><pair kern="-20" kpx2="7809"/><pair kern="-20" kpx2="7811"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="122"/><pair kern="-9" kpx2="8221"/><pair kern="-20" kpx2="121"/><pair kern="-20" kpx2="120"/></kerning><kerning kpx1="7874"><pair kern="60" kpx2="74"/></kerning><kerning kpx1="7875"><pair kern="-9" kpx2="34"/><pair kern="-20" kpx2="373"/><pair kern="-9" kpx2="39"/><pair kern="-20" kpx2="7925"/><pair kern="-9" kpx2="380"/><pair kern="-9" kpx2="382"/><pair kern="-9" kpx2="378"/><pair kern="-20" kpx2="119"/><pair kern="-20" kpx2="118"/><pair kern="-20" kpx2="253"/><pair kern="-20" kpx2="7809"/><pair kern="-20" kpx2="7811"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="122"/><pair kern="-9" kpx2="8221"/><pair kern="-20" kpx2="121"/><pair kern="-20" kpx2="120"/></kerning><kerning kpx1="7876"><pair kern="60" kpx2="74"/></kerning><kerning kpx1="7877"><pair kern="-9" kpx2="34"/><pair kern="-20" kpx2="373"/><pair kern="-9" kpx2="39"/><pair kern="-20" kpx2="7925"/><pair kern="-9" kpx2="380"/><pair kern="-9" kpx2="382"/><pair kern="-9" kpx2="378"/><pair kern="-20" kpx2="119"/><pair kern="-20" kpx2="118"/><pair kern="-20" kpx2="253"/><pair kern="-20" kpx2="7809"/><pair kern="-20" kpx2="7811"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="122"/><pair kern="-9" kpx2="8221"/><pair kern="-20" kpx2="121"/><pair kern="-20" kpx2="120"/></kerning><kerning kpx1="7878"><pair kern="60" kpx2="74"/></kerning><kerning kpx1="7879"><pair kern="-9" kpx2="34"/><pair kern="-20" kpx2="373"/><pair kern="-9" kpx2="39"/><pair kern="-20" kpx2="7925"/><pair kern="-9" kpx2="380"/><pair kern="-9" kpx2="382"/><pair kern="-9" kpx2="378"/><pair kern="-20" kpx2="119"/><pair kern="-20" kpx2="118"/><pair kern="-20" kpx2="253"/><pair kern="-20" kpx2="7809"/><pair kern="-20" kpx2="7811"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="122"/><pair kern="-9" kpx2="8221"/><pair kern="-20" kpx2="121"/><pair kern="-20" kpx2="120"/></kerning><kerning kpx1="7884"><pair kern="-20" kpx2="258"/><pair kern="-20" kpx2="256"/><pair kern="-20" kpx2="260"/><pair kern="-9" kpx2="7922"/><pair kern="-9" kpx2="7926"/><pair kern="-9" kpx2="7924"/><pair kern="-9" kpx2="7928"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="44"/><pair kern="-29" kpx2="538"/><pair kern="-20" kpx2="65"/><pair kern="-20" kpx2="197"/><pair kern="-20" kpx2="196"/><pair kern="-20" kpx2="193"/><pair kern="-20" kpx2="192"/><pair kern="-9" kpx2="1029"/><pair kern="-20" kpx2="195"/><pair kern="-20" kpx2="194"/><pair kern="-9" kpx2="7812"/><pair kern="-9" kpx2="221"/><pair kern="-29" kpx2="84"/><pair kern="-9" kpx2="87"/><pair kern="-9" kpx2="86"/><pair kern="-9" kpx2="7808"/><pair kern="-9" kpx2="7810"/><pair kern="-40" kpx2="8218"/><pair kern="-9" kpx2="89"/><pair kern="-20" kpx2="88"/><pair kern="-40" kpx2="8222"/><pair kern="-20" kpx2="7680"/><pair kern="-9" kpx2="90"/><pair kern="-9" kpx2="372"/><pair kern="-20" kpx2="7862"/><pair kern="-9" kpx2="374"/><pair kern="-20" kpx2="7860"/><pair kern="-20" kpx2="7858"/><pair kern="-20" kpx2="506"/><pair kern="-20" kpx2="7856"/><pair kern="-9" kpx2="381"/><pair kern="-9" kpx2="377"/><pair kern="-9" kpx2="376"/><pair kern="-9" kpx2="379"/><pair kern="-29" kpx2="356"/><pair kern="-20" kpx2="7846"/><pair kern="-20" kpx2="7844"/><pair kern="-20" kpx2="7842"/><pair kern="-29" kpx2="354"/><pair kern="-20" kpx2="7840"/><pair kern="-20" kpx2="7854"/><pair kern="-20" kpx2="7852"/><pair kern="-20" kpx2="7850"/><pair kern="-20" kpx2="7848"/></kerning><kerning kpx1="7885"><pair kern="-9" kpx2="34"/><pair kern="-20" kpx2="373"/><pair kern="-9" kpx2="39"/><pair kern="-20" kpx2="7925"/><pair kern="-9" kpx2="380"/><pair kern="-9" kpx2="382"/><pair kern="-9" kpx2="378"/><pair kern="-20" kpx2="119"/><pair kern="-20" kpx2="118"/><pair kern="-20" kpx2="253"/><pair kern="-20" kpx2="7809"/><pair kern="-20" kpx2="7811"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="122"/><pair kern="-9" kpx2="8221"/><pair kern="-20" kpx2="121"/><pair kern="-20" kpx2="120"/></kerning><kerning kpx1="7886"><pair kern="-20" kpx2="258"/><pair kern="-20" kpx2="256"/><pair kern="-20" kpx2="260"/><pair kern="-9" kpx2="7922"/><pair kern="-9" kpx2="7926"/><pair kern="-9" kpx2="7924"/><pair kern="-9" kpx2="7928"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="44"/><pair kern="-29" kpx2="538"/><pair kern="-20" kpx2="65"/><pair kern="-20" kpx2="197"/><pair kern="-20" kpx2="196"/><pair kern="-20" kpx2="193"/><pair kern="-20" kpx2="192"/><pair kern="-9" kpx2="1029"/><pair kern="-20" kpx2="195"/><pair kern="-20" kpx2="194"/><pair kern="-9" kpx2="7812"/><pair kern="-9" kpx2="221"/><pair kern="-29" kpx2="84"/><pair kern="-9" kpx2="87"/><pair kern="-9" kpx2="86"/><pair kern="-9" kpx2="7808"/><pair kern="-9" kpx2="7810"/><pair kern="-40" kpx2="8218"/><pair kern="-9" kpx2="89"/><pair kern="-20" kpx2="88"/><pair kern="-40" kpx2="8222"/><pair kern="-20" kpx2="7680"/><pair kern="-9" kpx2="90"/><pair kern="-9" kpx2="372"/><pair kern="-20" kpx2="7862"/><pair kern="-9" kpx2="374"/><pair kern="-20" kpx2="7860"/><pair kern="-20" kpx2="7858"/><pair kern="-20" kpx2="506"/><pair kern="-20" kpx2="7856"/><pair kern="-9" kpx2="381"/><pair kern="-9" kpx2="377"/><pair kern="-9" kpx2="376"/><pair kern="-9" kpx2="379"/><pair kern="-29" kpx2="356"/><pair kern="-20" kpx2="7846"/><pair kern="-20" kpx2="7844"/><pair kern="-20" kpx2="7842"/><pair kern="-29" kpx2="354"/><pair kern="-20" kpx2="7840"/><pair kern="-20" kpx2="7854"/><pair kern="-20" kpx2="7852"/><pair kern="-20" kpx2="7850"/><pair kern="-20" kpx2="7848"/></kerning><kerning kpx1="7887"><pair kern="-9" kpx2="34"/><pair kern="-20" kpx2="373"/><pair kern="-9" kpx2="39"/><pair kern="-20" kpx2="7925"/><pair kern="-9" kpx2="380"/><pair kern="-9" kpx2="382"/><pair kern="-9" kpx2="378"/><pair kern="-20" kpx2="119"/><pair kern="-20" kpx2="118"/><pair kern="-20" kpx2="253"/><pair kern="-20" kpx2="7809"/><pair kern="-20" kpx2="7811"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="122"/><pair kern="-9" kpx2="8221"/><pair kern="-20" kpx2="121"/><pair kern="-20" kpx2="120"/></kerning><kerning kpx1="7923"><pair kern="40" kpx2="34"/><pair kern="40" kpx2="39"/><pair kern="-40" kpx2="8218"/><pair kern="40" kpx2="8217"/><pair kern="20" kpx2="63"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="8222"/><pair kern="40" kpx2="8221"/><pair kern="-40" kpx2="44"/></kerning><kerning kpx1="7922"><pair kern="-49" kpx2="7889"/><pair kern="-49" kpx2="275"/><pair kern="-20" kpx2="7888"/><pair kern="-49" kpx2="273"/><pair kern="-20" kpx2="7890"/><pair kern="-49" kpx2="7893"/><pair kern="-49" kpx2="279"/><pair kern="-20" kpx2="7892"/><pair kern="-49" kpx2="7895"/><pair kern="-49" kpx2="277"/><pair kern="-20" kpx2="7894"/><pair kern="-49" kpx2="7897"/><pair kern="-49" kpx2="283"/><pair kern="-20" kpx2="7896"/><pair kern="-49" kpx2="7899"/><pair kern="-49" kpx2="281"/><pair kern="-20" kpx2="7898"/><pair kern="-49" kpx2="7901"/><pair kern="-20" kpx2="287"/><pair kern="-20" kpx2="7900"/><pair kern="-20" kpx2="286"/><pair kern="-49" kpx2="7903"/><pair kern="-20" kpx2="285"/><pair kern="-20" kpx2="7902"/><pair kern="-20" kpx2="284"/><pair kern="-60" kpx2="258"/><pair kern="-49" kpx2="259"/><pair kern="-60" kpx2="256"/><pair kern="-49" kpx2="7875"/><pair kern="-49" kpx2="257"/><pair kern="-20" kpx2="262"/><pair kern="-49" kpx2="7877"/><pair kern="-49" kpx2="263"/><pair kern="-60" kpx2="260"/><pair kern="-49" kpx2="7879"/><pair kern="-49" kpx2="261"/><pair kern="-20" kpx2="266"/><pair kern="-49" kpx2="267"/><pair kern="-20" kpx2="264"/><pair kern="-49" kpx2="265"/><pair kern="-20" kpx2="7884"/><pair kern="-49" kpx2="7885"/><pair kern="-49" kpx2="271"/><pair kern="-20" kpx2="7886"/><pair kern="-20" kpx2="268"/><pair kern="-49" kpx2="7887"/><pair kern="-49" kpx2="269"/><pair kern="-29" kpx2="7921"/><pair kern="-29" kpx2="312"/><pair kern="-60" kpx2="46"/><pair kern="-60" kpx2="44"/><pair kern="-20" kpx2="7906"/><pair kern="-20" kpx2="288"/><pair kern="-49" kpx2="7907"/><pair kern="-20" kpx2="289"/><pair kern="-20" kpx2="7904"/><pair kern="-20" kpx2="290"/><pair kern="-49" kpx2="7905"/><pair kern="-20" kpx2="291"/><pair kern="-29" kpx2="7911"/><pair kern="-29" kpx2="7909"/><pair kern="-29" kpx2="7915"/><pair kern="-29" kpx2="7913"/><pair kern="-40" kpx2="537"/><pair kern="20" kpx2="63"/><pair kern="-29" kpx2="7919"/><pair kern="-29" kpx2="7917"/><pair kern="-29" kpx2="343"/><pair kern="-29" kpx2="341"/><pair kern="-20" kpx2="71"/><pair kern="-49" kpx2="339"/><pair kern="-20" kpx2="338"/><pair kern="-60" kpx2="65"/><pair kern="-49" kpx2="337"/><pair kern="-20" kpx2="67"/><pair kern="-20" kpx2="336"/><pair kern="-40" kpx2="351"/><pair kern="-20" kpx2="79"/><pair kern="-40" kpx2="347"/><pair kern="-29" kpx2="326"/><pair kern="-29" kpx2="324"/><pair kern="-20" kpx2="81"/><pair kern="-20" kpx2="334"/><pair kern="-60" kpx2="8218"/><pair kern="-49" kpx2="335"/><pair kern="-20" kpx2="332"/><pair kern="-49" kpx2="333"/><pair kern="-60" kpx2="8222"/><pair kern="-29" kpx2="331"/><pair kern="-49" kpx2="7863"/><pair kern="-60" kpx2="7862"/><pair kern="-20" kpx2="103"/><pair kern="-49" kpx2="7861"/><pair kern="-49" kpx2="100"/><pair kern="-60" kpx2="7860"/><pair kern="-49" kpx2="101"/><pair kern="-49" kpx2="7859"/><pair kern="-29" kpx2="369"/><pair kern="-60" kpx2="7858"/><pair kern="-49" kpx2="99"/><pair kern="-49" kpx2="7857"/><pair kern="-29" kpx2="371"/><pair kern="-60" kpx2="7856"/><pair kern="-49" kpx2="97"/><pair kern="-49" kpx2="7871"/><pair kern="-29" kpx2="110"/><pair kern="-20" kpx2="380"/><pair kern="-49" kpx2="111"/><pair kern="-49" kpx2="7869"/><pair kern="-20" kpx2="382"/><pair kern="-29" kpx2="109"/><pair kern="-49" kpx2="7867"/><pair kern="-49" kpx2="7865"/><pair kern="-20" kpx2="378"/><pair kern="-60" kpx2="7846"/><pair kern="-60" kpx2="7844"/><pair kern="-29" kpx2="117"/><pair kern="-49" kpx2="7845"/><pair kern="-60" kpx2="7842"/><pair kern="-40" kpx2="115"/><pair kern="-49" kpx2="7843"/><pair kern="-29" kpx2="114"/><pair kern="-60" kpx2="7840"/><pair kern="-49" kpx2="113"/><pair kern="-49" kpx2="7841"/><pair kern="-29" kpx2="112"/><pair kern="-60" kpx2="7854"/><pair kern="-49" kpx2="7855"/><pair kern="-29" kpx2="365"/><pair kern="-60" kpx2="7852"/><pair kern="-49" kpx2="7853"/><pair kern="-29" kpx2="367"/><pair kern="-60" kpx2="7850"/><pair kern="-49" kpx2="7851"/><pair kern="-29" kpx2="361"/><pair kern="-20" kpx2="122"/><pair kern="-60" kpx2="7848"/><pair kern="-49" kpx2="7849"/><pair kern="-29" kpx2="363"/><pair kern="-29" kpx2="432"/><pair kern="-49" kpx2="417"/><pair kern="-20" kpx2="416"/><pair kern="-60" kpx2="197"/><pair kern="-60" kpx2="196"/><pair kern="-20" kpx2="199"/><pair kern="-60" kpx2="193"/><pair kern="-60" kpx2="192"/><pair kern="-60" kpx2="195"/><pair kern="-60" kpx2="194"/><pair kern="-20" kpx2="216"/><pair kern="-20" kpx2="212"/><pair kern="-20" kpx2="213"/><pair kern="-20" kpx2="214"/><pair kern="-49" kpx2="7681"/><pair kern="-60" kpx2="7680"/><pair kern="-20" kpx2="210"/><pair kern="-20" kpx2="211"/><pair kern="-29" kpx2="7743"/><pair kern="-49" kpx2="509"/><pair kern="-20" kpx2="510"/><pair kern="-49" kpx2="511"/><pair kern="-49" kpx2="235"/><pair kern="-49" kpx2="234"/><pair kern="-60" kpx2="506"/><pair kern="-49" kpx2="233"/><pair kern="-49" kpx2="507"/><pair kern="-49" kpx2="232"/><pair kern="-49" kpx2="231"/><pair kern="-49" kpx2="230"/><pair kern="-49" kpx2="229"/><pair kern="-49" kpx2="228"/><pair kern="-49" kpx2="227"/><pair kern="-49" kpx2="226"/><pair kern="-49" kpx2="225"/><pair kern="-49" kpx2="224"/><pair kern="-29" kpx2="252"/><pair kern="-29" kpx2="250"/><pair kern="-29" kpx2="251"/><pair kern="-49" kpx2="248"/><pair kern="-29" kpx2="249"/><pair kern="-49" kpx2="246"/><pair kern="-49" kpx2="244"/><pair kern="-49" kpx2="245"/><pair kern="-49" kpx2="242"/><pair kern="-49" kpx2="243"/></kerning><kerning kpx1="7921"><pair kern="49" kpx2="102"/><pair kern="49" kpx2="373"/><pair kern="49" kpx2="7925"/><pair kern="49" kpx2="64257"/><pair kern="49" kpx2="64256"/><pair kern="49" kpx2="64259"/><pair kern="49" kpx2="64258"/><pair kern="49" kpx2="64260"/><pair kern="49" kpx2="119"/><pair kern="49" kpx2="118"/><pair kern="49" kpx2="357"/><pair kern="49" kpx2="116"/><pair kern="49" kpx2="253"/><pair kern="49" kpx2="7809"/><pair kern="49" kpx2="355"/><pair kern="49" kpx2="7811"/><pair kern="49" kpx2="121"/><pair kern="49" kpx2="539"/><pair kern="49" kpx2="120"/></kerning><kerning kpx1="7927"><pair kern="40" kpx2="34"/><pair kern="40" kpx2="39"/><pair kern="-40" kpx2="8218"/><pair kern="40" kpx2="8217"/><pair kern="20" kpx2="63"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="8222"/><pair kern="40" kpx2="8221"/><pair kern="-40" kpx2="44"/></kerning><kerning kpx1="7926"><pair kern="-49" kpx2="7889"/><pair kern="-49" kpx2="275"/><pair kern="-20" kpx2="7888"/><pair kern="-49" kpx2="273"/><pair kern="-20" kpx2="7890"/><pair kern="-49" kpx2="7893"/><pair kern="-49" kpx2="279"/><pair kern="-20" kpx2="7892"/><pair kern="-49" kpx2="7895"/><pair kern="-49" kpx2="277"/><pair kern="-20" kpx2="7894"/><pair kern="-49" kpx2="7897"/><pair kern="-49" kpx2="283"/><pair kern="-20" kpx2="7896"/><pair kern="-49" kpx2="7899"/><pair kern="-49" kpx2="281"/><pair kern="-20" kpx2="7898"/><pair kern="-49" kpx2="7901"/><pair kern="-20" kpx2="287"/><pair kern="-20" kpx2="7900"/><pair kern="-20" kpx2="286"/><pair kern="-49" kpx2="7903"/><pair kern="-20" kpx2="285"/><pair kern="-20" kpx2="7902"/><pair kern="-20" kpx2="284"/><pair kern="-60" kpx2="258"/><pair kern="-49" kpx2="259"/><pair kern="-60" kpx2="256"/><pair kern="-49" kpx2="7875"/><pair kern="-49" kpx2="257"/><pair kern="-20" kpx2="262"/><pair kern="-49" kpx2="7877"/><pair kern="-49" kpx2="263"/><pair kern="-60" kpx2="260"/><pair kern="-49" kpx2="7879"/><pair kern="-49" kpx2="261"/><pair kern="-20" kpx2="266"/><pair kern="-49" kpx2="267"/><pair kern="-20" kpx2="264"/><pair kern="-49" kpx2="265"/><pair kern="-20" kpx2="7884"/><pair kern="-49" kpx2="7885"/><pair kern="-49" kpx2="271"/><pair kern="-20" kpx2="7886"/><pair kern="-20" kpx2="268"/><pair kern="-49" kpx2="7887"/><pair kern="-49" kpx2="269"/><pair kern="-29" kpx2="7921"/><pair kern="-29" kpx2="312"/><pair kern="-60" kpx2="46"/><pair kern="-60" kpx2="44"/><pair kern="-20" kpx2="7906"/><pair kern="-20" kpx2="288"/><pair kern="-49" kpx2="7907"/><pair kern="-20" kpx2="289"/><pair kern="-20" kpx2="7904"/><pair kern="-20" kpx2="290"/><pair kern="-49" kpx2="7905"/><pair kern="-20" kpx2="291"/><pair kern="-29" kpx2="7911"/><pair kern="-29" kpx2="7909"/><pair kern="-29" kpx2="7915"/><pair kern="-29" kpx2="7913"/><pair kern="-40" kpx2="537"/><pair kern="20" kpx2="63"/><pair kern="-29" kpx2="7919"/><pair kern="-29" kpx2="7917"/><pair kern="-29" kpx2="343"/><pair kern="-29" kpx2="341"/><pair kern="-20" kpx2="71"/><pair kern="-49" kpx2="339"/><pair kern="-20" kpx2="338"/><pair kern="-60" kpx2="65"/><pair kern="-49" kpx2="337"/><pair kern="-20" kpx2="67"/><pair kern="-20" kpx2="336"/><pair kern="-40" kpx2="351"/><pair kern="-20" kpx2="79"/><pair kern="-40" kpx2="347"/><pair kern="-29" kpx2="326"/><pair kern="-29" kpx2="324"/><pair kern="-20" kpx2="81"/><pair kern="-20" kpx2="334"/><pair kern="-60" kpx2="8218"/><pair kern="-49" kpx2="335"/><pair kern="-20" kpx2="332"/><pair kern="-49" kpx2="333"/><pair kern="-60" kpx2="8222"/><pair kern="-29" kpx2="331"/><pair kern="-49" kpx2="7863"/><pair kern="-60" kpx2="7862"/><pair kern="-20" kpx2="103"/><pair kern="-49" kpx2="7861"/><pair kern="-49" kpx2="100"/><pair kern="-60" kpx2="7860"/><pair kern="-49" kpx2="101"/><pair kern="-49" kpx2="7859"/><pair kern="-29" kpx2="369"/><pair kern="-60" kpx2="7858"/><pair kern="-49" kpx2="99"/><pair kern="-49" kpx2="7857"/><pair kern="-29" kpx2="371"/><pair kern="-60" kpx2="7856"/><pair kern="-49" kpx2="97"/><pair kern="-49" kpx2="7871"/><pair kern="-29" kpx2="110"/><pair kern="-20" kpx2="380"/><pair kern="-49" kpx2="111"/><pair kern="-49" kpx2="7869"/><pair kern="-20" kpx2="382"/><pair kern="-29" kpx2="109"/><pair kern="-49" kpx2="7867"/><pair kern="-49" kpx2="7865"/><pair kern="-20" kpx2="378"/><pair kern="-60" kpx2="7846"/><pair kern="-60" kpx2="7844"/><pair kern="-29" kpx2="117"/><pair kern="-49" kpx2="7845"/><pair kern="-60" kpx2="7842"/><pair kern="-40" kpx2="115"/><pair kern="-49" kpx2="7843"/><pair kern="-29" kpx2="114"/><pair kern="-60" kpx2="7840"/><pair kern="-49" kpx2="113"/><pair kern="-49" kpx2="7841"/><pair kern="-29" kpx2="112"/><pair kern="-60" kpx2="7854"/><pair kern="-49" kpx2="7855"/><pair kern="-29" kpx2="365"/><pair kern="-60" kpx2="7852"/><pair kern="-49" kpx2="7853"/><pair kern="-29" kpx2="367"/><pair kern="-60" kpx2="7850"/><pair kern="-49" kpx2="7851"/><pair kern="-29" kpx2="361"/><pair kern="-20" kpx2="122"/><pair kern="-60" kpx2="7848"/><pair kern="-49" kpx2="7849"/><pair kern="-29" kpx2="363"/><pair kern="-29" kpx2="432"/><pair kern="-49" kpx2="417"/><pair kern="-20" kpx2="416"/><pair kern="-60" kpx2="197"/><pair kern="-60" kpx2="196"/><pair kern="-20" kpx2="199"/><pair kern="-60" kpx2="193"/><pair kern="-60" kpx2="192"/><pair kern="-60" kpx2="195"/><pair kern="-60" kpx2="194"/><pair kern="-20" kpx2="216"/><pair kern="-20" kpx2="212"/><pair kern="-20" kpx2="213"/><pair kern="-20" kpx2="214"/><pair kern="-49" kpx2="7681"/><pair kern="-60" kpx2="7680"/><pair kern="-20" kpx2="210"/><pair kern="-20" kpx2="211"/><pair kern="-29" kpx2="7743"/><pair kern="-49" kpx2="509"/><pair kern="-20" kpx2="510"/><pair kern="-49" kpx2="511"/><pair kern="-49" kpx2="235"/><pair kern="-49" kpx2="234"/><pair kern="-60" kpx2="506"/><pair kern="-49" kpx2="233"/><pair kern="-49" kpx2="507"/><pair kern="-49" kpx2="232"/><pair kern="-49" kpx2="231"/><pair kern="-49" kpx2="230"/><pair kern="-49" kpx2="229"/><pair kern="-49" kpx2="228"/><pair kern="-49" kpx2="227"/><pair kern="-49" kpx2="226"/><pair kern="-49" kpx2="225"/><pair kern="-49" kpx2="224"/><pair kern="-29" kpx2="252"/><pair kern="-29" kpx2="250"/><pair kern="-29" kpx2="251"/><pair kern="-49" kpx2="248"/><pair kern="-29" kpx2="249"/><pair kern="-49" kpx2="246"/><pair kern="-49" kpx2="244"/><pair kern="-49" kpx2="245"/><pair kern="-49" kpx2="242"/><pair kern="-49" kpx2="243"/></kerning><kerning kpx1="7925"><pair kern="40" kpx2="34"/><pair kern="40" kpx2="39"/><pair kern="-40" kpx2="8218"/><pair kern="40" kpx2="8217"/><pair kern="20" kpx2="63"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="8222"/><pair kern="40" kpx2="8221"/><pair kern="-40" kpx2="44"/></kerning><kerning kpx1="7924"><pair kern="-49" kpx2="7889"/><pair kern="-49" kpx2="275"/><pair kern="-20" kpx2="7888"/><pair kern="-49" kpx2="273"/><pair kern="-20" kpx2="7890"/><pair kern="-49" kpx2="7893"/><pair kern="-49" kpx2="279"/><pair kern="-20" kpx2="7892"/><pair kern="-49" kpx2="7895"/><pair kern="-49" kpx2="277"/><pair kern="-20" kpx2="7894"/><pair kern="-49" kpx2="7897"/><pair kern="-49" kpx2="283"/><pair kern="-20" kpx2="7896"/><pair kern="-49" kpx2="7899"/><pair kern="-49" kpx2="281"/><pair kern="-20" kpx2="7898"/><pair kern="-49" kpx2="7901"/><pair kern="-20" kpx2="287"/><pair kern="-20" kpx2="7900"/><pair kern="-20" kpx2="286"/><pair kern="-49" kpx2="7903"/><pair kern="-20" kpx2="285"/><pair kern="-20" kpx2="7902"/><pair kern="-20" kpx2="284"/><pair kern="-60" kpx2="258"/><pair kern="-49" kpx2="259"/><pair kern="-60" kpx2="256"/><pair kern="-49" kpx2="7875"/><pair kern="-49" kpx2="257"/><pair kern="-20" kpx2="262"/><pair kern="-49" kpx2="7877"/><pair kern="-49" kpx2="263"/><pair kern="-60" kpx2="260"/><pair kern="-49" kpx2="7879"/><pair kern="-49" kpx2="261"/><pair kern="-20" kpx2="266"/><pair kern="-49" kpx2="267"/><pair kern="-20" kpx2="264"/><pair kern="-49" kpx2="265"/><pair kern="-20" kpx2="7884"/><pair kern="-49" kpx2="7885"/><pair kern="-49" kpx2="271"/><pair kern="-20" kpx2="7886"/><pair kern="-20" kpx2="268"/><pair kern="-49" kpx2="7887"/><pair kern="-49" kpx2="269"/><pair kern="-29" kpx2="7921"/><pair kern="-29" kpx2="312"/><pair kern="-60" kpx2="46"/><pair kern="-60" kpx2="44"/><pair kern="-20" kpx2="7906"/><pair kern="-20" kpx2="288"/><pair kern="-49" kpx2="7907"/><pair kern="-20" kpx2="289"/><pair kern="-20" kpx2="7904"/><pair kern="-20" kpx2="290"/><pair kern="-49" kpx2="7905"/><pair kern="-20" kpx2="291"/><pair kern="-29" kpx2="7911"/><pair kern="-29" kpx2="7909"/><pair kern="-29" kpx2="7915"/><pair kern="-29" kpx2="7913"/><pair kern="-40" kpx2="537"/><pair kern="20" kpx2="63"/><pair kern="-29" kpx2="7919"/><pair kern="-29" kpx2="7917"/><pair kern="-29" kpx2="343"/><pair kern="-29" kpx2="341"/><pair kern="-20" kpx2="71"/><pair kern="-49" kpx2="339"/><pair kern="-20" kpx2="338"/><pair kern="-60" kpx2="65"/><pair kern="-49" kpx2="337"/><pair kern="-20" kpx2="67"/><pair kern="-20" kpx2="336"/><pair kern="-40" kpx2="351"/><pair kern="-20" kpx2="79"/><pair kern="-40" kpx2="347"/><pair kern="-29" kpx2="326"/><pair kern="-29" kpx2="324"/><pair kern="-20" kpx2="81"/><pair kern="-20" kpx2="334"/><pair kern="-60" kpx2="8218"/><pair kern="-49" kpx2="335"/><pair kern="-20" kpx2="332"/><pair kern="-49" kpx2="333"/><pair kern="-60" kpx2="8222"/><pair kern="-29" kpx2="331"/><pair kern="-49" kpx2="7863"/><pair kern="-60" kpx2="7862"/><pair kern="-20" kpx2="103"/><pair kern="-49" kpx2="7861"/><pair kern="-49" kpx2="100"/><pair kern="-60" kpx2="7860"/><pair kern="-49" kpx2="101"/><pair kern="-49" kpx2="7859"/><pair kern="-29" kpx2="369"/><pair kern="-60" kpx2="7858"/><pair kern="-49" kpx2="99"/><pair kern="-49" kpx2="7857"/><pair kern="-29" kpx2="371"/><pair kern="-60" kpx2="7856"/><pair kern="-49" kpx2="97"/><pair kern="-49" kpx2="7871"/><pair kern="-29" kpx2="110"/><pair kern="-20" kpx2="380"/><pair kern="-49" kpx2="111"/><pair kern="-49" kpx2="7869"/><pair kern="-20" kpx2="382"/><pair kern="-29" kpx2="109"/><pair kern="-49" kpx2="7867"/><pair kern="-49" kpx2="7865"/><pair kern="-20" kpx2="378"/><pair kern="-60" kpx2="7846"/><pair kern="-60" kpx2="7844"/><pair kern="-29" kpx2="117"/><pair kern="-49" kpx2="7845"/><pair kern="-60" kpx2="7842"/><pair kern="-40" kpx2="115"/><pair kern="-49" kpx2="7843"/><pair kern="-29" kpx2="114"/><pair kern="-60" kpx2="7840"/><pair kern="-49" kpx2="113"/><pair kern="-49" kpx2="7841"/><pair kern="-29" kpx2="112"/><pair kern="-60" kpx2="7854"/><pair kern="-49" kpx2="7855"/><pair kern="-29" kpx2="365"/><pair kern="-60" kpx2="7852"/><pair kern="-49" kpx2="7853"/><pair kern="-29" kpx2="367"/><pair kern="-60" kpx2="7850"/><pair kern="-49" kpx2="7851"/><pair kern="-29" kpx2="361"/><pair kern="-20" kpx2="122"/><pair kern="-60" kpx2="7848"/><pair kern="-49" kpx2="7849"/><pair kern="-29" kpx2="363"/><pair kern="-29" kpx2="432"/><pair kern="-49" kpx2="417"/><pair kern="-20" kpx2="416"/><pair kern="-60" kpx2="197"/><pair kern="-60" kpx2="196"/><pair kern="-20" kpx2="199"/><pair kern="-60" kpx2="193"/><pair kern="-60" kpx2="192"/><pair kern="-60" kpx2="195"/><pair kern="-60" kpx2="194"/><pair kern="-20" kpx2="216"/><pair kern="-20" kpx2="212"/><pair kern="-20" kpx2="213"/><pair kern="-20" kpx2="214"/><pair kern="-49" kpx2="7681"/><pair kern="-60" kpx2="7680"/><pair kern="-20" kpx2="210"/><pair kern="-20" kpx2="211"/><pair kern="-29" kpx2="7743"/><pair kern="-49" kpx2="509"/><pair kern="-20" kpx2="510"/><pair kern="-49" kpx2="511"/><pair kern="-49" kpx2="235"/><pair kern="-49" kpx2="234"/><pair kern="-60" kpx2="506"/><pair kern="-49" kpx2="233"/><pair kern="-49" kpx2="507"/><pair kern="-49" kpx2="232"/><pair kern="-49" kpx2="231"/><pair kern="-49" kpx2="230"/><pair kern="-49" kpx2="229"/><pair kern="-49" kpx2="228"/><pair kern="-49" kpx2="227"/><pair kern="-49" kpx2="226"/><pair kern="-49" kpx2="225"/><pair kern="-49" kpx2="224"/><pair kern="-29" kpx2="252"/><pair kern="-29" kpx2="250"/><pair kern="-29" kpx2="251"/><pair kern="-49" kpx2="248"/><pair kern="-29" kpx2="249"/><pair kern="-49" kpx2="246"/><pair kern="-49" kpx2="244"/><pair kern="-49" kpx2="245"/><pair kern="-49" kpx2="242"/><pair kern="-49" kpx2="243"/></kerning><kerning kpx1="7929"><pair kern="40" kpx2="34"/><pair kern="40" kpx2="39"/><pair kern="-40" kpx2="8218"/><pair kern="40" kpx2="8217"/><pair kern="20" kpx2="63"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="8222"/><pair kern="40" kpx2="8221"/><pair kern="-40" kpx2="44"/></kerning><kerning kpx1="7928"><pair kern="-49" kpx2="7889"/><pair kern="-49" kpx2="275"/><pair kern="-20" kpx2="7888"/><pair kern="-49" kpx2="273"/><pair kern="-20" kpx2="7890"/><pair kern="-49" kpx2="7893"/><pair kern="-49" kpx2="279"/><pair kern="-20" kpx2="7892"/><pair kern="-49" kpx2="7895"/><pair kern="-49" kpx2="277"/><pair kern="-20" kpx2="7894"/><pair kern="-49" kpx2="7897"/><pair kern="-49" kpx2="283"/><pair kern="-20" kpx2="7896"/><pair kern="-49" kpx2="7899"/><pair kern="-49" kpx2="281"/><pair kern="-20" kpx2="7898"/><pair kern="-49" kpx2="7901"/><pair kern="-20" kpx2="287"/><pair kern="-20" kpx2="7900"/><pair kern="-20" kpx2="286"/><pair kern="-49" kpx2="7903"/><pair kern="-20" kpx2="285"/><pair kern="-20" kpx2="7902"/><pair kern="-20" kpx2="284"/><pair kern="-60" kpx2="258"/><pair kern="-49" kpx2="259"/><pair kern="-60" kpx2="256"/><pair kern="-49" kpx2="7875"/><pair kern="-49" kpx2="257"/><pair kern="-20" kpx2="262"/><pair kern="-49" kpx2="7877"/><pair kern="-49" kpx2="263"/><pair kern="-60" kpx2="260"/><pair kern="-49" kpx2="7879"/><pair kern="-49" kpx2="261"/><pair kern="-20" kpx2="266"/><pair kern="-49" kpx2="267"/><pair kern="-20" kpx2="264"/><pair kern="-49" kpx2="265"/><pair kern="-20" kpx2="7884"/><pair kern="-49" kpx2="7885"/><pair kern="-49" kpx2="271"/><pair kern="-20" kpx2="7886"/><pair kern="-20" kpx2="268"/><pair kern="-49" kpx2="7887"/><pair kern="-49" kpx2="269"/><pair kern="-29" kpx2="7921"/><pair kern="-29" kpx2="312"/><pair kern="-60" kpx2="46"/><pair kern="-60" kpx2="44"/><pair kern="-20" kpx2="7906"/><pair kern="-20" kpx2="288"/><pair kern="-49" kpx2="7907"/><pair kern="-20" kpx2="289"/><pair kern="-20" kpx2="7904"/><pair kern="-20" kpx2="290"/><pair kern="-49" kpx2="7905"/><pair kern="-20" kpx2="291"/><pair kern="-29" kpx2="7911"/><pair kern="-29" kpx2="7909"/><pair kern="-29" kpx2="7915"/><pair kern="-29" kpx2="7913"/><pair kern="-40" kpx2="537"/><pair kern="20" kpx2="63"/><pair kern="-29" kpx2="7919"/><pair kern="-29" kpx2="7917"/><pair kern="-29" kpx2="343"/><pair kern="-29" kpx2="341"/><pair kern="-20" kpx2="71"/><pair kern="-49" kpx2="339"/><pair kern="-20" kpx2="338"/><pair kern="-60" kpx2="65"/><pair kern="-49" kpx2="337"/><pair kern="-20" kpx2="67"/><pair kern="-20" kpx2="336"/><pair kern="-40" kpx2="351"/><pair kern="-20" kpx2="79"/><pair kern="-40" kpx2="347"/><pair kern="-29" kpx2="326"/><pair kern="-29" kpx2="324"/><pair kern="-20" kpx2="81"/><pair kern="-20" kpx2="334"/><pair kern="-60" kpx2="8218"/><pair kern="-49" kpx2="335"/><pair kern="-20" kpx2="332"/><pair kern="-49" kpx2="333"/><pair kern="-60" kpx2="8222"/><pair kern="-29" kpx2="331"/><pair kern="-49" kpx2="7863"/><pair kern="-60" kpx2="7862"/><pair kern="-20" kpx2="103"/><pair kern="-49" kpx2="7861"/><pair kern="-49" kpx2="100"/><pair kern="-60" kpx2="7860"/><pair kern="-49" kpx2="101"/><pair kern="-49" kpx2="7859"/><pair kern="-29" kpx2="369"/><pair kern="-60" kpx2="7858"/><pair kern="-49" kpx2="99"/><pair kern="-49" kpx2="7857"/><pair kern="-29" kpx2="371"/><pair kern="-60" kpx2="7856"/><pair kern="-49" kpx2="97"/><pair kern="-49" kpx2="7871"/><pair kern="-29" kpx2="110"/><pair kern="-20" kpx2="380"/><pair kern="-49" kpx2="111"/><pair kern="-49" kpx2="7869"/><pair kern="-20" kpx2="382"/><pair kern="-29" kpx2="109"/><pair kern="-49" kpx2="7867"/><pair kern="-49" kpx2="7865"/><pair kern="-20" kpx2="378"/><pair kern="-60" kpx2="7846"/><pair kern="-60" kpx2="7844"/><pair kern="-29" kpx2="117"/><pair kern="-49" kpx2="7845"/><pair kern="-60" kpx2="7842"/><pair kern="-40" kpx2="115"/><pair kern="-49" kpx2="7843"/><pair kern="-29" kpx2="114"/><pair kern="-60" kpx2="7840"/><pair kern="-49" kpx2="113"/><pair kern="-49" kpx2="7841"/><pair kern="-29" kpx2="112"/><pair kern="-60" kpx2="7854"/><pair kern="-49" kpx2="7855"/><pair kern="-29" kpx2="365"/><pair kern="-60" kpx2="7852"/><pair kern="-49" kpx2="7853"/><pair kern="-29" kpx2="367"/><pair kern="-60" kpx2="7850"/><pair kern="-49" kpx2="7851"/><pair kern="-29" kpx2="361"/><pair kern="-20" kpx2="122"/><pair kern="-60" kpx2="7848"/><pair kern="-49" kpx2="7849"/><pair kern="-29" kpx2="363"/><pair kern="-29" kpx2="432"/><pair kern="-49" kpx2="417"/><pair kern="-20" kpx2="416"/><pair kern="-60" kpx2="197"/><pair kern="-60" kpx2="196"/><pair kern="-20" kpx2="199"/><pair kern="-60" kpx2="193"/><pair kern="-60" kpx2="192"/><pair kern="-60" kpx2="195"/><pair kern="-60" kpx2="194"/><pair kern="-20" kpx2="216"/><pair kern="-20" kpx2="212"/><pair kern="-20" kpx2="213"/><pair kern="-20" kpx2="214"/><pair kern="-49" kpx2="7681"/><pair kern="-60" kpx2="7680"/><pair kern="-20" kpx2="210"/><pair kern="-20" kpx2="211"/><pair kern="-29" kpx2="7743"/><pair kern="-49" kpx2="509"/><pair kern="-20" kpx2="510"/><pair kern="-49" kpx2="511"/><pair kern="-49" kpx2="235"/><pair kern="-49" kpx2="234"/><pair kern="-60" kpx2="506"/><pair kern="-49" kpx2="233"/><pair kern="-49" kpx2="507"/><pair kern="-49" kpx2="232"/><pair kern="-49" kpx2="231"/><pair kern="-49" kpx2="230"/><pair kern="-49" kpx2="229"/><pair kern="-49" kpx2="228"/><pair kern="-49" kpx2="227"/><pair kern="-49" kpx2="226"/><pair kern="-49" kpx2="225"/><pair kern="-49" kpx2="224"/><pair kern="-29" kpx2="252"/><pair kern="-29" kpx2="250"/><pair kern="-29" kpx2="251"/><pair kern="-49" kpx2="248"/><pair kern="-29" kpx2="249"/><pair kern="-49" kpx2="246"/><pair kern="-49" kpx2="244"/><pair kern="-49" kpx2="245"/><pair kern="-49" kpx2="242"/><pair kern="-49" kpx2="243"/></kerning><kerning kpx1="7907"><pair kern="40" kpx2="102"/><pair kern="49" kpx2="373"/><pair kern="49" kpx2="7925"/><pair kern="40" kpx2="64257"/><pair kern="40" kpx2="64256"/><pair kern="40" kpx2="64259"/><pair kern="40" kpx2="64258"/><pair kern="40" kpx2="64260"/><pair kern="49" kpx2="119"/><pair kern="49" kpx2="118"/><pair kern="40" kpx2="357"/><pair kern="40" kpx2="116"/><pair kern="49" kpx2="253"/><pair kern="49" kpx2="7809"/><pair kern="40" kpx2="355"/><pair kern="49" kpx2="7811"/><pair kern="49" kpx2="121"/><pair kern="40" kpx2="539"/><pair kern="49" kpx2="120"/></kerning><kerning kpx1="7905"><pair kern="40" kpx2="102"/><pair kern="49" kpx2="373"/><pair kern="49" kpx2="7925"/><pair kern="40" kpx2="64257"/><pair kern="40" kpx2="64256"/><pair kern="40" kpx2="64259"/><pair kern="40" kpx2="64258"/><pair kern="40" kpx2="64260"/><pair kern="49" kpx2="119"/><pair kern="49" kpx2="118"/><pair kern="40" kpx2="357"/><pair kern="40" kpx2="116"/><pair kern="49" kpx2="253"/><pair kern="49" kpx2="7809"/><pair kern="40" kpx2="355"/><pair kern="49" kpx2="7811"/><pair kern="49" kpx2="121"/><pair kern="40" kpx2="539"/><pair kern="49" kpx2="120"/></kerning><kerning kpx1="7908"><pair kern="-9" kpx2="65"/><pair kern="-9" kpx2="197"/><pair kern="-9" kpx2="196"/><pair kern="-9" kpx2="193"/><pair kern="-9" kpx2="192"/><pair kern="-9" kpx2="195"/><pair kern="-9" kpx2="194"/><pair kern="-9" kpx2="258"/><pair kern="-9" kpx2="256"/><pair kern="-9" kpx2="260"/><pair kern="-20" kpx2="8218"/><pair kern="-20" kpx2="8222"/><pair kern="-9" kpx2="7680"/><pair kern="-9" kpx2="7862"/><pair kern="-9" kpx2="7860"/><pair kern="-9" kpx2="7858"/><pair kern="-9" kpx2="506"/><pair kern="-9" kpx2="7856"/><pair kern="-20" kpx2="46"/><pair kern="-20" kpx2="44"/><pair kern="-9" kpx2="7846"/><pair kern="-9" kpx2="7844"/><pair kern="-9" kpx2="7842"/><pair kern="-9" kpx2="7840"/><pair kern="-9" kpx2="7854"/><pair kern="-9" kpx2="7852"/><pair kern="-9" kpx2="7850"/><pair kern="-9" kpx2="7848"/></kerning><kerning kpx1="7915"><pair kern="49" kpx2="102"/><pair kern="49" kpx2="373"/><pair kern="49" kpx2="7925"/><pair kern="49" kpx2="64257"/><pair kern="49" kpx2="64256"/><pair kern="49" kpx2="64259"/><pair kern="49" kpx2="64258"/><pair kern="49" kpx2="64260"/><pair kern="49" kpx2="119"/><pair kern="49" kpx2="118"/><pair kern="49" kpx2="357"/><pair kern="49" kpx2="116"/><pair kern="49" kpx2="253"/><pair kern="49" kpx2="7809"/><pair kern="49" kpx2="355"/><pair kern="49" kpx2="7811"/><pair kern="49" kpx2="121"/><pair kern="49" kpx2="539"/><pair kern="49" kpx2="120"/></kerning><kerning kpx1="7913"><pair kern="49" kpx2="102"/><pair kern="49" kpx2="373"/><pair kern="49" kpx2="7925"/><pair kern="49" kpx2="64257"/><pair kern="49" kpx2="64256"/><pair kern="49" kpx2="64259"/><pair kern="49" kpx2="64258"/><pair kern="49" kpx2="64260"/><pair kern="49" kpx2="119"/><pair kern="49" kpx2="118"/><pair kern="49" kpx2="357"/><pair kern="49" kpx2="116"/><pair kern="49" kpx2="253"/><pair kern="49" kpx2="7809"/><pair kern="49" kpx2="355"/><pair kern="49" kpx2="7811"/><pair kern="49" kpx2="121"/><pair kern="49" kpx2="539"/><pair kern="49" kpx2="120"/></kerning><kerning kpx1="7919"><pair kern="49" kpx2="102"/><pair kern="49" kpx2="373"/><pair kern="49" kpx2="7925"/><pair kern="49" kpx2="64257"/><pair kern="49" kpx2="64256"/><pair kern="49" kpx2="64259"/><pair kern="49" kpx2="64258"/><pair kern="49" kpx2="64260"/><pair kern="49" kpx2="119"/><pair kern="49" kpx2="118"/><pair kern="49" kpx2="357"/><pair kern="49" kpx2="116"/><pair kern="49" kpx2="253"/><pair kern="49" kpx2="7809"/><pair kern="49" kpx2="355"/><pair kern="49" kpx2="7811"/><pair kern="49" kpx2="121"/><pair kern="49" kpx2="539"/><pair kern="49" kpx2="120"/></kerning><kerning kpx1="7917"><pair kern="49" kpx2="102"/><pair kern="49" kpx2="373"/><pair kern="49" kpx2="7925"/><pair kern="49" kpx2="64257"/><pair kern="49" kpx2="64256"/><pair kern="49" kpx2="64259"/><pair kern="49" kpx2="64258"/><pair kern="49" kpx2="64260"/><pair kern="49" kpx2="119"/><pair kern="49" kpx2="118"/><pair kern="49" kpx2="357"/><pair kern="49" kpx2="116"/><pair kern="49" kpx2="253"/><pair kern="49" kpx2="7809"/><pair kern="49" kpx2="355"/><pair kern="49" kpx2="7811"/><pair kern="49" kpx2="121"/><pair kern="49" kpx2="539"/><pair kern="49" kpx2="120"/></kerning><kerning kpx1="7812"><pair kern="-20" kpx2="7889"/><pair kern="-20" kpx2="275"/><pair kern="-9" kpx2="7888"/><pair kern="-20" kpx2="273"/><pair kern="-9" kpx2="7890"/><pair kern="-20" kpx2="7893"/><pair kern="-20" kpx2="279"/><pair kern="-9" kpx2="7892"/><pair kern="-20" kpx2="7895"/><pair kern="-20" kpx2="277"/><pair kern="-9" kpx2="7894"/><pair kern="-20" kpx2="7897"/><pair kern="-20" kpx2="283"/><pair kern="-9" kpx2="7896"/><pair kern="-20" kpx2="7899"/><pair kern="-20" kpx2="281"/><pair kern="-9" kpx2="7898"/><pair kern="-20" kpx2="7901"/><pair kern="-9" kpx2="287"/><pair kern="-9" kpx2="7900"/><pair kern="-9" kpx2="286"/><pair kern="-20" kpx2="7903"/><pair kern="-9" kpx2="285"/><pair kern="-9" kpx2="7902"/><pair kern="-9" kpx2="284"/><pair kern="-40" kpx2="258"/><pair kern="-20" kpx2="259"/><pair kern="-40" kpx2="256"/><pair kern="-20" kpx2="7875"/><pair kern="-20" kpx2="257"/><pair kern="-9" kpx2="262"/><pair kern="-20" kpx2="7877"/><pair kern="-20" kpx2="263"/><pair kern="-40" kpx2="260"/><pair kern="-20" kpx2="7879"/><pair kern="-20" kpx2="261"/><pair kern="-9" kpx2="266"/><pair kern="-20" kpx2="267"/><pair kern="-9" kpx2="264"/><pair kern="-20" kpx2="265"/><pair kern="-9" kpx2="7884"/><pair kern="-20" kpx2="7885"/><pair kern="-20" kpx2="271"/><pair kern="-9" kpx2="7886"/><pair kern="-9" kpx2="268"/><pair kern="-20" kpx2="7887"/><pair kern="-20" kpx2="269"/><pair kern="-9" kpx2="7921"/><pair kern="-9" kpx2="312"/><pair kern="-49" kpx2="46"/><pair kern="-49" kpx2="44"/><pair kern="-9" kpx2="7906"/><pair kern="-9" kpx2="288"/><pair kern="-20" kpx2="7907"/><pair kern="-9" kpx2="289"/><pair kern="-9" kpx2="7904"/><pair kern="-9" kpx2="290"/><pair kern="-20" kpx2="7905"/><pair kern="-9" kpx2="291"/><pair kern="-9" kpx2="7911"/><pair kern="-9" kpx2="7909"/><pair kern="-9" kpx2="7915"/><pair kern="-9" kpx2="7913"/><pair kern="-9" kpx2="537"/><pair kern="20" kpx2="63"/><pair kern="-9" kpx2="7919"/><pair kern="-9" kpx2="7917"/><pair kern="-9" kpx2="343"/><pair kern="-9" kpx2="341"/><pair kern="-9" kpx2="71"/><pair kern="-20" kpx2="339"/><pair kern="-40" kpx2="65"/><pair kern="-9" kpx2="338"/><pair kern="-20" kpx2="337"/><pair kern="-9" kpx2="67"/><pair kern="-9" kpx2="336"/><pair kern="-9" kpx2="351"/><pair kern="-9" kpx2="79"/><pair kern="-9" kpx2="347"/><pair kern="-9" kpx2="326"/><pair kern="-9" kpx2="324"/><pair kern="-9" kpx2="81"/><pair kern="-9" kpx2="334"/><pair kern="-49" kpx2="8218"/><pair kern="-20" kpx2="335"/><pair kern="-9" kpx2="332"/><pair kern="-20" kpx2="333"/><pair kern="-49" kpx2="8222"/><pair kern="-9" kpx2="331"/><pair kern="-20" kpx2="7863"/><pair kern="-40" kpx2="7862"/><pair kern="-9" kpx2="103"/><pair kern="-20" kpx2="7861"/><pair kern="-20" kpx2="100"/><pair kern="-40" kpx2="7860"/><pair kern="-20" kpx2="101"/><pair kern="-20" kpx2="7859"/><pair kern="-9" kpx2="369"/><pair kern="-40" kpx2="7858"/><pair kern="-20" kpx2="99"/><pair kern="-20" kpx2="7857"/><pair kern="-9" kpx2="371"/><pair kern="-40" kpx2="7856"/><pair kern="-20" kpx2="97"/><pair kern="-20" kpx2="7871"/><pair kern="-9" kpx2="110"/><pair kern="-20" kpx2="111"/><pair kern="-20" kpx2="7869"/><pair kern="-9" kpx2="109"/><pair kern="-20" kpx2="7867"/><pair kern="-20" kpx2="7865"/><pair kern="-40" kpx2="7846"/><pair kern="-40" kpx2="7844"/><pair kern="-9" kpx2="117"/><pair kern="-20" kpx2="7845"/><pair kern="-40" kpx2="7842"/><pair kern="-9" kpx2="115"/><pair kern="-20" kpx2="7843"/><pair kern="-9" kpx2="114"/><pair kern="-40" kpx2="7840"/><pair kern="-20" kpx2="113"/><pair kern="-20" kpx2="7841"/><pair kern="-9" kpx2="112"/><pair kern="-40" kpx2="7854"/><pair kern="-20" kpx2="7855"/><pair kern="-9" kpx2="365"/><pair kern="-40" kpx2="7852"/><pair kern="-20" kpx2="7853"/><pair kern="-9" kpx2="367"/><pair kern="-40" kpx2="7850"/><pair kern="-20" kpx2="7851"/><pair kern="-9" kpx2="361"/><pair kern="-40" kpx2="7848"/><pair kern="-20" kpx2="7849"/><pair kern="-9" kpx2="363"/><pair kern="-9" kpx2="432"/><pair kern="-20" kpx2="417"/><pair kern="-9" kpx2="416"/><pair kern="-40" kpx2="197"/><pair kern="-40" kpx2="196"/><pair kern="-9" kpx2="199"/><pair kern="-40" kpx2="193"/><pair kern="-40" kpx2="192"/><pair kern="-40" kpx2="195"/><pair kern="-40" kpx2="194"/><pair kern="-9" kpx2="216"/><pair kern="-9" kpx2="212"/><pair kern="-9" kpx2="213"/><pair kern="-9" kpx2="214"/><pair kern="-20" kpx2="7681"/><pair kern="-40" kpx2="7680"/><pair kern="-9" kpx2="210"/><pair kern="-9" kpx2="211"/><pair kern="-9" kpx2="7743"/><pair kern="-20" kpx2="509"/><pair kern="-9" kpx2="510"/><pair kern="-20" kpx2="511"/><pair kern="-20" kpx2="235"/><pair kern="-20" kpx2="234"/><pair kern="-40" kpx2="506"/><pair kern="-20" kpx2="233"/><pair kern="-20" kpx2="507"/><pair kern="-20" kpx2="232"/><pair kern="-20" kpx2="231"/><pair kern="-20" kpx2="230"/><pair kern="-20" kpx2="229"/><pair kern="-20" kpx2="228"/><pair kern="-20" kpx2="227"/><pair kern="-20" kpx2="226"/><pair kern="-20" kpx2="225"/><pair kern="-20" kpx2="224"/><pair kern="-9" kpx2="252"/><pair kern="-9" kpx2="250"/><pair kern="-9" kpx2="251"/><pair kern="-20" kpx2="248"/><pair kern="-9" kpx2="249"/><pair kern="-20" kpx2="246"/><pair kern="-20" kpx2="244"/><pair kern="-20" kpx2="245"/><pair kern="-20" kpx2="242"/><pair kern="-20" kpx2="243"/></kerning><kerning kpx1="7813"><pair kern="40" kpx2="34"/><pair kern="40" kpx2="39"/><pair kern="-40" kpx2="8218"/><pair kern="40" kpx2="8217"/><pair kern="20" kpx2="63"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="8222"/><pair kern="40" kpx2="8221"/><pair kern="-40" kpx2="44"/></kerning><kerning kpx1="7808"><pair kern="-20" kpx2="7889"/><pair kern="-20" kpx2="275"/><pair kern="-9" kpx2="7888"/><pair kern="-20" kpx2="273"/><pair kern="-9" kpx2="7890"/><pair kern="-20" kpx2="7893"/><pair kern="-20" kpx2="279"/><pair kern="-9" kpx2="7892"/><pair kern="-20" kpx2="7895"/><pair kern="-20" kpx2="277"/><pair kern="-9" kpx2="7894"/><pair kern="-20" kpx2="7897"/><pair kern="-20" kpx2="283"/><pair kern="-9" kpx2="7896"/><pair kern="-20" kpx2="7899"/><pair kern="-20" kpx2="281"/><pair kern="-9" kpx2="7898"/><pair kern="-20" kpx2="7901"/><pair kern="-9" kpx2="287"/><pair kern="-9" kpx2="7900"/><pair kern="-9" kpx2="286"/><pair kern="-20" kpx2="7903"/><pair kern="-9" kpx2="285"/><pair kern="-9" kpx2="7902"/><pair kern="-9" kpx2="284"/><pair kern="-40" kpx2="258"/><pair kern="-20" kpx2="259"/><pair kern="-40" kpx2="256"/><pair kern="-20" kpx2="7875"/><pair kern="-20" kpx2="257"/><pair kern="-9" kpx2="262"/><pair kern="-20" kpx2="7877"/><pair kern="-20" kpx2="263"/><pair kern="-40" kpx2="260"/><pair kern="-20" kpx2="7879"/><pair kern="-20" kpx2="261"/><pair kern="-9" kpx2="266"/><pair kern="-20" kpx2="267"/><pair kern="-9" kpx2="264"/><pair kern="-20" kpx2="265"/><pair kern="-9" kpx2="7884"/><pair kern="-20" kpx2="7885"/><pair kern="-20" kpx2="271"/><pair kern="-9" kpx2="7886"/><pair kern="-9" kpx2="268"/><pair kern="-20" kpx2="7887"/><pair kern="-20" kpx2="269"/><pair kern="-9" kpx2="7921"/><pair kern="-9" kpx2="312"/><pair kern="-49" kpx2="46"/><pair kern="-49" kpx2="44"/><pair kern="-9" kpx2="7906"/><pair kern="-9" kpx2="288"/><pair kern="-20" kpx2="7907"/><pair kern="-9" kpx2="289"/><pair kern="-9" kpx2="7904"/><pair kern="-9" kpx2="290"/><pair kern="-20" kpx2="7905"/><pair kern="-9" kpx2="291"/><pair kern="-9" kpx2="7911"/><pair kern="-9" kpx2="7909"/><pair kern="-9" kpx2="7915"/><pair kern="-9" kpx2="7913"/><pair kern="-9" kpx2="537"/><pair kern="20" kpx2="63"/><pair kern="-9" kpx2="7919"/><pair kern="-9" kpx2="7917"/><pair kern="-9" kpx2="343"/><pair kern="-9" kpx2="341"/><pair kern="-9" kpx2="71"/><pair kern="-20" kpx2="339"/><pair kern="-40" kpx2="65"/><pair kern="-9" kpx2="338"/><pair kern="-20" kpx2="337"/><pair kern="-9" kpx2="67"/><pair kern="-9" kpx2="336"/><pair kern="-9" kpx2="351"/><pair kern="-9" kpx2="79"/><pair kern="-9" kpx2="347"/><pair kern="-9" kpx2="326"/><pair kern="-9" kpx2="324"/><pair kern="-9" kpx2="81"/><pair kern="-9" kpx2="334"/><pair kern="-49" kpx2="8218"/><pair kern="-20" kpx2="335"/><pair kern="-9" kpx2="332"/><pair kern="-20" kpx2="333"/><pair kern="-49" kpx2="8222"/><pair kern="-9" kpx2="331"/><pair kern="-20" kpx2="7863"/><pair kern="-40" kpx2="7862"/><pair kern="-9" kpx2="103"/><pair kern="-20" kpx2="7861"/><pair kern="-20" kpx2="100"/><pair kern="-40" kpx2="7860"/><pair kern="-20" kpx2="101"/><pair kern="-20" kpx2="7859"/><pair kern="-9" kpx2="369"/><pair kern="-40" kpx2="7858"/><pair kern="-20" kpx2="99"/><pair kern="-20" kpx2="7857"/><pair kern="-9" kpx2="371"/><pair kern="-40" kpx2="7856"/><pair kern="-20" kpx2="97"/><pair kern="-20" kpx2="7871"/><pair kern="-9" kpx2="110"/><pair kern="-20" kpx2="111"/><pair kern="-20" kpx2="7869"/><pair kern="-9" kpx2="109"/><pair kern="-20" kpx2="7867"/><pair kern="-20" kpx2="7865"/><pair kern="-40" kpx2="7846"/><pair kern="-40" kpx2="7844"/><pair kern="-9" kpx2="117"/><pair kern="-20" kpx2="7845"/><pair kern="-40" kpx2="7842"/><pair kern="-9" kpx2="115"/><pair kern="-20" kpx2="7843"/><pair kern="-9" kpx2="114"/><pair kern="-40" kpx2="7840"/><pair kern="-20" kpx2="113"/><pair kern="-20" kpx2="7841"/><pair kern="-9" kpx2="112"/><pair kern="-40" kpx2="7854"/><pair kern="-20" kpx2="7855"/><pair kern="-9" kpx2="365"/><pair kern="-40" kpx2="7852"/><pair kern="-20" kpx2="7853"/><pair kern="-9" kpx2="367"/><pair kern="-40" kpx2="7850"/><pair kern="-20" kpx2="7851"/><pair kern="-9" kpx2="361"/><pair kern="-40" kpx2="7848"/><pair kern="-20" kpx2="7849"/><pair kern="-9" kpx2="363"/><pair kern="-9" kpx2="432"/><pair kern="-20" kpx2="417"/><pair kern="-9" kpx2="416"/><pair kern="-40" kpx2="197"/><pair kern="-40" kpx2="196"/><pair kern="-9" kpx2="199"/><pair kern="-40" kpx2="193"/><pair kern="-40" kpx2="192"/><pair kern="-40" kpx2="195"/><pair kern="-40" kpx2="194"/><pair kern="-9" kpx2="216"/><pair kern="-9" kpx2="212"/><pair kern="-9" kpx2="213"/><pair kern="-9" kpx2="214"/><pair kern="-20" kpx2="7681"/><pair kern="-40" kpx2="7680"/><pair kern="-9" kpx2="210"/><pair kern="-9" kpx2="211"/><pair kern="-9" kpx2="7743"/><pair kern="-20" kpx2="509"/><pair kern="-9" kpx2="510"/><pair kern="-20" kpx2="511"/><pair kern="-20" kpx2="235"/><pair kern="-20" kpx2="234"/><pair kern="-40" kpx2="506"/><pair kern="-20" kpx2="233"/><pair kern="-20" kpx2="507"/><pair kern="-20" kpx2="232"/><pair kern="-20" kpx2="231"/><pair kern="-20" kpx2="230"/><pair kern="-20" kpx2="229"/><pair kern="-20" kpx2="228"/><pair kern="-20" kpx2="227"/><pair kern="-20" kpx2="226"/><pair kern="-20" kpx2="225"/><pair kern="-20" kpx2="224"/><pair kern="-9" kpx2="252"/><pair kern="-9" kpx2="250"/><pair kern="-9" kpx2="251"/><pair kern="-20" kpx2="248"/><pair kern="-9" kpx2="249"/><pair kern="-20" kpx2="246"/><pair kern="-20" kpx2="244"/><pair kern="-20" kpx2="245"/><pair kern="-20" kpx2="242"/><pair kern="-20" kpx2="243"/></kerning><kerning kpx1="7809"><pair kern="40" kpx2="34"/><pair kern="40" kpx2="39"/><pair kern="-40" kpx2="8218"/><pair kern="40" kpx2="8217"/><pair kern="20" kpx2="63"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="8222"/><pair kern="40" kpx2="8221"/><pair kern="-40" kpx2="44"/></kerning><kerning kpx1="7810"><pair kern="-20" kpx2="7889"/><pair kern="-20" kpx2="275"/><pair kern="-9" kpx2="7888"/><pair kern="-20" kpx2="273"/><pair kern="-9" kpx2="7890"/><pair kern="-20" kpx2="7893"/><pair kern="-20" kpx2="279"/><pair kern="-9" kpx2="7892"/><pair kern="-20" kpx2="7895"/><pair kern="-20" kpx2="277"/><pair kern="-9" kpx2="7894"/><pair kern="-20" kpx2="7897"/><pair kern="-20" kpx2="283"/><pair kern="-9" kpx2="7896"/><pair kern="-20" kpx2="7899"/><pair kern="-20" kpx2="281"/><pair kern="-9" kpx2="7898"/><pair kern="-20" kpx2="7901"/><pair kern="-9" kpx2="287"/><pair kern="-9" kpx2="7900"/><pair kern="-9" kpx2="286"/><pair kern="-20" kpx2="7903"/><pair kern="-9" kpx2="285"/><pair kern="-9" kpx2="7902"/><pair kern="-9" kpx2="284"/><pair kern="-40" kpx2="258"/><pair kern="-20" kpx2="259"/><pair kern="-40" kpx2="256"/><pair kern="-20" kpx2="7875"/><pair kern="-20" kpx2="257"/><pair kern="-9" kpx2="262"/><pair kern="-20" kpx2="7877"/><pair kern="-20" kpx2="263"/><pair kern="-40" kpx2="260"/><pair kern="-20" kpx2="7879"/><pair kern="-20" kpx2="261"/><pair kern="-9" kpx2="266"/><pair kern="-20" kpx2="267"/><pair kern="-9" kpx2="264"/><pair kern="-20" kpx2="265"/><pair kern="-9" kpx2="7884"/><pair kern="-20" kpx2="7885"/><pair kern="-20" kpx2="271"/><pair kern="-9" kpx2="7886"/><pair kern="-9" kpx2="268"/><pair kern="-20" kpx2="7887"/><pair kern="-20" kpx2="269"/><pair kern="-9" kpx2="7921"/><pair kern="-9" kpx2="312"/><pair kern="-49" kpx2="46"/><pair kern="-49" kpx2="44"/><pair kern="-9" kpx2="7906"/><pair kern="-9" kpx2="288"/><pair kern="-20" kpx2="7907"/><pair kern="-9" kpx2="289"/><pair kern="-9" kpx2="7904"/><pair kern="-9" kpx2="290"/><pair kern="-20" kpx2="7905"/><pair kern="-9" kpx2="291"/><pair kern="-9" kpx2="7911"/><pair kern="-9" kpx2="7909"/><pair kern="-9" kpx2="7915"/><pair kern="-9" kpx2="7913"/><pair kern="-9" kpx2="537"/><pair kern="20" kpx2="63"/><pair kern="-9" kpx2="7919"/><pair kern="-9" kpx2="7917"/><pair kern="-9" kpx2="343"/><pair kern="-9" kpx2="341"/><pair kern="-9" kpx2="71"/><pair kern="-20" kpx2="339"/><pair kern="-40" kpx2="65"/><pair kern="-9" kpx2="338"/><pair kern="-20" kpx2="337"/><pair kern="-9" kpx2="67"/><pair kern="-9" kpx2="336"/><pair kern="-9" kpx2="351"/><pair kern="-9" kpx2="79"/><pair kern="-9" kpx2="347"/><pair kern="-9" kpx2="326"/><pair kern="-9" kpx2="324"/><pair kern="-9" kpx2="81"/><pair kern="-9" kpx2="334"/><pair kern="-49" kpx2="8218"/><pair kern="-20" kpx2="335"/><pair kern="-9" kpx2="332"/><pair kern="-20" kpx2="333"/><pair kern="-49" kpx2="8222"/><pair kern="-9" kpx2="331"/><pair kern="-20" kpx2="7863"/><pair kern="-40" kpx2="7862"/><pair kern="-9" kpx2="103"/><pair kern="-20" kpx2="7861"/><pair kern="-20" kpx2="100"/><pair kern="-40" kpx2="7860"/><pair kern="-20" kpx2="101"/><pair kern="-20" kpx2="7859"/><pair kern="-9" kpx2="369"/><pair kern="-40" kpx2="7858"/><pair kern="-20" kpx2="99"/><pair kern="-20" kpx2="7857"/><pair kern="-9" kpx2="371"/><pair kern="-40" kpx2="7856"/><pair kern="-20" kpx2="97"/><pair kern="-20" kpx2="7871"/><pair kern="-9" kpx2="110"/><pair kern="-20" kpx2="111"/><pair kern="-20" kpx2="7869"/><pair kern="-9" kpx2="109"/><pair kern="-20" kpx2="7867"/><pair kern="-20" kpx2="7865"/><pair kern="-40" kpx2="7846"/><pair kern="-40" kpx2="7844"/><pair kern="-9" kpx2="117"/><pair kern="-20" kpx2="7845"/><pair kern="-40" kpx2="7842"/><pair kern="-9" kpx2="115"/><pair kern="-20" kpx2="7843"/><pair kern="-9" kpx2="114"/><pair kern="-40" kpx2="7840"/><pair kern="-20" kpx2="113"/><pair kern="-20" kpx2="7841"/><pair kern="-9" kpx2="112"/><pair kern="-40" kpx2="7854"/><pair kern="-20" kpx2="7855"/><pair kern="-9" kpx2="365"/><pair kern="-40" kpx2="7852"/><pair kern="-20" kpx2="7853"/><pair kern="-9" kpx2="367"/><pair kern="-40" kpx2="7850"/><pair kern="-20" kpx2="7851"/><pair kern="-9" kpx2="361"/><pair kern="-40" kpx2="7848"/><pair kern="-20" kpx2="7849"/><pair kern="-9" kpx2="363"/><pair kern="-9" kpx2="432"/><pair kern="-20" kpx2="417"/><pair kern="-9" kpx2="416"/><pair kern="-40" kpx2="197"/><pair kern="-40" kpx2="196"/><pair kern="-9" kpx2="199"/><pair kern="-40" kpx2="193"/><pair kern="-40" kpx2="192"/><pair kern="-40" kpx2="195"/><pair kern="-40" kpx2="194"/><pair kern="-9" kpx2="216"/><pair kern="-9" kpx2="212"/><pair kern="-9" kpx2="213"/><pair kern="-9" kpx2="214"/><pair kern="-20" kpx2="7681"/><pair kern="-40" kpx2="7680"/><pair kern="-9" kpx2="210"/><pair kern="-9" kpx2="211"/><pair kern="-9" kpx2="7743"/><pair kern="-20" kpx2="509"/><pair kern="-9" kpx2="510"/><pair kern="-20" kpx2="511"/><pair kern="-20" kpx2="235"/><pair kern="-20" kpx2="234"/><pair kern="-40" kpx2="506"/><pair kern="-20" kpx2="233"/><pair kern="-20" kpx2="507"/><pair kern="-20" kpx2="232"/><pair kern="-20" kpx2="231"/><pair kern="-20" kpx2="230"/><pair kern="-20" kpx2="229"/><pair kern="-20" kpx2="228"/><pair kern="-20" kpx2="227"/><pair kern="-20" kpx2="226"/><pair kern="-20" kpx2="225"/><pair kern="-20" kpx2="224"/><pair kern="-9" kpx2="252"/><pair kern="-9" kpx2="250"/><pair kern="-9" kpx2="251"/><pair kern="-20" kpx2="248"/><pair kern="-9" kpx2="249"/><pair kern="-20" kpx2="246"/><pair kern="-20" kpx2="244"/><pair kern="-20" kpx2="245"/><pair kern="-20" kpx2="242"/><pair kern="-20" kpx2="243"/></kerning><kerning kpx1="7811"><pair kern="40" kpx2="34"/><pair kern="40" kpx2="39"/><pair kern="-40" kpx2="8218"/><pair kern="40" kpx2="8217"/><pair kern="20" kpx2="63"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="8222"/><pair kern="40" kpx2="8221"/><pair kern="-40" kpx2="44"/></kerning><kerning kpx1="7863"><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="8221"/></kerning><kerning kpx1="7862"><pair kern="-20" kpx2="7888"/><pair kern="-20" kpx2="7890"/><pair kern="-20" kpx2="7892"/><pair kern="-20" kpx2="7894"/><pair kern="-20" kpx2="7896"/><pair kern="-20" kpx2="7898"/><pair kern="-20" kpx2="7900"/><pair kern="-20" kpx2="286"/><pair kern="-20" kpx2="7902"/><pair kern="-20" kpx2="284"/><pair kern="-20" kpx2="262"/><pair kern="-20" kpx2="266"/><pair kern="-20" kpx2="264"/><pair kern="-20" kpx2="7884"/><pair kern="-20" kpx2="268"/><pair kern="-20" kpx2="7886"/><pair kern="-69" kpx2="34"/><pair kern="-60" kpx2="7922"/><pair kern="-60" kpx2="7926"/><pair kern="-69" kpx2="39"/><pair kern="-60" kpx2="7924"/><pair kern="-60" kpx2="7928"/><pair kern="-20" kpx2="7906"/><pair kern="-20" kpx2="288"/><pair kern="-20" kpx2="7904"/><pair kern="-20" kpx2="290"/><pair kern="-20" kpx2="416"/><pair kern="-69" kpx2="538"/><pair kern="-20" kpx2="71"/><pair kern="-20" kpx2="338"/><pair kern="-20" kpx2="67"/><pair kern="-20" kpx2="336"/><pair kern="-20" kpx2="199"/><pair kern="-20" kpx2="79"/><pair kern="129" kpx2="74"/><pair kern="-40" kpx2="7812"/><pair kern="-60" kpx2="221"/><pair kern="-69" kpx2="84"/><pair kern="-40" kpx2="87"/><pair kern="-40" kpx2="86"/><pair kern="-20" kpx2="216"/><pair kern="-20" kpx2="81"/><pair kern="-40" kpx2="7808"/><pair kern="-40" kpx2="7810"/><pair kern="-20" kpx2="212"/><pair kern="-20" kpx2="334"/><pair kern="-20" kpx2="213"/><pair kern="-20" kpx2="214"/><pair kern="-20" kpx2="332"/><pair kern="-69" kpx2="8217"/><pair kern="-60" kpx2="89"/><pair kern="-20" kpx2="210"/><pair kern="-69" kpx2="8221"/><pair kern="-20" kpx2="211"/><pair kern="-40" kpx2="372"/><pair kern="-20" kpx2="510"/><pair kern="-60" kpx2="374"/><pair kern="-60" kpx2="376"/><pair kern="-69" kpx2="356"/><pair kern="-69" kpx2="354"/></kerning><kerning kpx1="7861"><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="8221"/></kerning><kerning kpx1="7860"><pair kern="-20" kpx2="7888"/><pair kern="-20" kpx2="7890"/><pair kern="-20" kpx2="7892"/><pair kern="-20" kpx2="7894"/><pair kern="-20" kpx2="7896"/><pair kern="-20" kpx2="7898"/><pair kern="-20" kpx2="7900"/><pair kern="-20" kpx2="286"/><pair kern="-20" kpx2="7902"/><pair kern="-20" kpx2="284"/><pair kern="-20" kpx2="262"/><pair kern="-20" kpx2="266"/><pair kern="-20" kpx2="264"/><pair kern="-20" kpx2="7884"/><pair kern="-20" kpx2="268"/><pair kern="-20" kpx2="7886"/><pair kern="-69" kpx2="34"/><pair kern="-60" kpx2="7922"/><pair kern="-60" kpx2="7926"/><pair kern="-69" kpx2="39"/><pair kern="-60" kpx2="7924"/><pair kern="-60" kpx2="7928"/><pair kern="-20" kpx2="7906"/><pair kern="-20" kpx2="288"/><pair kern="-20" kpx2="7904"/><pair kern="-20" kpx2="290"/><pair kern="-20" kpx2="416"/><pair kern="-69" kpx2="538"/><pair kern="-20" kpx2="71"/><pair kern="-20" kpx2="338"/><pair kern="-20" kpx2="67"/><pair kern="-20" kpx2="336"/><pair kern="-20" kpx2="199"/><pair kern="-20" kpx2="79"/><pair kern="129" kpx2="74"/><pair kern="-40" kpx2="7812"/><pair kern="-60" kpx2="221"/><pair kern="-69" kpx2="84"/><pair kern="-40" kpx2="87"/><pair kern="-40" kpx2="86"/><pair kern="-20" kpx2="216"/><pair kern="-20" kpx2="81"/><pair kern="-40" kpx2="7808"/><pair kern="-40" kpx2="7810"/><pair kern="-20" kpx2="212"/><pair kern="-20" kpx2="334"/><pair kern="-20" kpx2="213"/><pair kern="-20" kpx2="214"/><pair kern="-20" kpx2="332"/><pair kern="-69" kpx2="8217"/><pair kern="-60" kpx2="89"/><pair kern="-20" kpx2="210"/><pair kern="-69" kpx2="8221"/><pair kern="-20" kpx2="211"/><pair kern="-40" kpx2="372"/><pair kern="-20" kpx2="510"/><pair kern="-60" kpx2="374"/><pair kern="-60" kpx2="376"/><pair kern="-69" kpx2="356"/><pair kern="-69" kpx2="354"/></kerning><kerning kpx1="7859"><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="8221"/></kerning><kerning kpx1="7858"><pair kern="-20" kpx2="7888"/><pair kern="-20" kpx2="7890"/><pair kern="-20" kpx2="7892"/><pair kern="-20" kpx2="7894"/><pair kern="-20" kpx2="7896"/><pair kern="-20" kpx2="7898"/><pair kern="-20" kpx2="7900"/><pair kern="-20" kpx2="286"/><pair kern="-20" kpx2="7902"/><pair kern="-20" kpx2="284"/><pair kern="-20" kpx2="262"/><pair kern="-20" kpx2="266"/><pair kern="-20" kpx2="264"/><pair kern="-20" kpx2="7884"/><pair kern="-20" kpx2="268"/><pair kern="-20" kpx2="7886"/><pair kern="-69" kpx2="34"/><pair kern="-60" kpx2="7922"/><pair kern="-60" kpx2="7926"/><pair kern="-69" kpx2="39"/><pair kern="-60" kpx2="7924"/><pair kern="-60" kpx2="7928"/><pair kern="-20" kpx2="7906"/><pair kern="-20" kpx2="288"/><pair kern="-20" kpx2="7904"/><pair kern="-20" kpx2="290"/><pair kern="-20" kpx2="416"/><pair kern="-69" kpx2="538"/><pair kern="-20" kpx2="71"/><pair kern="-20" kpx2="338"/><pair kern="-20" kpx2="67"/><pair kern="-20" kpx2="336"/><pair kern="-20" kpx2="199"/><pair kern="-20" kpx2="79"/><pair kern="129" kpx2="74"/><pair kern="-40" kpx2="7812"/><pair kern="-60" kpx2="221"/><pair kern="-69" kpx2="84"/><pair kern="-40" kpx2="87"/><pair kern="-40" kpx2="86"/><pair kern="-20" kpx2="216"/><pair kern="-20" kpx2="81"/><pair kern="-40" kpx2="7808"/><pair kern="-40" kpx2="7810"/><pair kern="-20" kpx2="212"/><pair kern="-20" kpx2="334"/><pair kern="-20" kpx2="213"/><pair kern="-20" kpx2="214"/><pair kern="-20" kpx2="332"/><pair kern="-69" kpx2="8217"/><pair kern="-60" kpx2="89"/><pair kern="-20" kpx2="210"/><pair kern="-69" kpx2="8221"/><pair kern="-20" kpx2="211"/><pair kern="-40" kpx2="372"/><pair kern="-20" kpx2="510"/><pair kern="-60" kpx2="374"/><pair kern="-60" kpx2="376"/><pair kern="-69" kpx2="356"/><pair kern="-69" kpx2="354"/></kerning><kerning kpx1="7857"><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="8221"/></kerning><kerning kpx1="7856"><pair kern="-20" kpx2="7888"/><pair kern="-20" kpx2="7890"/><pair kern="-20" kpx2="7892"/><pair kern="-20" kpx2="7894"/><pair kern="-20" kpx2="7896"/><pair kern="-20" kpx2="7898"/><pair kern="-20" kpx2="7900"/><pair kern="-20" kpx2="286"/><pair kern="-20" kpx2="7902"/><pair kern="-20" kpx2="284"/><pair kern="-20" kpx2="262"/><pair kern="-20" kpx2="266"/><pair kern="-20" kpx2="264"/><pair kern="-20" kpx2="7884"/><pair kern="-20" kpx2="268"/><pair kern="-20" kpx2="7886"/><pair kern="-69" kpx2="34"/><pair kern="-60" kpx2="7922"/><pair kern="-60" kpx2="7926"/><pair kern="-69" kpx2="39"/><pair kern="-60" kpx2="7924"/><pair kern="-60" kpx2="7928"/><pair kern="-20" kpx2="7906"/><pair kern="-20" kpx2="288"/><pair kern="-20" kpx2="7904"/><pair kern="-20" kpx2="290"/><pair kern="-20" kpx2="416"/><pair kern="-69" kpx2="538"/><pair kern="-20" kpx2="71"/><pair kern="-20" kpx2="338"/><pair kern="-20" kpx2="67"/><pair kern="-20" kpx2="336"/><pair kern="-20" kpx2="199"/><pair kern="-20" kpx2="79"/><pair kern="129" kpx2="74"/><pair kern="-40" kpx2="7812"/><pair kern="-60" kpx2="221"/><pair kern="-69" kpx2="84"/><pair kern="-40" kpx2="87"/><pair kern="-40" kpx2="86"/><pair kern="-20" kpx2="216"/><pair kern="-20" kpx2="81"/><pair kern="-40" kpx2="7808"/><pair kern="-40" kpx2="7810"/><pair kern="-20" kpx2="212"/><pair kern="-20" kpx2="334"/><pair kern="-20" kpx2="213"/><pair kern="-20" kpx2="214"/><pair kern="-20" kpx2="332"/><pair kern="-69" kpx2="8217"/><pair kern="-60" kpx2="89"/><pair kern="-20" kpx2="210"/><pair kern="-69" kpx2="8221"/><pair kern="-20" kpx2="211"/><pair kern="-40" kpx2="372"/><pair kern="-20" kpx2="510"/><pair kern="-60" kpx2="374"/><pair kern="-60" kpx2="376"/><pair kern="-69" kpx2="356"/><pair kern="-69" kpx2="354"/></kerning><kerning kpx1="7871"><pair kern="-9" kpx2="34"/><pair kern="-20" kpx2="373"/><pair kern="-9" kpx2="39"/><pair kern="-20" kpx2="7925"/><pair kern="-9" kpx2="380"/><pair kern="-9" kpx2="382"/><pair kern="-9" kpx2="378"/><pair kern="-20" kpx2="119"/><pair kern="-20" kpx2="118"/><pair kern="-20" kpx2="253"/><pair kern="-20" kpx2="7809"/><pair kern="-20" kpx2="7811"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="122"/><pair kern="-9" kpx2="8221"/><pair kern="-20" kpx2="121"/><pair kern="-20" kpx2="120"/></kerning><kerning kpx1="7870"><pair kern="60" kpx2="74"/></kerning><kerning kpx1="7869"><pair kern="-9" kpx2="34"/><pair kern="-20" kpx2="373"/><pair kern="-9" kpx2="39"/><pair kern="-20" kpx2="7925"/><pair kern="-9" kpx2="380"/><pair kern="-9" kpx2="382"/><pair kern="-9" kpx2="378"/><pair kern="-20" kpx2="119"/><pair kern="-20" kpx2="118"/><pair kern="-20" kpx2="253"/><pair kern="-20" kpx2="7809"/><pair kern="-20" kpx2="7811"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="122"/><pair kern="-9" kpx2="8221"/><pair kern="-20" kpx2="121"/><pair kern="-20" kpx2="120"/></kerning><kerning kpx1="7868"><pair kern="60" kpx2="74"/></kerning><kerning kpx1="7867"><pair kern="-9" kpx2="34"/><pair kern="-20" kpx2="373"/><pair kern="-9" kpx2="39"/><pair kern="-20" kpx2="7925"/><pair kern="-9" kpx2="380"/><pair kern="-9" kpx2="382"/><pair kern="-9" kpx2="378"/><pair kern="-20" kpx2="119"/><pair kern="-20" kpx2="118"/><pair kern="-20" kpx2="253"/><pair kern="-20" kpx2="7809"/><pair kern="-20" kpx2="7811"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="122"/><pair kern="-9" kpx2="8221"/><pair kern="-20" kpx2="121"/><pair kern="-20" kpx2="120"/></kerning><kerning kpx1="7866"><pair kern="60" kpx2="74"/></kerning><kerning kpx1="7865"><pair kern="-9" kpx2="34"/><pair kern="-20" kpx2="373"/><pair kern="-9" kpx2="39"/><pair kern="-20" kpx2="7925"/><pair kern="-9" kpx2="380"/><pair kern="-9" kpx2="382"/><pair kern="-9" kpx2="378"/><pair kern="-20" kpx2="119"/><pair kern="-20" kpx2="118"/><pair kern="-20" kpx2="253"/><pair kern="-20" kpx2="7809"/><pair kern="-20" kpx2="7811"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="122"/><pair kern="-9" kpx2="8221"/><pair kern="-20" kpx2="121"/><pair kern="-20" kpx2="120"/></kerning><kerning kpx1="7864"><pair kern="60" kpx2="74"/></kerning><kerning kpx1="7846"><pair kern="-20" kpx2="7888"/><pair kern="-20" kpx2="7890"/><pair kern="-20" kpx2="7892"/><pair kern="-20" kpx2="7894"/><pair kern="-20" kpx2="7896"/><pair kern="-20" kpx2="7898"/><pair kern="-20" kpx2="7900"/><pair kern="-20" kpx2="286"/><pair kern="-20" kpx2="7902"/><pair kern="-20" kpx2="284"/><pair kern="-20" kpx2="262"/><pair kern="-20" kpx2="266"/><pair kern="-20" kpx2="264"/><pair kern="-20" kpx2="7884"/><pair kern="-20" kpx2="268"/><pair kern="-20" kpx2="7886"/><pair kern="-69" kpx2="34"/><pair kern="-60" kpx2="7922"/><pair kern="-60" kpx2="7926"/><pair kern="-69" kpx2="39"/><pair kern="-60" kpx2="7924"/><pair kern="-60" kpx2="7928"/><pair kern="-20" kpx2="7906"/><pair kern="-20" kpx2="288"/><pair kern="-20" kpx2="7904"/><pair kern="-20" kpx2="290"/><pair kern="-20" kpx2="416"/><pair kern="-69" kpx2="538"/><pair kern="-20" kpx2="71"/><pair kern="-20" kpx2="338"/><pair kern="-20" kpx2="67"/><pair kern="-20" kpx2="336"/><pair kern="-20" kpx2="199"/><pair kern="-20" kpx2="79"/><pair kern="129" kpx2="74"/><pair kern="-40" kpx2="7812"/><pair kern="-60" kpx2="221"/><pair kern="-69" kpx2="84"/><pair kern="-40" kpx2="87"/><pair kern="-40" kpx2="86"/><pair kern="-20" kpx2="216"/><pair kern="-20" kpx2="81"/><pair kern="-40" kpx2="7808"/><pair kern="-40" kpx2="7810"/><pair kern="-20" kpx2="212"/><pair kern="-20" kpx2="334"/><pair kern="-20" kpx2="213"/><pair kern="-20" kpx2="214"/><pair kern="-20" kpx2="332"/><pair kern="-69" kpx2="8217"/><pair kern="-60" kpx2="89"/><pair kern="-20" kpx2="210"/><pair kern="-69" kpx2="8221"/><pair kern="-20" kpx2="211"/><pair kern="-40" kpx2="372"/><pair kern="-20" kpx2="510"/><pair kern="-60" kpx2="374"/><pair kern="-60" kpx2="376"/><pair kern="-69" kpx2="356"/><pair kern="-69" kpx2="354"/></kerning><kerning kpx1="7847"><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="8221"/></kerning><kerning kpx1="7844"><pair kern="-20" kpx2="7888"/><pair kern="-20" kpx2="7890"/><pair kern="-20" kpx2="7892"/><pair kern="-20" kpx2="7894"/><pair kern="-20" kpx2="7896"/><pair kern="-20" kpx2="7898"/><pair kern="-20" kpx2="7900"/><pair kern="-20" kpx2="286"/><pair kern="-20" kpx2="7902"/><pair kern="-20" kpx2="284"/><pair kern="-20" kpx2="262"/><pair kern="-20" kpx2="266"/><pair kern="-20" kpx2="264"/><pair kern="-20" kpx2="7884"/><pair kern="-20" kpx2="268"/><pair kern="-20" kpx2="7886"/><pair kern="-69" kpx2="34"/><pair kern="-60" kpx2="7922"/><pair kern="-60" kpx2="7926"/><pair kern="-69" kpx2="39"/><pair kern="-60" kpx2="7924"/><pair kern="-60" kpx2="7928"/><pair kern="-20" kpx2="7906"/><pair kern="-20" kpx2="288"/><pair kern="-20" kpx2="7904"/><pair kern="-20" kpx2="290"/><pair kern="-20" kpx2="416"/><pair kern="-69" kpx2="538"/><pair kern="-20" kpx2="71"/><pair kern="-20" kpx2="338"/><pair kern="-20" kpx2="67"/><pair kern="-20" kpx2="336"/><pair kern="-20" kpx2="199"/><pair kern="-20" kpx2="79"/><pair kern="129" kpx2="74"/><pair kern="-40" kpx2="7812"/><pair kern="-60" kpx2="221"/><pair kern="-69" kpx2="84"/><pair kern="-40" kpx2="87"/><pair kern="-40" kpx2="86"/><pair kern="-20" kpx2="216"/><pair kern="-20" kpx2="81"/><pair kern="-40" kpx2="7808"/><pair kern="-40" kpx2="7810"/><pair kern="-20" kpx2="212"/><pair kern="-20" kpx2="334"/><pair kern="-20" kpx2="213"/><pair kern="-20" kpx2="214"/><pair kern="-20" kpx2="332"/><pair kern="-69" kpx2="8217"/><pair kern="-60" kpx2="89"/><pair kern="-20" kpx2="210"/><pair kern="-69" kpx2="8221"/><pair kern="-20" kpx2="211"/><pair kern="-40" kpx2="372"/><pair kern="-20" kpx2="510"/><pair kern="-60" kpx2="374"/><pair kern="-60" kpx2="376"/><pair kern="-69" kpx2="356"/><pair kern="-69" kpx2="354"/></kerning><kerning kpx1="7845"><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="8221"/></kerning><kerning kpx1="7842"><pair kern="-20" kpx2="7888"/><pair kern="-20" kpx2="7890"/><pair kern="-20" kpx2="7892"/><pair kern="-20" kpx2="7894"/><pair kern="-20" kpx2="7896"/><pair kern="-20" kpx2="7898"/><pair kern="-20" kpx2="7900"/><pair kern="-20" kpx2="286"/><pair kern="-20" kpx2="7902"/><pair kern="-20" kpx2="284"/><pair kern="-20" kpx2="262"/><pair kern="-20" kpx2="266"/><pair kern="-20" kpx2="264"/><pair kern="-20" kpx2="7884"/><pair kern="-20" kpx2="268"/><pair kern="-20" kpx2="7886"/><pair kern="-69" kpx2="34"/><pair kern="-60" kpx2="7922"/><pair kern="-60" kpx2="7926"/><pair kern="-69" kpx2="39"/><pair kern="-60" kpx2="7924"/><pair kern="-60" kpx2="7928"/><pair kern="-20" kpx2="7906"/><pair kern="-20" kpx2="288"/><pair kern="-20" kpx2="7904"/><pair kern="-20" kpx2="290"/><pair kern="-20" kpx2="416"/><pair kern="-69" kpx2="538"/><pair kern="-20" kpx2="71"/><pair kern="-20" kpx2="338"/><pair kern="-20" kpx2="67"/><pair kern="-20" kpx2="336"/><pair kern="-20" kpx2="199"/><pair kern="-20" kpx2="79"/><pair kern="129" kpx2="74"/><pair kern="-40" kpx2="7812"/><pair kern="-60" kpx2="221"/><pair kern="-69" kpx2="84"/><pair kern="-40" kpx2="87"/><pair kern="-40" kpx2="86"/><pair kern="-20" kpx2="216"/><pair kern="-20" kpx2="81"/><pair kern="-40" kpx2="7808"/><pair kern="-40" kpx2="7810"/><pair kern="-20" kpx2="212"/><pair kern="-20" kpx2="334"/><pair kern="-20" kpx2="213"/><pair kern="-20" kpx2="214"/><pair kern="-20" kpx2="332"/><pair kern="-69" kpx2="8217"/><pair kern="-60" kpx2="89"/><pair kern="-20" kpx2="210"/><pair kern="-69" kpx2="8221"/><pair kern="-20" kpx2="211"/><pair kern="-40" kpx2="372"/><pair kern="-20" kpx2="510"/><pair kern="-60" kpx2="374"/><pair kern="-60" kpx2="376"/><pair kern="-69" kpx2="356"/><pair kern="-69" kpx2="354"/></kerning><kerning kpx1="8486"><pair kern="-9" kpx2="939"/><pair kern="-9" kpx2="978"/><pair kern="-9" kpx2="933"/><pair kern="-20" kpx2="932"/></kerning><kerning kpx1="7843"><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="8221"/></kerning><kerning kpx1="7840"><pair kern="-20" kpx2="7888"/><pair kern="-20" kpx2="7890"/><pair kern="-20" kpx2="7892"/><pair kern="-20" kpx2="7894"/><pair kern="-20" kpx2="7896"/><pair kern="-20" kpx2="7898"/><pair kern="-20" kpx2="7900"/><pair kern="-20" kpx2="286"/><pair kern="-20" kpx2="7902"/><pair kern="-20" kpx2="284"/><pair kern="-20" kpx2="262"/><pair kern="-20" kpx2="266"/><pair kern="-20" kpx2="264"/><pair kern="-20" kpx2="7884"/><pair kern="-20" kpx2="268"/><pair kern="-20" kpx2="7886"/><pair kern="-69" kpx2="34"/><pair kern="-60" kpx2="7922"/><pair kern="-60" kpx2="7926"/><pair kern="-69" kpx2="39"/><pair kern="-60" kpx2="7924"/><pair kern="-60" kpx2="7928"/><pair kern="-20" kpx2="7906"/><pair kern="-20" kpx2="288"/><pair kern="-20" kpx2="7904"/><pair kern="-20" kpx2="290"/><pair kern="-20" kpx2="416"/><pair kern="-69" kpx2="538"/><pair kern="-20" kpx2="71"/><pair kern="-20" kpx2="338"/><pair kern="-20" kpx2="67"/><pair kern="-20" kpx2="336"/><pair kern="-20" kpx2="199"/><pair kern="-20" kpx2="79"/><pair kern="129" kpx2="74"/><pair kern="-40" kpx2="7812"/><pair kern="-60" kpx2="221"/><pair kern="-69" kpx2="84"/><pair kern="-40" kpx2="87"/><pair kern="-40" kpx2="86"/><pair kern="-20" kpx2="216"/><pair kern="-20" kpx2="81"/><pair kern="-40" kpx2="7808"/><pair kern="-40" kpx2="7810"/><pair kern="-20" kpx2="212"/><pair kern="-20" kpx2="334"/><pair kern="-20" kpx2="213"/><pair kern="-20" kpx2="214"/><pair kern="-20" kpx2="332"/><pair kern="-69" kpx2="8217"/><pair kern="-60" kpx2="89"/><pair kern="-20" kpx2="210"/><pair kern="-69" kpx2="8221"/><pair kern="-20" kpx2="211"/><pair kern="-40" kpx2="372"/><pair kern="-20" kpx2="510"/><pair kern="-60" kpx2="374"/><pair kern="-60" kpx2="376"/><pair kern="-69" kpx2="356"/><pair kern="-69" kpx2="354"/></kerning><kerning kpx1="7841"><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="8221"/></kerning><kerning kpx1="7854"><pair kern="-20" kpx2="7888"/><pair kern="-20" kpx2="7890"/><pair kern="-20" kpx2="7892"/><pair kern="-20" kpx2="7894"/><pair kern="-20" kpx2="7896"/><pair kern="-20" kpx2="7898"/><pair kern="-20" kpx2="7900"/><pair kern="-20" kpx2="286"/><pair kern="-20" kpx2="7902"/><pair kern="-20" kpx2="284"/><pair kern="-20" kpx2="262"/><pair kern="-20" kpx2="266"/><pair kern="-20" kpx2="264"/><pair kern="-20" kpx2="7884"/><pair kern="-20" kpx2="268"/><pair kern="-20" kpx2="7886"/><pair kern="-69" kpx2="34"/><pair kern="-60" kpx2="7922"/><pair kern="-60" kpx2="7926"/><pair kern="-69" kpx2="39"/><pair kern="-60" kpx2="7924"/><pair kern="-60" kpx2="7928"/><pair kern="-20" kpx2="7906"/><pair kern="-20" kpx2="288"/><pair kern="-20" kpx2="7904"/><pair kern="-20" kpx2="290"/><pair kern="-20" kpx2="416"/><pair kern="-69" kpx2="538"/><pair kern="-20" kpx2="71"/><pair kern="-20" kpx2="338"/><pair kern="-20" kpx2="67"/><pair kern="-20" kpx2="336"/><pair kern="-20" kpx2="199"/><pair kern="-20" kpx2="79"/><pair kern="129" kpx2="74"/><pair kern="-40" kpx2="7812"/><pair kern="-60" kpx2="221"/><pair kern="-69" kpx2="84"/><pair kern="-40" kpx2="87"/><pair kern="-40" kpx2="86"/><pair kern="-20" kpx2="216"/><pair kern="-20" kpx2="81"/><pair kern="-40" kpx2="7808"/><pair kern="-40" kpx2="7810"/><pair kern="-20" kpx2="212"/><pair kern="-20" kpx2="334"/><pair kern="-20" kpx2="213"/><pair kern="-20" kpx2="214"/><pair kern="-20" kpx2="332"/><pair kern="-69" kpx2="8217"/><pair kern="-60" kpx2="89"/><pair kern="-20" kpx2="210"/><pair kern="-69" kpx2="8221"/><pair kern="-20" kpx2="211"/><pair kern="-40" kpx2="372"/><pair kern="-20" kpx2="510"/><pair kern="-60" kpx2="374"/><pair kern="-60" kpx2="376"/><pair kern="-69" kpx2="356"/><pair kern="-69" kpx2="354"/></kerning><kerning kpx1="7855"><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="8221"/></kerning><kerning kpx1="7852"><pair kern="-20" kpx2="7888"/><pair kern="-20" kpx2="7890"/><pair kern="-20" kpx2="7892"/><pair kern="-20" kpx2="7894"/><pair kern="-20" kpx2="7896"/><pair kern="-20" kpx2="7898"/><pair kern="-20" kpx2="7900"/><pair kern="-20" kpx2="286"/><pair kern="-20" kpx2="7902"/><pair kern="-20" kpx2="284"/><pair kern="-20" kpx2="262"/><pair kern="-20" kpx2="266"/><pair kern="-20" kpx2="264"/><pair kern="-20" kpx2="7884"/><pair kern="-20" kpx2="268"/><pair kern="-20" kpx2="7886"/><pair kern="-69" kpx2="34"/><pair kern="-60" kpx2="7922"/><pair kern="-60" kpx2="7926"/><pair kern="-69" kpx2="39"/><pair kern="-60" kpx2="7924"/><pair kern="-60" kpx2="7928"/><pair kern="-20" kpx2="7906"/><pair kern="-20" kpx2="288"/><pair kern="-20" kpx2="7904"/><pair kern="-20" kpx2="290"/><pair kern="-20" kpx2="416"/><pair kern="-69" kpx2="538"/><pair kern="-20" kpx2="71"/><pair kern="-20" kpx2="338"/><pair kern="-20" kpx2="67"/><pair kern="-20" kpx2="336"/><pair kern="-20" kpx2="199"/><pair kern="-20" kpx2="79"/><pair kern="129" kpx2="74"/><pair kern="-40" kpx2="7812"/><pair kern="-60" kpx2="221"/><pair kern="-69" kpx2="84"/><pair kern="-40" kpx2="87"/><pair kern="-40" kpx2="86"/><pair kern="-20" kpx2="216"/><pair kern="-20" kpx2="81"/><pair kern="-40" kpx2="7808"/><pair kern="-40" kpx2="7810"/><pair kern="-20" kpx2="212"/><pair kern="-20" kpx2="334"/><pair kern="-20" kpx2="213"/><pair kern="-20" kpx2="214"/><pair kern="-20" kpx2="332"/><pair kern="-69" kpx2="8217"/><pair kern="-60" kpx2="89"/><pair kern="-20" kpx2="210"/><pair kern="-69" kpx2="8221"/><pair kern="-20" kpx2="211"/><pair kern="-40" kpx2="372"/><pair kern="-20" kpx2="510"/><pair kern="-60" kpx2="374"/><pair kern="-60" kpx2="376"/><pair kern="-69" kpx2="356"/><pair kern="-69" kpx2="354"/></kerning><kerning kpx1="7853"><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="8221"/></kerning><kerning kpx1="7850"><pair kern="-20" kpx2="7888"/><pair kern="-20" kpx2="7890"/><pair kern="-20" kpx2="7892"/><pair kern="-20" kpx2="7894"/><pair kern="-20" kpx2="7896"/><pair kern="-20" kpx2="7898"/><pair kern="-20" kpx2="7900"/><pair kern="-20" kpx2="286"/><pair kern="-20" kpx2="7902"/><pair kern="-20" kpx2="284"/><pair kern="-20" kpx2="262"/><pair kern="-20" kpx2="266"/><pair kern="-20" kpx2="264"/><pair kern="-20" kpx2="7884"/><pair kern="-20" kpx2="268"/><pair kern="-20" kpx2="7886"/><pair kern="-69" kpx2="34"/><pair kern="-60" kpx2="7922"/><pair kern="-60" kpx2="7926"/><pair kern="-69" kpx2="39"/><pair kern="-60" kpx2="7924"/><pair kern="-60" kpx2="7928"/><pair kern="-20" kpx2="7906"/><pair kern="-20" kpx2="288"/><pair kern="-20" kpx2="7904"/><pair kern="-20" kpx2="290"/><pair kern="-20" kpx2="416"/><pair kern="-69" kpx2="538"/><pair kern="-20" kpx2="71"/><pair kern="-20" kpx2="338"/><pair kern="-20" kpx2="67"/><pair kern="-20" kpx2="336"/><pair kern="-20" kpx2="199"/><pair kern="-20" kpx2="79"/><pair kern="129" kpx2="74"/><pair kern="-40" kpx2="7812"/><pair kern="-60" kpx2="221"/><pair kern="-69" kpx2="84"/><pair kern="-40" kpx2="87"/><pair kern="-40" kpx2="86"/><pair kern="-20" kpx2="216"/><pair kern="-20" kpx2="81"/><pair kern="-40" kpx2="7808"/><pair kern="-40" kpx2="7810"/><pair kern="-20" kpx2="212"/><pair kern="-20" kpx2="334"/><pair kern="-20" kpx2="213"/><pair kern="-20" kpx2="214"/><pair kern="-20" kpx2="332"/><pair kern="-69" kpx2="8217"/><pair kern="-60" kpx2="89"/><pair kern="-20" kpx2="210"/><pair kern="-69" kpx2="8221"/><pair kern="-20" kpx2="211"/><pair kern="-40" kpx2="372"/><pair kern="-20" kpx2="510"/><pair kern="-60" kpx2="374"/><pair kern="-60" kpx2="376"/><pair kern="-69" kpx2="356"/><pair kern="-69" kpx2="354"/></kerning><kerning kpx1="7851"><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="8221"/></kerning><kerning kpx1="7848"><pair kern="-20" kpx2="7888"/><pair kern="-20" kpx2="7890"/><pair kern="-20" kpx2="7892"/><pair kern="-20" kpx2="7894"/><pair kern="-20" kpx2="7896"/><pair kern="-20" kpx2="7898"/><pair kern="-20" kpx2="7900"/><pair kern="-20" kpx2="286"/><pair kern="-20" kpx2="7902"/><pair kern="-20" kpx2="284"/><pair kern="-20" kpx2="262"/><pair kern="-20" kpx2="266"/><pair kern="-20" kpx2="264"/><pair kern="-20" kpx2="7884"/><pair kern="-20" kpx2="268"/><pair kern="-20" kpx2="7886"/><pair kern="-69" kpx2="34"/><pair kern="-60" kpx2="7922"/><pair kern="-60" kpx2="7926"/><pair kern="-69" kpx2="39"/><pair kern="-60" kpx2="7924"/><pair kern="-60" kpx2="7928"/><pair kern="-20" kpx2="7906"/><pair kern="-20" kpx2="288"/><pair kern="-20" kpx2="7904"/><pair kern="-20" kpx2="290"/><pair kern="-20" kpx2="416"/><pair kern="-69" kpx2="538"/><pair kern="-20" kpx2="71"/><pair kern="-20" kpx2="338"/><pair kern="-20" kpx2="67"/><pair kern="-20" kpx2="336"/><pair kern="-20" kpx2="199"/><pair kern="-20" kpx2="79"/><pair kern="129" kpx2="74"/><pair kern="-40" kpx2="7812"/><pair kern="-60" kpx2="221"/><pair kern="-69" kpx2="84"/><pair kern="-40" kpx2="87"/><pair kern="-40" kpx2="86"/><pair kern="-20" kpx2="216"/><pair kern="-20" kpx2="81"/><pair kern="-40" kpx2="7808"/><pair kern="-40" kpx2="7810"/><pair kern="-20" kpx2="212"/><pair kern="-20" kpx2="334"/><pair kern="-20" kpx2="213"/><pair kern="-20" kpx2="214"/><pair kern="-20" kpx2="332"/><pair kern="-69" kpx2="8217"/><pair kern="-60" kpx2="89"/><pair kern="-20" kpx2="210"/><pair kern="-69" kpx2="8221"/><pair kern="-20" kpx2="211"/><pair kern="-40" kpx2="372"/><pair kern="-20" kpx2="510"/><pair kern="-60" kpx2="374"/><pair kern="-60" kpx2="376"/><pair kern="-69" kpx2="356"/><pair kern="-69" kpx2="354"/></kerning><kerning kpx1="7849"><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="8221"/></kerning><kerning kpx1="957"><pair kern="-9" kpx2="955"/><pair kern="-40" kpx2="8218"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="8222"/><pair kern="-40" kpx2="44"/></kerning><kerning kpx1="959"><pair kern="-9" kpx2="34"/><pair kern="-20" kpx2="957"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="8221"/><pair kern="-20" kpx2="947"/></kerning><kerning kpx1="952"><pair kern="-20" kpx2="8218"/><pair kern="-20" kpx2="46"/><pair kern="-20" kpx2="8222"/><pair kern="-20" kpx2="44"/></kerning><kerning kpx1="953"><pair kern="-40" kpx2="34"/><pair kern="-40" kpx2="39"/><pair kern="-40" kpx2="8217"/><pair kern="-9" kpx2="960"/><pair kern="-40" kpx2="8221"/><pair kern="-9" kpx2="964"/></kerning><kerning kpx1="954"><pair kern="-20" kpx2="940"/><pair kern="-20" kpx2="959"/><pair kern="-20" kpx2="972"/><pair kern="-20" kpx2="963"/><pair kern="-20" kpx2="962"/><pair kern="-20" kpx2="966"/><pair kern="-20" kpx2="945"/></kerning><kerning kpx1="955"><pair kern="-60" kpx2="34"/><pair kern="-20" kpx2="957"/><pair kern="-9" kpx2="940"/><pair kern="-9" kpx2="959"/><pair kern="-60" kpx2="39"/><pair kern="-9" kpx2="972"/><pair kern="-9" kpx2="963"/><pair kern="-9" kpx2="962"/><pair kern="-60" kpx2="8217"/><pair kern="-20" kpx2="960"/><pair kern="-9" kpx2="966"/><pair kern="-9" kpx2="945"/><pair kern="-60" kpx2="8221"/><pair kern="-20" kpx2="964"/><pair kern="-20" kpx2="947"/></kerning><kerning kpx1="950"><pair kern="-20" kpx2="959"/><pair kern="-20" kpx2="948"/><pair kern="-20" kpx2="945"/><pair kern="-49" kpx2="45"/><pair kern="-49" kpx2="8211"/><pair kern="-20" kpx2="940"/><pair kern="-49" kpx2="8213"/><pair kern="-49" kpx2="8212"/><pair kern="-20" kpx2="972"/><pair kern="-20" kpx2="963"/><pair kern="-20" kpx2="962"/><pair kern="-20" kpx2="960"/><pair kern="-20" kpx2="966"/><pair kern="-20" kpx2="964"/></kerning><kerning kpx1="951"><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="8221"/></kerning><kerning kpx1="945"><pair kern="20" kpx2="955"/></kerning><kerning kpx1="947"><pair kern="-9" kpx2="955"/><pair kern="-40" kpx2="8218"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="8222"/><pair kern="-40" kpx2="44"/></kerning><kerning kpx1="940"><pair kern="20" kpx2="955"/></kerning><kerning kpx1="943"><pair kern="-40" kpx2="34"/><pair kern="-40" kpx2="39"/><pair kern="-40" kpx2="8217"/><pair kern="-9" kpx2="960"/><pair kern="-40" kpx2="8221"/><pair kern="-9" kpx2="964"/></kerning><kerning kpx1="942"><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="8221"/></kerning><kerning kpx1="937"><pair kern="-9" kpx2="939"/><pair kern="-9" kpx2="978"/><pair kern="-9" kpx2="933"/><pair kern="-20" kpx2="932"/></kerning><kerning kpx1="936"><pair kern="-9" kpx2="927"/><pair kern="-40" kpx2="923"/><pair kern="-9" kpx2="920"/><pair kern="-60" kpx2="8218"/><pair kern="-40" kpx2="902"/><pair kern="-40" kpx2="916"/><pair kern="-60" kpx2="46"/><pair kern="-60" kpx2="8222"/><pair kern="-60" kpx2="44"/><pair kern="-40" kpx2="913"/></kerning><kerning kpx1="939"><pair kern="-29" kpx2="956"/><pair kern="-49" kpx2="959"/><pair kern="-29" kpx2="953"/><pair kern="-29" kpx2="954"/><pair kern="-29" kpx2="948"/><pair kern="-40" kpx2="949"/><pair kern="-29" kpx2="951"/><pair kern="-29" kpx2="944"/><pair kern="-49" kpx2="945"/><pair kern="-40" kpx2="941"/><pair kern="-49" kpx2="940"/><pair kern="-29" kpx2="943"/><pair kern="-29" kpx2="942"/><pair kern="-9" kpx2="937"/><pair kern="-60" kpx2="8218"/><pair kern="-29" kpx2="934"/><pair kern="-60" kpx2="8222"/><pair kern="-20" kpx2="927"/><pair kern="-60" kpx2="923"/><pair kern="-20" kpx2="920"/><pair kern="-60" kpx2="916"/><pair kern="-60" kpx2="46"/><pair kern="-60" kpx2="44"/><pair kern="-60" kpx2="913"/><pair kern="-29" kpx2="971"/><pair kern="-29" kpx2="969"/><pair kern="-29" kpx2="968"/><pair kern="-9" kpx2="8486"/><pair kern="-29" kpx2="974"/><pair kern="-29" kpx2="973"/><pair kern="-49" kpx2="972"/><pair kern="-49" kpx2="963"/><pair kern="-49" kpx2="962"/><pair kern="-60" kpx2="902"/><pair kern="-49" kpx2="961"/><pair kern="-49" kpx2="966"/><pair kern="-29" kpx2="965"/></kerning><kerning kpx1="933"><pair kern="-29" kpx2="956"/><pair kern="-49" kpx2="959"/><pair kern="-29" kpx2="953"/><pair kern="-29" kpx2="954"/><pair kern="-29" kpx2="948"/><pair kern="-40" kpx2="949"/><pair kern="-29" kpx2="951"/><pair kern="-29" kpx2="944"/><pair kern="-49" kpx2="945"/><pair kern="-40" kpx2="941"/><pair kern="-49" kpx2="940"/><pair kern="-29" kpx2="943"/><pair kern="-29" kpx2="942"/><pair kern="-9" kpx2="937"/><pair kern="-60" kpx2="8218"/><pair kern="-29" kpx2="934"/><pair kern="-60" kpx2="8222"/><pair kern="-20" kpx2="927"/><pair kern="-60" kpx2="923"/><pair kern="-20" kpx2="920"/><pair kern="-60" kpx2="916"/><pair kern="-60" kpx2="46"/><pair kern="-60" kpx2="44"/><pair kern="-60" kpx2="913"/><pair kern="-29" kpx2="971"/><pair kern="-29" kpx2="969"/><pair kern="-29" kpx2="968"/><pair kern="-9" kpx2="8486"/><pair kern="-29" kpx2="974"/><pair kern="-29" kpx2="973"/><pair kern="-49" kpx2="972"/><pair kern="-49" kpx2="963"/><pair kern="-49" kpx2="962"/><pair kern="-60" kpx2="902"/><pair kern="-49" kpx2="961"/><pair kern="-49" kpx2="966"/><pair kern="-29" kpx2="965"/></kerning><kerning kpx1="932"><pair kern="-49" kpx2="956"/><pair kern="-20" kpx2="957"/><pair kern="-69" kpx2="959"/><pair kern="-40" kpx2="953"/><pair kern="-49" kpx2="954"/><pair kern="-29" kpx2="948"/><pair kern="-49" kpx2="949"/><pair kern="-49" kpx2="951"/><pair kern="-49" kpx2="944"/><pair kern="-69" kpx2="945"/><pair kern="-20" kpx2="947"/><pair kern="-40" kpx2="8211"/><pair kern="-49" kpx2="941"/><pair kern="-69" kpx2="940"/><pair kern="-40" kpx2="943"/><pair kern="-49" kpx2="942"/><pair kern="-29" kpx2="937"/><pair kern="-40" kpx2="8213"/><pair kern="-40" kpx2="8212"/><pair kern="-60" kpx2="8218"/><pair kern="-49" kpx2="934"/><pair kern="-60" kpx2="8222"/><pair kern="-29" kpx2="927"/><pair kern="-80" kpx2="923"/><pair kern="-29" kpx2="920"/><pair kern="-80" kpx2="916"/><pair kern="-20" kpx2="977"/><pair kern="-60" kpx2="46"/><pair kern="-60" kpx2="44"/><pair kern="-80" kpx2="913"/><pair kern="-40" kpx2="45"/><pair kern="-49" kpx2="971"/><pair kern="-49" kpx2="969"/><pair kern="-49" kpx2="968"/><pair kern="-29" kpx2="8486"/><pair kern="-49" kpx2="974"/><pair kern="-49" kpx2="973"/><pair kern="-69" kpx2="972"/><pair kern="-69" kpx2="963"/><pair kern="-69" kpx2="962"/><pair kern="-80" kpx2="902"/><pair kern="-49" kpx2="961"/><pair kern="-20" kpx2="967"/><pair kern="-69" kpx2="966"/><pair kern="-49" kpx2="965"/></kerning><kerning kpx1="935"><pair kern="-20" kpx2="927"/><pair kern="-20" kpx2="920"/><pair kern="-9" kpx2="960"/><pair kern="-29" kpx2="934"/><pair kern="-9" kpx2="964"/></kerning><kerning kpx1="934"><pair kern="-20" kpx2="923"/><pair kern="-9" kpx2="955"/><pair kern="-29" kpx2="978"/><pair kern="-29" kpx2="918"/><pair kern="-20" kpx2="916"/><pair kern="-49" kpx2="46"/><pair kern="-49" kpx2="44"/><pair kern="-20" kpx2="913"/><pair kern="-29" kpx2="939"/><pair kern="-29" kpx2="933"/><pair kern="-49" kpx2="8218"/><pair kern="-20" kpx2="902"/><pair kern="-40" kpx2="932"/><pair kern="-9" kpx2="935"/><pair kern="-49" kpx2="8222"/><pair kern="-9" kpx2="931"/></kerning><kerning kpx1="929"><pair kern="-49" kpx2="923"/><pair kern="-20" kpx2="955"/><pair kern="-9" kpx2="918"/><pair kern="-129" kpx2="8218"/><pair kern="-49" kpx2="902"/><pair kern="-20" kpx2="935"/><pair kern="-49" kpx2="916"/><pair kern="-129" kpx2="46"/><pair kern="-129" kpx2="8222"/><pair kern="-129" kpx2="44"/><pair kern="-49" kpx2="913"/></kerning><kerning kpx1="927"><pair kern="-20" kpx2="923"/><pair kern="-9" kpx2="955"/><pair kern="-9" kpx2="978"/><pair kern="-9" kpx2="918"/><pair kern="-20" kpx2="916"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="44"/><pair kern="-20" kpx2="913"/><pair kern="-9" kpx2="936"/><pair kern="-9" kpx2="939"/><pair kern="-9" kpx2="933"/><pair kern="-40" kpx2="8218"/><pair kern="-20" kpx2="902"/><pair kern="-29" kpx2="932"/><pair kern="-20" kpx2="935"/><pair kern="-40" kpx2="8222"/><pair kern="-9" kpx2="931"/></kerning><kerning kpx1="922"><pair kern="-20" kpx2="927"/><pair kern="-20" kpx2="920"/><pair kern="-9" kpx2="960"/><pair kern="-29" kpx2="934"/><pair kern="-9" kpx2="964"/></kerning><kerning kpx1="923"><pair kern="-69" kpx2="34"/><pair kern="-20" kpx2="927"/><pair kern="-40" kpx2="936"/><pair kern="-69" kpx2="39"/><pair kern="-60" kpx2="939"/><pair kern="-20" kpx2="920"/><pair kern="-60" kpx2="978"/><pair kern="-60" kpx2="933"/><pair kern="-69" kpx2="932"/><pair kern="-69" kpx2="8217"/><pair kern="-20" kpx2="934"/><pair kern="-69" kpx2="8221"/></kerning><kerning kpx1="920"><pair kern="-20" kpx2="923"/><pair kern="-9" kpx2="955"/><pair kern="-9" kpx2="978"/><pair kern="-9" kpx2="918"/><pair kern="-20" kpx2="916"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="44"/><pair kern="-20" kpx2="913"/><pair kern="-9" kpx2="936"/><pair kern="-9" kpx2="939"/><pair kern="-9" kpx2="933"/><pair kern="-40" kpx2="8218"/><pair kern="-20" kpx2="902"/><pair kern="-29" kpx2="932"/><pair kern="-20" kpx2="935"/><pair kern="-40" kpx2="8222"/><pair kern="-9" kpx2="931"/></kerning><kerning kpx1="918"><pair kern="-9" kpx2="927"/><pair kern="-9" kpx2="920"/><pair kern="-29" kpx2="934"/></kerning><kerning kpx1="916"><pair kern="-69" kpx2="34"/><pair kern="-20" kpx2="927"/><pair kern="-40" kpx2="936"/><pair kern="-69" kpx2="39"/><pair kern="-60" kpx2="939"/><pair kern="-20" kpx2="920"/><pair kern="-60" kpx2="978"/><pair kern="-60" kpx2="933"/><pair kern="-69" kpx2="932"/><pair kern="-69" kpx2="8217"/><pair kern="-20" kpx2="934"/><pair kern="-69" kpx2="8221"/></kerning><kerning kpx1="914"><pair kern="-20" kpx2="923"/><pair kern="-40" kpx2="8218"/><pair kern="-20" kpx2="902"/><pair kern="-20" kpx2="935"/><pair kern="-20" kpx2="916"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="8222"/><pair kern="-40" kpx2="44"/><pair kern="-20" kpx2="913"/></kerning><kerning kpx1="915"><pair kern="-49" kpx2="956"/><pair kern="-20" kpx2="957"/><pair kern="-69" kpx2="959"/><pair kern="-40" kpx2="953"/><pair kern="-49" kpx2="954"/><pair kern="-29" kpx2="948"/><pair kern="-49" kpx2="949"/><pair kern="-49" kpx2="951"/><pair kern="-49" kpx2="944"/><pair kern="-69" kpx2="945"/><pair kern="-20" kpx2="947"/><pair kern="-40" kpx2="8211"/><pair kern="-49" kpx2="941"/><pair kern="-69" kpx2="940"/><pair kern="-40" kpx2="943"/><pair kern="-49" kpx2="942"/><pair kern="-29" kpx2="937"/><pair kern="-40" kpx2="8213"/><pair kern="-40" kpx2="8212"/><pair kern="-60" kpx2="8218"/><pair kern="-49" kpx2="934"/><pair kern="-60" kpx2="8222"/><pair kern="-29" kpx2="927"/><pair kern="-80" kpx2="923"/><pair kern="-29" kpx2="920"/><pair kern="-80" kpx2="916"/><pair kern="-20" kpx2="977"/><pair kern="-60" kpx2="46"/><pair kern="-60" kpx2="44"/><pair kern="-80" kpx2="913"/><pair kern="-40" kpx2="45"/><pair kern="-49" kpx2="971"/><pair kern="-49" kpx2="969"/><pair kern="-49" kpx2="968"/><pair kern="-29" kpx2="8486"/><pair kern="-49" kpx2="974"/><pair kern="-49" kpx2="973"/><pair kern="-69" kpx2="972"/><pair kern="-69" kpx2="963"/><pair kern="-69" kpx2="962"/><pair kern="-80" kpx2="902"/><pair kern="-49" kpx2="961"/><pair kern="-20" kpx2="967"/><pair kern="-69" kpx2="966"/><pair kern="-49" kpx2="965"/></kerning><kerning kpx1="912"><pair kern="-20" kpx2="34"/><pair kern="-20" kpx2="39"/><pair kern="-20" kpx2="8217"/><pair kern="-20" kpx2="8221"/></kerning><kerning kpx1="913"><pair kern="-69" kpx2="34"/><pair kern="-20" kpx2="927"/><pair kern="-40" kpx2="936"/><pair kern="-69" kpx2="39"/><pair kern="-60" kpx2="939"/><pair kern="-20" kpx2="920"/><pair kern="-60" kpx2="978"/><pair kern="-60" kpx2="933"/><pair kern="-69" kpx2="932"/><pair kern="-69" kpx2="8217"/><pair kern="-20" kpx2="934"/><pair kern="-69" kpx2="8221"/></kerning><kerning kpx1="911"><pair kern="-9" kpx2="939"/><pair kern="-9" kpx2="978"/><pair kern="-9" kpx2="933"/><pair kern="-20" kpx2="932"/></kerning><kerning kpx1="910"><pair kern="-29" kpx2="956"/><pair kern="-49" kpx2="959"/><pair kern="-29" kpx2="953"/><pair kern="-29" kpx2="954"/><pair kern="-29" kpx2="948"/><pair kern="-40" kpx2="949"/><pair kern="-29" kpx2="951"/><pair kern="-29" kpx2="944"/><pair kern="-49" kpx2="945"/><pair kern="-40" kpx2="941"/><pair kern="-49" kpx2="940"/><pair kern="-29" kpx2="943"/><pair kern="-29" kpx2="942"/><pair kern="-9" kpx2="937"/><pair kern="-60" kpx2="8218"/><pair kern="-29" kpx2="934"/><pair kern="-60" kpx2="8222"/><pair kern="-20" kpx2="927"/><pair kern="-60" kpx2="923"/><pair kern="-20" kpx2="920"/><pair kern="-60" kpx2="916"/><pair kern="-60" kpx2="46"/><pair kern="-60" kpx2="44"/><pair kern="-60" kpx2="913"/><pair kern="-29" kpx2="971"/><pair kern="-29" kpx2="969"/><pair kern="-29" kpx2="968"/><pair kern="-9" kpx2="8486"/><pair kern="-29" kpx2="974"/><pair kern="-29" kpx2="973"/><pair kern="-49" kpx2="972"/><pair kern="-49" kpx2="963"/><pair kern="-49" kpx2="962"/><pair kern="-60" kpx2="902"/><pair kern="-49" kpx2="961"/><pair kern="-49" kpx2="966"/><pair kern="-29" kpx2="965"/></kerning><kerning kpx1="908"><pair kern="-20" kpx2="923"/><pair kern="-9" kpx2="955"/><pair kern="-9" kpx2="978"/><pair kern="-9" kpx2="918"/><pair kern="-20" kpx2="916"/><pair kern="-40" kpx2="46"/><pair kern="-40" kpx2="44"/><pair kern="-20" kpx2="913"/><pair kern="-9" kpx2="936"/><pair kern="-9" kpx2="939"/><pair kern="-9" kpx2="933"/><pair kern="-40" kpx2="8218"/><pair kern="-20" kpx2="902"/><pair kern="-29" kpx2="932"/><pair kern="-20" kpx2="935"/><pair kern="-40" kpx2="8222"/><pair kern="-9" kpx2="931"/></kerning><kerning kpx1="902"><pair kern="-69" kpx2="34"/><pair kern="-20" kpx2="927"/><pair kern="-40" kpx2="936"/><pair kern="-69" kpx2="39"/><pair kern="-60" kpx2="939"/><pair kern="-20" kpx2="920"/><pair kern="-60" kpx2="978"/><pair kern="-60" kpx2="933"/><pair kern="-69" kpx2="932"/><pair kern="-69" kpx2="8217"/><pair kern="-20" kpx2="934"/><pair kern="-69" kpx2="8221"/></kerning><kerning kpx1="7681"><pair kern="-9" kpx2="34"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="8221"/></kerning><kerning kpx1="7680"><pair kern="-20" kpx2="7888"/><pair kern="-20" kpx2="7890"/><pair kern="-20" kpx2="7892"/><pair kern="-20" kpx2="7894"/><pair kern="-20" kpx2="7896"/><pair kern="-20" kpx2="7898"/><pair kern="-20" kpx2="7900"/><pair kern="-20" kpx2="286"/><pair kern="-20" kpx2="7902"/><pair kern="-20" kpx2="284"/><pair kern="-20" kpx2="262"/><pair kern="-20" kpx2="266"/><pair kern="-20" kpx2="264"/><pair kern="-20" kpx2="7884"/><pair kern="-20" kpx2="268"/><pair kern="-20" kpx2="7886"/><pair kern="-69" kpx2="34"/><pair kern="-60" kpx2="7922"/><pair kern="-60" kpx2="7926"/><pair kern="-69" kpx2="39"/><pair kern="-60" kpx2="7924"/><pair kern="-60" kpx2="7928"/><pair kern="-20" kpx2="7906"/><pair kern="-20" kpx2="288"/><pair kern="-20" kpx2="7904"/><pair kern="-20" kpx2="290"/><pair kern="-20" kpx2="416"/><pair kern="-69" kpx2="538"/><pair kern="-20" kpx2="71"/><pair kern="-20" kpx2="338"/><pair kern="-20" kpx2="67"/><pair kern="-20" kpx2="336"/><pair kern="-20" kpx2="199"/><pair kern="-20" kpx2="79"/><pair kern="129" kpx2="74"/><pair kern="-40" kpx2="7812"/><pair kern="-60" kpx2="221"/><pair kern="-69" kpx2="84"/><pair kern="-40" kpx2="87"/><pair kern="-40" kpx2="86"/><pair kern="-20" kpx2="216"/><pair kern="-20" kpx2="81"/><pair kern="-40" kpx2="7808"/><pair kern="-40" kpx2="7810"/><pair kern="-20" kpx2="212"/><pair kern="-20" kpx2="334"/><pair kern="-20" kpx2="213"/><pair kern="-20" kpx2="214"/><pair kern="-20" kpx2="332"/><pair kern="-69" kpx2="8217"/><pair kern="-60" kpx2="89"/><pair kern="-20" kpx2="210"/><pair kern="-69" kpx2="8221"/><pair kern="-20" kpx2="211"/><pair kern="-40" kpx2="372"/><pair kern="-20" kpx2="510"/><pair kern="-60" kpx2="374"/><pair kern="-60" kpx2="376"/><pair kern="-69" kpx2="356"/><pair kern="-69" kpx2="354"/></kerning><kerning kpx1="978"><pair kern="-29" kpx2="956"/><pair kern="-49" kpx2="959"/><pair kern="-29" kpx2="953"/><pair kern="-29" kpx2="954"/><pair kern="-29" kpx2="948"/><pair kern="-40" kpx2="949"/><pair kern="-29" kpx2="951"/><pair kern="-29" kpx2="944"/><pair kern="-49" kpx2="945"/><pair kern="-40" kpx2="941"/><pair kern="-49" kpx2="940"/><pair kern="-29" kpx2="943"/><pair kern="-29" kpx2="942"/><pair kern="-9" kpx2="937"/><pair kern="-60" kpx2="8218"/><pair kern="-29" kpx2="934"/><pair kern="-60" kpx2="8222"/><pair kern="-20" kpx2="927"/><pair kern="-60" kpx2="923"/><pair kern="-20" kpx2="920"/><pair kern="-60" kpx2="916"/><pair kern="-60" kpx2="46"/><pair kern="-60" kpx2="44"/><pair kern="-60" kpx2="913"/><pair kern="-29" kpx2="971"/><pair kern="-29" kpx2="969"/><pair kern="-29" kpx2="968"/><pair kern="-9" kpx2="8486"/><pair kern="-29" kpx2="974"/><pair kern="-29" kpx2="973"/><pair kern="-49" kpx2="972"/><pair kern="-49" kpx2="963"/><pair kern="-49" kpx2="962"/><pair kern="-60" kpx2="902"/><pair kern="-49" kpx2="961"/><pair kern="-49" kpx2="966"/><pair kern="-29" kpx2="965"/></kerning><kerning kpx1="977"><pair kern="-29" kpx2="8218"/><pair kern="-29" kpx2="46"/><pair kern="-29" kpx2="8222"/><pair kern="-29" kpx2="44"/></kerning><kerning kpx1="970"><pair kern="-20" kpx2="34"/><pair kern="-20" kpx2="39"/><pair kern="-20" kpx2="8217"/><pair kern="-20" kpx2="8221"/></kerning><kerning kpx1="972"><pair kern="-9" kpx2="34"/><pair kern="-20" kpx2="957"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="8221"/><pair kern="-20" kpx2="947"/></kerning><kerning kpx1="963"><pair kern="-9" kpx2="8218"/><pair kern="-9" kpx2="46"/><pair kern="-9" kpx2="8222"/><pair kern="-9" kpx2="44"/></kerning><kerning kpx1="961"><pair kern="-9" kpx2="34"/><pair kern="-20" kpx2="957"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="8221"/><pair kern="-20" kpx2="947"/></kerning><kerning kpx1="967"><pair kern="-20" kpx2="959"/><pair kern="-20" kpx2="948"/><pair kern="-29" kpx2="46"/><pair kern="-20" kpx2="945"/><pair kern="-29" kpx2="44"/><pair kern="-20" kpx2="45"/><pair kern="-20" kpx2="8211"/><pair kern="-20" kpx2="940"/><pair kern="-20" kpx2="8213"/><pair kern="-20" kpx2="8212"/><pair kern="-20" kpx2="972"/><pair kern="-20" kpx2="963"/><pair kern="-29" kpx2="8218"/><pair kern="-20" kpx2="962"/><pair kern="-29" kpx2="8222"/><pair kern="-20" kpx2="966"/></kerning><kerning kpx1="966"><pair kern="-9" kpx2="34"/><pair kern="-20" kpx2="957"/><pair kern="-9" kpx2="39"/><pair kern="-9" kpx2="8217"/><pair kern="-9" kpx2="8221"/><pair kern="-20" kpx2="947"/></kerning></font-metrics>
    \ No newline at end of file
    diff --git a/jOOQ-website/src/main/resources/pdf.xsl b/jOOQ-website/src/main/resources/pdf.xsl
    deleted file mode 100644
    index eb5aa5393d..0000000000
    --- a/jOOQ-website/src/main/resources/pdf.xsl
    +++ /dev/null
    @@ -1,590 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?>
    -<!-- 
    -  * Copyright (c) 2009-2013, Data Geekery GmbH (http://www.datageekery.com)
    -  * All rights reserved.
    -  *
    -  * This work is dual-licensed
    -  * - under the Apache Software License 2.0 (the "ASL")
    -  * - under the jOOQ License and Maintenance Agreement (the "jOOQ License")
    -  * ===========================================================================
    -  * You may choose which license applies to you:
    -  *
    -  * - If you're using this work with Open Source databases, you may choose
    -  *   either ASL or jOOQ License.
    -  * - If you're using this work with at least one commercial database, you must
    -  *   choose jOOQ License
    -  *
    -  * For more information, please visit http://www.jooq.org/licenses
    -  *
    -  * Apache Software License 2.0:
    -  * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -  * Licensed under the Apache License, Version 2.0 (the "License");
    -  * you may not use this file except in compliance with the License.
    -  * You may obtain a copy of the License at
    -  *
    -  *  http://www.apache.org/licenses/LICENSE-2.0
    -  *
    -  * Unless required by applicable law or agreed to in writing, software
    -  * distributed under the License is distributed on an "AS IS" BASIS,
    -  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -  * See the License for the specific language governing permissions and
    -  * limitations under the License.
    -  *
    -  * jOOQ License and Maintenance Agreement:
    -  * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -  * Data Geekery grants the Customer the non-exclusive, timely limited and
    -  * non-transferable license to install and use the Software under the terms of
    -  * the jOOQ License and Maintenance Agreement.
    -  *
    -  * This library is distributed with a LIMITED WARRANTY. See the jOOQ License
    -  * and Maintenance Agreement for more details: http://www.jooq.org/licensing
    -  -->
    -<xsl:stylesheet version="1.0"
    -	xmlns:fo="http://www.w3.org/1999/XSL/Format"
    -	xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    -
    -	<xsl:output encoding="UTF-8" method="xml" indent="yes"/>
    -
    -	<xsl:variable name="apos">&apos;</xsl:variable>
    -	<xsl:variable name="page-width">210</xsl:variable>
    -	<xsl:variable name="page-margin">17</xsl:variable>
    -	<xsl:variable name="content-width" select="$page-width - (2 * $page-margin)"/>
    -
    -	<xsl:attribute-set name="static">
    -		<xsl:attribute name="font-size">7pt</xsl:attribute>
    -		<xsl:attribute name="color">#555555</xsl:attribute>
    -	</xsl:attribute-set>
    -
    -	<xsl:attribute-set name="div">
    -		<xsl:attribute name="font-size">11pt</xsl:attribute>
    -	</xsl:attribute-set>
    -
    -	<xsl:attribute-set name="pre">
    -		<xsl:attribute name="font-family">Courier</xsl:attribute>
    -		<xsl:attribute name="linefeed-treatment">preserve</xsl:attribute>
    -		<xsl:attribute name="white-space-collapse">false</xsl:attribute>
    -		<xsl:attribute name="white-space-treatment">preserve</xsl:attribute>
    -		<xsl:attribute name="font-size">6pt</xsl:attribute>
    -		<xsl:attribute name="margin-top">15pt</xsl:attribute>
    -        <xsl:attribute name="margin-bottom">15pt</xsl:attribute>
    -        <xsl:attribute name="margin-left">3pt</xsl:attribute>
    -        <xsl:attribute name="margin-right">3pt</xsl:attribute>
    -		<xsl:attribute name="padding">4pt</xsl:attribute>
    -        <xsl:attribute name="color">#eeeeee</xsl:attribute>
    -		<xsl:attribute name="background-color">#333333</xsl:attribute>
    -		<xsl:attribute name="page-break-inside">avoid</xsl:attribute>
    -	</xsl:attribute-set>
    -
    -	<xsl:attribute-set name="strong">
    -		<xsl:attribute name="font-weight">bold</xsl:attribute>
    -	</xsl:attribute-set>
    -
    -	<xsl:attribute-set name="h1">
    -		<xsl:attribute name="font-family">Roboto</xsl:attribute>
    -		<xsl:attribute name="font-size">22pt</xsl:attribute>
    -        <xsl:attribute name="font-weight">300</xsl:attribute>
    -		<xsl:attribute name="padding-top">24pt</xsl:attribute>
    -		<xsl:attribute name="padding-bottom">24pt</xsl:attribute>
    -		<xsl:attribute name="page-break-after">avoid</xsl:attribute>
    -	</xsl:attribute-set>
    -
    -	<xsl:attribute-set name="h2">
    -		<xsl:attribute name="font-family">Roboto</xsl:attribute>
    -		<xsl:attribute name="font-size">16pt</xsl:attribute>
    -        <xsl:attribute name="font-weight">300</xsl:attribute>
    -		<xsl:attribute name="padding-top">15pt</xsl:attribute>
    -		<xsl:attribute name="padding-bottom">15pt</xsl:attribute>
    -		<xsl:attribute name="page-break-after">avoid</xsl:attribute>
    -	</xsl:attribute-set>
    -
    -	<xsl:attribute-set name="h3">
    -		<xsl:attribute name="font-family">Roboto</xsl:attribute>
    -		<xsl:attribute name="font-size">15pt</xsl:attribute>
    -        <xsl:attribute name="font-weight">300</xsl:attribute>
    -		<xsl:attribute name="padding-top">15pt</xsl:attribute>
    -		<xsl:attribute name="padding-bottom">15pt</xsl:attribute>
    -		<xsl:attribute name="page-break-after">avoid</xsl:attribute>
    -	</xsl:attribute-set>
    -
    -	<xsl:attribute-set name="a">
    -		<xsl:attribute name="font-size">11pt</xsl:attribute>
    -		<xsl:attribute name="font-weight">bold</xsl:attribute>
    -        <xsl:attribute name="text-decoration">underline</xsl:attribute>
    -        <xsl:attribute name="color">#3333ee</xsl:attribute>
    -	</xsl:attribute-set>
    -
    -	<xsl:attribute-set name="p">
    -		<xsl:attribute name="font-size">11pt</xsl:attribute>
    -		<xsl:attribute name="text-align">justify</xsl:attribute>
    -	</xsl:attribute-set>
    -
    -	<xsl:attribute-set name="ul">
    -		<xsl:attribute name="padding-top">16pt</xsl:attribute>
    -		<xsl:attribute name="padding-bottom">16pt</xsl:attribute>
    -		<xsl:attribute name="page-break-inside">avoid</xsl:attribute>
    -	</xsl:attribute-set>
    -
    -	<xsl:attribute-set name="ol-toc">
    -		<xsl:attribute name="margin-bottom">3pt</xsl:attribute>
    -	</xsl:attribute-set>
    -
    -	<xsl:attribute-set name="ol">
    -		<xsl:attribute name="padding-top">16pt</xsl:attribute>
    -		<xsl:attribute name="padding-bottom">16pt</xsl:attribute>
    -	</xsl:attribute-set>
    -
    -	<xsl:attribute-set name="li-toc">
    -		<xsl:attribute name="font-size">9pt</xsl:attribute>
    -		<xsl:attribute name="page-break-inside">avoid</xsl:attribute>
    -	</xsl:attribute-set>
    -
    -	<xsl:attribute-set name="li">
    -		<xsl:attribute name="font-size">11pt</xsl:attribute>
    -		<xsl:attribute name="page-break-inside">avoid</xsl:attribute>
    -	</xsl:attribute-set>
    -
    -	<xsl:attribute-set name="img">
    -		<xsl:attribute name="padding-top">10pt</xsl:attribute>
    -		<xsl:attribute name="padding-bottom">10pt</xsl:attribute>
    -	</xsl:attribute-set>
    -
    -	<!-- Main match -->
    -
    -	<xsl:template match="/">
    -		<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
    -			<fo:layout-master-set>
    -			    <fo:simple-page-master
    -			        page-height="297mm"
    -			        page-width="{$page-width}mm"
    -					master-name="simple">
    -
    -         			<fo:region-body
    -						region-name="xsl-region-body"
    -            			margin="{$page-margin}mm" />
    -					<fo:region-before
    -            			region-name="xsl-region-before"
    -            			extent="{$page-margin}mm" />
    -         			<fo:region-after
    -						region-name="xsl-region-after"
    -          				extent="{$page-margin}mm" />
    -      			</fo:simple-page-master>
    -   			</fo:layout-master-set>
    -
    -   			<fo:page-sequence master-reference="simple">
    -   				<fo:flow flow-name="xsl-region-body" font-family="Open Sans" font-weight="300">
    -   					<fo:block width="100%" margin-left="20mm" margin-right="20mm" font-family="Roboto" font-weight="300">
    -	   					<fo:block width="100%" text-align="center" font-size="36pt" padding-top="60mm">
    -	   						<xsl:text>The jOOQâ„¢ User Manual</xsl:text>
    -	   					</fo:block>
    -	   					<fo:block width="100%" text-align="justify" font-size="12pt" color="#555555" padding-top="20mm">
    -	   						<xsl:text>SQL was never meant to be abstracted. To be confined in the narrow
    -	   						boundaries of heavy mappers, hiding the beauty and simplicity of relational data.
    -	   						SQL was never meant to be object-oriented. SQL was never meant to be anything
    -	   						other than... SQL!</xsl:text>
    -	   					</fo:block>
    -	   					<fo:block width="100%" text-align="center" padding-top="20mm">
    -	   						<fo:external-graphic
    -	   							src="url('C:/Users/lukas/workspace/jOOQ/jOOQ-website/img/jooq-logo-black.png')"
    -								xsl:use-attribute-sets="img"/>
    -	   					</fo:block>
    -   					</fo:block>
    -   				</fo:flow>
    -   			</fo:page-sequence>
    -
    -   			<fo:page-sequence master-reference="simple">
    -   				<fo:static-content flow-name="xsl-region-before" font-family="Open Sans" font-weight="300">
    -   					<fo:block>
    -	   					<fo:table table-layout="fixed" width="100%">
    -							<fo:table-column column-width="proportional-column-width(1)"/>
    -							<fo:table-column column-width="150mm"/>
    -
    -							<fo:table-body>
    -							  	<fo:table-row>
    -							    	<fo:table-cell padding-left="{$page-margin}mm" padding-top="{$page-margin * 2 div 3}mm">
    -							      		<fo:block xsl:use-attribute-sets="static">
    -							      			<xsl:text>
    -							      			The jOOQ User Manual
    -							      			</xsl:text>
    -							      		</fo:block>
    -							    	</fo:table-cell>
    -							    	<fo:table-cell padding-right="{$page-margin}mm" padding-top="{$page-margin * 2 div 3}mm" text-align="right">
    -							     		<fo:block xsl:use-attribute-sets="static">
    -							     			<fo:retrieve-marker retrieve-class-name="section"/>
    -							     		</fo:block>
    -							    	</fo:table-cell>
    -							  	</fo:table-row>
    -							</fo:table-body>
    -						</fo:table>
    -   					</fo:block>
    -   				</fo:static-content>
    -
    -   				<fo:static-content flow-name="xsl-region-after" font-family="Open Sans" font-weight="300">
    -   					<fo:block>
    -			      		<fo:table table-layout="fixed" width="100%">
    -							<fo:table-column column-width="150mm"/>
    -							<fo:table-column column-width="proportional-column-width(1)"/>
    -
    -							<fo:table-body>
    -							  	<fo:table-row>
    -							    	<fo:table-cell padding-left="{$page-margin}mm">
    -							      		<fo:block xsl:use-attribute-sets="static">
    -							      			<xsl:text>
    -							      			    © 2009 - 2013 by Data Geekery™ GmbH. All rights reserved. 
    -							      			</xsl:text>
    -							      		</fo:block>
    -							    	</fo:table-cell>
    -							    	<fo:table-cell padding-right="{$page-margin}mm" text-align="right">
    -							     		<fo:block xsl:use-attribute-sets="static">
    -							     			<xsl:text>Page&#160;</xsl:text>
    -							     			<fo:page-number/>
    -							     			<xsl:text>&#160;/&#160;</xsl:text>
    -							     			<fo:page-number-citation ref-id="last-page"/>
    -							     		</fo:block>
    -							    	</fo:table-cell>
    -							  	</fo:table-row>
    -							</fo:table-body>
    -						</fo:table>
    -					</fo:block>
    -			    </fo:static-content>
    -
    -      			<fo:flow flow-name="xsl-region-body" font-family="Open Sans" font-weight="300">
    -					<!-- Display the main section's content -->
    -					<xsl:apply-templates select="/manual/section/content"/>
    -
    -					<!-- Display the overall table of contents -->
    -					<fo:block break-after='page'/>
    -					<fo:block xsl:use-attribute-sets="h3">Table of contents</fo:block>
    -					<xsl:apply-templates select="/manual/section" mode="toc"/>
    -
    -					<xsl:for-each select="/manual/section//section">
    -						<!-- Break before top-level chapters -->
    -						<xsl:variable name="id" select="@id"/>
    -						<xsl:if test="/manual/section/sections/section[@id = $id]">
    -							<fo:block break-after='page'/>
    -						</xsl:if>
    -
    -						<fo:block xsl:use-attribute-sets="h1" id="{@id}">
    -							<fo:marker marker-class-name="section">
    -								<fo:block>
    -									<xsl:apply-templates select="." mode="chapter-number"/>
    -									<xsl:text> </xsl:text>
    -									<xsl:value-of select="title"/>
    -								</fo:block>
    -							</fo:marker>
    -
    -							<xsl:apply-templates select="." mode="chapter-number"/>
    -							<xsl:text> </xsl:text>
    -							<xsl:value-of select="title"/>
    -						</fo:block>
    -
    -						<xsl:apply-templates select="content" />
    -					</xsl:for-each>
    -
    -					<fo:block id="last-page"/>
    -      			</fo:flow>
    -  			</fo:page-sequence>
    -		</fo:root>
    -	</xsl:template>
    -
    -	<xsl:template match="html-only" mode="content"/>
    -
    -    <xsl:template match="content">
    -        <xsl:apply-templates select="@*|node()" mode="content"/>
    -    </xsl:template>
    -
    -    <xsl:template match="html" mode="content">
    -        <xsl:apply-templates select="@*|node()" mode="content"/>
    -    </xsl:template>
    -
    -	<xsl:template match="div" mode="content">
    -		<fo:block xsl:use-attribute-sets="div">
    -			<xsl:apply-templates mode="content"/>
    -		</fo:block>
    -	</xsl:template>
    -
    -	<xsl:template match="h1" mode="content">
    -		<fo:block xsl:use-attribute-sets="h1">
    -			<xsl:apply-templates mode="content"/>
    -		</fo:block>
    -	</xsl:template>
    -
    -	<xsl:template match="h2" mode="content">
    -		<fo:block xsl:use-attribute-sets="h2">
    -			<xsl:apply-templates mode="content"/>
    -		</fo:block>
    -	</xsl:template>
    -
    -	<xsl:template match="h3" mode="content">
    -		<fo:block xsl:use-attribute-sets="h3">
    -			<xsl:apply-templates mode="content"/>
    -		</fo:block>
    -	</xsl:template>
    -
    -	<xsl:template match="a" mode="content">
    -		<fo:basic-link xsl:use-attribute-sets="a">
    -			<xsl:attribute name="external-destination">
    -				<xsl:text>url('</xsl:text>
    -				<xsl:value-of select="@href"/>
    -				<xsl:text>')</xsl:text>
    -			</xsl:attribute>
    -
    -			<xsl:apply-templates mode="content"/>
    -		</fo:basic-link>
    -	</xsl:template>
    -
    -	<xsl:template match="reference[@id]" mode="content">
    -		<fo:basic-link xsl:use-attribute-sets="a" internal-destination="{@id}">
    -			<xsl:apply-templates select="." mode="reference-content"/>
    -		</fo:basic-link>
    -	</xsl:template>
    -
    -	<xsl:template match="reference[@class and starts-with(@class, 'org.jooq.test')]" mode="content">
    -		<fo:basic-link xsl:use-attribute-sets="a">
    -			<xsl:attribute name="external-destination">
    -				<xsl:text>url('</xsl:text>
    -				<xsl:text>https://github.com/jOOQ/jOOQ/blob/master/jOOQ-test/src/</xsl:text>
    -				<xsl:value-of select="translate(@class, '.', '/')"/>
    -				<xsl:text>.java</xsl:text>
    -				<xsl:value-of select="@anchor"/>
    -				<xsl:text>')</xsl:text>
    -			</xsl:attribute>
    -
    -			<xsl:apply-templates select="." mode="reference-content"/>
    -		</fo:basic-link>
    -	</xsl:template>
    -
    -	<xsl:template match="reference[@class and starts-with(@class, 'org.jooq.debug')]" mode="content">
    -		<fo:basic-link xsl:use-attribute-sets="a">
    -			<xsl:attribute name="external-destination">
    -				<xsl:text>url('</xsl:text>
    -				<xsl:text>https://github.com/jOOQ/jOOQ/blob/master/jOOQ-console/src/main/java/</xsl:text>
    -				<xsl:value-of select="translate(@class, '.', '/')"/>
    -				<xsl:text>.java</xsl:text>
    -				<xsl:value-of select="@anchor"/>
    -				<xsl:text>')</xsl:text>
    -			</xsl:attribute>
    -
    -			<xsl:apply-templates select="." mode="reference-content"/>
    -		</fo:basic-link>
    -	</xsl:template>
    -
    -	<xsl:template match="reference[@class and starts-with(@class, 'org.jooq')]" mode="content">
    -		<fo:basic-link xsl:use-attribute-sets="a">
    -			<xsl:attribute name="external-destination">
    -				<xsl:text>url('</xsl:text>
    -				<xsl:text>http://www.jooq.org/javadoc/latest/</xsl:text>
    -				<xsl:value-of select="translate(@class, '.', '/')"/>
    -				<xsl:text>.html</xsl:text>
    -				<xsl:value-of select="@anchor"/>
    -				<xsl:text>')</xsl:text>
    -			</xsl:attribute>
    -
    -			<xsl:apply-templates select="." mode="reference-content"/>
    -		</fo:basic-link>
    -	</xsl:template>
    -
    -	<xsl:template match="reference[@class and starts-with(@class, 'javax.persistence')]" mode="content">
    -		<fo:basic-link xsl:use-attribute-sets="a">
    -			<xsl:attribute name="external-destination">
    -				<xsl:text>url('</xsl:text>
    -				<xsl:text>http://docs.oracle.com/javaee/6/api/</xsl:text>
    -				<xsl:value-of select="translate(@class, '.', '/')"/>
    -				<xsl:text>.html</xsl:text>
    -				<xsl:value-of select="@anchor"/>
    -				<xsl:text>')</xsl:text>
    -			</xsl:attribute>
    -
    -			<xsl:apply-templates select="." mode="reference-content"/>
    -		</fo:basic-link>
    -	</xsl:template>
    -
    -	<xsl:template match="reference[@class and (starts-with(@class, 'java') or starts-with(@class, 'org.w3c.dom'))]" mode="content">
    -		<fo:basic-link xsl:use-attribute-sets="a">
    -			<xsl:attribute name="external-destination">
    -				<xsl:text>url('</xsl:text>
    -				<xsl:text>http://download.oracle.com/javase/6/docs/api/</xsl:text>
    -				<xsl:value-of select="translate(@class, '.', '/')"/>
    -				<xsl:text>.html</xsl:text>
    -				<xsl:value-of select="@anchor"/>
    -				<xsl:text>')</xsl:text>
    -			</xsl:attribute>
    -
    -			<xsl:apply-templates select="." mode="reference-content"/>
    -		</fo:basic-link>
    -	</xsl:template>
    -
    -	<xsl:template match="reference[@ticket]" mode="content">
    -		<fo:basic-link xsl:use-attribute-sets="a">
    -			<xsl:attribute name="external-destination">
    -				<xsl:text>url('</xsl:text>
    -				<xsl:text>https://github.com/jOOQ/jOOQ/issues/</xsl:text>
    -				<xsl:value-of select="@ticket"/>
    -				<xsl:value-of select="@anchor"/>
    -				<xsl:text>')</xsl:text>
    -			</xsl:attribute>
    -
    -			<xsl:apply-templates select="." mode="reference-content"/>
    -		</fo:basic-link>
    -	</xsl:template>
    -
    -	<xsl:template match="reference" mode="reference-content">
    -		<xsl:variable name="id" select="@id"/>
    -
    -		<xsl:choose>
    -			<xsl:when test="@title">
    -				<xsl:value-of select="@title"/>
    -			</xsl:when>
    -			<xsl:when test="@id">
    -				<xsl:value-of select="//section[@id = $id]/title"/>
    -			</xsl:when>
    -			<xsl:when test="@class">
    -				<xsl:value-of select="@class"/>
    -			</xsl:when>
    -			<xsl:when test="@ticket">
    -				<xsl:text>#</xsl:text>
    -				<xsl:value-of select="@ticket"/>
    -			</xsl:when>
    -		</xsl:choose>
    -	</xsl:template>
    -
    -	<xsl:template match="img" mode="content">
    -		<fo:block text-align="center">
    -			<fo:external-graphic
    -				src="url('C:/Users/lukas/workspace/jOOQ/jOOQ-website/img/{substring-after(@src, 'img/')}')"
    -				xsl:use-attribute-sets="img"/>
    -		</fo:block>
    -	</xsl:template>
    -
    -	<xsl:template match="p" mode="content">
    -		<fo:block xsl:use-attribute-sets="p">
    -			<xsl:if test="following-sibling::node()[name(.) = 'p']">
    -				<xsl:attribute name="margin-bottom">6pt</xsl:attribute>
    -			</xsl:if>
    -			
    -			<xsl:apply-templates mode="content"/>
    -		</fo:block>
    -	</xsl:template>
    -
    -	<xsl:template match="ul" mode="content">
    -		<fo:block xsl:use-attribute-sets="ul">
    -			<fo:list-block>
    -				<xsl:apply-templates mode="content" />
    -			</fo:list-block>
    -		</fo:block>
    -	</xsl:template>
    -
    -	<xsl:template match="ol" mode="content">
    -		<fo:block xsl:use-attribute-sets="ol">
    -			<fo:list-block>
    -				<xsl:apply-templates mode="content" />
    -			</fo:list-block>
    -		</fo:block>
    -	</xsl:template>
    -
    -	<xsl:template match="li" mode="content">
    -		<fo:list-item>
    -			<fo:list-item-label>
    -				<fo:block xsl:use-attribute-sets="li">
    -					<xsl:choose>
    -						<xsl:when test="count(ancestor::ul)=1">-</xsl:when>
    -						<xsl:when test="count(ancestor::ul)=2">*</xsl:when>
    -						<xsl:otherwise>o</xsl:otherwise>
    -					</xsl:choose>
    -				</fo:block>
    -			</fo:list-item-label>
    -			<fo:list-item-body start-indent="body-start()">
    -				<fo:block xsl:use-attribute-sets="li">
    -					<xsl:apply-templates mode="content" />
    -				</fo:block>
    -			</fo:list-item-body>
    -		</fo:list-item>
    -	</xsl:template>
    -
    -	<xsl:template match="br" mode="content">
    -		<fo:block/>
    -	</xsl:template>
    -
    -	<xsl:template match="strong" mode="content">
    -		<fo:inline xsl:use-attribute-sets="strong">
    -			<xsl:apply-templates mode="content" />
    -		</fo:inline>
    -	</xsl:template>
    -
    -	<xsl:template match="code-pair" mode="content">
    -		<fo:table table-layout="fixed" width="100%">
    -			<fo:table-column column-width="{$content-width div 2}mm"/>
    -			<fo:table-column column-width="{$content-width div 2}mm"/>
    -
    -			<fo:table-body>
    -			  	<fo:table-row>
    -			    	<fo:table-cell>
    -			      		<fo:block>
    -			      			<xsl:apply-templates select="*[position() = 1]" mode="content" />
    -			      		</fo:block>
    -			    	</fo:table-cell>
    -			    	<fo:table-cell>
    -			     		<fo:block>
    -			     			<xsl:apply-templates select="*[position() = 2]" mode="content" />
    -			     		</fo:block>
    -			    	</fo:table-cell>
    -			  	</fo:table-row>
    -			</fo:table-body>
    -		</fo:table>
    -	</xsl:template>
    -
    -	<xsl:template match="java | scala | sql | xml | text | config" mode="content">
    -		<fo:block xsl:use-attribute-sets="pre">
    -			<xsl:apply-templates mode="content" />
    -        </fo:block>
    -	</xsl:template>
    -
    -	<!-- Ignore code blocks, render contents as such -->
    -	<xsl:template match="code" mode="content">
    -		<xsl:apply-templates mode="content"/>
    -	</xsl:template>
    -
    -	<xsl:template match="@*|node()" mode="content">
    -		<xsl:copy>
    -            <xsl:apply-templates select="@*|node()" mode="content"/>
    -        </xsl:copy>
    -    </xsl:template>
    -
    -   	<xsl:template match="section" mode="toc">
    -   		<xsl:for-each select=".//section">
    -			<fo:block xsl:use-attribute-sets="ol-toc">
    -				<fo:list-block>
    -					<fo:list-item>
    -		          		<fo:list-item-label>
    -		          			<fo:block xsl:use-attribute-sets="li-toc">
    -	            			</fo:block>
    -		          		</fo:list-item-label>
    -		          		<fo:list-item-body>
    -		          			<fo:block xsl:use-attribute-sets="li-toc">
    -		          				<fo:block text-align-last="justify">
    -			          				<fo:inline>
    -			          					<fo:basic-link internal-destination="{@id}">
    -					          				<xsl:apply-templates select="." mode="chapter-number"/>
    -					          				<xsl:text>  </xsl:text>
    -					            			<xsl:value-of select="title" />
    -					            			<fo:leader leader-pattern="dots"/>
    -					            			<fo:page-number-citation ref-id="{@id}"/>
    -				            			</fo:basic-link>
    -			          				</fo:inline>
    -		          				</fo:block>
    -		            		</fo:block>
    -		          		</fo:list-item-body>
    -		        	</fo:list-item>
    -				</fo:list-block>
    -			</fo:block>
    -   		</xsl:for-each>
    -	</xsl:template>
    -
    -	<xsl:template match="section" mode="chapter-number">
    -		<xsl:if test="@id != 'manual'">
    -			<xsl:apply-templates select="../.." mode="chapter-number"/>
    -
    -			<xsl:value-of select="count(preceding-sibling::section) + 1"/>
    -			<xsl:text>.</xsl:text>
    -		</xsl:if>
    -	</xsl:template>
    -</xsl:stylesheet>
    \ No newline at end of file
    diff --git a/jOOQ-website/src/main/resources/roboto.xml b/jOOQ-website/src/main/resources/roboto.xml
    deleted file mode 100644
    index 526756b793..0000000000
    --- a/jOOQ-website/src/main/resources/roboto.xml
    +++ /dev/null
    @@ -1 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Roboto-Light</font-name><full-name>Roboto Light</full-name><family-name>Roboto</family-name><embed/><cap-height>710</cap-height><x-height>528</x-height><ascender>761</ascender><descender>-203</descender><bbox><left>-744</left><bottom>-270</bottom><right>1146</right><top>1047</top></bbox><flags>33</flags><stemv>0</stemv><italicangle>0</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="2" ue="13" us="13"/><bf gi="3" ue="32" us="32"/><bf gi="1039" ue="33" us="33"/><bf gi="4" ue="126" us="34"/><bf gi="481" ue="160" us="160"/><bf gi="97" ue="172" us="161"/><bf gi="482" ue="173" us="173"/><bf gi="109" ue="191" us="174"/><bf gi="488" ue="197" us="192"/><bf gi="127" ue="198" us="198"/><bf gi="495" ue="207" us="199"/><bf gi="484" ue="208" us="208"/><bf gi="504" ue="214" us="209"/><bf gi="128" ue="216" us="215"/><bf gi="510" ue="221" us="217"/><bf gi="130" ue="223" us="222"/><bf gi="515" ue="229" us="224"/><bf gi="132" ue="230" us="230"/><bf gi="522" ue="239" us="231"/><bf gi="133" ue="240" us="240"/><bf gi="531" ue="246" us="241"/><bf gi="134" ue="248" us="247"/><bf gi="537" ue="253" us="249"/><bf gi="136" ue="254" us="254"/><bf gi="542" ue="271" us="255"/><bf gi="483" ue="272" us="272"/><bf gi="997" ue="273" us="273"/><bf gi="559" ue="293" us="274"/><bf gi="137" ue="294" us="294"/><bf gi="485" ue="295" us="295"/><bf gi="579" ue="304" us="296"/><bf gi="138" ue="305" us="305"/><bf gi="588" ue="311" us="306"/><bf gi="139" ue="312" us="312"/><bf gi="594" ue="320" us="313"/><bf gi="140" ue="322" us="321"/><bf gi="602" ue="329" us="323"/><bf gi="142" ue="331" us="330"/><bf gi="609" ue="337" us="332"/><bf gi="144" ue="339" us="338"/><bf gi="615" ue="351" us="340"/><bf gi="629" ue="355" us="352"/><bf gi="635" ue="357" us="356"/><bf gi="486" ue="359" us="358"/><bf gi="637" ue="382" us="360"/><bf gi="146" ue="383" us="383"/><bf gi="147" ue="402" us="402"/><bf gi="148" ue="417" us="416"/><bf gi="150" ue="432" us="431"/><bf gi="839" ue="496" us="496"/><bf gi="494" ue="506" us="506"/><bf gi="521" ue="507" us="507"/><bf gi="660" ue="511" us="508"/><bf gi="627" ue="537" us="536"/><bf gi="633" ue="539" us="538"/><bf gi="152" ue="567" us="567"/><bf gi="153" ue="601" us="601"/><bf gi="840" ue="700" us="700"/><bf gi="154" ue="711" us="710"/><bf gi="110" ue="713" us="713"/><bf gi="156" ue="733" us="728"/><bf gi="162" ue="755" us="755"/><bf gi="163" ue="769" us="768"/><bf gi="165" ue="771" us="771"/><bf gi="166" ue="777" us="777"/><bf gi="167" ue="783" us="783"/><bf gi="168" ue="803" us="803"/><bf gi="169" ue="901" us="900"/><bf gi="751" ue="902" us="902"/><bf gi="171" ue="903" us="903"/><bf gi="752" ue="906" us="904"/><bf gi="755" ue="908" us="908"/><bf gi="756" ue="914" us="910"/><bf gi="172" ue="916" us="915"/><bf gi="761" ue="919" us="917"/><bf gi="174" ue="920" us="920"/><bf gi="764" ue="922" us="921"/><bf gi="175" ue="923" us="923"/><bf gi="766" ue="925" us="924"/><bf gi="176" ue="926" us="926"/><bf gi="768" ue="927" us="927"/><bf gi="177" ue="928" us="928"/><bf gi="769" ue="929" us="929"/><bf gi="178" ue="931" us="931"/><bf gi="770" ue="933" us="932"/><bf gi="179" ue="934" us="934"/><bf gi="772" ue="935" us="935"/><bf gi="180" ue="937" us="936"/><bf gi="773" ue="944" us="938"/><bf gi="182" ue="953" us="945"/><bf gi="780" ue="954" us="954"/><bf gi="191" ue="955" us="955"/><bf gi="782" ue="957" us="956"/><bf gi="192" ue="958" us="958"/><bf gi="781" ue="959" us="959"/><bf gi="193" ue="969" us="960"/><bf gi="784" ue="974" us="970"/><bf gi="203" ue="978" us="977"/><bf gi="205" ue="982" us="982"/><bf gi="848" ue="1024" us="1024"/><bf gi="789" ue="1025" us="1025"/><bf gi="206" ue="1026" us="1026"/><bf gi="790" ue="1027" us="1027"/><bf gi="207" ue="1028" us="1028"/><bf gi="791" ue="1032" us="1029"/><bf gi="208" ue="1035" us="1033"/><bf gi="796" ue="1036" us="1036"/><bf gi="849" ue="1037" us="1037"/><bf gi="797" ue="1038" us="1038"/><bf gi="211" ue="1039" us="1039"/><bf gi="798" ue="1040" us="1040"/><bf gi="212" ue="1041" us="1041"/><bf gi="799" ue="1043" us="1042"/><bf gi="213" ue="1044" us="1044"/><bf gi="801" ue="1045" us="1045"/><bf gi="214" ue="1048" us="1046"/><bf gi="802" ue="1049" us="1049"/><bf gi="795" ue="1050" us="1050"/><bf gi="217" ue="1051" us="1051"/><bf gi="803" ue="1058" us="1052"/><bf gi="218" ue="1060" us="1059"/><bf gi="810" ue="1061" us="1061"/><bf gi="220" ue="1071" us="1062"/><bf gi="811" ue="1072" us="1072"/><bf gi="230" ue="1076" us="1073"/><bf gi="812" ue="1077" us="1077"/><bf gi="234" ue="1080" us="1078"/><bf gi="813" ue="1081" us="1081"/><bf gi="237" ue="1085" us="1082"/><bf gi="814" ue="1086" us="1086"/><bf gi="241" ue="1087" us="1087"/><bf gi="815" ue="1089" us="1088"/><bf gi="242" ue="1090" us="1090"/><bf gi="817" ue="1091" us="1091"/><bf gi="243" ue="1092" us="1092"/><bf gi="818" ue="1093" us="1093"/><bf gi="244" ue="1103" us="1094"/><bf gi="850" ue="1104" us="1104"/><bf gi="819" ue="1105" us="1105"/><bf gi="254" ue="1106" us="1106"/><bf gi="820" ue="1107" us="1107"/><bf gi="255" ue="1108" us="1108"/><bf gi="821" ue="1112" us="1109"/><bf gi="256" ue="1115" us="1113"/><bf gi="825" ue="1116" us="1116"/><bf gi="851" ue="1117" us="1117"/><bf gi="826" ue="1118" us="1118"/><bf gi="259" ue="1121" us="1119"/><bf gi="1019" ue="1122" us="1122"/><bf gi="262" ue="1135" us="1123"/><bf gi="852" ue="1137" us="1136"/><bf gi="275" ue="1141" us="1138"/><bf gi="854" ue="1143" us="1142"/><bf gi="857" ue="1144" us="1144"/><bf gi="856" ue="1145" us="1145"/><bf gi="279" ue="1158" us="1146"/><bf gi="292" ue="1161" us="1160"/><bf gi="1024" ue="1163" us="1162"/><bf gi="1018" ue="1164" us="1164"/><bf gi="294" ue="1169" us="1165"/><bf gi="1020" ue="1171" us="1170"/><bf gi="299" ue="1173" us="1172"/><bf gi="1013" ue="1175" us="1174"/><bf gi="858" ue="1177" us="1176"/><bf gi="999" ue="1179" us="1178"/><bf gi="301" ue="1181" us="1180"/><bf gi="1022" ue="1183" us="1182"/><bf gi="303" ue="1185" us="1184"/><bf gi="1001" ue="1187" us="1186"/><bf gi="305" ue="1193" us="1188"/><bf gi="860" ue="1195" us="1194"/><bf gi="1003" ue="1197" us="1196"/><bf gi="862" ue="1199" us="1198"/><bf gi="1032" ue="1201" us="1200"/><bf gi="1005" ue="1203" us="1202"/><bf gi="311" ue="1205" us="1204"/><bf gi="1007" ue="1207" us="1206"/><bf gi="313" ue="1210" us="1208"/><bf gi="1017" ue="1211" us="1211"/><bf gi="316" ue="1213" us="1212"/><bf gi="1015" ue="1215" us="1214"/><bf gi="864" ue="1218" us="1216"/><bf gi="318" ue="1220" us="1219"/><bf gi="1030" ue="1222" us="1221"/><bf gi="320" ue="1224" us="1223"/><bf gi="1026" ue="1226" us="1225"/><bf gi="1009" ue="1228" us="1227"/><bf gi="1028" ue="1230" us="1229"/><bf gi="867" ue="1239" us="1231"/><bf gi="322" ue="1241" us="1240"/><bf gi="876" ue="1247" us="1242"/><bf gi="324" ue="1249" us="1248"/><bf gi="882" ue="1269" us="1250"/><bf gi="1011" ue="1271" us="1270"/><bf gi="902" ue="1273" us="1272"/><bf gi="326" ue="1275" us="1274"/><bf gi="904" ue="1277" us="1276"/><bf gi="1034" ue="1279" us="1278"/><bf gi="328" ue="1280" us="1280"/><bf gi="906" ue="1281" us="1281"/><bf gi="329" ue="1296" us="1282"/><bf gi="1036" ue="1297" us="1297"/><bf gi="907" ue="1299" us="1298"/><bf gi="843" ue="7681" us="7680"/><bf gi="841" ue="7743" us="7742"/><bf gi="827" ue="7813" us="7808"/><bf gi="909" ue="7921" us="7840"/><bf gi="833" ue="7923" us="7922"/><bf gi="991" ue="7929" us="7924"/><bf gi="845" ue="8013" us="8013"/><bf gi="344" ue="8203" us="8192"/><bf gi="356" ue="8212" us="8211"/><bf gi="1038" ue="8213" us="8213"/><bf gi="358" ue="8222" us="8215"/><bf gi="366" ue="8226" us="8224"/><bf gi="369" ue="8230" us="8229"/><bf gi="371" ue="8240" us="8240"/><bf gi="835" ue="8243" us="8242"/><bf gi="372" ue="8250" us="8249"/><bf gi="837" ue="8252" us="8252"/><bf gi="374" ue="8260" us="8260"/><bf gi="375" ue="8308" us="8308"/><bf gi="376" ue="8319" us="8319"/><bf gi="1037" ue="8355" us="8355"/><bf gi="377" ue="8356" us="8356"/><bf gi="378" ue="8359" us="8359"/><bf gi="998" ue="8363" us="8363"/><bf gi="379" ue="8364" us="8364"/><bf gi="380" ue="8453" us="8453"/><bf gi="381" ue="8467" us="8467"/><bf gi="382" ue="8470" us="8470"/><bf gi="383" ue="8482" us="8482"/><bf gi="181" ue="8486" us="8486"/><bf gi="384" ue="8494" us="8494"/><bf gi="385" ue="8542" us="8539"/><bf gi="389" ue="8706" us="8706"/><bf gi="173" ue="8710" us="8710"/><bf gi="390" ue="8719" us="8719"/><bf gi="391" ue="8722" us="8721"/><bf gi="393" ue="8730" us="8730"/><bf gi="394" ue="8734" us="8734"/><bf gi="395" ue="8747" us="8747"/><bf gi="396" ue="8776" us="8776"/><bf gi="397" ue="8800" us="8800"/><bf gi="398" ue="8805" us="8804"/><bf gi="400" ue="9674" us="9674"/><bf gi="401" ue="63171" us="63171"/><bf gi="402" ue="64257" us="64257"/><bf gi="838" ue="64258" us="64258"/><bf gi="846" ue="64260" us="64259"/><bf gi="403" ue="65279" us="65279"/><bf gi="404" ue="65533" us="65532"/><bf gi="0" ue="65535" us="65535"/></bfranges><cid-widths start-index="0"><wx w="243"/><wx w="0"/><wx w="243"/><wx w="243"/><wx w="287"/><wx w="620"/><wx w="554"/><wx w="739"/><wx w="615"/><wx w="169"/><wx w="312"/><wx w="318"/><wx w="424"/><wx w="564"/><wx w="191"/><wx w="286"/><wx w="238"/><wx w="396"/><wx w="583"/><wx w="554"/><wx w="554"/><wx w="554"/><wx w="554"/><wx w="554"/><wx w="554"/><wx w="554"/><wx w="554"/><wx w="554"/><wx w="211"/><wx w="213"/><wx w="511"/><wx w="560"/><wx w="518"/><wx w="454"/><wx w="913"/><wx w="624"/><wx w="619"/><wx w="641"/><wx w="656"/><wx w="576"/><wx w="576"/><wx w="684"/><wx w="707"/><wx w="270"/><wx w="550"/><wx w="638"/><wx w="526"/><wx w="866"/><wx w="709"/><wx w="672"/><wx w="618"/><wx w="673"/><wx w="658"/><wx w="601"/><wx w="592"/><wx w="670"/><wx w="616"/><wx w="895"/><wx w="613"/><wx w="607"/><wx w="597"/><wx w="239"/><wx w="394"/><wx w="239"/><wx w="416"/><wx w="431"/><wx w="285"/><wx w="537"/><wx w="556"/><wx w="518"/><wx w="556"/><wx w="515"/><wx w="328"/><wx w="557"/><wx w="556"/><wx w="227"/><wx w="236"/><wx w="491"/><wx w="227"/><wx w="886"/><wx w="556"/><wx w="556"/><wx w="556"/><wx w="556"/><wx w="340"/><wx w="509"/><wx w="332"/><wx w="556"/><wx w="489"/><wx w="756"/><wx w="489"/><wx w="489"/><wx w="489"/><wx w="330"/><wx w="220"/><wx w="330"/><wx w="684"/><wx w="220"/><wx w="544"/><wx w="571"/><wx w="723"/><wx w="597"/><wx w="216"/><wx w="604"/><wx w="468"/><wx w="799"/><wx w="442"/><wx w="455"/><wx w="545"/><wx w="801"/><wx w="426"/><wx w="377"/><wx w="530"/><wx w="407"/><wx w="416"/><wx w="281"/><wx w="556"/><wx w="475"/><wx w="245"/><wx w="243"/><wx w="249"/><wx w="450"/><wx w="453"/><wx w="762"/><wx w="765"/><wx w="835"/><wx w="467"/><wx w="910"/><wx w="523"/><wx w="673"/><wx w="592"/><wx w="585"/><wx w="845"/><wx w="581"/><wx w="568"/><wx w="557"/><wx w="562"/><wx w="689"/><wx w="222"/><wx w="542"/><wx w="521"/><wx w="258"/><wx w="700"/><wx w="556"/><wx w="934"/><wx w="923"/><wx w="227"/><wx w="327"/><wx w="697"/><wx w="559"/><wx w="681"/><wx w="590"/><wx w="228"/><wx w="515"/><wx w="429"/><wx w="408"/><wx w="422"/><wx w="237"/><wx w="330"/><wx w="250"/><wx w="435"/><wx w="377"/><wx w="319"/><wx w="0"/><wx w="0"/><wx w="0"/><wx w="0"/><wx w="0"/><wx w="0"/><wx w="253"/><wx w="479"/><wx w="245"/><wx w="551"/><wx w="696"/><wx w="673"/><wx w="647"/><wx w="559"/><wx w="707"/><wx w="559"/><wx w="714"/><wx w="694"/><wx w="654"/><wx w="562"/><wx w="592"/><wx w="489"/><wx w="556"/><wx w="543"/><wx w="498"/><wx w="556"/><wx w="573"/><wx w="299"/><wx w="556"/><wx w="510"/><wx w="595"/><wx w="556"/><wx w="534"/><wx w="556"/><wx w="511"/><wx w="556"/><wx w="685"/><wx w="533"/><wx w="683"/><wx w="858"/><wx w="614"/><wx w="536"/><wx w="786"/><wx w="744"/><wx w="660"/><wx w="1076"/><wx w="1079"/><wx w="804"/><wx w="705"/><wx w="627"/><wx w="723"/><wx w="879"/><wx w="594"/><wx w="709"/><wx w="702"/><wx w="627"/><wx w="742"/><wx w="713"/><wx w="665"/><wx w="925"/><wx w="942"/><wx w="774"/><wx w="834"/><wx w="612"/><wx w="660"/><wx w="910"/><wx w="611"/><wx w="550"/><wx w="559"/><wx w="421"/><wx w="573"/><wx w="767"/><wx w="506"/><wx w="562"/><wx w="518"/><wx w="562"/><wx w="730"/><wx w="562"/><wx w="562"/><wx w="483"/><wx w="724"/><wx w="569"/><wx w="532"/><wx w="793"/><wx w="802"/><wx w="629"/><wx w="750"/><wx w="535"/><wx w="534"/><wx w="812"/><wx w="542"/><wx w="557"/><wx w="534"/><wx w="854"/><wx w="861"/><wx w="557"/><wx w="562"/><wx w="887"/><wx w="823"/><wx w="534"/><wx w="893"/><wx w="743"/><wx w="600"/><wx w="527"/><wx w="877"/><wx w="752"/><wx w="814"/><wx w="706"/><wx w="1081"/><wx w="927"/><wx w="514"/><wx w="484"/><wx w="673"/><wx w="565"/><wx w="615"/><wx w="492"/><wx w="673"/><wx w="557"/><wx w="882"/><wx w="798"/><wx w="887"/><wx w="823"/><wx w="632"/><wx w="522"/><wx w="609"/><wx w="0"/><wx w="0"/><wx w="0"/><wx w="0"/><wx w="0"/><wx w="0"/><wx w="534"/><wx w="631"/><wx w="564"/><wx w="548"/><wx w="437"/><wx w="577"/><wx w="497"/><wx w="613"/><wx w="540"/><wx w="807"/><wx w="659"/><wx w="1007"/><wx w="724"/><wx w="1019"/><wx w="852"/><wx w="743"/><wx w="593"/><wx w="868"/><wx w="653"/><wx w="663"/><wx w="549"/><wx w="663"/><wx w="754"/><wx w="589"/><wx w="613"/><wx w="527"/><wx w="704"/><wx w="556"/><wx w="699"/><wx w="528"/><wx w="575"/><wx w="575"/><wx w="568"/><wx w="411"/><wx w="572"/><wx w="780"/><wx w="858"/><wx w="789"/><wx w="643"/><wx w="533"/><wx w="500"/><wx w="966"/><wx w="804"/><wx w="974"/><wx w="826"/><wx w="617"/><wx w="511"/><wx w="707"/><wx w="638"/><wx w="660"/><wx w="509"/><wx w="1020"/><wx w="509"/><wx w="1020"/><wx w="340"/><wx w="254"/><wx w="169"/><wx w="562"/><wx w="273"/><wx w="204"/><wx w="102"/><wx w="0"/><wx w="690"/><wx w="813"/><wx w="453"/><wx w="177"/><wx w="177"/><wx w="172"/><wx w="178"/><wx w="298"/><wx w="301"/><wx w="289"/><wx w="550"/><wx w="563"/><wx w="323"/><wx w="453"/><wx w="641"/><wx w="975"/><wx w="297"/><wx w="297"/><wx w="448"/><wx w="454"/><wx w="420"/><wx w="571"/><wx w="817"/><wx w="523"/><wx w="735"/><wx w="465"/><wx w="1096"/><wx w="617"/><wx w="633"/><wx w="830"/><wx w="895"/><wx w="916"/><wx w="846"/><wx w="578"/><wx w="657"/><wx w="577"/><wx w="570"/><wx w="545"/><wx w="1056"/><wx w="253"/><wx w="563"/><wx w="513"/><wx w="520"/><wx w="519"/><wx w="504"/><wx w="237"/><wx w="537"/><wx w="0"/><wx w="1022"/><wx w="1025"/><wx w="550"/><wx w="453"/><wx w="566"/><wx w="369"/><wx w="374"/><wx w="227"/><wx w="236"/><wx w="197"/><wx w="452"/><wx w="436"/><wx w="438"/><wx w="434"/><wx w="504"/><wx w="432"/><wx w="420"/><wx w="452"/><wx w="221"/><wx w="574"/><wx w="547"/><wx w="563"/><wx w="571"/><wx w="520"/><wx w="507"/><wx w="590"/><wx w="606"/><wx w="222"/><wx w="495"/><wx w="535"/><wx w="453"/><wx w="732"/><wx w="628"/><wx w="598"/><wx w="605"/><wx w="571"/><wx w="547"/><wx w="511"/><wx w="621"/><wx w="581"/><wx w="758"/><wx w="577"/><wx w="539"/><wx w="523"/><wx w="551"/><wx w="279"/><wx w="473"/><wx w="497"/><wx w="537"/><wx w="505"/><wx w="513"/><wx w="562"/><wx w="515"/><wx w="516"/><wx w="253"/><wx w="401"/><wx w="415"/><wx w="426"/><wx w="425"/><wx w="428"/><wx w="367"/><wx w="432"/><wx w="424"/><wx w="452"/><wx w="421"/><wx w="330"/><wx w="375"/><wx w="568"/><wx w="577"/><wx w="568"/><wx w="493"/><wx w="526"/><wx w="593"/><wx w="568"/><wx w="547"/><wx w="583"/><wx w="422"/><wx w="243"/><wx w="286"/><wx w="670"/><wx w="670"/><wx w="571"/><wx w="592"/><wx w="332"/><wx w="624"/><wx w="624"/><wx w="624"/><wx w="624"/><wx w="624"/><wx w="624"/><wx w="624"/><wx w="641"/><wx w="576"/><wx w="576"/><wx w="576"/><wx w="576"/><wx w="270"/><wx w="270"/><wx w="270"/><wx w="270"/><wx w="709"/><wx w="672"/><wx w="672"/><wx w="672"/><wx w="672"/><wx w="672"/><wx w="670"/><wx w="670"/><wx w="670"/><wx w="670"/><wx w="607"/><wx w="537"/><wx w="537"/><wx w="537"/><wx w="537"/><wx w="537"/><wx w="537"/><wx w="537"/><wx w="518"/><wx w="515"/><wx w="515"/><wx w="515"/><wx w="515"/><wx w="222"/><wx w="222"/><wx w="222"/><wx w="222"/><wx w="556"/><wx w="556"/><wx w="556"/><wx w="556"/><wx w="556"/><wx w="556"/><wx w="556"/><wx w="556"/><wx w="556"/><wx w="556"/><wx w="489"/><wx w="489"/><wx w="624"/><wx w="537"/><wx w="624"/><wx w="537"/><wx w="624"/><wx w="537"/><wx w="641"/><wx w="518"/><wx w="641"/><wx w="518"/><wx w="641"/><wx w="518"/><wx w="641"/><wx w="518"/><wx w="656"/><wx w="629"/><wx w="576"/><wx w="515"/><wx w="576"/><wx w="515"/><wx w="576"/><wx w="515"/><wx w="576"/><wx w="515"/><wx w="576"/><wx w="515"/><wx w="684"/><wx w="557"/><wx w="684"/><wx w="557"/><wx w="684"/><wx w="557"/><wx w="684"/><wx w="557"/><wx w="707"/><wx w="556"/><wx w="270"/><wx w="222"/><wx w="270"/><wx w="222"/><wx w="270"/><wx w="222"/><wx w="270"/><wx w="227"/><wx w="270"/><wx w="820"/><wx w="463"/><wx w="550"/><wx w="228"/><wx w="638"/><wx w="491"/><wx w="526"/><wx w="227"/><wx w="526"/><wx w="227"/><wx w="526"/><wx w="300"/><wx w="526"/><wx w="334"/><wx w="709"/><wx w="556"/><wx w="709"/><wx w="556"/><wx w="709"/><wx w="556"/><wx w="556"/><wx w="672"/><wx w="556"/><wx w="672"/><wx w="556"/><wx w="672"/><wx w="556"/><wx w="658"/><wx w="340"/><wx w="658"/><wx w="340"/><wx w="658"/><wx w="340"/><wx w="601"/><wx w="509"/><wx w="601"/><wx w="509"/><wx w="601"/><wx w="509"/><wx w="601"/><wx w="509"/><wx w="601"/><wx w="509"/><wx w="592"/><wx w="332"/><wx w="592"/><wx w="332"/><wx w="592"/><wx w="351"/><wx w="670"/><wx w="556"/><wx w="670"/><wx w="556"/><wx w="670"/><wx w="556"/><wx w="670"/><wx w="556"/><wx w="670"/><wx w="556"/><wx w="670"/><wx w="556"/><wx w="895"/><wx w="756"/><wx w="607"/><wx w="489"/><wx w="607"/><wx w="597"/><wx w="489"/><wx w="597"/><wx w="489"/><wx w="597"/><wx w="489"/><wx w="910"/><wx w="845"/><wx w="673"/><wx w="557"/><wx w="571"/><wx w="571"/><wx w="511"/><wx w="574"/><wx w="574"/><wx w="574"/><wx w="574"/><wx w="574"/><wx w="574"/><wx w="574"/><wx w="563"/><wx w="520"/><wx w="520"/><wx w="520"/><wx w="520"/><wx w="222"/><wx w="222"/><wx w="222"/><wx w="222"/><wx w="628"/><wx w="598"/><wx w="598"/><wx w="598"/><wx w="598"/><wx w="598"/><wx w="621"/><wx w="621"/><wx w="621"/><wx w="621"/><wx w="539"/><wx w="574"/><wx w="574"/><wx w="574"/><wx w="563"/><wx w="563"/><wx w="563"/><wx w="563"/><wx w="571"/><wx w="520"/><wx w="520"/><wx w="520"/><wx w="520"/><wx w="520"/><wx w="590"/><wx w="590"/><wx w="590"/><wx w="590"/><wx w="606"/><wx w="222"/><wx w="222"/><wx w="222"/><wx w="222"/><wx w="222"/><wx w="495"/><wx w="535"/><wx w="453"/><wx w="453"/><wx w="453"/><wx w="453"/><wx w="628"/><wx w="628"/><wx w="628"/><wx w="598"/><wx w="598"/><wx w="598"/><wx w="571"/><wx w="571"/><wx w="571"/><wx w="547"/><wx w="547"/><wx w="547"/><wx w="547"/><wx w="511"/><wx w="511"/><wx w="621"/><wx w="621"/><wx w="621"/><wx w="621"/><wx w="621"/><wx w="621"/><wx w="758"/><wx w="539"/><wx w="539"/><wx w="523"/><wx w="523"/><wx w="523"/><wx w="1095"/><wx w="624"/><wx w="625"/><wx w="755"/><wx w="319"/><wx w="682"/><wx w="656"/><wx w="664"/><wx w="299"/><wx w="624"/><wx w="619"/><wx w="576"/><wx w="597"/><wx w="707"/><wx w="270"/><wx w="638"/><wx w="866"/><wx w="709"/><wx w="672"/><wx w="618"/><wx w="592"/><wx w="607"/><wx w="613"/><wx w="270"/><wx w="607"/><wx w="562"/><wx w="543"/><wx w="556"/><wx w="299"/><wx w="556"/><wx w="542"/><wx w="556"/><wx w="556"/><wx w="489"/><wx w="299"/><wx w="556"/><wx w="556"/><wx w="556"/><wx w="858"/><wx w="576"/><wx w="551"/><wx w="601"/><wx w="270"/><wx w="270"/><wx w="550"/><wx w="638"/><wx w="638"/><wx w="627"/><wx w="624"/><wx w="619"/><wx w="551"/><wx w="576"/><wx w="709"/><wx w="866"/><wx w="707"/><wx w="672"/><wx w="707"/><wx w="618"/><wx w="641"/><wx w="592"/><wx w="613"/><wx w="537"/><wx w="515"/><wx w="562"/><wx w="556"/><wx w="556"/><wx w="518"/><wx w="489"/><wx w="489"/><wx w="515"/><wx w="421"/><wx w="509"/><wx w="227"/><wx w="222"/><wx w="236"/><wx w="518"/><wx w="489"/><wx w="895"/><wx w="756"/><wx w="895"/><wx w="756"/><wx w="895"/><wx w="756"/><wx w="607"/><wx w="489"/><wx w="169"/><wx w="287"/><wx w="451"/><wx w="555"/><wx w="228"/><wx w="177"/><wx w="866"/><wx w="886"/><wx w="624"/><wx w="537"/><wx w="672"/><wx w="865"/><wx w="884"/><wx w="576"/><wx w="709"/><wx w="515"/><wx w="562"/><wx w="694"/><wx w="683"/><wx w="615"/><wx w="492"/><wx w="1045"/><wx w="1162"/><wx w="594"/><wx w="506"/><wx w="641"/><wx w="518"/><wx w="607"/><wx w="489"/><wx w="270"/><wx w="879"/><wx w="767"/><wx w="270"/><wx w="624"/><wx w="537"/><wx w="624"/><wx w="537"/><wx w="910"/><wx w="845"/><wx w="576"/><wx w="515"/><wx w="699"/><wx w="528"/><wx w="879"/><wx w="767"/><wx w="594"/><wx w="506"/><wx w="709"/><wx w="562"/><wx w="709"/><wx w="562"/><wx w="672"/><wx w="556"/><wx w="673"/><wx w="565"/><wx w="673"/><wx w="565"/><wx w="660"/><wx w="534"/><wx w="627"/><wx w="489"/><wx w="627"/><wx w="489"/><wx w="627"/><wx w="489"/><wx w="665"/><wx w="532"/><wx w="834"/><wx w="750"/><wx w="613"/><wx w="489"/><wx w="556"/><wx w="702"/><wx w="562"/><wx w="624"/><wx w="537"/><wx w="624"/><wx w="537"/><wx w="624"/><wx w="537"/><wx w="624"/><wx w="537"/><wx w="624"/><wx w="537"/><wx w="624"/><wx w="537"/><wx w="624"/><wx w="537"/><wx w="624"/><wx w="537"/><wx w="624"/><wx w="537"/><wx w="624"/><wx w="537"/><wx w="624"/><wx w="537"/><wx w="624"/><wx w="537"/><wx w="576"/><wx w="515"/><wx w="576"/><wx w="515"/><wx w="576"/><wx w="515"/><wx w="576"/><wx w="515"/><wx w="576"/><wx w="515"/><wx w="576"/><wx w="515"/><wx w="576"/><wx w="515"/><wx w="576"/><wx w="515"/><wx w="270"/><wx w="222"/><wx w="270"/><wx w="227"/><wx w="672"/><wx w="556"/><wx w="672"/><wx w="556"/><wx w="672"/><wx w="556"/><wx w="672"/><wx w="556"/><wx w="672"/><wx w="556"/><wx w="672"/><wx w="556"/><wx w="672"/><wx w="556"/><wx w="697"/><wx w="559"/><wx w="697"/><wx w="559"/><wx w="697"/><wx w="559"/><wx w="697"/><wx w="559"/><wx w="697"/><wx w="559"/><wx w="670"/><wx w="556"/><wx w="670"/><wx w="556"/><wx w="681"/><wx w="590"/><wx w="681"/><wx w="590"/><wx w="681"/><wx w="590"/><wx w="681"/><wx w="590"/><wx w="681"/><wx w="590"/><wx w="607"/><wx w="489"/><wx w="607"/><wx w="489"/><wx w="607"/><wx w="489"/><wx w="571"/><wx w="571"/><wx w="638"/><wx w="518"/><wx w="707"/><wx w="562"/><wx w="592"/><wx w="483"/><wx w="613"/><wx w="489"/><wx w="665"/><wx w="532"/><wx w="665"/><wx w="532"/><wx w="551"/><wx w="421"/><wx w="879"/><wx w="767"/><wx w="754"/><wx w="589"/><wx w="556"/><wx w="612"/><wx w="612"/><wx w="551"/><wx w="421"/><wx w="648"/><wx w="500"/><wx w="709"/><wx w="562"/><wx w="707"/><wx w="562"/><wx w="866"/><wx w="730"/><wx w="702"/><wx w="562"/><wx w="607"/><wx w="489"/><wx w="613"/><wx w="489"/><wx w="543"/><wx w="576"/><wx w="813"/><wx w="225"/></cid-widths></multibyte-extras></font-metrics>
    \ No newline at end of file
    diff --git a/jOOQ-website/tutorial.php b/jOOQ-website/tutorial.php
    deleted file mode 100644
    index e7c1c01b43..0000000000
    --- a/jOOQ-website/tutorial.php
    +++ /dev/null
    @@ -1,4 +0,0 @@
    -<?php
    -require 'conf.php';
    -header('Location: ' . $root . '/doc/' . $minorVersion . '/manual/getting-started/tutorials/jooq-in-7-steps');
    -?>
    \ No newline at end of file
    diff --git a/jOOQ-website/users.csv b/jOOQ-website/users.csv
    deleted file mode 100644
    index e69de29bb2..0000000000
    diff --git a/jOOQ-website/xsd/.htaccess b/jOOQ-website/xsd/.htaccess
    deleted file mode 100644
    index 2f134288fc..0000000000
    --- a/jOOQ-website/xsd/.htaccess
    +++ /dev/null
    @@ -1 +0,0 @@
    -Options +Indexes
    \ No newline at end of file
    diff --git a/jOOQ-website/xsd/jooq-codegen-2.0.4.xsd b/jOOQ-website/xsd/jooq-codegen-2.0.4.xsd
    deleted file mode 100644
    index 3662d820dd..0000000000
    --- a/jOOQ-website/xsd/jooq-codegen-2.0.4.xsd
    +++ /dev/null
    @@ -1,313 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?>
    -<schema xmlns="http://www.w3.org/2001/XMLSchema"
    -    xmlns:tns="http://www.jooq.org/xsd/jooq-codegen-2.0.4.xsd"
    -    targetNamespace="http://www.jooq.org/xsd/jooq-codegen-2.0.4.xsd"
    -    elementFormDefault="qualified">
    -
    -    <element name="configuration">
    -        <complexType>
    -            <all>
    -                <!--
    -                  The JDBC configuration element contains information about how
    -                  to set up the database connection used for source code generation
    -                  -->
    -                <element name="jdbc" type="tns:Jdbc" minOccurs="1"
    -                    maxOccurs="1" />
    -
    -                <!--
    -                  The GENERATOR configuration element contains information about
    -                  source code generation itself
    -                  -->
    -                <element name="generator" type="tns:Generator" minOccurs="1"
    -                    maxOccurs="1" />
    -            </all>
    -        </complexType>
    -    </element>
    -
    -    <complexType name="Jdbc">
    -        <all>
    -            <!-- The JDBC driver -->
    -            <element name="driver" type="string" minOccurs="1" maxOccurs="1" />
    -
    -            <!-- The JDBC connection URL -->
    -            <element name="url" type="string" minOccurs="1" maxOccurs="1" />
    -
    -            <!-- Deprecated. Use database schema configuration elements instead -->
    -            <element name="schema" type="string" minOccurs="0" maxOccurs="1" />
    -
    -            <!--
    -              The JDBC connection user. Be sure this user has all required
    -              GRANTs to the dictionary views/tables to generate the desired artefacts
    -              -->
    -            <element name="user" type="string" minOccurs="0" maxOccurs="1" />
    -
    -            <!-- The JDBC connection password -->
    -            <element name="password" type="string" minOccurs="0" maxOccurs="1" />
    -        </all>
    -    </complexType>
    -
    -    <complexType name="Generator">
    -        <all>
    -            <!--
    -             The class used to generate source code. You may override this with
    -             your custom source code generator
    -             -->
    -            <element name="name" type="string" default="org.jooq.util.DefaultGenerator"
    -                minOccurs="0" maxOccurs="1" />
    -
    -            <!-- The naming strategy used for class and field names -->
    -            <element name="strategy" type="tns:Strategy" minOccurs="0" maxOccurs="1" />
    -
    -            <!-- The jooq-meta configuration -->
    -            <element name="database" type="tns:Database" minOccurs="1" maxOccurs="1" />
    -
    -            <!-- The jooq-codegen configuration -->
    -            <element name="generate" type="tns:Generate" minOccurs="0" maxOccurs="1" />
    -
    -            <!-- Some information about generation output -->
    -            <element name="target" type="tns:Target" minOccurs="0" maxOccurs="1" />
    -        </all>
    -    </complexType>
    -
    -    <complexType name="Strategy">
    -        <all>
    -            <!--
    -              The class used to provide a naming strategy for generated source
    -              code. You may override this with your custom naming strategy
    -              -->
    -            <element name="name" type="string" minOccurs="0" maxOccurs="1"
    -                default="org.jooq.util.DefaultGeneratorStrategy" />
    -        </all>
    -    </complexType>
    -
    -    <complexType name="Database">
    -        <all>
    -            <!--
    -              The database dialect from jooq-meta. Available dialects are
    -              named org.util.[database].[database]Database. Known values are:
    -
    -              org.jooq.util.ase.ASEDatabase
    -              org.jooq.util.db2.DB2Database
    -              org.jooq.util.derby.DerbyDatabase
    -              org.jooq.util.h2.H2Database
    -              org.jooq.util.hsqldb.HSQLDBDatabase
    -              org.jooq.util.ingres.IngresDatabase
    -              org.jooq.util.mysql.MySQLDatabase
    -              org.jooq.util.oracle.OracleDatabase
    -              org.jooq.util.postgres.PostgresDatabase
    -              org.jooq.util.sqlite.SQLiteDatabaes
    -              org.jooq.util.sqlserver.SQLServerDatabase
    -              org.jooq.util.sybase.SybaseDatabase
    -
    -              You can also provide your own org.jooq.util.Database implementation
    -              here, if your database is currently not supported
    -              -->
    -            <element name="name" type="string" minOccurs="1" maxOccurs="1" />
    -
    -            <!--
    -              All elements that are generated from your schema (several Java
    -              regular expressions, separated by comma) Watch out for
    -              case-sensitivity. Depending on your database, this might be
    -              important! You can create case-insensitive regular expressions
    -              using this syntax: (?i:expr)A comma-separated list of regular
    -              expressions
    -              -->
    -            <element name="includes" type="string" default=".*" minOccurs="0" maxOccurs="1" />
    -
    -            <!--
    -              All elements that are excluded from your schema (several Java
    -              regular expressions, separated by comma). Excludes match before
    -              includes
    -              -->
    -            <element name="excludes" type="string" default="" minOccurs="0" maxOccurs="1" />
    -
    -            <!--
    -              Generate java.sql.Timestamp fields for DATE columns. This is
    -              particularly useful for Oracle databases
    -              -->
    -            <element name="dateAsTimestamp" type="boolean" default="false" minOccurs="0" maxOccurs="1" />
    -
    -            <!--
    -              Generate jOOU data types for your unsigned data types, which are
    -              not natively supported in Java
    -              -->
    -            <element name="unsignedTypes" type="boolean" default="true" minOccurs="0" maxOccurs="1" />
    -
    -            <!--
    -              The schema that is used locally as a source for meta information.
    -              This could be your development schema or the production schema, etc
    -              This cannot be combined with the schemata element.
    -              For backwards compatibility, this defaults to jdbc/schema
    -              -->
    -            <element name="inputSchema" type="string" default="" minOccurs="0" maxOccurs="1" />
    -
    -            <!--
    -              The schema that is used in generated source code. This will be the
    -              production schema. Use this to override your local development
    -              schema name for source code generation. If not specified, this
    -              will be the same as the input-schema.
    -              -->
    -            <element name="outputSchema" type="string" default="" minOccurs="0" maxOccurs="1" />
    -
    -            <!--
    -              A configuration element to configure several input and/or output
    -              schemata for jooq-meta, in case you're using jooq-meta in a multi-
    -              schema environment
    -              -->
    -            <element name="schemata" type="tns:Schemata" minOccurs="0" maxOccurs="1"/>
    -
    -            <!--
    -              A configuration element to configure master data table enum classes
    -              -->
    -            <element name="masterDataTables" type="tns:MasterDataTables" minOccurs="0" maxOccurs="1"/>
    -
    -            <!--
    -              A configuration element to configure synthetic enum types
    -              This is EXPERIMENTAL functionality. Use at your own risk
    -              -->
    -            <element name="enumTypes" type="tns:EnumTypes" minOccurs="0" maxOccurs="1"/>
    -
    -            <!--
    -              A configuration element to configure type overrides for generated
    -              artefacts (e.g. in combination with enumTypes)
    -              This is EXPERIMENTAL functionality. Use at your own risk
    -              -->
    -            <element name="forcedTypes" type="tns:ForcedTypes" minOccurs="0" maxOccurs="1"/>
    -        </all>
    -    </complexType>
    -
    -    <complexType name="Schemata">
    -        <sequence>
    -            <!--
    -              A configuration element for a single schema in multi-schema
    -              environments
    -              -->
    -            <element name="schema" type="tns:Schema" minOccurs="1" maxOccurs="unbounded"/>
    -        </sequence>
    -    </complexType>
    -
    -    <complexType name="Schema">
    -        <all>
    -            <!-- See also database/inputSchema -->
    -            <element name="inputSchema" type="string" default="" minOccurs="1" maxOccurs="1" />
    -
    -            <!-- See also database/outputSchema -->
    -            <element name="outputSchema" type="string" default="" minOccurs="0" maxOccurs="1" />
    -        </all>
    -    </complexType>
    -
    -    <complexType name="MasterDataTables">
    -        <sequence>
    -            <!-- A configuration element for a master data table -->
    -            <element name="masterDataTable" type="tns:MasterDataTable" minOccurs="0" maxOccurs="unbounded" />
    -        </sequence>
    -    </complexType>
    -
    -    <complexType name="EnumTypes">
    -        <sequence>
    -            <!-- A configuration element for a synthetic enum type -->
    -            <element name="enumType" type="tns:EnumType" minOccurs="0" maxOccurs="unbounded" />
    -        </sequence>
    -    </complexType>
    -
    -    <complexType name="ForcedTypes">
    -        <sequence>
    -            <!-- A configuration element for a forced type override -->
    -            <element name="forcedType" type="tns:ForcedType" minOccurs="0" maxOccurs="unbounded" />
    -        </sequence>
    -    </complexType>
    -
    -    <complexType name="MasterDataTable">
    -        <all>
    -            <!-- The name of a master data table -->
    -            <element name="name" type="string" minOccurs="1" maxOccurs="1" />
    -
    -            <!-- The column used for enum literals -->
    -            <element name="literal" type="string" minOccurs="0" maxOccurs="1" />
    -
    -            <!-- The column used for documentation -->
    -            <element name="description" type="string" minOccurs="0" maxOccurs="1" />
    -        </all>
    -    </complexType>
    -
    -    <complexType name="EnumType">
    -        <all>
    -            <!-- The name of the synthetic enum type -->
    -            <element name="name" type="string" minOccurs="1" maxOccurs="1" />
    -
    -            <!-- A comma separated (CSV format) list of enum literals -->
    -            <element name="literals" type="string" minOccurs="1" maxOccurs="1" />
    -        </all>
    -    </complexType>
    -
    -    <complexType name="ForcedType">
    -        <all>
    -            <!-- The name of the type to be forced upon various artefacts -->
    -            <element name="name" type="string" minOccurs="1" maxOccurs="1" />
    -
    -            <!--
    -              A comma-separated list of Java regular expressions matching
    -              columns, parameters, attributes, etc to be forced to have this
    -              type
    -              -->
    -            <element name="expressions" type="string" minOccurs="1" maxOccurs="1" />
    -        </all>
    -    </complexType>
    -
    -    <complexType name="Generate">
    -        <all>
    -            <!--
    -              Primary key / foreign key relations should be generated and used.
    -              This is a prerequisite for various advanced features
    -              -->
    -            <element name="relations" type="boolean" default="false" minOccurs="0" maxOccurs="1" />
    -
    -            <!--
    -              Generate navigation methods to navigate foreign key relationships
    -              directly from Record classes. This is only relevant if relations
    -              is set to true, too
    -              -->
    -            <element name="navigationMethods" type="boolean" default="true" minOccurs="0" maxOccurs="1" />
    -
    -            <!-- Generate deprecated code for backwards compatibility -->
    -            <element name="deprecated" type="boolean" default="true" minOccurs="0" maxOccurs="1" />
    -
    -            <!--
    -              Generate instance fields in your tables, as opposed to static
    -              fields. This simplifies aliasing
    -              -->
    -            <element name="instanceFields" type="boolean" default="true" minOccurs="0" maxOccurs="1" />
    -
    -            <!--
    -              Generate the javax.annotation.Generated annotation to indicate
    -              jOOQ version used for source code
    -              -->
    -            <element name="generatedAnnotation" type="boolean" default="true" minOccurs="0" maxOccurs="1" />
    -
    -            <!--
    -              Generate POJOs in addition to Record classes for usage of the
    -              ResultQuery.fetchInto(Class) API
    -              -->
    -            <element name="pojos" type="boolean" default="false" minOccurs="0" maxOccurs="1" />
    -
    -            <!--
    -              Annotate POJOs and Records with JPA annotations for increased
    -              compatibility and better integration with JPA/Hibernate, etc
    -              -->
    -            <element name="jpaAnnotations" type="boolean" default="false" minOccurs="0" maxOccurs="1" />
    -        </all>
    -    </complexType>
    -
    -    <complexType name="Target">
    -        <all>
    -            <!--
    -              The destination package of your generated classes (within the
    -              destination directory)
    -              -->
    -            <element name="packageName" type="string" default="org.jooq.generated" minOccurs="0" maxOccurs="1" />
    -
    -            <!-- The destination directory of your generated classes -->
    -            <element name="directory" type="string" default="target/generated-sources/jooq" />
    -        </all>
    -    </complexType>
    -</schema>
    \ No newline at end of file
    diff --git a/jOOQ-website/xsd/jooq-codegen-2.1.0.xsd b/jOOQ-website/xsd/jooq-codegen-2.1.0.xsd
    deleted file mode 100644
    index 11e36fdf2c..0000000000
    --- a/jOOQ-website/xsd/jooq-codegen-2.1.0.xsd
    +++ /dev/null
    @@ -1,362 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?>
    -<schema xmlns="http://www.w3.org/2001/XMLSchema"
    -  xmlns:tns="http://www.jooq.org/xsd/jooq-codegen-2.1.0.xsd"
    -  targetNamespace="http://www.jooq.org/xsd/jooq-codegen-2.1.0.xsd"
    -  elementFormDefault="qualified">
    -
    -  <element name="configuration">
    -    <complexType>
    -      <all>
    -        <!--
    -          The JDBC configuration element contains information about how
    -          to set up the database connection used for source code generation
    -          -->
    -        <element name="jdbc" type="tns:Jdbc" minOccurs="1"
    -          maxOccurs="1" />
    -
    -        <!--
    -          The GENERATOR configuration element contains information about
    -          source code generation itself
    -          -->
    -        <element name="generator" type="tns:Generator" minOccurs="1"
    -          maxOccurs="1" />
    -      </all>
    -    </complexType>
    -  </element>
    -
    -  <complexType name="Jdbc">
    -    <all>
    -      <!-- The JDBC driver -->
    -      <element name="driver" type="string" minOccurs="1" maxOccurs="1" />
    -
    -      <!-- The JDBC connection URL -->
    -      <element name="url" type="string" minOccurs="1" maxOccurs="1" />
    -
    -      <!-- Deprecated. Use database schema configuration elements instead -->
    -      <element name="schema" type="string" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        The JDBC connection user. Be sure this user has all required
    -        GRANTs to the dictionary views/tables to generate the desired artefacts
    -        -->
    -      <element name="user" type="string" minOccurs="0" maxOccurs="1" />
    -
    -      <!-- The JDBC connection password -->
    -      <element name="password" type="string" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Enlist custom JDBC driver properties that are provided to the
    -        java.sql.DriverManager when fetching a connection
    -        -->
    -      <element name="properties" type="tns:Properties" minOccurs="0" maxOccurs="1" />
    -    </all>
    -  </complexType>
    -
    -  <complexType name="Properties">
    -    <sequence>
    -      <element name="property" type="tns:Property" minOccurs="0" maxOccurs="unbounded"/>
    -    </sequence>
    -  </complexType>
    -
    -  <complexType name="Property">
    -    <all>
    -      <element name="key" type="string" minOccurs="1" maxOccurs="1"/>
    -      <element name="value" type="string" minOccurs="1" maxOccurs="1"/>
    -    </all>
    -  </complexType>
    -
    -  <complexType name="Generator">
    -    <all>
    -      <!--
    -       The class used to generate source code. You may override this with
    -       your custom source code generator
    -       -->
    -      <element name="name" type="string" default="org.jooq.util.DefaultGenerator"
    -        minOccurs="0" maxOccurs="1" />
    -
    -      <!-- The naming strategy used for class and field names -->
    -      <element name="strategy" type="tns:Strategy" minOccurs="0" maxOccurs="1" />
    -
    -      <!-- The jooq-meta configuration -->
    -      <element name="database" type="tns:Database" minOccurs="1" maxOccurs="1" />
    -
    -      <!-- The jooq-codegen configuration -->
    -      <element name="generate" type="tns:Generate" minOccurs="0" maxOccurs="1" />
    -
    -      <!-- Some information about generation output -->
    -      <element name="target" type="tns:Target" minOccurs="0" maxOccurs="1" />
    -    </all>
    -  </complexType>
    -
    -  <complexType name="Strategy">
    -    <all>
    -      <!--
    -        The class used to provide a naming strategy for generated source
    -        code. You may override this with your custom naming strategy
    -        -->
    -      <element name="name" type="string" minOccurs="0" maxOccurs="1"
    -        default="org.jooq.util.DefaultGeneratorStrategy" />
    -    </all>
    -  </complexType>
    -
    -  <complexType name="Database">
    -    <all>
    -      <!--
    -        The database dialect from jooq-meta. Available dialects are
    -        named org.util.[database].[database]Database. Known values are:
    -
    -        org.jooq.util.ase.ASEDatabase
    -        org.jooq.util.db2.DB2Database
    -        org.jooq.util.derby.DerbyDatabase
    -        org.jooq.util.h2.H2Database
    -        org.jooq.util.hsqldb.HSQLDBDatabase
    -        org.jooq.util.ingres.IngresDatabase
    -        org.jooq.util.mysql.MySQLDatabase
    -        org.jooq.util.oracle.OracleDatabase
    -        org.jooq.util.postgres.PostgresDatabase
    -        org.jooq.util.sqlite.SQLiteDatabaes
    -        org.jooq.util.sqlserver.SQLServerDatabase
    -        org.jooq.util.sybase.SybaseDatabase
    -
    -        You can also provide your own org.jooq.util.Database implementation
    -        here, if your database is currently not supported
    -        -->
    -      <element name="name" type="string" minOccurs="1" maxOccurs="1" />
    -
    -      <!--
    -        All elements that are generated from your schema (several Java
    -        regular expressions, separated by comma) Watch out for
    -        case-sensitivity. Depending on your database, this might be
    -        important! You can create case-insensitive regular expressions
    -        using this syntax: (?i:expr)A comma-separated list of regular
    -        expressions
    -        -->
    -      <element name="includes" type="string" default=".*" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        All elements that are excluded from your schema (several Java
    -        regular expressions, separated by comma). Excludes match before
    -        includes
    -        -->
    -      <element name="excludes" type="string" default="" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Generate java.sql.Timestamp fields for DATE columns. This is
    -        particularly useful for Oracle databases
    -        -->
    -      <element name="dateAsTimestamp" type="boolean" default="false" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Generate jOOU data types for your unsigned data types, which are
    -        not natively supported in Java
    -        -->
    -      <element name="unsignedTypes" type="boolean" default="true" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        The schema that is used locally as a source for meta information.
    -        This could be your development schema or the production schema, etc
    -        This cannot be combined with the schemata element.
    -        For backwards compatibility, this defaults to jdbc/schema
    -        -->
    -      <element name="inputSchema" type="string" default="" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        The schema that is used in generated source code. This will be the
    -        production schema. Use this to override your local development
    -        schema name for source code generation. If not specified, this
    -        will be the same as the input-schema.
    -        -->
    -      <element name="outputSchema" type="string" default="" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        A configuration element to configure several input and/or output
    -        schemata for jooq-meta, in case you're using jooq-meta in a multi-
    -        schema environment
    -        -->
    -      <element name="schemata" type="tns:Schemata" minOccurs="0" maxOccurs="1"/>
    -
    -      <!--
    -        A configuration element to configure master data table enum classes
    -        -->
    -      <element name="masterDataTables" type="tns:MasterDataTables" minOccurs="0" maxOccurs="1"/>
    -
    -      <!--
    -        A configuration element to configure custom types introduced to jOOQ
    -        using converters
    -        This is EXPERIMENTAL functionality. Use at your own risk
    -        -->
    -      <element name="customTypes" type="tns:CustomTypes" minOccurs="0" maxOccurs="1"/>
    -
    -      <!--
    -        A configuration element to configure synthetic enum types
    -        This is EXPERIMENTAL / DEPRECATED functionality. Do not re-use
    -        -->
    -      <element name="enumTypes" type="tns:EnumTypes" minOccurs="0" maxOccurs="1"/>
    -
    -      <!--
    -        A configuration element to configure type overrides for generated
    -        artefacts (e.g. in combination with enumTypes)
    -        This is EXPERIMENTAL functionality. Use at your own risk
    -        -->
    -      <element name="forcedTypes" type="tns:ForcedTypes" minOccurs="0" maxOccurs="1"/>
    -    </all>
    -  </complexType>
    -
    -  <complexType name="Schemata">
    -    <sequence>
    -      <!--
    -        A configuration element for a single schema in multi-schema
    -        environments
    -        -->
    -      <element name="schema" type="tns:Schema" minOccurs="1" maxOccurs="unbounded"/>
    -    </sequence>
    -  </complexType>
    -
    -  <complexType name="Schema">
    -    <all>
    -      <!-- See also database/inputSchema -->
    -      <element name="inputSchema" type="string" default="" minOccurs="1" maxOccurs="1" />
    -
    -      <!-- See also database/outputSchema -->
    -      <element name="outputSchema" type="string" default="" minOccurs="0" maxOccurs="1" />
    -    </all>
    -  </complexType>
    -
    -  <complexType name="MasterDataTables">
    -    <sequence>
    -      <!-- A configuration element for a master data table -->
    -      <element name="masterDataTable" type="tns:MasterDataTable" minOccurs="0" maxOccurs="unbounded" />
    -    </sequence>
    -  </complexType>
    -
    -  <complexType name="CustomTypes">
    -    <sequence>
    -      <!-- A configuration element for a custom type -->
    -      <element name="customType" type="tns:CustomType" minOccurs="0" maxOccurs="unbounded" />
    -    </sequence>
    -  </complexType>
    -
    -  <complexType name="EnumTypes">
    -    <sequence>
    -      <!-- A configuration element for a synthetic enum type -->
    -      <element name="enumType" type="tns:EnumType" minOccurs="0" maxOccurs="unbounded" />
    -    </sequence>
    -  </complexType>
    -
    -  <complexType name="ForcedTypes">
    -    <sequence>
    -      <!-- A configuration element for a forced type override -->
    -      <element name="forcedType" type="tns:ForcedType" minOccurs="0" maxOccurs="unbounded" />
    -    </sequence>
    -  </complexType>
    -
    -  <complexType name="MasterDataTable">
    -    <all>
    -      <!-- The name of a master data table -->
    -      <element name="name" type="string" minOccurs="1" maxOccurs="1" />
    -
    -      <!-- The column used for enum literals -->
    -      <element name="literal" type="string" minOccurs="0" maxOccurs="1" />
    -
    -      <!-- The column used for documentation -->
    -      <element name="description" type="string" minOccurs="0" maxOccurs="1" />
    -    </all>
    -  </complexType>
    -
    -  <complexType name="CustomType">
    -    <all>
    -      <!-- The name of the custom type -->
    -      <element name="name" type="string" minOccurs="1" maxOccurs="1" />
    -
    -      <!-- A converter implementation for the custom type -->
    -      <element name="converter" type="string" minOccurs="1" maxOccurs="1" />
    -    </all>
    -  </complexType>
    -
    -  <complexType name="EnumType">
    -    <all>
    -      <!-- The name of the synthetic enum type -->
    -      <element name="name" type="string" minOccurs="1" maxOccurs="1" />
    -
    -      <!-- A comma separated (CSV format) list of enum literals -->
    -      <element name="literals" type="string" minOccurs="1" maxOccurs="1" />
    -    </all>
    -  </complexType>
    -
    -  <complexType name="ForcedType">
    -    <all>
    -      <!-- The name of the type to be forced upon various artefacts -->
    -      <element name="name" type="string" minOccurs="1" maxOccurs="1" />
    -
    -      <!--
    -        A comma-separated list of Java regular expressions matching
    -        columns, parameters, attributes, etc to be forced to have this
    -        type
    -        -->
    -      <element name="expressions" type="string" minOccurs="1" maxOccurs="1" />
    -    </all>
    -  </complexType>
    -
    -  <complexType name="Generate">
    -    <all>
    -      <!--
    -        Primary key / foreign key relations should be generated and used.
    -        This is a prerequisite for various advanced features
    -        -->
    -      <element name="relations" type="boolean" default="false" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Generate navigation methods to navigate foreign key relationships
    -        directly from Record classes. This is only relevant if relations
    -        is set to true, too
    -        -->
    -      <element name="navigationMethods" type="boolean" default="true" minOccurs="0" maxOccurs="1" />
    -
    -      <!-- Generate deprecated code for backwards compatibility -->
    -      <element name="deprecated" type="boolean" default="true" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Generate instance fields in your tables, as opposed to static
    -        fields. This simplifies aliasing
    -        -->
    -      <element name="instanceFields" type="boolean" default="true" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Generate the javax.annotation.Generated annotation to indicate
    -        jOOQ version used for source code
    -        -->
    -      <element name="generatedAnnotation" type="boolean" default="true" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Generate TableRecord classes. Disable this when you don't
    -        need the additional type-safety
    -        -->
    -      <element name="records" type="boolean" default="true" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Generate POJOs in addition to Record classes for usage of the
    -        ResultQuery.fetchInto(Class) API
    -        -->
    -      <element name="pojos" type="boolean" default="false" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Annotate POJOs and Records with JPA annotations for increased
    -        compatibility and better integration with JPA/Hibernate, etc
    -        -->
    -      <element name="jpaAnnotations" type="boolean" default="false" minOccurs="0" maxOccurs="1" />
    -    </all>
    -  </complexType>
    -
    -  <complexType name="Target">
    -    <all>
    -      <!--
    -        The destination package of your generated classes (within the
    -        destination directory)
    -        -->
    -      <element name="packageName" type="string" default="org.jooq.generated" minOccurs="0" maxOccurs="1" />
    -
    -      <!-- The destination directory of your generated classes -->
    -      <element name="directory" type="string" default="target/generated-sources/jooq" />
    -    </all>
    -  </complexType>
    -</schema>
    \ No newline at end of file
    diff --git a/jOOQ-website/xsd/jooq-codegen-2.3.0.xsd b/jOOQ-website/xsd/jooq-codegen-2.3.0.xsd
    deleted file mode 100644
    index 0ddf539ebd..0000000000
    --- a/jOOQ-website/xsd/jooq-codegen-2.3.0.xsd
    +++ /dev/null
    @@ -1,368 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?>
    -<schema xmlns="http://www.w3.org/2001/XMLSchema"
    -  xmlns:tns="http://www.jooq.org/xsd/jooq-codegen-2.3.0.xsd"
    -  targetNamespace="http://www.jooq.org/xsd/jooq-codegen-2.3.0.xsd"
    -  elementFormDefault="qualified">
    -
    -  <element name="configuration">
    -    <complexType>
    -      <all>
    -        <!--
    -          The JDBC configuration element contains information about how
    -          to set up the database connection used for source code generation
    -          -->
    -        <element name="jdbc" type="tns:Jdbc" minOccurs="1"
    -          maxOccurs="1" />
    -
    -        <!--
    -          The GENERATOR configuration element contains information about
    -          source code generation itself
    -          -->
    -        <element name="generator" type="tns:Generator" minOccurs="1"
    -          maxOccurs="1" />
    -      </all>
    -    </complexType>
    -  </element>
    -
    -  <complexType name="Jdbc">
    -    <all>
    -      <!-- The JDBC driver -->
    -      <element name="driver" type="string" minOccurs="1" maxOccurs="1" />
    -
    -      <!-- The JDBC connection URL -->
    -      <element name="url" type="string" minOccurs="1" maxOccurs="1" />
    -
    -      <!-- Deprecated. Use database schema configuration elements instead -->
    -      <element name="schema" type="string" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        The JDBC connection user. Be sure this user has all required
    -        GRANTs to the dictionary views/tables to generate the desired artefacts
    -        -->
    -      <element name="user" type="string" minOccurs="0" maxOccurs="1" />
    -
    -      <!-- The JDBC connection password -->
    -      <element name="password" type="string" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Enlist custom JDBC driver properties that are provided to the
    -        java.sql.DriverManager when fetching a connection
    -        -->
    -      <element name="properties" type="tns:Properties" minOccurs="0" maxOccurs="1" />
    -    </all>
    -  </complexType>
    -
    -  <complexType name="Properties">
    -    <sequence>
    -      <element name="property" type="tns:Property" minOccurs="0" maxOccurs="unbounded"/>
    -    </sequence>
    -  </complexType>
    -
    -  <complexType name="Property">
    -    <all>
    -      <element name="key" type="string" minOccurs="1" maxOccurs="1"/>
    -      <element name="value" type="string" minOccurs="1" maxOccurs="1"/>
    -    </all>
    -  </complexType>
    -
    -  <complexType name="Generator">
    -    <all>
    -      <!--
    -       The class used to generate source code. You may override this with
    -       your custom source code generator
    -       -->
    -      <element name="name" type="string" default="org.jooq.util.DefaultGenerator"
    -        minOccurs="0" maxOccurs="1" />
    -
    -      <!-- The naming strategy used for class and field names -->
    -      <element name="strategy" type="tns:Strategy" minOccurs="0" maxOccurs="1" />
    -
    -      <!-- The jooq-meta configuration -->
    -      <element name="database" type="tns:Database" minOccurs="1" maxOccurs="1" />
    -
    -      <!-- The jooq-codegen configuration -->
    -      <element name="generate" type="tns:Generate" minOccurs="0" maxOccurs="1" />
    -
    -      <!-- Some information about generation output -->
    -      <element name="target" type="tns:Target" minOccurs="0" maxOccurs="1" />
    -    </all>
    -  </complexType>
    -
    -  <complexType name="Strategy">
    -    <all>
    -      <!--
    -        The class used to provide a naming strategy for generated source
    -        code. You may override this with your custom naming strategy
    -        -->
    -      <element name="name" type="string" minOccurs="0" maxOccurs="1"
    -        default="org.jooq.util.DefaultGeneratorStrategy" />
    -    </all>
    -  </complexType>
    -
    -  <complexType name="Database">
    -    <all>
    -      <!--
    -        The database dialect from jooq-meta. Available dialects are
    -        named org.util.[database].[database]Database. Known values are:
    -
    -        org.jooq.util.ase.ASEDatabase
    -        org.jooq.util.cubrid.CUBRIDDatabase
    -        org.jooq.util.db2.DB2Database
    -        org.jooq.util.derby.DerbyDatabase
    -        org.jooq.util.h2.H2Database
    -        org.jooq.util.hsqldb.HSQLDBDatabase
    -        org.jooq.util.ingres.IngresDatabase
    -        org.jooq.util.mysql.MySQLDatabase
    -        org.jooq.util.oracle.OracleDatabase
    -        org.jooq.util.postgres.PostgresDatabase
    -        org.jooq.util.sqlite.SQLiteDatabaes
    -        org.jooq.util.sqlserver.SQLServerDatabase
    -        org.jooq.util.sybase.SybaseDatabase
    -
    -        You can also provide your own org.jooq.util.Database implementation
    -        here, if your database is currently not supported
    -        -->
    -      <element name="name" type="string" minOccurs="1" maxOccurs="1" />
    -
    -      <!--
    -        All elements that are generated from your schema (several Java
    -        regular expressions, separated by comma) Watch out for
    -        case-sensitivity. Depending on your database, this might be
    -        important! You can create case-insensitive regular expressions
    -        using this syntax: (?i:expr)A comma-separated list of regular
    -        expressions
    -        -->
    -      <element name="includes" type="string" default=".*" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        All elements that are excluded from your schema (several Java
    -        regular expressions, separated by comma). Excludes match before
    -        includes
    -        -->
    -      <element name="excludes" type="string" default="" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Generate java.sql.Timestamp fields for DATE columns. This is
    -        particularly useful for Oracle databases
    -        -->
    -      <element name="dateAsTimestamp" type="boolean" default="false" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Generate jOOU data types for your unsigned data types, which are
    -        not natively supported in Java
    -        -->
    -      <element name="unsignedTypes" type="boolean" default="true" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        The schema that is used locally as a source for meta information.
    -        This could be your development schema or the production schema, etc
    -        This cannot be combined with the schemata element.
    -        For backwards compatibility, this defaults to jdbc/schema
    -        -->
    -      <element name="inputSchema" type="string" default="" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        The schema that is used in generated source code. This will be the
    -        production schema. Use this to override your local development
    -        schema name for source code generation. If not specified, this
    -        will be the same as the input-schema.
    -        -->
    -      <element name="outputSchema" type="string" default="" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        A configuration element to configure several input and/or output
    -        schemata for jooq-meta, in case you're using jooq-meta in a multi-
    -        schema environment
    -        -->
    -      <element name="schemata" type="tns:Schemata" minOccurs="0" maxOccurs="1"/>
    -
    -      <!--
    -        A configuration element to configure master data table enum classes
    -        -->
    -      <element name="masterDataTables" type="tns:MasterDataTables" minOccurs="0" maxOccurs="1"/>
    -
    -      <!--
    -        A configuration element to configure custom types introduced to jOOQ
    -        using converters
    -        This is EXPERIMENTAL functionality. Use at your own risk
    -        -->
    -      <element name="customTypes" type="tns:CustomTypes" minOccurs="0" maxOccurs="1"/>
    -
    -      <!--
    -        A configuration element to configure synthetic enum types
    -        This is EXPERIMENTAL / DEPRECATED functionality. Do not re-use
    -        -->
    -      <element name="enumTypes" type="tns:EnumTypes" minOccurs="0" maxOccurs="1"/>
    -
    -      <!--
    -        A configuration element to configure type overrides for generated
    -        artefacts (e.g. in combination with enumTypes)
    -        This is EXPERIMENTAL functionality. Use at your own risk
    -        -->
    -      <element name="forcedTypes" type="tns:ForcedTypes" minOccurs="0" maxOccurs="1"/>
    -    </all>
    -  </complexType>
    -
    -  <complexType name="Schemata">
    -    <sequence>
    -      <!--
    -        A configuration element for a single schema in multi-schema
    -        environments
    -        -->
    -      <element name="schema" type="tns:Schema" minOccurs="1" maxOccurs="unbounded"/>
    -    </sequence>
    -  </complexType>
    -
    -  <complexType name="Schema">
    -    <all>
    -      <!-- See also database/inputSchema -->
    -      <element name="inputSchema" type="string" default="" minOccurs="1" maxOccurs="1" />
    -
    -      <!-- See also database/outputSchema -->
    -      <element name="outputSchema" type="string" default="" minOccurs="0" maxOccurs="1" />
    -    </all>
    -  </complexType>
    -
    -  <complexType name="MasterDataTables">
    -    <sequence>
    -      <!-- A configuration element for a master data table -->
    -      <element name="masterDataTable" type="tns:MasterDataTable" minOccurs="0" maxOccurs="unbounded" />
    -    </sequence>
    -  </complexType>
    -
    -  <complexType name="CustomTypes">
    -    <sequence>
    -      <!-- A configuration element for a custom type -->
    -      <element name="customType" type="tns:CustomType" minOccurs="0" maxOccurs="unbounded" />
    -    </sequence>
    -  </complexType>
    -
    -  <complexType name="EnumTypes">
    -    <sequence>
    -      <!-- A configuration element for a synthetic enum type -->
    -      <element name="enumType" type="tns:EnumType" minOccurs="0" maxOccurs="unbounded" />
    -    </sequence>
    -  </complexType>
    -
    -  <complexType name="ForcedTypes">
    -    <sequence>
    -      <!-- A configuration element for a forced type override -->
    -      <element name="forcedType" type="tns:ForcedType" minOccurs="0" maxOccurs="unbounded" />
    -    </sequence>
    -  </complexType>
    -
    -  <complexType name="MasterDataTable">
    -    <all>
    -      <!-- The name of a master data table -->
    -      <element name="name" type="string" minOccurs="1" maxOccurs="1" />
    -
    -      <!-- The column used for enum literals -->
    -      <element name="literal" type="string" minOccurs="0" maxOccurs="1" />
    -
    -      <!-- The column used for documentation -->
    -      <element name="description" type="string" minOccurs="0" maxOccurs="1" />
    -    </all>
    -  </complexType>
    -
    -  <complexType name="CustomType">
    -    <all>
    -      <!-- The name of the custom type -->
    -      <element name="name" type="string" minOccurs="1" maxOccurs="1" />
    -
    -      <!-- A converter implementation for the custom type -->
    -      <element name="converter" type="string" minOccurs="1" maxOccurs="1" />
    -    </all>
    -  </complexType>
    -
    -  <complexType name="EnumType">
    -    <all>
    -      <!-- The name of the synthetic enum type -->
    -      <element name="name" type="string" minOccurs="1" maxOccurs="1" />
    -
    -      <!-- A comma separated (CSV format) list of enum literals -->
    -      <element name="literals" type="string" minOccurs="1" maxOccurs="1" />
    -    </all>
    -  </complexType>
    -
    -  <complexType name="ForcedType">
    -    <all>
    -      <!-- The name of the type to be forced upon various artefacts -->
    -      <element name="name" type="string" minOccurs="1" maxOccurs="1" />
    -
    -      <!--
    -        A comma-separated list of Java regular expressions matching
    -        columns, parameters, attributes, etc to be forced to have this
    -        type
    -        -->
    -      <element name="expressions" type="string" minOccurs="1" maxOccurs="1" />
    -    </all>
    -  </complexType>
    -
    -  <complexType name="Generate">
    -    <all>
    -      <!--
    -        Primary key / foreign key relations should be generated and used.
    -        This is a prerequisite for various advanced features
    -        -->
    -      <element name="relations" type="boolean" default="false" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Generate navigation methods to navigate foreign key relationships
    -        directly from Record classes. This is only relevant if relations
    -        is set to true, too
    -        -->
    -      <element name="navigationMethods" type="boolean" default="true" minOccurs="0" maxOccurs="1" />
    -
    -      <!-- Generate deprecated code for backwards compatibility -->
    -      <element name="deprecated" type="boolean" default="true" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Generate instance fields in your tables, as opposed to static
    -        fields. This simplifies aliasing
    -        -->
    -      <element name="instanceFields" type="boolean" default="true" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Generate the javax.annotation.Generated annotation to indicate
    -        jOOQ version used for source code
    -        -->
    -      <element name="generatedAnnotation" type="boolean" default="true" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Generate TableRecord classes. Disable this when you don't
    -        need the additional type-safety
    -        -->
    -      <element name="records" type="boolean" default="true" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Generate POJOs in addition to Record classes for usage of the
    -        ResultQuery.fetchInto(Class) API
    -        -->
    -      <element name="pojos" type="boolean" default="false" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Annotate POJOs and Records with JPA annotations for increased
    -        compatibility and better integration with JPA/Hibernate, etc
    -        -->
    -      <element name="jpaAnnotations" type="boolean" default="false" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Annotate POJOs and Records with JSR-303 validation annotations
    -        -->
    -      <element name="validationAnnotations" type="boolean" default="false" minOccurs="0" maxOccurs="1" />
    -    </all>
    -  </complexType>
    -
    -  <complexType name="Target">
    -    <all>
    -      <!--
    -        The destination package of your generated classes (within the
    -        destination directory)
    -        -->
    -      <element name="packageName" type="string" default="org.jooq.generated" minOccurs="0" maxOccurs="1" />
    -
    -      <!-- The destination directory of your generated classes -->
    -      <element name="directory" type="string" default="target/generated-sources/jooq" />
    -    </all>
    -  </complexType>
    -</schema>
    \ No newline at end of file
    diff --git a/jOOQ-website/xsd/jooq-codegen-2.4.0.xsd b/jOOQ-website/xsd/jooq-codegen-2.4.0.xsd
    deleted file mode 100644
    index eb22c0ecd0..0000000000
    --- a/jOOQ-website/xsd/jooq-codegen-2.4.0.xsd
    +++ /dev/null
    @@ -1,380 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?>
    -<schema xmlns="http://www.w3.org/2001/XMLSchema"
    -  xmlns:tns="http://www.jooq.org/xsd/jooq-codegen-2.4.0.xsd"
    -  targetNamespace="http://www.jooq.org/xsd/jooq-codegen-2.4.0.xsd"
    -  elementFormDefault="qualified">
    -
    -  <element name="configuration">
    -    <complexType>
    -      <all>
    -        <!--
    -          The JDBC configuration element contains information about how
    -          to set up the database connection used for source code generation
    -          -->
    -        <element name="jdbc" type="tns:Jdbc" minOccurs="1"
    -          maxOccurs="1" />
    -
    -        <!--
    -          The GENERATOR configuration element contains information about
    -          source code generation itself
    -          -->
    -        <element name="generator" type="tns:Generator" minOccurs="1"
    -          maxOccurs="1" />
    -      </all>
    -    </complexType>
    -  </element>
    -
    -  <complexType name="Jdbc">
    -    <all>
    -      <!-- The JDBC driver -->
    -      <element name="driver" type="string" minOccurs="1" maxOccurs="1" />
    -
    -      <!-- The JDBC connection URL -->
    -      <element name="url" type="string" minOccurs="1" maxOccurs="1" />
    -
    -      <!-- Deprecated. Use database schema configuration elements instead -->
    -      <element name="schema" type="string" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        The JDBC connection user. Be sure this user has all required
    -        GRANTs to the dictionary views/tables to generate the desired artefacts
    -        -->
    -      <element name="user" type="string" minOccurs="0" maxOccurs="1" />
    -
    -      <!-- The JDBC connection password -->
    -      <element name="password" type="string" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Enlist custom JDBC driver properties that are provided to the
    -        java.sql.DriverManager when fetching a connection
    -        -->
    -      <element name="properties" type="tns:Properties" minOccurs="0" maxOccurs="1" />
    -    </all>
    -  </complexType>
    -
    -  <complexType name="Properties">
    -    <sequence>
    -      <element name="property" type="tns:Property" minOccurs="0" maxOccurs="unbounded"/>
    -    </sequence>
    -  </complexType>
    -
    -  <complexType name="Property">
    -    <all>
    -      <element name="key" type="string" minOccurs="1" maxOccurs="1"/>
    -      <element name="value" type="string" minOccurs="1" maxOccurs="1"/>
    -    </all>
    -  </complexType>
    -
    -  <complexType name="Generator">
    -    <all>
    -      <!--
    -       The class used to generate source code. You may override this with
    -       your custom source code generator
    -       -->
    -      <element name="name" type="string" default="org.jooq.util.DefaultGenerator"
    -        minOccurs="0" maxOccurs="1" />
    -
    -      <!-- The naming strategy used for class and field names -->
    -      <element name="strategy" type="tns:Strategy" minOccurs="0" maxOccurs="1" />
    -
    -      <!-- The jooq-meta configuration -->
    -      <element name="database" type="tns:Database" minOccurs="1" maxOccurs="1" />
    -
    -      <!-- The jooq-codegen configuration -->
    -      <element name="generate" type="tns:Generate" minOccurs="0" maxOccurs="1" />
    -
    -      <!-- Some information about generation output -->
    -      <element name="target" type="tns:Target" minOccurs="0" maxOccurs="1" />
    -    </all>
    -  </complexType>
    -
    -  <complexType name="Strategy">
    -    <all>
    -      <!--
    -        The class used to provide a naming strategy for generated source
    -        code. You may override this with your custom naming strategy
    -        -->
    -      <element name="name" type="string" minOccurs="0" maxOccurs="1"
    -        default="org.jooq.util.DefaultGeneratorStrategy" />
    -    </all>
    -  </complexType>
    -
    -  <complexType name="Database">
    -    <all>
    -      <!--
    -        The database dialect from jooq-meta. Available dialects are
    -        named org.util.[database].[database]Database. Known values are:
    -
    -        org.jooq.util.ase.ASEDatabase
    -        org.jooq.util.cubrid.CUBRIDDatabase
    -        org.jooq.util.db2.DB2Database
    -        org.jooq.util.derby.DerbyDatabase
    -        org.jooq.util.h2.H2Database
    -        org.jooq.util.hsqldb.HSQLDBDatabase
    -        org.jooq.util.ingres.IngresDatabase
    -        org.jooq.util.mysql.MySQLDatabase
    -        org.jooq.util.oracle.OracleDatabase
    -        org.jooq.util.postgres.PostgresDatabase
    -        org.jooq.util.sqlite.SQLiteDatabaes
    -        org.jooq.util.sqlserver.SQLServerDatabase
    -        org.jooq.util.sybase.SybaseDatabase
    -
    -        You can also provide your own org.jooq.util.Database implementation
    -        here, if your database is currently not supported
    -        -->
    -      <element name="name" type="string" minOccurs="1" maxOccurs="1" />
    -
    -      <!--
    -        All elements that are generated from your schema (several Java
    -        regular expressions, separated by comma) Watch out for
    -        case-sensitivity. Depending on your database, this might be
    -        important! You can create case-insensitive regular expressions
    -        using this syntax: (?i:expr)A comma-separated list of regular
    -        expressions
    -        -->
    -      <element name="includes" type="string" default=".*" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        All elements that are excluded from your schema (several Java
    -        regular expressions, separated by comma). Excludes match before
    -        includes
    -        -->
    -      <element name="excludes" type="string" default="" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Generate java.sql.Timestamp fields for DATE columns. This is
    -        particularly useful for Oracle databases
    -        -->
    -      <element name="dateAsTimestamp" type="boolean" default="false" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Generate jOOU data types for your unsigned data types, which are
    -        not natively supported in Java
    -        -->
    -      <element name="unsignedTypes" type="boolean" default="true" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        The schema that is used locally as a source for meta information.
    -        This could be your development schema or the production schema, etc
    -        This cannot be combined with the schemata element.
    -        If left empty (and without any schemata element), jOOQ will generate all available schemata.
    -        For backwards compatibility, this defaults to jdbc/schema
    -        -->
    -      <element name="inputSchema" type="string" default="" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        The schema that is used in generated source code. This will be the
    -        production schema. Use this to override your local development
    -        schema name for source code generation. If not specified, this
    -        will be the same as the input-schema.
    -        -->
    -      <element name="outputSchema" type="string" default="" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        A configuration element to configure several input and/or output
    -        schemata for jooq-meta, in case you're using jooq-meta in a multi-
    -        schema environment
    -        -->
    -      <element name="schemata" type="tns:Schemata" minOccurs="0" maxOccurs="1"/>
    -
    -      <!--
    -        A configuration element to configure master data table enum classes
    -        -->
    -      <element name="masterDataTables" type="tns:MasterDataTables" minOccurs="0" maxOccurs="1"/>
    -
    -      <!--
    -        A configuration element to configure custom types introduced to jOOQ
    -        using converters
    -        This is EXPERIMENTAL functionality. Use at your own risk
    -        -->
    -      <element name="customTypes" type="tns:CustomTypes" minOccurs="0" maxOccurs="1"/>
    -
    -      <!--
    -        A configuration element to configure synthetic enum types
    -        This is EXPERIMENTAL / DEPRECATED functionality. Do not re-use
    -        -->
    -      <element name="enumTypes" type="tns:EnumTypes" minOccurs="0" maxOccurs="1"/>
    -
    -      <!--
    -        A configuration element to configure type overrides for generated
    -        artefacts (e.g. in combination with enumTypes)
    -        This is EXPERIMENTAL functionality. Use at your own risk
    -        -->
    -      <element name="forcedTypes" type="tns:ForcedTypes" minOccurs="0" maxOccurs="1"/>
    -    </all>
    -  </complexType>
    -
    -  <complexType name="Schemata">
    -    <sequence>
    -      <!--
    -        A configuration element for a single schema in multi-schema
    -        environments
    -        -->
    -      <element name="schema" type="tns:Schema" minOccurs="1" maxOccurs="unbounded"/>
    -    </sequence>
    -  </complexType>
    -
    -  <complexType name="Schema">
    -    <all>
    -      <!-- See also database/inputSchema -->
    -      <element name="inputSchema" type="string" default="" minOccurs="1" maxOccurs="1" />
    -
    -      <!-- See also database/outputSchema -->
    -      <element name="outputSchema" type="string" default="" minOccurs="0" maxOccurs="1" />
    -    </all>
    -  </complexType>
    -
    -  <complexType name="MasterDataTables">
    -    <sequence>
    -      <!-- A configuration element for a master data table -->
    -      <element name="masterDataTable" type="tns:MasterDataTable" minOccurs="0" maxOccurs="unbounded" />
    -    </sequence>
    -  </complexType>
    -
    -  <complexType name="CustomTypes">
    -    <sequence>
    -      <!-- A configuration element for a custom type -->
    -      <element name="customType" type="tns:CustomType" minOccurs="0" maxOccurs="unbounded" />
    -    </sequence>
    -  </complexType>
    -
    -  <complexType name="EnumTypes">
    -    <sequence>
    -      <!-- A configuration element for a synthetic enum type -->
    -      <element name="enumType" type="tns:EnumType" minOccurs="0" maxOccurs="unbounded" />
    -    </sequence>
    -  </complexType>
    -
    -  <complexType name="ForcedTypes">
    -    <sequence>
    -      <!-- A configuration element for a forced type override -->
    -      <element name="forcedType" type="tns:ForcedType" minOccurs="0" maxOccurs="unbounded" />
    -    </sequence>
    -  </complexType>
    -
    -  <complexType name="MasterDataTable">
    -    <all>
    -      <!-- The name of a master data table -->
    -      <element name="name" type="string" minOccurs="1" maxOccurs="1" />
    -
    -      <!-- The column used for enum literals -->
    -      <element name="literal" type="string" minOccurs="0" maxOccurs="1" />
    -
    -      <!-- The column used for documentation -->
    -      <element name="description" type="string" minOccurs="0" maxOccurs="1" />
    -    </all>
    -  </complexType>
    -
    -  <complexType name="CustomType">
    -    <all>
    -      <!-- The name of the custom type -->
    -      <element name="name" type="string" minOccurs="1" maxOccurs="1" />
    -
    -      <!-- A converter implementation for the custom type -->
    -      <element name="converter" type="string" minOccurs="1" maxOccurs="1" />
    -    </all>
    -  </complexType>
    -
    -  <complexType name="EnumType">
    -    <all>
    -      <!-- The name of the synthetic enum type -->
    -      <element name="name" type="string" minOccurs="1" maxOccurs="1" />
    -
    -      <!-- A comma separated (CSV format) list of enum literals -->
    -      <element name="literals" type="string" minOccurs="1" maxOccurs="1" />
    -    </all>
    -  </complexType>
    -
    -  <complexType name="ForcedType">
    -    <all>
    -      <!-- The name of the type to be forced upon various artefacts -->
    -      <element name="name" type="string" minOccurs="1" maxOccurs="1" />
    -
    -      <!--
    -        A comma-separated list of Java regular expressions matching
    -        columns, parameters, attributes, etc to be forced to have this
    -        type
    -        -->
    -      <element name="expressions" type="string" minOccurs="1" maxOccurs="1" />
    -    </all>
    -  </complexType>
    -
    -  <complexType name="Generate">
    -    <all>
    -      <!--
    -        Primary key / foreign key relations should be generated and used.
    -        This is a prerequisite for various advanced features
    -        -->
    -      <element name="relations" type="boolean" default="false" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Generate navigation methods to navigate foreign key relationships
    -        directly from Record classes. This is only relevant if relations
    -        is set to true, too
    -        -->
    -      <element name="navigationMethods" type="boolean" default="true" minOccurs="0" maxOccurs="1" />
    -
    -      <!-- Generate deprecated code for backwards compatibility -->
    -      <element name="deprecated" type="boolean" default="true" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Generate instance fields in your tables, as opposed to static
    -        fields. This simplifies aliasing
    -        -->
    -      <element name="instanceFields" type="boolean" default="true" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Generate the javax.annotation.Generated annotation to indicate
    -        jOOQ version used for source code
    -        -->
    -      <element name="generatedAnnotation" type="boolean" default="true" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Generate TableRecord classes. Disable this when you don't
    -        need the additional type-safety
    -        -->
    -      <element name="records" type="boolean" default="true" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Generate POJOs for usage of the ResultQuery.fetchInto(Class) API
    -        -->
    -      <element name="pojos" type="boolean" default="false" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Generate interfaces that will be implemented by records and/or pojos.
    -        You can also use these interfaces in Record.into(Class<?>) and similar
    -        methods, to let jOOQ return proxy objects for them.
    -        -->
    -      <element name="interfaces" type="boolean" default="false" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Generate DAOs in addition to POJO classes
    -        -->
    -      <element name="daos" type="boolean" default="false" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Annotate POJOs and Records with JPA annotations for increased
    -        compatibility and better integration with JPA/Hibernate, etc
    -        -->
    -      <element name="jpaAnnotations" type="boolean" default="false" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Annotate POJOs and Records with JSR-303 validation annotations
    -        -->
    -      <element name="validationAnnotations" type="boolean" default="false" minOccurs="0" maxOccurs="1" />
    -    </all>
    -  </complexType>
    -
    -  <complexType name="Target">
    -    <all>
    -      <!--
    -        The destination package of your generated classes (within the
    -        destination directory)
    -        -->
    -      <element name="packageName" type="string" default="org.jooq.generated" minOccurs="0" maxOccurs="1" />
    -
    -      <!-- The destination directory of your generated classes -->
    -      <element name="directory" type="string" default="target/generated-sources/jooq" />
    -    </all>
    -  </complexType>
    -</schema>
    \ No newline at end of file
    diff --git a/jOOQ-website/xsd/jooq-codegen-2.5.0.xsd b/jOOQ-website/xsd/jooq-codegen-2.5.0.xsd
    deleted file mode 100644
    index 574535afc2..0000000000
    --- a/jOOQ-website/xsd/jooq-codegen-2.5.0.xsd
    +++ /dev/null
    @@ -1,400 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?>
    -<schema xmlns="http://www.w3.org/2001/XMLSchema"
    -  xmlns:tns="http://www.jooq.org/xsd/jooq-codegen-2.5.0.xsd"
    -  targetNamespace="http://www.jooq.org/xsd/jooq-codegen-2.5.0.xsd"
    -  elementFormDefault="qualified">
    -
    -  <element name="configuration">
    -    <complexType>
    -      <all>
    -        <!--
    -          The JDBC configuration element contains information about how
    -          to set up the database connection used for source code generation
    -          -->
    -        <element name="jdbc" type="tns:Jdbc" minOccurs="1"
    -          maxOccurs="1" />
    -
    -        <!--
    -          The GENERATOR configuration element contains information about
    -          source code generation itself
    -          -->
    -        <element name="generator" type="tns:Generator" minOccurs="1"
    -          maxOccurs="1" />
    -      </all>
    -    </complexType>
    -  </element>
    -
    -  <complexType name="Jdbc">
    -    <all>
    -      <!-- The JDBC driver -->
    -      <element name="driver" type="string" minOccurs="1" maxOccurs="1" />
    -
    -      <!-- The JDBC connection URL -->
    -      <element name="url" type="string" minOccurs="1" maxOccurs="1" />
    -
    -      <!-- Deprecated. Use database schema configuration elements instead -->
    -      <element name="schema" type="string" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        The JDBC connection user. Be sure this user has all required
    -        GRANTs to the dictionary views/tables to generate the desired artefacts
    -        -->
    -      <element name="user" type="string" minOccurs="0" maxOccurs="1" />
    -
    -      <!-- The JDBC connection password -->
    -      <element name="password" type="string" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Enlist custom JDBC driver properties that are provided to the
    -        java.sql.DriverManager when fetching a connection
    -        -->
    -      <element name="properties" type="tns:Properties" minOccurs="0" maxOccurs="1" />
    -    </all>
    -  </complexType>
    -
    -  <complexType name="Properties">
    -    <sequence>
    -      <element name="property" type="tns:Property" minOccurs="0" maxOccurs="unbounded"/>
    -    </sequence>
    -  </complexType>
    -
    -  <complexType name="Property">
    -    <all>
    -      <element name="key" type="string" minOccurs="1" maxOccurs="1"/>
    -      <element name="value" type="string" minOccurs="1" maxOccurs="1"/>
    -    </all>
    -  </complexType>
    -
    -  <complexType name="Generator">
    -    <all>
    -      <!--
    -       The class used to generate source code. You may override this with
    -       your custom source code generator
    -       -->
    -      <element name="name" type="string" default="org.jooq.util.DefaultGenerator"
    -        minOccurs="0" maxOccurs="1" />
    -
    -      <!-- The naming strategy used for class and field names -->
    -      <element name="strategy" type="tns:Strategy" minOccurs="0" maxOccurs="1" />
    -
    -      <!-- The jooq-meta configuration -->
    -      <element name="database" type="tns:Database" minOccurs="1" maxOccurs="1" />
    -
    -      <!-- The jooq-codegen configuration -->
    -      <element name="generate" type="tns:Generate" minOccurs="0" maxOccurs="1" />
    -
    -      <!-- Some information about generation output -->
    -      <element name="target" type="tns:Target" minOccurs="0" maxOccurs="1" />
    -    </all>
    -  </complexType>
    -
    -  <complexType name="Strategy">
    -    <all>
    -      <!--
    -        The class used to provide a naming strategy for generated source
    -        code. You may override this with your custom naming strategy
    -        -->
    -      <element name="name" type="string" minOccurs="0" maxOccurs="1"
    -        default="org.jooq.util.DefaultGeneratorStrategy" />
    -    </all>
    -  </complexType>
    -
    -  <complexType name="Database">
    -    <all>
    -      <!--
    -        The database dialect from jooq-meta. Available dialects are
    -        named org.util.[database].[database]Database. Known values are:
    -
    -        org.jooq.util.ase.ASEDatabase
    -        org.jooq.util.cubrid.CUBRIDDatabase
    -        org.jooq.util.db2.DB2Database
    -        org.jooq.util.derby.DerbyDatabase
    -        org.jooq.util.h2.H2Database
    -        org.jooq.util.hsqldb.HSQLDBDatabase
    -        org.jooq.util.ingres.IngresDatabase
    -        org.jooq.util.mysql.MySQLDatabase
    -        org.jooq.util.oracle.OracleDatabase
    -        org.jooq.util.postgres.PostgresDatabase
    -        org.jooq.util.sqlite.SQLiteDatabaes
    -        org.jooq.util.sqlserver.SQLServerDatabase
    -        org.jooq.util.sybase.SybaseDatabase
    -
    -        You can also provide your own org.jooq.util.Database implementation
    -        here, if your database is currently not supported
    -        -->
    -      <element name="name" type="string" minOccurs="1" maxOccurs="1" />
    -
    -      <!--
    -        All elements that are generated from your schema (several Java
    -        regular expressions, separated by comma) Watch out for
    -        case-sensitivity. Depending on your database, this might be
    -        important! You can create case-insensitive regular expressions
    -        using this syntax: (?i:expr)A comma-separated list of regular
    -        expressions
    -        -->
    -      <element name="includes" type="string" default=".*" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        All elements that are excluded from your schema (several Java
    -        regular expressions, separated by comma). Excludes match before
    -        includes
    -        -->
    -      <element name="excludes" type="string" default="" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        All table and view columns that are used as "version" fields for
    -        optimistic locking (several Java regular expressions, separated by comma).
    -        See UpdatableRecord.store() and UpdatableRecord.delete() for details
    -        -->
    -      <element name="recordVersionFields" type="string" default="" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        All table and view columns that are used as "timestamp" fields for
    -        optimistic locking (several Java regular expressions, separated by comma).
    -        See UpdatableRecord.store() and UpdatableRecord.delete() for details
    -        -->
    -      <element name="recordTimestampFields" type="string" default="" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Generate java.sql.Timestamp fields for DATE columns. This is
    -        particularly useful for Oracle databases
    -        -->
    -      <element name="dateAsTimestamp" type="boolean" default="false" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Generate jOOU data types for your unsigned data types, which are
    -        not natively supported in Java
    -        -->
    -      <element name="unsignedTypes" type="boolean" default="true" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        The schema that is used locally as a source for meta information.
    -        This could be your development schema or the production schema, etc
    -        This cannot be combined with the schemata element.
    -        If left empty (and without any schemata element), jOOQ will generate all available schemata.
    -        For backwards compatibility, this defaults to jdbc/schema
    -        -->
    -      <element name="inputSchema" type="string" default="" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        The schema that is used in generated source code. This will be the
    -        production schema. Use this to override your local development
    -        schema name for source code generation. If not specified, this
    -        will be the same as the input-schema.
    -        -->
    -      <element name="outputSchema" type="string" default="" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        A configuration element to configure several input and/or output
    -        schemata for jooq-meta, in case you're using jooq-meta in a multi-
    -        schema environment
    -        -->
    -      <element name="schemata" type="tns:Schemata" minOccurs="0" maxOccurs="1"/>
    -
    -      <!--
    -        A configuration element to configure master data table enum classes
    -        -->
    -      <element name="masterDataTables" type="tns:MasterDataTables" minOccurs="0" maxOccurs="1"/>
    -
    -      <!--
    -        A configuration element to configure custom types introduced to jOOQ
    -        using converters
    -        This is EXPERIMENTAL functionality. Use at your own risk
    -        -->
    -      <element name="customTypes" type="tns:CustomTypes" minOccurs="0" maxOccurs="1"/>
    -
    -      <!--
    -        A configuration element to configure synthetic enum types
    -        This is EXPERIMENTAL / DEPRECATED functionality. Do not re-use
    -        -->
    -      <element name="enumTypes" type="tns:EnumTypes" minOccurs="0" maxOccurs="1"/>
    -
    -      <!--
    -        A configuration element to configure type overrides for generated
    -        artefacts (e.g. in combination with enumTypes)
    -        This is EXPERIMENTAL functionality. Use at your own risk
    -        -->
    -      <element name="forcedTypes" type="tns:ForcedTypes" minOccurs="0" maxOccurs="1"/>
    -    </all>
    -  </complexType>
    -
    -  <complexType name="Schemata">
    -    <sequence>
    -      <!--
    -        A configuration element for a single schema in multi-schema
    -        environments
    -        -->
    -      <element name="schema" type="tns:Schema" minOccurs="1" maxOccurs="unbounded"/>
    -    </sequence>
    -  </complexType>
    -
    -  <complexType name="Schema">
    -    <all>
    -      <!-- See also database/inputSchema -->
    -      <element name="inputSchema" type="string" default="" minOccurs="1" maxOccurs="1" />
    -
    -      <!-- See also database/outputSchema -->
    -      <element name="outputSchema" type="string" default="" minOccurs="0" maxOccurs="1" />
    -    </all>
    -  </complexType>
    -
    -  <complexType name="MasterDataTables">
    -    <sequence>
    -      <!-- A configuration element for a master data table -->
    -      <element name="masterDataTable" type="tns:MasterDataTable" minOccurs="0" maxOccurs="unbounded" />
    -    </sequence>
    -  </complexType>
    -
    -  <complexType name="CustomTypes">
    -    <sequence>
    -      <!-- A configuration element for a custom type -->
    -      <element name="customType" type="tns:CustomType" minOccurs="0" maxOccurs="unbounded" />
    -    </sequence>
    -  </complexType>
    -
    -  <complexType name="EnumTypes">
    -    <sequence>
    -      <!-- A configuration element for a synthetic enum type -->
    -      <element name="enumType" type="tns:EnumType" minOccurs="0" maxOccurs="unbounded" />
    -    </sequence>
    -  </complexType>
    -
    -  <complexType name="ForcedTypes">
    -    <sequence>
    -      <!-- A configuration element for a forced type override -->
    -      <element name="forcedType" type="tns:ForcedType" minOccurs="0" maxOccurs="unbounded" />
    -    </sequence>
    -  </complexType>
    -
    -  <complexType name="MasterDataTable">
    -    <all>
    -      <!-- The name of a master data table -->
    -      <element name="name" type="string" minOccurs="1" maxOccurs="1" />
    -
    -      <!-- The column used for enum literals -->
    -      <element name="literal" type="string" minOccurs="0" maxOccurs="1" />
    -
    -      <!-- The column used for documentation -->
    -      <element name="description" type="string" minOccurs="0" maxOccurs="1" />
    -    </all>
    -  </complexType>
    -
    -  <complexType name="CustomType">
    -    <all>
    -      <!-- The name of the custom type -->
    -      <element name="name" type="string" minOccurs="1" maxOccurs="1" />
    -
    -      <!-- A converter implementation for the custom type -->
    -      <element name="converter" type="string" minOccurs="1" maxOccurs="1" />
    -    </all>
    -  </complexType>
    -
    -  <complexType name="EnumType">
    -    <all>
    -      <!-- The name of the synthetic enum type -->
    -      <element name="name" type="string" minOccurs="1" maxOccurs="1" />
    -
    -      <!-- A comma separated (CSV format) list of enum literals -->
    -      <element name="literals" type="string" minOccurs="1" maxOccurs="1" />
    -    </all>
    -  </complexType>
    -
    -  <complexType name="ForcedType">
    -    <all>
    -      <!-- The name of the type to be forced upon various artefacts -->
    -      <element name="name" type="string" minOccurs="1" maxOccurs="1" />
    -
    -      <!--
    -        A comma-separated list of Java regular expressions matching
    -        columns, parameters, attributes, etc to be forced to have this
    -        type
    -        -->
    -      <element name="expressions" type="string" minOccurs="1" maxOccurs="1" />
    -    </all>
    -  </complexType>
    -
    -  <complexType name="Generate">
    -    <all>
    -      <!--
    -        Primary key / foreign key relations should be generated and used.
    -        This is a prerequisite for various advanced features
    -        -->
    -      <element name="relations" type="boolean" default="true" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Generate navigation methods to navigate foreign key relationships
    -        directly from Record classes. This is only relevant if relations
    -        is set to true, too
    -        -->
    -      <element name="navigationMethods" type="boolean" default="true" minOccurs="0" maxOccurs="1" />
    -
    -      <!-- Generate deprecated code for backwards compatibility -->
    -      <element name="deprecated" type="boolean" default="true" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Generate instance fields in your tables, as opposed to static
    -        fields. This simplifies aliasing
    -        -->
    -      <element name="instanceFields" type="boolean" default="true" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Generate the javax.annotation.Generated annotation to indicate
    -        jOOQ version used for source code
    -        -->
    -      <element name="generatedAnnotation" type="boolean" default="true" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Generate TableRecord classes. Disable this when you don't
    -        need the additional type-safety
    -        -->
    -      <element name="records" type="boolean" default="true" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Generate POJOs for usage of the ResultQuery.fetchInto(Class) API
    -        -->
    -      <element name="pojos" type="boolean" default="false" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Generate immutable POJOs for usage of the ResultQuery.fetchInto(Class) API
    -        This overrides any value set in <pojos/>
    -        -->
    -      <element name="immutablePojos" type="boolean" default="false" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Generate interfaces that will be implemented by records and/or pojos.
    -        You can also use these interfaces in Record.into(Class<?>) and similar
    -        methods, to let jOOQ return proxy objects for them.
    -        -->
    -      <element name="interfaces" type="boolean" default="false" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Generate DAOs in addition to POJO classes
    -        -->
    -      <element name="daos" type="boolean" default="false" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Annotate POJOs and Records with JPA annotations for increased
    -        compatibility and better integration with JPA/Hibernate, etc
    -        -->
    -      <element name="jpaAnnotations" type="boolean" default="false" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Annotate POJOs and Records with JSR-303 validation annotations
    -        -->
    -      <element name="validationAnnotations" type="boolean" default="false" minOccurs="0" maxOccurs="1" />
    -    </all>
    -  </complexType>
    -
    -  <complexType name="Target">
    -    <all>
    -      <!--
    -        The destination package of your generated classes (within the
    -        destination directory)
    -        -->
    -      <element name="packageName" type="string" default="org.jooq.generated" minOccurs="0" maxOccurs="1" />
    -
    -      <!-- The destination directory of your generated classes -->
    -      <element name="directory" type="string" default="target/generated-sources/jooq" />
    -    </all>
    -  </complexType>
    -</schema>
    \ No newline at end of file
    diff --git a/jOOQ-website/xsd/jooq-codegen-3.0.0.xsd b/jOOQ-website/xsd/jooq-codegen-3.0.0.xsd
    deleted file mode 100644
    index fd482bacab..0000000000
    --- a/jOOQ-website/xsd/jooq-codegen-3.0.0.xsd
    +++ /dev/null
    @@ -1,381 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?>
    -<schema xmlns="http://www.w3.org/2001/XMLSchema"
    -  xmlns:tns="http://www.jooq.org/xsd/jooq-codegen-3.0.0.xsd"
    -  targetNamespace="http://www.jooq.org/xsd/jooq-codegen-3.0.0.xsd"
    -  elementFormDefault="qualified">
    -
    -  <element name="configuration">
    -    <complexType>
    -      <all>
    -        <!--
    -          The JDBC configuration element contains information about how
    -          to set up the database connection used for source code generation
    -          -->
    -        <element name="jdbc" type="tns:Jdbc" minOccurs="1"
    -          maxOccurs="1" />
    -
    -        <!--
    -          The GENERATOR configuration element contains information about
    -          source code generation itself
    -          -->
    -        <element name="generator" type="tns:Generator" minOccurs="1"
    -          maxOccurs="1" />
    -      </all>
    -    </complexType>
    -  </element>
    -
    -  <complexType name="Jdbc">
    -    <all>
    -      <!-- The JDBC driver -->
    -      <element name="driver" type="string" minOccurs="1" maxOccurs="1" />
    -
    -      <!-- The JDBC connection URL -->
    -      <element name="url" type="string" minOccurs="1" maxOccurs="1" />
    -
    -      <!-- Deprecated. Use database schema configuration elements instead -->
    -      <element name="schema" type="string" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        The JDBC connection user. Be sure this user has all required
    -        GRANTs to the dictionary views/tables to generate the desired artefacts
    -        -->
    -      <element name="user" type="string" minOccurs="0" maxOccurs="1" />
    -
    -      <!-- The JDBC connection password -->
    -      <element name="password" type="string" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Enlist custom JDBC driver properties that are provided to the
    -        java.sql.DriverManager when fetching a connection
    -        -->
    -      <element name="properties" type="tns:Properties" minOccurs="0" maxOccurs="1" />
    -    </all>
    -  </complexType>
    -
    -  <complexType name="Properties">
    -    <sequence>
    -      <element name="property" type="tns:Property" minOccurs="0" maxOccurs="unbounded"/>
    -    </sequence>
    -  </complexType>
    -
    -  <complexType name="Property">
    -    <all>
    -      <element name="key" type="string" minOccurs="1" maxOccurs="1"/>
    -      <element name="value" type="string" minOccurs="1" maxOccurs="1"/>
    -    </all>
    -  </complexType>
    -
    -  <complexType name="Generator">
    -    <all>
    -      <!--
    -       The class used to generate source code. You may override this with
    -       your custom source code generator
    -       -->
    -      <element name="name" type="string" default="org.jooq.util.DefaultGenerator"
    -        minOccurs="0" maxOccurs="1" />
    -
    -      <!-- The naming strategy used for class and field names -->
    -      <element name="strategy" type="tns:Strategy" minOccurs="0" maxOccurs="1" />
    -
    -      <!-- The jooq-meta configuration -->
    -      <element name="database" type="tns:Database" minOccurs="1" maxOccurs="1" />
    -
    -      <!-- The jooq-codegen configuration -->
    -      <element name="generate" type="tns:Generate" minOccurs="0" maxOccurs="1" />
    -
    -      <!-- Some information about generation output -->
    -      <element name="target" type="tns:Target" minOccurs="0" maxOccurs="1" />
    -    </all>
    -  </complexType>
    -
    -  <complexType name="Strategy">
    -    <all>
    -      <!--
    -        The class used to provide a naming strategy for generated source
    -        code. You may override this with your custom naming strategy
    -        -->
    -      <element name="name" type="string" minOccurs="0" maxOccurs="1"
    -        default="org.jooq.util.DefaultGeneratorStrategy" />
    -    </all>
    -  </complexType>
    -
    -  <complexType name="Database">
    -    <all>
    -      <!--
    -        The database dialect from jooq-meta. Available dialects are
    -        named org.util.[database].[database]Database. Known values are:
    -
    -        org.jooq.util.ase.ASEDatabase
    -        org.jooq.util.cubrid.CUBRIDDatabase
    -        org.jooq.util.db2.DB2Database
    -        org.jooq.util.derby.DerbyDatabase
    -        org.jooq.util.h2.H2Database
    -        org.jooq.util.hsqldb.HSQLDBDatabase
    -        org.jooq.util.ingres.IngresDatabase
    -        org.jooq.util.mysql.MySQLDatabase
    -        org.jooq.util.oracle.OracleDatabase
    -        org.jooq.util.postgres.PostgresDatabase
    -        org.jooq.util.sqlite.SQLiteDatabaes
    -        org.jooq.util.sqlserver.SQLServerDatabase
    -        org.jooq.util.sybase.SybaseDatabase
    -
    -        You can also provide your own org.jooq.util.Database implementation
    -        here, if your database is currently not supported
    -        -->
    -      <element name="name" type="string" minOccurs="1" maxOccurs="1" />
    -
    -      <!--
    -        All elements that are generated from your schema (A Java regular expression. 
    -        Use the pipe to separate several expressions) Watch out for
    -        case-sensitivity. Depending on your database, this might be
    -        important! You can create case-insensitive regular expressions
    -        using this syntax: (?i:expr)A comma-separated list of regular
    -        expressions
    -        -->
    -      <element name="includes" type="string" default=".*" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        All elements that are excluded from your schema (A Java regular expression. 
    -        Use the pipe to separate several expressions). Excludes match before
    -        includes
    -        -->
    -      <element name="excludes" type="string" default="" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        All table and view columns that are used as "version" fields for
    -        optimistic locking (A Java regular expression. Use the pipe to separate several expressions).
    -        See UpdatableRecord.store() and UpdatableRecord.delete() for details
    -        -->
    -      <element name="recordVersionFields" type="string" default="" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        All table and view columns that are used as "timestamp" fields for
    -        optimistic locking (A Java regular expression. Use the pipe to separate several expressions).
    -        See UpdatableRecord.store() and UpdatableRecord.delete() for details
    -        -->
    -      <element name="recordTimestampFields" type="string" default="" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Generate java.sql.Timestamp fields for DATE columns. This is
    -        particularly useful for Oracle databases
    -        -->
    -      <element name="dateAsTimestamp" type="boolean" default="false" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Generate jOOU data types for your unsigned data types, which are
    -        not natively supported in Java
    -        -->
    -      <element name="unsignedTypes" type="boolean" default="true" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        The schema that is used locally as a source for meta information.
    -        This could be your development schema or the production schema, etc
    -        This cannot be combined with the schemata element.
    -        If left empty (and without any schemata element), jOOQ will generate all available schemata.
    -        For backwards compatibility, this defaults to jdbc/schema
    -        -->
    -      <element name="inputSchema" type="string" default="" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        The schema that is used in generated source code. This will be the
    -        production schema. Use this to override your local development
    -        schema name for source code generation. If not specified, this
    -        will be the same as the input-schema.
    -        -->
    -      <element name="outputSchema" type="string" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        A configuration element to configure several input and/or output
    -        schemata for jooq-meta, in case you're using jooq-meta in a multi-
    -        schema environment
    -        -->
    -      <element name="schemata" type="tns:Schemata" minOccurs="0" maxOccurs="1"/>
    -
    -      <!--
    -        A configuration element to configure custom types introduced to jOOQ
    -        using converters
    -        This is EXPERIMENTAL functionality. Use at your own risk
    -        -->
    -      <element name="customTypes" type="tns:CustomTypes" minOccurs="0" maxOccurs="1"/>
    -
    -      <!--
    -        A configuration element to configure synthetic enum types
    -        This is EXPERIMENTAL / DEPRECATED functionality. Do not re-use
    -        -->
    -      <element name="enumTypes" type="tns:EnumTypes" minOccurs="0" maxOccurs="1"/>
    -
    -      <!--
    -        A configuration element to configure type overrides for generated
    -        artefacts (e.g. in combination with enumTypes)
    -        This is EXPERIMENTAL functionality. Use at your own risk
    -        -->
    -      <element name="forcedTypes" type="tns:ForcedTypes" minOccurs="0" maxOccurs="1"/>
    -    </all>
    -  </complexType>
    -
    -  <complexType name="Schemata">
    -    <sequence>
    -      <!--
    -        A configuration element for a single schema in multi-schema
    -        environments
    -        -->
    -      <element name="schema" type="tns:Schema" minOccurs="1" maxOccurs="unbounded"/>
    -    </sequence>
    -  </complexType>
    -
    -  <complexType name="Schema">
    -    <all>
    -      <!-- See also database/inputSchema -->
    -      <element name="inputSchema" type="string" default="" minOccurs="1" maxOccurs="1" />
    -
    -      <!-- See also database/outputSchema -->
    -      <element name="outputSchema" type="string" minOccurs="0" maxOccurs="1" />
    -    </all>
    -  </complexType>
    -
    -  <complexType name="CustomTypes">
    -    <sequence>
    -      <!-- A configuration element for a custom type -->
    -      <element name="customType" type="tns:CustomType" minOccurs="0" maxOccurs="unbounded" />
    -    </sequence>
    -  </complexType>
    -
    -  <complexType name="EnumTypes">
    -    <sequence>
    -      <!-- A configuration element for a synthetic enum type -->
    -      <element name="enumType" type="tns:EnumType" minOccurs="0" maxOccurs="unbounded" />
    -    </sequence>
    -  </complexType>
    -
    -  <complexType name="ForcedTypes">
    -    <sequence>
    -      <!-- A configuration element for a forced type override -->
    -      <element name="forcedType" type="tns:ForcedType" minOccurs="0" maxOccurs="unbounded" />
    -    </sequence>
    -  </complexType>
    -
    -  <complexType name="CustomType">
    -    <all>
    -      <!-- The name of the custom type -->
    -      <element name="name" type="string" minOccurs="1" maxOccurs="1" />
    -
    -      <!-- A converter implementation for the custom type -->
    -      <element name="converter" type="string" minOccurs="1" maxOccurs="1" />
    -    </all>
    -  </complexType>
    -
    -  <complexType name="EnumType">
    -    <all>
    -      <!-- The name of the synthetic enum type -->
    -      <element name="name" type="string" minOccurs="1" maxOccurs="1" />
    -
    -      <!-- A comma separated (CSV format) list of enum literals -->
    -      <element name="literals" type="string" minOccurs="1" maxOccurs="1" />
    -    </all>
    -  </complexType>
    -
    -  <complexType name="ForcedType">
    -    <all>
    -      <!-- The name of the type to be forced upon various artefacts -->
    -      <element name="name" type="string" minOccurs="1" maxOccurs="1" />
    -
    -      <!--
    -        A Java regular expression matching columns, parameters, attributes, 
    -        etc to be forced to have this type
    -        -->
    -      <element name="expressions" type="string" minOccurs="1" maxOccurs="1" />
    -    </all>
    -  </complexType>
    -
    -  <complexType name="Generate">
    -    <all>
    -      <!--
    -        Primary key / foreign key relations should be generated and used.
    -        This is a prerequisite for various advanced features
    -        -->
    -      <element name="relations" type="boolean" default="true" minOccurs="0" maxOccurs="1" />
    -
    -      <!-- Generate deprecated code for backwards compatibility -->
    -      <element name="deprecated" type="boolean" default="true" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Generate instance fields in your tables, as opposed to static
    -        fields. This simplifies aliasing
    -        -->
    -      <element name="instanceFields" type="boolean" default="true" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Generate the javax.annotation.Generated annotation to indicate
    -        jOOQ version used for source code
    -        -->
    -      <element name="generatedAnnotation" type="boolean" default="true" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Generate TableRecord classes. Disable this when you don't
    -        need the additional type-safety
    -        -->
    -      <element name="records" type="boolean" default="true" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Generate POJOs for usage of the ResultQuery.fetchInto(Class) API
    -        -->
    -      <element name="pojos" type="boolean" default="false" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Generate immutable POJOs for usage of the ResultQuery.fetchInto(Class) API
    -        This overrides any value set in <pojos/>
    -        -->
    -      <element name="immutablePojos" type="boolean" default="false" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Generate interfaces that will be implemented by records and/or pojos.
    -        You can also use these interfaces in Record.into(Class<?>) and similar
    -        methods, to let jOOQ return proxy objects for them.
    -        -->
    -      <element name="interfaces" type="boolean" default="false" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Generate DAOs in addition to POJO classes
    -        -->
    -      <element name="daos" type="boolean" default="false" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Annotate POJOs and Records with JPA annotations for increased
    -        compatibility and better integration with JPA/Hibernate, etc
    -        -->
    -      <element name="jpaAnnotations" type="boolean" default="false" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Annotate POJOs and Records with JSR-303 validation annotations
    -        -->
    -      <element name="validationAnnotations" type="boolean" default="false" minOccurs="0" maxOccurs="1" />
    -      
    -      <!-- 
    -        Allow to turn off the generation of global object references, which include
    -        
    -        - Tables.java
    -        - Sequences.java
    -        - UDTs.java
    -        
    -        Turning off the generation of the above files may be necessary for very
    -        large schemas, which exceed the amount of allowed constants in a class's
    -        constant pool (64k) or, whose static initialiser would exceed 64k of
    -        byte code
    -        -->
    -      <element name="globalObjectReferences" type="boolean" default="true" minOccurs="0" maxOccurs="1" />
    -    </all>
    -  </complexType>
    -
    -  <complexType name="Target">
    -    <all>
    -      <!--
    -        The destination package of your generated classes (within the
    -        destination directory)
    -        -->
    -      <element name="packageName" type="string" default="org.jooq.generated" minOccurs="0" maxOccurs="1" />
    -
    -      <!-- The destination directory of your generated classes -->
    -      <element name="directory" type="string" default="target/generated-sources/jooq" />
    -    </all>
    -  </complexType>
    -</schema>
    \ No newline at end of file
    diff --git a/jOOQ-website/xsd/jooq-codegen-3.2.0.xsd b/jOOQ-website/xsd/jooq-codegen-3.2.0.xsd
    deleted file mode 100644
    index b3058048e2..0000000000
    --- a/jOOQ-website/xsd/jooq-codegen-3.2.0.xsd
    +++ /dev/null
    @@ -1,389 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?>
    -<schema xmlns="http://www.w3.org/2001/XMLSchema"
    -  xmlns:tns="http://www.jooq.org/xsd/jooq-codegen-3.2.0.xsd"
    -  targetNamespace="http://www.jooq.org/xsd/jooq-codegen-3.2.0.xsd"
    -  elementFormDefault="qualified">
    -
    -  <element name="configuration">
    -    <complexType>
    -      <all>
    -        <!--
    -          The JDBC configuration element contains information about how
    -          to set up the database connection used for source code generation
    -          -->
    -        <element name="jdbc" type="tns:Jdbc" minOccurs="1"
    -          maxOccurs="1" />
    -
    -        <!--
    -          The GENERATOR configuration element contains information about
    -          source code generation itself
    -          -->
    -        <element name="generator" type="tns:Generator" minOccurs="1"
    -          maxOccurs="1" />
    -      </all>
    -    </complexType>
    -  </element>
    -
    -  <complexType name="Jdbc">
    -    <all>
    -      <!-- The JDBC driver -->
    -      <element name="driver" type="string" minOccurs="1" maxOccurs="1" />
    -
    -      <!-- The JDBC connection URL -->
    -      <element name="url" type="string" minOccurs="1" maxOccurs="1" />
    -
    -      <!-- Deprecated. Use database schema configuration elements instead -->
    -      <element name="schema" type="string" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        The JDBC connection user. Be sure this user has all required
    -        GRANTs to the dictionary views/tables to generate the desired artefacts
    -        -->
    -      <element name="user" type="string" minOccurs="0" maxOccurs="1" />
    -
    -      <!-- The JDBC connection password -->
    -      <element name="password" type="string" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Enlist custom JDBC driver properties that are provided to the
    -        java.sql.DriverManager when fetching a connection
    -        -->
    -      <element name="properties" type="tns:Properties" minOccurs="0" maxOccurs="1" />
    -    </all>
    -  </complexType>
    -
    -  <complexType name="Properties">
    -    <sequence>
    -      <element name="property" type="tns:Property" minOccurs="0" maxOccurs="unbounded"/>
    -    </sequence>
    -  </complexType>
    -
    -  <complexType name="Property">
    -    <all>
    -      <element name="key" type="string" minOccurs="1" maxOccurs="1"/>
    -      <element name="value" type="string" minOccurs="1" maxOccurs="1"/>
    -    </all>
    -  </complexType>
    -
    -  <complexType name="Generator">
    -    <all>
    -      <!--
    -       The class used to generate source code. You may override this with
    -       your custom source code generator
    -       -->
    -      <element name="name" type="string" default="org.jooq.util.DefaultGenerator"
    -        minOccurs="0" maxOccurs="1" />
    -
    -      <!-- The naming strategy used for class and field names -->
    -      <element name="strategy" type="tns:Strategy" minOccurs="0" maxOccurs="1" />
    -
    -      <!-- The jooq-meta configuration -->
    -      <element name="database" type="tns:Database" minOccurs="1" maxOccurs="1" />
    -
    -      <!-- The jooq-codegen configuration -->
    -      <element name="generate" type="tns:Generate" minOccurs="0" maxOccurs="1" />
    -
    -      <!-- Some information about generation output -->
    -      <element name="target" type="tns:Target" minOccurs="0" maxOccurs="1" />
    -    </all>
    -  </complexType>
    -
    -  <complexType name="Strategy">
    -    <all>
    -      <!--
    -        The class used to provide a naming strategy for generated source
    -        code. You may override this with your custom naming strategy
    -        -->
    -      <element name="name" type="string" minOccurs="0" maxOccurs="1"
    -        default="org.jooq.util.DefaultGeneratorStrategy" />
    -    </all>
    -  </complexType>
    -
    -  <complexType name="Database">
    -    <all>
    -      <!--
    -        The database dialect from jooq-meta. Available dialects are
    -        named org.util.[database].[database]Database. Known values are:
    -
    -        org.jooq.util.ase.ASEDatabase
    -        org.jooq.util.cubrid.CUBRIDDatabase
    -        org.jooq.util.db2.DB2Database
    -        org.jooq.util.derby.DerbyDatabase
    -        org.jooq.util.h2.H2Database
    -        org.jooq.util.hsqldb.HSQLDBDatabase
    -        org.jooq.util.ingres.IngresDatabase
    -        org.jooq.util.mysql.MySQLDatabase
    -        org.jooq.util.oracle.OracleDatabase
    -        org.jooq.util.postgres.PostgresDatabase
    -        org.jooq.util.sqlite.SQLiteDatabaes
    -        org.jooq.util.sqlserver.SQLServerDatabase
    -        org.jooq.util.sybase.SybaseDatabase
    -
    -        You can also provide your own org.jooq.util.Database implementation
    -        here, if your database is currently not supported
    -        -->
    -      <element name="name" type="string" minOccurs="1" maxOccurs="1" />
    -
    -      <!--
    -        All elements that are generated from your schema (A Java regular expression. 
    -        Use the pipe to separate several expressions) Watch out for
    -        case-sensitivity. Depending on your database, this might be
    -        important! You can create case-insensitive regular expressions
    -        using this syntax: (?i:expr)A comma-separated list of regular
    -        expressions
    -        -->
    -      <element name="includes" type="string" default=".*" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        All elements that are excluded from your schema (A Java regular expression. 
    -        Use the pipe to separate several expressions). Excludes match before
    -        includes
    -        -->
    -      <element name="excludes" type="string" default="" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        This flag indicates whether include / exclude patterns should also match
    -        columns within tables. 
    -        -->
    -      <element name="includeExcludeColumns" type="boolean" default="false" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        All table and view columns that are used as "version" fields for
    -        optimistic locking (A Java regular expression. Use the pipe to separate several expressions).
    -        See UpdatableRecord.store() and UpdatableRecord.delete() for details
    -        -->
    -      <element name="recordVersionFields" type="string" default="" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        All table and view columns that are used as "timestamp" fields for
    -        optimistic locking (A Java regular expression. Use the pipe to separate several expressions).
    -        See UpdatableRecord.store() and UpdatableRecord.delete() for details
    -        -->
    -      <element name="recordTimestampFields" type="string" default="" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Generate java.sql.Timestamp fields for DATE columns. This is
    -        particularly useful for Oracle databases
    -        -->
    -      <element name="dateAsTimestamp" type="boolean" default="false" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Generate jOOU data types for your unsigned data types, which are
    -        not natively supported in Java
    -        -->
    -      <element name="unsignedTypes" type="boolean" default="true" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        The schema that is used locally as a source for meta information.
    -        This could be your development schema or the production schema, etc
    -        This cannot be combined with the schemata element.
    -        If left empty (and without any schemata element), jOOQ will generate all available schemata.
    -        For backwards compatibility, this defaults to jdbc/schema
    -        -->
    -      <element name="inputSchema" type="string" default="" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        The schema that is used in generated source code. This will be the
    -        production schema. Use this to override your local development
    -        schema name for source code generation. If not specified, this
    -        will be the same as the input-schema.
    -        -->
    -      <element name="outputSchema" type="string" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        A configuration element to configure several input and/or output
    -        schemata for jooq-meta, in case you're using jooq-meta in a multi-
    -        schema environment
    -        -->
    -      <element name="schemata" type="tns:Schemata" minOccurs="0" maxOccurs="1"/>
    -
    -      <!--
    -        A configuration element to configure custom types introduced to jOOQ
    -        using converters
    -        -->
    -      <element name="customTypes" type="tns:CustomTypes" minOccurs="0" maxOccurs="1"/>
    -
    -      <!--
    -        A configuration element to configure synthetic enum types
    -        This is EXPERIMENTAL / DEPRECATED functionality. Do not re-use
    -        -->
    -      <element name="enumTypes" type="tns:EnumTypes" minOccurs="0" maxOccurs="1"/>
    -
    -      <!--
    -        A configuration element to configure type overrides for generated
    -        artefacts (e.g. in combination with enumTypes)
    -        -->
    -      <element name="forcedTypes" type="tns:ForcedTypes" minOccurs="0" maxOccurs="1"/>
    -    </all>
    -  </complexType>
    -
    -  <complexType name="Schemata">
    -    <sequence>
    -      <!--
    -        A configuration element for a single schema in multi-schema
    -        environments
    -        -->
    -      <element name="schema" type="tns:Schema" minOccurs="1" maxOccurs="unbounded"/>
    -    </sequence>
    -  </complexType>
    -
    -  <complexType name="Schema">
    -    <all>
    -      <!-- See also database/inputSchema -->
    -      <element name="inputSchema" type="string" default="" minOccurs="1" maxOccurs="1" />
    -
    -      <!-- See also database/outputSchema -->
    -      <element name="outputSchema" type="string" minOccurs="0" maxOccurs="1" />
    -    </all>
    -  </complexType>
    -
    -  <complexType name="CustomTypes">
    -    <sequence>
    -      <!-- A configuration element for a custom type -->
    -      <element name="customType" type="tns:CustomType" minOccurs="0" maxOccurs="unbounded" />
    -    </sequence>
    -  </complexType>
    -
    -  <complexType name="EnumTypes">
    -    <sequence>
    -      <!-- A configuration element for a synthetic enum type -->
    -      <element name="enumType" type="tns:EnumType" minOccurs="0" maxOccurs="unbounded" />
    -    </sequence>
    -  </complexType>
    -
    -  <complexType name="ForcedTypes">
    -    <sequence>
    -      <!-- A configuration element for a forced type override -->
    -      <element name="forcedType" type="tns:ForcedType" minOccurs="0" maxOccurs="unbounded" />
    -    </sequence>
    -  </complexType>
    -
    -  <complexType name="CustomType">
    -    <all>
    -      <!-- The name of the custom type -->
    -      <element name="name" type="string" minOccurs="1" maxOccurs="1" />
    -
    -      <!-- A converter implementation for the custom type -->
    -      <element name="converter" type="string" minOccurs="1" maxOccurs="1" />
    -    </all>
    -  </complexType>
    -
    -  <complexType name="EnumType">
    -    <all>
    -      <!-- The name of the synthetic enum type -->
    -      <element name="name" type="string" minOccurs="1" maxOccurs="1" />
    -
    -      <!-- A comma separated (CSV format) list of enum literals -->
    -      <element name="literals" type="string" minOccurs="1" maxOccurs="1" />
    -    </all>
    -  </complexType>
    -
    -  <complexType name="ForcedType">
    -    <all>
    -      <!-- The name of the type to be forced upon various artefacts -->
    -      <element name="name" type="string" minOccurs="1" maxOccurs="1" />
    -
    -      <!--
    -        A Java regular expression matching columns, parameters, attributes, 
    -        etc to be forced to have this type
    -        -->
    -      <element name="expressions" type="string" minOccurs="1" maxOccurs="1" />
    -    </all>
    -  </complexType>
    -
    -  <complexType name="Generate">
    -    <all>
    -      <!--
    -        Primary key / foreign key relations should be generated and used.
    -        This is a prerequisite for various advanced features
    -        -->
    -      <element name="relations" type="boolean" default="true" minOccurs="0" maxOccurs="1" />
    -
    -      <!-- Generate deprecated code for backwards compatibility -->
    -      <element name="deprecated" type="boolean" default="true" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Generate instance fields in your tables, as opposed to static
    -        fields. This simplifies aliasing
    -        -->
    -      <element name="instanceFields" type="boolean" default="true" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Generate the javax.annotation.Generated annotation to indicate
    -        jOOQ version used for source code
    -        -->
    -      <element name="generatedAnnotation" type="boolean" default="true" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Generate TableRecord classes. Disable this when you don't
    -        need the additional type-safety
    -        -->
    -      <element name="records" type="boolean" default="true" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Generate POJOs for usage of the ResultQuery.fetchInto(Class) API
    -        -->
    -      <element name="pojos" type="boolean" default="false" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Generate immutable POJOs for usage of the ResultQuery.fetchInto(Class) API
    -        This overrides any value set in <pojos/>
    -        -->
    -      <element name="immutablePojos" type="boolean" default="false" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Generate interfaces that will be implemented by records and/or pojos.
    -        You can also use these interfaces in Record.into(Class<?>) and similar
    -        methods, to let jOOQ return proxy objects for them.
    -        -->
    -      <element name="interfaces" type="boolean" default="false" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Generate DAOs in addition to POJO classes
    -        -->
    -      <element name="daos" type="boolean" default="false" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Annotate POJOs and Records with JPA annotations for increased
    -        compatibility and better integration with JPA/Hibernate, etc
    -        -->
    -      <element name="jpaAnnotations" type="boolean" default="false" minOccurs="0" maxOccurs="1" />
    -
    -      <!--
    -        Annotate POJOs and Records with JSR-303 validation annotations
    -        -->
    -      <element name="validationAnnotations" type="boolean" default="false" minOccurs="0" maxOccurs="1" />
    -      
    -      <!-- 
    -        Allow to turn off the generation of global object references, which include
    -        
    -        - Tables.java
    -        - Sequences.java
    -        - UDTs.java
    -        
    -        Turning off the generation of the above files may be necessary for very
    -        large schemas, which exceed the amount of allowed constants in a class's
    -        constant pool (64k) or, whose static initialiser would exceed 64k of
    -        byte code
    -        -->
    -      <element name="globalObjectReferences" type="boolean" default="true" minOccurs="0" maxOccurs="1" />
    -    </all>
    -  </complexType>
    -
    -  <complexType name="Target">
    -    <all>
    -      <!--
    -        The destination package of your generated classes (within the
    -        destination directory)
    -           
    -        jOOQ may append the schema name to this package if generating multiple schemas,
    -        e.g. org.jooq.generated.schema1
    -             org.jooq.generated.schema2
    -        -->
    -      <element name="packageName" type="string" default="org.jooq.generated" minOccurs="0" maxOccurs="1" />
    -
    -      <!-- The destination directory of your generated classes -->
    -      <element name="directory" type="string" default="target/generated-sources/jooq" />
    -    </all>
    -  </complexType>
    -</schema>
    \ No newline at end of file
    diff --git a/jOOQ-website/xsd/jooq-export-1.6.2.xsd b/jOOQ-website/xsd/jooq-export-1.6.2.xsd
    deleted file mode 100644
    index 02325219ce..0000000000
    --- a/jOOQ-website/xsd/jooq-export-1.6.2.xsd
    +++ /dev/null
    @@ -1,45 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?>
    -<schema 
    -	xmlns="http://www.w3.org/2001/XMLSchema" 
    -	xmlns:jooq-export="http://www.jooq.org/xsd/jooq-export-1.6.2.xsd"
    -	targetNamespace="http://www.jooq.org/xsd/jooq-export-1.6.2.xsd">
    -    
    -    <element name="result" type="jooq-export:Result"/>
    -
    -    <complexType name="Result">
    -     	<sequence>
    -     		<element name="fields" type="jooq-export:Fields" maxOccurs="1" minOccurs="1"/>
    -     		<element name="records" type="jooq-export:Records" maxOccurs="1" minOccurs="1"/>
    -     	</sequence>
    -    </complexType>
    -    
    -    <complexType name="Fields">
    -    	<sequence>
    -    		<element name="field" type="jooq-export:Field" maxOccurs="unbounded" minOccurs="0"/>
    -    	</sequence>
    -    </complexType>
    -    
    -    <complexType name="Field">
    -    	<attribute name="name" type="string"/>
    -    </complexType>
    -    
    -    <complexType name="Records">
    -    	<sequence>
    -    		<element name="record" type="jooq-export:Record" maxOccurs="unbounded" minOccurs="0"/>
    -    	</sequence>
    -    </complexType>
    -    
    -    <complexType name="Record">
    -    	<sequence>
    -    		<element name="value" type="jooq-export:Value" maxOccurs="unbounded" minOccurs="0"/>
    -    	</sequence>
    -    </complexType>
    -    
    -    <complexType name="Value">
    -    	<simpleContent>
    -    		<extension base="string">
    -    			<attribute name="field" type="string"/>
    -    		</extension>
    -    	</simpleContent>
    -    </complexType>
    -</schema>
    \ No newline at end of file
    diff --git a/jOOQ-website/xsd/jooq-export-2.6.0.xsd b/jOOQ-website/xsd/jooq-export-2.6.0.xsd
    deleted file mode 100644
    index 47a0cd4e8c..0000000000
    --- a/jOOQ-website/xsd/jooq-export-2.6.0.xsd
    +++ /dev/null
    @@ -1,46 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?>
    -<schema
    -    xmlns="http://www.w3.org/2001/XMLSchema"
    -    xmlns:jooq-export="http://www.jooq.org/xsd/jooq-export-1.6.2.xsd"
    -    targetNamespace="http://www.jooq.org/xsd/jooq-export-1.6.2.xsd">
    -
    -    <element name="result" type="jooq-export:Result"/>
    -
    -    <complexType name="Result">
    -         <sequence>
    -             <element name="fields" type="jooq-export:Fields" maxOccurs="1" minOccurs="1"/>
    -             <element name="records" type="jooq-export:Records" maxOccurs="1" minOccurs="1"/>
    -         </sequence>
    -    </complexType>
    -
    -    <complexType name="Fields">
    -        <sequence>
    -            <element name="field" type="jooq-export:Field" maxOccurs="unbounded" minOccurs="0"/>
    -        </sequence>
    -    </complexType>
    -
    -    <complexType name="Field">
    -        <attribute name="name" type="string"/>
    -        <attribute name="type" type="string"/>
    -    </complexType>
    -
    -    <complexType name="Records">
    -        <sequence>
    -            <element name="record" type="jooq-export:Record" maxOccurs="unbounded" minOccurs="0"/>
    -        </sequence>
    -    </complexType>
    -
    -    <complexType name="Record">
    -        <sequence>
    -            <element name="value" type="jooq-export:Value" maxOccurs="unbounded" minOccurs="0"/>
    -        </sequence>
    -    </complexType>
    -
    -    <complexType name="Value">
    -        <simpleContent>
    -            <extension base="string">
    -                <attribute name="field" type="string"/>
    -            </extension>
    -        </simpleContent>
    -    </complexType>
    -</schema>
    \ No newline at end of file
    diff --git a/jOOQ-website/xsd/jooq-runtime-2.0.5.xsd b/jOOQ-website/xsd/jooq-runtime-2.0.5.xsd
    deleted file mode 100644
    index eb66ec3ec0..0000000000
    --- a/jOOQ-website/xsd/jooq-runtime-2.0.5.xsd
    +++ /dev/null
    @@ -1,105 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?>
    -<schema
    -	xmlns="http://www.w3.org/2001/XMLSchema"
    -	xmlns:jooq-runtime="http://www.jooq.org/xsd/jooq-runtime-2.0.5.xsd"
    -	xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
    -    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
    -    jaxb:version="1.0" jaxb:extensionBindingPrefixes="xjc"
    -	targetNamespace="http://www.jooq.org/xsd/jooq-runtime-2.0.5.xsd">
    -
    -	<annotation>
    -	    <appinfo>
    -	        <jaxb:globalBindings>
    -	            <xjc:serializable uid="205"/>
    -	        </jaxb:globalBindings>
    -	    </appinfo>
    -	</annotation>
    -
    -    <element name="settings" type="jooq-runtime:Settings"/>
    -
    -	<complexType name="Settings">
    -		<all>
    -			<!-- Configure render mapping for runtime schema / table rewriting in
    -			     generated SQL -->
    -			<element name="renderMapping" type="jooq-runtime:RenderMapping" minOccurs="0" maxOccurs="1"/>
    -
    -			<!-- The type of statement that is to be executed -->
    -			<element name="statementType" type="jooq-runtime:StatementType" minOccurs="0" maxOccurs="1" default="PREPARED_STATEMENT"/>
    -
    -			<!-- When set to true, this will add jOOQ's default logging ExecuteListeners -->
    -			<element name="executeLogging" type="boolean" minOccurs="0" maxOccurs="1" default="true"/>
    -
    -			<!-- The event listeners to be notified upon execution events -->
    -			<element name="executeListeners" type="jooq-runtime:ExecuteListeners" minOccurs="0" maxOccurs="1"/>
    -		</all>
    -	</complexType>
    -
    -	<complexType name="RenderMapping">
    -		<all>
    -			<!-- The default schema as defined in org.jooq.Schema.getName()
    -			     This schema will be omitted in rendered SQL -->
    -			<element name="defaultSchema" type="string" minOccurs="0" maxOccurs="1"/>
    -
    -			<!-- The mapped schemata configuration -->
    -			<element name="schemata" type="jooq-runtime:MappedSchemata" minOccurs="0" maxOccurs="1"/>
    -		</all>
    -	</complexType>
    -
    -	<complexType name="MappedSchemata">
    -		<sequence>
    -			<element name="schema" type="jooq-runtime:MappedSchema" minOccurs="0" maxOccurs="unbounded"/>
    -		</sequence>
    -	</complexType>
    -
    -	<complexType name="MappedSchema">
    -		<all>
    -			<!-- The input schema as defined in org.jooq.Schema.getName() -->
    -			<element name="input" type="string" minOccurs="1" maxOccurs="1"/>
    -
    -			<!-- The output schema as it will be rendered in SQL
    -			     When this is omitted, you can still apply table mapping -->
    -			<element name="output" type="string" minOccurs="0" maxOccurs="1"/>
    -
    -			<!-- Configure table mapping for runtime table rewriting in
    -			     generated SQL -->
    -			<element name="tables" type="jooq-runtime:MappedTables" minOccurs="0" maxOccurs="1"/>
    -		</all>
    -	</complexType>
    -
    -	<complexType name="MappedTables">
    -		<sequence>
    -			<element name="table" type="jooq-runtime:MappedTable" minOccurs="0" maxOccurs="unbounded"/>
    -		</sequence>
    -	</complexType>
    -
    -	<complexType name="MappedTable">
    -		<all>
    -			<!-- The input schema as defined in org.jooq.Table.getName() -->
    -			<element name="input" type="string" minOccurs="1" maxOccurs="1"/>
    -
    -			<!-- The output schema as it will be rendered in SQL -->
    -			<element name="output" type="string" minOccurs="1" maxOccurs="1"/>
    -		</all>
    -	</complexType>
    -
    -	<simpleType name="StatementType">
    -		<restriction base="string">
    -
    -			<!-- Execute statements with inlined bind values, avoiding JDBC's
    -			     PreparedStatements -->
    -			<enumeration value="STATIC_STATEMENT"/>
    -
    -			<!-- Execute statements with bind values, using JDBC's
    -			     PreparedStatements -->
    -			<enumeration value="PREPARED_STATEMENT"/>
    -		</restriction>
    -	</simpleType>
    -
    -	<complexType name="ExecuteListeners">
    -		<sequence>
    -
    -			<!-- An event listener implementing org.jooq.ExecuteListener -->
    -			<element name="executeListener" type="string" minOccurs="0" maxOccurs="unbounded"/>
    -		</sequence>
    -	</complexType>
    -</schema>
    \ No newline at end of file
    diff --git a/jOOQ-website/xsd/jooq-runtime-2.1.0.xsd b/jOOQ-website/xsd/jooq-runtime-2.1.0.xsd
    deleted file mode 100644
    index 4147bfda11..0000000000
    --- a/jOOQ-website/xsd/jooq-runtime-2.1.0.xsd
    +++ /dev/null
    @@ -1,160 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?>
    -<schema
    -  xmlns="http://www.w3.org/2001/XMLSchema"
    -  xmlns:jooq-runtime="http://www.jooq.org/xsd/jooq-runtime-2.1.0.xsd"
    -  xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
    -  xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
    -  jaxb:version="1.0" jaxb:extensionBindingPrefixes="xjc"
    -  targetNamespace="http://www.jooq.org/xsd/jooq-runtime-2.1.0.xsd">
    -
    -  <annotation>
    -    <appinfo>
    -      <jaxb:globalBindings>
    -        <xjc:serializable uid="205"/>
    -      </jaxb:globalBindings>
    -    </appinfo>
    -  </annotation>
    -
    -  <element name="settings" type="jooq-runtime:Settings"/>
    -
    -  <complexType name="Settings">
    -    <all>
    -      <!-- Configure render mapping for runtime schema / table rewriting in
    -           generated SQL -->
    -      <element name="renderMapping" type="jooq-runtime:RenderMapping" minOccurs="0" maxOccurs="1"/>
    -
    -      <!-- Whether rendered schema, table, column names, etc should be quoted
    -           in rendered SQL, or transformed in any other way.
    -           This is set to "QUOTED" by default for backwards-compatibility -->
    -      <element name="renderNameStyle" type="jooq-runtime:RenderNameStyle" minOccurs="0" maxOccurs="1" default="QUOTED"/>
    -
    -      <!-- Whether SQL keywords should be rendered with upper or lower case -->
    -      <element name="renderKeywordStyle" type="jooq-runtime:RenderKeywordStyle" minOccurs="0" maxOccurs="1" default="LOWER"/>
    -
    -      <!-- Whether rendered SQL should be pretty-printed -->
    -      <element name="renderFormatted" type="boolean" minOccurs="0" maxOccurs="1" default="false"/>
    -
    -      <!-- The type of statement that is to be executed -->
    -      <element name="statementType" type="jooq-runtime:StatementType" minOccurs="0" maxOccurs="1" default="PREPARED_STATEMENT"/>
    -
    -      <!-- When set to true, this will add jOOQ's default logging ExecuteListeners -->
    -      <element name="executeLogging" type="boolean" minOccurs="0" maxOccurs="1" default="true"/>
    -
    -      <!-- The event listeners to be notified upon execution events -->
    -      <element name="executeListeners" type="jooq-runtime:ExecuteListeners" minOccurs="0" maxOccurs="1"/>
    -    </all>
    -  </complexType>
    -
    -  <complexType name="RenderMapping">
    -    <all>
    -      <!-- The default schema as defined in org.jooq.Schema.getName()
    -           This schema will be omitted in rendered SQL -->
    -      <element name="defaultSchema" type="string" minOccurs="0" maxOccurs="1"/>
    -
    -      <!-- The mapped schemata configuration -->
    -      <element name="schemata" type="jooq-runtime:MappedSchemata" minOccurs="0" maxOccurs="1"/>
    -    </all>
    -  </complexType>
    -
    -  <complexType name="MappedSchemata">
    -    <sequence>
    -      <element name="schema" type="jooq-runtime:MappedSchema" minOccurs="0" maxOccurs="unbounded"/>
    -    </sequence>
    -  </complexType>
    -
    -  <complexType name="MappedSchema">
    -    <all>
    -      <!-- The input schema as defined in org.jooq.Schema.getName() -->
    -      <element name="input" type="string" minOccurs="1" maxOccurs="1"/>
    -
    -      <!-- The output schema as it will be rendered in SQL
    -           When this is omitted, you can still apply table mapping -->
    -      <element name="output" type="string" minOccurs="0" maxOccurs="1"/>
    -
    -      <!-- Configure table mapping for runtime table rewriting in
    -           generated SQL -->
    -      <element name="tables" type="jooq-runtime:MappedTables" minOccurs="0" maxOccurs="1"/>
    -    </all>
    -  </complexType>
    -
    -  <complexType name="MappedTables">
    -    <sequence>
    -      <element name="table" type="jooq-runtime:MappedTable" minOccurs="0" maxOccurs="unbounded"/>
    -    </sequence>
    -  </complexType>
    -
    -  <complexType name="MappedTable">
    -    <all>
    -      <!-- The input schema as defined in org.jooq.Table.getName() -->
    -      <element name="input" type="string" minOccurs="1" maxOccurs="1"/>
    -
    -      <!-- The output schema as it will be rendered in SQL -->
    -      <element name="output" type="string" minOccurs="1" maxOccurs="1"/>
    -    </all>
    -  </complexType>
    -
    -  <simpleType name="StatementType">
    -    <restriction base="string">
    -
    -      <!-- Execute statements with inlined bind values, avoiding JDBC's
    -           PreparedStatements -->
    -      <enumeration value="STATIC_STATEMENT"/>
    -
    -      <!-- Execute statements with bind values, using JDBC's
    -           PreparedStatements -->
    -      <enumeration value="PREPARED_STATEMENT"/>
    -    </restriction>
    -  </simpleType>
    -
    -  <simpleType name="RenderNameStyle">
    -    <restriction base="string">
    -
    -      <!-- Render object names quoted, as defined in the database. Use this
    -           to stay on the safe side with case-sensitivity and special
    -           characters. For instance:
    -           Oracle    : "SYS"."ALL_TAB_COLS"
    -           MySQL     : `information_schema`.`TABLES`
    -           SQL Server: [INFORMATION_SCHEMA].[TABLES] -->
    -      <enumeration value="QUOTED"/>
    -
    -      <!-- Render object names, as defined in the database. For instance:
    -           Oracle    : SYS.ALL_TAB_COLS
    -           MySQL     : information_schema.TABLES
    -           SQL Server: INFORMATION_SCHEMA.TABLES -->
    -      <enumeration value="AS_IS"/>
    -
    -      <!-- Force rendering object names in lower case. For instance:
    -           Oracle    : sys.all_tab_cols
    -           MySQL     : information_schema.tables
    -           SQL Server: information_schema.tables -->
    -      <enumeration value="LOWER"/>
    -
    -      <!-- Force rendering object names in upper case. For instance:
    -           Oracle    : SYS.ALL_TAB_COLS
    -           MySQL     : INFORMATION_SCHEMA.TABLES
    -           SQL Server: INFORMATION_SCHEMA.TABLES -->
    -      <enumeration value="UPPER"/>
    -    </restriction>
    -  </simpleType>
    -
    -  <simpleType name="RenderKeywordStyle">
    -    <restriction base="string">
    -
    -      <!-- Keywords are rendered in lower case. For instance:
    -           select .. from .. where .. -->
    -      <enumeration value="LOWER"/>
    -
    -      <!-- Keywords are rendered in upper case. For instance:
    -           SELECT .. FROM .. WHERE .. -->
    -      <enumeration value="UPPER"/>
    -    </restriction>
    -  </simpleType>
    -
    -  <complexType name="ExecuteListeners">
    -    <sequence>
    -
    -      <!-- An event listener implementing org.jooq.ExecuteListener -->
    -      <element name="executeListener" type="string" minOccurs="0" maxOccurs="unbounded"/>
    -    </sequence>
    -  </complexType>
    -</schema>
    \ No newline at end of file
    diff --git a/jOOQ-website/xsd/jooq-runtime-2.3.0.xsd b/jOOQ-website/xsd/jooq-runtime-2.3.0.xsd
    deleted file mode 100644
    index 35f16369d1..0000000000
    --- a/jOOQ-website/xsd/jooq-runtime-2.3.0.xsd
    +++ /dev/null
    @@ -1,165 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?>
    -<schema
    -  xmlns="http://www.w3.org/2001/XMLSchema"
    -  xmlns:jooq-runtime="http://www.jooq.org/xsd/jooq-runtime-2.3.0.xsd"
    -  xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
    -  xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
    -  jaxb:version="1.0" jaxb:extensionBindingPrefixes="xjc"
    -  targetNamespace="http://www.jooq.org/xsd/jooq-runtime-2.3.0.xsd">
    -
    -  <annotation>
    -    <appinfo>
    -      <jaxb:globalBindings>
    -        <xjc:serializable uid="205"/>
    -      </jaxb:globalBindings>
    -    </appinfo>
    -  </annotation>
    -
    -  <element name="settings" type="jooq-runtime:Settings"/>
    -
    -  <complexType name="Settings">
    -    <all>
    -      <!-- Whether any schema name should be rendered at all.
    -           Use this for single-schema environments, or when all objects are made
    -           available using synonyms -->
    -      <element name="renderSchema" type="boolean" minOccurs="0" maxOccurs="1" default="true"/>
    -
    -      <!-- Configure render mapping for runtime schema / table rewriting in
    -           generated SQL -->
    -      <element name="renderMapping" type="jooq-runtime:RenderMapping" minOccurs="0" maxOccurs="1"/>
    -
    -      <!-- Whether rendered schema, table, column names, etc should be quoted
    -           in rendered SQL, or transformed in any other way.
    -           This is set to "QUOTED" by default for backwards-compatibility -->
    -      <element name="renderNameStyle" type="jooq-runtime:RenderNameStyle" minOccurs="0" maxOccurs="1" default="QUOTED"/>
    -
    -      <!-- Whether SQL keywords should be rendered with upper or lower case -->
    -      <element name="renderKeywordStyle" type="jooq-runtime:RenderKeywordStyle" minOccurs="0" maxOccurs="1" default="LOWER"/>
    -
    -      <!-- Whether rendered SQL should be pretty-printed -->
    -      <element name="renderFormatted" type="boolean" minOccurs="0" maxOccurs="1" default="false"/>
    -
    -      <!-- The type of statement that is to be executed -->
    -      <element name="statementType" type="jooq-runtime:StatementType" minOccurs="0" maxOccurs="1" default="PREPARED_STATEMENT"/>
    -
    -      <!-- When set to true, this will add jOOQ's default logging ExecuteListeners -->
    -      <element name="executeLogging" type="boolean" minOccurs="0" maxOccurs="1" default="true"/>
    -
    -      <!-- The event listeners to be notified upon execution events -->
    -      <element name="executeListeners" type="jooq-runtime:ExecuteListeners" minOccurs="0" maxOccurs="1"/>
    -    </all>
    -  </complexType>
    -
    -  <complexType name="RenderMapping">
    -    <all>
    -      <!-- The default schema as defined in org.jooq.Schema.getName()
    -           This schema will be omitted in rendered SQL -->
    -      <element name="defaultSchema" type="string" minOccurs="0" maxOccurs="1"/>
    -
    -      <!-- The mapped schemata configuration -->
    -      <element name="schemata" type="jooq-runtime:MappedSchemata" minOccurs="0" maxOccurs="1"/>
    -    </all>
    -  </complexType>
    -
    -  <complexType name="MappedSchemata">
    -    <sequence>
    -      <element name="schema" type="jooq-runtime:MappedSchema" minOccurs="0" maxOccurs="unbounded"/>
    -    </sequence>
    -  </complexType>
    -
    -  <complexType name="MappedSchema">
    -    <all>
    -      <!-- The input schema as defined in org.jooq.Schema.getName() -->
    -      <element name="input" type="string" minOccurs="1" maxOccurs="1"/>
    -
    -      <!-- The output schema as it will be rendered in SQL
    -           When this is omitted, you can still apply table mapping -->
    -      <element name="output" type="string" minOccurs="0" maxOccurs="1"/>
    -
    -      <!-- Configure table mapping for runtime table rewriting in
    -           generated SQL -->
    -      <element name="tables" type="jooq-runtime:MappedTables" minOccurs="0" maxOccurs="1"/>
    -    </all>
    -  </complexType>
    -
    -  <complexType name="MappedTables">
    -    <sequence>
    -      <element name="table" type="jooq-runtime:MappedTable" minOccurs="0" maxOccurs="unbounded"/>
    -    </sequence>
    -  </complexType>
    -
    -  <complexType name="MappedTable">
    -    <all>
    -      <!-- The input schema as defined in org.jooq.Table.getName() -->
    -      <element name="input" type="string" minOccurs="1" maxOccurs="1"/>
    -
    -      <!-- The output schema as it will be rendered in SQL -->
    -      <element name="output" type="string" minOccurs="1" maxOccurs="1"/>
    -    </all>
    -  </complexType>
    -
    -  <simpleType name="StatementType">
    -    <restriction base="string">
    -
    -      <!-- Execute statements with inlined bind values, avoiding JDBC's
    -           PreparedStatements -->
    -      <enumeration value="STATIC_STATEMENT"/>
    -
    -      <!-- Execute statements with bind values, using JDBC's
    -           PreparedStatements -->
    -      <enumeration value="PREPARED_STATEMENT"/>
    -    </restriction>
    -  </simpleType>
    -
    -  <simpleType name="RenderNameStyle">
    -    <restriction base="string">
    -
    -      <!-- Render object names quoted, as defined in the database. Use this
    -           to stay on the safe side with case-sensitivity and special
    -           characters. For instance:
    -           Oracle    : "SYS"."ALL_TAB_COLS"
    -           MySQL     : `information_schema`.`TABLES`
    -           SQL Server: [INFORMATION_SCHEMA].[TABLES] -->
    -      <enumeration value="QUOTED"/>
    -
    -      <!-- Render object names, as defined in the database. For instance:
    -           Oracle    : SYS.ALL_TAB_COLS
    -           MySQL     : information_schema.TABLES
    -           SQL Server: INFORMATION_SCHEMA.TABLES -->
    -      <enumeration value="AS_IS"/>
    -
    -      <!-- Force rendering object names in lower case. For instance:
    -           Oracle    : sys.all_tab_cols
    -           MySQL     : information_schema.tables
    -           SQL Server: information_schema.tables -->
    -      <enumeration value="LOWER"/>
    -
    -      <!-- Force rendering object names in upper case. For instance:
    -           Oracle    : SYS.ALL_TAB_COLS
    -           MySQL     : INFORMATION_SCHEMA.TABLES
    -           SQL Server: INFORMATION_SCHEMA.TABLES -->
    -      <enumeration value="UPPER"/>
    -    </restriction>
    -  </simpleType>
    -
    -  <simpleType name="RenderKeywordStyle">
    -    <restriction base="string">
    -
    -      <!-- Keywords are rendered in lower case. For instance:
    -           select .. from .. where .. -->
    -      <enumeration value="LOWER"/>
    -
    -      <!-- Keywords are rendered in upper case. For instance:
    -           SELECT .. FROM .. WHERE .. -->
    -      <enumeration value="UPPER"/>
    -    </restriction>
    -  </simpleType>
    -
    -  <complexType name="ExecuteListeners">
    -    <sequence>
    -
    -      <!-- An event listener implementing org.jooq.ExecuteListener -->
    -      <element name="executeListener" type="string" minOccurs="0" maxOccurs="unbounded"/>
    -    </sequence>
    -  </complexType>
    -</schema>
    \ No newline at end of file
    diff --git a/jOOQ-website/xsd/jooq-runtime-2.5.0.xsd b/jOOQ-website/xsd/jooq-runtime-2.5.0.xsd
    deleted file mode 100644
    index ed5ae2ee27..0000000000
    --- a/jOOQ-website/xsd/jooq-runtime-2.5.0.xsd
    +++ /dev/null
    @@ -1,171 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?>
    -<schema
    -  xmlns="http://www.w3.org/2001/XMLSchema"
    -  xmlns:jooq-runtime="http://www.jooq.org/xsd/jooq-runtime-2.5.0.xsd"
    -  xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
    -  xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
    -  jaxb:version="1.0" jaxb:extensionBindingPrefixes="xjc"
    -  targetNamespace="http://www.jooq.org/xsd/jooq-runtime-2.5.0.xsd">
    -
    -  <annotation>
    -    <appinfo>
    -      <jaxb:globalBindings>
    -        <xjc:serializable uid="250"/>
    -      </jaxb:globalBindings>
    -    </appinfo>
    -  </annotation>
    -
    -  <element name="settings" type="jooq-runtime:Settings"/>
    -
    -  <complexType name="Settings">
    -    <all>
    -      <!-- Whether any schema name should be rendered at all.
    -           Use this for single-schema environments, or when all objects are made
    -           available using synonyms -->
    -      <element name="renderSchema" type="boolean" minOccurs="0" maxOccurs="1" default="true"/>
    -
    -      <!-- Configure render mapping for runtime schema / table rewriting in
    -           generated SQL -->
    -      <element name="renderMapping" type="jooq-runtime:RenderMapping" minOccurs="0" maxOccurs="1"/>
    -
    -      <!-- Whether rendered schema, table, column names, etc should be quoted
    -           in rendered SQL, or transformed in any other way.
    -           This is set to "QUOTED" by default for backwards-compatibility -->
    -      <element name="renderNameStyle" type="jooq-runtime:RenderNameStyle" minOccurs="0" maxOccurs="1" default="QUOTED"/>
    -
    -      <!-- Whether SQL keywords should be rendered with upper or lower case -->
    -      <element name="renderKeywordStyle" type="jooq-runtime:RenderKeywordStyle" minOccurs="0" maxOccurs="1" default="LOWER"/>
    -
    -      <!-- Whether rendered SQL should be pretty-printed -->
    -      <element name="renderFormatted" type="boolean" minOccurs="0" maxOccurs="1" default="false"/>
    -
    -      <!-- The type of statement that is to be executed -->
    -      <element name="statementType" type="jooq-runtime:StatementType" minOccurs="0" maxOccurs="1" default="PREPARED_STATEMENT"/>
    -
    -      <!-- When set to true, this will add jOOQ's default logging ExecuteListeners -->
    -      <element name="executeLogging" type="boolean" minOccurs="0" maxOccurs="1" default="true"/>
    -
    -      <!-- The event listeners to be notified upon execution events -->
    -      <element name="executeListeners" type="jooq-runtime:ExecuteListeners" minOccurs="0" maxOccurs="1"/>
    -
    -      <!-- Whether store() and delete() methods should be executed with optimistic locking -->
    -      <element name="executeWithOptimisticLocking" type="boolean" minOccurs="0" maxOccurs="1" default="false"/>
    -      
    -      <!-- Whether fetched records should be attached to the fetching configuration -->
    -      <element name="attachRecords" type="boolean" minOccurs="0" maxOccurs="1" default="true"/>
    -    </all>
    -  </complexType>
    -
    -  <complexType name="RenderMapping">
    -    <all>
    -      <!-- The default schema as defined in org.jooq.Schema.getName()
    -           This schema will be omitted in rendered SQL -->
    -      <element name="defaultSchema" type="string" minOccurs="0" maxOccurs="1"/>
    -
    -      <!-- The mapped schemata configuration -->
    -      <element name="schemata" type="jooq-runtime:MappedSchemata" minOccurs="0" maxOccurs="1"/>
    -    </all>
    -  </complexType>
    -
    -  <complexType name="MappedSchemata">
    -    <sequence>
    -      <element name="schema" type="jooq-runtime:MappedSchema" minOccurs="0" maxOccurs="unbounded"/>
    -    </sequence>
    -  </complexType>
    -
    -  <complexType name="MappedSchema">
    -    <all>
    -      <!-- The input schema as defined in org.jooq.Schema.getName() -->
    -      <element name="input" type="string" minOccurs="1" maxOccurs="1"/>
    -
    -      <!-- The output schema as it will be rendered in SQL
    -           When this is omitted, you can still apply table mapping -->
    -      <element name="output" type="string" minOccurs="0" maxOccurs="1"/>
    -
    -      <!-- Configure table mapping for runtime table rewriting in
    -           generated SQL -->
    -      <element name="tables" type="jooq-runtime:MappedTables" minOccurs="0" maxOccurs="1"/>
    -    </all>
    -  </complexType>
    -
    -  <complexType name="MappedTables">
    -    <sequence>
    -      <element name="table" type="jooq-runtime:MappedTable" minOccurs="0" maxOccurs="unbounded"/>
    -    </sequence>
    -  </complexType>
    -
    -  <complexType name="MappedTable">
    -    <all>
    -      <!-- The input schema as defined in org.jooq.Table.getName() -->
    -      <element name="input" type="string" minOccurs="1" maxOccurs="1"/>
    -
    -      <!-- The output schema as it will be rendered in SQL -->
    -      <element name="output" type="string" minOccurs="1" maxOccurs="1"/>
    -    </all>
    -  </complexType>
    -
    -  <simpleType name="StatementType">
    -    <restriction base="string">
    -
    -      <!-- Execute statements with inlined bind values, avoiding JDBC's
    -           PreparedStatements -->
    -      <enumeration value="STATIC_STATEMENT"/>
    -
    -      <!-- Execute statements with bind values, using JDBC's
    -           PreparedStatements -->
    -      <enumeration value="PREPARED_STATEMENT"/>
    -    </restriction>
    -  </simpleType>
    -
    -  <simpleType name="RenderNameStyle">
    -    <restriction base="string">
    -
    -      <!-- Render object names quoted, as defined in the database. Use this
    -           to stay on the safe side with case-sensitivity and special
    -           characters. For instance:
    -           Oracle    : "SYS"."ALL_TAB_COLS"
    -           MySQL     : `information_schema`.`TABLES`
    -           SQL Server: [INFORMATION_SCHEMA].[TABLES] -->
    -      <enumeration value="QUOTED"/>
    -
    -      <!-- Render object names, as defined in the database. For instance:
    -           Oracle    : SYS.ALL_TAB_COLS
    -           MySQL     : information_schema.TABLES
    -           SQL Server: INFORMATION_SCHEMA.TABLES -->
    -      <enumeration value="AS_IS"/>
    -
    -      <!-- Force rendering object names in lower case. For instance:
    -           Oracle    : sys.all_tab_cols
    -           MySQL     : information_schema.tables
    -           SQL Server: information_schema.tables -->
    -      <enumeration value="LOWER"/>
    -
    -      <!-- Force rendering object names in upper case. For instance:
    -           Oracle    : SYS.ALL_TAB_COLS
    -           MySQL     : INFORMATION_SCHEMA.TABLES
    -           SQL Server: INFORMATION_SCHEMA.TABLES -->
    -      <enumeration value="UPPER"/>
    -    </restriction>
    -  </simpleType>
    -
    -  <simpleType name="RenderKeywordStyle">
    -    <restriction base="string">
    -
    -      <!-- Keywords are rendered in lower case. For instance:
    -           select .. from .. where .. -->
    -      <enumeration value="LOWER"/>
    -
    -      <!-- Keywords are rendered in upper case. For instance:
    -           SELECT .. FROM .. WHERE .. -->
    -      <enumeration value="UPPER"/>
    -    </restriction>
    -  </simpleType>
    -
    -  <complexType name="ExecuteListeners">
    -    <sequence>
    -
    -      <!-- An event listener implementing org.jooq.ExecuteListener -->
    -      <element name="executeListener" type="string" minOccurs="0" maxOccurs="unbounded"/>
    -    </sequence>
    -  </complexType>
    -</schema>
    \ No newline at end of file
    diff --git a/jOOQ-website/xsd/jooq-runtime-2.6.0.xsd b/jOOQ-website/xsd/jooq-runtime-2.6.0.xsd
    deleted file mode 100644
    index 0578a8629d..0000000000
    --- a/jOOQ-website/xsd/jooq-runtime-2.6.0.xsd
    +++ /dev/null
    @@ -1,160 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?>
    -<schema
    -  xmlns="http://www.w3.org/2001/XMLSchema"
    -  xmlns:jooq-runtime="http://www.jooq.org/xsd/jooq-runtime-2.6.0.xsd"
    -  targetNamespace="http://www.jooq.org/xsd/jooq-runtime-2.6.0.xsd">
    -
    -  <element name="settings" type="jooq-runtime:Settings"/>
    -
    -  <complexType name="Settings">
    -    <all>
    -      <!-- Whether any schema name should be rendered at all.
    -           Use this for single-schema environments, or when all objects are made
    -           available using synonyms -->
    -      <element name="renderSchema" type="boolean" minOccurs="0" maxOccurs="1" default="true"/>
    -
    -      <!-- Configure render mapping for runtime schema / table rewriting in
    -           generated SQL -->
    -      <element name="renderMapping" type="jooq-runtime:RenderMapping" minOccurs="0" maxOccurs="1"/>
    -
    -      <!-- Whether rendered schema, table, column names, etc should be quoted
    -           in rendered SQL, or transformed in any other way.
    -           This is set to "QUOTED" by default for backwards-compatibility -->
    -      <element name="renderNameStyle" type="jooq-runtime:RenderNameStyle" minOccurs="0" maxOccurs="1" default="QUOTED"/>
    -
    -      <!-- Whether SQL keywords should be rendered with upper or lower case -->
    -      <element name="renderKeywordStyle" type="jooq-runtime:RenderKeywordStyle" minOccurs="0" maxOccurs="1" default="LOWER"/>
    -
    -      <!-- Whether rendered SQL should be pretty-printed -->
    -      <element name="renderFormatted" type="boolean" minOccurs="0" maxOccurs="1" default="false"/>
    -
    -      <!-- The type of statement that is to be executed -->
    -      <element name="statementType" type="jooq-runtime:StatementType" minOccurs="0" maxOccurs="1" default="PREPARED_STATEMENT"/>
    -
    -      <!-- When set to true, this will add jOOQ's default logging ExecuteListeners -->
    -      <element name="executeLogging" type="boolean" minOccurs="0" maxOccurs="1" default="true"/>
    -
    -      <!-- The event listeners to be notified upon execution events -->
    -      <element name="executeListeners" type="jooq-runtime:ExecuteListeners" minOccurs="0" maxOccurs="1"/>
    -
    -      <!-- Whether store() and delete() methods should be executed with optimistic locking -->
    -      <element name="executeWithOptimisticLocking" type="boolean" minOccurs="0" maxOccurs="1" default="false"/>
    -      
    -      <!-- Whether fetched records should be attached to the fetching configuration -->
    -      <element name="attachRecords" type="boolean" minOccurs="0" maxOccurs="1" default="true"/>
    -    </all>
    -  </complexType>
    -
    -  <complexType name="RenderMapping">
    -    <all>
    -      <!-- The default schema as defined in org.jooq.Schema.getName()
    -           This schema will be omitted in rendered SQL -->
    -      <element name="defaultSchema" type="string" minOccurs="0" maxOccurs="1"/>
    -
    -      <!-- The mapped schemata configuration -->
    -      <element name="schemata" type="jooq-runtime:MappedSchemata" minOccurs="0" maxOccurs="1"/>
    -    </all>
    -  </complexType>
    -
    -  <complexType name="MappedSchemata">
    -    <sequence>
    -      <element name="schema" type="jooq-runtime:MappedSchema" minOccurs="0" maxOccurs="unbounded"/>
    -    </sequence>
    -  </complexType>
    -
    -  <complexType name="MappedSchema">
    -    <all>
    -      <!-- The input schema as defined in org.jooq.Schema.getName() -->
    -      <element name="input" type="string" minOccurs="1" maxOccurs="1"/>
    -
    -      <!-- The output schema as it will be rendered in SQL
    -           When this is omitted, you can still apply table mapping -->
    -      <element name="output" type="string" minOccurs="0" maxOccurs="1"/>
    -
    -      <!-- Configure table mapping for runtime table rewriting in
    -           generated SQL -->
    -      <element name="tables" type="jooq-runtime:MappedTables" minOccurs="0" maxOccurs="1"/>
    -    </all>
    -  </complexType>
    -
    -  <complexType name="MappedTables">
    -    <sequence>
    -      <element name="table" type="jooq-runtime:MappedTable" minOccurs="0" maxOccurs="unbounded"/>
    -    </sequence>
    -  </complexType>
    -
    -  <complexType name="MappedTable">
    -    <all>
    -      <!-- The input schema as defined in org.jooq.Table.getName() -->
    -      <element name="input" type="string" minOccurs="1" maxOccurs="1"/>
    -
    -      <!-- The output schema as it will be rendered in SQL -->
    -      <element name="output" type="string" minOccurs="1" maxOccurs="1"/>
    -    </all>
    -  </complexType>
    -
    -  <simpleType name="StatementType">
    -    <restriction base="string">
    -
    -      <!-- Execute statements with inlined bind values, avoiding JDBC's
    -           PreparedStatements -->
    -      <enumeration value="STATIC_STATEMENT"/>
    -
    -      <!-- Execute statements with bind values, using JDBC's
    -           PreparedStatements -->
    -      <enumeration value="PREPARED_STATEMENT"/>
    -    </restriction>
    -  </simpleType>
    -
    -  <simpleType name="RenderNameStyle">
    -    <restriction base="string">
    -
    -      <!-- Render object names quoted, as defined in the database. Use this
    -           to stay on the safe side with case-sensitivity and special
    -           characters. For instance:
    -           Oracle    : "SYS"."ALL_TAB_COLS"
    -           MySQL     : `information_schema`.`TABLES`
    -           SQL Server: [INFORMATION_SCHEMA].[TABLES] -->
    -      <enumeration value="QUOTED"/>
    -
    -      <!-- Render object names, as defined in the database. For instance:
    -           Oracle    : SYS.ALL_TAB_COLS
    -           MySQL     : information_schema.TABLES
    -           SQL Server: INFORMATION_SCHEMA.TABLES -->
    -      <enumeration value="AS_IS"/>
    -
    -      <!-- Force rendering object names in lower case. For instance:
    -           Oracle    : sys.all_tab_cols
    -           MySQL     : information_schema.tables
    -           SQL Server: information_schema.tables -->
    -      <enumeration value="LOWER"/>
    -
    -      <!-- Force rendering object names in upper case. For instance:
    -           Oracle    : SYS.ALL_TAB_COLS
    -           MySQL     : INFORMATION_SCHEMA.TABLES
    -           SQL Server: INFORMATION_SCHEMA.TABLES -->
    -      <enumeration value="UPPER"/>
    -    </restriction>
    -  </simpleType>
    -
    -  <simpleType name="RenderKeywordStyle">
    -    <restriction base="string">
    -
    -      <!-- Keywords are rendered in lower case. For instance:
    -           select .. from .. where .. -->
    -      <enumeration value="LOWER"/>
    -
    -      <!-- Keywords are rendered in upper case. For instance:
    -           SELECT .. FROM .. WHERE .. -->
    -      <enumeration value="UPPER"/>
    -    </restriction>
    -  </simpleType>
    -
    -  <complexType name="ExecuteListeners">
    -    <sequence>
    -
    -      <!-- An event listener implementing org.jooq.ExecuteListener -->
    -      <element name="executeListener" type="string" minOccurs="0" maxOccurs="unbounded"/>
    -    </sequence>
    -  </complexType>
    -</schema>
    \ No newline at end of file
    diff --git a/jOOQ-website/xsd/jooq-runtime-3.0.0.xsd b/jOOQ-website/xsd/jooq-runtime-3.0.0.xsd
    deleted file mode 100644
    index 64c136e5eb..0000000000
    --- a/jOOQ-website/xsd/jooq-runtime-3.0.0.xsd
    +++ /dev/null
    @@ -1,150 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?>
    -<schema
    -  xmlns="http://www.w3.org/2001/XMLSchema"
    -  xmlns:jooq-runtime="http://www.jooq.org/xsd/jooq-runtime-3.0.0.xsd"
    -  targetNamespace="http://www.jooq.org/xsd/jooq-runtime-3.0.0.xsd"
    -  elementFormDefault="qualified">
    -
    -  <element name="settings" type="jooq-runtime:Settings"/>
    -
    -  <complexType name="Settings">
    -    <all>
    -      <!-- Whether any schema name should be rendered at all.
    -           Use this for single-schema environments, or when all objects are made
    -           available using synonyms -->
    -      <element name="renderSchema" type="boolean" minOccurs="0" maxOccurs="1" default="true"/>
    -
    -      <!-- Configure render mapping for runtime schema / table rewriting in
    -           generated SQL -->
    -      <element name="renderMapping" type="jooq-runtime:RenderMapping" minOccurs="0" maxOccurs="1"/>
    -
    -      <!-- Whether rendered schema, table, column names, etc should be quoted
    -           in rendered SQL, or transformed in any other way.
    -           This is set to "QUOTED" by default for backwards-compatibility -->
    -      <element name="renderNameStyle" type="jooq-runtime:RenderNameStyle" minOccurs="0" maxOccurs="1" default="QUOTED"/>
    -
    -      <!-- Whether SQL keywords should be rendered with upper or lower case -->
    -      <element name="renderKeywordStyle" type="jooq-runtime:RenderKeywordStyle" minOccurs="0" maxOccurs="1" default="LOWER"/>
    -
    -      <!-- Whether rendered SQL should be pretty-printed -->
    -      <element name="renderFormatted" type="boolean" minOccurs="0" maxOccurs="1" default="false"/>
    -
    -      <!-- The type of statement that is to be executed -->
    -      <element name="statementType" type="jooq-runtime:StatementType" minOccurs="0" maxOccurs="1" default="PREPARED_STATEMENT"/>
    -
    -      <!-- When set to true, this will add jOOQ's default logging ExecuteListeners -->
    -      <element name="executeLogging" type="boolean" minOccurs="0" maxOccurs="1" default="true"/>
    -
    -      <!-- Whether store() and delete() methods should be executed with optimistic locking -->
    -      <element name="executeWithOptimisticLocking" type="boolean" minOccurs="0" maxOccurs="1" default="false"/>
    -      
    -      <!-- Whether fetched records should be attached to the fetching configuration -->
    -      <element name="attachRecords" type="boolean" minOccurs="0" maxOccurs="1" default="true"/>
    -    </all>
    -  </complexType>
    -
    -  <complexType name="RenderMapping">
    -    <all>
    -      <!-- The default schema as defined in org.jooq.Schema.getName()
    -           This schema will be omitted in rendered SQL -->
    -      <element name="defaultSchema" type="string" minOccurs="0" maxOccurs="1"/>
    -
    -      <!-- The mapped schemata configuration -->
    -      <element name="schemata" type="jooq-runtime:MappedSchemata" minOccurs="0" maxOccurs="1"/>
    -    </all>
    -  </complexType>
    -
    -  <complexType name="MappedSchemata">
    -    <sequence>
    -      <element name="schema" type="jooq-runtime:MappedSchema" minOccurs="0" maxOccurs="unbounded"/>
    -    </sequence>
    -  </complexType>
    -
    -  <complexType name="MappedSchema">
    -    <all>
    -      <!-- The input schema as defined in org.jooq.Schema.getName() -->
    -      <element name="input" type="string" minOccurs="1" maxOccurs="1"/>
    -
    -      <!-- The output schema as it will be rendered in SQL
    -           When this is omitted, you can still apply table mapping -->
    -      <element name="output" type="string" minOccurs="0" maxOccurs="1"/>
    -
    -      <!-- Configure table mapping for runtime table rewriting in
    -           generated SQL -->
    -      <element name="tables" type="jooq-runtime:MappedTables" minOccurs="0" maxOccurs="1"/>
    -    </all>
    -  </complexType>
    -
    -  <complexType name="MappedTables">
    -    <sequence>
    -      <element name="table" type="jooq-runtime:MappedTable" minOccurs="0" maxOccurs="unbounded"/>
    -    </sequence>
    -  </complexType>
    -
    -  <complexType name="MappedTable">
    -    <all>
    -      <!-- The input schema as defined in org.jooq.Table.getName() -->
    -      <element name="input" type="string" minOccurs="1" maxOccurs="1"/>
    -
    -      <!-- The output schema as it will be rendered in SQL -->
    -      <element name="output" type="string" minOccurs="1" maxOccurs="1"/>
    -    </all>
    -  </complexType>
    -
    -  <simpleType name="StatementType">
    -    <restriction base="string">
    -
    -      <!-- Execute statements with inlined bind values, avoiding JDBC's
    -           PreparedStatements -->
    -      <enumeration value="STATIC_STATEMENT"/>
    -
    -      <!-- Execute statements with bind values, using JDBC's
    -           PreparedStatements -->
    -      <enumeration value="PREPARED_STATEMENT"/>
    -    </restriction>
    -  </simpleType>
    -
    -  <simpleType name="RenderNameStyle">
    -    <restriction base="string">
    -
    -      <!-- Render object names quoted, as defined in the database. Use this
    -           to stay on the safe side with case-sensitivity and special
    -           characters. For instance:
    -           Oracle    : "SYS"."ALL_TAB_COLS"
    -           MySQL     : `information_schema`.`TABLES`
    -           SQL Server: [INFORMATION_SCHEMA].[TABLES] -->
    -      <enumeration value="QUOTED"/>
    -
    -      <!-- Render object names, as defined in the database. For instance:
    -           Oracle    : SYS.ALL_TAB_COLS
    -           MySQL     : information_schema.TABLES
    -           SQL Server: INFORMATION_SCHEMA.TABLES -->
    -      <enumeration value="AS_IS"/>
    -
    -      <!-- Force rendering object names in lower case. For instance:
    -           Oracle    : sys.all_tab_cols
    -           MySQL     : information_schema.tables
    -           SQL Server: information_schema.tables -->
    -      <enumeration value="LOWER"/>
    -
    -      <!-- Force rendering object names in upper case. For instance:
    -           Oracle    : SYS.ALL_TAB_COLS
    -           MySQL     : INFORMATION_SCHEMA.TABLES
    -           SQL Server: INFORMATION_SCHEMA.TABLES -->
    -      <enumeration value="UPPER"/>
    -    </restriction>
    -  </simpleType>
    -
    -  <simpleType name="RenderKeywordStyle">
    -    <restriction base="string">
    -
    -      <!-- Keywords are rendered in lower case. For instance:
    -           select .. from .. where .. -->
    -      <enumeration value="LOWER"/>
    -
    -      <!-- Keywords are rendered in upper case. For instance:
    -           SELECT .. FROM .. WHERE .. -->
    -      <enumeration value="UPPER"/>
    -    </restriction>
    -  </simpleType>
    -</schema>
    \ No newline at end of file
    diff --git a/jOOQ-website/xsd/jooq-runtime-3.1.0.xsd b/jOOQ-website/xsd/jooq-runtime-3.1.0.xsd
    deleted file mode 100644
    index 2c32aea4b1..0000000000
    --- a/jOOQ-website/xsd/jooq-runtime-3.1.0.xsd
    +++ /dev/null
    @@ -1,175 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?>
    -<schema
    -  xmlns="http://www.w3.org/2001/XMLSchema"
    -  xmlns:jooq-runtime="http://www.jooq.org/xsd/jooq-runtime-3.1.0.xsd"
    -  targetNamespace="http://www.jooq.org/xsd/jooq-runtime-3.1.0.xsd"
    -  elementFormDefault="qualified">
    -
    -  <element name="settings" type="jooq-runtime:Settings"/>
    -
    -  <complexType name="Settings">
    -    <all>
    -      <!-- Whether any schema name should be rendered at all.
    -           Use this for single-schema environments, or when all objects are made
    -           available using synonyms -->
    -      <element name="renderSchema" type="boolean" minOccurs="0" maxOccurs="1" default="true"/>
    -
    -      <!-- Configure render mapping for runtime schema / table rewriting in
    -           generated SQL -->
    -      <element name="renderMapping" type="jooq-runtime:RenderMapping" minOccurs="0" maxOccurs="1"/>
    -
    -      <!-- Whether rendered schema, table, column names, etc should be quoted
    -           in rendered SQL, or transformed in any other way.
    -           This is set to "QUOTED" by default for backwards-compatibility -->
    -      <element name="renderNameStyle" type="jooq-runtime:RenderNameStyle" minOccurs="0" maxOccurs="1" default="QUOTED"/>
    -
    -      <!-- Whether SQL keywords should be rendered with upper or lower case -->
    -      <element name="renderKeywordStyle" type="jooq-runtime:RenderKeywordStyle" minOccurs="0" maxOccurs="1" default="LOWER"/>
    -
    -      <!-- Whether rendered SQL should be pretty-printed -->
    -      <element name="renderFormatted" type="boolean" minOccurs="0" maxOccurs="1" default="false"/>
    -
    -      <!-- Whether rendered bind values should be rendered as:
    -      
    -           - question marks
    -           - named parameters
    -           - inlined values
    -           
    -           This value is overridden by statementType == STATIC_STATEMENT, in 
    -           case of which, this defaults to INLINED
    -        -->
    -      <element name="paramType" type="jooq-runtime:ParamType" minOccurs="0" maxOccurs="1" default="INDEXED"/>
    -      
    -      <!-- The type of statement that is to be executed -->
    -      <element name="statementType" type="jooq-runtime:StatementType" minOccurs="0" maxOccurs="1" default="PREPARED_STATEMENT"/>
    -
    -      <!-- When set to true, this will add jOOQ's default logging ExecuteListeners -->
    -      <element name="executeLogging" type="boolean" minOccurs="0" maxOccurs="1" default="true"/>
    -
    -      <!-- Whether store() and delete() methods should be executed with optimistic locking -->
    -      <element name="executeWithOptimisticLocking" type="boolean" minOccurs="0" maxOccurs="1" default="false"/>
    -      
    -      <!-- Whether fetched records should be attached to the fetching configuration -->
    -      <element name="attachRecords" type="boolean" minOccurs="0" maxOccurs="1" default="true"/>
    -    </all>
    -  </complexType>
    -
    -  <complexType name="RenderMapping">
    -    <all>
    -      <!-- The default schema as defined in org.jooq.Schema.getName()
    -           This schema will be omitted in rendered SQL -->
    -      <element name="defaultSchema" type="string" minOccurs="0" maxOccurs="1"/>
    -
    -      <!-- The mapped schemata configuration -->
    -      <element name="schemata" type="jooq-runtime:MappedSchemata" minOccurs="0" maxOccurs="1"/>
    -    </all>
    -  </complexType>
    -
    -  <complexType name="MappedSchemata">
    -    <sequence>
    -      <element name="schema" type="jooq-runtime:MappedSchema" minOccurs="0" maxOccurs="unbounded"/>
    -    </sequence>
    -  </complexType>
    -
    -  <complexType name="MappedSchema">
    -    <all>
    -      <!-- The input schema as defined in org.jooq.Schema.getName() -->
    -      <element name="input" type="string" minOccurs="1" maxOccurs="1"/>
    -
    -      <!-- The output schema as it will be rendered in SQL
    -           When this is omitted, you can still apply table mapping -->
    -      <element name="output" type="string" minOccurs="0" maxOccurs="1"/>
    -
    -      <!-- Configure table mapping for runtime table rewriting in
    -           generated SQL -->
    -      <element name="tables" type="jooq-runtime:MappedTables" minOccurs="0" maxOccurs="1"/>
    -    </all>
    -  </complexType>
    -
    -  <complexType name="MappedTables">
    -    <sequence>
    -      <element name="table" type="jooq-runtime:MappedTable" minOccurs="0" maxOccurs="unbounded"/>
    -    </sequence>
    -  </complexType>
    -
    -  <complexType name="MappedTable">
    -    <all>
    -      <!-- The input schema as defined in org.jooq.Table.getName() -->
    -      <element name="input" type="string" minOccurs="1" maxOccurs="1"/>
    -
    -      <!-- The output schema as it will be rendered in SQL -->
    -      <element name="output" type="string" minOccurs="1" maxOccurs="1"/>
    -    </all>
    -  </complexType>
    -
    -  <simpleType name="ParamType">
    -    <restriction base="string">
    -
    -      <!-- Execute statements with indexed parameters, the way JDBC expects them -->
    -      <enumeration value="INDEXED"/>
    -
    -      <!-- Execute statements with named parameters -->
    -      <enumeration value="NAMED"/>
    -
    -      <!-- Execute statements with inlined parameters -->
    -      <enumeration value="INLINED"/>
    -    </restriction>
    -  </simpleType>
    -
    -  <simpleType name="StatementType">
    -    <restriction base="string">
    -
    -      <!-- Execute statements with inlined bind values, avoiding JDBC's
    -           PreparedStatements -->
    -      <enumeration value="STATIC_STATEMENT"/>
    -
    -      <!-- Execute statements with bind values, using JDBC's
    -           PreparedStatements -->
    -      <enumeration value="PREPARED_STATEMENT"/>
    -    </restriction>
    -  </simpleType>
    -
    -  <simpleType name="RenderNameStyle">
    -    <restriction base="string">
    -
    -      <!-- Render object names quoted, as defined in the database. Use this
    -           to stay on the safe side with case-sensitivity and special
    -           characters. For instance:
    -           Oracle    : "SYS"."ALL_TAB_COLS"
    -           MySQL     : `information_schema`.`TABLES`
    -           SQL Server: [INFORMATION_SCHEMA].[TABLES] -->
    -      <enumeration value="QUOTED"/>
    -
    -      <!-- Render object names, as defined in the database. For instance:
    -           Oracle    : SYS.ALL_TAB_COLS
    -           MySQL     : information_schema.TABLES
    -           SQL Server: INFORMATION_SCHEMA.TABLES -->
    -      <enumeration value="AS_IS"/>
    -
    -      <!-- Force rendering object names in lower case. For instance:
    -           Oracle    : sys.all_tab_cols
    -           MySQL     : information_schema.tables
    -           SQL Server: information_schema.tables -->
    -      <enumeration value="LOWER"/>
    -
    -      <!-- Force rendering object names in upper case. For instance:
    -           Oracle    : SYS.ALL_TAB_COLS
    -           MySQL     : INFORMATION_SCHEMA.TABLES
    -           SQL Server: INFORMATION_SCHEMA.TABLES -->
    -      <enumeration value="UPPER"/>
    -    </restriction>
    -  </simpleType>
    -
    -  <simpleType name="RenderKeywordStyle">
    -    <restriction base="string">
    -
    -      <!-- Keywords are rendered in lower case. For instance:
    -           select .. from .. where .. -->
    -      <enumeration value="LOWER"/>
    -
    -      <!-- Keywords are rendered in upper case. For instance:
    -           SELECT .. FROM .. WHERE .. -->
    -      <enumeration value="UPPER"/>
    -    </restriction>
    -  </simpleType>
    -</schema>
    \ No newline at end of file